diff --git a/Makefile b/Makefile
index 892d0355b..89eeb21d2 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
@@ -122,8 +122,8 @@ OPTFLAGS := -O2 -g3
ASFLAGS := -march=vr4300 -32 -Iinclude
MIPS_VERSION := -mips2
-# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Surpress the warnings with -woff.
-CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 624,649,838,712,516
+# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Suppress the warnings with -woff.
+CFLAGS += -G 0 -non_shared -fullwarn -verbose -Xcpluscomm $(IINC) -nostdinc -Wab,-r4300_mul -woff 649,838,712,516
# Use relocations and abi fpr names in the dump
OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32
diff --git a/assets/xml/interface/icon_item_vtx_static.xml b/assets/xml/interface/icon_item_vtx_static.xml
new file mode 100644
index 000000000..37ccb0063
--- /dev/null
+++ b/assets/xml/interface/icon_item_vtx_static.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/interface/schedule_static.xml b/assets/xml/interface/schedule_static.xml
new file mode 100644
index 000000000..68b097d51
--- /dev/null
+++ b/assets/xml/interface/schedule_static.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/misc/title_static.xml b/assets/xml/misc/title_static.xml
new file mode 100644
index 000000000..5e6cea55f
--- /dev/null
+++ b/assets/xml/misc/title_static.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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_f40_obj.xml b/assets/xml/objects/object_f40_obj.xml
index 17e7210de..636a80682 100644
--- a/assets/xml/objects/object_f40_obj.xml
+++ b/assets/xml/objects/object_f40_obj.xml
@@ -1,17 +1,25 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_hakugin_demo.xml b/assets/xml/objects/object_hakugin_demo.xml
index 24c7a2ba2..8c8b5837c 100644
--- a/assets/xml/objects/object_hakugin_demo.xml
+++ b/assets/xml/objects/object_hakugin_demo.xml
@@ -1,8 +1,9 @@
+
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_moonend.xml b/assets/xml/objects/object_moonend.xml
index e677f9c3f..666e9e07c 100644
--- a/assets/xml/objects/object_moonend.xml
+++ b/assets/xml/objects/object_moonend.xml
@@ -1,6 +1,7 @@
-
+
+
@@ -19,7 +20,8 @@
-
+
+
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/objects/object_taisou.xml b/assets/xml/objects/object_taisou.xml
index 696285927..0143f2444 100644
--- a/assets/xml/objects/object_taisou.xml
+++ b/assets/xml/objects/object_taisou.xml
@@ -1,12 +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/assets/xml/overlays/ovl_fbdemo_wipe3.xml b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
new file mode 100644
index 000000000..fe4804689
--- /dev/null
+++ b/assets/xml/overlays/ovl_fbdemo_wipe3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_file_choose.xml b/assets/xml/overlays/ovl_file_choose.xml
new file mode 100644
index 000000000..cac6f3d9d
--- /dev/null
+++ b/assets/xml/overlays/ovl_file_choose.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/PR/gbi.h b/include/PR/gbi.h
index 3ba8748b0..1b57c6a34 100644
--- a/include/PR/gbi.h
+++ b/include/PR/gbi.h
@@ -4699,7 +4699,7 @@ _DW({ \
/* like gSPTextureRectangle but accepts negative position arguments */
#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
-{ \
+_DW({ \
Gfx *_g = (Gfx *)(pkt); \
\
_g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
@@ -4723,7 +4723,7 @@ _DW({ \
0, 16))); \
gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | \
_SHIFTL((dtdy), 0, 16))); \
-}
+})
#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
(_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | \
diff --git a/include/functions.h b/include/functions.h
index 690558f38..04f6dfb73 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -128,44 +128,7 @@ 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);
-// void func_80086794(void);
-// void func_800867B4(void);
-// void func_800867D4(void);
-// void func_800867F4(void);
-f32 func_80086814(f32 x);
-// void func_80086834(void);
-// void func_80086880(void);
-// void func_800869A4(void);
-// void func_80086AF0(void);
-f32 func_80086B30(f32 y, f32 x);
-// void func_80086C18(void);
-f32 func_80086C48(f32 x);
-// void func_80086C70(void);
-f64 func_80086C7C(f64 param_1);
-s32 func_80086C88(f32 param_1);
-s32 func_80086C98(f64 param_1);
-// void func_80086CA8(void);
-f64 func_80086CB4(f64 param_1);
-s32 func_80086CC0(f32 param_1);
-s32 func_80086CD0(f64 param_1);
-// void func_80086CE0(void);
-f64 func_80086CEC(f64 param_1);
-s32 func_80086CF8(f32 param_1);
-s32 func_80086D08(f64 param_1);
-// void func_80086D18(void);
-f64 func_80086D24(f64);
-s32 func_80086D30(f32 param_1);
-s32 func_80086D40(f64 param_1);
-// void func_80086D50(void);
-f64 func_80086D6C(f64 param_1);
-s32 func_80086D8C(f32 param_1);
-s32 func_80086DAC(f64 param_1);
u32 Rand_Next(void);
void Rand_Seed(u32 seed);
@@ -328,7 +291,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 +572,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 +689,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 +703,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 +761,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);
@@ -1074,17 +1036,6 @@ u16 QuestHint_GetTatlTextId(PlayState* play);
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet);
-s32 func_800F3940(PlayState* play);
-// void func_800F39B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
-// void func_800F3A64(void);
-void func_800F3B2C(PlayState* play);
-// void func_800F3B68(void);
-// void func_800F3C44(void);
-// void func_800F3ED4(void);
-void func_800F40A0(GameState* gameState, Player* player);
-void func_800F415C(Actor* actor, Vec3f* arg1, s16 arg2);
-UNK_TYPE func_800F41E4(PlayState* play, ActorContext* actorCtx);
-
void func_800F4A10(PlayState* play);
void KaleidoSetup_Update(PlayState* play);
void KaleidoSetup_Init(PlayState* play);
@@ -1095,7 +1046,7 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset);
void Font_LoadMessageBoxEndIcon(Font* font, u16 icon);
void Font_LoadOrderedFont(Font* font);
// void func_800F5090(void);
-// void func_800F50D4(void);
+s32 Environment_ZBufValToFixedPoint(s32 zBufferVal);
void Environment_Init(PlayState* play, EnvironmentContext* envCtx, s32 arg2);
u32 func_800F5954(u8* param_1, u32 param_2, u32 param_3, u8 param_4, u8 param_5);
f32 Environment_LerpWeight(u16 max, u16 min, u16 val);
@@ -1177,70 +1128,17 @@ void func_800FEA50(PlayState* play);
void func_800FEAB0(void);
// void func_800FEAC0(void);
void func_800FEAF4(EnvironmentContext* envCtx);
+
void* Lib_MemCpy(void* dest, void* src, size_t size);
void* Lib_MemSet(void* buffer, s32 value, size_t size);
-f32 Math_CosS(s16 angle);
-f32 Math_SinS(s16 angle);
-s32 Math_StepToIImpl(s32 start, s32 target, s32 step);
-void Math_StepToIGet(s32* pValue, s32 target, s32 step);
-s32 Math_StepToI(s32* pValue, s32 target, s32 step);
-s32 Math_ScaledStepToS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToC(s8* pValue, s8 target, s8 step);
-s32 Math_StepToF(f32* pValue, f32 target, f32 step);
-s32 Math_StepUntilAngleS(s16* pValue, s16 target, s16 step);
-s32 Math_StepToAngleS(s16* pValue, s16 target, s16 step);
-s32 Math_AsymStepToS(s16* pValue, s16 target, s16 incrStep, s16 decrStep);
-s32 Math_StepUntilF(f32* pValue, f32 limit, f32 step);
-s32 Math_AsymStepToF(f32* pValue, f32 target, f32 incrStep, f32 decrStep);
void func_800FF3A0(f32* distOut, s16* angleOut, Input* input);
-s16 Rand_S16Offset(s16 base, s16 range);
-s16 Rand_S16OffsetStride(s16 base, s16 stride, s16 range);
-void Math_Vec3f_Copy(Vec3f* dest, Vec3f* src);
-void Math_Vec3s_Copy(Vec3s* dest, Vec3s* src);
-void Math_Vec3s_ToVec3f(Vec3f* dest, Vec3s* src);
-void Math_Vec3f_ToVec3s(Vec3s* dest, Vec3f* src);
-void Math_Vec3f_Sum(Vec3f* l, Vec3f* r, Vec3f* dest);
-void Math_Vec3f_Diff(Vec3f* l, Vec3f* r, Vec3f* dest);
-void Math_Vec3s_DiffToVec3f(Vec3f* dest, Vec3s* l, Vec3s* r);
-void Math_Vec3f_Scale(Vec3f* vec, f32 scale);
-void Math_Vec3f_ScaleAndStore(Vec3f* vec, f32 scale, Vec3f* dest);
-void Math_Vec3f_Lerp(Vec3f* a, Vec3f* b, f32 t, Vec3f* dest);
-void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
-void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest);
-void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
-f32 Math_Vec3f_DistXYZ(Vec3f* a, Vec3f* b);
-f32 Math_Vec3f_DistXYZAndStoreDiff(Vec3f* a, Vec3f* b, Vec3f* dest);
-f32 Math_Vec3f_DistXZ(Vec3f* a, Vec3f* b);
-f32 Math_Vec3f_DistXZAndStore(Vec3f* a, Vec3f* b, f32* dx, f32* dz);
-f32 Math_Vec3f_StepToXZ(Vec3f* start, Vec3f* target, f32 speed);
-f32 Math_Vec3f_DiffY(Vec3f* a, Vec3f* b);
-s16 Math_Vec3f_Yaw(Vec3f* a, Vec3f* b);
-s16 Math_Vec3f_Pitch(Vec3f* a, Vec3f* b);
void Actor_ProcessInitChain(Actor* actor, InitChainEntry* ichain);
-// void IChain_Apply_u8(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s8(u8* actor, InitChainEntry* init);
-// void IChain_Apply_u16(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s16(u8* actor, InitChainEntry* init);
-// void IChain_Apply_u32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_s32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_f32(u8* actor, InitChainEntry* init);
-// void IChain_Apply_f32div1000(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3f(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3fdiv1000(u8* actor, InitChainEntry* init);
-// void IChain_Apply_Vec3s(u8* actor, InitChainEntry* init);
-f32 Math_SmoothStepToF(f32* pValue, f32 target, f32 fraction, f32 step, f32 minStep);
-void Math_ApproachF(f32* pValue, f32 target, f32 scale, f32 maxStep);
-void Math_ApproachZeroF(f32* pValue, f32 scale, f32 maxStep);
-s16 Math_SmoothStepToS(s16* pValue, s16 target, s16 scale, s16 step, s16 minStep);
-void Math_ApproachS(s16* pValue, s16 target, s16 scale, s16 maxStep);
void Color_RGBA8_Copy(Color_RGBA8* dst, Color_RGBA8* src);
void func_801000A4(u16 sfxId);
void func_801000CC(u16 sfxId);
void Lib_PlaySfxAtPos(Vec3f* pos, u16 sfxId);
void Lib_Vec3f_TranslateAndRotateY(Vec3f* translation, s16 rotAngle, Vec3f* src, Vec3f* dst);
void Lib_LerpRGB(Color_RGB8* a, Color_RGB8* b, f32 t, Color_RGB8* dst);
-f32 Math_Vec3f_StepTo(Vec3f* start, Vec3f* target, f32 speed);
void Lib_Nop801004FC(void);
void* Lib_SegmentedToVirtual(void* ptr);
void* Lib_SegmentedToVirtualNull(void* ptr);
@@ -1343,7 +1241,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 +1360,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);
@@ -1519,7 +1417,7 @@ void Interface_Update(PlayState* play);
void Interface_Destroy(PlayState* play);
void Interface_Init(PlayState* play);
-Path* Path_GetByIndex(PlayState* play, s16 index, s16 max);
+Path* Path_GetByIndex(PlayState* play, s16 index, s16 indexNone);
f32 Path_OrientAndGetDistSq(Actor* actor, Path* path, s16 waypoint, s16* yaw);
void Path_CopyLastPoint(Path* path, Vec3f* dest);
@@ -1599,87 +1497,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);
@@ -1810,22 +1627,23 @@ void SkinMatrix_SetYRotation(MtxF* mf, s16 a);
void SkinMatrix_MulYRotation(MtxF* mf, s16 a);
void SkinMatrix_SetZRotation(MtxF* mf, s16 a);
-void func_80140260(OSViMode* vimode);
-// void func_8014026C(OSViMode* param_1, UNK_TYPE1 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6, s32 param_7, s32 param_8, UNK_TYPE4 param_9, s32 param_10, s16 param_11, u32 param_12, UNK_TYPE4 param_13);
-// void func_80140730(void);
-// void func_80140810(void);
-void func_80140898(void* arg0);
-void func_80140900(void* arg0);
-// void func_8014090C(void);
-// void func_80140970(void);
-void func_80140CE0(void* arg0);
-void func_80140D04(void* arg0);
-void func_80140D10(void* arg0, Gfx** gfx, u32 arg2);
+void ViMode_LogPrint(OSViMode* vimode);
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust);
+void ViMode_Save(ViMode* viMode);
+void ViMode_Load(ViMode* viMode);
+void ViMode_Init(ViMode* viMode);
+void ViMode_Destroy(ViMode* viMode);
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures);
+void ViMode_Update(ViMode* viMode, Input* input);
+void VisCvg_Init(struct_801F8010* this);
+void VisCvg_Destroy(struct_801F8010* this);
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp);
void func_80140E80(Struct_80140E80* arg0);
void func_80140EA0(Struct_80140E80* arg0);
// void func_80140EAC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80141008(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 func_8014116C(Gfx** gfxP, u16* arg1, u16* arg2, s32 width, s32 height, s32 arg5);
+void func_8014116C(Gfx** gfxP, u16* arg1, u16* workBuffer, s32 width, s32 height, s32 arg5);
// void func_801411B4(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 func_80141200(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_8014151C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
@@ -1877,7 +1695,7 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2);
void Message_StartTextbox(PlayState* play, u16 textId, Actor* Actor);
void Message_ContinueTextbox(PlayState* play, u16 textId);
void func_80151A68(PlayState* play, u16 textId);
-void func_80151BB4(PlayState* play, u8 arg1);
+void Message_BombersNotebookQueueEvent(PlayState* play, u8 event);
// void func_80151C9C(void);
void func_80151DA4(PlayState* play, u16 arg2);
void func_80152434(PlayState* play, u16 arg2);
@@ -2007,19 +1825,6 @@ void Play_AssignPlayerCsIdsFromScene(GameState* thisx, s32 spawnCsId);
void Play_FillScreen(GameState* thisx, s16 fillScreenOn, u8 red, u8 green, u8 blue, u8 alpha);
void Play_Init(GameState* thisx);
-// void func_8016AC10(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 func_8016AE1C(void);
-// void func_8016B278(void);
-// void func_8016B4B0(void);
-// void func_8016C344(void);
-// void func_8016CD4C(void);
-// void func_8016E40C(void);
-// void func_8016EA90(void);
-void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx);
-// void func_8016F4EC(void);
-void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input);
-void BombersNotebook_Init(BombersNotebook* this);
-void BombersNotebook_Destroy(BombersNotebook* this);
void PreRender_SetValuesSave(PreRender* this, u32 width, u32 height, void* fbuf, void* zbuf, void* cvg);
void PreRender_Init(PreRender* this);
void PreRender_SetValues(PreRender* this, u32 width, u32 height, void* fbuf, void* zbuf);
@@ -2056,25 +1861,6 @@ void AudioMgr_ThreadEntry(void* arg);
void AudioMgr_Unlock(AudioMgr* audioMgr);
void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr);
-void Game_UpdateFramerateVariables(s32 divisor);
-void Game_SetFramerateDivisor(GameState* gameState, s32 divisor);
-void GameState_SetFBFilter(Gfx** gfx, void* zbuffer);
-void Game_Nop80173534(GameState* gameState);
-void GameState_Draw(GameState* gameState, GraphicsContext* gfxCtx);
-void GameState_SetFrameBuffer(GraphicsContext* gfxCtx);
-void func_801736DC(GraphicsContext* gfxCtx);
-void Game_UpdateInput(GameState* gameState);
-void Game_Update(GameState* gameState);
-void Game_IncrementFrameCount(GameState* gameState);
-void GameState_InitArena(GameState* gameState, size_t size);
-void GameState_Realloc(GameState* gameState, size_t size);
-void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* gfxCtx);
-void GameState_Destroy(GameState* gameState);
-GameStateFunc GameState_GetInit(GameState* gameState);
-size_t GameState_GetSize(GameState* gameState);
-u32 GameState_IsRunning(GameState* gameState);
-s32 GameState_GetArenaSize(GameState* gameState);
-s32 func_80173B48(GameState* gameState);
void GameAlloc_Log(GameAlloc* this);
void* GameAlloc_Malloc(GameAlloc* this, size_t size);
void GameAlloc_Free(GameAlloc* this, void* data);
@@ -2100,34 +1886,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);
@@ -2162,15 +1920,14 @@ void Mtx_SetTranslateScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, f32
void Mtx_SetRotationMtx(Mtx* mtx, s32 angle, f32 axisX, f32 axisY, f32 axisZ);
void Mtx_SetTranslationRotationScaleMtx(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, s32 angle, f32 axisX, f32 axisY, f32 axisZ,f32 translateX, f32 translateY, f32 translateZ);
-void func_80178750(void);
-void func_80178818(void);
-void func_80178978(void);
-// void func_801789D4(void);
-void* SysCfb_GetFbPtr(s32 index);
+void SysCfb_SetLoResMode(void);
+void SysCfb_SetHiResMode(void);
+void SysCfb_Init(void);
+void* SysCfb_GetFramebuffer(s32 index);
void* SysCfb_GetZBuffer(void);
-// UNK_TYPE4 func_80178A24(void);
-// void func_80178A34(void);
-s32 func_80178A94(s32 param_1, s32 param_2);
+void* SysCfb_GetWorkBuffer(void);
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y);
+s32 SysCfb_GetZBufferInt(s32 x, s32 y);
void CmpDma_LoadFile(uintptr_t segmentVrom, s32 id, void* dst, size_t size);
void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_WriteRGBA16Pixel(u16* buffer, u32 x, u32 y, u32 value);
@@ -2181,18 +1938,12 @@ void CmpDma_LoadAllFiles(uintptr_t segmentVrom, void* dst, size_t size);
// void Check_DrawRegionLockErrorMessage(void);
void Check_ExpansionPak(void);
void Check_RegionIsSupported(void);
-f32 func_80179300(f32 n);
-f32 func_80179400(s32 n);
-f32 pow_int(f32 base, s32 exp);
-f32 sin_rad(f32 rad);
-f32 cos_rad(f32 rad);
-f32 Rand_ZeroFloat(f32 scale);
-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);
@@ -2283,11 +2034,6 @@ s32 Math3D_YZInSphere(Sphere16* sphere, f32 y, f32 z);
// void func_8017FB1C(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, UNK_TYPE4 param_11);
// void func_8017FD44(void);
-s16 Math_Atan2S(f32 y, f32 x);
-f32 Math_Atan2F(f32 y, f32 x);
-s16 Math_Atan2S_XY(f32 x, f32 y);
-f32 Math_Atan2F_XY(f32 x, f32 y);
-
u64* SysUcode_GetUCodeBoot(void);
size_t SysUcode_GetUCodeBootSize(void);
u64* SysUcode_GetUCode(void);
@@ -2336,22 +2082,15 @@ void func_8018450C(PlayState* play, SkeletonInfo* skeleton, Mtx* mtx, OverrideKe
// void func_801853C8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_80185460(void);
-// void func_801857C0(void);
-// char* func_801857D0(void);
-// void func_80185864(void);
-u32 func_80185908(void);
-UNK_TYPE func_80185968(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
-// void func_801859F0(void);
-// void func_80185A2C(void);
-// void func_80185B1C(void);
-// void func_80185BE4(void);
-// void func_80185C24(void);
-void SysFlashrom_ThreadEntry(s80185D40* param_1);
-void func_80185DDC(u8* arg0, u32 arg1, u32 arg2);
-s32 func_80185EC4(void);
-s32 func_80185F04(void);
-void func_80185F64(void* arg0, UNK_TYPE arg1, UNK_TYPE arg2);
-s32 func_80185F90(u32 param_1);
+s32 SysFlashrom_InitFlash(void);
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount);
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount);
+s32 SysFlashrom_IsBusy(void);
+s32 SysFlashrom_AwaitResult(void);
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount);
+
+s32 func_80185F90(u32 arg0);
+
u32 osFlashGetAddr(u32 pageNum);
OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 pageSize, u8 relDuration, u32 start);
void osFlashChange(u32 flashNum);
@@ -2616,7 +2355,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/initvars.h b/include/initvars.h
deleted file mode 100644
index 554b0ff5d..000000000
--- a/include/initvars.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _INITVARS_H_
-#define _INITVARS_H_
-
-extern TransitionInit TransitionFade_InitVars;
-extern TransitionInit TransitionTriforce_InitVars;
-extern TransitionInit TransitionWipe1_InitVars;
-extern TransitionInit TransitionWipe3_InitVars;
-extern TransitionInit TransitionWipe4_InitVars;
-extern TransitionInit TransitionCircle_InitVars;
-extern TransitionInit TransitionWipe5_InitVars;
-
-#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..d2b98dec5 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -7,9 +7,11 @@
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
+#define SCREEN_WIDTH_HIRES 640
+#define SCREEN_HEIGHT_HIRES 480
-#define SCREEN_WIDTH_HIGH_RES 576
-#define SCREEN_HEIGHT_HIGH_RES 454
+#define HIRES_BUFFER_WIDTH 576
+#define HIRES_BUFFER_HEIGHT 454
#define PROJECTED_TO_SCREEN_X(projectedPos, invW) ((projectedPos).x * (invW) * (SCREEN_WIDTH / 2) + (SCREEN_WIDTH / 2))
#define PROJECTED_TO_SCREEN_Y(projectedPos, invW) ((projectedPos).y * (invW) * (-SCREEN_HEIGHT / 2) + (SCREEN_HEIGHT / 2))
@@ -17,6 +19,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)
@@ -24,27 +28,13 @@
#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamId])
-#define STOP_GAMESTATE(curState) \
- do { \
- GameState* state = curState; \
- \
- state->running = false; \
- } while(0)
-
-#define SET_NEXT_GAMESTATE(curState, nextInit, nextSize) \
- do { \
- GameState* state = curState; \
- \
- (state)->init = nextInit; \
- (state)->size = nextSize; \
- } while (0)
-
#define GET_PLAYER(play) ((Player*)(play)->actorCtx.actorLists[ACTORCAT_PLAYER].first)
#define GET_FIRST_ENEMY(play) ((Actor*)(play)->actorCtx.actorLists[ACTORCAT_ENEMY].first)
#define CLOCK_TIME(hr, min) (s32)(((hr) * 60 + (min)) * 0x10000 / (24 * 60))
#define CLOCK_TIME_MINUTE (CLOCK_TIME(0, 1))
+#define CLOCK_TIME_HOUR (CLOCK_TIME(1, 0))
#define DAY_LENGTH (CLOCK_TIME(24, 0))
#define TIME_TO_HOURS_F(time) ((time) * (24.0f / 0x10000))
@@ -55,6 +45,7 @@
#define CLOCK_TIME_F(hr, min) (((hr) * 60.0f + (min)) * (0x10000 / (24.0f * 60.0f)))
#define CLOCK_TIME_ALT_F(hr, min) (((hr) * 60.0f + (min)) / (24.0f * 60.0f / 0x10000))
#define CLOCK_TIME_ALT2_F(hr, min) ((((hr) + (min) / 60.0f) * 60.0f) / (24.0f * 60.0f / 0x10000))
+#define CLOCK_TIME_HOUR_F (CLOCK_TIME_F(1, 0))
#define CAPACITY(upg, value) gUpgradeCapacities[upg][value]
#define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg))
@@ -77,26 +68,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 +85,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/regs.h b/include/regs.h
index 112a00239..bc8bacb1b 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -65,6 +65,13 @@ extern RegEditor* gRegEditor;
#define R_ENABLE_ARENA_DBG SREG(0) // Same as OoT
#define R_ROOM_IMAGE_NODRAW_FLAGS SREG(25)
#define R_UPDATE_RATE SREG(30)
+#define R_VI_MODE_EDIT_STATE SREG(48)
+#define R_VI_MODE_EDIT_WIDTH SREG(49)
+#define R_VI_MODE_EDIT_HEIGHT SREG(50)
+#define R_VI_MODE_EDIT_ULY_ADJ SREG(51)
+#define R_VI_MODE_EDIT_LRY_ADJ SREG(52)
+#define R_VI_MODE_EDIT_ULX_ADJ SREG(53)
+#define R_VI_MODE_EDIT_LRX_ADJ SREG(54)
#define R_FB_FILTER_TYPE SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)
#define R_FB_FILTER_A SREG(84)
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index 79601bc93..d7c959d23 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -57,6 +57,7 @@ DECLARE_ROM_SEGMENT(icon_item_static_old)
DECLARE_ROM_SEGMENT(icon_item_24_static_test)
DECLARE_ROM_SEGMENT(icon_item_24_static_old)
DECLARE_ROM_SEGMENT(schedule_dma_static_test)
+DECLARE_ROM_SEGMENT(schedule_dma_static_old)
DECLARE_ROM_SEGMENT(schedule_static)
DECLARE_ROM_SEGMENT(story_static)
DECLARE_ROM_SEGMENT(do_action_static)
@@ -88,12 +89,6 @@ DECLARE_OVERLAY_SEGMENT(player_actor)
#undef DEFINE_ACTOR_INTERNAL
#undef DEFINE_ACTOR_UNSET
-DECLARE_OVERLAY_SEGMENT(fbdemo_triforce)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe1)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe3)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe4)
-DECLARE_OVERLAY_SEGMENT(fbdemo_wipe5)
-
#define DEFINE_OBJECT(name, _enumValue) DECLARE_ROM_SEGMENT(name)
#define DEFINE_OBJECT_UNSET(_enumValue)
#define DEFINE_OBJECT_SIZE_ZERO(_name, _enumValue)
@@ -130,56 +125,44 @@ DECLARE_ROM_SEGMENT(d2_fine_pal_static)
DECLARE_ROM_SEGMENT(elf_message_field)
DECLARE_ROM_SEGMENT(elf_message_ydan)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI2)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI2_room_02)
-DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP)
DECLARE_ROM_SEGMENT(Z2_WITCH_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_BS)
DECLARE_ROM_SEGMENT(Z2_LAST_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKASHITA)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_02)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_03)
DECLARE_ROM_SEGMENT(Z2_HAKASHITA_room_04)
-DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_00)
DECLARE_ROM_SEGMENT(Z2_AYASHIISHOP_room_01)
-DECLARE_ROM_SEGMENT(Z2_OMOYA)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_OMOYA_room_02)
-DECLARE_ROM_SEGMENT(Z2_BOWLING)
DECLARE_ROM_SEGMENT(Z2_BOWLING_room_00)
-DECLARE_ROM_SEGMENT(Z2_SONCHONOIE)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_00)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_01)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_02)
DECLARE_ROM_SEGMENT(Z2_SONCHONOIE_room_03)
-DECLARE_ROM_SEGMENT(Z2_IKANA)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_00)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_01)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_02)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_03)
DECLARE_ROM_SEGMENT(Z2_IKANA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KAIZOKU)
DECLARE_ROM_SEGMENT(Z2_KAIZOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MILK_BAR)
DECLARE_ROM_SEGMENT(Z2_MILK_BAR_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_N)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_02)
@@ -193,10 +176,8 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_N_room_11)
-DECLARE_ROM_SEGMENT(Z2_TAKARAYA)
DECLARE_ROM_SEGMENT(Z2_TAKARAYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_R)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_00)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_01)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_02)
@@ -210,14 +191,11 @@ DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_09)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_10)
DECLARE_ROM_SEGMENT(Z2_INISIE_R_room_11)
-DECLARE_ROM_SEGMENT(Z2_OKUJOU)
DECLARE_ROM_SEGMENT(Z2_OKUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_OPENINGDAN)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_00)
DECLARE_ROM_SEGMENT(Z2_OPENINGDAN_room_01)
-DECLARE_ROM_SEGMENT(Z2_MITURIN)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_00)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_01)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_02)
@@ -232,10 +210,8 @@ DECLARE_ROM_SEGMENT(Z2_MITURIN_room_10)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_11)
DECLARE_ROM_SEGMENT(Z2_MITURIN_room_12)
-DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI)
DECLARE_ROM_SEGMENT(Z2_13HUBUKINOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_CASTLE)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_00)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_01)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_02)
@@ -247,16 +223,12 @@ DECLARE_ROM_SEGMENT(Z2_CASTLE_room_07)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_08)
DECLARE_ROM_SEGMENT(Z2_CASTLE_room_09)
-DECLARE_ROM_SEGMENT(Z2_DEKUTES)
DECLARE_ROM_SEGMENT(Z2_DEKUTES_room_00)
-DECLARE_ROM_SEGMENT(Z2_MITURIN_BS)
DECLARE_ROM_SEGMENT(Z2_MITURIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MIZU_room_00)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_00)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_01)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_02)
@@ -272,10 +244,8 @@ DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_11)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_12)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_room_13)
-DECLARE_ROM_SEGMENT(Z2_ROMANYMAE)
DECLARE_ROM_SEGMENT(Z2_ROMANYMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_PIRATE)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_00)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_01)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_02)
@@ -292,20 +262,16 @@ DECLARE_ROM_SEGMENT(Z2_PIRATE_room_12)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_13)
DECLARE_ROM_SEGMENT(Z2_PIRATE_room_14)
-DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI)
DECLARE_ROM_SEGMENT(Z2_SYATEKI_MORI_room_00)
-DECLARE_ROM_SEGMENT(Z2_SINKAI)
DECLARE_ROM_SEGMENT(Z2_SINKAI_room_00)
-DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_00)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_01)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_02)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_03)
DECLARE_ROM_SEGMENT(Z2_YOUSEI_IZUMI_room_04)
-DECLARE_ROM_SEGMENT(Z2_KINSTA1)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_00)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_01)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_02)
@@ -313,7 +279,6 @@ DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_03)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_04)
DECLARE_ROM_SEGMENT(Z2_KINSTA1_room_05)
-DECLARE_ROM_SEGMENT(Z2_KINDAN2)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_00)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_01)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_02)
@@ -321,108 +286,77 @@ DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_03)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_04)
DECLARE_ROM_SEGMENT(Z2_KINDAN2_room_05)
-DECLARE_ROM_SEGMENT(Z2_TENMON_DAI)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_00)
DECLARE_ROM_SEGMENT(Z2_TENMON_DAI_room_01)
-DECLARE_ROM_SEGMENT(Z2_LAST_DEKU)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_DEKU_room_01)
-DECLARE_ROM_SEGMENT(Z2_22DEKUCITY)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_00)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_01)
DECLARE_ROM_SEGMENT(Z2_22DEKUCITY_room_02)
-DECLARE_ROM_SEGMENT(Z2_KAJIYA)
DECLARE_ROM_SEGMENT(Z2_KAJIYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_00KEIKOKU)
DECLARE_ROM_SEGMENT(Z2_00KEIKOKU_room_00)
-DECLARE_ROM_SEGMENT(Z2_POSTHOUSE)
DECLARE_ROM_SEGMENT(Z2_POSTHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LABO)
DECLARE_ROM_SEGMENT(Z2_LABO_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI2TEST_room_01)
-DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_00)
DECLARE_ROM_SEGMENT(Z2_16GORON_HOUSE_room_01)
-DECLARE_ROM_SEGMENT(Z2_33ZORACITY)
DECLARE_ROM_SEGMENT(Z2_33ZORACITY_room_00)
-DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP)
DECLARE_ROM_SEGMENT(Z2_8ITEMSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01)
DECLARE_ROM_SEGMENT(Z2_F01_room_00)
-DECLARE_ROM_SEGMENT(Z2_INISIE_BS)
DECLARE_ROM_SEGMENT(Z2_INISIE_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_30GYOSON)
DECLARE_ROM_SEGMENT(Z2_30GYOSON_room_00)
-DECLARE_ROM_SEGMENT(Z2_31MISAKI)
DECLARE_ROM_SEGMENT(Z2_31MISAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI)
DECLARE_ROM_SEGMENT(Z2_TAKARAKUJI_room_00)
-DECLARE_ROM_SEGMENT(Z2_TORIDE)
DECLARE_ROM_SEGMENT(Z2_TORIDE_room_00)
-DECLARE_ROM_SEGMENT(Z2_FISHERMAN)
DECLARE_ROM_SEGMENT(Z2_FISHERMAN_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONSHOP)
DECLARE_ROM_SEGMENT(Z2_GORONSHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_DEKU_KING)
DECLARE_ROM_SEGMENT(Z2_DEKU_KING_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_GORON)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_GORON_room_01)
-DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI)
DECLARE_ROM_SEGMENT(Z2_24KEMONOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01_B)
DECLARE_ROM_SEGMENT(Z2_F01_B_room_00)
-DECLARE_ROM_SEGMENT(Z2_F01C)
DECLARE_ROM_SEGMENT(Z2_F01C_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOTI)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_00)
DECLARE_ROM_SEGMENT(Z2_BOTI_room_01)
-DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS)
DECLARE_ROM_SEGMENT(Z2_HAKUGIN_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_20SICHITAI)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_00)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_01)
DECLARE_ROM_SEGMENT(Z2_20SICHITAI_room_02)
-DECLARE_ROM_SEGMENT(Z2_21MITURINMAE)
DECLARE_ROM_SEGMENT(Z2_21MITURINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_LAST_ZORA)
DECLARE_ROM_SEGMENT(Z2_LAST_ZORA_room_00)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO2_room_01)
-DECLARE_ROM_SEGMENT(Z2_SEA)
DECLARE_ROM_SEGMENT(Z2_SEA_room_00)
DECLARE_ROM_SEGMENT(Z2_SEA_room_01)
DECLARE_ROM_SEGMENT(Z2_SEA_room_02)
@@ -440,10 +374,8 @@ DECLARE_ROM_SEGMENT(Z2_SEA_room_13)
DECLARE_ROM_SEGMENT(Z2_SEA_room_14)
DECLARE_ROM_SEGMENT(Z2_SEA_room_15)
-DECLARE_ROM_SEGMENT(Z2_35TAKI)
DECLARE_ROM_SEGMENT(Z2_35TAKI_room_00)
-DECLARE_ROM_SEGMENT(Z2_REDEAD)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_00)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_01)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_02)
@@ -459,31 +391,24 @@ DECLARE_ROM_SEGMENT(Z2_REDEAD_room_11)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_12)
DECLARE_ROM_SEGMENT(Z2_REDEAD_room_13)
-DECLARE_ROM_SEGMENT(Z2_BANDROOM)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_00)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_01)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_02)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_03)
DECLARE_ROM_SEGMENT(Z2_BANDROOM_room_04)
-DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_00)
DECLARE_ROM_SEGMENT(Z2_11GORONNOSATO_room_01)
-DECLARE_ROM_SEGMENT(Z2_GORON_HAKA)
DECLARE_ROM_SEGMENT(Z2_GORON_HAKA_room_00)
-DECLARE_ROM_SEGMENT(Z2_SECOM)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_00)
DECLARE_ROM_SEGMENT(Z2_SECOM_room_01)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOUGITES)
DECLARE_ROM_SEGMENT(Z2_TOUGITES_room_00)
-DECLARE_ROM_SEGMENT(Z2_DANPEI)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_00)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_01)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_02)
@@ -494,48 +419,34 @@ DECLARE_ROM_SEGMENT(Z2_DANPEI_room_06)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_07)
DECLARE_ROM_SEGMENT(Z2_DANPEI_room_08)
-DECLARE_ROM_SEGMENT(Z2_IKANAMAE)
DECLARE_ROM_SEGMENT(Z2_IKANAMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_DOUJOU)
DECLARE_ROM_SEGMENT(Z2_DOUJOU_room_00)
-DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE)
DECLARE_ROM_SEGMENT(Z2_MUSICHOUSE_room_00)
-DECLARE_ROM_SEGMENT(Z2_IKNINSIDE)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_00)
DECLARE_ROM_SEGMENT(Z2_IKNINSIDE_room_01)
-DECLARE_ROM_SEGMENT(Z2_MAP_SHOP)
DECLARE_ROM_SEGMENT(Z2_MAP_SHOP_room_00)
-DECLARE_ROM_SEGMENT(Z2_F40)
DECLARE_ROM_SEGMENT(Z2_F40_room_00)
-DECLARE_ROM_SEGMENT(Z2_F41)
DECLARE_ROM_SEGMENT(Z2_F41_room_00)
-DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_00)
DECLARE_ROM_SEGMENT(Z2_10YUKIYAMANOMURA2_room_01)
-DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI)
DECLARE_ROM_SEGMENT(Z2_14YUKIDAMANOMITI_room_00)
-DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE)
DECLARE_ROM_SEGMENT(Z2_12HAKUGINMAE_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_17SETUGEN2)
DECLARE_ROM_SEGMENT(Z2_17SETUGEN2_room_00)
-DECLARE_ROM_SEGMENT(Z2_SEA_BS)
DECLARE_ROM_SEGMENT(Z2_SEA_BS_room_00)
-DECLARE_ROM_SEGMENT(Z2_RANDOM)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_00)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_01)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_02)
@@ -543,21 +454,17 @@ DECLARE_ROM_SEGMENT(Z2_RANDOM_room_03)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_04)
DECLARE_ROM_SEGMENT(Z2_RANDOM_room_05)
-DECLARE_ROM_SEGMENT(Z2_YADOYA)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_00)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_01)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_02)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_03)
DECLARE_ROM_SEGMENT(Z2_YADOYA_room_04)
-DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT)
DECLARE_ROM_SEGMENT(Z2_KONPEKI_ENT_room_00)
-DECLARE_ROM_SEGMENT(Z2_INSIDETOWER)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_00)
DECLARE_ROM_SEGMENT(Z2_INSIDETOWER_room_01)
-DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_00)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_01)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_02)
@@ -568,12 +475,10 @@ DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_06)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_07)
DECLARE_ROM_SEGMENT(Z2_26SARUNOMORI_room_08)
-DECLARE_ROM_SEGMENT(Z2_LOST_WOODS)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_00)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_01)
DECLARE_ROM_SEGMENT(Z2_LOST_WOODS_room_02)
-DECLARE_ROM_SEGMENT(Z2_LAST_LINK)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_00)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_01)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_02)
@@ -583,40 +488,28 @@ DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_05)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_06)
DECLARE_ROM_SEGMENT(Z2_LAST_LINK_room_07)
-DECLARE_ROM_SEGMENT(Z2_SOUGEN)
DECLARE_ROM_SEGMENT(Z2_SOUGEN_room_00)
-DECLARE_ROM_SEGMENT(Z2_BOMYA)
DECLARE_ROM_SEGMENT(Z2_BOMYA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA)
DECLARE_ROM_SEGMENT(Z2_KYOJINNOMA_room_00)
-DECLARE_ROM_SEGMENT(Z2_KOEPONARACE)
DECLARE_ROM_SEGMENT(Z2_KOEPONARACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_GORONRACE)
DECLARE_ROM_SEGMENT(Z2_GORONRACE_room_00)
-DECLARE_ROM_SEGMENT(Z2_TOWN)
DECLARE_ROM_SEGMENT(Z2_TOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_ICHIBA)
DECLARE_ROM_SEGMENT(Z2_ICHIBA_room_00)
-DECLARE_ROM_SEGMENT(Z2_BACKTOWN)
DECLARE_ROM_SEGMENT(Z2_BACKTOWN_room_00)
-DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER)
DECLARE_ROM_SEGMENT(Z2_CLOCKTOWER_room_00)
-DECLARE_ROM_SEGMENT(Z2_ALLEY)
DECLARE_ROM_SEGMENT(Z2_ALLEY_room_00)
-DECLARE_ROM_SEGMENT(SPOT00)
DECLARE_ROM_SEGMENT(SPOT00_room_00)
-DECLARE_ROM_SEGMENT(KAKUSIANA)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_00)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_01)
DECLARE_ROM_SEGMENT(KAKUSIANA_room_02)
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/tables/bombers_notebook/event_table.h b/include/tables/bombers_notebook/event_table.h
new file mode 100644
index 000000000..161269a7e
--- /dev/null
+++ b/include/tables/bombers_notebook/event_table.h
@@ -0,0 +1,48 @@
+/**
+ * Bombers Notebook Event Table
+ *
+ * DEFINE_EVENT should be used for events in the notebook
+ * - Argument 0: Enum value for the event
+ * - Argument 1: Icon to use (see BombersNotebookEventIcon)
+ * - Argument 2: WeekEventFlag that updates the icons color
+ * - Argument 3: Message id for the description of this event
+ * - Argument 4: Message id for the completion of this event
+ * - Argument 5: WeekEventFlag for the completion of this event
+ *
+ * Note: These events are after the MET events, so will start indexing at BOMBERS_NOTEBOOK_PERSON_MAX
+ */
+/* 0x14 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x2198, 0x2152, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY)
+/* 0x15 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING, 0x2199, 0x2153, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING)
+/* 0x16 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x219A, 0x2154, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI)
+/* 0x17 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x219B, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI)
+/* 0x18 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI, 0x219C, 0x2156, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI)
+/* 0x19 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES, 0x219D, 0x2157, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES)
+/* 0x1A */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES, 0x219E, 0x2158, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES)
+/* 0x1B */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT, 0x219F, 0x2159, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT)
+/* 0x1C */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM, 0x21A0, 0x215A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM)
+/* 0x1D */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_DEFENDED_AGAINST_THEM, 0x21A1, 0x215B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM)
+/* 0x1E */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A2, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE)
+/* 0x1F */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_ESCORTED_CREMIA, 0x21A3, 0x215D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA)
+/* 0x20 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A4, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK)
+/* 0x21 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A5, 0x215F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK)
+/* 0x22 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, WEEKEVENTREG_RECEIVED_PRIORITY_MAIL, 0x21A6, 0x2160, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL)
+/* 0x23 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A7, 0x2161, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL)
+/* 0x24 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE, BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A8, 0x0000, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE)
+/* 0x25 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21A9, 0x2163, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK)
+/* 0x26 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AA, 0x2164, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP)
+/* 0x27 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AB, 0x2165, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP)
+/* 0x28 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AC, 0x2166, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP)
+/* 0x29 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AD, 0x2167, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP)
+/* 0x2A */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AE, 0x2168, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP)
+/* 0x2B */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP, BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21AF, 0x2169, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP)
+/* 0x2C */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B0, 0x216A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK)
+/* 0x2D */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B1, 0x216B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK)
+/* 0x2E */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B2, 0x216C, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD)
+/* 0x2F */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B3, 0x216D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK)
+/* 0x30 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B4, 0x216E, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK)
+/* 0x31 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B5, 0x216F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT)
+/* 0x32 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B6, 0x2170, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK)
+/* 0x33 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B7, 0x2171, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK)
+/* 0x34 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B8, 0x2172, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK)
+/* 0x35 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21B9, 0x2173, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK)
+/* 0x36 */ DEFINE_EVENT(BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK, BOMBERS_NOTEBOOK_EVENT_ICON_MASK, BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE, 0x21BA, 0x2174, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK)
diff --git a/include/tables/bombers_notebook/person_table.h b/include/tables/bombers_notebook/person_table.h
new file mode 100644
index 000000000..71771956b
--- /dev/null
+++ b/include/tables/bombers_notebook/person_table.h
@@ -0,0 +1,31 @@
+/**
+ * Bombers Notebook Person Table
+ *
+ * DEFINE_PERSON should be used for people with entries in the notebook
+ * - Argument 0: Enum value for this person
+ * - Argument 1: Photo texture for this person
+ * - Argument 2: Message id for the description of this person
+ * - Argument 3: Enum value for the event meeting this person
+ * - Argument 4: Message id for the event meeting this person
+ * - Argument 5: WeekEventFlag for the event meeting this person
+ */
+/* 0x00 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_BOMBERS, D_07009800, 0x21DD, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS, 0x2147, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS)
+/* 0x01 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ANJU, D_07000000, 0x21CA, BOMBERS_NOTEBOOK_EVENT_MET_ANJU, 0x2134, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU)
+/* 0x02 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_KAFEI, D_07000800, 0x21CB, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI, 0x2135, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI)
+/* 0x03 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_CURIOSITY_SHOP_MAN, D_07001000, 0x21CC, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN, 0x2136, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN)
+/* 0x04 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_BOMB_SHOP_LADY, D_07001800, 0x21CD, BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY, 0x2137, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY)
+/* 0x05 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ROMANI, D_07002000, 0x21CE, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI, 0x2138, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI)
+/* 0x06 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_CREMIA, D_07002800, 0x21CF, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA, 0x2139, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA)
+/* 0x07 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_MAYOR_DOTOUR, D_07003000, 0x21D0, BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR, 0x213A, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR)
+/* 0x08 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_MADAME_AROMA, D_07003800, 0x21D1, BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA, 0x213B, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA)
+/* 0x09 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_TOTO, D_07004000, 0x21D2, BOMBERS_NOTEBOOK_EVENT_MET_TOTO, 0x213C, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO)
+/* 0x0A */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GORMAN, D_07004800, 0x21D3, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN, 0x213D, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN)
+/* 0x0B */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_POSTMAN, D_07005000, 0x21D4, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN, 0x213E, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN)
+/* 0x0C */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ROSA_SISTERS, D_07005800, 0x21D5, BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS, 0x213F, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS)
+/* 0x0D */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_TOILET_HAND, D_07006000, 0x21D6, BOMBERS_NOTEBOOK_EVENT_MET_TOLIET_HAND, 0x2140, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND)
+/* 0x0E */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_ANJUS_GRANDMOTHER, D_07006800, 0x21D7, BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER, 0x2141, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER)
+/* 0x0F */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_KAMARO, D_07007000, 0x21D8, BOMBERS_NOTEBOOK_EVENT_MET_KAMARO, 0x2142, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO)
+/* 0x10 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GROG, D_07007800, 0x21D9, BOMBERS_NOTEBOOK_EVENT_MET_GROG, 0x2143, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG)
+/* 0x11 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GORMAN_BROTHERS, D_07008000, 0x21DA, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS, 0x2144, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS)
+/* 0x12 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_SHIRO, D_07008800, 0x21DB, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO, 0x2145, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO)
+/* 0x13 */ DEFINE_PERSON(BOMBERS_NOTEBOOK_PERSON_GURU_GURU, D_07009000, 0x21DC, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU, 0x2146, WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU)
diff --git a/include/tables/scene_table.h b/include/tables/scene_table.h
new file mode 100644
index 000000000..ebd8cdb03
--- /dev/null
+++ b/include/tables/scene_table.h
@@ -0,0 +1,229 @@
+/**
+ * Scene Table
+ *
+ * DEFINE_SCENE should be used for non-empty scenes
+ * - Argument 0: Name of the scene segment in spec
+ * - Argument 1: Enum value for this scene
+ * - Argument 2: Title card's text id, or zero for no title card
+ * - Argument 3: Scene draw config index
+ * - Argument 4: Restriction flags. See `RESTRICTIONS_SET` on z_parameter.c
+ * - Argument 5: Persistent cycle flag set: bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ *
+ * DEFINE_SCENE_UNSET is needed to define empty entries from the original game
+ * - Argument 0: Enum value for this scene
+ */
+// Southern Swamp (Clear)
+/* 0x00 */ DEFINE_SCENE(Z2_20SICHITAI2, SCENE_20SICHITAI2, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+/* 0x01 */ DEFINE_SCENE_UNSET(SCENE_UNSET_01)
+/* 0x02 */ DEFINE_SCENE_UNSET(SCENE_UNSET_02)
+/* 0x03 */ DEFINE_SCENE_UNSET(SCENE_UNSET_03)
+/* 0x04 */ DEFINE_SCENE_UNSET(SCENE_UNSET_04)
+/* 0x05 */ DEFINE_SCENE_UNSET(SCENE_UNSET_05)
+/* 0x06 */ DEFINE_SCENE_UNSET(SCENE_UNSET_06)
+// Lone Peak Shrine & Grottos
+/* 0x07 */ DEFINE_SCENE(KAKUSIANA, SCENE_KAKUSIANA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 2) | (1 << 10) | (1 << 11)))
+// Cutscene Scene
+/* 0x08 */ DEFINE_SCENE(SPOT00, SCENE_SPOT00, 0, SCENE_DRAW_CFG_NOTHING, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x09 */ DEFINE_SCENE_UNSET(SCENE_UNSET_09)
+// Magic Hags' Potion Shop
+/* 0x0A */ DEFINE_SCENE(Z2_WITCH_SHOP, SCENE_WITCH_SHOP, 0x11A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Majora's Lair
+/* 0x0B */ DEFINE_SCENE(Z2_LAST_BS, SCENE_LAST_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Beneath the Graveyard
+/* 0x0C */ DEFINE_SCENE(Z2_HAKASHITA, SCENE_HAKASHITA, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Curiosity Shop
+/* 0x0D */ DEFINE_SCENE(Z2_AYASHIISHOP, SCENE_AYASHIISHOP, 0x10E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x0E */ DEFINE_SCENE_UNSET(SCENE_UNSET_0E)
+/* 0x0F */ DEFINE_SCENE_UNSET(SCENE_UNSET_0F)
+// Mama's House (Ranch House in PAL) & Barn
+/* 0x10 */ DEFINE_SCENE(Z2_OMOYA, SCENE_OMOYA, 0x132, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Honey & Darling's Shop
+/* 0x11 */ DEFINE_SCENE(Z2_BOWLING, SCENE_BOWLING, 0x108, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// The Mayor's Residence
+/* 0x12 */ DEFINE_SCENE(Z2_SONCHONOIE, SCENE_SONCHONOIE, 0x10B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Canyon
+/* 0x13 */ DEFINE_SCENE(Z2_IKANA, SCENE_IKANA, 0x141, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 1) | (1 << 30)))
+// Pirates' Fortress
+/* 0x14 */ DEFINE_SCENE(Z2_KAIZOKU, SCENE_KAIZOKU, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Milk Bar
+/* 0x15 */ DEFINE_SCENE(Z2_MILK_BAR, SCENE_MILK_BAR, 0x10C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower Temple
+/* 0x16 */ DEFINE_SCENE(Z2_INISIE_N, SCENE_INISIE_N, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Treasure Chest Shop
+/* 0x17 */ DEFINE_SCENE(Z2_TAKARAYA, SCENE_TAKARAYA, 0x109, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_SET(2, 0, 0, 0))
+// Inverted Stone Tower Temple
+/* 0x18 */ DEFINE_SCENE(Z2_INISIE_R, SCENE_INISIE_R, 0x144, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 26), 0, 0, 0))
+// Clock Tower Rooftop
+/* 0x19 */ DEFINE_SCENE(Z2_OKUJOU, SCENE_OKUJOU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Before Clock Town
+/* 0x1A */ DEFINE_SCENE(Z2_OPENINGDAN, SCENE_OPENINGDAN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3), 0, 0, 0))
+// Woodfall Temple
+/* 0x1B */ DEFINE_SCENE(Z2_MITURIN, SCENE_MITURIN, 0x11F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 12) | (1 << 13) | (1 << 15) | (1 << 20) | (1 << 21) | (1 << 22), 0, 0, 0))
+// Path to Mountain Village
+/* 0x1C */ DEFINE_SCENE(Z2_13HUBUKINOMITI, SCENE_13HUBUKINOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ancient Castle of Ikana
+/* 0x1D */ DEFINE_SCENE(Z2_CASTLE, SCENE_CASTLE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, (1 << 31), 0, (1 << 10)))
+// Deku Scrub Playground
+/* 0x1E */ DEFINE_SCENE(Z2_DEKUTES, SCENE_DEKUTES, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Odolwa's Lair
+/* 0x1F */ DEFINE_SCENE(Z2_MITURIN_BS, SCENE_MITURIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Town Shooting Gallery
+/* 0x20 */ DEFINE_SCENE(Z2_SYATEKI_MIZU, SCENE_SYATEKI_MIZU, 0x107, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Snowhead Temple
+/* 0x21 */ DEFINE_SCENE(Z2_HAKUGIN, SCENE_HAKUGIN, 0x12B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 5) | (1 << 21) | (1 << 23) | (1 << 24), 0, 0, 0))
+// Milk Road
+/* 0x22 */ DEFINE_SCENE(Z2_ROMANYMAE, SCENE_ROMANYMAE, 0x149, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Pirates' Fortress Interior
+/* 0x23 */ DEFINE_SCENE(Z2_PIRATE, SCENE_PIRATE, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 12)))
+// Swamp Shooting Gallery
+/* 0x24 */ DEFINE_SCENE(Z2_SYATEKI_MORI, SCENE_SYATEKI_MORI, 0x11B, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Pinnacle Rock
+/* 0x25 */ DEFINE_SCENE(Z2_SINKAI, SCENE_SINKAI, 0x135, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Fairy's Fountain
+/* 0x26 */ DEFINE_SCENE(Z2_YOUSEI_IZUMI, SCENE_YOUSEI_IZUMI, 0x13E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Swamp Spider House
+/* 0x27 */ DEFINE_SCENE(Z2_KINSTA1, SCENE_KINSTA1, 0x11E, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Oceanside Spider House
+/* 0x28 */ DEFINE_SCENE(Z2_KINDAN2, SCENE_KINDAN2, 0x13F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Astral Observatory
+/* 0x29 */ DEFINE_SCENE(Z2_TENMON_DAI, SCENE_TENMON_DAI, 0x114, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Deku Trial
+/* 0x2A */ DEFINE_SCENE(Z2_LAST_DEKU, SCENE_LAST_DEKU, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Deku Palace
+/* 0x2B */ DEFINE_SCENE(Z2_22DEKUCITY, SCENE_22DEKUCITY, 0x118, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Mountain Smithy
+/* 0x2C */ DEFINE_SCENE(Z2_KAJIYA, SCENE_KAJIYA, 0x127, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Termina Field
+/* 0x2D */ DEFINE_SCENE(Z2_00KEIKOKU, SCENE_00KEIKOKU, 0x100, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4), 0, 0, 0))
+// Post Office
+/* 0x2E */ DEFINE_SCENE(Z2_POSTHOUSE, SCENE_POSTHOUSE, 0x111, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_SET(3, 0, 0, 0))
+// Marine Research Lab
+/* 0x2F */ DEFINE_SCENE(Z2_LABO, SCENE_LABO, 0x13A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Graveyard (Day 3) and Dampe's House
+/* 0x30 */ DEFINE_SCENE(Z2_DANPEI2TEST, SCENE_DANPEI2TEST, 0x113, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+/* 0x31 */ DEFINE_SCENE_UNSET(SCENE_UNSET_31)
+// Goron Shrine
+/* 0x32 */ DEFINE_SCENE(Z2_16GORON_HOUSE, SCENE_16GORON_HOUSE, 0x124, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall
+/* 0x33 */ DEFINE_SCENE(Z2_33ZORACITY, SCENE_33ZORACITY, 0x136, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Trading Post
+/* 0x34 */ DEFINE_SCENE(Z2_8ITEMSHOP, SCENE_8ITEMSHOP, 0x10F, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Romani Ranch
+/* 0x35 */ DEFINE_SCENE(Z2_F01, SCENE_F01, 0x12E, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Twinmold's Lair
+/* 0x36 */ DEFINE_SCENE(Z2_INISIE_BS, SCENE_INISIE_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Great Bay Coast
+/* 0x37 */ DEFINE_SCENE(Z2_30GYOSON, SCENE_30GYOSON, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 20), 0, 0, (1 << 1) | (1 << 5)))
+// Zora Cape
+/* 0x38 */ DEFINE_SCENE(Z2_31MISAKI, SCENE_31MISAKI, 0x134, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, (1 << 7)))
+// Lottery Shop
+/* 0x39 */ DEFINE_SCENE(Z2_TAKARAKUJI, SCENE_TAKARAKUJI, 0x112, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+/* 0x3A */ DEFINE_SCENE_UNSET(SCENE_UNSET_3A)
+// Pirates' Fortress Moat
+/* 0x3B */ DEFINE_SCENE(Z2_TORIDE, SCENE_TORIDE, 0x138, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Fisherman's Hut
+/* 0x3C */ DEFINE_SCENE(Z2_FISHERMAN, SCENE_FISHERMAN, 0x13B, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Shop
+/* 0x3D */ DEFINE_SCENE(Z2_GORONSHOP, SCENE_GORONSHOP, 0x129, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku King's Chamber
+/* 0x3E */ DEFINE_SCENE(Z2_DEKU_KING, SCENE_DEKU_KING, 0x11C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Goron Trial
+/* 0x3F */ DEFINE_SCENE(Z2_LAST_GORON, SCENE_LAST_GORON, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Road to Southern Swamp
+/* 0x40 */ DEFINE_SCENE(Z2_24KEMONOMITI, SCENE_24KEMONOMITI, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 1) | (1 << 31)))
+// Doggy Racetrack
+/* 0x41 */ DEFINE_SCENE(Z2_F01_B, SCENE_F01_B, 0x130, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Cucco Shack
+/* 0x42 */ DEFINE_SCENE(Z2_F01C, SCENE_F01C, 0x12F, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Ikana Graveyard
+/* 0x43 */ DEFINE_SCENE(Z2_BOTI, SCENE_BOTI, 0x106, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goht's Lair
+/* 0x44 */ DEFINE_SCENE(Z2_HAKUGIN_BS, SCENE_HAKUGIN_BS, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Southern Swamp (poison)
+/* 0x45 */ DEFINE_SCENE(Z2_20SICHITAI, SCENE_20SICHITAI, 0x116, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10) | (1 << 11), 0, 0, (1 << 30)))
+// Woodfall
+/* 0x46 */ DEFINE_SCENE(Z2_21MITURINMAE, SCENE_21MITURINMAE, 0x117, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0x102, 0, 0, (1 << 10)))
+// Moon Zora Trial
+/* 0x47 */ DEFINE_SCENE(Z2_LAST_ZORA, SCENE_LAST_ZORA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// Goron Village (spring)
+/* 0x48 */ DEFINE_SCENE(Z2_11GORONNOSATO2, SCENE_11GORONNOSATO2, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Great Bay Temple
+/* 0x49 */ DEFINE_SCENE(Z2_SEA, SCENE_SEA, 0x13D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 4) | (1 << 5) | (1 << 6), 0, 0, 0))
+// Waterfall Rapids
+/* 0x4A */ DEFINE_SCENE(Z2_35TAKI, SCENE_35TAKI, 0x137, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Beneath the Well
+/* 0x4B */ DEFINE_SCENE(Z2_REDEAD, SCENE_REDEAD, 0x145, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Zora Hall Rooms
+/* 0x4C */ DEFINE_SCENE(Z2_BANDROOM, SCENE_BANDROOM, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Village (winter)
+/* 0x4D */ DEFINE_SCENE(Z2_11GORONNOSATO, SCENE_11GORONNOSATO, 0x123, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 30)))
+// Goron Graveyard
+/* 0x4E */ DEFINE_SCENE(Z2_GORON_HAKA, SCENE_GORON_HAKA, 0x12A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Sakon's Hideout
+/* 0x4F */ DEFINE_SCENE(Z2_SECOM, SCENE_SECOM, 0x143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Mountain Village (winter)
+/* 0x50 */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA, SCENE_10YUKIYAMANOMURA, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Ghost Hut
+/* 0x51 */ DEFINE_SCENE(Z2_TOUGITES, SCENE_TOUGITES, 0x146, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Deku Shrine
+/* 0x52 */ DEFINE_SCENE(Z2_DANPEI, SCENE_DANPEI, 0x120, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Road to Ikana
+/* 0x53 */ DEFINE_SCENE(Z2_IKANAMAE, SCENE_IKANAMAE, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Swordsman's School
+/* 0x54 */ DEFINE_SCENE(Z2_DOUJOU, SCENE_DOUJOU, 0x110, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1), PERSISTENT_CYCLE_FLAGS_NONE)
+// Music Box House
+/* 0x55 */ DEFINE_SCENE(Z2_MUSICHOUSE, SCENE_MUSICHOUSE, 0x147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Igos du Ikana's Lair
+/* 0x56 */ DEFINE_SCENE(Z2_IKNINSIDE, SCENE_IKNINSIDE, 0x142, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_NONE)
+// Tourist Information
+/* 0x57 */ DEFINE_SCENE(Z2_MAP_SHOP, SCENE_MAP_SHOP, 0x119, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Stone Tower
+/* 0x58 */ DEFINE_SCENE(Z2_F40, SCENE_F40, 0x140, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Inverted Stone Tower
+/* 0x59 */ DEFINE_SCENE(Z2_F41, SCENE_F41, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Mountain Village (spring)
+/* 0x5A */ DEFINE_SCENE(Z2_10YUKIYAMANOMURA2, SCENE_10YUKIYAMANOMURA2, 0x122, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 31)))
+// Path to Snowhead
+/* 0x5B */ DEFINE_SCENE(Z2_14YUKIDAMANOMITI, SCENE_14YUKIDAMANOMITI, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 8)))
+// Snowhead
+/* 0x5C */ DEFINE_SCENE(Z2_12HAKUGINMAE, SCENE_12HAKUGINMAE, 0x125, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 10), 0, 0, 0))
+// Path to Goron Village (winter)
+/* 0x5D */ DEFINE_SCENE(Z2_17SETUGEN, SCENE_17SETUGEN, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Path to Goron Village (spring)
+/* 0x5E */ DEFINE_SCENE(Z2_17SETUGEN2, SCENE_17SETUGEN2, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 7)))
+// Gyorg's Lair
+/* 0x5F */ DEFINE_SCENE(Z2_SEA_BS, SCENE_SEA_BS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 31)))
+// Secret Shrine
+/* 0x60 */ DEFINE_SCENE(Z2_RANDOM, SCENE_RANDOM, 0x12C, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// Stock Pot Inn
+/* 0x61 */ DEFINE_SCENE(Z2_YADOYA, SCENE_YADOYA, 0x10A, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Great Bay Cutscene
+/* 0x62 */ DEFINE_SCENE(Z2_KONPEKI_ENT, SCENE_KONPEKI_ENT, 0x139, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Clock Tower Interior
+/* 0x63 */ DEFINE_SCENE(Z2_INSIDETOWER, SCENE_INSIDETOWER, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0), PERSISTENT_CYCLE_FLAGS_SET(1 << 0, 0, 0, 0))
+// Woods of Mystery
+/* 0x64 */ DEFINE_SCENE(Z2_26SARUNOMORI, SCENE_26SARUNOMORI, 0x11D, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Lost Woods (Intro)
+/* 0x65 */ DEFINE_SCENE(Z2_LOST_WOODS, SCENE_LOST_WOODS, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Moon Link Trial
+/* 0x66 */ DEFINE_SCENE(Z2_LAST_LINK, SCENE_LAST_LINK, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 2))
+// The Moon
+/* 0x67 */ DEFINE_SCENE(Z2_SOUGEN, SCENE_SOUGEN, 0, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_MOON, PERSISTENT_CYCLE_FLAGS_NONE)
+// Bomb Shop
+/* 0x68 */ DEFINE_SCENE(Z2_BOMYA, SCENE_BOMYA, 0x10D, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_INDOORS, PERSISTENT_CYCLE_FLAGS_NONE)
+// Giants' Chamber
+/* 0x69 */ DEFINE_SCENE(Z2_KYOJINNOMA, SCENE_KYOJINNOMA, 0, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// Gorman Track
+/* 0x6A */ DEFINE_SCENE(Z2_KOEPONARACE, SCENE_KOEPONARACE, 0x131, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NO_DOUBLE_TIME, PERSISTENT_CYCLE_FLAGS_NONE)
+// Goron Racetrack
+/* 0x6B */ DEFINE_SCENE(Z2_GORONRACE, SCENE_GORONRACE, 0x126, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// East Clock Town
+/* 0x6C */ DEFINE_SCENE(Z2_TOWN, SCENE_TOWN, 0x101, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(1, 0, 0, 0))
+// West Clock Town
+/* 0x6D */ DEFINE_SCENE(Z2_ICHIBA, SCENE_ICHIBA, 0x102, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_NONE)
+// North Clock Town
+/* 0x6E */ DEFINE_SCENE(Z2_BACKTOWN, SCENE_BACKTOWN, 0x103, SCENE_DRAW_CFG_DEFAULT, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, (1 << 10)))
+// South Clock Town
+/* 0x6F */ DEFINE_SCENE(Z2_CLOCKTOWER, SCENE_CLOCKTOWER, 0x104, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET((1 << 20), 0, 0, (1 << 10)))
+// Laundry Pool
+/* 0x70 */ DEFINE_SCENE(Z2_ALLEY, SCENE_ALLEY, 0x105, SCENE_DRAW_CFG_MAT_ANIM, RESTRICTIONS_NONE, PERSISTENT_CYCLE_FLAGS_SET(0, 0, 1, 0))
diff --git a/include/tables/transition_table.h b/include/tables/transition_table.h
new file mode 100644
index 000000000..d623d76bb
--- /dev/null
+++ b/include/tables/transition_table.h
@@ -0,0 +1,21 @@
+/**
+ * Transition Table
+ *
+ * DEFINE_TRANSITION should be used for normal transitions
+ * - Argument 0: Enum value for this transition
+ * - Argument 1: Name of the effect struct
+ * - Argument 2: Instance name
+ * - Argument 3: Name of the effect (without the ovl_ part)
+ *
+ * DEFINE_TRANSITION_INTERNAL should be used for transitions that aren't an overlay
+ * - Argument 0: Enum value for this transition
+ * - Argument 1: Name of the effect struct
+ * - Argument 2: Instance name
+ */
+/* 0 */ DEFINE_TRANSITION_INTERNAL(FBDEMO_FADE, TransitionFade, fade)
+/* 1 */ DEFINE_TRANSITION(FBDEMO_TRIFORCE, TransitionTriforce, triforce, fbdemo_triforce)
+/* 2 */ DEFINE_TRANSITION(FBDEMO_WIPE1, TransitionWipe1, wipe1, fbdemo_wipe1)
+/* 3 */ DEFINE_TRANSITION(FBDEMO_WIPE3, TransitionWipe3, wipe3, fbdemo_wipe3)
+/* 4 */ DEFINE_TRANSITION(FBDEMO_WIPE4, TransitionWipe4, wipe4, fbdemo_wipe4)
+/* 5 */ DEFINE_TRANSITION_INTERNAL(FBDEMO_CIRCLE, TransitionCircle, circle)
+/* 6 */ DEFINE_TRANSITION(FBDEMO_WIPE5, TransitionWipe5, wipe5, fbdemo_wipe5)
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/ultra64/viint.h b/include/ultra64/viint.h
new file mode 100644
index 000000000..4fea2259a
--- /dev/null
+++ b/include/ultra64/viint.h
@@ -0,0 +1,37 @@
+#ifndef ULTRA64_VIINT_H
+#define ULTRA64_VIINT_H
+
+#define VI_STATE_MODE_SET (1 << 0)
+#define VI_STATE_XSCALE_SET (1 << 1)
+#define VI_STATE_YSCALE_FACTOR_SET (1 << 2)
+#define VI_STATE_CTRL_SET (1 << 3)
+#define VI_STATE_BUFFER_SET (1 << 4)
+#define VI_STATE_BLACK (1 << 5)
+#define VI_STATE_REPEATLINE (1 << 6)
+#define VI_STATE_FADE (1 << 7)
+
+#define VI_SCALE_MASK 0xFFF
+#define VI_2_10_FPART_MASK 0x3FF
+#define VI_SUBPIXEL_SH 0x10
+
+// For use in initializing OSViMode structures
+
+#define BURST(hsync_width, color_width, vsync_width, color_start) \
+ (hsync_width | (color_width << 8) | (vsync_width << 16) | (color_start << 20))
+#define WIDTH(v) v
+#define VSYNC(v) v
+#define HSYNC(duration, leap) (duration | (leap << 16))
+#define LEAP(upper, lower) ((upper << 16) | lower)
+#define START(start, end) ((start << 16) | end)
+
+#define FTOFIX(val, i, f) ((u32)(val * (f32)(1 << f)) & ((1 << (i + f)) - 1))
+
+#define F210(val) FTOFIX(val, 2, 10)
+#define SCALE(scaleup, off) (F210((1.0f / (f32)scaleup)) | (F210((f32)off) << 16))
+
+#define VCURRENT(v) v
+#define ORIGIN(v) v
+#define VINTR(v) v
+#define HSTART START
+
+#endif
diff --git a/include/variables.h b/include/variables.h
index f3d668b2b..108fa5833 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;
@@ -436,21 +419,7 @@ extern u8 gOpeningEntranceIndex;
extern ActorCutscene sGlobalCutsceneList[8];
extern GameStateOverlay gGameStateOverlayTable[];
extern s32 gGraphNumGameStates;
-// extern UNK_TYPE2 D_801BDA70;
-// extern UNK_TYPE2 D_801BDA74;
-// extern UNK_TYPE2 D_801BDA78;
-// extern UNK_TYPE2 D_801BDA7C;
-extern s32 D_801BDA9C;
-extern UNK_TYPE4 D_801BDAA0;
-extern s32 D_801BDAA4;
-// extern UNK_TYPE2 D_801BDAA8;
-// extern UNK_TYPE2 D_801BDAAA;
-// extern UNK_TYPE2 D_801BDAAC;
-// extern UNK_TYPE2 D_801BDAAE;
-// extern UNK_TYPE2 D_801BDAB0;
-// extern UNK_TYPE2 D_801BDAB2;
-// extern UNK_TYPE2 D_801BDAB4;
-// extern UNK_TYPE2 D_801BDAB6;
+
// extern UNK_TYPE4 D_801BDAC0;
// extern UNK_TYPE4 D_801BDAC4;
// extern UNK_TYPE4 D_801BDAC8;
@@ -490,30 +459,6 @@ extern u8 D_801BDBC8;
// extern UNK_TYPE1 D_801BE92C;
// extern UNK_TYPE1 D_801BE944;
// extern actor_init_var_func sInitChainHandlers[11];
-// extern UNK_TYPE2 sHeartsPrimColors;
-// extern UNK_TYPE2 D_801BE992;
-// extern UNK_TYPE2 D_801BE994;
-// extern UNK_TYPE2 sHeartsEnvColors;
-// extern UNK_TYPE2 D_801BE9A6;
-// extern UNK_TYPE2 D_801BE9A8;
-// extern UNK_TYPE2 sHeartsPrimFactors;
-// extern UNK_TYPE2 sHeartsEnvFactors;
-// extern UNK_TYPE2 sHeartsDDPrimColors;
-// extern UNK_TYPE2 D_801BE9E2;
-// extern UNK_TYPE2 D_801BE9E4;
-// extern UNK_TYPE2 sHeartsDDEnvColors;
-// extern UNK_TYPE2 D_801BE9F6;
-// extern UNK_TYPE2 D_801BE9F8;
-// extern UNK_TYPE2 sHeartsDDPrimFactors;
-// extern UNK_TYPE2 D_801BEA0A;
-// extern UNK_TYPE2 D_801BEA0C;
-// extern UNK_TYPE2 sHeartsDDEnvFactors;
-// extern UNK_TYPE2 D_801BEA1E;
-// extern UNK_TYPE2 D_801BEA20;
-// extern UNK_TYPE1 HeartTextures;
-// extern UNK_TYPE1 HeartDDTextures;
-//extern LightsPosBindFunc posBindFuncs[3];
-//extern LightsBindFunc dirBindFuncs[3];
// extern UNK_TYPE4 D_801BEAD4;
// extern UNK_TYPE4 D_801BEAD8;
// extern UNK_TYPE1 D_801BEAE0;
@@ -578,9 +523,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[];
@@ -601,7 +543,7 @@ extern s16 gPlayerFormObjectIndices[PLAYER_FORM_MAX];
extern ObjectId gObjectTableSize;
extern RomFile gObjectTable[OBJECT_ID_MAX];
-extern SceneTableEntry gSceneTable[];
+extern SceneTableEntry gSceneTable[SCENE_MAX];
extern UNK_PTR D_801C5C50;
// extern UNK_TYPE1 D_801C5C9C;
extern UNK_PTR D_801C5CB0;
@@ -620,9 +562,7 @@ extern UNK_PTR D_801C5CB0;
// extern UNK_TYPE2 D_801C6A8C;
// extern UNK_TYPE2 D_801C6A90;
// extern UNK_TYPE2 D_801C6A94;
-extern u8 D_801C6A98[5][5];
-// extern UNK_TYPE1 D_801C6AB8;
-// extern UNK_TYPE1 D_801C6B28;
+extern u8 gPageSwitchNextButtonStatus[6][5];
// extern UNK_TYPE1 D_801CED40;
// extern UNK_TYPE2 D_801CFC78;
// extern UNK_TYPE1 D_801CFC7A;
@@ -746,7 +686,6 @@ extern char D_801D039C[];
extern KaleidoMgrOverlay gKaleidoMgrOverlayTable[2];
// extern UNK_TYPE1 D_801D0B8C;
extern KaleidoMgrOverlay* gKaleidoMgrCurOvl;
-// extern UNK_TYPE4 D_801D0BB0;
// extern UNK_TYPE1 D_801D0C80;
// extern UNK_TYPE1 D_801D0CB0;
extern s32 gDbgCamEnabled;
@@ -756,68 +695,14 @@ extern s32 gDbgCamEnabled;
extern Input* D_801D0D60;
// extern UNK_TYPE2 sPlayerCsIdToCsCamId;
// extern UNK_TYPE1 D_801D0D7A;
-// extern UNK_TYPE1 D_801D0D80;
-// extern UNK_TYPE1 D_801D11F4;
-// extern UNK_TYPE1 D_801D1230;
-// extern UNK_TYPE1 D_801D1234;
-// extern UNK_TYPE4 D_801D1238;
-// extern UNK_TYPE1 D_801D1244;
-// extern UNK_TYPE1 D_801D12C0;
-// extern UNK_TYPE1 D_801D12D0;
-// extern UNK_TYPE1 D_801D12D4;
-// extern UNK_TYPE1 D_801D12D8;
-// extern UNK_TYPE1 D_801D12DC;
-// extern UNK_TYPE2 D_801D1330;
-// extern UNK_TYPE1 D_801D1342;
-// extern UNK_TYPE2 D_801D1344;
-// extern UNK_TYPE1 D_801D1368;
-// extern UNK_TYPE2 D_801D1374;
-// extern UNK_TYPE1 D_801D1388;
-// extern UNK_TYPE2 D_801D13D8;
-// extern UNK_TYPE2 D_801D13DC;
-// extern UNK_TYPE2 D_801D13E0;
-// extern UNK_TYPE2 D_801D13E4;
-// extern UNK_TYPE4 D_801D13E8;
-// extern UNK_TYPE1 D_801D13EC;
-// extern UNK_TYPE1 D_801D13F0;
-// extern UNK_TYPE1 D_801D13F4;
-// extern UNK_TYPE1 D_801D13F8;
-// extern UNK_TYPE1 D_801D1420;
-// extern UNK_TYPE2 D_801D142C;
-// extern UNK_TYPE2 D_801D1434;
-// extern UNK_TYPE2 D_801D1438;
-// extern UNK_TYPE2 D_801D143C;
-// extern UNK_TYPE2 D_801D1440;
-// extern UNK_TYPE2 D_801D1444;
-// extern UNK_TYPE2 D_801D1448;
-// extern UNK_TYPE2 D_801D144C;
-// extern UNK_TYPE2 D_801D1450;
-// extern UNK_TYPE2 D_801D1454;
-// extern UNK_TYPE2 D_801D1458;
-// extern UNK_TYPE2 D_801D145C;
-// extern UNK_TYPE2 D_801D1460;
-// extern UNK_TYPE1 D_801D1464;
-// extern UNK_TYPE1 D_801D1468;
-// extern UNK_TYPE1 D_801D146C;
-// extern UNK_TYPE2 D_801D14DC;
-// extern UNK_TYPE2 D_801D14E0;
-// extern UNK_TYPE2 D_801D14E4;
-// extern UNK_TYPE2 D_801D14E8;
// extern UNK_TYPE4 D_801D14F0;
-extern s32 gFramerateDivisor;
-extern f32 gFramerateDivisorF;
-extern f32 gFramerateDivisorHalf;
-extern f32 gFramerateDivisorThird;
+
extern u32 retryCount;
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;
extern Vec3s gZeroVec3s;
@@ -1629,10 +1514,6 @@ extern f32 D_801DD774;
extern f32 D_801DD780;
extern f32 D_801DD7B0;
extern f32 D_801DD7C0;
-extern f32 D_801DD7E0;
-extern f32 D_801DD7E4;
-extern f32 D_801DD7E8;
-extern f32 D_801DD7EC;
// extern UNK_TYPE2 D_801DD880;
// extern UNK_TYPE1 D_801DD8E0;
// extern UNK_TYPE4 D_801DD900;
@@ -2241,7 +2122,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];
@@ -2257,20 +2138,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;
@@ -2431,7 +2298,7 @@ extern UNK_TYPE1 D_801F7FF0;
extern struct_801F8010 D_801F8010;
extern VisZbuf sVisZbuf;
extern VisMono sMonoColors;
-extern UNK_TYPE1 D_801F8048;
+extern ViMode D_801F8048;
extern FaultAddrConvClient sGraphFaultAddrConvClient;
extern FaultClient sGraphFaultClient;
extern GfxMasterList* gGfxMasterDL;
@@ -2442,7 +2309,6 @@ extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext;
extern OSThread gGraphThread;
-extern PadMgr gPadMgr;
extern FaultClient sSchedFaultClient;
extern OSTime sRSPGFXStartTime;
@@ -2461,30 +2327,32 @@ extern volatile OSTime sRSPOtherTotalTime;
// extern UNK_TYPE1 D_801FBB18;
extern volatile OSTime gRDPTotalTime;
// extern UNK_TYPE1 D_801FBB28;
-extern OSViMode D_801FBB30;
-extern u32* gFramebuffers[2];
-extern OSViMode* D_801FBB88;
+
+extern OSViMode sNotebookViMode;
+extern void* gFramebuffers[2];
+extern OSViMode* gActiveViMode;
extern u16* gZBufferPtr;
-extern void* D_801FBB90;
+extern void* gWorkBuffer;
extern u64* gGfxSPTaskOutputBufferPtr;
-extern size_t gGfxSPTaskOutputBufferSize;
-// extern UNK_TYPE1 D_801FBB9C;
-// extern UNK_TYPE1 D_801FBBA0;
-extern u16 (*gZBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u16 (*gWorkBuffer)[SCREEN_WIDTH * SCREEN_HEIGHT];
-extern u64 (*gGfxSPTaskOutputBuffer)[0x3000];
extern void* gGfxSPTaskOutputBufferEnd;
-// extern UNK_TYPE1 D_801FBBB4;
-// extern UNK_TYPE1 D_801FBBB8;
-// extern UNK_TYPE1 D_801FBBBC;
-// extern UNK_TYPE1 D_801FBBC0;
-extern u64 (*gGfxSPTaskOutputBuffer2)[0x3000];
-extern void* gGfxSPTaskOutputBufferEnd2;
-extern UNK_TYPE2 D_801FBBCC;
-extern UNK_TYPE2 D_801FBBCE;
-// extern UNK_TYPE1 D_801FBBD0;
-// extern UNK_TYPE1 D_801FBBD2;
-extern u8 D_801FBBD4;
+extern void* sCfbLoRes1;
+extern void* sCfbLoRes0;
+extern u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndLoRes;
+extern void* sCfbHiRes1;
+extern void* sCfbHiRes0;
+extern u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+extern u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+extern void* gGfxSPTaskOutputBufferEndHiRes;
+extern s16 gCfbWidth;
+extern s16 gCfbHeight;
+extern s16 gCfbLeftAdjust;
+extern s16 gCfbUpperAdjust;
+extern u8 gSysCfbHiResEnabled;
+
extern Vec3f D_801FBBF0;
extern LineSegment Math3D_ColSphereTri_line;
extern Vec3f Math3D_ColSphereTri_point;
@@ -2648,7 +2516,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 50405690f..641a060b4 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"
@@ -33,6 +35,7 @@
#include "z64animation_legacy.h"
#include "z64audio.h"
#include "z64bgcheck.h"
+#include "z64bombers_notebook.h"
#include "z64camera.h"
#include "z64collision_check.h"
#include "z64curve.h"
@@ -42,6 +45,7 @@
#include "z64effect.h"
#include "z64frameadvance.h"
#include "z64game_over.h"
+#include "z64game.h"
#include "z64interface.h"
#include "z64item.h"
#include "z64light.h"
@@ -66,6 +70,7 @@
#define Z_THREAD_ID_MAIN 3
#define Z_THREAD_ID_GRAPH 4
#define Z_THREAD_ID_SCHED 5
+#define Z_THREAD_ID_FLASHROM 13
#define Z_THREAD_ID_DMAMGR 18
#define Z_THREAD_ID_IRQMGR 19
@@ -74,17 +79,19 @@
#define Z_PRIORITY_AUDIOMGR 11
#define Z_PRIORITY_IDLE 12
#define Z_PRIORITY_MAIN 12
+#define Z_PRIORITY_FLASHROM 13
#define Z_PRIORITY_PADMGR 15
#define Z_PRIORITY_SCHED 16
#define Z_PRIORITY_DMAMGR 17
#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 +114,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;
@@ -198,13 +122,13 @@ typedef struct {
} NmiBuff; // size >= 0x18
typedef struct {
- /* 0x00 */ int unk0;
- /* 0x04 */ void* unk4;
- /* 0x08 */ int unk8;
- /* 0x0C */ int unkC;
- /* 0x10 */ int unk10;
- /* 0x14 */ OSMesgQueue unk14;
-} s80185D40; // size = 0x2C
+ /* 0x00 */ s32 requestType;
+ /* 0x04 */ OSMesg response;
+ /* 0x08 */ void* addr;
+ /* 0x0C */ s32 pageNum;
+ /* 0x10 */ s32 pageCount;
+ /* 0x14 */ OSMesgQueue messageQueue;
+} FlashromRequest; // size = 0x2C
// End of RDRAM without the Expansion Pak installed
#define NORMAL_RDRAM_END 0x80400000
@@ -261,11 +185,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];
@@ -280,11 +204,11 @@ typedef struct {
/* 0x204 */ u16 pageIndex;
/* 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
+ /* 0x20C */ f32 unk_20C; // set to 936.0f, unused remnant from OoT
+ /* 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;
@@ -296,7 +220,7 @@ typedef struct {
/* 0x24C */ s16 cursorYIndex[5];
/* 0x256 */ s16 unk_256; // Uses DungeonItem enum
/* 0x258 */ s16 cursorSpecialPos;
- /* 0x25A */ s16 pageSwitchTimer;
+ /* 0x25A */ s16 pageSwitchInputTimer; // Used to introduce a delay before switching page when arriving on the "scroll left/right" positions while holding stick left/right.
/* 0x25C */ u16 namedItem;
/* 0x25E */ u16 cursorItem[5];
/* 0x268 */ u16 cursorSlot[5];
@@ -307,15 +231,15 @@ typedef struct {
/* 0x27A */ s16 equipAnimY;
/* 0x27C */ s16 equipAnimAlpha;
/* 0x27E */ s16 infoPanelOffsetY;
- /* 0x280 */ u16 unk_280;
+ /* 0x280 */ u16 nameDisplayTimer;
/* 0x282 */ u16 nameColorSet;
/* 0x284 */ s16 cursorColorSet;
- /* 0x286 */ s16 unk_286;
- /* 0x288 */ f32 unk_288;
- /* 0x28C */ f32 unk_28C;
- /* 0x290 */ f32 unk_290;
- /* 0x294 */ f32 unk_294;
- /* 0x298 */ f32 unk_298;
+ /* 0x286 */ s16 cursorSpinPhase;
+ /* 0x288 */ f32 cursorX;
+ /* 0x28C */ f32 cursorY;
+ /* 0x290 */ f32 cursorWidth;
+ /* 0x294 */ f32 cursorHeight;
+ /* 0x298 */ f32 cursorShrinkRate;
/* 0x29C */ s16 promptChoice; // save/continue choice: 0 = yes; 4 = no
/* 0x29E */ s16 promptAlpha;
/* 0x2A0 */ s16 ocarinaSongIndex;
@@ -351,45 +275,45 @@ typedef struct {
/* 0x00 */ u16 unk_0;
/* 0x02 */ u16 sceneTimeSpeed;
/* 0x04 */ Vec3f sunPos;
- /* 0x10 */ u8 unk_10;
- /* 0x11 */ u8 unk_11;
+ /* 0x10 */ u8 skybox1Index;
+ /* 0x11 */ u8 skybox2Index;
/* 0x12 */ u8 unk_12;
- /* 0x13 */ u8 unk_13;
+ /* 0x13 */ u8 skyboxBlend;
/* 0x14 */ u8 unk_14;
/* 0x15 */ u8 skyboxDisabled;
/* 0x16 */ u8 sunMoonDisabled;
- /* 0x17 */ u8 unk_17;
- /* 0x18 */ u8 unk_18;
- /* 0x19 */ u8 unk_19;
- /* 0x1A */ u16 unk_1A;
+ /* 0x17 */ u8 skyboxConfig;
+ /* 0x18 */ u8 changeSkyboxNextConfig;
+ /* 0x19 */ u8 changeSkyboxState;
+ /* 0x1A */ u16 changeSkyboxTimer;
/* 0x1C */ u16 unk_1C;
- /* 0x1E */ u8 unk_1E;
- /* 0x1F */ u8 unk_1F;
- /* 0x20 */ u8 unk_20;
- /* 0x21 */ u8 unk_21;
- /* 0x22 */ u16 unk_22;
- /* 0x24 */ u16 unk_24;
+ /* 0x1E */ u8 lightMode;
+ /* 0x1F */ u8 lightConfig;
+ /* 0x20 */ u8 changeLightNextConfig;
+ /* 0x21 */ u8 changeLightEnabled;
+ /* 0x22 */ u16 changeLightTimer;
+ /* 0x24 */ u16 changeDuration;
/* 0x26 */ u8 unk_26;
/* 0x28 */ LightInfo dirLight1; // sun 1
/* 0x36 */ LightInfo unk_36; // sun 2
- /* 0x44 */ s8 unk_44;
- /* 0x48 */ DmaRequest unk_48;
- /* 0x68 */ OSMesgQueue unk_68;
- /* 0x80 */ OSMesg unk_80;
- /* 0x84 */ f32 unk_84;
- /* 0x88 */ f32 unk_88;
+ /* 0x44 */ s8 skyboxDmaState;
+ /* 0x48 */ DmaRequest dmaRequest;
+ /* 0x68 */ OSMesgQueue loadQueue;
+ /* 0x80 */ OSMesg loadMsg;
+ /* 0x84 */ f32 glareAlpha;
+ /* 0x88 */ f32 lensFlareAlphaScale;
/* 0x8C */ EnvLightSettings lightSettings;
/* 0xA8 */ f32 unk_A8;
/* 0xAC */ Vec3s windDir;
/* 0xB4 */ f32 windSpeed;
/* 0xB8 */ u8 numLightSettings;
/* 0xBC */ LightSettings* lightSettingsList;
- /* 0xC0 */ u8 unk_C0;
- /* 0xC1 */ u8 unk_C1;
- /* 0xC2 */ u8 unk_C2;
+ /* 0xC0 */ u8 lightBlendEnabled;
+ /* 0xC1 */ u8 lightSetting;
+ /* 0xC2 */ u8 prevLightSetting;
/* 0xC3 */ u8 lightSettingOverride;
/* 0xC4 */ LightSettings unk_C4;
- /* 0xDA */ u16 unk_DA;
+ /* 0xDA */ u16 lightBlendRateOverride;
/* 0xDC */ f32 lightBlend;
/* 0xE0 */ u8 unk_E0;
/* 0xE1 */ u8 unk_E1;
@@ -481,58 +405,10 @@ 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
-struct GameState;
-
-typedef void (*GameStateFunc)(struct GameState* gameState);
-
-typedef struct {
- /* 0x00 */ void* loadedRamAddr;
- /* 0x04 */ uintptr_t vromStart; // if applicable
- /* 0x08 */ uintptr_t vromEnd; // if applicable
- /* 0x0C */ void* vramStart; // if applicable
- /* 0x10 */ void* vramEnd; // if applicable
- /* 0x14 */ UNK_PTR unk_14;
- /* 0x18 */ GameStateFunc init; // initializes and executes the given context
- /* 0x1C */ GameStateFunc destroy; // deconstructs the context, and sets the next context to load
- /* 0x20 */ UNK_PTR unk_20;
- /* 0x24 */ UNK_PTR unk_24;
- /* 0x28 */ UNK_TYPE unk_28;
- /* 0x2C */ size_t instanceSize;
-} GameStateOverlay; // size = 0x30
-
-typedef struct GameAllocEntry {
- /* 0x0 */ struct GameAllocEntry* next;
- /* 0x4 */ struct GameAllocEntry* prev;
- /* 0x8 */ size_t size;
- /* 0xC */ u32 unk_0C;
-} GameAllocEntry; // size = 0x10
-
-typedef struct GameAlloc {
- /* 0x00 */ GameAllocEntry base;
- /* 0x10 */ GameAllocEntry* head;
-} GameAlloc; // size = 0x14
-
-typedef struct GameState {
- /* 0x00 */ GraphicsContext* gfxCtx;
- /* 0x04 */ GameStateFunc main;
- /* 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];
- /* 0x74 */ TwoHeadArena heap;
- /* 0x84 */ GameAlloc alloc;
- /* 0x98 */ UNK_TYPE1 pad98[0x3];
- /* 0x9B */ u8 running; // If 0, switch to next game state
- /* 0x9C */ u32 frames;
- /* 0xA0 */ u8 padA0[0x2];
- /* 0xA2 */ u8 framerateDivisor; // game speed?
- /* 0xA3 */ u8 unk_A3;
-} GameState; // size = 0xA4
-
struct PlayState;
typedef s32 (*ColChkResetFunc)(struct PlayState*, Collider*);
@@ -541,34 +417,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 +474,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);
@@ -682,26 +530,6 @@ typedef struct PlayState {
/* 0x18E6C */ char unk_18E6C[0x3EC];
} PlayState; // size = 0x19258
-typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ char unk_01[0x3F];
- /* 0x40 */ void* unk_40;
- /* 0x44 */ u32 unk_44;
- /* 0x48 */ u32 unk_48;
- /* 0x4C */ DmaRequest unk_4C;
- /* 0x6C */ OSMesgQueue unk_6C;
- /* 0x84 */ OSMesg unk_84[1];
- /* 0x88 */ void* unk_88;
- /* 0x8C */ uintptr_t unk_8C;
- /* 0x90 */ size_t unk_90;
- /* 0x94 */ s32 unk_94;
- /* 0x98 */ s32 unk_98;
- /* 0x9C */ s32 unk_9C;
- /* 0xA0 */ char unk_A0[0x4];
- /* 0xA4 */ s32 unk_A4;
- /* 0xA8 */ s32 unk_A8;
-} BombersNotebook; // size = 0xAC
-
typedef enum {
/* 0 */ PICTO_PHOTO_STATE_OFF,
/* 1 */ PICTO_PHOTO_STATE_SETUP,
@@ -720,7 +548,7 @@ typedef struct {
typedef struct {
/* 0x0 */ u32 type;
/* 0x4 */ u32 setScissor;
- /* 0x8 */ Color_RGBA8 color;
+ /* 0x8 */ Color_RGBA8_u32 color;
/* 0xC */ Color_RGBA8 envColor;
} struct_801F8010; // size = 0x10
@@ -750,7 +578,20 @@ typedef struct {
#define FRAM_STATUS_REGISTER FRAM_BASE_ADDRESS // FRAM Base Address in Cart Memory
#define FRAM_COMMAND_REGISTER 0x10000 // Located at 0x08010000 on the Cart
-enum fram_command {
+#define FLASH_VERSION_MX_PROTO_A 0x00C20000
+#define FLASH_VERSION_MX_A 0x00C20001
+#define FLASH_VERSION_MX_C 0x00C2001E
+#define FLASH_VERSION_MX_B_AND_D 0x00C2001D
+#define FLASH_VERSION_MEI 0x003200F1
+
+#define FLASH_TYPE_MAGIC 0x11118001
+
+#define FLASH_PAGE_SIZE 128
+
+#define FLASHROM_REQUEST_WRITE 1
+#define FLASHROM_REQUEST_READ 2
+
+typedef enum FramCommand {
/* Does nothing for FRAM_COMMAND_SET_MODE_READ_AND_STATUS, FRAM_MODE_NOP, FRAM_COMMAND_SET_MODE_STATUS_AND_STATUS
Initializes fram to 0xFF in FRAM_MODE_ERASE
Writes Contents in FLASHRAM_MODE_WRITE
@@ -774,14 +615,39 @@ enum fram_command {
FRAM_COMMAND_SET_MODE_READ_AND_STATUS = 0xF0000000,
/* unk */
FRAM_COMMAND_UNK_ERASE_OPERATION = 0x3C000000
-};
+} FramCommand;
-enum fram_mode {
- FRAM_MODE_NOP = 0,
- FRAM_MODE_ERASE,
- FRAM_MODE_WRITE,
- FRAM_MODE_READ,
- FRAM_MODE_STATUS
-};
+typedef enum FramMode {
+ /* 0 */ FRAM_MODE_NOP,
+ /* 1 */ FRAM_MODE_ERASE,
+ /* 2 */ FRAM_MODE_WRITE,
+ /* 3 */ FRAM_MODE_READ,
+ /* 4 */ FRAM_MODE_STATUS
+} FramMode;
+
+typedef enum {
+ /* 0 */ VI_MODE_EDIT_STATE_INACTIVE,
+ /* 1 */ VI_MODE_EDIT_STATE_ACTIVE,
+ /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments
+ /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode
+} ViModeEditState;
+
+typedef struct {
+ /* 0x00 */ OSViMode customViMode;
+ /* 0x50 */ s32 viHeight;
+ /* 0x54 */ s32 viWidth;
+ /* 0x58 */ s32 rightAdjust;
+ /* 0x5C */ s32 leftAdjust;
+ /* 0x60 */ s32 lowerAdjust;
+ /* 0x64 */ s32 upperAdjust;
+ /* 0x68 */ s32 editState;
+ /* 0x6C */ s32 tvType;
+ /* 0x70 */ u32 loRes;
+ /* 0x74 */ u32 antialiasOff;
+ /* 0x78 */ u32 modeN;
+ /* 0x7C */ u32 fb16Bit;
+ /* 0x80 */ u32 viFeatures;
+ /* 0x84 */ u32 unk_84;
+} ViMode; // size = 0x88
#endif
diff --git a/include/z64actor.h b/include/z64actor.h
index 7cc4275ac..3051f2c6e 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -317,7 +317,7 @@ typedef struct EnAObj {
typedef enum {
/* 0 */ AOBJ_SIGNPOST_OBLONG,
- /* 1 */ AOBJ_SIGNPOST_ARROW,
+ /* 1 */ AOBJ_SIGNPOST_ARROW
} AObjType;
#define AOBJ_GET_TEXTID(thisx) ((((thisx)->params >> 8) & 0xFF) | 0x300)
@@ -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..67c9d7641 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,
@@ -300,7 +304,7 @@ typedef struct SkeletonInfo {
typedef s32 (*OverrideKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
-typedef void (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
+typedef s32 (*PostKeyframeDrawScaled)(struct PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList,
u8* flags, struct Actor* actor, Vec3f* scale, Vec3s* rot, Vec3f* pos);
void SkelAnime_DrawLod(struct PlayState* play, void** skeleton, Vec3s* jointTable, OverrideLimbDrawOpa overrideLimbDraw, PostLimbDrawOpa postLimbDraw, struct Actor* actor, s32 lod);
@@ -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/z64audio.h b/include/z64audio.h
index a37760566..9b077cf1a 100644
--- a/include/z64audio.h
+++ b/include/z64audio.h
@@ -105,7 +105,7 @@ typedef enum {
/* 1 */ SOUNDMODE_HEADSET,
/* 2 */ SOUNDMODE_SURROUND_EXTERNAL,
/* 3 */ SOUNDMODE_MONO,
- /* 4 */ SOUNDMODE_SURROUND,
+ /* 4 */ SOUNDMODE_SURROUND
} SoundMode;
typedef enum {
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/z64bombers_notebook.h b/include/z64bombers_notebook.h
new file mode 100644
index 000000000..403f4a88a
--- /dev/null
+++ b/include/z64bombers_notebook.h
@@ -0,0 +1,58 @@
+#ifndef Z64BOMBERS_NOTEBOOK_H
+#define Z64BOMBERS_NOTEBOOK_H
+
+#include "ultra64.h"
+#include "io/controller.h"
+#include "z64dma.h"
+
+#define DEFINE_PERSON(enum, _photo, _description, _metEnum, _metMessage, _metFlag) enum,
+typedef enum BombersNotebookPerson {
+ #include "tables/bombers_notebook/person_table.h"
+ /* 0x14 */ BOMBERS_NOTEBOOK_PERSON_MAX
+} BombersNotebookPerson;
+
+#undef DEFINE_PERSON
+
+typedef enum BombersNotebookLoadState {
+ /* 0 */ BOMBERS_NOTEBOOK_LOAD_STATE_NONE,
+ /* 1 */ BOMBERS_NOTEBOOK_LOAD_STATE_STARTED,
+ /* 2 */ BOMBERS_NOTEBOOK_LOAD_STATE_DONE
+} BombersNotebookLoadState;
+
+#define DEFINE_PERSON(_enum, _photo, _description, metEnum, _metMessage, _metFlag) metEnum,
+#define DEFINE_EVENT(enum, _icon, _colorFlag, _description, _completedMessage, _completedFlag) enum,
+typedef enum BombersNotebookEvent {
+ #include "tables/bombers_notebook/person_table.h"
+ #include "tables/bombers_notebook/event_table.h"
+ /* 0x37 */ BOMBERS_NOTEBOOK_EVENT_MAX
+} BombersNotebookEvent;
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+typedef struct {
+ /* 0x00 */ u8 loadState;
+ /* 0x01 */ UNK_TYPE1 pad01[0x3F];
+ /* 0x40 */ void* scheduleDmaSegment;
+ /* 0x44 */ uintptr_t scheduleDmaSegmentStart;
+ /* 0x48 */ size_t scheduleDmaSegmentSize;
+ /* 0x4C */ DmaRequest dmaRequest;
+ /* 0x6C */ OSMesgQueue loadQueue;
+ /* 0x84 */ OSMesg loadMsg[1];
+ /* 0x88 */ void* scheduleSegment;
+ /* 0x8C */ uintptr_t scheduleSegmentStart;
+ /* 0x90 */ size_t scheduleSegmentSize;
+ /* 0x94 */ s32 cursorPageRow;
+ /* 0x98 */ s32 cursorEntry; // Entries are 3 apart, see BOMBERS_NOTEBOOK_ENTRY_SIZE
+ /* 0x9C */ s32 cursorPage;
+ /* 0xA0 */ UNK_TYPE1 padA0[0x4];
+ /* 0xA4 */ s32 scrollAmount;
+ /* 0xA8 */ s32 scrollOffset;
+} BombersNotebook; // size = 0xAC
+
+void BombersNotebook_Draw(BombersNotebook* this, struct GraphicsContext* gfxCtx);
+void BombersNotebook_Update(struct PlayState* play, BombersNotebook* this, Input* input);
+void BombersNotebook_Init(BombersNotebook* this);
+void BombersNotebook_Destroy(BombersNotebook* this);
+
+#endif
diff --git a/include/z64camera.h b/include/z64camera.h
index 3205496e7..ccdee8811 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,
@@ -361,7 +361,7 @@ typedef enum {
/* 0x12 */ CAM_DATA_18,
/* 0x13 */ CAM_DATA_19,
/* 0x14 */ CAM_DATA_20,
- /* 0x15 */ CAM_DATA_21,
+ /* 0x15 */ CAM_DATA_21
} CameraDataType;
/*================================
@@ -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/z64game.h b/include/z64game.h
new file mode 100644
index 000000000..c5551edc7
--- /dev/null
+++ b/include/z64game.h
@@ -0,0 +1,104 @@
+#ifndef Z64_GAME_H
+#define Z64_GAME_H
+
+#include "ultra64.h"
+#include "libc/stdbool.h"
+#include "libc/stdint.h"
+#include "io/controller.h"
+#include "tha.h"
+#include "padmgr.h"
+
+struct GraphicsContext;
+struct GameState;
+
+
+typedef void (*GameStateFunc)(struct GameState* gameState);
+
+typedef struct {
+ /* 0x00 */ void* loadedRamAddr;
+ /* 0x04 */ uintptr_t vromStart; // if applicable
+ /* 0x08 */ uintptr_t vromEnd; // if applicable
+ /* 0x0C */ void* vramStart; // if applicable
+ /* 0x10 */ void* vramEnd; // if applicable
+ /* 0x14 */ UNK_PTR unk_14;
+ /* 0x18 */ GameStateFunc init; // initializes and executes the given context
+ /* 0x1C */ GameStateFunc destroy; // deconstructs the context, and sets the next context to load
+ /* 0x20 */ UNK_PTR unk_20;
+ /* 0x24 */ UNK_PTR unk_24;
+ /* 0x28 */ UNK_TYPE unk_28;
+ /* 0x2C */ size_t instanceSize;
+} GameStateOverlay; // size = 0x30
+
+typedef struct GameAllocEntry {
+ /* 0x0 */ struct GameAllocEntry* next;
+ /* 0x4 */ struct GameAllocEntry* prev;
+ /* 0x8 */ size_t size;
+ /* 0xC */ u32 unk_0C;
+} GameAllocEntry; // size = 0x10
+
+typedef struct GameAlloc {
+ /* 0x00 */ GameAllocEntry base;
+ /* 0x10 */ GameAllocEntry* head;
+} GameAlloc; // size = 0x14
+
+typedef struct GameState {
+ /* 0x00 */ struct GraphicsContext* gfxCtx;
+ /* 0x04 */ GameStateFunc main;
+ /* 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[MAXCONTROLLERS];
+ /* 0x74 */ TwoHeadArena heap;
+ /* 0x84 */ GameAlloc alloc;
+ /* 0x98 */ UNK_TYPE1 pad98[0x3];
+ /* 0x9B */ u8 running; // If 0, switch to next game state
+ /* 0x9C */ u32 frames;
+ /* 0xA0 */ u8 padA0[0x2];
+ /* 0xA2 */ u8 framerateDivisor;
+ /* 0xA3 */ u8 unk_A3;
+} GameState; // size = 0xA4
+
+
+void Game_UpdateFramerateVariables(s32 divisor);
+void Game_SetFramerateDivisor(GameState* gameState, s32 divisor);
+void GameState_SetFBFilter(Gfx** gfx, void* zbuffer);
+void Game_Nop80173534(GameState* gameState);
+void GameState_Draw(GameState* gameState, struct GraphicsContext* gfxCtx);
+void GameState_SetFrameBuffer(struct GraphicsContext* gfxCtx);
+void func_801736DC(struct GraphicsContext* gfxCtx);
+void Game_UpdateInput(GameState* gameState);
+void Game_Update(GameState* gameState);
+void Game_IncrementFrameCount(GameState* gameState);
+void GameState_InitArena(GameState* gameState, size_t size);
+void GameState_Realloc(GameState* gameState, size_t size);
+void GameState_Init(GameState* gameState, GameStateFunc init, struct GraphicsContext* gfxCtx);
+void GameState_Destroy(GameState* gameState);
+GameStateFunc GameState_GetInit(GameState* gameState);
+size_t GameState_GetSize(GameState* gameState);
+u32 GameState_IsRunning(GameState* gameState);
+s32 GameState_GetArenaSize(GameState* gameState);
+s32 func_80173B48(GameState* gameState);
+
+extern s32 gFramerateDivisor;
+extern f32 gFramerateDivisorF;
+extern f32 gFramerateDivisorHalf;
+extern f32 gFramerateDivisorThird;
+
+
+#define STOP_GAMESTATE(curState) \
+ do { \
+ GameState* state = curState; \
+ \
+ state->running = false; \
+ } while(0)
+
+#define SET_NEXT_GAMESTATE(curState, nextInit, nextSize) \
+ do { \
+ GameState* state = curState; \
+ \
+ (state)->init = nextInit; \
+ (state)->size = nextSize; \
+ } while (0)
+
+
+#endif
diff --git a/include/z64horse.h b/include/z64horse.h
new file mode 100644
index 000000000..bae439868
--- /dev/null
+++ b/include/z64horse.h
@@ -0,0 +1,21 @@
+#ifndef Z64_HORSE_H
+#define Z64_HORSE_H
+
+#include "ultra64.h"
+#include "z64.h"
+
+
+s32 Horse_GetJumpingFencePathIndex(PlayState* play);
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4);
+s32 Horse_IsValidSpawn(s16 sceneId);
+void Horse_ResetHorseData(PlayState* play);
+void Horse_Spawn(PlayState* play, Player* player);
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw);
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx);
+
+
+extern s32 gHorseIsMounted;
+extern s32 D_801BDAA0;
+extern s32 gHorsePlayedEponasSong;
+
+#endif
diff --git a/include/z64item.h b/include/z64item.h
index d1d36ebba..55cbb337f 100644
--- a/include/z64item.h
+++ b/include/z64item.h
@@ -19,7 +19,7 @@ typedef enum {
/* 2 */ EQUIP_VALUE_SWORD_RAZOR,
/* 3 */ EQUIP_VALUE_SWORD_GILDED,
/* 4 */ EQUIP_VALUE_SWORD_DIETY,
- /* 5 */ EQUIP_VALUE_SWORD_MAX,
+ /* 5 */ EQUIP_VALUE_SWORD_MAX
} EquipValueSword;
typedef enum {
@@ -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..a86cf9a20 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))
@@ -148,4 +168,75 @@ typedef struct {
#define SQXYZ(vec) ((vec.x) * (vec.x) + (vec.y) * (vec.y) + (vec.z) * (vec.z))
#define DOTXYZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.y) * (vec2.y) + (vec1.z) * (vec2.z))
+f32 Math_CosS(s16 angle);
+f32 Math_SinS(s16 angle);
+s32 Math_StepToIImpl(s32 start, s32 target, s32 step);
+void Math_StepToIGet(s32* pValue, s32 target, s32 step);
+s32 Math_StepToI(s32* pValue, s32 target, s32 step);
+s32 Math_ScaledStepToS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToC(s8* pValue, s8 target, s8 step);
+s32 Math_StepToF(f32* pValue, f32 target, f32 step);
+s32 Math_StepUntilAngleS(s16* pValue, s16 target, s16 step);
+s32 Math_StepToAngleS(s16* pValue, s16 target, s16 step);
+s32 Math_AsymStepToS(s16* pValue, s16 target, s16 incrStep, s16 decrStep);
+s32 Math_StepUntilF(f32* pValue, f32 limit, f32 step);
+s32 Math_AsymStepToF(f32* pValue, f32 target, f32 incrStep, f32 decrStep);
+s16 Rand_S16Offset(s16 base, s16 range);
+s16 Rand_S16OffsetStride(s16 base, s16 stride, s16 range);
+void Math_Vec3f_Copy(Vec3f* dest, Vec3f* src);
+void Math_Vec3s_Copy(Vec3s* dest, Vec3s* src);
+void Math_Vec3s_ToVec3f(Vec3f* dest, Vec3s* src);
+void Math_Vec3f_ToVec3s(Vec3s* dest, Vec3f* src);
+void Math_Vec3f_Sum(Vec3f* l, Vec3f* r, Vec3f* dest);
+void Math_Vec3f_Diff(Vec3f* l, Vec3f* r, Vec3f* dest);
+void Math_Vec3s_DiffToVec3f(Vec3f* dest, Vec3s* l, Vec3s* r);
+void Math_Vec3f_Scale(Vec3f* vec, f32 scale);
+void Math_Vec3f_ScaleAndStore(Vec3f* vec, f32 scale, Vec3f* dest);
+void Math_Vec3f_Lerp(Vec3f* a, Vec3f* b, f32 t, Vec3f* dest);
+void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
+void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest);
+void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest);
+f32 Math_Vec3f_DistXYZ(Vec3f* a, Vec3f* b);
+f32 Math_Vec3f_DistXYZAndStoreDiff(Vec3f* a, Vec3f* b, Vec3f* dest);
+f32 Math_Vec3f_DistXZ(Vec3f* a, Vec3f* b);
+f32 Math_Vec3f_DistXZAndStore(Vec3f* a, Vec3f* b, f32* dx, f32* dz);
+f32 Math_Vec3f_StepToXZ(Vec3f* start, Vec3f* target, f32 speed);
+f32 Math_Vec3f_DiffY(Vec3f* a, Vec3f* b);
+s16 Math_Vec3f_Yaw(Vec3f* a, Vec3f* b);
+s16 Math_Vec3f_Pitch(Vec3f* a, Vec3f* b);
+f32 Math_SmoothStepToF(f32* pValue, f32 target, f32 fraction, f32 step, f32 minStep);
+void Math_ApproachF(f32* pValue, f32 target, f32 scale, f32 maxStep);
+void Math_ApproachZeroF(f32* pValue, f32 scale, f32 maxStep);
+s16 Math_SmoothStepToS(s16* pValue, s16 target, s16 scale, s16 step, s16 minStep);
+void Math_ApproachS(s16* pValue, s16 target, s16 scale, s16 maxStep);
+f32 Math_Vec3f_StepTo(Vec3f* start, Vec3f* target, f32 speed);
+
+f32 Math_FactorialF(f32 n);
+f32 Math_Factorial(s32 n);
+f32 Math_PowF(f32 base, s32 exp);
+f32 Math_SinF(f32 rad);
+f32 Math_CosF(f32 rad);
+f32 Rand_ZeroFloat(f32 scale);
+f32 Rand_CenteredFloat(f32 scale);
+
+f32 Math_FTanF(f32 x);
+f32 Math_FFloorF(f32 x);
+f32 Math_FCeilF(f32 x);
+f32 Math_FRoundF(f32 x);
+f32 Math_FTruncF(f32 x);
+f32 Math_FNearbyIntF(f32 x);
+f32 Math_FAtanTaylorQF(f32 x);
+f32 Math_FAtanTaylorF(f32 x);
+f32 Math_FAtanContFracF(f32 x);
+f32 Math_FAtanF(f32 x);
+f32 Math_FAtan2F(f32 y, f32 x);
+f32 Math_FAsinF(f32 x);
+f32 Math_FAcosF(f32 x);
+
+s16 Math_Atan2S(f32 y, f32 x);
+f32 Math_Atan2F(f32 y, f32 x);
+s16 Math_Atan2S_XY(f32 x, f32 y);
+f32 Math_Atan2F_XY(f32 x, f32 y);
+
#endif
diff --git a/include/z64message.h b/include/z64message.h
index 2b0387045..09c9c4e04 100644
--- a/include/z64message.h
+++ b/include/z64message.h
@@ -9,6 +9,9 @@ struct Actor;
struct MessageTableEntry;
struct OcarinaStaff;
+extern u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX];
+extern u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX];
+
typedef enum TextState {
/* 0 */ TEXT_STATE_NONE,
/* 1 */ TEXT_STATE_1,
@@ -159,8 +162,8 @@ typedef struct MessageContext {
/* 0x120A0 */ s32 unk120A0;
/* 0x120A4 */ s16 unk120A4[6];
/* 0x120B0 */ u8 unk120B0;
- /* 0x120B1 */ u8 unk120B1;
- /* 0x120B2 */ u8 unk120B2[0xA];
+ /* 0x120B1 */ u8 bombersNotebookEventQueueCount;
+ /* 0x120B2 */ u8 bombersNotebookEventQueue[10];
/* 0x120BC */ u16 unk_120BC;
/* 0x120BE */ s16 unk120BE;
/* 0x120C0 */ s16 unk120C0;
diff --git a/include/z64player.h b/include/z64player.h
index 54894893f..f10984216 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 1f59fea01..312b18b2e 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -10,6 +10,13 @@ struct GameState;
struct PlayState;
struct FileSelectState;
+typedef enum {
+ /* 0 */ SAVE_AUDIO_STEREO,
+ /* 1 */ SAVE_AUDIO_MONO,
+ /* 2 */ SAVE_AUDIO_HEADSET,
+ /* 3 */ SAVE_AUDIO_SURROUND
+} AudioOption;
+
// TODO: properly name DOWN, RETURN and TOP
typedef enum RespawnMode {
/* 0 */ RESPAWN_MODE_DOWN, // "RESTART_MODE_DOWN"
@@ -80,7 +87,7 @@ typedef enum {
/* 5 */ TIMER_ID_ENV_HAZARD, // environmental hazard timer (underwater or hot room)
/* 6 */ TIMER_ID_GORON_RACE_UNUSED,
/* 7 */ TIMER_ID_MAX,
- /* 99 */ TIMER_ID_NONE = 99,
+ /* 99 */ TIMER_ID_NONE = 99
} TimerId;
typedef enum {
@@ -157,13 +164,13 @@ typedef enum {
#define PICTO_PHOTO_COMPRESSED_SIZE (PICTO_PHOTO_SIZE * 5 / 8)
typedef struct SramContext {
- /* 0x00 */ u8* readBuff;
- /* 0x04 */ u8 *saveBuf;
+ /* 0x00 */ u8* noFlashSaveBuf; // Never allocated memory
+ /* 0x04 */ u8* saveBuf;
/* 0x08 */ char unk_08[4];
/* 0x0C */ s16 status;
/* 0x10 */ u32 curPage;
/* 0x14 */ u32 numPages;
- /* 0x18 */ OSTime unk_18;
+ /* 0x18 */ OSTime startWriteOsTime;
/* 0x20 */ s16 unk_20;
/* 0x22 */ s16 unk_22;
/* 0x24 */ s16 unk_24;
@@ -226,14 +233,14 @@ typedef struct CycleSceneFlags {
typedef struct SaveOptions {
/* 0x0 */ u16 optionId; // "option_id"
/* 0x2 */ u8 language; // "j_n"
- /* 0x3 */ s8 audioSetting; // "s_sound"
+ /* 0x3 */ u8 audioSetting; // "s_sound"
/* 0x4 */ u8 languageSetting; // "language"
/* 0x5 */ u8 zTargetSetting; // "z_attention", 0: Switch; 1: Hold
} SaveOptions; // size = 0x6
typedef struct SavePlayerData {
/* 0x00 */ char newf[6]; // "newf" Will always be "ZELDA3 for a valid save
- /* 0x06 */ u16 deaths; // "savect"
+ /* 0x06 */ u16 threeDayResetCount; // "savect"
/* 0x08 */ char playerName[8]; // "player_name"
/* 0x10 */ s16 healthCapacity; // "max_life"
/* 0x12 */ s16 health; // "now_life"
@@ -337,11 +344,11 @@ typedef struct SaveContext {
/* 0x3DB4 */ f32 entranceSpeed; // "player_wipe_speedF"
/* 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"
+ /* 0x3DBB */ u8 retainWeatherMode; // "next_walk"
+ /* 0x3DBC */ s16 dogParams; // OoT leftover. "dog_flag"
/* 0x3DBE */ u8 envHazardTextTriggerFlags; // "guide_status"
/* 0x3DBF */ u8 showTitleCard; // "name_display"
- /* 0x3DC0 */ s16 unk_3DC0; // "shield_magic_timer"
+ /* 0x3DC0 */ s16 nayrusLoveTimer; // remnant of OoT, "shield_magic_timer"
/* 0x3DC2 */ u8 unk_3DC2; // "pad1"
/* 0x3DC8 */ OSTime postmanTimerStopOsTime; // The osTime when the timer stops for the postman minigame. "get_time"
/* 0x3DD0 */ u8 timerStates[TIMER_ID_MAX]; // See the `TimerState` enum. "event_fg"
@@ -374,13 +381,13 @@ typedef struct SaveContext {
/* 0x3F3A */ u16 minigameScore; // "yabusame_total"
/* 0x3F3C */ u16 minigameHiddenScore; // "yabusame_out_ct"
/* 0x3F3E */ u8 unk_3F3E; // "no_save"
- /* 0x3F3F */ u8 unk_3F3F; // "flash_flag"
+ /* 0x3F3F */ u8 flashSaveAvailable; // "flash_flag"
/* 0x3F40 */ SaveOptions options;
- /* 0x3F46 */ u16 unk_3F46; // "NottoriBgm"
+ /* 0x3F46 */ u16 forcedSeqId; // "NottoriBgm"
/* 0x3F48 */ u8 cutsceneTransitionControl; // "fade_go"
/* 0x3F4A */ u16 nextCutsceneIndex; // "next_daytime"
/* 0x3F4C */ u8 cutsceneTrigger; // "doukidemo"
- /* 0x3F4D */ u8 unk_3F4D; // "Kenjya_no"
+ /* 0x3F4D */ u8 chamberCutsceneNum; // remnant of OoT "Kenjya_no"
/* 0x3F4E */ u16 nextDayTime; // "next_zelda_time"
/* 0x3F50 */ u8 transFadeDuration; // "fade_speed"
/* 0x3F51 */ u8 transWipeSpeed; // "wipe_speed" transition related
@@ -594,7 +601,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)
@@ -695,7 +702,9 @@ typedef enum {
#define WEEKEVENTREG_18_10 PACK_WEEKEVENTREG_FLAG(18, 0x10)
#define WEEKEVENTREG_18_20 PACK_WEEKEVENTREG_FLAG(18, 0x20)
#define WEEKEVENTREG_18_40 PACK_WEEKEVENTREG_FLAG(18, 0x40)
-#define WEEKEVENTREG_18_80 PACK_WEEKEVENTREG_FLAG(18, 0x80)
+
+// Player has Powder Keg purchasing privileges.
+#define WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES PACK_WEEKEVENTREG_FLAG(18, 0x80)
#define WEEKEVENTREG_19_01 PACK_WEEKEVENTREG_FLAG(19, 0x01)
#define WEEKEVENTREG_19_02 PACK_WEEKEVENTREG_FLAG(19, 0x02)
#define WEEKEVENTREG_19_04 PACK_WEEKEVENTREG_FLAG(19, 0x04)
@@ -717,19 +726,26 @@ typedef enum {
#define WEEKEVENTREG_20_80 PACK_WEEKEVENTREG_FLAG(20, 0x80)
#define WEEKEVENTREG_21_01 PACK_WEEKEVENTREG_FLAG(21, 0x01)
#define WEEKEVENTREG_21_02 PACK_WEEKEVENTREG_FLAG(21, 0x02)
-#define WEEKEVENTREG_21_04 PACK_WEEKEVENTREG_FLAG(21, 0x04)
-#define WEEKEVENTREG_21_08 PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
+// Player has spoken to Goron Graveyard's gravemaker while in Goron form.
+#define WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON PACK_WEEKEVENTREG_FLAG(21, 0x04)
+// Player has spoken to formerly frozen Goron outside Goron Graveyard.
+#define WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON PACK_WEEKEVENTREG_FLAG(21, 0x08)
+
#define WEEKEVENTREG_21_10 PACK_WEEKEVENTREG_FLAG(21, 0x10)
-#define WEEKEVENTREG_21_20 PACK_WEEKEVENTREG_FLAG(21, 0x20)
+#define WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM PACK_WEEKEVENTREG_FLAG(21, 0x20)
#define WEEKEVENTREG_21_40 PACK_WEEKEVENTREG_FLAG(21, 0x40)
#define WEEKEVENTREG_21_80 PACK_WEEKEVENTREG_FLAG(21, 0x80)
// Aliens defeated
// "Winning" the alien invasion
-#define WEEKEVENTREG_22_01 PACK_WEEKEVENTREG_FLAG(22, 0x01)
+#define WEEKEVENTREG_DEFENDED_AGAINST_THEM PACK_WEEKEVENTREG_FLAG(22, 0x01)
#define WEEKEVENTREG_22_02 PACK_WEEKEVENTREG_FLAG(22, 0x02)
-#define WEEKEVENTREG_22_04 PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
+// Goron Elder's son has been calmed from Goron's Lullaby.
+#define WEEKEVENTREG_CALMED_GORON_ELDERS_SON PACK_WEEKEVENTREG_FLAG(22, 0x04)
+
#define WEEKEVENTREG_22_08 PACK_WEEKEVENTREG_FLAG(22, 0x08)
#define WEEKEVENTREG_22_10 PACK_WEEKEVENTREG_FLAG(22, 0x10)
#define WEEKEVENTREG_22_20 PACK_WEEKEVENTREG_FLAG(22, 0x20)
@@ -779,11 +795,11 @@ typedef enum {
#define WEEKEVENTREG_26_40 PACK_WEEKEVENTREG_FLAG(26, 0x40)
#define WEEKEVENTREG_26_80 PACK_WEEKEVENTREG_FLAG(26, 0x80)
#define WEEKEVENTREG_27_01 PACK_WEEKEVENTREG_FLAG(27, 0x01)
-#define WEEKEVENTREG_27_02 PACK_WEEKEVENTREG_FLAG(27, 0x02)
-#define WEEKEVENTREG_27_04 PACK_WEEKEVENTREG_FLAG(27, 0x04)
-#define WEEKEVENTREG_27_08 PACK_WEEKEVENTREG_FLAG(27, 0x08)
-#define WEEKEVENTREG_27_10 PACK_WEEKEVENTREG_FLAG(27, 0x10)
-#define WEEKEVENTREG_27_20 PACK_WEEKEVENTREG_FLAG(27, 0x20)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x02)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x04)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x08)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x10)
+#define WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN PACK_WEEKEVENTREG_FLAG(27, 0x20)
#define WEEKEVENTREG_27_40 PACK_WEEKEVENTREG_FLAG(27, 0x40)
#define WEEKEVENTREG_27_80 PACK_WEEKEVENTREG_FLAG(27, 0x80)
#define WEEKEVENTREG_28_01 PACK_WEEKEVENTREG_FLAG(28, 0x01)
@@ -857,7 +873,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)
@@ -924,62 +940,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)
@@ -991,32 +956,29 @@ typedef enum {
#define WEEKEVENTREG_50_01 PACK_WEEKEVENTREG_FLAG(50, 0x01)
#define WEEKEVENTREG_50_02 PACK_WEEKEVENTREG_FLAG(50, 0x02)
#define WEEKEVENTREG_50_04 PACK_WEEKEVENTREG_FLAG(50, 0x04)
-#define WEEKEVENTREG_50_08 PACK_WEEKEVENTREG_FLAG(50, 0x08)
+#define WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(50, 0x08)
#define WEEKEVENTREG_50_10 PACK_WEEKEVENTREG_FLAG(50, 0x10)
-#define WEEKEVENTREG_50_20 PACK_WEEKEVENTREG_FLAG(50, 0x20)
+#define WEEKEVENTREG_HAD_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(50, 0x20)
#define WEEKEVENTREG_50_40 PACK_WEEKEVENTREG_FLAG(50, 0x40)
-#define WEEKEVENTREG_50_80 PACK_WEEKEVENTREG_FLAG(50, 0x80)
-#define WEEKEVENTREG_51_01 PACK_WEEKEVENTREG_FLAG(51, 0x01)
+#define WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(50, 0x80)
+#define WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(51, 0x01)
#define WEEKEVENTREG_51_02 PACK_WEEKEVENTREG_FLAG(51, 0x02)
#define WEEKEVENTREG_51_04 PACK_WEEKEVENTREG_FLAG(51, 0x04)
#define WEEKEVENTREG_51_08 PACK_WEEKEVENTREG_FLAG(51, 0x08)
#define WEEKEVENTREG_51_10 PACK_WEEKEVENTREG_FLAG(51, 0x10)
-#define WEEKEVENTREG_51_20 PACK_WEEKEVENTREG_FLAG(51, 0x20)
+#define WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT PACK_WEEKEVENTREG_FLAG(51, 0x20)
#define WEEKEVENTREG_51_40 PACK_WEEKEVENTREG_FLAG(51, 0x40)
#define WEEKEVENTREG_51_80 PACK_WEEKEVENTREG_FLAG(51, 0x80)
// ProtectedCremia
-#define WEEKEVENTREG_52_01 PACK_WEEKEVENTREG_FLAG(52, 0x01)
+#define WEEKEVENTREG_ESCORTED_CREMIA PACK_WEEKEVENTREG_FLAG(52, 0x01)
// Lose Milk Run minigame
#define WEEKEVENTREG_52_02 PACK_WEEKEVENTREG_FLAG(52, 0x02)
#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)
@@ -1130,70 +1092,74 @@ 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)
-#define WEEKEVENTREG_66_01 PACK_WEEKEVENTREG_FLAG(66, 0x01)
-#define WEEKEVENTREG_66_02 PACK_WEEKEVENTREG_FLAG(66, 0x02)
-#define WEEKEVENTREG_66_04 PACK_WEEKEVENTREG_FLAG(66, 0x04)
-#define WEEKEVENTREG_66_08 PACK_WEEKEVENTREG_FLAG(66, 0x08)
-#define WEEKEVENTREG_66_10 PACK_WEEKEVENTREG_FLAG(66, 0x10)
-#define WEEKEVENTREG_66_20 PACK_WEEKEVENTREG_FLAG(66, 0x20)
-#define WEEKEVENTREG_66_40 PACK_WEEKEVENTREG_FLAG(66, 0x40)
-#define WEEKEVENTREG_66_80 PACK_WEEKEVENTREG_FLAG(66, 0x80)
-#define WEEKEVENTREG_67_01 PACK_WEEKEVENTREG_FLAG(67, 0x01)
-#define WEEKEVENTREG_67_02 PACK_WEEKEVENTREG_FLAG(67, 0x02)
-#define WEEKEVENTREG_67_04 PACK_WEEKEVENTREG_FLAG(67, 0x04)
-#define WEEKEVENTREG_67_08 PACK_WEEKEVENTREG_FLAG(67, 0x08)
-#define WEEKEVENTREG_67_10 PACK_WEEKEVENTREG_FLAG(67, 0x10)
-#define WEEKEVENTREG_67_20 PACK_WEEKEVENTREG_FLAG(67, 0x20)
-#define WEEKEVENTREG_67_40 PACK_WEEKEVENTREG_FLAG(67, 0x40)
-#define WEEKEVENTREG_67_80 PACK_WEEKEVENTREG_FLAG(67, 0x80)
-#define WEEKEVENTREG_68_01 PACK_WEEKEVENTREG_FLAG(68, 0x01)
-#define WEEKEVENTREG_68_02 PACK_WEEKEVENTREG_FLAG(68, 0x02)
-#define WEEKEVENTREG_68_04 PACK_WEEKEVENTREG_FLAG(68, 0x04)
-#define WEEKEVENTREG_68_08 PACK_WEEKEVENTREG_FLAG(68, 0x08)
-#define WEEKEVENTREG_68_10 PACK_WEEKEVENTREG_FLAG(68, 0x10)
-#define WEEKEVENTREG_68_20 PACK_WEEKEVENTREG_FLAG(68, 0x20)
-#define WEEKEVENTREG_68_40 PACK_WEEKEVENTREG_FLAG(68, 0x40)
-#define WEEKEVENTREG_68_80 PACK_WEEKEVENTREG_FLAG(68, 0x80)
-#define WEEKEVENTREG_69_01 PACK_WEEKEVENTREG_FLAG(69, 0x01)
-#define WEEKEVENTREG_69_02 PACK_WEEKEVENTREG_FLAG(69, 0x02)
-#define WEEKEVENTREG_69_04 PACK_WEEKEVENTREG_FLAG(69, 0x04)
-#define WEEKEVENTREG_69_08 PACK_WEEKEVENTREG_FLAG(69, 0x08)
-#define WEEKEVENTREG_69_10 PACK_WEEKEVENTREG_FLAG(69, 0x10)
-#define WEEKEVENTREG_69_20 PACK_WEEKEVENTREG_FLAG(69, 0x20)
-#define WEEKEVENTREG_69_40 PACK_WEEKEVENTREG_FLAG(69, 0x40)
-#define WEEKEVENTREG_69_80 PACK_WEEKEVENTREG_FLAG(69, 0x80)
-#define WEEKEVENTREG_70_01 PACK_WEEKEVENTREG_FLAG(70, 0x01)
-#define WEEKEVENTREG_70_02 PACK_WEEKEVENTREG_FLAG(70, 0x02)
-#define WEEKEVENTREG_70_04 PACK_WEEKEVENTREG_FLAG(70, 0x04)
-#define WEEKEVENTREG_70_08 PACK_WEEKEVENTREG_FLAG(70, 0x08)
-#define WEEKEVENTREG_70_10 PACK_WEEKEVENTREG_FLAG(70, 0x10)
-#define WEEKEVENTREG_70_20 PACK_WEEKEVENTREG_FLAG(70, 0x20)
-#define WEEKEVENTREG_70_40 PACK_WEEKEVENTREG_FLAG(70, 0x40)
-#define WEEKEVENTREG_70_80 PACK_WEEKEVENTREG_FLAG(70, 0x80)
-#define WEEKEVENTREG_71_01 PACK_WEEKEVENTREG_FLAG(71, 0x01)
-#define WEEKEVENTREG_71_02 PACK_WEEKEVENTREG_FLAG(71, 0x02)
-#define WEEKEVENTREG_71_04 PACK_WEEKEVENTREG_FLAG(71, 0x04)
-#define WEEKEVENTREG_71_08 PACK_WEEKEVENTREG_FLAG(71, 0x08)
-#define WEEKEVENTREG_71_10 PACK_WEEKEVENTREG_FLAG(71, 0x10)
-#define WEEKEVENTREG_71_20 PACK_WEEKEVENTREG_FLAG(71, 0x20)
-#define WEEKEVENTREG_71_40 PACK_WEEKEVENTREG_FLAG(71, 0x40)
-#define WEEKEVENTREG_71_80 PACK_WEEKEVENTREG_FLAG(71, 0x80)
-#define WEEKEVENTREG_72_01 PACK_WEEKEVENTREG_FLAG(72, 0x01)
-#define WEEKEVENTREG_72_02 PACK_WEEKEVENTREG_FLAG(72, 0x02)
-#define WEEKEVENTREG_72_04 PACK_WEEKEVENTREG_FLAG(72, 0x04)
-#define WEEKEVENTREG_72_08 PACK_WEEKEVENTREG_FLAG(72, 0x08)
-#define WEEKEVENTREG_72_10 PACK_WEEKEVENTREG_FLAG(72, 0x10)
-#define WEEKEVENTREG_72_20 PACK_WEEKEVENTREG_FLAG(72, 0x20)
-#define WEEKEVENTREG_72_40 PACK_WEEKEVENTREG_FLAG(72, 0x40)
+
+/* Bombers' Notebook Events */
+
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU PACK_WEEKEVENTREG_FLAG(66, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI PACK_WEEKEVENTREG_FLAG(66, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN PACK_WEEKEVENTREG_FLAG(66, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY PACK_WEEKEVENTREG_FLAG(66, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI PACK_WEEKEVENTREG_FLAG(66, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA PACK_WEEKEVENTREG_FLAG(66, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR PACK_WEEKEVENTREG_FLAG(66, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA PACK_WEEKEVENTREG_FLAG(66, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO PACK_WEEKEVENTREG_FLAG(67, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN PACK_WEEKEVENTREG_FLAG(67, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN PACK_WEEKEVENTREG_FLAG(67, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS PACK_WEEKEVENTREG_FLAG(67, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND PACK_WEEKEVENTREG_FLAG(67, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER PACK_WEEKEVENTREG_FLAG(67, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO PACK_WEEKEVENTREG_FLAG(67, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG PACK_WEEKEVENTREG_FLAG(67, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS PACK_WEEKEVENTREG_FLAG(68, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO PACK_WEEKEVENTREG_FLAG(68, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU PACK_WEEKEVENTREG_FLAG(68, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS PACK_WEEKEVENTREG_FLAG(68, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY PACK_WEEKEVENTREG_FLAG(68, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING PACK_WEEKEVENTREG_FLAG(68, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI PACK_WEEKEVENTREG_FLAG(68, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI PACK_WEEKEVENTREG_FLAG(68, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI PACK_WEEKEVENTREG_FLAG(69, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(69, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES PACK_WEEKEVENTREG_FLAG(69, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT PACK_WEEKEVENTREG_FLAG(69, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM PACK_WEEKEVENTREG_FLAG(69, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM PACK_WEEKEVENTREG_FLAG(69, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE PACK_WEEKEVENTREG_FLAG(69, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA PACK_WEEKEVENTREG_FLAG(69, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK PACK_WEEKEVENTREG_FLAG(70, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK PACK_WEEKEVENTREG_FLAG(70, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(70, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(70, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE PACK_WEEKEVENTREG_FLAG(70, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK PACK_WEEKEVENTREG_FLAG(70, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP PACK_WEEKEVENTREG_FLAG(70, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP PACK_WEEKEVENTREG_FLAG(70, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP PACK_WEEKEVENTREG_FLAG(71, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP PACK_WEEKEVENTREG_FLAG(71, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP PACK_WEEKEVENTREG_FLAG(71, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP PACK_WEEKEVENTREG_FLAG(71, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK PACK_WEEKEVENTREG_FLAG(71, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK PACK_WEEKEVENTREG_FLAG(71, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD PACK_WEEKEVENTREG_FLAG(71, 0x40)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK PACK_WEEKEVENTREG_FLAG(71, 0x80)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK PACK_WEEKEVENTREG_FLAG(72, 0x01)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT PACK_WEEKEVENTREG_FLAG(72, 0x02)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK PACK_WEEKEVENTREG_FLAG(72, 0x04)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK PACK_WEEKEVENTREG_FLAG(72, 0x08)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK PACK_WEEKEVENTREG_FLAG(72, 0x10)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK PACK_WEEKEVENTREG_FLAG(72, 0x20)
+#define WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK PACK_WEEKEVENTREG_FLAG(72, 0x40)
+
#define WEEKEVENTREG_72_80 PACK_WEEKEVENTREG_FLAG(72, 0x80)
#define WEEKEVENTREG_73_01 PACK_WEEKEVENTREG_FLAG(73, 0x01)
#define WEEKEVENTREG_73_02 PACK_WEEKEVENTREG_FLAG(73, 0x02)
@@ -1218,7 +1184,7 @@ typedef enum {
#define WEEKEVENTREG_75_02 PACK_WEEKEVENTREG_FLAG(75, 0x02)
#define WEEKEVENTREG_75_04 PACK_WEEKEVENTREG_FLAG(75, 0x04)
#define WEEKEVENTREG_75_08 PACK_WEEKEVENTREG_FLAG(75, 0x08)
-#define WEEKEVENTREG_75_10 PACK_WEEKEVENTREG_FLAG(75, 0x10)
+#define WEEKEVENTREG_RECEIVED_ROOM_KEY PACK_WEEKEVENTREG_FLAG(75, 0x10)
#define WEEKEVENTREG_75_20 PACK_WEEKEVENTREG_FLAG(75, 0x20)
#define WEEKEVENTREG_75_40 PACK_WEEKEVENTREG_FLAG(75, 0x40)
#define WEEKEVENTREG_75_80 PACK_WEEKEVENTREG_FLAG(75, 0x80)
@@ -1264,7 +1230,7 @@ typedef enum {
// Aveil has spotted Player
#define WEEKEVENTREG_80_08 PACK_WEEKEVENTREG_FLAG(80, 0x08)
-#define WEEKEVENTREG_80_10 PACK_WEEKEVENTREG_FLAG(80, 0x10)
+#define WEEKEVENTREG_RECEIVED_PRIORITY_MAIL PACK_WEEKEVENTREG_FLAG(80, 0x10)
#define WEEKEVENTREG_80_20 PACK_WEEKEVENTREG_FLAG(80, 0x20)
#define WEEKEVENTREG_80_40 PACK_WEEKEVENTREG_FLAG(80, 0x40)
#define WEEKEVENTREG_80_80 PACK_WEEKEVENTREG_FLAG(80, 0x80)
@@ -1347,11 +1313,17 @@ typedef enum {
#define WEEKEVENTREG_88_08 PACK_WEEKEVENTREG_FLAG(88, 0x08)
#define WEEKEVENTREG_88_10 PACK_WEEKEVENTREG_FLAG(88, 0x10)
#define WEEKEVENTREG_88_20 PACK_WEEKEVENTREG_FLAG(88, 0x20)
-#define WEEKEVENTREG_88_40 PACK_WEEKEVENTREG_FLAG(88, 0x40)
-#define WEEKEVENTREG_88_80 PACK_WEEKEVENTREG_FLAG(88, 0x80)
-#define WEEKEVENTREG_89_01 PACK_WEEKEVENTREG_FLAG(89, 0x01)
-#define WEEKEVENTREG_89_02 PACK_WEEKEVENTREG_FLAG(89, 0x02)
-#define WEEKEVENTREG_89_04 PACK_WEEKEVENTREG_FLAG(89, 0x04)
+
+// Goron shrine Gatekeeper has opened shrine.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE PACK_WEEKEVENTREG_FLAG(88, 0x40)
+// Goron shrine Gatekeeper has opened shrine for player in Human form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN PACK_WEEKEVENTREG_FLAG(88, 0x80)
+// Goron shrine Gatekeeper has opened shrine for player in Deku form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU PACK_WEEKEVENTREG_FLAG(89, 0x01)
+// Goron shrine Gatekeeper has opened shrine for player in Zora form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA PACK_WEEKEVENTREG_FLAG(89, 0x02)
+// Goron shrine Gatekeeper has opened shrine for player in Goron form.
+#define WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON PACK_WEEKEVENTREG_FLAG(89, 0x04)
// Unconfirmed: "Postman has delivered priority mail"
#define WEEKEVENTREG_89_08 PACK_WEEKEVENTREG_FLAG(89, 0x08)
@@ -1385,10 +1357,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)
@@ -1460,34 +1430,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
@@ -1561,12 +1549,31 @@ 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,
/* 1 */ DUNGEON_INDEX_SNOWHEAD_TEMPLE,
/* 2 */ DUNGEON_INDEX_GREAT_BAY_TEMPLE,
- /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE, // Also applies to Inverted Stone Tower Temple
+ /* 3 */ DUNGEON_INDEX_STONE_TOWER_TEMPLE // Also applies to Inverted Stone Tower Temple
} DungeonIndex;
void Sram_ActivateOwl(u8 owlId);
@@ -1579,28 +1586,28 @@ void Sram_InitDebugSave(void);
void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx);
void Sram_OpenSave(struct FileSelectState* fileSelect, SramContext* sramCtx);
void func_8014546C(SramContext* sramCtx);
-void func_801457CC(struct FileSelectState* fileSelect, SramContext* sramCtx);
-void func_80146580(struct FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum);
-void func_80146628(struct FileSelectState* fileSelect2, SramContext* sramCtx);
+void func_801457CC(struct GameState* gameState, SramContext* sramCtx);
+void Sram_EraseSave(struct FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum);
+void Sram_CopySave(struct FileSelectState* fileSelect2, SramContext* sramCtx);
void Sram_InitSave(struct FileSelectState* fileSelect2, SramContext* sramCtx);
-void func_80146DF8(SramContext* sramCtx);
+void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx);
void Sram_InitSram(struct GameState* gameState, SramContext* sramCtx);
void Sram_Alloc(struct GameState* gameState, SramContext* sramCtx);
void Sram_SaveSpecialEnterClockTown(struct PlayState* play);
void Sram_SaveSpecialNewDay(struct PlayState* play);
-void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages);
-void func_80147020(SramContext* sramCtx);
-void func_80147068(SramContext* sramCtx);
-void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages);
-void func_80147150(SramContext* sramCtx);
-void func_80147198(SramContext* sramCtx);
+void Sram_SetFlashPagesDefault(SramContext* sramCtx, u32 curPage, u32 numPages);
+void Sram_StartWriteToFlashDefault(SramContext* sramCtx);
+void Sram_UpdateWriteToFlashDefault(SramContext* sramCtx);
+void Sram_SetFlashPagesOwlSave(SramContext* sramCtx, s32 curPage, s32 numPages);
+void Sram_StartWriteToFlashOwlSave(SramContext* sramCtx);
+void Sram_UpdateWriteToFlashOwlSave(SramContext* sramCtx);
-extern s32 D_801C6798[];
+extern u32 gSramSlotOffsets[];
extern u8 gAmmoItems[];
-extern s32 D_801C67C8[];
-extern s32 D_801C67F0[];
-extern s32 D_801C6818[];
-extern s32 D_801C6840[];
-extern s32 D_801C6850[];
+extern s32 gFlashSaveStartPages[];
+extern s32 gFlashSaveNumPages[];
+extern s32 gFlashSpecialSaveNumPages[];
+extern s32 gFlashOwlSaveStartPages[];
+extern s32 gFlashOwlSaveNumPages[];
#endif
diff --git a/include/z64scene.h b/include/z64scene.h
index c31b7ce58..5505f08e3 100644
--- a/include/z64scene.h
+++ b/include/z64scene.h
@@ -130,8 +130,8 @@ typedef struct {
/* 0x1 */ u8 data1;
/* 0x2 */ UNK_TYPE1 pad2[2];
/* 0x4 */ u8 skyboxId;
- /* 0x5 */ u8 unk5;
- /* 0x6 */ u8 unk6;
+ /* 0x5 */ u8 skyboxConfig;
+ /* 0x6 */ u8 envLightMode;
} SCmdSkyboxSettings; // size = 0x7
typedef struct {
@@ -469,10 +469,13 @@ typedef struct {
/* 0x00C */ ObjectStatus status[OBJECT_EXCHANGE_BANK_MAX];
} ObjectContext; // size = 0x958
+#define PATH_INDEX_NONE -1
+#define ADDITIONAL_PATH_INDEX_NONE (u8)-1
+
typedef struct {
- /* 0x0 */ u8 count; // number of points in the path
- /* 0x1 */ u8 unk1;
- /* 0x2 */ s16 unk2;
+ /* 0x0 */ u8 count; // Number of points in the path
+ /* 0x1 */ u8 additionalPathIndex;
+ /* 0x2 */ s16 customValue; // Path specific to help distinguish different paths
/* 0x4 */ Vec3s* points; // Segment Address to the array of points
} Path; // size = 0x8
@@ -584,123 +587,17 @@ typedef enum {
/* 6 */ TINGLE_MAP_MAX
} TingleMapId;
-typedef enum {
- /* 0x00 */ SCENE_20SICHITAI2, // Southern Swamp (Clear)
- /* 0x01 */ SCENE_UNSET_1,
- /* 0x02 */ SCENE_UNSET_2,
- /* 0x03 */ SCENE_UNSET_3,
- /* 0x04 */ SCENE_UNSET_4,
- /* 0x05 */ SCENE_UNSET_5,
- /* 0x06 */ SCENE_UNSET_6,
- /* 0x07 */ SCENE_KAKUSIANA, // Lone Peak Shrine & Grottos
- /* 0x08 */ SCENE_SPOT00, // Cutscene Scene
- /* 0x09 */ SCENE_UNSET_9,
- /* 0x0A */ SCENE_WITCH_SHOP, // Magic Hags' Potion Shop
- /* 0x0B */ SCENE_LAST_BS, // Majora's Lair
- /* 0x0C */ SCENE_HAKASHITA, // Beneath the Graveyard
- /* 0x0D */ SCENE_AYASHIISHOP, // Curiosity Shop
- /* 0x0E */ SCENE_UNSET_E,
- /* 0x0F */ SCENE_UNSET_F,
- /* 0x10 */ SCENE_OMOYA, // Mama's House (Ranch House in PAL) & Barn
- /* 0x11 */ SCENE_BOWLING, // Honey & Darling's Shop
- /* 0x12 */ SCENE_SONCHONOIE, // The Mayor's Residence
- /* 0x13 */ SCENE_IKANA, // Ikana Canyon
- /* 0x14 */ SCENE_KAIZOKU, // Pirates' Fortress
- /* 0x15 */ SCENE_MILK_BAR, // Milk Bar
- /* 0x16 */ SCENE_INISIE_N, // Stone Tower Temple
- /* 0x17 */ SCENE_TAKARAYA, // Treasure Chest Shop
- /* 0x18 */ SCENE_INISIE_R, // Inverted Stone Tower Temple
- /* 0x19 */ SCENE_OKUJOU, // Clock Tower Rooftop
- /* 0x1A */ SCENE_OPENINGDAN, // Before Clock Town
- /* 0x1B */ SCENE_MITURIN, // Woodfall Temple
- /* 0x1C */ SCENE_13HUBUKINOMITI, // Path to Mountain Village
- /* 0x1D */ SCENE_CASTLE, // Ancient Castle of Ikana
- /* 0x1E */ SCENE_DEKUTES, // Deku Scrub Playground
- /* 0x1F */ SCENE_MITURIN_BS, // Odolwa's Lair
- /* 0x20 */ SCENE_SYATEKI_MIZU, // Town Shooting Gallery
- /* 0x21 */ SCENE_HAKUGIN, // Snowhead Temple
- /* 0x22 */ SCENE_ROMANYMAE, // Milk Road
- /* 0x23 */ SCENE_PIRATE, // Pirates' Fortress Interior
- /* 0x24 */ SCENE_SYATEKI_MORI, // Swamp Shooting Gallery
- /* 0x25 */ SCENE_SINKAI, // Pinnacle Rock
- /* 0x26 */ SCENE_YOUSEI_IZUMI, // Fairy's Fountain
- /* 0x27 */ SCENE_KINSTA1, // Swamp Spider House
- /* 0x28 */ SCENE_KINDAN2, // Oceanside Spider House
- /* 0x29 */ SCENE_TENMON_DAI, // Astral Observatory
- /* 0x2A */ SCENE_LAST_DEKU, // Moon Deku Trial
- /* 0x2B */ SCENE_22DEKUCITY, // Deku Palace
- /* 0x2C */ SCENE_KAJIYA, // Mountain Smithy
- /* 0x2D */ SCENE_00KEIKOKU, // Termina Field
- /* 0x2E */ SCENE_POSTHOUSE, // Post Office
- /* 0x2F */ SCENE_LABO, // Marine Research Lab
- /* 0x30 */ SCENE_DANPEI2TEST, // Beneath the Graveyard (Day 3) and Dampe's House
- /* 0x31 */ SCENE_UNSET_31,
- /* 0x32 */ SCENE_16GORON_HOUSE, // Goron Shrine
- /* 0x33 */ SCENE_33ZORACITY, // Zora Hall
- /* 0x34 */ SCENE_8ITEMSHOP, // Trading Post
- /* 0x35 */ SCENE_F01, // Romani Ranch
- /* 0x36 */ SCENE_INISIE_BS, // Twinmold's Lair
- /* 0x37 */ SCENE_30GYOSON, // Great Bay Coast
- /* 0x38 */ SCENE_31MISAKI, // Zora Cape
- /* 0x39 */ SCENE_TAKARAKUJI, // Lottery Shop
- /* 0x3A */ SCENE_UNSET_3A,
- /* 0x3B */ SCENE_TORIDE, // Pirates' Fortress Moat
- /* 0x3C */ SCENE_FISHERMAN, // Fisherman's Hut
- /* 0x3D */ SCENE_GORONSHOP, // Goron Shop
- /* 0x3E */ SCENE_DEKU_KING, // Deku King's Chamber
- /* 0x3F */ SCENE_LAST_GORON, // Moon Goron Trial
- /* 0x40 */ SCENE_24KEMONOMITI, // Road to Southern Swamp
- /* 0x41 */ SCENE_F01_B, // Doggy Racetrack
- /* 0x42 */ SCENE_F01C, // Cucco Shack
- /* 0x43 */ SCENE_BOTI, // Ikana Graveyard
- /* 0x44 */ SCENE_HAKUGIN_BS, // Goht's Lair
- /* 0x45 */ SCENE_20SICHITAI, // Southern Swamp (poison)
- /* 0x46 */ SCENE_21MITURINMAE, // Woodfall
- /* 0x47 */ SCENE_LAST_ZORA, // Moon Zora Trial
- /* 0x48 */ SCENE_11GORONNOSATO2, // Goron Village (spring)
- /* 0x49 */ SCENE_SEA, // Great Bay Temple
- /* 0x4A */ SCENE_35TAKI, // Waterfall Rapids
- /* 0x4B */ SCENE_REDEAD, // Beneath the Well
- /* 0x4C */ SCENE_BANDROOM, // Zora Hall Rooms
- /* 0x4D */ SCENE_11GORONNOSATO, // Goron Village (winter)
- /* 0x4E */ SCENE_GORON_HAKA, // Goron Graveyard
- /* 0x4F */ SCENE_SECOM, // Sakon's Hideout
- /* 0x50 */ SCENE_10YUKIYAMANOMURA, // Mountain Village (winter)
- /* 0x51 */ SCENE_TOUGITES, // Ghost Hut
- /* 0x52 */ SCENE_DANPEI, // Deku Shrine
- /* 0x53 */ SCENE_IKANAMAE, // Road to Ikana
- /* 0x54 */ SCENE_DOUJOU, // Swordsman's School
- /* 0x55 */ SCENE_MUSICHOUSE, // Music Box House
- /* 0x56 */ SCENE_IKNINSIDE, // Igos du Ikana's Lair
- /* 0x57 */ SCENE_MAP_SHOP, // Tourist Information
- /* 0x58 */ SCENE_F40, // Stone Tower
- /* 0x59 */ SCENE_F41, // Inverted Stone Tower
- /* 0x5A */ SCENE_10YUKIYAMANOMURA2, // Mountain Village (spring)
- /* 0x5B */ SCENE_14YUKIDAMANOMITI, // Path to Snowhead
- /* 0x5C */ SCENE_12HAKUGINMAE, // Snowhead
- /* 0x5D */ SCENE_17SETUGEN, // Path to Goron Village (winter)
- /* 0x5E */ SCENE_17SETUGEN2, // Path to Goron Village (spring)
- /* 0x5F */ SCENE_SEA_BS, // Gyorg's Lair
- /* 0x60 */ SCENE_RANDOM, // Secret Shrine
- /* 0x61 */ SCENE_YADOYA, // Stock Pot Inn
- /* 0x62 */ SCENE_KONPEKI_ENT, // Great Bay Cutscene
- /* 0x63 */ SCENE_INSIDETOWER, // Clock Tower Interior
- /* 0x64 */ SCENE_26SARUNOMORI, // Woods of Mystery
- /* 0x65 */ SCENE_LOST_WOODS, // Lost Woods (Intro)
- /* 0x66 */ SCENE_LAST_LINK, // Moon Link Trial
- /* 0x67 */ SCENE_SOUGEN, // The Moon
- /* 0x68 */ SCENE_BOMYA, // Bomb Shop
- /* 0x69 */ SCENE_KYOJINNOMA, // Giants' Chamber
- /* 0x6A */ SCENE_KOEPONARACE, // Gorman Track
- /* 0x6B */ SCENE_GORONRACE, // Goron Racetrack
- /* 0x6C */ SCENE_TOWN, // East Clock Town
- /* 0x6D */ SCENE_ICHIBA, // West Clock Town
- /* 0x6E */ SCENE_BACKTOWN, // North Clock Town
- /* 0x6F */ SCENE_CLOCKTOWER, // South Clock Town
- /* 0x70 */ SCENE_ALLEY, // Laundry Pool
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, _restrictionFlags, _persistentCycleFlags) enumValue,
+#define DEFINE_SCENE_UNSET(enumValue) enumValue,
+
+typedef enum SceneId {
+ #include "tables/scene_table.h"
/* 0x71 */ SCENE_MAX
} SceneId;
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
typedef enum {
/* 0x00 */ ENTR_SCENE_MAYORS_RESIDENCE,
/* 0x01 */ ENTR_SCENE_MAJORAS_LAIR,
@@ -822,6 +719,8 @@ typedef enum {
*/
#define ENTRANCE(scene, spawn) ((((ENTR_SCENE_##scene) & 0x7F) << 9) | (((spawn) & 0x1F) << 4))
+#define ENTR_LOAD_OPENING -1
+
/*
* Entrances used in cutscene destination. Includes scene layer that's immediately applied to `nextCutsceneIndex` and removed.
* See `CutsceneScriptEntry.nextEntrance`
diff --git a/include/z64schedule.h b/include/z64schedule.h
index f3a703f3c..07a942e90 100644
--- a/include/z64schedule.h
+++ b/include/z64schedule.h
@@ -50,13 +50,13 @@ typedef enum {
/* 0x0F */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_S, // Branches if the current time is less than the command time, short range branch
/* 0x10 */ SCHEDULE_CMD_ID_CHECK_BEFORE_TIME_L, // Branches if the current time is less than the command time, long range branch
/* 0x11 */ SCHEDULE_CMD_ID_BRANCH_S, // Always branch, short range branch
- /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L, // Always branch, long range branch
+ /* 0x12 */ SCHEDULE_CMD_ID_BRANCH_L // Always branch, long range branch
} ScheduleCommandId;
typedef enum {
/* 0 */ SCHEDULE_CHECK_MISC_ROOM_KEY,
/* 1 */ SCHEDULE_CHECK_MISC_LETTER_TO_KAFEI,
- /* 2 */ SCHEDULE_CHECK_MISC_MASK_ROMANI,
+ /* 2 */ SCHEDULE_CHECK_MISC_MASK_ROMANI
} ScheduleCheckMisc;
typedef struct {
diff --git a/include/z64subs.h b/include/z64subs.h
index ad2b7044f..768f81079 100644
--- a/include/z64subs.h
+++ b/include/z64subs.h
@@ -108,7 +108,7 @@ s32 SubS_ChangeAnimationByInfoS(SkelAnime* skelAnime, AnimationInfoS* animationI
s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex);
-Path* SubS_GetDayDependentPath(struct PlayState* play, u8 pathIndex, u8 max, s32* startPointIndex);
+Path* SubS_GetDayDependentPath(struct PlayState* play, u8 pathIndex, u8 pathIndexNone, s32* startPointIndex);
s32 SubS_WeightPathing_ComputePoint(Path* path, s32 waypoint, Vec3f* point, f32 progress, s32 direction);
s32 SubS_WeightPathing_Move(Actor* actor, Path* path, s32* waypoint, f32* progress, s32 direction, s32 returnStart);
@@ -126,7 +126,7 @@ s32 SubS_TrackPoint(Vec3f* target, Vec3f* focusPos, Vec3s* shapeRot, Vec3s* trac
s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB);
-Path* SubS_GetPathByIndex(struct PlayState* play, s16 pathIndex, s16 max);
+Path* SubS_GetPathByIndex(struct PlayState* play, s16 pathIndex, s16 pathIndexNone);
s32 SubS_CopyPointFromPath(Path* path, s32 pointIndex, Vec3f* dst);
s16 SubS_GetDistSqAndOrientPoints(Vec3f* vecA, Vec3f* vecB, f32* distSq);
s32 SubS_MoveActorToPoint(Actor* actor, Vec3f* point, s16 rotStep);
diff --git a/include/z64transition.h b/include/z64transition.h
index 741f344d7..fe6027a9f 100644
--- a/include/z64transition.h
+++ b/include/z64transition.h
@@ -2,6 +2,7 @@
#define Z64TRANSITION_H
#include "ultra64.h"
+#include "libc/stdint.h"
#include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
#include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
#include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
@@ -67,7 +68,7 @@ typedef struct {
typedef enum {
/* 1 */ TRANS_INSTANCE_TYPE_FILL_OUT = 1,
- /* 2 */ TRANS_INSTANCE_TYPE_FILL_IN,
+ /* 2 */ TRANS_INSTANCE_TYPE_FILL_IN
} TransitionInstanceType;
#define TRANS_INSTANCE_TYPE_FADE_FLASH 3
@@ -164,31 +165,34 @@ typedef enum {
/* 86 */ TRANS_TYPE_86 = 86
} TransitionType;
-typedef enum {
- /* 0 */ FBDEMO_FADE,
- /* 1 */ FBDEMO_TRIFORCE,
- /* 2 */ FBDEMO_WIPE1,
- /* 3 */ FBDEMO_WIPE3,
- /* 4 */ FBDEMO_WIPE4,
- /* 5 */ FBDEMO_CIRCLE,
- /* 6 */ FBDEMO_WIPE5
+#define DEFINE_TRANSITION(enumValue, _structName, _instanceName, _name) enumValue,
+#define DEFINE_TRANSITION_INTERNAL(enumValue, _structName, _instanceName) enumValue,
+
+typedef enum FbDemoType {
+ #include "tables/transition_table.h"
+ /* 7 */ FBDEMO_MAX
} FbDemoType;
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
#define TRANS_NEXT_TYPE_DEFAULT 0xFF
+#define DEFINE_TRANSITION(_enumValue, structName, instanceName, _name) structName instanceName;
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, instanceName) structName instanceName;
+
+typedef union TransitionInstance {
+ #include "tables/transition_table.h"
+} TransitionInstance; // size = 0x218
+
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
typedef struct {
/* 0x000 */ s16 transitionType;
/* 0x002 */ s8 fbdemoType;
/* 0x003 */ char unk_003[0x5];
- /* 0x008 */ union {
- TransitionFade fade;
- TransitionCircle circle;
- TransitionTriforce triforce;
- TransitionWipe1 wipe1;
- TransitionWipe3 wipe3;
- TransitionWipe4 wipe4;
- TransitionWipe5 wipe5;
- } instanceData;
+ /* 0x008 */ TransitionInstance instanceData;
/* 0x220 */ char unk_220[0x10];
/* 0x230 */ void* (*init)(void* transition);
/* 0x234 */ void (*destroy)(void* transition);
diff --git a/include/z_fireobj.h b/include/z_fireobj.h
index 7bd58d80a..6fe0639bc 100644
--- a/include/z_fireobj.h
+++ b/include/z_fireobj.h
@@ -61,7 +61,7 @@ typedef enum FireState {
/* 0 */ FIRE_STATE_GROWING,
/* 1 */ FIRE_STATE_SHRINKING,
/* 2 */ FIRE_STATE_FULLY_LIT,
- /* 3 */ FIRE_STATE_NOT_LIT,
+ /* 3 */ FIRE_STATE_NOT_LIT
} FireState;
#define FIRE_FLAG_WATER_EXTINGUISHABLE (1 << 0)
diff --git a/include/z_prenmi.h b/include/z_prenmi.h
index 04c3f5f16..7be3eb16f 100644
--- a/include/z_prenmi.h
+++ b/include/z_prenmi.h
@@ -1,15 +1,15 @@
#ifndef Z64PRENMI_H
#define Z64PRENMI_H
-#include "global.h"
-
-void PreNMI_Destroy(GameState* thisx);
-void PreNMI_Init(GameState* thisx);
+#include "z64game.h"
typedef struct {
/* 0x00 */ GameState state;
/* 0xA4 */ u32 timer;
- /* 0xA8 */ UNK_TYPE4 unkA8;
+ /* 0xA8 */ s32 unk_A8;
} PreNMIState; // size = 0xAC
+void PreNMI_Destroy(GameState* thisx);
+void PreNMI_Init(GameState* thisx);
+
#endif
diff --git a/include/z_title_setup.h b/include/z_title_setup.h
index 3b299af97..1bd7c7d7d 100644
--- a/include/z_title_setup.h
+++ b/include/z_title_setup.h
@@ -1,13 +1,13 @@
#ifndef Z64TITLE_SETUP_H
#define Z64TITLE_SETUP_H
-#include "global.h"
-
-void Setup_Destroy(GameState* gameState);
-void Setup_Init(GameState* thisx);
+#include "z64game.h"
typedef struct {
/* 0x00 */ GameState state;
} SetupState; // size = 0xA4
+void Setup_Destroy(GameState* gameState);
+void Setup_Init(GameState* thisx);
+
#endif
diff --git a/spec b/spec
index 455822823..eca14fdde 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"
@@ -325,7 +325,8 @@ beginseg
name "icon_item_vtx_static"
compress
romalign 0x1000
- include "build/baserom/icon_item_vtx_static.o"
+ include "build/assets/interface/icon_item_vtx_static/icon_item_vtx_static.o"
+ number 11
endseg
beginseg
@@ -372,7 +373,8 @@ endseg
beginseg
name "schedule_static"
compress
- include "build/baserom/schedule_static.o"
+ include "build/assets/interface/schedule_static/schedule_static.o"
+ number 8
endseg
beginseg
@@ -473,7 +475,6 @@ beginseg
include "build/src/code/z_fireobj.o"
include "build/src/code/z_game_dlftbls.o"
include "build/src/code/z_horse.o"
- include "build/data/code/z_horse.data.o"
include "build/src/code/z_jpeg.o"
include "build/src/code/z_kaleido_setup.o"
include "build/src/code/z_kanfont.o"
@@ -522,8 +523,7 @@ beginseg
include "build/src/code/z_rumble.o"
include "build/src/code/z_view.o"
include "build/src/code/z_vimode.o"
- include "build/src/code/code_80140CE0.o"
- include "build/data/code/code_80140CE0.data.o"
+ include "build/src/code/z_viscvg.o"
include "build/src/code/code_80140E80.o"
include "build/src/code/z_vismono.o"
include "build/src/code/z_viszbuf.o"
@@ -549,7 +549,6 @@ beginseg
include "build/src/code/z_overlay.o"
include "build/src/code/z_play.o"
include "build/src/code/z_play_hireso.o"
- include "build/data/code/z_play_hireso.data.o"
include "build/src/code/PreRender.o"
include "build/data/code/PreRender.bss.o"
include "build/src/code/TwoHeadGfxArena.o"
@@ -567,14 +566,12 @@ 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"
include "build/data/code/speed_meter.bss.o"
include "build/src/code/su_mtx.o"
include "build/src/code/sys_cfb.o"
- include "build/data/code/sys_cfb.bss.o"
include "build/src/code/sys_cmpdma.o"
include "build/src/code/sys_initial_check.o"
include "build/src/code/sys_math.o"
@@ -590,7 +587,6 @@ beginseg
include "build/src/code/c_keyframe.o"
include "build/src/code/sys_slowly.o"
include "build/src/code/sys_flashrom.o"
- include "build/data/code/sys_flashrom.bss.o"
include "build/asm/code/code_80185F90.text.o" // handwritten
include "build/src/libultra/flash/osFlash.o"
pad_text
@@ -668,12 +664,15 @@ endseg
beginseg
name "ovl_file_choose"
compress
+ include "build/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.o"
+ include "build/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.o"
include "build/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.o"
- include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.o"
include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.o"
- include "build/data/ovl_file_choose/ovl_file_choose.data.o"
- include "build/data/ovl_file_choose/ovl_file_choose.bss.o"
- include "build/data/ovl_file_choose/ovl_file_choose.reloc.o"
+ #ifdef NON_MATCHING
+ include "build/src/overlays/gamestates/ovl_file_choose/ovl_file_choose_reloc.o"
+ #else
+ include "build/data/ovl_file_choose/ovl_file_choose.reloc.o"
+ #endif
endseg
beginseg
@@ -693,17 +692,14 @@ beginseg
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_prompt.o"
include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.bss.o"
- include "build/data/ovl_kaleido_scope/ovl_kaleido_scope.reloc.o"
+ include "build/src/overlays/kaleido_scope/ovl_kaleido_scope/ovl_kaleido_scope_reloc.o"
endseg
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 +994,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
@@ -1034,8 +1029,7 @@ beginseg
name "ovl_Bg_Keikoku_Spr"
compress
include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.data.o"
- include "build/data/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Keikoku_Spr/ovl_Bg_Keikoku_Spr_reloc.o"
endseg
beginseg
@@ -1126,11 +1120,7 @@ beginseg
name "ovl_Object_Kankyo"
compress
include "build/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_Object_Kankyo/ovl_Object_Kankyo_reloc.o"
-#else
- include "build/data/ovl_Object_Kankyo/ovl_Object_Kankyo.reloc.o"
-#endif
endseg
beginseg
@@ -1530,11 +1520,7 @@ beginseg
name "ovl_En_Kanban"
compress
include "build/src/overlays/actors/ovl_En_Kanban/z_en_kanban.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Kanban/ovl_En_Kanban_reloc.o"
-#else
- include "build/data/ovl_En_Kanban/ovl_En_Kanban.reloc.o"
-#endif
endseg
beginseg
@@ -1654,9 +1640,7 @@ beginseg
name "ovl_Bg_F40_Swlift"
compress
include "build/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.data.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.bss.o"
- include "build/data/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_F40_Swlift/ovl_Bg_F40_Swlift_reloc.o"
endseg
beginseg
@@ -2419,11 +2403,7 @@ beginseg
name "ovl_En_Go"
compress
include "build/src/overlays/actors/ovl_En_Go/z_en_go.o"
-#ifdef NON_MATCHING
include "build/src/overlays/actors/ovl_En_Go/ovl_En_Go_reloc.o"
-#else
- include "build/data/ovl_En_Go/ovl_En_Go.reloc.o"
-#endif
endseg
beginseg
@@ -2962,11 +2942,7 @@ beginseg
name "ovl_En_Tru"
compress
include "build/src/overlays/actors/ovl_En_Tru/z_en_tru.o"
- #ifdef NON_MATCHING
- include "build/src/overlays/actors/ovl_En_Tru/ovl_En_Tru_reloc.o"
- #else
- include "build/data/ovl_En_Tru/ovl_En_Tru.reloc.o"
- #endif
+ include "build/src/overlays/actors/ovl_En_Tru/ovl_En_Tru_reloc.o"
endseg
beginseg
@@ -3199,16 +3175,14 @@ 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
name "ovl_fbdemo_wipe3"
compress
include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.data.o"
- include "build/data/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.reloc.o"
+ include "build/src/overlays/fbdemos/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3_reloc.o"
endseg
beginseg
@@ -3595,8 +3569,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
@@ -4630,8 +4603,7 @@ beginseg
name "ovl_Eff_Stk"
compress
include "build/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.o"
- include "build/data/ovl_Eff_Stk/ovl_Eff_Stk.data.o"
- include "build/data/ovl_Eff_Stk/ovl_Eff_Stk.reloc.o"
+ include "build/src/overlays/actors/ovl_Eff_Stk/ovl_Eff_Stk_reloc.o"
endseg
beginseg
@@ -4864,8 +4836,7 @@ beginseg
name "ovl_Demo_Moonend"
compress
include "build/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.data.o"
- include "build/data/ovl_Demo_Moonend/ovl_Demo_Moonend.reloc.o"
+ include "build/src/overlays/actors/ovl_Demo_Moonend/ovl_Demo_Moonend_reloc.o"
endseg
beginseg
@@ -4886,8 +4857,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
@@ -8855,7 +8825,8 @@ beginseg
name "title_static"
compress
romalign 0x1000
- include "build/baserom/title_static.o"
+ include "build/assets/misc/title_static/title_static.o"
+ number 1
endseg
beginseg
diff --git a/src/audio/code_8019AF00.c b/src/audio/code_8019AF00.c
index d107e65b7..40c457cb3 100644
--- a/src/audio/code_8019AF00.c
+++ b/src/audio/code_8019AF00.c
@@ -9,7 +9,7 @@ typedef struct {
/* 0x0 */ Vec3f* pos;
/* 0x4 */ f32 freqScale;
/* 0x8 */ s8 reverbAdd;
-} SfxSettings; // size = 0x9
+} SfxSettings; // size = 0xC
typedef struct {
/* 0x0 */ f32 volume;
@@ -20,7 +20,7 @@ typedef struct {
/* 0xB */ u8 filter;
/* 0xC */ u8 combFilterGain;
/* 0xD */ u8 zVolume;
-} SfxChannelState; // size = 0xE
+} SfxChannelState; // size = 0x10
typedef enum {
/* 0x0 */ SFX_CHANNEL_PLAYER0, // SfxPlayerBank
@@ -50,7 +50,7 @@ typedef enum {
/* 0x4 */ SEQ_PLAYER_IO_PORT_4,
/* 0x5 */ SEQ_PLAYER_IO_PORT_5,
/* 0x6 */ SEQ_PLAYER_IO_PORT_6,
- /* 0x7 */ SEQ_PLAYER_IO_PORT_7,
+ /* 0x7 */ SEQ_PLAYER_IO_PORT_7
} SeqPlayerIOPort;
typedef struct {
@@ -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;
@@ -2543,8 +2543,8 @@ void AudioOcarina_CheckSongsWithoutMusicStaff(void) {
if ((u32)sOcarinaAvailableSongFlags & (1 << songIndex)) {
// Loops through all possible starting indices?
// Loops through the notes of the song?
- for (j = 0, k = 0; j < gOcarinaSongButtons[songIndex].numButtons && k == 0 &&
- sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[songIndex].numButtons;) {
+ for (j = 0, k = 0; (j < gOcarinaSongButtons[songIndex].numButtons) && (k == 0) &&
+ (sOcarinaWithoutMusicStaffPos >= gOcarinaSongButtons[songIndex].numButtons);) {
pitch = sCurOcarinaSongWithoutMusicStaff[(sOcarinaWithoutMusicStaffPos -
gOcarinaSongButtons[songIndex].numButtons) +
@@ -2953,7 +2953,7 @@ void AudioOcarina_SetRecordingSong(u8 isRecordingComplete) {
i = sRecordSongPos;
pitch = OCARINA_PITCH_NONE;
- while (i != 0 && pitch == OCARINA_PITCH_NONE) {
+ while ((i != 0) && (pitch == OCARINA_PITCH_NONE)) {
i--;
pitch = recordedSong[i].pitch;
}
diff --git a/src/audio/lib/effects.c b/src/audio/lib/effects.c
index feddf73ca..6ef8added 100644
--- a/src/audio/lib/effects.c
+++ b/src/audio/lib/effects.c
@@ -26,7 +26,7 @@ void AudioEffects_SequenceChannelProcessSound(SequenceChannel* channel, s32 reca
for (i = 0; i < ARRAY_COUNT(channel->layers); i++) {
SequenceLayer* layer = channel->layers[i];
- if (layer != NULL && layer->enabled && layer->note != NULL) {
+ if ((layer != NULL) && layer->enabled && (layer->note != NULL)) {
if (layer->notePropertiesNeedInit) {
layer->noteFreqScale = layer->freqScale * chanFreqScale;
layer->noteVelocity = layer->velocitySquare2 * channel->appliedVolume;
diff --git a/src/audio/lib/heap.c b/src/audio/lib/heap.c
index 0a64c0d1b..52533da4d 100644
--- a/src/audio/lib/heap.c
+++ b/src/audio/lib/heap.c
@@ -1303,8 +1303,8 @@ void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) {
sampleBankId1 = gAudioCtx.soundFontList[fontId].sampleBankId1;
sampleBankId2 = gAudioCtx.soundFontList[fontId].sampleBankId2;
if (((sampleBankId1 != 0xFF) && (entry->sampleBankId == sampleBankId1)) ||
- ((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || entry->sampleBankId == 0 ||
- entry->sampleBankId == 0xFE) {
+ ((sampleBankId2 != 0xFF) && (entry->sampleBankId == sampleBankId2)) || (entry->sampleBankId == 0) ||
+ (entry->sampleBankId == 0xFE)) {
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, fontId) != NULL) {
if (1) {}
if (AudioLoad_IsFontLoadComplete(fontId) != 0) {
@@ -1369,7 +1369,7 @@ void AudioHeap_DiscardSampleCaches(void) {
if ((sampleBankId1 == 0xFF) && (sampleBankId2 == 0xFF)) {
continue;
}
- if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_PERMANENT, fontId) == NULL ||
+ if ((AudioHeap_SearchCaches(FONT_TABLE, CACHE_PERMANENT, fontId) == NULL) ||
!AudioLoad_IsFontLoadComplete(fontId)) {
continue;
}
@@ -1386,14 +1386,14 @@ void AudioHeap_DiscardSampleCaches(void) {
}
typedef struct {
- uintptr_t oldAddr;
- uintptr_t newAddr;
- size_t size;
- u8 newMedium;
-} StorageChange;
+ /* 0x0 */ uintptr_t oldAddr;
+ /* 0x4 */ uintptr_t newAddr;
+ /* 0x8 */ size_t size;
+ /* 0xC */ u8 newMedium;
+} StorageChange; // size = 0x10
void AudioHeap_ChangeStorage(StorageChange* change, Sample* sample) {
- if (sample != NULL && ((sample->medium == change->newMedium) || (D_801FD120 != 1)) &&
+ if ((sample != NULL) && ((sample->medium == change->newMedium) || (D_801FD120 != 1)) &&
((sample->medium == MEDIUM_RAM) || (D_801FD120 != 0))) {
uintptr_t startAddr = change->oldAddr;
uintptr_t endAddr = change->oldAddr + change->size;
diff --git a/src/audio/lib/load.c b/src/audio/lib/load.c
index 3a4f1c1e0..8016e9b6a 100644
--- a/src/audio/lib/load.c
+++ b/src/audio/lib/load.c
@@ -80,10 +80,10 @@ typedef enum {
#define OS_MESG_PRI_HIGH 1
typedef struct {
- u16 numInstruments;
- u16 numDrums;
- u16 numSfx;
-} UnloadedFonts;
+ /* 0x0 */ u16 numInstruments;
+ /* 0x2 */ u16 numDrums;
+ /* 0x4 */ u16 numSfx;
+} UnloadedFonts; // size = 0x6
OSMesgQueue sScriptLoadQueue;
OSMesg sScriptLoadMesgBuf[0x10];
@@ -138,13 +138,13 @@ void* AudioLoad_DmaSampleData(uintptr_t devAddr, size_t size, s32 arg2, u8* dmaI
s32 bufferPos;
u32 i;
- if (arg2 != 0 || *dmaIndexRef >= gAudioCtx.sampleDmaListSize1) {
+ if ((arg2 != 0) || (*dmaIndexRef >= gAudioCtx.sampleDmaListSize1)) {
for (i = gAudioCtx.sampleDmaListSize1; i < gAudioCtx.sampleDmaCount; i++) {
dma = &gAudioCtx.sampleDmas[i];
bufferPos = devAddr - dma->devAddr;
- if (0 <= bufferPos && ((u32)bufferPos <= dma->size - size)) {
+ if ((0 <= bufferPos) && ((u32)bufferPos <= (dma->size - size))) {
// We already have a DMA request for this memory range.
- if (dma->ttl == 0 && gAudioCtx.sampleDmaReuseQueue2RdPos != gAudioCtx.sampleDmaReuseQueue2WrPos) {
+ if ((dma->ttl == 0) && (gAudioCtx.sampleDmaReuseQueue2RdPos != gAudioCtx.sampleDmaReuseQueue2WrPos)) {
// Move the DMA out of the reuse queue, by swapping it with the
// read pos, and then incrementing the read pos.
if (dma->reuseIndex != gAudioCtx.sampleDmaReuseQueue2RdPos) {
@@ -1905,7 +1905,7 @@ void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* fontData
}
gAudioCtx.numUsedSamples = 0;
- if (gAudioCtx.preloadSampleStackTop != 0 && !preloadInProgress) {
+ if ((gAudioCtx.preloadSampleStackTop != 0) && !preloadInProgress) {
topPreload = &gAudioCtx.preloadSampleStack[gAudioCtx.preloadSampleStackTop - 1];
sample = topPreload->sample;
nChunks = (sample->size >> 12) + 1;
@@ -2160,7 +2160,7 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, SampleBankRelocInfo*
}
gAudioCtx.numUsedSamples = 0;
- if (gAudioCtx.preloadSampleStackTop != 0 && !preloadInProgress) {
+ if ((gAudioCtx.preloadSampleStackTop != 0) && !preloadInProgress) {
topPreload = &gAudioCtx.preloadSampleStack[gAudioCtx.preloadSampleStackTop - 1];
sample = topPreload->sample;
nChunks = (sample->size >> 12) + 1;
diff --git a/src/audio/lib/playback.c b/src/audio/lib/playback.c
index deb6e82b9..678e01089 100644
--- a/src/audio/lib/playback.c
+++ b/src/audio/lib/playback.c
@@ -597,7 +597,7 @@ s32 AudioPlayback_BuildSyntheticWave(Note* note, SequenceLayer* layer, s32 waveI
}
freqScale = layer->freqScale;
- if (layer->portamento.mode != 0 && 0.0f < layer->portamento.extent) {
+ if ((layer->portamento.mode != 0) && (0.0f < layer->portamento.extent)) {
freqScale *= (layer->portamento.extent + 1.0f);
}
@@ -906,7 +906,7 @@ Note* AudioPlayback_AllocNoteFromActive(NotePool* pool, SequenceLayer* layer) {
aPriority = aNote->playbackState.priority;
}
- if (rNote == NULL && aNote == NULL) {
+ if ((rNote == NULL) && (aNote == NULL)) {
return NULL;
}
@@ -928,8 +928,8 @@ Note* AudioPlayback_AllocNote(SequenceLayer* layer) {
if (policy & 1) {
note = layer->note;
- if (note != NULL && note->playbackState.prevParentLayer == layer &&
- note->playbackState.wantedParentLayer == NO_LAYER) {
+ if ((note != NULL) && (note->playbackState.prevParentLayer == layer) &&
+ (note->playbackState.wantedParentLayer == NO_LAYER)) {
AudioPlayback_NoteReleaseAndTakeOwnership(note, layer);
AudioPlayback_AudioListRemove(¬e->listItem);
AudioScript_AudioListPushBack(¬e->listItem.pool->releasing, ¬e->listItem);
diff --git a/src/boot_O2/__osMalloc.c b/src/boot_O2/__osMalloc.c
index 24fa6d39e..71a5a5ba3 100644
--- a/src/boot_O2/__osMalloc.c
+++ b/src/boot_O2/__osMalloc.c
@@ -275,7 +275,7 @@ void __osFree(Arena* arena, void* ptr) {
node = (ArenaNode*)((uintptr_t)ptr - sizeof(ArenaNode));
- if (ptr != NULL && node->magic == NODE_MAGIC && !node->isFree) {
+ if ((ptr != NULL) && (node->magic == NODE_MAGIC) && !node->isFree) {
next = node->next;
prev = node->prev;
node->isFree = true;
@@ -297,7 +297,7 @@ void __osFree(Arena* arena, void* ptr) {
// Checks if the previous node is contiguous to the current node and if it isn't currently allocated. Then merge
// the two nodes into one.
- if (prev != NULL && prev->isFree && (uintptr_t)node == (uintptr_t)prev + sizeof(ArenaNode) + prev->size) {
+ if ((prev != NULL) && prev->isFree && ((uintptr_t)node == (uintptr_t)prev + sizeof(ArenaNode) + prev->size)) {
if (next != NULL) {
next->prev = prev;
}
diff --git a/src/boot_O2/boot_80086760.c b/src/boot_O2/boot_80086760.c
index 398a1e41a..cb77bed50 100644
--- a/src/boot_O2/boot_80086760.c
+++ b/src/boot_O2/boot_80086760.c
@@ -5,57 +5,44 @@
#include "global.h"
#include "fixed_point.h"
-extern f32 func_80086C70(f32 x);
-extern f32 func_80086CA8(f32 x);
-extern f32 func_80086D50(f32 x);
-extern f32 func_80086CE0(f32 x);
-extern f32 func_80086D18(f32 x);
-
s32 gUseAtanContFrac;
/**
* Tangent function computed using libultra sinf and cosf
*/
-// Math_FTanF
-f32 func_80086760(f32 x) {
+f32 Math_FTanF(f32 x) {
return sinf(x) / cosf(x);
}
// Unused
-// Math_FFloorF
-f32 func_80086794(f32 x) {
- return func_80086C70(x);
+f32 Math_FFloorF(f32 x) {
+ return floorf(x);
}
// Unused
-// Math_FCeilF
-f32 func_800867B4(f32 x) {
- return func_80086CA8(x);
+f32 Math_FCeilF(f32 x) {
+ return ceilf(x);
}
// Unused
-// Math_FRoundF
-f32 func_800867D4(f32 x) {
- return func_80086D50(x);
+f32 Math_FRoundF(f32 x) {
+ return roundf(x);
}
// Unused
-// Math_FTruncF
-f32 func_800867F4(f32 x) {
- return func_80086CE0(x);
+f32 Math_FTruncF(f32 x) {
+ return truncf(x);
}
-// Math_FNearbyIntF
-f32 func_80086814(f32 x) {
- return func_80086D18(x);
+f32 Math_FNearbyIntF(f32 x) {
+ return nearbyintf(x);
}
/**
* Arctangent approximation using a Maclaurin series [https://mathworld.wolfram.com/MaclaurinSeries.html]
* (one quadrant, i.e. |x| < 1)
*/
-// Math_FAtanTaylorQF
-f32 func_80086834(f32 x) {
+f32 Math_FAtanTaylorQF(f32 x) {
// Coefficients of Maclaurin series of arctangent
static const f32 coeffs[] = {
-1.0f / 3, +1.0f / 5, -1.0f / 7, +1.0f / 9, -1.0f / 11, +1.0f / 13, -1.0f / 15, +1.0f / 17, 0.0f,
@@ -84,10 +71,9 @@ f32 func_80086834(f32 x) {
* Extends previous arctangent function to the rest of the real numbers.
* Uses the formulae arctan(x) = pi/2 - arctan(1/x)
* and arctan(x) = pi/4 - arctan( (1-x)/(1+x) )
- * to extend the range in which the series computed by func_80086834 is a good approximation
+ * to extend the range in which the series computed by Math_FAtanTaylorQF is a good approximation
*/
-// Math_FAtanTaylorF
-f32 func_80086880(f32 x) {
+f32 Math_FAtanTaylorF(f32 x) {
f32 t;
f32 q;
@@ -102,13 +88,13 @@ f32 func_80086880(f32 x) {
}
if (t <= M_SQRT2 - 1.0f) {
- return func_80086834(x);
+ return Math_FAtanTaylorQF(x);
}
if (t >= M_SQRT2 + 1.0f) {
- q = M_PI / 2 - func_80086834(1.0f / t);
+ q = M_PI / 2 - Math_FAtanTaylorQF(1.0f / t);
} else { // in the interval (\sqrt{2} - 1, \sqrt{2} + 1)
- q = M_PI / 4 - func_80086834((1.0f - t) / (1.0f + t));
+ q = M_PI / 4 - Math_FAtanTaylorQF((1.0f - t) / (1.0f + t));
}
if (x > 0.0f) {
@@ -123,8 +109,7 @@ f32 func_80086880(f32 x) {
* Cf. https://en.wikipedia.org/wiki/Gauss%27s_continued_fraction#The_series_2F1_2 ,
* https://dlmf.nist.gov/4.25#E4
*/
-// Math_FAtanContFracF
-f32 func_800869A4(f32 x) {
+f32 Math_FAtanContFracF(f32 x) {
s32 sector;
f32 z;
f32 conv;
@@ -162,24 +147,22 @@ f32 func_800869A4(f32 x) {
}
}
-// Math_FAtanF
/**
* Single-argument arctangent, only used by the two-argument function.
* Nothing else sets the bss variable gUseAtanContFrac, so the Maclaurin series is always used
*/
-f32 func_80086AF0(f32 x) {
+f32 Math_FAtanF(f32 x) {
if (!gUseAtanContFrac) {
- return func_80086880(x);
+ return Math_FAtanTaylorF(x);
} else {
- return func_800869A4(x);
+ return Math_FAtanContFracF(x);
}
}
-// Math_FAtan2F
/**
* Main two-argument arctangent function
*/
-f32 func_80086B30(f32 y, f32 x) {
+f32 Math_FAtan2F(f32 y, f32 x) {
if (x == 0.0f) {
if (y == 0.0f) {
return 0.0f;
@@ -191,20 +174,18 @@ f32 func_80086B30(f32 y, f32 x) {
return qNaN0x10000;
}
} else if (x >= 0.0f) {
- return func_80086AF0(y / x);
+ return Math_FAtanF(y / x);
} else if (y < 0.0f) {
- return func_80086AF0(y / x) - M_PI;
+ return Math_FAtanF(y / x) - M_PI;
} else {
- return M_PI - func_80086AF0(-(y / x));
+ return M_PI - Math_FAtanF(-(y / x));
}
}
-// Math_FAsinF
-f32 func_80086C18(f32 x) {
- return func_80086B30(x, sqrtf(1.0f - SQ(x)));
+f32 Math_FAsinF(f32 x) {
+ return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
}
-// Math_FAcosF
-f32 func_80086C48(f32 x) {
- return M_PI / 2 - func_80086C18(x);
+f32 Math_FAcosF(f32 x) {
+ return M_PI / 2 - Math_FAsinF(x);
}
diff --git a/src/boot_O2/padutils.c b/src/boot_O2/padutils.c
index 95f1dfa3b..accd09e11 100644
--- a/src/boot_O2/padutils.c
+++ b/src/boot_O2/padutils.c
@@ -66,11 +66,10 @@ s8 PadUtils_GetRelY(Input* input) {
}
void PadUtils_UpdateRelXY(Input* input) {
- s32 curX, curY;
- s32 relX, relY;
-
- curX = PadUtils_GetCurX(input);
- curY = PadUtils_GetCurY(input);
+ s32 curX = PadUtils_GetCurX(input);
+ s32 curY = PadUtils_GetCurY(input);
+ s32 relX;
+ s32 relY;
if (curX > 7) {
relX = (curX < 0x43) ? curX - 7 : 0x43 - 7;
diff --git a/src/boot_O2/sleep.c b/src/boot_O2/sleep.c
index 01a85c5cc..a35abc5b2 100644
--- a/src/boot_O2/sleep.c
+++ b/src/boot_O2/sleep.c
@@ -2,10 +2,10 @@
void Sleep_Cycles(u64 time) {
OSMesgQueue mq;
- OSMesg msg;
+ OSMesg msg[1];
OSTimer timer;
- osCreateMesgQueue(&mq, &msg, OS_MESG_BLOCK);
+ osCreateMesgQueue(&mq, msg, ARRAY_COUNT(msg));
osSetTimer(&timer, time, 0, &mq, NULL);
osRecvMesg(&mq, NULL, OS_MESG_BLOCK);
}
diff --git a/src/boot_O2/boot_800862E0.c b/src/boot_O2/system_heap.c
similarity index 65%
rename from src/boot_O2/boot_800862E0.c
rename to src/boot_O2/system_heap.c
index 5774af9da..365d94596 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,12 +56,12 @@ 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) {
+ if ((blk != NULL) && (blockFunc != NULL)) {
uintptr_t pos = blk;
for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) {
@@ -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/CIC6105.c b/src/boot_O2_g3/CIC6105.c
index 4745ad5c8..78eed1a77 100644
--- a/src/boot_O2_g3/CIC6105.c
+++ b/src/boot_O2_g3/CIC6105.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
UNK_TYPE4 D_8009BE30;
diff --git a/src/boot_O2_g3/fault.c b/src/boot_O2_g3/fault.c
index 2c8f4a667..eb190859e 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() {
@@ -447,7 +447,7 @@ void osSyncPrintfThreadContext(OSThread* t) {
OSThread* Fault_FindFaultedThread() {
OSThread* iter = __osGetActiveQueue();
while (iter->priority != -1) {
- if (iter->priority > 0 && iter->priority < 0x7F && (iter->flags & 3)) {
+ if ((iter->priority > 0) && (iter->priority < 0x7F) && (iter->flags & 3)) {
return iter;
}
iter = iter->tlnext;
@@ -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/fault_drawer.c b/src/boot_O2_g3/fault_drawer.c
index 8efc930ec..f694be8aa 100644
--- a/src/boot_O2_g3/fault_drawer.c
+++ b/src/boot_O2_g3/fault_drawer.c
@@ -57,7 +57,7 @@ void FaultDrawer_DrawRecImpl(s32 xStart, s32 yStart, s32 xEnd, s32 yEnd, u16 col
s32 xSize = xEnd - xStart + 1;
s32 ySize = yEnd - yStart + 1;
- if (xDiff > 0 && yDiff > 0) {
+ if ((xDiff > 0) && (yDiff > 0)) {
if (xDiff < xSize) {
xSize = xDiff;
}
@@ -127,11 +127,11 @@ void FaultDrawer_UpdatePrintColor() {
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf(VT_RST);
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->foreColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("3%d"), idx);
}
idx = FaultDrawer_ColorToPrintColor(sFaultDrawContext->backColor);
- if (idx >= 0 && idx < 8) {
+ if ((idx >= 0) && (idx < 8)) {
osSyncPrintf(VT_SGR("4%d"), idx);
}
}
@@ -180,7 +180,7 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
for (; count != 0; count--, str++) {
if (sFaultDrawContext->escCode) {
sFaultDrawContext->escCode = false;
- if (*str >= '1' && *str <= '9') {
+ if ((*str >= '1') && (*str <= '9')) {
FaultDrawer_SetForeColor(sFaultDrawContext->printColors[*str - '0']);
}
} else {
@@ -192,9 +192,11 @@ void* FaultDrawer_FormatStringFunc(void* arg, const char* str, size_t count) {
sFaultDrawContext->cursorX = sFaultDrawContext->w;
break;
+
case '\x1A':
sFaultDrawContext->escCode = true;
break;
+
default:
if (sFaultDrawContext->osSyncPrintfEnabled) {
osSyncPrintf("%c", *str);
diff --git a/src/boot_O2_g3/yaz0.c b/src/boot_O2_g3/yaz0.c
index 3517b97ae..76f990659 100644
--- a/src/boot_O2_g3/yaz0.c
+++ b/src/boot_O2_g3/yaz0.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
u8 sYaz0DataBuffer[0x400];
@@ -57,11 +58,11 @@ void* Yaz0_NextDMA(void* curSrcPos) {
}
typedef struct {
- /* 0x00 */ u32 magic; // Yaz0
- /* 0x04 */ u32 decSize;
- /* 0x08 */ u32 compInfoOffset; // only used in mio0
- /* 0x0C */ u32 uncompDataOffset; // only used in mio0
-} Yaz0Header; // size = 0x10
+ /* 0x0 */ u32 magic; // Yaz0
+ /* 0x4 */ u32 decSize;
+ /* 0x8 */ u32 compInfoOffset; // only used in mio0
+ /* 0xC */ u32 uncompDataOffset; // only used in mio0
+} Yaz0Header; // size = 0x10
#define YAZ0_MAGIC 0x59617A30 // "Yaz0"
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/PreRender.c b/src/code/PreRender.c
index 172659cf7..c9f279e75 100644
--- a/src/code/PreRender.c
+++ b/src/code/PreRender.c
@@ -403,7 +403,7 @@ void PreRender_ApplyAntiAliasingFilter(PreRender* this) {
* Applies filters to the framebuffer prerender to make it look smoother
*/
void PreRender_ApplyFilters(PreRender* this) {
- if (this->cvgSave == NULL || this->fbufSave == NULL) {
+ if ((this->cvgSave == NULL) || (this->fbufSave == NULL)) {
this->unk_4D = 0;
} else {
this->unk_4D = 1;
diff --git a/src/code/code_80140CE0.c b/src/code/code_80140CE0.c
deleted file mode 100644
index f3d487fab..000000000
--- a/src/code/code_80140CE0.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140CE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D04.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80140CE0/func_80140D10.s")
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..8f4e0f44d 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -11,9 +11,9 @@ f32 gFramerateDivisorThird = 1.0f / 3.0f;
void Game_UpdateFramerateVariables(s32 divisor) {
gFramerateDivisor = divisor;
- gFramerateDivisorF = (f32)divisor;
- gFramerateDivisorHalf = (f32)(divisor * 0.5f);
- gFramerateDivisorThird = (f32)(divisor / 3.0f);
+ gFramerateDivisorF = divisor;
+ gFramerateDivisorHalf = divisor / 2.0f;
+ gFramerateDivisorThird = divisor / 3.0f;
}
void Game_SetFramerateDivisor(GameState* gameState, s32 divisor) {
@@ -31,7 +31,7 @@ void GameState_SetFBFilter(Gfx** gfx, void* zbuffer) {
D_801F8010.color.g = R_FB_FILTER_PRIM_COLOR(1);
D_801F8010.color.b = R_FB_FILTER_PRIM_COLOR(2);
D_801F8010.color.a = R_FB_FILTER_A;
- func_80140D10(&D_801F8010, &dlist, zbuffer);
+ VisCvg_Draw(&D_801F8010, &dlist);
} else if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) {
sVisZbuf.useRgba = (R_FB_FILTER_TYPE == 6);
sVisZbuf.primColor.r = R_FB_FILTER_PRIM_COLOR(0);
@@ -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) {
@@ -194,7 +194,7 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
gameState->main = NULL;
gameState->destroy = NULL;
gameState->running = 1;
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -210,10 +210,10 @@ void GameState_Init(GameState* gameState, GameStateFunc init, GraphicsContext* g
init(gameState);
- func_80140CE0(&D_801F8010);
+ VisCvg_Init(&D_801F8010);
VisZbuf_Init(&sVisZbuf);
VisMono_Init(&sMonoColors);
- func_80140898(&D_801F8048);
+ ViMode_Init(&D_801F8048);
func_801773A0(&D_801F7FF0);
Rumble_Init();
@@ -232,10 +232,10 @@ void GameState_Destroy(GameState* gameState) {
Rumble_Destroy();
func_801773C4(&D_801F7FF0);
- func_80140D04(&D_801F8010);
+ VisCvg_Destroy(&D_801F8010);
VisZbuf_Destroy(&sVisZbuf);
VisMono_Destroy(&sMonoColors);
- func_80140900(&D_801F8048);
+ ViMode_Destroy(&D_801F8048);
THA_Destroy(&gameState->heap);
GameAlloc_Cleanup(&gameState->alloc);
}
diff --git a/src/code/graph.c b/src/code/graph.c
index 558f7d563..2e104234e 100644
--- a/src/code/graph.c
+++ b/src/code/graph.c
@@ -2,7 +2,7 @@
#include "buffers.h"
#include "system_malloc.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
@@ -16,12 +16,12 @@ OSTime sGraphTaskStartTime;
void Graph_FaultClient(void) {
FaultDrawer_DrawText(30, 100, "ShowFrameBuffer PAGE 0/1");
- osViSwapBuffer(SysCfb_GetFbPtr(0));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(0));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
Fault_WaitForInput();
- osViSwapBuffer(SysCfb_GetFbPtr(1));
- osViSetMode(D_801FBB88);
+ osViSwapBuffer(SysCfb_GetFramebuffer(1));
+ osViSetMode(gActiveViMode);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF);
}
@@ -50,7 +50,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) {
gfxCtx->workBuffer = pool->workBuffer;
gfxCtx->debugBuffer = pool->debugBuffer;
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gSegments[0x0F] = gfxCtx->curFrameBuffer;
gfxCtx->zbuffer = SysCfb_GetZBuffer();
@@ -179,7 +179,7 @@ retry:
task->dramStack = (u64*)gGfxSPTaskStack;
task->dramStackSize = sizeof(gGfxSPTaskStack);
task->outputBuff = gGfxSPTaskOutputBufferPtr;
- task->outputBuffSize = gGfxSPTaskOutputBufferSize;
+ task->outputBuffSize = gGfxSPTaskOutputBufferEnd;
task->dataPtr = (u64*)gGfxMasterDL;
task->dataSize = 0;
task->yieldDataPtr = (u64*)gGfxSPTaskYieldBuffer;
@@ -340,18 +340,19 @@ void Graph_ThreadEntry(void* arg) {
u32 size;
s32 pad[2];
- gZBuffer = SystemArena_Malloc(sizeof(*gZBuffer) + sizeof(*gWorkBuffer) + 64 - 1);
- gZBuffer = (void*)ALIGN64((u32)gZBuffer);
+ gZBufferLoRes = SystemArena_Malloc(sizeof(*gZBufferLoRes) + sizeof(*gWorkBufferLoRes) + 64 - 1);
+ gZBufferLoRes = (void*)ALIGN64((u32)gZBufferLoRes);
- gWorkBuffer = (void*)((u8*)gZBuffer + sizeof(*gZBuffer));
+ gWorkBufferLoRes = (void*)((u8*)gZBufferLoRes + sizeof(*gZBufferLoRes));
- gGfxSPTaskOutputBuffer2 = gGfxSPTaskOutputBuffer = SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBuffer));
+ gGfxSPTaskOutputBufferHiRes = gGfxSPTaskOutputBufferLoRes =
+ SystemArena_Malloc(sizeof(*gGfxSPTaskOutputBufferLoRes));
- gGfxSPTaskOutputBufferEnd = (u8*)gGfxSPTaskOutputBuffer + sizeof(*gGfxSPTaskOutputBuffer);
- gGfxSPTaskOutputBufferEnd2 = (u8*)gGfxSPTaskOutputBuffer2 + sizeof(*gGfxSPTaskOutputBuffer2);
+ gGfxSPTaskOutputBufferEndLoRes = (u8*)gGfxSPTaskOutputBufferLoRes + sizeof(*gGfxSPTaskOutputBufferLoRes);
+ gGfxSPTaskOutputBufferEndHiRes = (u8*)gGfxSPTaskOutputBufferHiRes + sizeof(*gGfxSPTaskOutputBufferHiRes);
- func_80178978();
- Fault_SetFB(D_801FBB90, SCREEN_WIDTH, SCREEN_HEIGHT);
+ SysCfb_Init();
+ Fault_SetFB(gWorkBuffer, SCREEN_WIDTH, SCREEN_HEIGHT);
Graph_Init(&gfxCtx);
while (nextOvl) {
diff --git a/src/code/jpegutils.c b/src/code/jpegutils.c
index 904643f46..fbf6c69c2 100644
--- a/src/code/jpegutils.c
+++ b/src/code/jpegutils.c
@@ -86,7 +86,7 @@ u32 JpegUtils_ProcessHuffmanTableImpl(u8* data, JpegHuffmanTable* ht, u8* codesL
s32 temp;
ret = count;
- if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) {
+ if ((count == 0) || (isAc && (count > 0x100)) || (!isAc && (count > 0x10))) {
return 0;
}
if (ret != JpegUtils_GetHuffmanCodes(codesLengths, codes)) {
@@ -141,7 +141,7 @@ u32 JpegUtils_ProcessHuffmanTableImplOld(u8* dht, JpegHuffmanTableOld* ht, u8* c
count2 = count = JpegUtils_ParseHuffmanCodesLengths(dht, codesLengths);
- if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) {
+ if ((count == 0) || (isAc && (count > 0x100)) || (!isAc && (count > 0x10))) {
return true;
}
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/sched.c b/src/code/sched.c
index 98b005ba1..c06eb41ba 100644
--- a/src/code/sched.c
+++ b/src/code/sched.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "stackcheck.h"
@@ -24,7 +25,7 @@ void Sched_SwapFramebuffer(CfbInfo* cfbInfo) {
osViSwapBuffer(cfbInfo->swapBuffer);
cfbInfo->updateRate2 = cfbInfo->updateRate;
- if (SREG(62) == 0 && cfbInfo->viMode != NULL) {
+ if ((SREG(62) == 0) && (cfbInfo->viMode != NULL)) {
D_80096B20 = one;
osViSetMode(cfbInfo->viMode);
osViSetSpecialFeatures(cfbInfo->features);
@@ -67,7 +68,7 @@ void Sched_HandleAudioCancel(SchedContext* sched) {
// AUDIO SP Cancel
osSyncPrintf("AUDIO SP キャンセルします\n");
- if (sched->curRSPTask != NULL && sched->curRSPTask->list.t.type == M_AUDTASK) {
+ if ((sched->curRSPTask != NULL) && (sched->curRSPTask->list.t.type == M_AUDTASK)) {
if (!(HW_REG(SP_STATUS_REG, u32) & SP_STATUS_HALT)) {
// Attempts to stop AUDIO SP
osSyncPrintf("AUDIO SP止めようとします\n");
@@ -129,7 +130,7 @@ void Sched_HandleGfxCancel(SchedContext* sched) {
// GRAPH SP Cancel
osSyncPrintf("GRAPH SP キャンセルします\n");
- if (sched->curRSPTask != NULL && sched->curRSPTask->list.t.type == M_GFXTASK) {
+ if ((sched->curRSPTask != NULL) && (sched->curRSPTask->list.t.type == M_GFXTASK)) {
if (!(HW_REG(SP_STATUS_REG, u32) & SP_STATUS_HALT)) {
// GRAPH SP tries to stop
osSyncPrintf("GRAPH SP止めようとします\n");
@@ -226,7 +227,8 @@ s32 Sched_TaskCheckFramebuffers(SchedContext* sched, OSScTask* task) {
void* nextFB = osViGetNextFramebuffer();
void* curFB = osViGetCurrentFramebuffer();
- if (task == NULL || sched->pendingSwapBuf1 != NULL || (curFB == TASK_FRAMEBUFFER(task)->fb1 && curFB != nextFB)) {
+ if ((task == NULL) || (sched->pendingSwapBuf1 != NULL) ||
+ ((curFB == TASK_FRAMEBUFFER(task)->fb1) && (curFB != nextFB))) {
return 0;
}
return 1;
@@ -240,7 +242,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
OSScTask* gfxTask = sched->gfxListHead;
OSScTask* audioTask = sched->audioListHead;
- if ((ret & OS_SC_SP) && sched->audioListHead != NULL) {
+ if ((ret & OS_SC_SP) && (sched->audioListHead != NULL)) {
*spTask = audioTask;
ret &= ~OS_SC_SP;
sched->audioListHead = sched->audioListHead->next;
@@ -248,7 +250,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
sched->audioListTail = NULL;
}
} else if (gfxTask != NULL) {
- if (gfxTask->state & OS_SC_YIELDED || !(gfxTask->flags & OS_SC_NEEDS_RDP)) {
+ if ((gfxTask->state & OS_SC_YIELDED) || !(gfxTask->flags & OS_SC_NEEDS_RDP)) {
if (ret & OS_SC_SP) {
*spTask = gfxTask;
ret &= ~OS_SC_SP;
@@ -258,7 +260,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
}
}
} else if (ret == (OS_SC_SP | OS_SC_DP)) {
- if (TASK_FRAMEBUFFER(gfxTask) == NULL || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
+ if ((TASK_FRAMEBUFFER(gfxTask) == NULL) || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
*spTask = *dpTask = gfxTask;
ret &= ~(OS_SC_SP | OS_SC_DP);
sched->gfxListHead = sched->gfxListHead->next;
@@ -274,7 +276,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
void Sched_TaskUpdateFramebuffer(SchedContext* sched, OSScTask* task) {
sched->pendingSwapBuf1 = TASK_FRAMEBUFFER(task);
- if (sched->curBuf != NULL && sched->curBuf->updateRate2 > 0) {
+ if ((sched->curBuf != NULL) && (sched->curBuf->updateRate2 > 0)) {
return;
}
Sched_RetraceUpdateFramebuffer(sched, sched->pendingSwapBuf1);
@@ -313,7 +315,7 @@ void Sched_RunTask(SchedContext* sched, OSScTask* spTask, OSScTask* dpTask) {
return;
}
// Write back the data cache to ensure imminent SP DMA does not miss anything
- if (spTask->list.t.type != M_AUDTASK && !(spTask->state & OS_SC_YIELDED)) {
+ if ((spTask->list.t.type != M_AUDTASK) && !(spTask->state & OS_SC_YIELDED)) {
osWritebackDCacheAll();
}
spTask->state &= ~(OS_SC_YIELD | OS_SC_YIELDED);
@@ -326,9 +328,11 @@ void Sched_RunTask(SchedContext* sched, OSScTask* spTask, OSScTask* dpTask) {
case M_AUDTASK:
sRSPAudioStartTime = time;
break;
+
case M_GFXTASK:
sRSPGFXStartTime = time;
break;
+
default:
if (1) {}
sRSPOtherStartTime = time;
@@ -365,7 +369,7 @@ void Sched_HandleEntry(SchedContext* sched) {
Sched_QueueTask(sched, msg);
}
// If there is an audio task pending and an RSP task is running, yield the current task.
- if (sched->audioListHead != NULL && sched->curRSPTask != NULL) {
+ if ((sched->audioListHead != NULL) && (sched->curRSPTask != NULL)) {
Sched_Yield(sched);
return;
}
@@ -395,7 +399,7 @@ void Sched_HandleRetrace(SchedContext* sched) {
if (sched->curBuf->updateRate2 > 0) {
sched->curBuf->updateRate2--;
}
- if (sched->curBuf->updateRate2 <= 0 && sched->pendingSwapBuf1 != NULL) {
+ if ((sched->curBuf->updateRate2 <= 0) && (sched->pendingSwapBuf1 != NULL)) {
Sched_RetraceUpdateFramebuffer(sched, sched->pendingSwapBuf1);
}
}
@@ -420,9 +424,11 @@ void Sched_HandleRSPDone(SchedContext* sched) {
case M_AUDTASK:
gRSPAudioTotalTime += time - sRSPAudioStartTime;
break;
+
case M_GFXTASK:
sRSPGFXTotalTime += time - sRSPGFXStartTime;
break;
+
default:
if (1) {}
sRSPOtherTotalTime += time - sRSPOtherStartTime;
@@ -554,15 +560,19 @@ void Sched_ThreadEntry(void* arg) {
case RDP_AUDIO_CANCEL_MSG:
Sched_HandleAudioCancel(sched);
continue;
+
case RSP_GFX_CANCEL_MSG:
Sched_HandleGfxCancel(sched);
continue;
+
case ENTRY_MSG:
Sched_HandleEntry(sched);
continue;
+
case RSP_DONE_MSG:
Sched_HandleRSPDone(sched);
continue;
+
case RDP_DONE_MSG:
Sched_HandleRDPDone(sched);
continue;
@@ -572,9 +582,11 @@ void Sched_ThreadEntry(void* arg) {
case OS_SC_RETRACE_MSG:
Sched_HandleRetrace(sched);
continue;
+
case OS_SC_PRE_NMI_MSG:
Sched_HandleReset(sched);
continue;
+
case OS_SC_NMI_MSG:
Sched_HandleStop(sched);
continue;
diff --git a/src/code/sys_cfb.c b/src/code/sys_cfb.c
index 25d92227c..29d6e39c4 100644
--- a/src/code/sys_cfb.c
+++ b/src/code/sys_cfb.c
@@ -1,21 +1,129 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
#include "system_malloc.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178750.s")
+extern u16 gFramebufferHiRes0[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
+extern u16 gFramebufferHiRes1[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178818.s")
+OSViMode sNotebookViMode; // placeholder name
+void* gFramebuffers[2];
+OSViMode* gActiveViMode;
+u16* gZBufferPtr;
+void* gWorkBuffer;
+u64* gGfxSPTaskOutputBufferPtr;
+void* gGfxSPTaskOutputBufferEnd;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178978.s")
+void* sCfbLoRes1;
+void* sCfbLoRes0;
+u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndLoRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_801789D4.s")
+void* sCfbHiRes1;
+void* sCfbHiRes0;
+u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
+u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
+void* gGfxSPTaskOutputBufferEndHiRes;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetFbPtr.s")
+s16 gCfbWidth;
+s16 gCfbHeight;
+s16 gCfbLeftAdjust;
+s16 gCfbUpperAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/SysCfb_GetZBuffer.s")
+u8 gSysCfbHiResEnabled;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A24.s")
+void SysCfb_SetLoResMode(void) {
+ gFramebuffers[1] = sCfbLoRes1;
+ gFramebuffers[0] = sCfbLoRes0;
+ gZBufferPtr = *gZBufferLoRes;
+ gWorkBuffer = gWorkBufferLoRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferLoRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndLoRes;
+ gCfbWidth = SCREEN_WIDTH;
+ gCfbHeight = SCREEN_HEIGHT;
+ gCfbLeftAdjust = 0;
+ gCfbUpperAdjust = 0;
+ gSysCfbHiResEnabled = false;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ gActiveViMode = &osViModeNtscLan1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A34.s")
+void SysCfb_SetHiResMode(void) {
+ gFramebuffers[1] = sCfbHiRes1;
+ gFramebuffers[0] = sCfbHiRes0;
+ gZBufferPtr = *gZBufferHiRes;
+ gWorkBuffer = gWorkBufferHiRes;
+ gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferHiRes;
+ gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndHiRes;
+ if (1) {}
+ gCfbWidth = HIRES_BUFFER_WIDTH;
+ gCfbHeight = HIRES_BUFFER_HEIGHT;
+ gCfbLeftAdjust = 30;
+ gCfbUpperAdjust = 10;
+ gScreenWidth = gCfbWidth;
+ gScreenHeight = gCfbHeight;
+ if ((gCfbWidth == SCREEN_WIDTH_HIRES) && (gCfbHeight == SCREEN_HEIGHT_HIRES)) {
+ gActiveViMode = &osViModeNtscHpf1;
+ } else {
+ s32 rightAdjust;
+ s32 lowerAdjust;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_cfb/func_80178A94.s")
+ //! FAKE:
+ l1:
+ rightAdjust = gCfbWidth - 610;
+ lowerAdjust = gCfbHeight - 470;
+ ViMode_Configure(&sNotebookViMode, -1, osTvType, 0, 1, 0, 1, gCfbWidth, gCfbHeight, 30, rightAdjust, 10,
+ lowerAdjust);
+ gActiveViMode = &sNotebookViMode;
+ }
+ gSysCfbHiResEnabled = true;
+}
+
+void SysCfb_Init(void) {
+ sCfbLoRes1 = gFramebuffer1;
+ sCfbLoRes0 = gFramebuffer0;
+ sCfbHiRes1 = gFramebufferHiRes1;
+ sCfbHiRes0 = gFramebufferHiRes0;
+ SysCfb_SetLoResMode();
+}
+
+// Unused
+void SysCfb_Reset(void) {
+ gFramebuffers[0] = NULL;
+ gFramebuffers[1] = NULL;
+}
+
+void* SysCfb_GetFramebuffer(s32 index) {
+ if (index < 2) {
+ return gFramebuffers[index];
+ }
+ return NULL;
+}
+
+void* SysCfb_GetZBuffer(void) {
+ return gZBufferPtr;
+}
+
+void* SysCfb_GetWorkBuffer(void) {
+ return gWorkBuffer;
+}
+
+u16 SysCfb_GetZBufferPixel(s32 x, s32 y) {
+ u16* zBuff = SysCfb_GetZBuffer();
+ u16 val;
+
+ if (zBuff != NULL) {
+ val = (&zBuff[x])[y * gCfbWidth];
+ } else {
+ val = 0;
+ }
+ return val;
+}
+
+s32 SysCfb_GetZBufferInt(s32 x, s32 y) {
+ return Environment_ZBufValToFixedPoint(SysCfb_GetZBufferPixel(x, y) << 2) >> 3;
+}
diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c
index b2a17d547..715892b49 100644
--- a/src/code/sys_cmpdma.c
+++ b/src/code/sys_cmpdma.c
@@ -2,7 +2,7 @@
#include "system_malloc.h"
typedef struct {
- union {
+ /* 0x0 */ union {
u32 dmaWord[2];
u32 dataStart;
u32 dataSize;
@@ -11,7 +11,7 @@ typedef struct {
u32 end;
} offset;
};
-} CmpDmaBuffer;
+} CmpDmaBuffer; // size = 0x8
CmpDmaBuffer sDmaBuffer;
diff --git a/src/code/sys_flashrom.c b/src/code/sys_flashrom.c
index 0db0b8744..c2665741e 100644
--- a/src/code/sys_flashrom.c
+++ b/src/code/sys_flashrom.c
@@ -1,44 +1,253 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "stack.h"
#include "stackcheck.h"
#include "system_malloc.h"
-// extern UNK_TYPE1 D_801FBE10;
-// extern UNK_TYPE1 D_801FBE28;
-// extern UNK_TYPE1 D_801FBE2C;
-// extern UNK_TYPE4 D_801FBE30;
-extern STACK(sSysFlashromStack, 0x1000);
-extern StackEntry sSysFlashromStackInfo;
-extern OSThread sSysFlashromThread;
-extern s80185D40 D_801FD008;
-extern OSMesg D_801FD034[1];
+OSMesgQueue sFlashromMesgQueue;
+OSMesg sFlashromMesg[1];
+s32 sFlashromIsInit;
+s32 sFlashromVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857C0.s")
+STACK(sSysFlashromStack, 0x1000);
+StackEntry sSysFlashromStackInfo;
+OSThread sSysFlashromThread;
+FlashromRequest sFlashromRequest;
+OSMesg sSysFlashromMsgBuf[1];
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801857D0.s")
+s32 SysFlashrom_IsInit(void) {
+ return sFlashromIsInit;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185864.s")
+const char* SysFlashrom_GetVendorStr(void) {
+ switch (sFlashromVendor) {
+ case FLASH_VERSION_MX_PROTO_A:
+ return "PROTO A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185908.s")
+ case FLASH_VERSION_MX_A:
+ return "A";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185968.s")
+ case FLASH_VERSION_MX_C:
+ return "C";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_801859F0.s")
+ case FLASH_VERSION_MEI:
+ return "D(NEW)";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185A2C.s")
+ case FLASH_VERSION_MX_B_AND_D:
+ return "B or D";
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185B1C.s")
+ default:
+ return "UNKNOWN";
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185BE4.s")
+s32 SysFlashrom_CheckFlashType(void) {
+ u32 flashType;
+ u32 flashVendor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185C24.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osFlashReadId(&flashType, &flashVendor);
+ sFlashromVendor = flashVendor;
+ if (flashType == FLASH_TYPE_MAGIC) {
+ if ((flashVendor == FLASH_VERSION_MX_PROTO_A) || (flashVendor == FLASH_VERSION_MX_A) ||
+ (flashVendor == FLASH_VERSION_MX_C) || (flashVendor == FLASH_VERSION_MEI) ||
+ (flashVendor == FLASH_VERSION_MX_B_AND_D)) {
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s")
+s32 SysFlashrom_InitFlash(void) {
+ osCreateMesgQueue(&sFlashromMesgQueue, sFlashromMesg, ARRAY_COUNT(sFlashromMesg));
+ osFlashInit();
+ sFlashromIsInit = true;
+ if (SysFlashrom_CheckFlashType() != 0) {
+ sFlashromIsInit = false;
+ return -1;
+ }
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185DDC.s")
+s32 SysFlashrom_ReadData(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185EC4.s")
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osInvalDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ osFlashReadArray(&msg, OS_MESG_PRI_NORMAL, pageNum, addr, pageCount, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F04.s")
+s32 SysFlashrom_EraseSector(u32 page) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return osFlashSectorErase(page);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/sys_flashrom/func_80185F64.s")
+s32 SysFlashrom_ExecWrite(void* addr, u32 pageNum, u32 pageCount) {
+ OSIoMesg msg;
+ s32 result;
+ u32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ // Ensure the page is always aligned to a sector boundary.
+ if ((pageNum % FLASH_PAGE_SIZE) != 0) {
+ Fault_AddHungupAndCrash("../sys_flashrom.c", 275);
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ for (i = 0; i < pageCount; i++) {
+ osFlashWriteBuffer(&msg, OS_MESG_PRI_NORMAL, (u8*)addr + i * FLASH_PAGE_SIZE, &sFlashromMesgQueue);
+ osRecvMesg(&sFlashromMesgQueue, NULL, OS_MESG_BLOCK);
+ result = osFlashWriteArray(i + pageNum);
+ if (result != 0) {
+ return result;
+ }
+ }
+ return 0;
+}
+
+s32 SysFlashrom_AttemptWrite(void* addr, u32 pageNum, u32 pageCount) {
+ s32 result;
+ s32 i;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osWritebackDCache(addr, pageCount * FLASH_PAGE_SIZE);
+ i = 0;
+failRetry:
+ result = SysFlashrom_EraseSector(pageNum);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ result = SysFlashrom_ExecWrite(addr, pageNum, pageCount);
+ if (result != 0) {
+ if (i < 3) {
+ i++;
+ goto failRetry;
+ }
+ return result;
+ }
+ return 0;
+}
+
+// Flash bits can only by flipped with a write from 1 -> 0. Going from 0 -> 1 requires an erasure.
+// This function will try to determine if any sectors need to be erased before writing saving erase cycles.
+s32 SysFlashrom_NeedsToErase(void* data, void* addr, u32 pageCount) {
+ u32 size;
+ u32 i;
+
+ for (i = 0; i < pageCount * FLASH_PAGE_SIZE; i += 4) {
+ if ((*(s32*)data & *(s32*)addr) != *(s32*)addr) {
+ return false;
+ }
+ }
+ return true;
+}
+
+s32 SysFlashrom_WriteData(void* addr, u32 pageNum, u32 pageCount) {
+ void* data;
+ size_t size;
+ s32 ret;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ size = pageCount * FLASH_PAGE_SIZE;
+ data = SystemArena_Malloc(size);
+ if (data == NULL) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ // Will always erase the sector even if it wouldn't normally need to.
+ if (SysFlashrom_NeedsToErase(data, addr, pageCount)) {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ } else {
+ ret = SysFlashrom_AttemptWrite(addr, pageNum, pageCount);
+ }
+ if (ret == 0) {
+ SysFlashrom_ReadData(data, pageNum, pageCount);
+ if (bcmp(data, addr, size) == 0) {
+ ret = 0;
+ } else {
+ ret = -1;
+ }
+ }
+ }
+ SystemArena_Free(data);
+ }
+ return ret;
+}
+
+void SysFlashrom_ThreadEntry(void* arg) {
+ FlashromRequest* req = (FlashromRequest*)arg;
+
+ switch (req->requestType) {
+ case FLASHROM_REQUEST_WRITE:
+ req->response = SysFlashrom_WriteData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+
+ case FLASHROM_REQUEST_READ:
+ req->response = SysFlashrom_ReadData(req->addr, req->pageNum, req->pageCount);
+ osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK);
+ break;
+ }
+}
+
+void SysFlashrom_WriteDataAsync(u8* addr, u32 pageNum, u32 pageCount) {
+ FlashromRequest* req = &sFlashromRequest;
+ if (SysFlashrom_IsInit()) {
+ req->requestType = FLASHROM_REQUEST_WRITE;
+ req->addr = addr;
+ req->pageNum = pageNum;
+ req->pageCount = pageCount;
+ osCreateMesgQueue(&req->messageQueue, sSysFlashromMsgBuf, ARRAY_COUNT(sSysFlashromMsgBuf));
+ StackCheck_Init(&sSysFlashromStackInfo, sSysFlashromStack, STACK_TOP(sSysFlashromStack), 0, 0x100,
+ "sys_flashrom");
+ osCreateThread(&sSysFlashromThread, Z_THREAD_ID_FLASHROM, SysFlashrom_ThreadEntry, req,
+ STACK_TOP(sSysFlashromStack), Z_PRIORITY_FLASHROM);
+ osStartThread(&sSysFlashromThread);
+ }
+}
+
+s32 SysFlashrom_IsBusy(void) {
+ OSMesgQueue* queue = &sFlashromRequest.messageQueue;
+
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ return MQ_IS_FULL(queue);
+}
+
+s32 SysFlashrom_AwaitResult(void) {
+ if (!SysFlashrom_IsInit()) {
+ return -1;
+ }
+ osRecvMesg(&sFlashromRequest.messageQueue, NULL, OS_MESG_BLOCK);
+ osDestroyThread(&sSysFlashromThread);
+ StackCheck_Cleanup(&sSysFlashromStackInfo);
+ return sFlashromRequest.response;
+}
+
+void SysFlashrom_WriteDataSync(void* addr, u32 pageNum, u32 pageCount) {
+ SysFlashrom_WriteDataAsync(addr, pageNum, pageCount);
+ SysFlashrom_AwaitResult();
+}
diff --git a/src/code/sys_math.c b/src/code/sys_math.c
index 7fd7e9dea..99d13c332 100644
--- a/src/code/sys_math.c
+++ b/src/code/sys_math.c
@@ -4,15 +4,17 @@
*/
#include "global.h"
-static f32 sFactorialTbl[] = { 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f,
- 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f };
+static f32 sFactorialTbl[] = {
+ 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f, 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f,
+};
-// Rename to Math_FactorialF
/**
* Takes a float, returns the factorial of it(s trunctation), iteratively
* Unused
+ *
+ * @remark original name: "ffact"
*/
-f32 func_80179300(f32 n) {
+f32 Math_FactorialF(f32 n) {
f32 ret = 1.0f;
s32 i;
@@ -23,12 +25,13 @@ f32 func_80179300(f32 n) {
return ret;
}
-// Rename to Math_Factorial
/**
* Takes an int and returns its factorial as a float. Uses the lookup table for n <= 12.
* Unused
+ *
+ * @remark original name: "ifact"
*/
-f32 func_80179400(s32 n) {
+f32 Math_Factorial(s32 n) {
f32 ret;
s32 i;
@@ -45,12 +48,13 @@ f32 func_80179400(s32 n) {
return ret;
}
-// Rename to Math_PowF
/**
* Returns base^{exp} if exp is nonnegative and 1.0f otherwise.
* Unused
+ *
+ * @remark original name: "powi"
*/
-f32 pow_int(f32 base, s32 exp) {
+f32 Math_PowF(f32 base, s32 exp) {
f32 ret = 1.0f;
while (exp > 0) {
@@ -61,19 +65,21 @@ f32 pow_int(f32 base, s32 exp) {
return ret;
}
-// Rename to Math_SinF
/**
* Takes an angle in radians and returns the sine.
+ *
+ * @remark original name: "sinf_table"
*/
-f32 sin_rad(f32 rad) {
+f32 Math_SinF(f32 rad) {
return sins(RAD_TO_BINANG(rad)) * SHT_MINV;
}
-// Rename to Math_CosF
/**
* Takes an angle in radians and returns the cosine.
+ *
+ * @remark original name: "cosf_table"
*/
-f32 cos_rad(f32 rad) {
+f32 Math_CosF(f32 rad) {
return coss(RAD_TO_BINANG(rad)) * SHT_MINV;
}
@@ -84,10 +90,9 @@ f32 Rand_ZeroFloat(f32 scale) {
return Rand_ZeroOne() * scale;
}
-// Rename to Rand_CenteredFloat
/**
* Returns a pseudo-random floating-point number between (- scale / 2) and (scale / 2). Originally in z_actor in OoT.
*/
-f32 randPlusMinusPoint5Scaled(f32 scale) {
+f32 Rand_CenteredFloat(f32 scale) {
return Rand_Centered() * scale;
}
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/title_setup.c b/src/code/title_setup.c
index 4e9293ce7..841c301e2 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -48,7 +48,7 @@ void Setup_SetRegs(void) {
}
void Setup_InitImpl(SetupState* this) {
- func_80185908();
+ SysFlashrom_InitFlash();
SaveContext_Init();
Setup_SetRegs();
diff --git a/src/code/z_DLF.c b/src/code/z_DLF.c
index 020edcf27..aa5c0325d 100644
--- a/src/code/z_DLF.c
+++ b/src/code/z_DLF.c
@@ -46,7 +46,7 @@ void Overlay_FreeGameState(GameStateOverlay* overlayEntry) {
s32 var_v0;
if (overlayEntry->loadedRamAddr != NULL) {
- var_v0 = overlayEntry->unk_28 != 0 ? -1 : 0;
+ var_v0 = (overlayEntry->unk_28 != 0) ? -1 : 0;
if (var_v0 == 0) {
overlayEntry->unk_14 = (uintptr_t)(
(overlayEntry->unk_14 != NULL)
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 84501dcbb..e7bc92a26 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -4,6 +4,7 @@
*/
#include "global.h"
+#include "z64horse.h"
#include "z64load.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -76,7 +77,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 +219,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 +361,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)));
@@ -475,6 +476,7 @@ void Actor_DrawZTarget(TargetContext* targetCtx, PlayState* play) {
Actor* actor = targetCtx->targetedActor;
OPEN_DISPS(play->state.gfxCtx);
+
if (targetCtx->unk48 != 0) {
TargetContextEntry* entry;
s16 alpha = 255;
@@ -522,7 +524,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 +566,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,
@@ -597,10 +599,10 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
targetCtx->unk_94 = sp68;
}
- if (targetCtx->unk8C != 0) {
+ if (targetCtx->unk8C != NULL) {
sp68 = targetCtx->unk8C;
targetCtx->unk8C = NULL;
- } else if (actor != 0) {
+ } else if (actor != NULL) {
sp68 = actor;
}
@@ -639,7 +641,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
Target_SetColors(targetCtx, sp68, category, play);
}
- if (actor != NULL && targetCtx->unk4B == 0) {
+ if ((actor != NULL) && (targetCtx->unk4B == 0)) {
Actor_GetProjectedPos(play, &actor->focus.pos, &projectedPos, &invW);
if ((projectedPos.z <= 0.0f) || (fabsf(projectedPos.x * invW) >= 1.0f) ||
(fabsf(projectedPos.y * invW) >= 1.0f)) {
@@ -694,7 +696,7 @@ void func_800B5814(TargetContext* targetCtx, Player* player, Actor* actor, GameS
* Tests if current scene switch flag is set.
*/
s32 Flags_GetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -704,7 +706,7 @@ s32 Flags_GetSwitch(PlayState* play, s32 flag) {
* Sets current scene switch flag.
*/
void Flags_SetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -713,7 +715,7 @@ void Flags_SetSwitch(PlayState* play, s32 flag) {
* Unsets current scene switch flag.
*/
void Flags_UnsetSwitch(PlayState* play, s32 flag) {
- if (flag >= 0 && flag < 0x80) {
+ if ((flag >= 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.switches[(flag & ~0x1F) >> 5] &= ~(1 << (flag & 0x1F));
}
}
@@ -792,7 +794,7 @@ void Flags_UnsetClearTemp(PlayState* play, s32 roomNumber) {
* Tests if current scene collectible flag is set.
*/
s32 Flags_GetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
return play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] & (1 << (flag & 0x1F));
}
return 0;
@@ -802,7 +804,7 @@ s32 Flags_GetCollectible(PlayState* play, s32 flag) {
* Sets current scene collectible flag.
*/
void Flags_SetCollectible(PlayState* play, s32 flag) {
- if (flag > 0 && flag < 0x80) {
+ if ((flag > 0) && (flag < 0x80)) {
play->actorCtx.sceneFlags.collectible[(flag & ~0x1F) >> 5] |= 1 << (flag & 0x1F);
}
}
@@ -849,17 +851,12 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
if (titleCtx->alpha != 0) {
s32 width = titleCtx->width;
s32 height = titleCtx->height;
- s32 unk1;
- s32 spC0;
- s32 sp38;
- s32 spB8;
- s32 spB4;
- s32 temp;
-
- temp = width * 2;
- spC0 = (titleCtx->x * 4) - temp;
- spB8 = (titleCtx->y * 4) - (height * 2);
- sp38 = width * 2;
+ s32 doubleWidth = width * 2;
+ s32 titleX = (titleCtx->x * 4) - doubleWidth;
+ s32 doubleHeight = height * 2;
+ s32 titleY = (titleCtx->y * 4) - doubleHeight;
+ s32 titleSecondY;
+ s32 textureLanguageOffset;
OPEN_DISPS(gameState->gfxCtx);
@@ -867,29 +864,30 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
height = TMEM_SIZE / width;
}
- spB4 = spB8 + (height * 4);
+ titleSecondY = titleY + (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);
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32*)titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
+ gDPLoadTextureBlock(OVERLAY_DISP++, titleCtx->texture, G_IM_FMT_IA, G_IM_SIZ_8b, 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);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB8, ((sp38 * 2) + spC0) - 4, spB8 + (height * 4) - 1,
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
height = titleCtx->height - height;
+ // If texture is bigger than 0x1000, display the rest
if (height > 0) {
- gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
+ gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, 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);
- gSPTextureRectangle(OVERLAY_DISP++, spC0, spB4, ((sp38 * 2) + spC0) - 4, spB4 + (height * 4) - 1,
- G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
+ titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
CLOSE_DISPS(gameState->gfxCtx);
@@ -908,41 +906,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;
}
/**
@@ -1364,8 +1359,8 @@ s32 func_800B7200(Player* player) {
return (player->stateFlags1 & (PLAYER_STATE1_80 | PLAYER_STATE1_20000000)) || (player->csMode != PLAYER_CSMODE_0);
}
-void func_800B722C(GameState* gameState, Player* player) {
- func_800F40A0(gameState, player);
+void Actor_SpawnHorse(PlayState* play, Player* player) {
+ Horse_Spawn(play, player);
}
s32 func_800B724C(PlayState* play, Actor* actor, u8 csMode) {
@@ -1377,7 +1372,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 +1380,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;
@@ -2034,10 +2029,10 @@ s32 Actor_OfferGetItem(Actor* actor, PlayState* play, GetItemId getItemId, f32 x
PLAYER_STATE1_80000 | PLAYER_STATE1_100000 | PLAYER_STATE1_200000)) &&
(Player_GetExplosiveHeld(player) <= PLAYER_EXPLOSIVE_NONE)) {
if ((actor->xzDistToPlayer <= xzRange) && (fabsf(actor->playerHeightRel) <= fabsf(yRange))) {
- if ((getItemId == GI_MASK_CIRCUS_LEADER || getItemId == GI_PENDANT_OF_MEMORIES ||
- getItemId == GI_DEED_LAND ||
- ((player->heldActor != NULL || actor == player->talkActor) &&
- (getItemId > GI_NONE && getItemId < GI_MAX))) ||
+ if (((getItemId == GI_MASK_CIRCUS_LEADER) || (getItemId == GI_PENDANT_OF_MEMORIES) ||
+ (getItemId == GI_DEED_LAND) ||
+ (((player->heldActor != NULL) || (actor == player->talkActor)) &&
+ ((getItemId > GI_NONE) && (getItemId < GI_MAX)))) ||
!(player->stateFlags1 & (PLAYER_STATE1_800 | PLAYER_STATE1_20000000))) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
s32 absYawDiff = ABS_ALT(yawDiff);
@@ -2303,7 +2298,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;
@@ -2311,7 +2306,7 @@ void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* acto
Actor_TargetContextInit(&actorCtx->targetContext, actorCtx->actorLists[ACTORCAT_PLAYER].first, play);
Actor_InitHalfDaysBit(actorCtx);
Fault_AddClient(&sActorFaultClient, (void*)Actor_PrintLists, actorCtx, NULL);
- func_800B722C(&play->state, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
+ Actor_SpawnHorse(play, (Player*)actorCtx->actorLists[ACTORCAT_PLAYER].first);
}
/**
@@ -2392,12 +2387,12 @@ Actor* Actor_UpdateActor(UpdateActor_Params* params) {
} else {
if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) {
Actor_Kill(actor);
- } else if (((params->requiredActorFlag) && !(actor->flags & params->requiredActorFlag)) ||
- ((((!params->requiredActorFlag) != 0)) &&
+ } else if ((params->requiredActorFlag && !(actor->flags & params->requiredActorFlag)) ||
+ (((!params->requiredActorFlag) != 0) &&
(!(actor->flags & ACTOR_FLAG_100000) ||
((actor->category == ACTORCAT_EXPLOSIVES) && (params->player->stateFlags1 & PLAYER_STATE1_200))) &&
- params->canFreezeCategory && (actor != params->talkActor) &&
- ((actor != params->player->heldActor)) && (actor->parent != ¶ms->player->actor))) {
+ params->canFreezeCategory && (actor != params->talkActor) && (actor != params->player->heldActor) &&
+ (actor->parent != ¶ms->player->actor))) {
CollisionCheck_ResetDamage(&actor->colChkInfo);
} else {
Math_Vec3f_Copy(&actor->prevPos, &actor->world.pos);
@@ -2559,7 +2554,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 +2572,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 +2651,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);
}
}
@@ -2712,7 +2707,7 @@ void Actor_DrawLensActors(PlayState* play, s32 numLensActors, Actor** lensActors
spA4 = play->unk_18E68;
if (dbgVar2) {
- PreRender_SetValues(&play->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, zbuffer);
+ PreRender_SetValues(&play->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, zbuffer);
gfxTemp = gfx;
func_80170200(&play->pauseBgPreRender, &gfxTemp, zbuffer, spA4);
@@ -3201,7 +3196,7 @@ Actor* Actor_SpawnAsChildAndCutscene(ActorContext* actorCtx, PlayState* play, s1
}
overlayEntry = &gActorOverlayTable[index];
- if (overlayEntry->vramStart != 0) {
+ if (overlayEntry->vramStart != NULL) {
overlayEntry->numLoaded++;
}
@@ -3274,12 +3269,12 @@ void Actor_SpawnTransitionActors(PlayState* play, ActorContext* actorCtx) {
for (i = 0; i < numTransitionActors; transitionActorList++, i++) {
if (transitionActorList->id >= 0) {
- if ((transitionActorList->sides[0].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[0].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[0].room)) ||
- (transitionActorList->sides[1].room >= 0 &&
- (play->roomCtx.curRoom.num == transitionActorList->sides[1].room ||
- play->roomCtx.prevRoom.num == transitionActorList->sides[1].room))) {
+ if (((transitionActorList->sides[0].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[0].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[0].room))) ||
+ ((transitionActorList->sides[1].room >= 0) &&
+ ((play->roomCtx.curRoom.num == transitionActorList->sides[1].room) ||
+ (play->roomCtx.prevRoom.num == transitionActorList->sides[1].room)))) {
s16 rotY = DEG_TO_BINANG((transitionActorList->rotY >> 7) & 0x1FF);
if (Actor_SpawnAsChildAndCutscene(actorCtx, play, transitionActorList->id & 0x1FFF,
@@ -3493,49 +3488,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) {
@@ -3571,8 +3567,8 @@ void Actor_SpawnFloorDustRing(PlayState* play, Actor* actor, Vec3f* posXZ, f32 r
accel.y += (Rand_ZeroOne() - 0.5f) * 0.2f;
for (i = countMinusOne; i >= 0; i--) {
- pos.x = (sin_rad(angle) * radius) + posXZ->x;
- pos.z = (cos_rad(angle) * radius) + posXZ->z;
+ pos.x = (Math_SinF(angle) * radius) + posXZ->x;
+ pos.z = (Math_CosF(angle) * radius) + posXZ->z;
accel.x = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
accel.z = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
@@ -3617,15 +3613,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 +3767,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 +3790,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 +4371,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 +4479,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 +4656,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:
@@ -4817,7 +4816,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// Apply and draw a light orb over each limb of frozen actor
for (limbIndex = 0; limbIndex < limbPosCount; limbIndex++, limbPos++) {
- Matrix_RotateZF(randPlusMinusPoint5Scaled(2 * M_PI), MTXMODE_APPLY);
+ Matrix_RotateZF(Rand_CenteredFloat(2 * M_PI), MTXMODE_APPLY);
currentMatrix->mf[3][0] = limbPos->x;
currentMatrix->mf[3][1] = limbPos->y;
currentMatrix->mf[3][2] = limbPos->z;
@@ -4858,9 +4857,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// first electric spark
Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI));
Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY);
- currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x;
- currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y;
- currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z;
+ currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x;
+ currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y;
+ currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z;
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
@@ -4870,9 +4869,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
// second electric spark
Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI));
Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY);
- currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x;
- currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y;
- currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z;
+ currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x;
+ currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y;
+ currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z;
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index 2fc1852ab..a263d4393 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "fixed_point.h"
#include "vt.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
@@ -1920,12 +1921,14 @@ s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResul
s32 bgId;
f32 temp_f0_2;
f32 f32temp;
- f32 nx2, nz2;
+ f32 nx2;
+ f32 nz2;
Vec3f checkLineNext;
Vec3f checkLinePrev;
f32 n2XZDist;
f32 n3XZDist;
- f32 nx3, nz3;
+ f32 nx3;
+ f32 nz3;
s32 bccFlags;
Vec3f posIntersect2;
s32 bgId2;
@@ -3045,7 +3048,7 @@ void DynaPoly_AddBgActorToLookup(PlayState* play, DynaCollisionContext* dyna, s3
newPoly->normal.z = COLPOLY_SNORMAL(newNormal.z);
}
- newPoly->dist = func_80086D24(-DOTXYZ(newNormal, vtxA));
+ newPoly->dist = nearbyint(-DOTXYZ(newNormal, vtxA));
if (newNormal.y > 0.5f) {
s16 polyId = *polyStartIndex + i;
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index f54fc93da..ce09f7c4d 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -1,22 +1,97 @@
+/**
+ * @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 +156,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 +240,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 +264,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 +311,7 @@ s32 func_800CB7CC(Camera* camera) {
return 0;
}
}
+
s32 Camera_IsMountedOnHorse(Camera* camera) {
Actor* focalActor = camera->focalActor;
@@ -310,7 +399,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 +466,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 +507,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 +533,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 +541,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 +867,5086 @@ 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(Math_FAtan2F(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(Math_FAtan2F(floorYDiffNear, nearDist)));
+ pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(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);
+
+ // Get the height based on 80% of the fov
+ fovHeight = Math_FTanF(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;
+ Math_FAtan2F(deltaY, sp50);
+ fovHeight = Math_FTanF(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 = Math_FAtan2F(deltaY, OLib_Vec3fDistXZ(at, &camera->eye));
+
+ if (temp_f0_6 > 0.34906584f) { // (M_PI / 9)
+ phi_f16 = 1.0f - Math_SinF(temp_f0_6 - 0.34906584f);
+ } else if (temp_f0_6 < -0.17453292f) { // (M_PI / 18)
+ phi_f16 = 1.0f - Math_SinF(-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 = Math_FAtan2F(deltaY, sp4C);
+
+ if (!(flags & 0x80)) {
+ fovHeight = Math_FTanF(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 - Math_SinF(temp_f0_3 - 0.34906584f);
+ } else if (temp_f0_3 < -0.17453292f) { // (M_PI / 18)
+ phi_f14 = 1.0f - Math_SinF(-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,2312 @@ 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) * (135.0f / 13.0f);
+ sin = Math_SinF(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 = Math_SinF(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;
+
+ default:
+ 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_collision_btltbls.c b/src/code/z_collision_btltbls.c
index c9f014f4f..36528e467 100644
--- a/src/code/z_collision_btltbls.c
+++ b/src/code/z_collision_btltbls.c
@@ -790,7 +790,7 @@ DamageTable sDamageTablePresets[] = {
* is out of range.
*/
DamageTable* DamageTable_Get(s32 index) {
- if (index < 0 || index > ARRAY_COUNT(sDamageTablePresets) - 1) {
+ if ((index < 0) || (index >= ARRAY_COUNT(sDamageTablePresets))) {
return NULL;
}
diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c
index 20083f3c4..b7f07d14d 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -23,16 +23,24 @@ Vec3f D_801EE0D8;
TriNorm D_801EE0E8[2];
TriNorm D_801EE150;
TriNorm D_801EE188;
+
+#ifndef NON_MATCHING
Vec3f D_801EE1C0;
Vec3f D_801EE1D0;
Vec3f D_801EE1E0;
Vec3f D_801EE1F0;
EffectSparkInit D_801EE200;
+#endif
+
TriNorm D_801EE6C8;
TriNorm D_801EE700;
+
+#ifndef NON_MATCHING
EffectSparkInit D_801EE738;
EffectSparkInit D_801EEC00;
EffectSparkInit D_801EF0C8;
+#endif
+
TriNorm D_801EF590;
TriNorm D_801EF5C8;
TriNorm D_801EF600;
@@ -84,7 +92,8 @@ f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderInfo* ac) {
* factors such as the ac collider's defense.
*/
s32 CollisionCheck_GetToucherDamage(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo) {
- if (at->actor != NULL && at->actor->id == ACTOR_EN_BOM && ac->actor != NULL && ac->actor->id == ACTOR_PLAYER) {
+ if ((at->actor != NULL) && (at->actor->id == ACTOR_EN_BOM) && (ac->actor != NULL) &&
+ (ac->actor->id == ACTOR_PLAYER)) {
return 8;
}
return atInfo->toucher.damage;
@@ -1145,7 +1154,7 @@ s32 CollisionCheck_SetAT(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sATResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colATCount >= ARRAY_COUNT(colCtxt->colAT)) {
@@ -1171,7 +1180,7 @@ s32 CollisionCheck_SetAT_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sATResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1205,7 +1214,7 @@ s32 CollisionCheck_SetAC(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sACResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colACCount >= ARRAY_COUNT(colCtxt->colAC)) {
@@ -1231,7 +1240,7 @@ s32 CollisionCheck_SetAC_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sACResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1265,7 +1274,7 @@ s32 CollisionCheck_SetOC(PlayState* play, CollisionCheckContext* colCtxt, Collid
}
sOCResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->colOCCount >= ARRAY_COUNT(colCtxt->colOC)) {
@@ -1291,7 +1300,7 @@ s32 CollisionCheck_SetOC_SAC(PlayState* play, CollisionCheckContext* colCtxt, Co
}
sOCResetFuncs[collider->shape](play, collider);
- if (collider->actor != NULL && collider->actor->update == NULL) {
+ if ((collider->actor != NULL) && (collider->actor->update == NULL)) {
return -1;
}
if (colCtxt->sacFlags & SAC_ON) {
@@ -1515,7 +1524,7 @@ void CollisionCheck_RedBloodUnused(PlayState* play, Collider* collider, Vec3f* v
void CollisionCheck_HitSolid(PlayState* play, ColliderInfo* info, Collider* collider, Vec3f* hitPos) {
s32 flags = info->toucherFlags & TOUCH_SFX_NONE;
- if (flags == TOUCH_SFX_NORMAL && collider->colType != COLTYPE_METAL) {
+ if ((flags == TOUCH_SFX_NORMAL) && (collider->colType != COLTYPE_METAL)) {
EffectSsHitmark_SpawnFixedScale(play, 0, hitPos);
if (collider->actor == NULL) {
play_sound(NA_SE_IT_SHIELD_BOUND);
@@ -1550,7 +1559,7 @@ void CollisionCheck_HitSolid(PlayState* play, ColliderInfo* info, Collider* coll
* Plays a hit sound effect for AT colliders attached to Player based on the AC element's elemType.
*/
s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo) {
- if (at->actor != NULL && at->actor->category == ACTORCAT_PLAYER) {
+ if ((at->actor != NULL) && (at->actor->category == ACTORCAT_PLAYER)) {
if (acInfo->elemType == ELEMTYPE_UNK0) {
Audio_PlaySfxAtPos(&at->actor->projectedPos, NA_SE_IT_SWORD_STRIKE);
} else if (acInfo->elemType == ELEMTYPE_UNK1) {
@@ -1644,7 +1653,7 @@ s32 CollisionCheck_SetATvsAC(PlayState* play, Collider* at, ColliderInfo* atInfo
return 0;
}
}
- if ((ac->acFlags & AC_HARD) && at->actor != NULL && ac->actor != NULL) {
+ if ((ac->acFlags & AC_HARD) && (at->actor != NULL) && (ac->actor != NULL)) {
CollisionCheck_SetBounce(at, ac);
}
if (!(acInfo->bumperFlags & BUMP_NO_AT_INFO)) {
@@ -1675,8 +1684,8 @@ s32 CollisionCheck_SetATvsAC(PlayState* play, Collider* at, ColliderInfo* atInfo
acInfo->bumper.hitPos.y = hitPos->y;
acInfo->bumper.hitPos.z = hitPos->z;
}
- if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && ac->colType != COLTYPE_METAL && ac->colType != COLTYPE_WOOD &&
- ac->colType != COLTYPE_HARD) {
+ if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && (ac->colType != COLTYPE_METAL) && (ac->colType != COLTYPE_WOOD) &&
+ (ac->colType != COLTYPE_HARD)) {
acInfo->bumperFlags |= BUMP_DRAW_HITMARK;
} else {
CollisionCheck_HitEffects(play, at, atInfo, ac, acInfo, hitPos);
@@ -1711,7 +1720,7 @@ void CollisionCheck_AC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->count > 0) && (ac->elements != NULL)) {
for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) {
if (CollisionCheck_SkipTouch(&atElem->info)) {
continue;
@@ -1765,7 +1774,7 @@ void CollisionCheck_AC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL && ac->dim.radius > 0 && ac->dim.height > 0) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->dim.radius > 0) && (ac->dim.height > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1814,7 +1823,7 @@ void CollisionCheck_AC_JntSphVsTris(PlayState* play, CollisionCheckContext* colC
ColliderTrisElement* acElem;
Vec3f hitPos;
- if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL) && (ac->count > 0) && (ac->elements != NULL)) {
for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) {
if (CollisionCheck_SkipTouch(&atElem->info)) {
continue;
@@ -1850,7 +1859,7 @@ void CollisionCheck_AC_JntSphVsQuad(PlayState* play, CollisionCheckContext* colC
Vec3f hitPos;
ColliderJntSphElement* sphElem;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1890,7 +1899,7 @@ void CollisionCheck_AC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -1935,7 +1944,7 @@ void CollisionCheck_AC_CylVsJntSph(PlayState* play, CollisionCheckContext* colCt
f32 centerDist;
ColliderJntSphElement* sphElem;
- if (ac->count > 0 && ac->elements != NULL && at->dim.radius > 0 && at->dim.height > 0) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->dim.radius > 0) && (at->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -1986,7 +1995,7 @@ void CollisionCheck_AC_CylVsCyl(PlayState* play, CollisionCheckContext* colCtxt,
f32 overlapSize;
f32 centerDist;
- if (at->dim.radius > 0 && at->dim.height > 0 && ac->dim.radius > 0 && ac->dim.height > 0) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0) && (ac->dim.radius > 0) && (ac->dim.height > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2038,7 +2047,7 @@ void CollisionCheck_AC_CylVsTris(PlayState* play, CollisionCheckContext* colCtxt
ColliderTrisElement* acElem;
Vec3f hitPos;
- if (at->dim.radius > 0 && at->dim.height > 0 && ac->count > 0 && ac->elements != NULL) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0) && (ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2071,7 +2080,7 @@ void CollisionCheck_AC_CylVsQuad(PlayState* play, CollisionCheckContext* colCtxt
ColliderCylinder* at = (ColliderCylinder*)colAT;
ColliderQuad* ac = (ColliderQuad*)colAC;
- if (at->dim.height > 0 && at->dim.radius > 0) {
+ if ((at->dim.height > 0) && (at->dim.radius > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2111,7 +2120,7 @@ void CollisionCheck_AC_CylVsSphere(PlayState* play, CollisionCheckContext* colCt
f32 overlapSize;
f32 centerDist;
- if (at->dim.radius > 0 && at->dim.height > 0) {
+ if ((at->dim.radius > 0) && (at->dim.height > 0)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2158,7 +2167,7 @@ void CollisionCheck_AC_TrisVsJntSph(PlayState* play, CollisionCheckContext* colC
ColliderTrisElement* atElem;
Vec3f hitPos;
- if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->count > 0) && (at->elements != NULL)) {
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
if (CollisionCheck_SkipBump(&acElem->info)) {
continue;
@@ -2196,7 +2205,7 @@ void CollisionCheck_AC_TrisVsCyl(PlayState* play, CollisionCheckContext* colCtxt
ColliderCylinder* ac = (ColliderCylinder*)colAC;
ColliderTrisElement* atElem;
- if (ac->dim.radius > 0 && ac->dim.height > 0 && at->count > 0 && at->elements != NULL) {
+ if ((ac->dim.radius > 0) && (ac->dim.height > 0) && (at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2230,7 +2239,7 @@ void CollisionCheck_AC_TrisVsTris(PlayState* play, CollisionCheckContext* colCtx
ColliderTris* ac = (ColliderTris*)colAC;
ColliderTrisElement* acElem;
- if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL) && (at->count > 0) && (at->elements != NULL)) {
for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) {
if (CollisionCheck_SkipBump(&acElem->info)) {
continue;
@@ -2265,7 +2274,7 @@ void CollisionCheck_AC_TrisVsQuad(PlayState* play, CollisionCheckContext* colCtx
ColliderQuad* ac = (ColliderQuad*)colAC;
ColliderTrisElement* atElem;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2304,7 +2313,7 @@ void CollisionCheck_AC_TrisVsSphere(PlayState* play, CollisionCheckContext* colC
ColliderSphere* ac = (ColliderSphere*)colAC;
Vec3f hitPos;
- if (at->count > 0 && at->elements != NULL) {
+ if ((at->count > 0) && (at->elements != NULL)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2336,7 +2345,7 @@ void CollisionCheck_AC_QuadVsJntSph(PlayState* play, CollisionCheckContext* colC
ColliderQuad* at = (ColliderQuad*)colAT;
ColliderJntSph* ac = (ColliderJntSph*)colAC;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2377,7 +2386,7 @@ void CollisionCheck_AC_QuadVsCyl(PlayState* play, CollisionCheckContext* colCtxt
ColliderQuad* at = (ColliderQuad*)colAT;
ColliderCylinder* ac = (ColliderCylinder*)colAC;
- if (ac->dim.height > 0 && ac->dim.radius > 0) {
+ if ((ac->dim.height > 0) && (ac->dim.radius > 0)) {
if (CollisionCheck_SkipBump(&ac->info)) {
return;
}
@@ -2423,7 +2432,7 @@ void CollisionCheck_AC_QuadVsTris(PlayState* play, CollisionCheckContext* colCtx
ColliderTris* ac = (ColliderTris*)colAC;
ColliderTrisElement* acElem;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2538,7 +2547,7 @@ void CollisionCheck_AC_SphereVsJntSph(PlayState* play, CollisionCheckContext* co
f32 overlapSize;
f32 centerDist;
- if (ac->count > 0 && ac->elements != NULL) {
+ if ((ac->count > 0) && (ac->elements != NULL)) {
if (CollisionCheck_SkipTouch(&at->info)) {
return;
}
@@ -2731,7 +2740,7 @@ void CollisionCheck_SetJntSphHitFX(PlayState* play, CollisionCheckContext* colCt
ColliderJntSphElement* element;
for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) {
- if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL &&
+ if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && (element->info.acHitInfo != NULL) &&
!(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2750,7 +2759,7 @@ void CollisionCheck_SetJntSphHitFX(PlayState* play, CollisionCheckContext* colCt
void CollisionCheck_SetCylHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderCylinder* cylinder = (ColliderCylinder*)collider;
- if ((cylinder->info.bumperFlags & BUMP_DRAW_HITMARK) && cylinder->info.acHitInfo != NULL &&
+ if ((cylinder->info.bumperFlags & BUMP_DRAW_HITMARK) && (cylinder->info.acHitInfo != NULL) &&
!(cylinder->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2769,7 +2778,7 @@ void CollisionCheck_SetTrisHitFX(PlayState* play, CollisionCheckContext* colCtxt
ColliderTrisElement* element;
for (element = tris->elements; element < &tris->elements[tris->count]; element++) {
- if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL &&
+ if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && (element->info.acHitInfo != NULL) &&
!(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2788,7 +2797,7 @@ void CollisionCheck_SetTrisHitFX(PlayState* play, CollisionCheckContext* colCtxt
void CollisionCheck_SetQuadHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderQuad* quad = (ColliderQuad*)collider;
- if ((quad->info.bumperFlags & BUMP_DRAW_HITMARK) && quad->info.acHitInfo != NULL &&
+ if ((quad->info.bumperFlags & BUMP_DRAW_HITMARK) && (quad->info.acHitInfo != NULL) &&
!(quad->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2804,7 +2813,7 @@ void CollisionCheck_SetQuadHitFX(PlayState* play, CollisionCheckContext* colCtxt
void CollisionCheck_SetSphereHitFX(PlayState* play, CollisionCheckContext* colCtxt, Collider* collider) {
ColliderSphere* sphere = (ColliderSphere*)collider;
- if ((sphere->info.bumperFlags & BUMP_DRAW_HITMARK) && sphere->info.acHitInfo != NULL &&
+ if ((sphere->info.bumperFlags & BUMP_DRAW_HITMARK) && (sphere->info.acHitInfo != NULL) &&
!(sphere->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) {
Vec3f hitPos;
@@ -2829,8 +2838,8 @@ void CollisionCheck_SetHitEffects(PlayState* play, CollisionCheckContext* colCtx
for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->acFlags & AC_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->acFlags & AC_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
sColChkApplyFuncs[colAC->shape](play, colCtxt, colAC);
@@ -2860,12 +2869,12 @@ void CollisionCheck_AC(PlayState* play, CollisionCheckContext* colCtxt, Collider
for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->acFlags & AC_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->acFlags & AC_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
- if ((colAC->acFlags & colAT->atFlags & AC_TYPE_ALL) && colAT != colAC) {
- if (!(colAT->atFlags & AT_SELF) && colAT->actor != NULL && colAC->actor == colAT->actor) {
+ if ((colAC->acFlags & colAT->atFlags & AC_TYPE_ALL) && (colAT != colAC)) {
+ if (!(colAT->atFlags & AT_SELF) && (colAT->actor != NULL) && (colAC->actor == colAT->actor)) {
continue;
}
sACVsFuncs[colAT->shape][colAC->shape](play, colCtxt, colAT, colAC);
@@ -2883,15 +2892,15 @@ void CollisionCheck_AC(PlayState* play, CollisionCheckContext* colCtxt, Collider
void CollisionCheck_AT(PlayState* play, CollisionCheckContext* colCtxt) {
Collider** col;
- if (colCtxt->colATCount == 0 || colCtxt->colACCount == 0) {
+ if ((colCtxt->colATCount == 0) || (colCtxt->colACCount == 0)) {
return;
}
for (col = &colCtxt->colAT[0]; col < &colCtxt->colAT[colCtxt->colATCount]; col++) {
Collider* colAC = *col;
- if (colAC != NULL && (colAC->atFlags & AT_ON)) {
- if (colAC->actor != NULL && colAC->actor->update == NULL) {
+ if ((colAC != NULL) && (colAC->atFlags & AT_ON)) {
+ if ((colAC->actor != NULL) && (colAC->actor->update == NULL)) {
continue;
}
CollisionCheck_AC(play, colCtxt, colAC);
@@ -2950,7 +2959,8 @@ void CollisionCheck_SetOCvsOC(PlayState* play, Collider* left, ColliderInfo* lef
right->ocFlags2 |= OC2_HIT_PLAYER;
}
- if (leftActor == NULL || rightActor == NULL || (left->ocFlags1 & OC1_NO_PUSH) || (right->ocFlags1 & OC1_NO_PUSH)) {
+ if ((leftActor == NULL) || (rightActor == NULL) || (left->ocFlags1 & OC1_NO_PUSH) ||
+ (right->ocFlags1 & OC1_NO_PUSH)) {
return;
}
@@ -3024,7 +3034,7 @@ void CollisionCheck_OC_JntSphVsJntSph(PlayState* play, CollisionCheckContext* co
ColliderJntSphElement* rightElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && right->count > 0 && right->elements != NULL &&
+ if ((left->count > 0) && (left->elements != NULL) && (right->count > 0) && (right->elements != NULL) &&
(left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3059,7 +3069,7 @@ void CollisionCheck_OC_JntSphVsCyl(PlayState* play, CollisionCheckContext* colCt
ColliderJntSphElement* leftElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) &&
+ if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3088,7 +3098,7 @@ void CollisionCheck_OC_JntSphVsSphere(PlayState* play, CollisionCheckContext* co
ColliderJntSphElement* leftElem;
f32 overlap;
- if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) &&
+ if ((left->count > 0) && (left->elements != NULL) && (left->base.ocFlags1 & OCELEM_ON) &&
(right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) {
for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) {
@@ -3244,11 +3254,11 @@ void CollisionCheck_OC(PlayState* play, CollisionCheckContext* colCtxt) {
ColChkVsFunc vsFunc;
for (left = colCtxt->colOC; left < colCtxt->colOC + colCtxt->colOCCount; left++) {
- if (*left == NULL || CollisionCheck_SkipOC(*left)) {
+ if ((*left == NULL) || CollisionCheck_SkipOC(*left)) {
continue;
}
for (right = left + 1; right < colCtxt->colOC + colCtxt->colOCCount; right++) {
- if (*right == NULL || CollisionCheck_SkipOC(*right) || CollisionCheck_Incompatible(*left, *right)) {
+ if ((*right == NULL) || CollisionCheck_SkipOC(*right) || CollisionCheck_Incompatible(*left, *right)) {
continue;
}
vsFunc = sOCVsFuncs[(*left)->shape][(*right)->shape];
@@ -3345,7 +3355,7 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colCtxt,
at = info->acHit;
atInfo = info->acHitInfo;
- if (at != NULL && atInfo != NULL && collider != NULL && info != NULL) {
+ if ((at != NULL) && (atInfo != NULL) && (collider != NULL) && (info != NULL)) {
damage = CollisionCheck_GetDamageAndEffectOnBumper(at, atInfo, collider, info, &effect);
if (CollisionCheck_GetToucherDamage(at, atInfo, collider, info) != 0) {
@@ -3365,7 +3375,7 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colCtxt,
collider->actor->colChkInfo.damageEffect = effect;
}
if (!(collider->acFlags & AC_HARD) ||
- ((collider->acFlags & AC_HARD) && atInfo->toucher.dmgFlags == 0x20000000)) {
+ ((collider->acFlags & AC_HARD) && (atInfo->toucher.dmgFlags == 0x20000000))) {
if (collider->actor->colChkInfo.damage < finalDamage) {
collider->actor->colChkInfo.damage = finalDamage;
}
@@ -3380,7 +3390,7 @@ void CollisionCheck_ApplyDamageJntSph(PlayState* play, CollisionCheckContext* co
ColliderJntSph* jntSph = (ColliderJntSph*)collider;
s32 i;
- if (jntSph->count > 0 && jntSph->elements != NULL) {
+ if ((jntSph->count > 0) && (jntSph->elements != NULL)) {
for (i = 0; i < jntSph->count; i++) {
CollisionCheck_ApplyDamage(play, colCtxt, &jntSph->base, &jntSph->elements[i].info);
}
@@ -3957,7 +3967,7 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
if (SQ(actorDotItemXZ) < (4.0f * SQXZ(itemStep) * radSqDiff)) {
return 0;
}
- if (SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff) > zero) {
+ if ((SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff)) > zero) {
intersect1 = intersect2 = 1;
} else {
intersect1 = 1;
@@ -3997,12 +4007,12 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
}
if (intersect2 == 0) {
- if (frac1 < 0.0f || 1.0f < frac1) {
+ if ((frac1 < 0.0f) || (1.0f < frac1)) {
return 0;
}
} else {
- test1 = (frac1 < 0.0f || 1.0f < frac1);
- test2 = (frac2 < 0.0f || 1.0f < frac2);
+ test1 = (frac1 < 0.0f) || (1.0f < frac1);
+ test2 = (frac2 < 0.0f) || (1.0f < frac2);
if (test1 && test2) {
return 0;
@@ -4016,14 +4026,14 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
}
if ((intersect1 != 0) &&
- ((frac1 * itemStep.y + actorToItem.y < 0.0f) || (height < frac1 * itemStep.y + actorToItem.y))) {
+ (((frac1 * itemStep.y + actorToItem.y) < 0.0f) || (height < (frac1 * itemStep.y + actorToItem.y)))) {
intersect1 = 0;
}
if ((intersect2 != 0) &&
- ((frac2 * itemStep.y + actorToItem.y < 0.0f) || (height < frac2 * itemStep.y + actorToItem.y))) {
+ (((frac2 * itemStep.y + actorToItem.y) < 0.0f) || (height < (frac2 * itemStep.y + actorToItem.y)))) {
intersect2 = 0;
}
- if (intersect1 == 0 && intersect2 == 0) {
+ if ((intersect1 == 0) && (intersect2 == 0)) {
return 0;
} else if ((intersect1 != 0) && (intersect2 != 0)) {
out1->x = frac1 * itemStep.x + actorToItem.x + actorPos->x;
diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c
index 0e682231f..46dfe189e 100644
--- a/src/code/z_common_data.c
+++ b/src/code/z_common_data.c
@@ -8,10 +8,10 @@ void SaveContext_Init(void) {
gSaveContext.save.playerForm = 0;
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
- gSaveContext.unk_3F46 = NA_BGM_GENERAL_SFX;
+ gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX;
gSaveContext.nextCutsceneIndex = 0xFFEF;
gSaveContext.cutsceneTrigger = 0;
- gSaveContext.unk_3F4D = 0;
+ gSaveContext.chamberCutsceneNum = 0;
gSaveContext.nextDayTime = 0xFFFF;
gSaveContext.skyboxTime = 0;
gSaveContext.dogIsLost = true;
@@ -19,6 +19,6 @@ void SaveContext_Init(void) {
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.zTargetSetting = 0;
}
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..00ee877e9 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -172,15 +171,15 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
case CS_MISC_CLOUDY_SKY:
if (isFirstFrame) {
- play->envCtx.unk_19 = 1;
- play->envCtx.unk_17 = 1;
- play->envCtx.unk_18 = 0;
- play->envCtx.unk_1A = 0x3C;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = 0;
- play->envCtx.unk_20 = 1;
- play->envCtx.unk_24 = 0x3C;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ play->envCtx.changeSkyboxState = 1;
+ play->envCtx.skyboxConfig = 1;
+ play->envCtx.changeSkyboxNextConfig = 0;
+ play->envCtx.changeSkyboxTimer = 60;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = 0;
+ play->envCtx.changeLightNextConfig = 1;
+ play->envCtx.changeDuration = 60;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
break;
@@ -202,10 +201,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 +309,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;
@@ -328,8 +327,7 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) {
case CS_MISC_MOON_CRASH_SKYBOX:
if (isFirstFrame) {
- // skyboxConfig
- play->envCtx.unk_17 = 0xD;
+ play->envCtx.skyboxConfig = 0xD;
}
break;
@@ -372,10 +370,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..e6a814e2a 100644
--- a/src/code/z_draw.c
+++ b/src/code/z_draw.c
@@ -115,9 +115,9 @@ void GetItem_DrawWallet(PlayState* play, s16 drawId);
void GetItem_DrawRemains(PlayState* play, s16 drawId);
typedef struct {
- /* 0x00 */ void (*drawFunc)(PlayState*, s16);
- /* 0x04 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*)
-} DrawItemTableEntry; // size = 0x24
+ /* 0x0 */ void (*drawFunc)(PlayState*, s16);
+ /* 0x4 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*)
+} DrawItemTableEntry; // size = 0x24
static DrawItemTableEntry sDrawItemTable[] = {
// GID_BOTTLE, OBJECT_GI_BOTTLE
@@ -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..775db80e1 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);
}
@@ -573,16 +561,16 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem
vtx[0].v = baseVtx;
vtx[1].v = baseVtx;
- vtx[0].v.ob[0] = func_80086814(sp158.x);
- vtx[0].v.ob[1] = func_80086814(sp158.y);
- vtx[0].v.ob[2] = func_80086814(sp158.z);
+ vtx[0].v.ob[0] = Math_FNearbyIntF(sp158.x);
+ vtx[0].v.ob[1] = Math_FNearbyIntF(sp158.y);
+ vtx[0].v.ob[2] = Math_FNearbyIntF(sp158.z);
vtx[0].v.cn[0] = sp148.r;
vtx[0].v.cn[1] = sp148.g;
vtx[0].v.cn[2] = sp148.b;
vtx[0].v.cn[3] = sp148.a;
- vtx[1].v.ob[0] = func_80086814(sp14C.x);
- vtx[1].v.ob[1] = func_80086814(sp14C.y);
- vtx[1].v.ob[2] = func_80086814(sp14C.z);
+ vtx[1].v.ob[0] = Math_FNearbyIntF(sp14C.x);
+ vtx[1].v.ob[1] = Math_FNearbyIntF(sp14C.y);
+ vtx[1].v.ob[2] = Math_FNearbyIntF(sp14C.z);
vtx[1].v.cn[0] = sp144.r;
vtx[1].v.cn[1] = sp144.g;
vtx[1].v.cn[2] = sp144.b;
@@ -618,17 +606,17 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem
vtx[j1].v = baseVtx;
vtx[j2].v = baseVtx;
- vtx[j1].v.ob[0] = func_80086814(sp158.x);
- vtx[j1].v.ob[1] = func_80086814(sp158.y);
- vtx[j1].v.ob[2] = func_80086814(sp158.z);
+ vtx[j1].v.ob[0] = Math_FNearbyIntF(sp158.x);
+ vtx[j1].v.ob[1] = Math_FNearbyIntF(sp158.y);
+ vtx[j1].v.ob[2] = Math_FNearbyIntF(sp158.z);
vtx[j1].v.cn[0] = func_800B0A24(sp1A4.r, sp19C.r, temp_f28);
vtx[j1].v.cn[1] = func_800B0A24(sp1A4.g, sp19C.g, temp_f28);
vtx[j1].v.cn[2] = func_800B0A24(sp1A4.b, sp19C.b, temp_f28);
vtx[j1].v.cn[3] = func_800B0A24(sp1A4.a, sp19C.a, temp_f28);
- vtx[j2].v.ob[0] = func_80086814(sp14C.x);
- vtx[j2].v.ob[1] = func_80086814(sp14C.y);
- vtx[j2].v.ob[2] = func_80086814(sp14C.z);
+ vtx[j2].v.ob[0] = Math_FNearbyIntF(sp14C.x);
+ vtx[j2].v.ob[1] = Math_FNearbyIntF(sp14C.y);
+ vtx[j2].v.ob[2] = Math_FNearbyIntF(sp14C.z);
vtx[j2].v.cn[0] = func_800B0A24(sp1A0.r, sp198.r, temp_f28);
vtx[j2].v.cn[1] = func_800B0A24(sp1A0.g, sp198.g, temp_f28);
vtx[j2].v.cn[2] = func_800B0A24(sp1A0.b, sp198.b, temp_f28);
@@ -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);
@@ -765,7 +753,7 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
j = 0;
- for (i = 0; i < this->numElements - 1; i++) {
+ for (i = 0; i < this->numElements - 1; i++, j += 4) {
if (this->drawMode == 1) {
alphaRatio = (f32)this->elements[i].timer / (f32)this->elemDuration;
gDPSetPrimColor(POLY_XLU_DISP++, 0x00, 0x80, this->altPrimColor.r, this->altPrimColor.g,
@@ -773,45 +761,43 @@ void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this,
gDPPipeSync(POLY_XLU_DISP++);
}
- if (1) {} // Necessary to match
-
gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- if (this->flags & 4) {
- sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) * 0.5f;
- sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) * 0.5f;
- sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) * 0.5f;
- sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) * 0.5f;
- sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) * 0.5f;
- sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) * 0.5f;
-
- Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
- scale = sqrtf(SQXYZ(sp198));
-
- if (fabsf(scale) > 0.0005f) {
- scale = 1.0f / scale;
- Math_Vec3f_Scale(&sp198, scale);
-
- SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
- SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
- SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
- SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
- SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
-
- mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
- if (mtx == NULL) {
- break;
- }
-
- gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
- gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
- gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- }
+ if (!(this->flags & 4)) {
+ continue;
}
- j += 4;
+ sp1B0.x = ((f32)vtx[4 * i + 0].v.ob[0] + (f32)vtx[4 * i + 1].v.ob[0]) / 2.0f;
+ sp1B0.y = ((f32)vtx[4 * i + 0].v.ob[1] + (f32)vtx[4 * i + 1].v.ob[1]) / 2.0f;
+ sp1B0.z = ((f32)vtx[4 * i + 0].v.ob[2] + (f32)vtx[4 * i + 1].v.ob[2]) / 2.0f;
+ sp1A4.x = ((f32)vtx[4 * i + 2].v.ob[0] + (f32)vtx[4 * i + 3].v.ob[0]) / 2.0f;
+ sp1A4.y = ((f32)vtx[4 * i + 2].v.ob[1] + (f32)vtx[4 * i + 3].v.ob[1]) / 2.0f;
+ sp1A4.z = ((f32)vtx[4 * i + 2].v.ob[2] + (f32)vtx[4 * i + 3].v.ob[2]) / 2.0f;
+
+ Math_Vec3f_Diff(&sp1A4, &sp1B0, &sp198);
+ scale = sqrtf(SQXYZ(sp198));
+
+ if (fabsf(scale) > 0.0005f) {
+ scale = 1.0f / scale;
+ Math_Vec3f_Scale(&sp198, scale);
+
+ SkinMatrix_SetTranslate(&sp154, sp1B0.x, sp1B0.y, sp1B0.z);
+ SkinMatrix_SetRotateAroundVec(&sp114, 0x3FFF, sp198.x, sp198.y, sp198.z);
+ SkinMatrix_MtxFMtxFMult(&sp154, &sp114, &spD4);
+ SkinMatrix_SetTranslate(&sp154, -sp1B0.x, -sp1B0.y, -sp1B0.z);
+ SkinMatrix_MtxFMtxFMult(&spD4, &sp154, &sp94);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp94);
+ if (mtx == NULL) {
+ break;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_XLU_DISP++, &vtx[j], 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
}
}
@@ -938,7 +924,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 +978,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.c b/src/code/z_effect.c
index b4a76380e..60a98c4d9 100644
--- a/src/code/z_effect.c
+++ b/src/code/z_effect.c
@@ -187,33 +187,31 @@ void Effect_DrawAll(GraphicsContext* gfxCtx) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {
- if (gfxCtx) {}
- } // necessary to match
- if (sEffectContext.blures[i].status.active) {
- sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
}
- if (1) {} // necessary to match
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (sEffectContext.tireMarks[i].status.active) {
- sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
}
+ sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
}
}
@@ -221,38 +219,38 @@ void Effect_UpdateAll(PlayState* play) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.sparks[i].status.active) {
- if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
- Effect_Destroy(play, i);
- }
+ if (!sEffectContext.sparks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
+ Effect_Destroy(play, i);
}
}
for (i = 0; i < BLURE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.blures[i].status.active) {
- if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT);
- }
+ if (!sEffectContext.blures[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT);
}
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.shieldParticles[i].status.active) {
- if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
- }
+ if (!sEffectContext.shieldParticles[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT);
}
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (1) {} // necessary to match
- if (sEffectContext.tireMarks[i].status.active) {
- if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
- Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
- }
+ if (!sEffectContext.tireMarks[i].status.active) {
+ continue;
+ }
+ if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
+ Effect_Destroy(play, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
}
}
}
diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c
index 775b68f01..186608729 100644
--- a/src/code/z_effect_soft_sprite.c
+++ b/src/code/z_effect_soft_sprite.c
@@ -273,6 +273,7 @@ void EffectSS_DrawAllParticles(PlayState* play) {
s16 func_800B096C(s16 arg0, s16 arg1, s32 arg2) {
s16 ret = (arg2 == 0) ? arg1 : arg0 + (s32)((arg1 - arg0) / (f32)arg2);
+
return ret;
}
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..886c3c942 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -127,7 +127,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
break;
case ITEM00_RECOVERY_HEART:
- this->actor.home.rot.z = randPlusMinusPoint5Scaled(0xFFFF);
+ this->actor.home.rot.z = Rand_CenteredFloat(0xFFFF);
shadowOffset = 430.0f;
Actor_SetScale(&this->actor, 0.02f);
this->unk154 = 0.02f;
@@ -381,9 +381,9 @@ void func_800A6650(EnItem00* this, PlayState* play) {
}
if ((play->gameplayFrames & 1) != 0) {
- pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f);
- pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f);
- pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f);
+ pos.x = this->actor.world.pos.x + Rand_CenteredFloat(10.0f);
+ pos.y = this->actor.world.pos.y + Rand_CenteredFloat(10.0f);
+ pos.z = this->actor.world.pos.z + Rand_CenteredFloat(10.0f);
EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor);
}
@@ -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);
@@ -956,7 +956,7 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) {
}
spawnedActor->speed = 2.0f;
spawnedActor->gravity = -0.9f;
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000);
Actor_SetScale(spawnedActor, 0.0f);
((EnItem00*)spawnedActor)->actionFunc = func_800A6780;
((EnItem00*)spawnedActor)->unk152 = 0xDC;
@@ -1011,7 +1011,7 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) {
} else {
spawnedActor->gravity = -0.9f;
}
- spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000);
spawnedActor->flags |= 0x10;
}
}
diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c
index 2575899ca..121957396 100644
--- a/src/code/z_eventmgr.c
+++ b/src/code/z_eventmgr.c
@@ -36,7 +36,7 @@ ActorCutscene sGlobalCutsceneList[] = {
typedef enum {
/* 0 */ CS_START_0,
/* 1 */ CS_START_1,
- /* 2 */ CS_START_2,
+ /* 2 */ CS_START_2
} ActorCutsceneStartMethod;
typedef struct {
@@ -371,7 +371,7 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
Camera* retCam;
s32 csType = 0;
- if ((csId < 0) || (sCutsceneMgr.csId != CS_ID_NONE)) {
+ if ((csId <= CS_ID_NONE) || (sCutsceneMgr.csId != CS_ID_NONE)) {
return csId;
}
@@ -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);
}
@@ -437,7 +437,7 @@ s16 CutsceneManager_Start(s16 csId, Actor* actor) {
s16 CutsceneManager_Stop(s16 csId) {
ActorCutscene* csEntry;
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return csId;
}
@@ -468,28 +468,28 @@ ActorCutscene* CutsceneManager_GetCutsceneEntry(s16 csId) {
}
s16 CutsceneManager_GetAdditionalCsId(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return CS_ID_NONE;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->additionalCsId;
}
s16 CutsceneManager_GetLength(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->length;
}
s16 CutsceneManager_GetCutsceneScriptIndex(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->scriptIndex;
}
s16 CutsceneManager_GetCutsceneCustomValue(s16 csId) {
- if (csId < 0) {
+ if (csId <= CS_ID_NONE) {
return -1;
}
return CutsceneManager_GetCutsceneEntryImpl(csId)->customValue;
diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c
index bc07df883..185373e06 100644
--- a/src/code/z_fbdemo_circle.c
+++ b/src/code/z_fbdemo_circle.c
@@ -2,7 +2,7 @@
typedef enum {
/* 0 */ TRANS_CIRCLE_DIR_IN,
- /* 1 */ TRANS_CIRCLE_DIR_OUT,
+ /* 1 */ TRANS_CIRCLE_DIR_OUT
} TransitionCircleDirection;
Gfx sTransCircleSetupDL[] = {
@@ -82,8 +82,8 @@ void TransitionCircle_SetType(void* thisx, s32 type) {
void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, s32 arg3, s32 masks, s32 maskt,
f32 arg6) {
Gfx* gfx = *gfxp;
- s32 xh = D_801FBBCC;
- s32 yh = D_801FBBCE;
+ s32 xh = gCfbWidth;
+ s32 yh = gCfbHeight;
s32 width = 1 << masks;
s32 height = 1 << maskt;
f32 s;
diff --git a/src/code/z_fbdemo_dlftbls.c b/src/code/z_fbdemo_dlftbls.c
index 9d3685a45..48d424813 100644
--- a/src/code/z_fbdemo_dlftbls.c
+++ b/src/code/z_fbdemo_dlftbls.c
@@ -1,30 +1,38 @@
#include "global.h"
-#include "initvars.h"
-#include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe4/z_fbdemo_wipe4.h"
-#include "overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.h"
-#define TRANSITION_OVERLAY(name, filename) \
- { \
- { 0, 0 }, SEGMENT_START(ovl_##filename), SEGMENT_END(ovl_##filename), SEGMENT_ROM_START(ovl_##filename), \
- SEGMENT_ROM_END(ovl_##filename), &name##_InitVars, sizeof(name) \
- }
+// InitVars and Linker symbol declarations (used in the table below)
+#define DEFINE_TRANSITION(_enumValue, structName, _instanceName, name) \
+ extern TransitionInit structName##_InitVars; \
+ DECLARE_OVERLAY_SEGMENT(name)
-#define TRANSITION_OVERLAY_INTERNAL(name) \
- { { 0, 0 }, NULL, NULL, 0, 0, &name##_InitVars, sizeof(name) }
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, _instanceName) extern TransitionInit structName##_InitVars;
-#define TRANSITION_OVERLAY_UNSET \
- { 0 }
+#include "tables/transition_table.h"
+
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
+#define DEFINE_TRANSITION(_enumValue, structName, _instanceName, name) \
+ { \
+ { 0, 0 }, \
+ SEGMENT_START(ovl_##name), \
+ SEGMENT_END(ovl_##name), \
+ SEGMENT_ROM_START(ovl_##name), \
+ SEGMENT_ROM_END(ovl_##name), \
+ &structName##_InitVars, \
+ sizeof(structName), \
+ },
+
+#define DEFINE_TRANSITION_INTERNAL(_enumValue, structName, _instanceName) \
+ { { 0, 0 }, NULL, NULL, 0, 0, &structName##_InitVars, sizeof(structName) },
TransitionOverlay gTransitionOverlayTable[] = {
- TRANSITION_OVERLAY_INTERNAL(TransitionFade), TRANSITION_OVERLAY(TransitionTriforce, fbdemo_triforce),
- TRANSITION_OVERLAY(TransitionWipe1, fbdemo_wipe1), TRANSITION_OVERLAY(TransitionWipe3, fbdemo_wipe3),
- TRANSITION_OVERLAY(TransitionWipe4, fbdemo_wipe4), TRANSITION_OVERLAY_INTERNAL(TransitionCircle),
- TRANSITION_OVERLAY(TransitionWipe5, fbdemo_wipe5),
+#include "tables/transition_table.h"
};
+#undef DEFINE_TRANSITION
+#undef DEFINE_TRANSITION_INTERNAL
+
void Transition_Init(TransitionContext* transitionCtx) {
TransitionOverlay* overlayEntry;
ptrdiff_t relocOffset;
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index 114e62cc7..5565bc876 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -142,7 +142,8 @@ 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_game_dlftbls.c b/src/code/z_game_dlftbls.c
index 1b82705f5..7336b01f6 100644
--- a/src/code/z_game_dlftbls.c
+++ b/src/code/z_game_dlftbls.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "overlays/gamestates/ovl_select/z_select.h"
#include "overlays/gamestates/ovl_title/z_title.h"
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index d0e5e45f2..c3c6819be 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -49,7 +49,7 @@ void GameOver_Update(PlayState* play) {
}
}
- gSaveContext.unk_3DC0 = 2000;
+ gSaveContext.nayrusLoveTimer = 2000;
gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
diff --git a/src/code/z_horse.c b/src/code/z_horse.c
index 976ea2948..ac0142fae 100644
--- a/src/code/z_horse.c
+++ b/src/code/z_horse.c
@@ -1,21 +1,233 @@
#include "global.h"
+#include "z64horse.h"
+#include "overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h"
+#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3940.s")
+s32 Horse_GetJumpingFencePathIndex(PlayState* play) {
+ Actor* actor;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F39B4.s")
+ for (actor = NULL;; actor = actor->next) {
+ actor = SubS_FindActor(play, actor, ACTORCAT_PROP, ACTOR_BG_UMAJUMP);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3A64.s")
+ if (actor == NULL) {
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B2C.s")
+ if (actor->params == BG_UMAJUMP_TYPE_2) {
+ return ((BgUmajump*)actor)->pathIndex;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3B68.s")
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3C44.s")
+// unused
+s32 Horse_CopyPointFromPathList(PlayState* play, s32 pathIndex, s32 pointIndex, Vec3s* dst, s16* arg4) {
+ Path* path = &play->setupPathList[pathIndex];
+ Vec3s* points;
+ s32 count = path->count;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F3ED4.s")
+ dst->x = 0;
+ dst->y = 0;
+ dst->z = 0;
+ *arg4 = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F40A0.s")
+ if (count == 0) {
+ return false;
+ }
+ if (pointIndex >= count) {
+ return false;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F415C.s")
+ points = Lib_SegmentedToVirtual(path->points);
+ points += pointIndex;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_horse/func_800F41E4.s")
+ dst->x = points->x;
+ dst->y = points->y;
+ dst->z = points->z;
+ *arg4 = 0;
+
+ return true;
+}
+
+typedef struct HorseValidScene {
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ s16 sceneLayerMinusOne;
+} HorseValidScene; // size = 0x4
+
+HorseValidScene sHorseValidScenes[] = {
+ { SCENE_00KEIKOKU, 0 }, // Termina Field
+ { SCENE_24KEMONOMITI, 0 }, // Road to southern swap
+ { SCENE_F01, 0 }, // Romani ranch
+ { SCENE_KOEPONARACE, 0 }, // Gorman track
+ { SCENE_20SICHITAI, 0 }, // Southern swamp poisoned
+ { SCENE_20SICHITAI2, 0 }, // Souther swamp clear
+ { SCENE_30GYOSON, 0 }, // Great bay coast
+ { SCENE_31MISAKI, 0 }, // Zora cape
+ { SCENE_ROMANYMAE, 0 }, // Milk road
+ { SCENE_IKANAMAE, 0 }, // Road to Ikana
+ { SCENE_13HUBUKINOMITI, 0 }, // Path to Mountain Village
+};
+
+s32 Horse_IsValidSpawn(s16 sceneId) {
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidScenes); i++) {
+ if (sceneId == sHorseValidScenes[i].sceneId) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Horse_ResetHorseData(PlayState* play) {
+ gSaveContext.save.saveInfo.horseData.sceneId = SCENE_F01;
+ gSaveContext.save.saveInfo.horseData.pos.x = -1420;
+ gSaveContext.save.saveInfo.horseData.pos.y = 257;
+ gSaveContext.save.saveInfo.horseData.pos.z = -1285;
+ gSaveContext.save.saveInfo.horseData.yaw = 0x2AAA;
+}
+
+s32 gHorseIsMounted = false;
+s32 D_801BDAA0 = false;
+s32 gHorsePlayedEponasSong = false;
+
+HorseValidScene sHorseValidSceneLayers[] = {
+ { SCENE_00KEIKOKU, 5 - 1 }, // Termina Field - First Cycle
+ { SCENE_30GYOSON, 1 - 1 }, // Great Bay Coast - Post-Gyorg
+ { SCENE_31MISAKI, 1 - 1 }, // Zora Cape - Post-Gyorg
+ { SCENE_13HUBUKINOMITI, 1 - 1 }, // Path to Mountain Village - Post-Goht
+};
+
+s32 Horse_IsValidSceneLayer(PlayState* play, Player* player) {
+ s32 i;
+
+ if (gSaveContext.sceneLayer == 0) {
+ return true;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sHorseValidSceneLayers); i++) {
+ if ((sHorseValidSceneLayers[i].sceneId == play->sceneId) &&
+ (gSaveContext.sceneLayer == sHorseValidSceneLayers[i].sceneLayerMinusOne + 1)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void Horse_SpawnOverworld(PlayState* play, Player* player) {
+ if (!Horse_IsValidSceneLayer(play, player)) {
+ return;
+ }
+
+ if (gHorseIsMounted && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ s32 pad;
+ Vec3f pos = player->actor.world.pos;
+ f32 yIntersect;
+ CollisionPoly* poly;
+ s32 pad2[3];
+
+ pos.y += 5.0f;
+ yIntersect = BgCheck_EntityRaycastFloor1(&play->colCtx, &poly, &pos);
+ if (yIntersect == BGCHECK_Y_MIN) {
+ yIntersect = player->actor.world.pos.y;
+ }
+
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, yIntersect,
+ player->actor.world.pos.z, player->actor.shape.rot.x, player->actor.shape.rot.y,
+ player->actor.shape.rot.z, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_11));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == gSaveContext.save.saveInfo.horseData.sceneId) && CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ if (Horse_IsValidSpawn(gSaveContext.save.saveInfo.horseData.sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, gSaveContext.save.saveInfo.horseData.pos.x,
+ gSaveContext.save.saveInfo.horseData.pos.y, gSaveContext.save.saveInfo.horseData.pos.z, 0,
+ gSaveContext.save.saveInfo.horseData.yaw, 0, ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else {
+ Horse_ResetHorseData(play);
+ }
+ } else if ((play->sceneId == SCENE_F01) && !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1420.0f, 257.0f, -1285.0f, 0, 0x2AAA, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && Horse_IsValidSpawn(play->sceneId)) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, player->actor.world.pos.x, player->actor.world.pos.y,
+ player->actor.world.pos.z, 0, player->actor.shape.rot.y, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_2));
+ }
+}
+
+void Horse_SpawnMinigame(PlayState* play, Player* player) {
+ if ((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1262.0f, -106.0f, 470.0f, 0, 0x7FFF, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_13));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ } else if ((play->sceneId == SCENE_KOEPONARACE) &&
+ ((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2))) {
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1741.0f, -106.0f, -641.0f, 0, -0x4FA4, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_1));
+ } else if ((gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 0)) && (Cutscene_GetSceneLayer(play) != 0) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) {
+ player->rideActor = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HORSE, -1106.0f, 260.0f, -1185.0f, 0, 0x13, 0,
+ ENHORSE_PARAMS(ENHORSE_PARAM_4000, ENHORSE_7));
+ Actor_MountHorse(play, player, player->rideActor);
+ Actor_SetCameraHorseSetting(play, player);
+ }
+}
+
+void Horse_Spawn(PlayState* play, Player* player) {
+ if (((play->sceneId == SCENE_KOEPONARACE) &&
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_START)) ||
+ ((play->sceneId == SCENE_F01) && (((gSaveContext.sceneLayer == 1)) || (gSaveContext.sceneLayer == 5)) &&
+ (player->transformation == PLAYER_FORM_HUMAN)) ||
+ ((play->sceneId == SCENE_KOEPONARACE) &&
+ (((GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_3)) ||
+ (GET_WEEKEVENTREG_HORSE_RACE_STATE == WEEKEVENTREG_HORSE_RACE_STATE_2)))) {
+ // Gorman Track and horse state is either STATE_START, STATE_2 or STATE_3
+ // or Romani Ranch, Player is Human and scene layer is either 1 or 5
+ Horse_SpawnMinigame(play, player);
+ } else {
+ Horse_SpawnOverworld(play, player);
+ }
+
+ D_801BDAA0 = false;
+}
+
+void Horse_RotateToPoint(Actor* actor, Vec3f* pos, s16 turnYaw) {
+ s16 yaw = Math_Vec3f_Yaw(&actor->world.pos, pos) - actor->world.rot.y;
+
+ if (yaw > turnYaw) {
+ actor->world.rot.y += turnYaw;
+ } else if (yaw < -turnYaw) {
+ actor->world.rot.y -= turnYaw;
+ } else {
+ actor->world.rot.y += yaw;
+ }
+
+ actor->shape.rot.y = actor->world.rot.y;
+}
+
+s32 Horse_IsActive(PlayState* play, ActorContext* actorCtx) {
+ Actor* bgActor = actorCtx->actorLists[ACTORCAT_BG].first;
+
+ if (bgActor != NULL) {
+ while (true) {
+ if ((bgActor->update != NULL) && (bgActor->init == NULL)) {
+ if (Object_IsLoaded(&play->objectCtx, bgActor->objBankIndex)) {
+ if ((bgActor->id == ACTOR_EN_HORSE) && (((EnHorse*)bgActor)->action != ENHORSE_ACTION_INACTIVE)) {
+ return true;
+ }
+ }
+ }
+ bgActor = bgActor->next;
+ if (bgActor == NULL) {
+ break;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index 59fde2f2d..1d2046e57 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64shrink_window.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
@@ -40,13 +39,13 @@ void KaleidoScopeCall_Update(PlayState* play) {
if (ShrinkWindow_Letterbox_GetSize() == 0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
}
} else if (pauseCtx->state == PAUSE_STATE_GAMEOVER_0) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_SETUP;
pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
} else if ((pauseCtx->state == PAUSE_STATE_OPENING_1) || (pauseCtx->state == PAUSE_STATE_GAMEOVER_1) ||
(pauseCtx->state == PAUSE_STATE_OWLWARP_1)) {
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 148aad84e..130fa88db 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -145,7 +145,7 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->cursorPoint[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
- pauseCtx->pageSwitchTimer = 0;
+ pauseCtx->pageSwitchInputTimer = 0;
pauseCtx->cursorItem[PAUSE_ITEM] = PAUSE_ITEM_NONE;
pauseCtx->cursorItem[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c
index d6d38f9d6..2191498a3 100644
--- a/src/code/z_kankyo.c
+++ b/src/code/z_kankyo.c
@@ -2,7 +2,7 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F5090.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/func_800F50D4.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Init.s")
diff --git a/src/code/z_lib.c b/src/code/z_lib.c
index 136918765..f3e67e5f3 100644
--- a/src/code/z_lib.c
+++ b/src/code/z_lib.c
@@ -348,9 +348,9 @@ void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) {
}
void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest) {
- dest->x = randPlusMinusPoint5Scaled(scale) + orig->x;
- dest->y = randPlusMinusPoint5Scaled(scale) + orig->y;
- dest->z = randPlusMinusPoint5Scaled(scale) + orig->z;
+ dest->x = Rand_CenteredFloat(scale) + orig->x;
+ dest->y = Rand_CenteredFloat(scale) + orig->y;
+ dest->z = Rand_CenteredFloat(scale) + orig->z;
}
void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) {
diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c
index d6f2edf2a..7226a6719 100644
--- a/src/code/z_lifemeter.c
+++ b/src/code/z_lifemeter.c
@@ -16,14 +16,14 @@ s16 sBeatingHeartsDDEnv[3];
s16 sHeartsDDPrim[2][3];
s16 sHeartsDDEnv[2][3];
-TexturePtr HeartTextures[] = {
+static TexturePtr sHeartTextures[] = {
gHeartFullTex, gHeartQuarterTex, gHeartQuarterTex, gHeartQuarterTex,
gHeartQuarterTex, gHeartQuarterTex, gHeartHalfTex, gHeartHalfTex,
gHeartHalfTex, gHeartHalfTex, gHeartHalfTex, gHeartThreeQuarterTex,
gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex,
};
-TexturePtr HeartDDTextures[] = {
+static TexturePtr sHeartDDTextures[] = {
gDefenseHeartFullTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex,
gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex,
gDefenseHeartHalfTex, gDefenseHeartHalfTex, gDefenseHeartHalfTex,
@@ -283,7 +283,7 @@ void LifeMeter_Draw(PlayState* play) {
if (i < fullHeartCount) {
heartTex = gHeartFullTex;
} else if (i == fullHeartCount) {
- heartTex = HeartTextures[fractionHeartCount];
+ heartTex = sHeartTextures[fractionHeartCount];
} else {
heartTex = gHeartEmptyTex;
}
@@ -323,7 +323,7 @@ void LifeMeter_Draw(PlayState* play) {
if (i < fullHeartCount) {
heartTex = gDefenseHeartFullTex;
} else if (i == fullHeartCount) {
- heartTex = HeartDDTextures[fractionHeartCount];
+ heartTex = sHeartDDTextures[fractionHeartCount];
} else {
heartTex = gDefenseHeartEmptyTex;
}
@@ -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..e82c3a9b2 100644
--- a/src/code/z_lights.c
+++ b/src/code/z_lights.c
@@ -190,12 +190,12 @@ void Lights_BindDirectional(Lights* lights, LightParams* params, void* unused) {
* available in the Lights group. This is at most 7 slots for a new group, but could be less.
*/
void Lights_BindAll(Lights* lights, LightNode* listHead, Vec3f* refPos, PlayState* play) {
- static LightsPosBindFunc posBindFuncs[] = {
+ static LightsPosBindFunc sPosBindFuncs[] = {
Lights_BindPoint,
(LightsPosBindFunc)Lights_BindDirectional,
Lights_BindPoint,
};
- static LightsBindFunc dirBindFuncs[] = {
+ static LightsBindFunc sDirBindFuncs[] = {
Lights_BindPointWithReference,
(LightsBindFunc)Lights_BindDirectional,
Lights_BindPointWithReference,
@@ -204,12 +204,12 @@ void Lights_BindAll(Lights* lights, LightNode* listHead, Vec3f* refPos, PlayStat
if (listHead != NULL) {
if ((refPos == NULL) && (lights->enablePosLights == 1)) {
do {
- posBindFuncs[listHead->info->type](lights, &listHead->info->params, play);
+ sPosBindFuncs[listHead->info->type](lights, &listHead->info->params, play);
listHead = listHead->next;
} while (listHead != NULL);
} else {
do {
- dirBindFuncs[listHead->info->type](lights, &listHead->info->params, refPos);
+ sDirBindFuncs[listHead->info->type](lights, &listHead->info->params, refPos);
listHead = listHead->next;
} while (listHead != NULL);
}
@@ -338,7 +338,7 @@ Lights* Lights_NewAndDraw(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8
lights->l.a.l.col[0] = lights->l.a.l.colc[0] = ambientR;
lights->l.a.l.col[1] = lights->l.a.l.colc[1] = ambientG;
lights->l.a.l.col[2] = lights->l.a.l.colc[2] = ambientB;
- lights->enablePosLights = 0;
+ lights->enablePosLights = false;
lights->numLights = numLights;
for (i = 0; i < numLights; i++) {
@@ -360,13 +360,10 @@ Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambient
lights = GRAPH_ALLOC(gfxCtx, sizeof(Lights));
- lights->l.a.l.col[0] = ambientR;
- lights->l.a.l.colc[0] = ambientR;
- lights->l.a.l.col[1] = ambientG;
- lights->l.a.l.colc[1] = ambientG;
- lights->l.a.l.col[2] = ambientB;
- lights->l.a.l.colc[2] = ambientB;
- lights->enablePosLights = 0;
+ lights->l.a.l.col[0] = lights->l.a.l.colc[0] = ambientR;
+ lights->l.a.l.col[1] = lights->l.a.l.colc[1] = ambientG;
+ lights->l.a.l.col[2] = lights->l.a.l.colc[2] = ambientB;
+ lights->enablePosLights = false;
lights->numLights = 0;
return lights;
@@ -394,7 +391,7 @@ void Lights_GlowCheck(PlayState* play) {
s32 screenPosX = PROJECTED_TO_SCREEN_X(projectedPos, invW);
s32 screenPosY = PROJECTED_TO_SCREEN_Y(projectedPos, invW);
s32 wZ = (s32)((projectedPos.z * invW) * 16352.0f) + 16352;
- s32 zBuf = func_80178A94(screenPosX, screenPosY);
+ s32 zBuf = SysCfb_GetZBufferInt(screenPosX, screenPosY);
if (wZ < zBuf) {
params->drawGlow = 1;
@@ -414,7 +411,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_message.c b/src/code/z_message.c
index 8681967e6..38f44d9ec 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -5,6 +5,27 @@
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
#if 0
+#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage,
+
+u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, _metMessage, metFlag) metFlag,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, _completedMessage, completedFlag) completedFlag,
+
+u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
s16 D_801D02D8[15] = {
ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect
@@ -20,8 +41,6 @@ s32 D_801D02F8[15] = { 0,1,2,3,4,0,1,0,0,0,0,0,1,1,0 };
#endif
-extern u16 D_801C6AB8[];
-extern u16 D_801C6B28[];
extern s16 D_801D02D8[];
extern s32 D_801D02F8[];
extern s16 D_801F6B0C;
@@ -365,19 +384,19 @@ void func_80151A68(PlayState* play, u16 textId) {
}
}
-void func_80151BB4(PlayState* play, u8 arg1) {
+void Message_BombersNotebookQueueEvent(PlayState* play, u8 event) {
MessageContext* msgCtx = &play->msgCtx;
- u8 temp = arg1;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) {
- msgCtx->unk120B2[msgCtx->unk120B1] = temp;
- msgCtx->unk120B1++;
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
+ msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
+ msgCtx->bombersNotebookEventQueueCount++;
}
- } else if (arg1 >= 20) {
- if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) {
- msgCtx->unk120B2[msgCtx->unk120B1] = temp;
- msgCtx->unk120B1++;
+ } else if (event >= BOMBERS_NOTEBOOK_PERSON_MAX) {
+ // Non MET events are processed even if the player does not have the notebook yet
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) {
+ msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event;
+ msgCtx->bombersNotebookEventQueueCount++;
}
}
}
@@ -386,16 +405,22 @@ u32 func_80151C9C(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
while (true) {
- if (msgCtx->unk120B1 == 0) {
+ if (msgCtx->bombersNotebookEventQueueCount == 0) {
return false;
}
- msgCtx->unk120B1--;
+ msgCtx->bombersNotebookEventQueueCount--;
- if (!CHECK_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]])) {
- SET_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]]);
+ if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]])) {
+ SET_WEEKEVENTREG(gBombersNotebookWeekEventFlags
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
- if ((D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]] != 0) && CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- Message_ContinueTextbox(play, D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]]);
+ if ((sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]] != 0) &&
+ CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ Message_ContinueTextbox(
+ play, sBombersNotebookEventMessages
+ [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]);
play_sound(NA_SE_SY_SCHEDULE_WRITE);
return true;
}
@@ -476,7 +501,7 @@ u8 Message_GetState(MessageContext* msgCtx) {
if (msgCtx->msgMode == 0x40) {
return TEXT_STATE_13;
}
- if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->unk120B1 == 0)) {
+ if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->bombersNotebookEventQueueCount == 0)) {
return TEXT_STATE_CLOSING;
}
diff --git a/src/code/z_olib.c b/src/code/z_olib.c
index ad0c2b35c..848a48a72 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,20 +117,20 @@ 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(Math_FAtan2F(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 {
- sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(vec->x, vec->z)));
+ sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(vec->x, vec->z)));
}
*dest = sph;
@@ -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;
}
@@ -202,8 +202,8 @@ Vec3f* OLib_VecSphAddToVec3f(Vec3f* dest, Vec3f* a, VecSph* sph) {
Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b) {
Vec3f anglesRad;
- anglesRad.x = func_80086B30(b->z - a->z, b->y - a->y);
- anglesRad.y = func_80086B30(b->x - a->x, b->z - a->z);
+ anglesRad.x = Math_FAtan2F(b->z - a->z, b->y - a->y);
+ anglesRad.y = Math_FAtan2F(b->x - a->x, b->z - a->z);
anglesRad.z = 0;
*dest = anglesRad;
@@ -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 41441f3a2..e63c9d8e5 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -23,13 +23,13 @@ typedef enum {
#define DO_ACTION_TEX_SIZE ((DO_ACTION_TEX_WIDTH * DO_ACTION_TEX_HEIGHT) / 2) // (sizeof(gCheckDoActionENGTex))
typedef struct {
- /* 0x00 */ u8 scene;
- /* 0x01 */ u8 flags1;
- /* 0x02 */ u8 flags2;
- /* 0x03 */ u8 flags3;
-} RestrictionFlags;
+ /* 0x0 */ u8 scene;
+ /* 0x1 */ u8 flags1;
+ /* 0x2 */ u8 flags2;
+ /* 0x3 */ u8 flags3;
+} RestrictionFlags; // size = 0x4
-Input sPostmanTimerInput[4];
+Input sPostmanTimerInput[MAXCONTROLLERS];
#define RESTRICTIONS_TABLE_END 0xFF
@@ -73,125 +73,21 @@ Input sPostmanTimerInput[4];
#define RESTRICTIONS_MOON RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0)
#define RESTRICTIONS_NO_DOUBLE_TIME RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0)
+#define DEFINE_SCENE(_name, enumValue, _textId, _drawConfig, restrictionFlags, _persistentCycleFlags) \
+ { enumValue, restrictionFlags },
+
+#define DEFINE_SCENE_UNSET(enumValue) { enumValue, RESTRICTIONS_NONE },
+
RestrictionFlags sRestrictionFlags[] = {
- { SCENE_20SICHITAI2, RESTRICTIONS_NONE },
- { SCENE_UNSET_1, RESTRICTIONS_NONE },
- { SCENE_UNSET_2, RESTRICTIONS_NONE },
- { SCENE_UNSET_3, RESTRICTIONS_NONE },
- { SCENE_UNSET_4, RESTRICTIONS_NONE },
- { SCENE_UNSET_5, RESTRICTIONS_NONE },
- { SCENE_UNSET_6, RESTRICTIONS_NONE },
- { SCENE_KAKUSIANA, RESTRICTIONS_NONE },
- { SCENE_SPOT00, RESTRICTIONS_NONE },
- { SCENE_UNSET_9, RESTRICTIONS_NONE },
- { SCENE_WITCH_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_LAST_BS, RESTRICTIONS_MOON },
- { SCENE_HAKASHITA, RESTRICTIONS_NONE },
- { SCENE_AYASHIISHOP, RESTRICTIONS_INDOORS },
- { SCENE_UNSET_E, RESTRICTIONS_NONE },
- { SCENE_UNSET_F, RESTRICTIONS_NONE },
- { SCENE_OMOYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0) },
- { SCENE_BOWLING, RESTRICTIONS_INDOORS },
- { SCENE_SONCHONOIE, RESTRICTIONS_INDOORS },
- { SCENE_IKANA, RESTRICTIONS_NONE },
- { SCENE_KAIZOKU, RESTRICTIONS_NONE },
- { SCENE_MILK_BAR, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_N, RESTRICTIONS_NONE },
- { SCENE_TAKARAYA, RESTRICTIONS_INDOORS },
- { SCENE_INISIE_R, RESTRICTIONS_NONE },
- { SCENE_OKUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_OPENINGDAN, RESTRICTIONS_NONE },
- { SCENE_MITURIN, RESTRICTIONS_NONE },
- { SCENE_13HUBUKINOMITI, RESTRICTIONS_NONE },
- { SCENE_CASTLE, RESTRICTIONS_NONE },
- { SCENE_DEKUTES, RESTRICTIONS_SET(0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1) },
- { SCENE_MITURIN_BS, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MIZU, RESTRICTIONS_INDOORS },
- { SCENE_HAKUGIN, RESTRICTIONS_NONE },
- { SCENE_ROMANYMAE, RESTRICTIONS_NONE },
- { SCENE_PIRATE, RESTRICTIONS_NONE },
- { SCENE_SYATEKI_MORI, RESTRICTIONS_INDOORS },
- { SCENE_SINKAI, RESTRICTIONS_NONE },
- { SCENE_YOUSEI_IZUMI, RESTRICTIONS_NONE },
- { SCENE_KINSTA1, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_KINDAN2, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_TENMON_DAI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0) },
- { SCENE_LAST_DEKU, RESTRICTIONS_MOON },
- { SCENE_22DEKUCITY, RESTRICTIONS_NONE },
- { SCENE_KAJIYA, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_00KEIKOKU, RESTRICTIONS_NONE },
- { SCENE_POSTHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_LABO, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_DANPEI2TEST, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_UNSET_31, RESTRICTIONS_NONE },
- { SCENE_16GORON_HOUSE, RESTRICTIONS_NONE },
- { SCENE_33ZORACITY, RESTRICTIONS_SET(0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0) },
- { SCENE_8ITEMSHOP, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_F01, RESTRICTIONS_NONE },
- { SCENE_INISIE_BS, RESTRICTIONS_NONE },
- { SCENE_30GYOSON, RESTRICTIONS_NONE },
- { SCENE_31MISAKI, RESTRICTIONS_NONE },
- { SCENE_TAKARAKUJI, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_UNSET_3A, RESTRICTIONS_NONE },
- { SCENE_TORIDE, RESTRICTIONS_NONE },
- { SCENE_FISHERMAN, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_GORONSHOP, RESTRICTIONS_INDOORS },
- { SCENE_DEKU_KING, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_LAST_GORON, RESTRICTIONS_MOON },
- { SCENE_24KEMONOMITI, RESTRICTIONS_NONE },
- { SCENE_F01_B, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_F01C, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_BOTI, RESTRICTIONS_NONE },
- { SCENE_HAKUGIN_BS, RESTRICTIONS_NONE },
- { SCENE_20SICHITAI, RESTRICTIONS_NONE },
- { SCENE_21MITURINMAE, RESTRICTIONS_NONE },
- { SCENE_LAST_ZORA, RESTRICTIONS_MOON },
- { SCENE_11GORONNOSATO2, RESTRICTIONS_NONE },
- { SCENE_SEA, RESTRICTIONS_NONE },
- { SCENE_35TAKI, RESTRICTIONS_NONE },
- { SCENE_REDEAD, RESTRICTIONS_NONE },
- { SCENE_BANDROOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_11GORONNOSATO, RESTRICTIONS_NONE },
- { SCENE_GORON_HAKA, RESTRICTIONS_NONE },
- { SCENE_SECOM, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 0, 3, 0, 0, 0) },
- { SCENE_10YUKIYAMANOMURA, RESTRICTIONS_NONE },
- { SCENE_TOUGITES, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0) },
- { SCENE_DANPEI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_IKANAMAE, RESTRICTIONS_NONE },
- { SCENE_DOUJOU, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 1) },
- { SCENE_MUSICHOUSE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0) },
- { SCENE_IKNINSIDE, RESTRICTIONS_SET(0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_MAP_SHOP, RESTRICTIONS_INDOORS },
- { SCENE_F40, RESTRICTIONS_NONE },
- { SCENE_F41, RESTRICTIONS_NONE },
- { SCENE_10YUKIYAMANOMURA2, RESTRICTIONS_NONE },
- { SCENE_14YUKIDAMANOMITI, RESTRICTIONS_NONE },
- { SCENE_12HAKUGINMAE, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN, RESTRICTIONS_NONE },
- { SCENE_17SETUGEN2, RESTRICTIONS_NONE },
- { SCENE_SEA_BS, RESTRICTIONS_NONE },
- { SCENE_RANDOM, RESTRICTIONS_NONE },
- { SCENE_YADOYA, RESTRICTIONS_INDOORS },
- { SCENE_KONPEKI_ENT, RESTRICTIONS_NONE },
- { SCENE_INSIDETOWER, RESTRICTIONS_SET(0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0) },
- { SCENE_26SARUNOMORI, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_LOST_WOODS, RESTRICTIONS_NONE },
- { SCENE_LAST_LINK, RESTRICTIONS_MOON },
- { SCENE_SOUGEN, RESTRICTIONS_MOON },
- { SCENE_BOMYA, RESTRICTIONS_INDOORS },
- { SCENE_KYOJINNOMA, RESTRICTIONS_NONE },
- { SCENE_KOEPONARACE, RESTRICTIONS_NO_DOUBLE_TIME },
- { SCENE_GORONRACE, RESTRICTIONS_NONE },
- { SCENE_TOWN, RESTRICTIONS_NONE },
- { SCENE_ICHIBA, RESTRICTIONS_NONE },
- { SCENE_BACKTOWN, RESTRICTIONS_NONE },
- { SCENE_CLOCKTOWER, RESTRICTIONS_NONE },
- { SCENE_ALLEY, RESTRICTIONS_NONE },
+#include "tables/scene_table.h"
// { RESTRICTIONS_TABLE_END, RESTRICTIONS_NONE }, // See note below
};
//! @note: in `Interface_SetSceneRestrictions`, `RESTRICTIONS_TABLE_END` act as a terminating value to
// stop looping through the array. If a scene is missing, then this will cause issues.
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
s16 sPictoState = PICTO_BOX_STATE_OFF;
s16 sPictoPhotoBeingTaken = false;
@@ -251,7 +147,7 @@ s16 D_801BF97C = 255;
f32 D_801BF980 = 1.0f;
s32 D_801BF984 = 0;
-Gfx sScreenFillSetupDL[] = {
+static Gfx sScreenFillSetupDL[] = {
gsDPPipeSync(),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN |
G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
@@ -887,10 +783,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();
@@ -2421,7 +2317,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
// Related to pictograph
if (sPictoState == PICTO_BOX_STATE_LENS) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -2460,7 +2356,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
sPictoState = PICTO_BOX_STATE_OFF;
if (sPictoPhotoBeingTaken) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)((void)0, gSaveContext.pictoPhotoI5),
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
Snap_RecordPictographedActors(play);
@@ -2493,7 +2389,7 @@ void Interface_UpdateButtonsPart1(PlayState* play) {
sPictoState = PICTO_BOX_STATE_LENS;
} else {
Play_DecompressI5ToI8((u8*)((void)0, gSaveContext.pictoPhotoI5),
- (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ (play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
play->haltAllActors = true;
sPictoState = PICTO_BOX_STATE_SETUP_PHOTO;
@@ -3850,7 +3746,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);
@@ -3971,7 +3867,6 @@ void Interface_DrawItemButtons(PlayState* play) {
OVERLAY_DISP = Gfx_DrawTexRectIA8_DropShadow(OVERLAY_DISP, gButtonBackgroundTex, 0x20, 0x20, D_801BF9D4[0],
D_801BF9DC[0], D_801BFAF4[0], D_801BFAF4[0], D_801BF9E4[0] * 2,
D_801BF9E4[0] * 2, 100, 255, 120, interfaceCtx->bAlpha);
- if (1) {}
gDPPipeSync(OVERLAY_DISP++);
// C-Left Button Color & Texture
@@ -4287,7 +4182,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);
@@ -4362,7 +4257,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);
@@ -4414,11 +4309,10 @@ void Interface_DrawPauseMenuEquippingIcons(PlayState* play) {
/**
* Draws either the analog three-day clock or the digital final-hours clock
*/
-#ifdef NON_MATCHING
void Interface_DrawClock(PlayState* play) {
static s16 sThreeDayClockAlpha = 255;
- static s16 D_801BFB30 = 0; // sClockAlphaTimer1
- static s16 D_801BFB34 = 0; // sClockAlphaTimer2
+ static s16 sClockAlphaTimer1 = 0;
+ static s16 sClockAlphaTimer2 = 0;
static u16 sThreeDayClockHours[] = {
CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
@@ -4434,31 +4328,30 @@ void Interface_DrawClock(PlayState* play) {
gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
};
- static s16 D_801BFBCC = 0; // sClockInvDiamondPrimRed
- static s16 D_801BFBD0 = 0; // sClockInvDiamondPrimGreen
- static s16 D_801BFBD4 = 255; // sClockInvDiamondPrimBlue
- static s16 D_801BFBD8 = 0; // sClockInvDiamondEnvRed
- static s16 D_801BFBDC = 0; // sClockInvDiamondEnvGreen
- static s16 D_801BFBE0 = 0; // sClockInvDiamondEnvBlue
- static s16 D_801BFBE4 = 15; // sClockInvDiamondTimer
- static s16 D_801BFBE8 = 0; // sClockInvDiamondTargetIndex
- static s16 D_801BFBEC[] = { 100, 0 }; // sClockInvDiamondPrimRedTargets
- static s16 D_801BFBF0[] = { 205, 155 }; // sClockInvDiamondPrimGreenTargets
- static s16 D_801BFBF4[] = { 255, 255 }; // sClockInvDiamondPrimBlueTargets
- static s16 D_801BFBF8[] = { 30, 0 }; // sClockInvDiamondEnvRedTargets
- static s16 D_801BFBFC[] = { 30, 0 }; // sClockInvDiamondEnvGreenTargets
- static s16 D_801BFC00[] = { 100, 0 }; // sClockInvDiamondEnvBlueTargets
- static s16 D_801BFC04[] = { 255, 0 }; // sFinalHoursClockDigitsRed
- static s16 D_801BFC08[] = { 100, 0 }; // sFinalHoursClockFrameEnvRedTargets
- static s16 D_801BFC0C[] = { 30, 0 }; // sFinalHoursClockFrameEnvGreenTargets
- static s16 D_801BFC10[] = { 100, 0 }; // sFinalHoursClockFrameEnvBlueTargets
+ static s16 sClockInvDiamondPrimRed = 0;
+ static s16 sClockInvDiamondPrimGreen = 155;
+ static s16 sClockInvDiamondPrimBlue = 255;
+ static s16 sClockInvDiamondEnvRed = 0;
+ static s16 sClockInvDiamondEnvGreen = 0;
+ static s16 sClockInvDiamondEnvBlue = 0;
+ static s16 sClockInvDiamondTimer = 15;
+ static s16 sClockInvDiamondTargetIndex = 0;
+ static s16 sClockInvDiamondPrimRedTargets[] = { 100, 0 };
+ static s16 sClockInvDiamondPrimGreenTargets[] = { 205, 155 };
+ static s16 sClockInvDiamondPrimBlueTargets[] = { 255, 255 };
+ static s16 sClockInvDiamondEnvRedTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvGreenTargets[] = { 30, 0 };
+ static s16 sClockInvDiamondEnvBlueTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockDigitsRedTargets[] = { 255, 0 };
+ static s16 sFinalHoursClockFrameEnvRedTargets[] = { 100, 0 };
+ static s16 sFinalHoursClockFrameEnvGreenTargets[] = { 30, 0 };
+ static s16 sFinalHoursClockFrameEnvBlueTargets[] = { 100, 0 };
static TexturePtr sFinalHoursDigitTextures[] = {
gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
};
- // sFinalHoursDigitSlotPosXOffset
- static s16 D_801BFC40[] = {
+ static s16 sFinalHoursDigitSlotPosXOffset[] = {
127, 136, 144, 151, 160, 168, 175, 184,
};
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -4470,527 +4363,492 @@ void Interface_DrawClock(PlayState* play) {
f32 timeInMinutes;
f32 timeInSeconds;
f32 sp1CC;
- s32 new_var;
+ s32 pad1;
s16 sp1C6;
s16 currentHour;
u16 time;
- s16 temp;
+ s16 pad2;
s16 colorStep;
- s16 finalHoursClockSlots[8]; // sp1AC
+ s16 finalHoursClockSlots[8];
s16 index;
OPEN_DISPS(play->state.gfxCtx);
- if (R_TIME_SPEED != 0) {
- if ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
- (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
- (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) {
- if (!FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day < 4)) {
- /**
- * Changes Clock's transparancy depending if Player is moving or not and possibly other things
- */
- if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
- if (func_801234D4(play)) {
- sThreeDayClockAlpha = 80;
- D_801BFB30 = 5;
- D_801BFB34 = 20;
- } else if (D_801BFB34 != 0) {
- D_801BFB34--;
- } else if (D_801BFB30 != 0) {
- colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / D_801BFB30;
- sThreeDayClockAlpha += colorStep;
+ if ((R_TIME_SPEED != 0) &&
+ ((msgCtx->msgMode == 0) || ((play->actorCtx.flags & ACTORCTX_FLAG_1) && !Play_InCsMode(play)) ||
+ (msgCtx->msgMode == 0) || ((msgCtx->currentTextId >= 0x100) && (msgCtx->currentTextId <= 0x200)) ||
+ (gSaveContext.gameMode == GAMEMODE_END_CREDITS)) &&
+ !FrameAdvance_IsEnabled(&play->state) && !Environment_IsTimeStopped() && (gSaveContext.save.day <= 3)) {
+ /**
+ * Section: Changes Clock's transparancy depending if Player is moving or not and possibly other things
+ */
+ if (gSaveContext.hudVisibility == HUD_VISIBILITY_ALL) {
+ if (func_801234D4(play)) {
+ sThreeDayClockAlpha = 80;
+ sClockAlphaTimer1 = 5;
+ sClockAlphaTimer2 = 20;
+ } else if (sClockAlphaTimer2 != 0) {
+ sClockAlphaTimer2--;
+ } else if (sClockAlphaTimer1 != 0) {
+ colorStep = ABS_ALT(sThreeDayClockAlpha - 255) / sClockAlphaTimer1;
+ sThreeDayClockAlpha += colorStep;
- if (sThreeDayClockAlpha >= 255) {
- sThreeDayClockAlpha = 255;
- D_801BFB30 = 0;
- }
- } else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
- } else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
- }
- D_801BFB34 = 0;
- D_801BFB30 = 0;
- }
+ if (sThreeDayClockAlpha >= 255) {
+ sThreeDayClockAlpha = 255;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
} else {
- if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- sThreeDayClockAlpha = 255;
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+ } else {
+ if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
+ sThreeDayClockAlpha = 255;
+ } else {
+ sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ }
+ sClockAlphaTimer2 = 0;
+ sClockAlphaTimer1 = 0;
+ }
+
+ if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draw Clock's Hour Lines
+ */
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128, 35, 1,
+ 6, 0, 1 << 10, 1 << 10);
+
+ /**
+ * Section: Draw Clock's Border
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+
+ //! @bug A texture height of 50 is given below. The texture is only 48 units height
+ //! resulting in this reading into the next texture. This results in a white
+ //! dot in the bottom center of the clock. For the three-day clock, this is
+ //! covered by the diamond. However, it can be seen by the final-hours clock.
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50, 1, 6,
+ 0, 1 << 10, 1 << 10);
+
+ if (((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0))))) {
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ } else {
+ /**
+ * Section: Draw Three-Day Clock's Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+
+ // Time is slowed down to half speed with inverted song of time
+ if (gSaveContext.save.timeSpeedOffset == -2) {
+ // Clock diamond is blue and flashes white
+ colorStep =
+ ABS_ALT(sClockInvDiamondPrimRed - sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimRed >= sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimRed -= colorStep;
} else {
- sThreeDayClockAlpha = interfaceCtx->bAlpha;
+ sClockInvDiamondPrimRed += colorStep;
}
- D_801BFB34 = 0;
- D_801BFB30 = 0;
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimGreen -
+ sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimGreen >= sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimGreen -= colorStep;
+ } else {
+ sClockInvDiamondPrimGreen += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondPrimBlue -
+ sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondPrimBlue >= sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondPrimBlue -= colorStep;
+ } else {
+ sClockInvDiamondPrimBlue += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvRed - sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvRed >= sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvRed -= colorStep;
+ } else {
+ sClockInvDiamondEnvRed += colorStep;
+ }
+
+ colorStep = ABS_ALT(sClockInvDiamondEnvGreen -
+ sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvGreen >= sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvGreen -= colorStep;
+ } else {
+ sClockInvDiamondEnvGreen += colorStep;
+ }
+
+ colorStep =
+ ABS_ALT(sClockInvDiamondEnvBlue - sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) /
+ sClockInvDiamondTimer;
+ if (sClockInvDiamondEnvBlue >= sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex]) {
+ sClockInvDiamondEnvBlue -= colorStep;
+ } else {
+ sClockInvDiamondEnvBlue += colorStep;
+ }
+
+ sClockInvDiamondTimer--;
+
+ if (sClockInvDiamondTimer == 0) {
+ sClockInvDiamondPrimRed = sClockInvDiamondPrimRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimGreen = sClockInvDiamondPrimGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondPrimBlue = sClockInvDiamondPrimBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvRed = sClockInvDiamondEnvRedTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvGreen = sClockInvDiamondEnvGreenTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondEnvBlue = sClockInvDiamondEnvBlueTargets[sClockInvDiamondTargetIndex];
+ sClockInvDiamondTimer = 15;
+ sClockInvDiamondTargetIndex ^= 1;
+ }
+
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
+ 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sClockInvDiamondPrimRed, sClockInvDiamondPrimGreen, 255,
+ sThreeDayClockAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, sClockInvDiamondEnvRed, sClockInvDiamondEnvGreen,
+ sClockInvDiamondEnvBlue, 0);
+ } else {
+ // Clock diamond is green for regular timeSpeedOffset
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
}
- if ((play->pauseCtx.state == PAUSE_STATE_OFF) && (play->pauseCtx.debugEditor == DEBUG_EDITOR_NONE)) {
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40, 32,
+ 1 << 10, 1 << 10);
- func_8012C654(play->state.gfxCtx);
+ /**
+ * Section: Draw Three-Day Clock's Day-Number over Diamond
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- /**
- * Draw Clock's Hour Lines
- */
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 130, 130, 130, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27, 137, 192,
+ 48, 27, 1 << 10, 1 << 10);
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockHourLinesTex, 4, 64, 35, 96, 180, 128,
- 35, 1, 6, 0, 1 << 10, 1 << 10);
+ /**
+ * Section: Draw Three-Day Clock's Star (for the Minute Tracker)
+ */
+ gDPPipeSync(OVERLAY_DISP++);
- /**
- * Draw Clock's Border
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, sThreeDayClockAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ if (D_801BF974 != 0) {
+ D_801BF980 += 0.02f;
+ D_801BF97C += 11;
+ } else {
+ D_801BF980 -= 0.02f;
+ D_801BF97C -= 11;
+ }
- //! @bug A texture height of 50 is given below. The texture is only 48 units height
- //! resulting in this reading into the next texture. This results in a white
- //! dot in the bottom center of the clock. For the three-day clock, this is
- //! covered by the diamond. However, it can be seen by the final-hours clock.
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gThreeDayClockBorderTex, 4, 64, 50, 96, 168, 128, 50,
- 1, 6, 0, 1 << 10, 1 << 10);
+ D_801BF978--;
+ if (D_801BF978 == 0) {
+ D_801BF978 = 10;
+ D_801BF974 ^= 1;
+ }
- 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);
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
+ timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
+
+ Gfx_SetupDL42_Overlay(play->state.gfxCtx);
+
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (sThreeDayClockAlpha != 255) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
+ }
+
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
+ Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
+ gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ }
+
+ /**
+ * Section: Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
+
+ // determines the current hour
+ for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
+ if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
+ break;
+ }
+ }
+
+ /**
+ * Section: Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
+ */
+ time = gSaveContext.save.time;
+ sp1D8 = Math_SinS(time) * -40.0f;
+ temp_f14 = Math_CosS(time) * -34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
+
+ /**
+ * Section: Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
+ */
+ sp1D8 = Math_SinS(time) * 40.0f;
+ temp_f14 = Math_CosS(time) * 34.0f;
+
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
+
+ Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
+
+ /**
+ * Section: Cuts off Three-Day Clock's Hour Digits when they dip below the clock
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
+ R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Sun
+ */
+ sp1CC = gSaveContext.save.time * 0.000096131f; // (2.0f * 3.15f / 0x10000)
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Sun
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Sun
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ /**
+ * Section: Draws Three-Day Clock's Hour Digit Above the Moon
+ */
+
+ // Rotates Three-Day Clock's Hour Digit To Above the Moon
+ Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+ Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
+ gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ // Draws Three-Day Clock's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0,
+ 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
+ gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
+
+ // Colours the Three-Day Clocks's Hour Digit Above the Moon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
+ gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
+
+ gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
+
+ // Final Hours
+ if ((CURRENT_DAY >= 4) ||
+ ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= (CLOCK_TIME(0, 0) + 5)) &&
+ (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
+ if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
+ // The Final Hours clock will flash red
+
+ colorStep = ABS_ALT(sFinalHoursClockDigitsRed -
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockDigitsRed >=
+ sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockDigitsRed -= colorStep;
} else {
- /**
- * Draw Three-Day Clock's Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- // Time is slowed down to half speed with inverted song of time
- if (gSaveContext.save.timeSpeedOffset == -2) {
- // Clock diamond is blue and flashes white
- colorStep = ABS_ALT(D_801BFBCC - D_801BFBEC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBCC >= D_801BFBEC[D_801BFBE8]) {
- D_801BFBCC -= colorStep;
- } else {
- D_801BFBCC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD0 - D_801BFBF0[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD0 >= D_801BFBF0[D_801BFBE8]) {
- D_801BFBD0 -= colorStep;
- } else {
- D_801BFBD0 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD4 - D_801BFBF4[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD4 >= D_801BFBF4[D_801BFBE8]) {
- D_801BFBD4 -= colorStep;
- } else {
- D_801BFBD4 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBD8 - D_801BFBF8[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBD8 >= D_801BFBF8[D_801BFBE8]) {
- D_801BFBD8 -= colorStep;
- } else {
- D_801BFBD8 += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBDC - D_801BFBFC[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBDC >= D_801BFBFC[D_801BFBE8]) {
- D_801BFBDC -= colorStep;
- } else {
- D_801BFBDC += colorStep;
- }
-
- colorStep = ABS_ALT(D_801BFBE0 - D_801BFC00[D_801BFBE8]) / D_801BFBE4;
- if (D_801BFBE0 >= D_801BFC00[D_801BFBE8]) {
- D_801BFBE0 -= colorStep;
- } else {
- D_801BFBE0 += colorStep;
- }
-
- D_801BFBE4--;
-
- if (D_801BFBE4 == 0) {
- D_801BFBCC = D_801BFBEC[D_801BFBE8];
- D_801BFBD0 = D_801BFBF0[D_801BFBE8];
- D_801BFBD4 = D_801BFBF4[D_801BFBE8];
- D_801BFBD8 = D_801BFBF8[D_801BFBE8];
- D_801BFBDC = D_801BFBFC[D_801BFBE8];
- D_801BFBE0 = D_801BFC00[D_801BFBE8];
- D_801BFBE4 = 15;
- D_801BFBE8 ^= 1;
- }
-
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, D_801BFBCC, D_801BFBD0, 255, sThreeDayClockAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, D_801BFBD8, D_801BFBDC, D_801BFBE0, 0);
- } else {
- // Clock diamond is green for regular timeSpeedOffset
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 170, 100, sThreeDayClockAlpha);
- }
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gThreeDayClockDiamondTex, 40, 32, 140, 190, 40,
- 32, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Day-Number over Diamond
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
-
- OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, interfaceCtx->doActionSegment + 0x780, 48, 27,
- 137, 192, 48, 27, 1 << 10, 1 << 10);
-
- /**
- * Draw Three-Day Clock's Star (for the Minute Tracker)
- */
- gDPPipeSync(OVERLAY_DISP++);
-
- if (D_801BF974 != 0) {
- D_801BF980 += 0.02f;
- D_801BF97C += 11;
- } else {
- D_801BF980 -= 0.02f;
- D_801BF97C -= 11;
- }
-
- D_801BF978--;
- if (D_801BF978 == 0) {
- D_801BF978 = 10;
- D_801BF974 ^= 1;
- }
-
- timeInSeconds = TIME_TO_SECONDS_F(gSaveContext.save.time);
- timeInSeconds -= ((s16)(timeInSeconds / 3600.0f)) * 3600.0f;
-
- func_8012C8D4(play->state.gfxCtx);
-
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- if (sThreeDayClockAlpha != 255) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, sThreeDayClockAlpha);
- } else {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 110, D_801BF97C);
- }
-
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
-
- Matrix_Translate(0.0f, -86.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, D_801BF980, MTXMODE_APPLY);
- Matrix_RotateZF(-(timeInSeconds * 0.0175f) / 10.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[12], 4, 0);
- gDPLoadTextureBlock_4b(OVERLAY_DISP++, gThreeDayClockStarMinuteTex, G_IM_FMT_I, 16, 16, 0,
- G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
- G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
+ sFinalHoursClockDigitsRed += colorStep;
}
- /**
- * Cuts off Three-Day Clock's Sun and Moon when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_SUN_MOON_CUTOFF * 4.0f);
-
- // determines the current hour
- for (sp1C6 = 0; sp1C6 <= 24; sp1C6++) {
- if (((void)0, gSaveContext.save.time) < sThreeDayClockHours[sp1C6 + 1]) {
- break;
- }
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvRed -
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvRed >=
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvRed -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvRed += colorStep;
}
- /**
- * Draw Three-Day Clock's Sun (for the Day-Time Hours Tracker)
- */
- time = gSaveContext.save.time;
- sp1D8 = Math_SinS(time) * -40.0f;
- temp_f14 = Math_CosS(time) * -34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 100, 110, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[16], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockSunHourTex, 24, 24, 0);
-
- /**
- * Draw Three-Day Clock's Moon (for the Night-Time Hours Tracker)
- */
- sp1D8 = Math_SinS(time) * 40.0f;
- temp_f14 = Math_CosS(time) * 34.0f;
-
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 55, sThreeDayClockAlpha);
-
- Matrix_Translate(sp1D8, temp_f14, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[20], 4, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuadIA8(OVERLAY_DISP, gThreeDayClockMoonHourTex, 24, 24, 0);
-
- /**
- * Cuts off Three-Day Clock's Hour Digits when they dip below the clock
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetScissorFrac(OVERLAY_DISP++, G_SC_NON_INTERLACE, 400, 620, 880,
- R_THREE_DAY_CLOCK_HOUR_DIGIT_CUTOFF * 4.0f);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Sun
- */
- sp1CC = gSaveContext.save.time * 0.000096131f;
-
- // Rotates Three-Day Clock's Hour Digit To Above the Sun
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-(sp1CC - 3.15f), MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[24], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Sun
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- /**
- * Draws Three-Day Clock's Hour Digit Above the Moon
- */
- // Rotates Three-Day Clock's Hour Digit To Above the Moon
- Matrix_Translate(0.0f, R_THREE_DAY_CLOCK_Y_POS / 10.0f, 0.0f, MTXMODE_NEW);
- Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
- Matrix_RotateZF(-sp1CC, MTXMODE_APPLY);
- gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-
- // Draws Three-Day Clock's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, sThreeDayClockAlpha);
- gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[32], 8, 0);
-
- OVERLAY_DISP = Gfx_DrawTexQuad4b(OVERLAY_DISP, sThreeDayClockHourTextures[sp1C6], 4, 16, 11, 0);
-
- // Colours the Three-Day Clocks's Hour Digit Above the Moon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 155, sThreeDayClockAlpha);
- gSP1Quadrangle(OVERLAY_DISP++, 4, 6, 7, 5, 0);
-
- gSPDisplayList(OVERLAY_DISP++, D_0E000000.setScissor);
-
- // Final Hours
- if ((CURRENT_DAY >= 4) || ((CURRENT_DAY == 3) && (((void)0, gSaveContext.save.time) >= 5) &&
- (((void)0, gSaveContext.save.time) < CLOCK_TIME(6, 0)))) {
- if (((void)0, gSaveContext.save.time) >= CLOCK_TIME(5, 0)) {
- // The Final Hours clock will flash red
-
- colorStep =
- ABS_ALT(sFinalHoursClockDigitsRed - D_801BFC04[sFinalHoursClockColorTargetIndex]) /
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvGreen -
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) /
sFinalHoursClockColorTimer;
- if (sFinalHoursClockDigitsRed >= D_801BFC04[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockDigitsRed -= colorStep;
- } else {
- sFinalHoursClockDigitsRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvRed - D_801BFC08[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvRed >= D_801BFC08[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvRed -= colorStep;
- } else {
- sFinalHoursClockFrameEnvRed += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvGreen - D_801BFC0C[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvGreen >= D_801BFC0C[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvGreen -= colorStep;
- } else {
- sFinalHoursClockFrameEnvGreen += colorStep;
- }
-
- colorStep =
- ABS_ALT(sFinalHoursClockFrameEnvBlue - D_801BFC10[sFinalHoursClockColorTargetIndex]) /
- sFinalHoursClockColorTimer;
- if (sFinalHoursClockFrameEnvBlue >= D_801BFC10[sFinalHoursClockColorTargetIndex]) {
- sFinalHoursClockFrameEnvBlue -= colorStep;
- } else {
- sFinalHoursClockFrameEnvBlue += colorStep;
- }
-
- sFinalHoursClockColorTimer--;
-
- if (sFinalHoursClockColorTimer == 0) {
- sFinalHoursClockDigitsRed = D_801BFC04[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvRed = D_801BFC08[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvGreen = D_801BFC0C[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockFrameEnvBlue = D_801BFC10[sFinalHoursClockColorTargetIndex];
- sFinalHoursClockColorTimer = 6;
- sFinalHoursClockColorTargetIndex ^= 1;
- }
- }
-
- sp1E6 = sThreeDayClockAlpha;
- if (sp1E6 != 0) {
- sp1E6 = 255;
- }
-
- func_8012C654(play->state.gfxCtx);
-
- /**
- * Draws Final-Hours Clock's Frame
- */
- gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
- gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
- gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0,
- PRIMITIVE, 0);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
- sFinalHoursClockFrameEnvBlue, 0);
-
- OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202,
- 80, 13, 0, 0, 0, 1 << 10, 1 << 10);
-
- finalHoursClockSlots[0] = 0;
-
- timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
-
- timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
-
- // digits for hours
- finalHoursClockSlots[1] = timeInMinutes / 60.0f;
- finalHoursClockSlots[2] = timeInMinutes / 60.0f;
-
- temp = (s32)timeInMinutes % 60;
-
- while (finalHoursClockSlots[1] >= 10) {
- finalHoursClockSlots[0]++;
- finalHoursClockSlots[1] -= 10;
- }
-
- // digits for minutes
- finalHoursClockSlots[3] = 0;
- finalHoursClockSlots[4] = temp;
-
- while (finalHoursClockSlots[4] >= 10) {
- finalHoursClockSlots[3]++;
- finalHoursClockSlots[4] -= 10;
- }
-
- // digits for seconds
- finalHoursClockSlots[6] = 0;
- finalHoursClockSlots[7] =
- timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
- (((void)0, temp) * ((f32)0x10000 / (24 * 60))));
-
- while (finalHoursClockSlots[7] >= 10) {
- finalHoursClockSlots[6]++;
- finalHoursClockSlots[7] -= 10;
- }
-
- // Colon separating hours from minutes and minutes from seconds
- finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
-
- /**
- * Draws Final-Hours Clock's Digits
- */
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
- gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
-
- for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
- index = D_801BFC40[sp1C6];
-
- OVERLAY_DISP =
- Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]],
- 8, 8, index, 205, 8, 8, 1 << 10, 1 << 10);
- }
+ if (sFinalHoursClockFrameEnvGreen >=
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvGreen -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvGreen += colorStep;
}
+
+ colorStep = ABS_ALT(sFinalHoursClockFrameEnvBlue -
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) /
+ sFinalHoursClockColorTimer;
+ if (sFinalHoursClockFrameEnvBlue >=
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex]) {
+ sFinalHoursClockFrameEnvBlue -= colorStep;
+ } else {
+ sFinalHoursClockFrameEnvBlue += colorStep;
+ }
+
+ sFinalHoursClockColorTimer--;
+
+ if (sFinalHoursClockColorTimer == 0) {
+ sFinalHoursClockDigitsRed = sFinalHoursClockDigitsRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvRed =
+ sFinalHoursClockFrameEnvRedTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvGreen =
+ sFinalHoursClockFrameEnvGreenTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockFrameEnvBlue =
+ sFinalHoursClockFrameEnvBlueTargets[sFinalHoursClockColorTargetIndex];
+ sFinalHoursClockColorTimer = 6;
+ sFinalHoursClockColorTargetIndex ^= 1;
+ }
+ }
+
+ sp1E6 = sThreeDayClockAlpha;
+ if (sp1E6 != 0) {
+ sp1E6 = 255;
+ }
+
+ Gfx_SetupDL39_Overlay(play->state.gfxCtx);
+
+ /**
+ * Section: Draws Final-Hours Clock's Frame
+ */
+ gSPMatrix(OVERLAY_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetAlphaCompare(OVERLAY_DISP++, G_AC_THRESHOLD);
+ gDPSetRenderMode(OVERLAY_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 195, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockFrameEnvRed, sFinalHoursClockFrameEnvGreen,
+ sFinalHoursClockFrameEnvBlue, 0);
+
+ OVERLAY_DISP = Gfx_DrawTexRect4b(OVERLAY_DISP, gFinalHoursClockFrameTex, 3, 80, 13, 119, 202, 80, 13, 0,
+ 0, 0, 1 << 10, 1 << 10);
+
+ timeUntilMoonCrash = TIME_UNTIL_MOON_CRASH;
+ timeInMinutes = TIME_TO_MINUTES_F(timeUntilMoonCrash);
+
+ // digits for hours
+ finalHoursClockSlots[0] = 0;
+ finalHoursClockSlots[1] = timeInMinutes / 60.0f;
+ finalHoursClockSlots[2] = timeInMinutes / 60.0f;
+
+ while (finalHoursClockSlots[1] >= 10) {
+ finalHoursClockSlots[0]++;
+ finalHoursClockSlots[1] -= 10;
+ }
+
+ // digits for minutes
+ finalHoursClockSlots[3] = 0;
+ finalHoursClockSlots[4] = (s32)timeInMinutes % 60;
+ finalHoursClockSlots[5] = (s32)timeInMinutes % 60;
+
+ while (finalHoursClockSlots[4] >= 10) {
+ finalHoursClockSlots[3]++;
+ finalHoursClockSlots[4] -= 10;
+ }
+
+ // digits for seconds
+ finalHoursClockSlots[6] = 0;
+ finalHoursClockSlots[7] =
+ timeUntilMoonCrash - (u32)((finalHoursClockSlots[2] * ((f32)0x10000 / 24)) +
+ (finalHoursClockSlots[5] * ((f32)0x10000 / (24 * 60))));
+
+ while (finalHoursClockSlots[7] >= 10) {
+ finalHoursClockSlots[6]++;
+ finalHoursClockSlots[7] -= 10;
+ }
+
+ // Colon separating hours from minutes and minutes from seconds
+ finalHoursClockSlots[2] = finalHoursClockSlots[5] = 10;
+
+ /**
+ * Section: Draws Final-Hours Clock's Digits
+ */
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, sFinalHoursClockDigitsRed, 0, 0, sp1E6);
+ gDPSetEnvColor(OVERLAY_DISP++, sFinalHoursClockDigitsRed, 0, 0, 0);
+
+ for (sp1C6 = 0; sp1C6 < 8; sp1C6++) {
+ index = sFinalHoursDigitSlotPosXOffset[sp1C6];
+
+ OVERLAY_DISP =
+ Gfx_DrawTexRectI8(OVERLAY_DISP, sFinalHoursDigitTextures[finalHoursClockSlots[sp1C6]], 8, 8,
+ index, 205, 8, 8, 1 << 10, 1 << 10);
}
}
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-s16 sThreeDayClockAlpha = 255;
-s16 D_801BFB30 = 0;
-s16 D_801BFB34 = 0;
-u16 sThreeDayClockHours[] = {
- CLOCK_TIME(0, 0), CLOCK_TIME(1, 0), CLOCK_TIME(2, 0), CLOCK_TIME(3, 0), CLOCK_TIME(4, 0),
- CLOCK_TIME(5, 0), CLOCK_TIME(6, 0), CLOCK_TIME(7, 0), CLOCK_TIME(8, 0), CLOCK_TIME(9, 0),
- CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0),
- CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0),
- CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1,
-};
-TexturePtr sThreeDayClockHourTextures[] = {
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
- gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex,
- gThreeDayClockHour4Tex, gThreeDayClockHour5Tex, gThreeDayClockHour6Tex, gThreeDayClockHour7Tex,
- gThreeDayClockHour8Tex, gThreeDayClockHour9Tex, gThreeDayClockHour10Tex, gThreeDayClockHour11Tex,
-};
-s16 D_801BFBCC = 0; // color R
-s16 D_801BFBD0 = 155; // color G
-s16 D_801BFBD4 = 255;
-s16 D_801BFBD8 = 0;
-s16 D_801BFBDC = 0;
-s16 D_801BFBE0 = 0;
-s16 D_801BFBE4 = 0xF;
-u32 D_801BFBE8 = 0;
-s16 D_801BFBEC[] = { 100, 0 };
-s16 D_801BFBF0[] = { 205, 155 };
-s16 D_801BFBF4[] = { 255, 255 };
-s16 D_801BFBF8[] = { 30, 0 };
-s16 D_801BFBFC[] = { 30, 0 };
-s16 D_801BFC00[] = { 100, 0 };
-s16 D_801BFC04[] = { 255, 0 };
-s16 D_801BFC08[] = { 100, 0 };
-s16 D_801BFC0C[] = { 30, 0 };
-s16 D_801BFC10[] = { 100, 0 };
-TexturePtr sFinalHoursDigitTextures[] = {
- gFinalHoursClockDigit0Tex, gFinalHoursClockDigit1Tex, gFinalHoursClockDigit2Tex, gFinalHoursClockDigit3Tex,
- gFinalHoursClockDigit4Tex, gFinalHoursClockDigit5Tex, gFinalHoursClockDigit6Tex, gFinalHoursClockDigit7Tex,
- gFinalHoursClockDigit8Tex, gFinalHoursClockDigit9Tex, gFinalHoursClockColonTex,
-};
-s16 D_801BFC40[] = {
- 127, 136, 144, 151, 160, 168, 175, 184,
-};
-void Interface_DrawClock(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_parameter/Interface_DrawClock.s")
-#endif
void Interface_SetPerfectLetters(PlayState* play, s16 perfectLettersType) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
@@ -5499,7 +5357,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,
@@ -5654,7 +5512,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:
@@ -5663,7 +5521,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:
@@ -6136,7 +5994,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
@@ -6311,7 +6169,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);
@@ -6336,7 +6194,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,
@@ -6521,7 +6379,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);
@@ -6553,7 +6411,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);
@@ -6588,7 +6446,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);
@@ -6631,7 +6489,7 @@ void Interface_Draw(PlayState* play) {
// Draw pictograph photo
if (sPictoState >= PICTO_BOX_STATE_SETUP_PHOTO) {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON)) {
- Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90,
+ Play_CompressI8ToI5((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer,
(u8*)gSaveContext.pictoPhotoI5, PICTO_PHOTO_WIDTH * PICTO_PHOTO_HEIGHT);
interfaceCtx->unk_222 = interfaceCtx->unk_224 = 0;
@@ -6656,7 +6514,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);
@@ -6667,7 +6525,7 @@ void Interface_Draw(PlayState* play) {
for (sp2CC = 0; sp2CC < (PICTO_PHOTO_HEIGHT / 8); sp2CC++, pictoRectTop += 8) {
pictoRectLeft = PICTO_PHOTO_TOPLEFT_X;
gDPLoadTextureBlock(OVERLAY_DISP++,
- (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : D_801FBB90) +
+ (u8*)((play->pictoPhotoI8 != NULL) ? play->pictoPhotoI8 : gWorkBuffer) +
(0x500 * sp2CC),
G_IM_FMT_I, G_IM_SIZ_8b, PICTO_PHOTO_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);
@@ -7211,7 +7069,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_path.c b/src/code/z_path.c
index 3c446d49a..76d7ce144 100644
--- a/src/code/z_path.c
+++ b/src/code/z_path.c
@@ -1,9 +1,9 @@
#include "global.h"
-Path* Path_GetByIndex(PlayState* play, s16 index, s16 max) {
+Path* Path_GetByIndex(PlayState* play, s16 index, s16 indexNone) {
Path* path;
- if (index != max) {
+ if (index != indexNone) {
path = &play->setupPathList[index];
} else {
path = NULL;
diff --git a/src/code/z_play.c b/src/code/z_play.c
index bd4db8fec..6ef734aee 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -1,6 +1,6 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "buffers.h"
+#include "z64bombers_notebook.h"
#include "z64debug_display.h"
#include "z64quake.h"
#include "z64rumble.h"
@@ -8,7 +8,7 @@
#include "z64view.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/gamestates/ovl_opening/z_opening.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h"
s32 gDbgCamEnabled = false;
@@ -359,10 +359,10 @@ void Play_Destroy(GameState* thisx) {
if (sBombersNotebookOpen) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2);
gfxCtx->zbuffer = SysCfb_GetZBuffer();
- gfxCtx->viMode = D_801FBB88;
+ gfxCtx->viMode = gActiveViMode;
gfxCtx->viConfigFeatures = gViConfigFeatures;
gfxCtx->xScale = gViConfigXScale;
gfxCtx->yScale = gViConfigYScale;
@@ -506,41 +506,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);
@@ -1037,9 +1037,9 @@ void Play_UpdateMain(PlayState* this) {
if (this->sramCtx.status != 0) {
if (gSaveContext.save.isOwlSave) {
- func_80147198(&this->sramCtx);
+ Sram_UpdateWriteToFlashOwlSave(&this->sramCtx);
} else {
- func_80147068(&this->sramCtx);
+ Sram_UpdateWriteToFlashDefault(&this->sramCtx);
}
}
}
@@ -1052,14 +1052,14 @@ void Play_Update(PlayState* this) {
if (!sBombersNotebookOpen) {
if (this->pauseCtx.bombersNotebookOpen) {
sBombersNotebookOpen = true;
- sBombersNotebook.unk_00 = 0;
+ sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE;
}
} else if (CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_L) ||
CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_B) ||
CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_START) || (gIrqMgrResetStatus != 0)) {
sBombersNotebookOpen = false;
this->pauseCtx.bombersNotebookOpen = false;
- sBombersNotebook.unk_00 = 0;
+ sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE;
this->msgCtx.msgLength = 0;
this->msgCtx.msgMode = 0;
this->msgCtx.currentTextId = 0;
@@ -1243,7 +1243,7 @@ void Play_DrawMain(PlayState* this) {
goto PostWorldDraw;
}
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, gfxCtx->curFrameBuffer, gfxCtx->zbuffer);
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_PROCESS) {
MsgEvent_SendNullTask();
@@ -1273,8 +1273,8 @@ void Play_DrawMain(PlayState* this) {
if ((this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) {
if ((this->skyboxId == SKYBOX_NORMAL_SKY) || (this->skyboxId == SKYBOX_3)) {
Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx);
- Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.unk_13, this->view.eye.x,
- this->view.eye.y, this->view.eye.z);
+ Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.skyboxBlend,
+ this->view.eye.x, this->view.eye.y, this->view.eye.z);
} else if (!this->skyboxCtx.skyboxShouldDraw) {
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
this->view.eye.z);
@@ -1443,24 +1443,24 @@ void Play_Draw(PlayState* this) {
GraphicsContext* gfxCtx2 = this->state.gfxCtx;
if (sBombersNotebookOpen) {
- if (D_801FBBD4 != 1) {
+ if (gSysCfbHiResEnabled != 1) {
MsgEvent_SendNullTask();
- func_80178818();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetHiResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
gfxCtx2->updateViMode = true;
}
} else {
- if (D_801FBBD4 != 0) {
+ if (gSysCfbHiResEnabled != 0) {
MsgEvent_SendNullTask();
- func_80178750();
- gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIndex % 2);
+ SysCfb_SetLoResMode();
+ gfxCtx2->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx2->framebufferIndex % 2);
gfxCtx2->zbuffer = SysCfb_GetZBuffer();
- gfxCtx2->viMode = D_801FBB88;
+ gfxCtx2->viMode = gActiveViMode;
gfxCtx2->viConfigFeatures = gViConfigFeatures;
gfxCtx2->xScale = gViConfigXScale;
gfxCtx2->yScale = gViConfigYScale;
@@ -1509,7 +1509,7 @@ void Play_Main(GameState* thisx) {
}
s32 Play_InCsMode(PlayState* this) {
- return (this->csCtx.state != 0) || Player_InCsMode(this);
+ return (this->csCtx.state != CS_STATE_IDLE) || Player_InCsMode(this);
}
f32 Play_GetFloorSurfaceImpl(PlayState* this, MtxF* mtx, CollisionPoly** poly, s32* bgId, Vec3f* pos) {
@@ -1682,11 +1682,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 +1711,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 +1749,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 +2180,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);
@@ -2217,7 +2218,7 @@ void Play_Init(GameState* thisx) {
if (((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN)) ||
(gSaveContext.save.cutsceneIndex >= 0xFFF0)) {
- gSaveContext.unk_3DC0 = 0;
+ gSaveContext.nayrusLoveTimer = 0;
Magic_Reset(this);
gSaveContext.sceneLayer = (gSaveContext.save.cutsceneIndex & 0xF) + 1;
@@ -2252,10 +2253,10 @@ void Play_Init(GameState* thisx) {
R_PICTO_PHOTO_STATE = PICTO_PHOTO_STATE_OFF;
PreRender_Init(&this->pauseBgPreRender);
- PreRender_SetValuesSave(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL, NULL);
- PreRender_SetValues(&this->pauseBgPreRender, D_801FBBCC, D_801FBBCE, NULL, NULL);
+ PreRender_SetValuesSave(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL, NULL);
+ PreRender_SetValues(&this->pauseBgPreRender, gCfbWidth, gCfbHeight, NULL, NULL);
- this->unk_18E64 = D_801FBB90;
+ this->unk_18E64 = gWorkBuffer;
this->pictoPhotoI8 = gPictoPhotoI8;
this->unk_18E68 = D_80784600;
this->unk_18E58 = D_80784600;
@@ -2324,11 +2325,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);
@@ -2342,6 +2343,3 @@ void Play_Init(GameState* thisx) {
sBombersNotebookOpen = false;
BombersNotebook_Init(&sBombersNotebook);
}
-
-//! TODO: fake symbol, remove when BombersNotebook_Update is matching
-u16 D_801D0D78[] = { 0, 0, 0, 0 };
diff --git a/src/code/z_play_hireso.c b/src/code/z_play_hireso.c
index 829fe71f2..b995028ca 100644
--- a/src/code/z_play_hireso.c
+++ b/src/code/z_play_hireso.c
@@ -1,27 +1,1363 @@
#include "global.h"
+#include "z64bombers_notebook.h"
+#include "interface/schedule_static/schedule_static.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AC10.s")
+// TODO: Needs YAZ0
+// Segment 0x07 schedule_dma_static_test
+extern TexturePtr D_07000000;
+extern TexturePtr D_07000800;
+extern TexturePtr D_07001000;
+extern TexturePtr D_07001800;
+extern TexturePtr D_07002000;
+extern TexturePtr D_07002800;
+extern TexturePtr D_07003000;
+extern TexturePtr D_07003800;
+extern TexturePtr D_07004000;
+extern TexturePtr D_07004800;
+extern TexturePtr D_07005000;
+extern TexturePtr D_07005800;
+extern TexturePtr D_07006000;
+extern TexturePtr D_07006800;
+extern TexturePtr D_07007000;
+extern TexturePtr D_07007800;
+extern TexturePtr D_07008000;
+extern TexturePtr D_07008800;
+extern TexturePtr D_07009000;
+extern TexturePtr D_07009800;
+extern TexturePtr D_0700AC00;
+extern TexturePtr D_0700AEA0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AE1C.s")
+#define BOMBERS_NOTEBOOK_ENTRY_SIZE 3
+#define BOMBERS_NOTEBOOK_ENTRY_MAX 10
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B278.s")
+#define BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, entry) (((&sBombersNotebookEntries[row][entry])[0] & 0xF00) >> 8)
+#define BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, entry) ((&sBombersNotebookEntries[row][entry])[0] & 0xFF)
+#define BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[1])
+#define BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[2])
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B4B0.s")
+#define BOMBERS_NOTEBOOK_ENTRY(pos, day, event, startTime, endTime) \
+ ((pos)&0xF000) | (((day)&0xF) << 8) | ((event)&0xFF), (startTime), (endTime)
+#define BOMBERS_NOTEBOOK_ENTRY_END 0x9999
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016C344.s")
+#define BOMBERS_NOTEBOOK_ENTRY_POS_CENTER 0x0000
+#define BOMBERS_NOTEBOOK_ENTRY_POS_BELOW 0x4000
+#define BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE 0x8000
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016CD4C.s")
+typedef enum {
+ /* 0 */ BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT,
+ /* 1 */ BOMBERS_NOTEBOOK_EVENT_ICON_MASK,
+ /* 2 */ BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON
+} BombersNotebookEventIcon;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016E40C.s")
+#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE 0xFFF0
+#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI 0xFFF1
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016EA90.s")
+u16 sBombersNotebookEntries[BOMBERS_NOTEBOOK_PERSON_MAX][BOMBERS_NOTEBOOK_ENTRY_MAX * BOMBERS_NOTEBOOK_ENTRY_SIZE] = {
+ {
+ /* Bombers */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Anju */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY,
+ CLOCK_TIME(13, 45), CLOCK_TIME(16, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING,
+ CLOCK_TIME(14, 30), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI,
+ CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI,
+ CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(17, 0),
+ CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3,
+ BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(6, 0),
+ CLOCK_TIME(12, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
+ CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Kafei */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, CLOCK_TIME(16, 30),
+ CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT,
+ CLOCK_TIME(18, 0), CLOCK_TIME(19, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK,
+ CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Curiosity Shop Man */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK,
+ CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL,
+ CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK,
+ CLOCK_TIME(22, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Old Lady from Bomb Shop */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK,
+ CLOCK_TIME(0, 30), CLOCK_TIME(1, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Romani */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM,
+ CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE,
+ CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Cremia */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Mayor Dotour */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP,
+ CLOCK_TIME(8, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Madame Aroma */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK,
+ CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Toto */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Gorman */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0),
+ CLOCK_TIME(5, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Postman */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
+ CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI,
+ CLOCK_TIME(6, 0), CLOCK_TIME(12, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP,
+ CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Rosa Sisters */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* ??? */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Anju's Grandmother */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2,
+ BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0),
+ CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Kamaro */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK,
+ CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Grog */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD,
+ CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Gorman Brothers */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA,
+ CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Shiro */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK,
+ CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+ {
+ /* Guru-Guru */
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK,
+ CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)),
+ BOMBERS_NOTEBOOK_ENTRY_END,
+ },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s")
+s16 sBombersNotebookDayRectRectLeft[] = { 120, 120, 270, 420 };
+TexturePtr sBombersNotebookDayTextures[] = {
+ gBombersNotebookDay1stTex,
+ gBombersNotebookDay2ndTex,
+ gBombersNotebookDayFinalTex,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016F4EC.s")
+#define DEFINE_EVENT(_enum, icon, _colorFlag, _description, _completedMessage, _completedFlag) icon,
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s")
+s32 sBombersNotebookEventIcons[] = {
+#include "tables/bombers_notebook/event_table.h"
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s")
+#undef DEFINE_EVENT
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s")
+s32 sBombersNotebookEventIconWidths[] = { 16, 24, 32 };
+s32 sBombersNotebookEventIconHeights[] = { 16, 28, 28 };
+
+#define DEFINE_EVENT(_enum, _icon, colorFlag, _description, _completedMessage, _completedFlag) colorFlag,
+
+u16 sBombersNotebookEventColorWeekEventFlags[] = {
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_EVENT
+
+void BombersNotebook_DrawScisTexRect(Gfx** gfxP, s32 rxl, s32 ryl, s32 rxh, s32 ryh, s32 tile, s32 s, s32 t, s32 dsdx,
+ s32 dtdy) {
+ s32 xl = rxl - (gCfbLeftAdjust * 4);
+ s32 yl = ryl - (gCfbUpperAdjust * 4);
+ s32 xh = rxh - (gCfbLeftAdjust * 4);
+ s32 yh = ryh - (gCfbUpperAdjust * 4);
+ Gfx* gfx = *gfxP;
+
+ gSPScisTextureRectangle(gfx++, xl, yl, xh, yh, tile, s, t, dsdx, dtdy);
+
+ *gfxP = gfx;
+}
+
+s16 sBombersNotebookHeaderColors[][3] = {
+ { 116, 134, 146 }, // Column 1
+ { 158, 156, 131 }, // Column 2
+ { 174, 141, 151 }, // Column 3
+};
+
+void BombersNotebook_DrawHeaders(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s32 i;
+ s32 rectLeft;
+
+ gDPLoadTextureBlock(gfx++, gBombersNotebookHeaderBoxTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ for (i = 0, rectLeft = 120; i < ARRAY_COUNT(sBombersNotebookHeaderColors); i++, rectLeft += 150) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookHeaderColors[i][0], sBombersNotebookHeaderColors[i][1],
+ sBombersNotebookHeaderColors[i][2], 192);
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 74 * 4, (rectLeft + 143) * 4, 98 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ for (i = 0, rectLeft = 124; i < ARRAY_COUNT(sBombersNotebookDayTextures); i++, rectLeft += 150) {
+ gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 48, 22, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 77 * 4, (rectLeft + 48) * 4, 99 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ }
+
+ rectLeft = 172;
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebook1800Tex, G_IM_FMT_IA, 48, 11, 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);
+ for (i = 0; i < 3; i++) {
+ BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 86 * 4, (rectLeft + 48) * 4, 97 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ rectLeft += 150;
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+// Each column/day gets subdivided into 4 sub columns, the first 2 sub columns use 1 color, the last 2 another
+s16 sBombersNotebookColumnColors[][2][3] = {
+ { { 165, 183, 195 }, { 140, 158, 170 } }, // Column 1
+ { { 197, 195, 172 }, { 172, 170, 147 } }, // Column 2
+ { { 223, 190, 200 }, { 190, 165, 175 } }, // Column 3
+};
+
+void BombersNotebook_DrawColumns(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s16* color;
+ s32 i;
+ s32 j;
+ s32 k;
+ s32 columnRectLeft;
+ s32 subColumnRectLeft;
+ s32 pad;
+
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookSubColumnBoxTex, G_IM_FMT_I, 48, 1, 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);
+
+ color = &sBombersNotebookColumnColors[0][0][0];
+ for (i = 0, columnRectLeft = 120; i < ARRAY_COUNT(sBombersNotebookColumnColors); i++, columnRectLeft += 150) {
+ subColumnRectLeft = columnRectLeft;
+ for (j = 0; j < 2; j++) {
+ gDPSetPrimColor(gfx++, 0, 0, color[0], color[1], color[2], 192);
+ for (k = 0; k < 2; k++) {
+ BombersNotebook_DrawScisTexRect(&gfx, subColumnRectLeft * 4, 104 * 4, (subColumnRectLeft + 48) * 4,
+ 480 * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ subColumnRectLeft += 36;
+ }
+ color += 3;
+ }
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+TexturePtr sBombersNotebookEventIconTextures[] = {
+ gBombersNotebookEntryIconExclamationPointTex,
+ &D_0700AC00,
+ &D_0700AEA0,
+};
+s16 sBombersNotebookEntryIconColors[][3] = {
+ { 255, 255, 0 },
+ { 141, 255, 182 },
+ { 255, 100, 60 },
+};
+
+void BombersNotebook_DrawEntries(Gfx** gfxP, s32 row, u32 rectTop) {
+ Gfx* gfx = *gfxP;
+ s32 entryRectLeft;
+ u32 eventIcon;
+ u32 unfinishedEvent = false;
+ u16 startTime;
+ u16 endTime;
+ s32 j = 0;
+ u32 iconRectLeft;
+ s32 entryRectRight;
+ u32 yOffset;
+ s32 entryWidth;
+
+ while (true) {
+ if (sBombersNotebookEntries[row][j] == BOMBERS_NOTEBOOK_ENTRY_END) {
+ if (!unfinishedEvent) {
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookStampTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 48, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, 567 * 4, (rectTop + 1) * 4, 599 * 4, (rectTop + 49) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPSetEnvColor(gfx++, 255, 0, 0, 255);
+ BombersNotebook_DrawScisTexRect(&gfx, 565 * 4, (rectTop + -1) * 4, 597 * 4, (rectTop + 47) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ }
+ break;
+ }
+
+ if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset = 8;
+ } else if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
+ yOffset = 24;
+ } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset = 16;
+ }
+
+ startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, j) - CLOCK_TIME(6, 0);
+ endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, j) - CLOCK_TIME(6, 0);
+ entryRectLeft =
+ sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (startTime / CLOCK_TIME(0, 10));
+ entryRectRight =
+ sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (endTime / CLOCK_TIME(0, 10));
+ entryWidth = entryRectRight - entryRectLeft - 8;
+ if ((entryRectRight - entryRectLeft) < 8) {
+ entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
+ entryRectRight = entryRectLeft + 8;
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectLeft + 6) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -2) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectRight + 2) * 4, (rectTop + yOffset + 18) * 4, 0, 0x80, 0, 1 << 10,
+ 1 << 10);
+ if (entryWidth > 0) {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 6) * 4, (rectTop + yOffset + 2) * 4,
+ (entryRectLeft + 6 + entryWidth) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ //! FAKE: the ^ 0
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft * 4) ^ 0, (rectTop + yOffset) * 4, (entryRectLeft + 4) * 4,
+ (rectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ //! FAKE: the ^ 0
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -4) * 4, (rectTop + yOffset) * 4,
+ (entryRectRight * 4) ^ 0, (rectTop + yOffset + 16) * 4, 0, 0x80, 0, 1 << 10,
+ 1 << 10);
+ if (entryWidth > 0) {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 4) * 4, (rectTop + yOffset) * 4,
+ (entryRectLeft + 4 + entryWidth) * 4, (rectTop + yOffset + 16) * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ }
+
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j)])) {
+ eventIcon =
+ sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - BOMBERS_NOTEBOOK_PERSON_MAX];
+ if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[eventIcon]) {
+ iconRectLeft =
+ (((entryRectLeft - sBombersNotebookEventIconWidths[eventIcon]) + entryRectRight) - entryRectLeft) +
+ 3;
+ } else {
+ iconRectLeft = (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[eventIcon]) / 2) +
+ entryRectLeft;
+ }
+
+ if ((eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
+ if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset -= 12;
+ } else if (!(sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
+ // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset -= 6;
+ }
+ }
+ gDPLoadTextureBlock(gfx++, sBombersNotebookEventIconTextures[eventIcon], G_IM_FMT_IA, G_IM_SIZ_8b,
+ sBombersNotebookEventIconWidths[eventIcon], sBombersNotebookEventIconHeights[eventIcon],
+ 0, G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (iconRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4,
+ (iconRectLeft + 2 + sBombersNotebookEventIconWidths[eventIcon]) * 4,
+ (rectTop + yOffset + 2 + sBombersNotebookEventIconHeights[eventIcon]) * 4,
+ 0, 0, 0, 1 << 10, 1 << 10);
+ if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX] ==
+ BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX] ==
+ BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN)) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
+ }
+ } else {
+ if (CHECK_WEEKEVENTREG(
+ sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) -
+ BOMBERS_NOTEBOOK_PERSON_MAX])) {
+ gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0],
+ sBombersNotebookEntryIconColors[eventIcon][1],
+ sBombersNotebookEntryIconColors[eventIcon][2], 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255);
+ }
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, iconRectLeft * 4, (rectTop + yOffset) * 4,
+ (iconRectLeft + sBombersNotebookEventIconWidths[eventIcon]) * 4,
+ (rectTop + yOffset + sBombersNotebookEventIconHeights[eventIcon]) * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ } else {
+ unfinishedEvent = true;
+ }
+ j += BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ }
+
+ *gfxP = gfx;
+}
+
+#define DEFINE_PERSON(_enum, photo, _description, _metEnum, _metMessage, _metFlag) &photo,
+
+TexturePtr sBombersNotebookPhotoTextures[] = {
+#include "tables/bombers_notebook/person_table.h"
+};
+
+#undef DEFINE_PERSON
+
+void BombersNotebook_DrawRows(BombersNotebook* this, Gfx** gfxP) {
+ static s16 sBarColorR = 0;
+ static s16 sBarColorG = 0;
+ static s16 sBarColorB = 0;
+ static s16 sBarColorTimer = 10;
+ static s16 sBarColorIndex = 0;
+ static s16 sBarColorTargetsR[] = { 100, 0 };
+ static s16 sBarColorTargetsG[] = { 80, 0 };
+ static s16 sBarColorTargetsB[] = { 255, 0 };
+ Gfx* gfx = *gfxP;
+ s32 photoWidth;
+ s32 rowEnd;
+ s32 cursorPage;
+ u32 barRectLeft;
+ f32 photoRectDs;
+ u32 photoOffset;
+ s32 i;
+ u32 rectTop;
+ s16 colorStep;
+
+ colorStep = ABS_ALT(sBarColorR - sBarColorTargetsR[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorR >= sBarColorTargetsR[sBarColorIndex]) {
+ sBarColorR -= colorStep;
+ } else {
+ sBarColorR += colorStep;
+ }
+
+ colorStep = ABS_ALT(sBarColorG - sBarColorTargetsG[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorG >= sBarColorTargetsG[sBarColorIndex]) {
+ sBarColorG -= colorStep;
+ } else {
+ sBarColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sBarColorB - sBarColorTargetsB[sBarColorIndex]) / sBarColorTimer;
+ if (sBarColorB >= sBarColorTargetsB[sBarColorIndex]) {
+ sBarColorB -= colorStep;
+ } else {
+ sBarColorB += colorStep;
+ }
+
+ sBarColorTimer--;
+ if (sBarColorTimer == 0) {
+ sBarColorTimer = 10;
+ sBarColorR = sBarColorTargetsR[sBarColorIndex];
+ sBarColorG = sBarColorTargetsG[sBarColorIndex];
+ sBarColorB = sBarColorTargetsB[sBarColorIndex];
+ sBarColorIndex ^= 1;
+ }
+
+ rectTop = this->scrollOffset + 107;
+ if (this->cursorPage >= (BOMBERS_NOTEBOOK_PERSON_MAX - 8)) {
+ rowEnd = BOMBERS_NOTEBOOK_PERSON_MAX;
+ i = this->cursorPage;
+ } else {
+ rowEnd = this->cursorPage + 8;
+ i = rowEnd - 8;
+ }
+ cursorPage = i;
+ for (; i < rowEnd; i++, rectTop += 52) {
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
+ gDPLoadTextureBlock(gfx++, sBombersNotebookPhotoTextures[i], G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+ } else {
+ gDPLoadTextureBlock(gfx++, gBombersNotebookEmptyPhotoTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+ }
+ if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
+ barRectLeft = 56;
+ photoOffset = 8;
+ photoRectDs = 200.0f;
+ photoWidth = 64;
+ } else {
+ barRectLeft = 48;
+ photoOffset = 0;
+ photoRectDs = 150.0f;
+ photoWidth = 48;
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, (57 - photoOffset) * 4, (rectTop - photoOffset) * 4,
+ (57 - photoOffset + photoWidth) * 4, (rectTop - photoOffset + photoWidth) * 4,
+ 0, 0, 0, 1024.0f / (photoRectDs / 100.0f), 1024.0f / (photoRectDs / 100.0f));
+
+ if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) {
+ gDPSetPrimColor(gfx++, 0, 0, sBarColorR, sBarColorG, sBarColorB, 255);
+ } else {
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 60);
+ }
+ gDPLoadTextureBlock(gfx++, gBombersNotebookBarTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 4, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft + 57) * 4, (rectTop + 22) * 4,
+ (barRectLeft - photoOffset + 527) * 4, (rectTop + 26) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft - photoOffset + 527) * 4, (rectTop + 16) * 4,
+ (barRectLeft - photoOffset + 543) * 4, (rectTop + 32) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) {
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+
+ BombersNotebook_DrawEntries(&gfx, i, rectTop);
+
+ gDPPipeSync(gfx++);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+ }
+ }
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+TexturePtr sBombersNotebookDigitTextures[] = {
+ gBombersNotebookDigit0Tex, gBombersNotebookDigit1Tex, gBombersNotebookDigit2Tex, gBombersNotebookDigit3Tex,
+ gBombersNotebookDigit4Tex, gBombersNotebookDigit5Tex, gBombersNotebookDigit6Tex, gBombersNotebookDigit7Tex,
+ gBombersNotebookDigit8Tex, gBombersNotebookDigit9Tex,
+};
+u8 sBombersNotebookDigitRectLeftOffsets[] = { 13, 8, 12, 13, 14, 13, 12, 12, 13, 12 };
+s16 sBombersNotebookDayTexRectLeftOffsets[] = { 16, 12, 9 };
+
+#define CURRENT_DAY_CLAMP_MIN_1 ((CURRENT_DAY == 0) ? 1 : CURRENT_DAY)
+void BombersNotebook_DrawTimeOfDay(Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ u32 timeOfDayRectLeft;
+ u32 timeBoxRectLeft;
+ u32 connectorRectLeft;
+ u32 lineRectLeft;
+ u32 digitsRectLeft;
+ u16 time;
+ s32 onesDigit;
+ s32 tensDigit;
+ s32 hours;
+
+ time = (((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0));
+ if (CURRENT_DAY == 0) {
+ time = 0;
+ }
+ timeOfDayRectLeft = sBombersNotebookDayRectRectLeft[CURRENT_DAY] + (time / CLOCK_TIME(0, 10));
+ if ((CURRENT_DAY_CLAMP_MIN_1 == 1) ||
+ ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (((void)0, gSaveContext.save.time) < CLOCK_TIME(12, 0)))) {
+ timeOfDayRectLeft -= 32;
+ lineRectLeft = timeOfDayRectLeft + 32;
+ } else if ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time >= (CLOCK_TIME(17, 0) - CLOCK_TIME(6, 0))) &&
+ (time <= (CLOCK_TIME(19, 0) - CLOCK_TIME(6, 0)))) {
+ timeOfDayRectLeft -= 64;
+ lineRectLeft = timeOfDayRectLeft + 64;
+ } else {
+ timeOfDayRectLeft -= 96;
+ lineRectLeft = timeOfDayRectLeft + 96;
+ }
+
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNoteoobkTimeOfDayBoxTex, G_IM_FMT_IA, 64, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, timeOfDayRectLeft * 4, 42 * 4, (timeOfDayRectLeft + 128) * 4, 70 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeOfDayTex, G_IM_FMT_I, 96, 20, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, (timeOfDayRectLeft + 16) * 4, 47 * 4, (timeOfDayRectLeft + 112) * 4, 67 * 4,
+ 0, 0, 0, 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ if (((CURRENT_DAY_CLAMP_MIN_1 >= 3) ||
+ ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time > (CLOCK_TIME(18, 0) - CLOCK_TIME(6, 0)))))) {
+ timeBoxRectLeft = timeOfDayRectLeft - 159;
+ connectorRectLeft = timeOfDayRectLeft - 17;
+ } else {
+ timeBoxRectLeft = timeOfDayRectLeft + 130;
+ connectorRectLeft = timeOfDayRectLeft + 113;
+ }
+
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxLeftTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, timeBoxRectLeft * 4, 42 * 4, (timeBoxRectLeft + 16) * 4, 70 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxMiddleTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 16) * 4, 42 * 4, (timeBoxRectLeft + 141) * 4, 70 * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxRightTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 141) * 4, 42 * 4, (timeBoxRectLeft + 157) * 4, 70 * 4, 0,
+ 0, 0, 1 << 10, 1 << 10);
+ gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[CURRENT_DAY_CLAMP_MIN_1 - 1], G_IM_FMT_IA, G_IM_SIZ_8b, 48,
+ 22, 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);
+ BombersNotebook_DrawScisTexRect(
+ &gfx, (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1]) * 4, 46 * 4,
+ (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1] + 48) * 4, 68 * 4, 0, 0,
+ 0, 1 << 10, 1 << 10);
+
+ gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 56) * 4, 48 * 4, (timeBoxRectLeft + 72) * 4, 0x100, 0, 0,
+ 0, 1 << 10, 1 << 10);
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
+ gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255);
+
+ tensDigit = 0;
+ onesDigit = ((void)0, gSaveContext.save.time) / CLOCK_TIME_HOUR;
+ if (CURRENT_DAY == 0) {
+ onesDigit = 6;
+ }
+ hours = onesDigit;
+ do {
+ if (onesDigit >= 10) {
+ tensDigit++;
+ onesDigit -= 10;
+ }
+ } while (onesDigit >= 10);
+
+ digitsRectLeft = timeBoxRectLeft + 75;
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[onesDigit];
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookColonTex, G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ digitsRectLeft += 7;
+ tensDigit = 0;
+ if (CURRENT_DAY == 0) {
+ onesDigit = TIME_TO_MINUTES_ALT_F((CLOCK_TIME_F(6, 0) - (hours * CLOCK_TIME_HOUR_F)));
+ } else {
+ onesDigit = TIME_TO_MINUTES_ALT_F(((void)0, gSaveContext.save.time) - (hours * CLOCK_TIME_HOUR_F));
+ }
+ do {
+ if (onesDigit >= 10) {
+ tensDigit++;
+ onesDigit -= 10;
+ }
+ } while (onesDigit >= 10);
+
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+ digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit];
+ gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 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);
+ BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 14, 0,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, connectorRectLeft * 4, 49 * 4, (connectorRectLeft + 32) * 4, 63 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPSetPrimColor(gfx++, 0, 0, 242, 0, 14, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookLineTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 1, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, lineRectLeft * 4, 74 * 4, (lineRectLeft + 32) * 4, 490 * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255);
+ gDPSetEnvColor(gfx++, 200, 0, 0, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ BombersNotebook_DrawScisTexRect(&gfx, (lineRectLeft + -11) * 4, 70 * 4, (lineRectLeft + 13) * 4, 86 * 4, 0, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_DrawCursor(BombersNotebook* this, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ s32 cursorRow;
+ s32 cursorEntry;
+ s32 entryRectRight;
+ s32 entryRectLeft;
+ s32 entryIcon;
+ u32 cursorRectLeft;
+ u32 cursorRectTop;
+ u32 yOffset;
+ u16 startTime;
+ u16 endTime;
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 205, 55, 255);
+ gDPSetEnvColor(gfx++, 0, 0, 0, 255);
+ gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_MIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD);
+
+ if (this->cursorEntry == 0) {
+ BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 97) * 4, 63 * 4,
+ (this->cursorPageRow * 52 + 113) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 97) * 4, 114 * 4,
+ (this->cursorPageRow * 52 + 113) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 147) * 4, 63 * 4,
+ (this->cursorPageRow * 52 + 163) * 4, 0, 0, 0x200, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 147) * 4, 114 * 4,
+ (this->cursorPageRow * 52 + 163) * 4, 0, 0x200, 0x200, 1 << 10, 1 << 10);
+ } else {
+ cursorRow = this->cursorPageRow + this->cursorPage;
+ cursorRectTop = (this->cursorPageRow * 52) + 107;
+ cursorEntry = this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE; // Offset from photo entry
+ if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset = 8;
+ } else if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) {
+ yOffset = 24;
+ } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset = 16;
+ }
+
+ startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
+ endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0);
+ entryRectLeft = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
+ (startTime / CLOCK_TIME(0, 10));
+ entryRectRight = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] +
+ (endTime / CLOCK_TIME(0, 10));
+ if ((entryRectRight - entryRectLeft) < 8) {
+ entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8;
+ entryRectRight = entryRectLeft + 8;
+ }
+ entryIcon = sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(cursorRow, cursorEntry) -
+ BOMBERS_NOTEBOOK_PERSON_MAX];
+ if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[entryIcon]) {
+ cursorRectLeft =
+ (((entryRectLeft - sBombersNotebookEventIconWidths[entryIcon]) + entryRectRight) - entryRectLeft) + 3;
+ } else {
+ cursorRectLeft =
+ (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[entryIcon]) / 2) + entryRectLeft;
+ }
+ if (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT) {
+ cursorRectLeft -= 8;
+ cursorRectTop -= 8;
+ } else {
+ cursorRectLeft -= 9;
+ cursorRectTop -= 8;
+ }
+ if ((entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) {
+ if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) {
+ yOffset -= 12;
+ } else if (!(sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) {
+ // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER
+ yOffset -= 6;
+ }
+ }
+ BombersNotebook_DrawScisTexRect(&gfx, cursorRectLeft * 4, (cursorRectTop + yOffset) * 4,
+ (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10,
+ 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
+ (cursorRectTop + yOffset) * 4,
+ (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
+ (cursorRectTop + yOffset + 16) * 4, 0, 0x200, 0, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(
+ &gfx, cursorRectLeft * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
+ (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) * 4,
+ 0, 0, 0x200, 1 << 10, 1 << 10);
+ BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4,
+ (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4,
+ (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4,
+ (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) *
+ 4,
+ 0, 0x200, 0x200, 1 << 10, 1 << 10);
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_DrawArrows(BombersNotebook* this, Gfx** gfxP) {
+ static s16 sUpperArrowColorR = 0;
+ static s16 sUpperArrowColorG = 100;
+ static s16 sUpperArrowColorB = 255;
+ static s16 sLowerArrowColorR = 0;
+ static s16 sLowerArrowColorG = 100;
+ static s16 sLowerArrowColorB = 255;
+ static s16 sUpperArrowColorIndex = 0;
+ static s16 sLowerArrowColorIndex = 0;
+ static s16 sUpperArrowColorTimer = 6;
+ static s16 sLowerArrowColorTimer = 6;
+ static s16 sUpperArrowOffsetY = 0;
+ static s16 sLowerArrowOffsetY = 0;
+ static s16 sArrowColorTargetsG[] = { 175, 100 };
+ static s16 sArrowColorTargetsB[] = { 205, 255 };
+ Gfx* gfx = *gfxP;
+ u32 rectTop;
+ s16 colorStep;
+
+ gDPPipeSync(gfx++);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP,
+ G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, 4, G_TX_NOLOD, G_TX_NOLOD);
+
+ colorStep = ABS_ALT(sUpperArrowColorG - sArrowColorTargetsG[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
+ if (sUpperArrowColorG >= sArrowColorTargetsG[sUpperArrowColorIndex]) {
+ sUpperArrowColorG -= colorStep;
+ } else {
+ sUpperArrowColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sUpperArrowColorB - sArrowColorTargetsB[sUpperArrowColorIndex]) / sUpperArrowColorTimer;
+ if (sUpperArrowColorB >= sArrowColorTargetsB[sUpperArrowColorIndex]) {
+ sUpperArrowColorB -= colorStep;
+ } else {
+ sUpperArrowColorB += colorStep;
+ }
+
+ sUpperArrowColorTimer--;
+ if (sUpperArrowColorTimer == 0) {
+ sUpperArrowOffsetY ^= 6;
+ sUpperArrowColorTimer = 6;
+ sUpperArrowColorG = sArrowColorTargetsG[sUpperArrowColorIndex];
+ sUpperArrowColorB = sArrowColorTargetsB[sUpperArrowColorIndex];
+ sUpperArrowColorIndex ^= 1;
+ }
+
+ colorStep = ABS_ALT(sLowerArrowColorG - sArrowColorTargetsG[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
+ if (sLowerArrowColorG >= sArrowColorTargetsG[sLowerArrowColorIndex]) {
+ sLowerArrowColorG -= colorStep;
+ } else {
+ sLowerArrowColorG += colorStep;
+ }
+
+ colorStep = ABS_ALT(sLowerArrowColorB - sArrowColorTargetsB[sLowerArrowColorIndex]) / sLowerArrowColorTimer;
+ if (sLowerArrowColorB >= sArrowColorTargetsB[sLowerArrowColorIndex]) {
+ sLowerArrowColorB -= colorStep;
+ } else {
+ sLowerArrowColorB += colorStep;
+ }
+
+ sLowerArrowColorTimer--;
+ if (sLowerArrowColorTimer == 0) {
+ sLowerArrowOffsetY ^= 6;
+ sLowerArrowColorTimer = 6;
+ sLowerArrowColorG = sArrowColorTargetsG[sLowerArrowColorIndex];
+ sLowerArrowColorB = sArrowColorTargetsB[sLowerArrowColorIndex];
+ sLowerArrowColorIndex ^= 1;
+ }
+
+ if (this->cursorPage != 0) {
+ gDPPipeSync(gfx++);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(gfx++, 0, 0, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
+ gDPSetEnvColor(gfx++, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255);
+ rectTop = (-sUpperArrowOffsetY + 83) * 4;
+ BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, rectTop, 70 * 4, rectTop + (16 * 4), 0, 0, 0x200, 1 << 10,
+ 1 << 10);
+ }
+
+ if (this->cursorPage < 16) {
+ gDPPipeSync(gfx++);
+ gDPSetPrimColor(gfx++, 0, 0, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
+ gDPSetEnvColor(gfx++, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255);
+ BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, (sLowerArrowOffsetY + 319) * 4, 70 * 4,
+ (sLowerArrowOffsetY + 335) * 4, 0, 0, 0, 1 << 10, 1 << 10);
+ }
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx) {
+ Gfx* gfx;
+ s32 pad[2];
+
+ func_8012CF0C(gfxCtx, this->loadState != BOMBERS_NOTEBOOK_LOAD_STATE_DONE, false, 0, 0, 0);
+
+ OPEN_DISPS(gfxCtx);
+
+ gfx = POLY_OPA_DISP;
+
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
+ gSPSegment(gfx++, 0x07, this->scheduleDmaSegment);
+ gSPSegment(gfx++, 0x08, this->scheduleSegment);
+ gfx = Gfx_SetupDL39(gfx);
+ gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2);
+ gDPSetPrimColor(gfx++, 0, 0, 255, 255, 215, 255);
+ gDPSetEnvColor(gfx++, 100, 100, 100, 255);
+ gDPLoadTextureBlock(gfx++, gBombersNotebookBackgroundTex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD);
+
+ BombersNotebook_DrawScisTexRect(&gfx, 0 * 4, 0 * 4, SCREEN_WIDTH_HIRES * 4, SCREEN_HEIGHT_HIRES * 4, 0, 0, 0,
+ 0x200, 0x200);
+
+ gDPPipeSync(gfx++);
+ gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
+
+ BombersNotebook_DrawHeaders(&gfx);
+ BombersNotebook_DrawColumns(&gfx);
+
+ gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 86, 600, 450);
+ BombersNotebook_DrawRows(this, &gfx);
+
+ gDPPipeSync(gfx++);
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+
+ BombersNotebook_DrawTimeOfDay(&gfx);
+
+ if (this->scrollAmount == 0) {
+ BombersNotebook_DrawCursor(this, &gfx);
+ }
+ BombersNotebook_DrawArrows(this, &gfx);
+ }
+ POLY_OPA_DISP = gfx;
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void BombersNotebook_LoadFiles(BombersNotebook* this, s32 flag) {
+ switch (this->loadState) {
+ case BOMBERS_NOTEBOOK_LOAD_STATE_NONE:
+ if (this->scheduleDmaSegment == NULL) {
+ break;
+ }
+ CmpDma_LoadAllFiles(this->scheduleDmaSegmentStart, this->scheduleDmaSegment, this->scheduleDmaSegmentSize);
+ osCreateMesgQueue(&this->loadQueue, this->loadMsg, ARRAY_COUNT(this->loadMsg));
+ DmaMgr_SendRequestImpl(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart,
+ this->scheduleSegmentSize, 0, &this->loadQueue, NULL);
+ this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_STARTED;
+ // fallthrough
+ case BOMBERS_NOTEBOOK_LOAD_STATE_STARTED:
+ if (osRecvMesg(&this->loadQueue, NULL, flag) == 0) {
+ this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_DONE;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+#define DEFINE_PERSON(_enum, _photo, description, _metEnum, _metMessage, _metFlag) description,
+#define DEFINE_EVENT(_enum, _icon, _colorFlag, description, _completedMessage, _completedFlag) description,
+
+u16 sBombersNotebookTextIds[] = {
+#include "tables/bombers_notebook/person_table.h"
+#include "tables/bombers_notebook/event_table.h"
+};
+
+#undef DEFINE_PERSON
+#undef DEFINE_EVENT
+
+void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input) {
+ static s16 sStickXRepeatTimer = 0;
+ static s16 sStickYRepeatTimer = 0;
+ static s16 sStickXRepeatState = 0;
+ static s16 sStickYRepeatState = 0;
+ s32 stickAdjX = input->rel.stick_x;
+ s32 stickAdjY = input->rel.stick_y;
+ s32 cursorEntryScan;
+
+ this->scheduleDmaSegmentStart = SEGMENT_ROM_START(schedule_dma_static_test);
+ this->scheduleDmaSegmentSize = SEGMENT_ROM_SIZE(schedule_dma_static_old);
+ this->scheduleSegmentStart = SEGMENT_ROM_START(schedule_static);
+ this->scheduleSegmentSize = SEGMENT_ROM_SIZE(schedule_static);
+
+ if (this->scheduleDmaSegment == NULL) {
+ this->scheduleDmaSegment = ZeldaArena_Malloc(this->scheduleDmaSegmentSize);
+ }
+
+ if (this->scheduleSegment == NULL) {
+ this->scheduleSegment = ZeldaArena_Malloc(this->scheduleSegmentSize);
+ }
+
+ BombersNotebook_LoadFiles(this, OS_MESG_NOBLOCK);
+
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) {
+ if (stickAdjX < -30) {
+ if (sStickXRepeatState == -1) {
+ sStickXRepeatTimer--;
+ if (sStickXRepeatTimer < 0) {
+ sStickXRepeatTimer = 2;
+ } else {
+ stickAdjX = 0;
+ }
+ } else {
+ sStickXRepeatTimer = 10;
+ sStickXRepeatState = -1;
+ }
+ } else if (stickAdjX > 30) {
+ if (sStickXRepeatState == 1) {
+ sStickXRepeatTimer--;
+ if (sStickXRepeatTimer < 0) {
+ sStickXRepeatTimer = 2;
+ } else {
+ stickAdjX = 0;
+ }
+ } else {
+ sStickXRepeatTimer = 10;
+ sStickXRepeatState = 1;
+ }
+ } else {
+ sStickXRepeatState = 0;
+ }
+
+ if (stickAdjY < -30) {
+ if (sStickYRepeatState == -1) {
+ sStickYRepeatTimer--;
+ if (sStickYRepeatTimer < 0) {
+ sStickYRepeatTimer = 2;
+ } else {
+ stickAdjY = 0;
+ }
+ } else {
+ sStickYRepeatTimer = 10;
+ sStickYRepeatState = -1;
+ }
+ } else if (stickAdjY > 30) {
+ if (sStickYRepeatState == 1) {
+ sStickYRepeatTimer--;
+ if (sStickYRepeatTimer < 0) {
+ sStickYRepeatTimer = 2;
+ } else {
+ stickAdjY = 0;
+ }
+ } else {
+ sStickYRepeatTimer = 10;
+ sStickYRepeatState = 1;
+ }
+ } else {
+ sStickYRepeatState = 0;
+ }
+
+ if (this->scrollAmount == 0) {
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[this->cursorPageRow + this->cursorPage])) {
+ cursorEntryScan = this->cursorEntry;
+ if (stickAdjX > 30) {
+ while (true) {
+ cursorEntryScan += BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (sBombersNotebookEntries[this->cursorPageRow + this->cursorPage]
+ [cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE] ==
+ BOMBERS_NOTEBOOK_ENTRY_END) {
+ while (true) {
+ cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (cursorEntryScan == 0) {
+ play_sound(NA_SE_SY_ERROR);
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_ERROR);
+ break;
+ }
+ }
+ break;
+ }
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_CURSOR);
+ break;
+ }
+ }
+ this->cursorEntry = cursorEntryScan;
+ } else if (stickAdjX < -30) {
+ if (cursorEntryScan != 0) {
+ do {
+ cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE;
+ if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) {
+ play_sound(NA_SE_SY_CURSOR);
+ break;
+ }
+ } while (cursorEntryScan != 0);
+ this->cursorEntry = cursorEntryScan;
+ }
+ }
+ if (this->cursorEntry != 0) {
+ if (play->msgCtx.currentTextId !=
+ sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage, this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]) {
+ Message_ContinueTextbox(play, sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(
+ this->cursorPageRow + this->cursorPage,
+ this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]);
+ }
+ } else {
+ if (play->msgCtx.currentTextId != sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]) {
+ Message_ContinueTextbox(play, sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]);
+ }
+ }
+ } else {
+ Message_CloseTextbox(play);
+ }
+
+ if (stickAdjY < -30) {
+ if (this->cursorPageRow < 3) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorEntry = 0;
+ this->cursorPageRow++;
+ } else if (this->cursorPage < (BOMBERS_NOTEBOOK_PERSON_MAX - 4)) {
+ if (sStickYRepeatState == -1) {
+ this->scrollAmount = -24;
+ } else {
+ this->scrollAmount = -12;
+ }
+ this->scrollOffset = 0;
+ this->cursorEntry = 0;
+ }
+ } else if (stickAdjY > 30) {
+ if (this->cursorPageRow > 0) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorEntry = 0;
+ this->cursorPageRow--;
+ } else if (this->cursorPage != 0) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->cursorPage--;
+ if (sStickYRepeatState == 1) {
+ this->scrollAmount = 24;
+ } else {
+ this->scrollAmount = 12;
+ }
+ this->scrollOffset = -48;
+ this->cursorEntry = 0;
+ }
+ }
+ } else if (this->scrollAmount < 0) {
+ this->scrollOffset += this->scrollAmount;
+ if (ABS_ALT(this->scrollOffset) >= 48) {
+ play_sound(NA_SE_SY_CURSOR);
+ this->scrollOffset = 0;
+ this->scrollAmount = 0;
+ this->cursorPage++;
+ }
+ } else {
+ this->scrollOffset += this->scrollAmount;
+ if (this->scrollOffset == 0) {
+ this->scrollOffset = 0;
+ this->scrollAmount = 0;
+ }
+ }
+ }
+}
+
+void BombersNotebook_Init(BombersNotebook* this) {
+ bzero(this, sizeof(BombersNotebook));
+}
+
+void BombersNotebook_Destroy(BombersNotebook* this) {
+ if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_STARTED) {
+ BombersNotebook_LoadFiles(this, OS_MESG_BLOCK);
+ }
+ if (this->scheduleDmaSegment != NULL) {
+ ZeldaArena_Free(this->scheduleDmaSegment);
+ this->scheduleDmaSegment = NULL;
+ }
+ //! @bug: Does not free malloc'd memory for schedule segment
+}
diff --git a/src/code/z_player_call.c b/src/code/z_player_call.c
index a109dab17..6aee18baf 100644
--- a/src/code/z_player_call.c
+++ b/src/code/z_player_call.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define FLAGS \
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index f8b33b853..2e2d2222d 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -257,7 +257,7 @@ void func_80122C20(PlayState* play, struct_80122D44_arg1* arg1) {
for (i = 0; i < ARRAY_COUNT(arg1->unk_04); i++, temp_v1++) {
// Can't be `temp_v1->alpha != 0`
if (temp_v1->alpha) {
- phi_a1 = temp_v1->unk_00 == 3 ? (255 / 3) : (255 / 5);
+ phi_a1 = (temp_v1->unk_00 == 3) ? (255 / 3) : (255 / 5);
if (phi_a1 >= temp_v1->alpha) {
temp_v1->alpha = 0;
} else {
@@ -270,7 +270,7 @@ void func_80122C20(PlayState* play, struct_80122D44_arg1* arg1) {
typedef struct {
/* 0x0 */ Color_RGB8 color;
/* 0x4 */ Gfx* dList;
-} struct_801BFDD0; // size = 0x08
+} struct_801BFDD0; // size = 0x8
struct_801BFDD0 D_801BFDD0[] = {
{ { 180, 200, 255 }, gLinkGoronCurledDL },
@@ -369,13 +369,13 @@ void func_80122F28(Player* player) {
s32 func_80122F9C(PlayState* play) {
Player* player = GET_PLAYER(play);
- return (player->stateFlags2 & PLAYER_STATE2_80000) && player->unk_AE7 == 2;
+ return (player->stateFlags2 & PLAYER_STATE2_80000) && (player->unk_AE7 == 2);
}
s32 func_80122FCC(PlayState* play) {
Player* player = GET_PLAYER(play);
- return (player->stateFlags2 & PLAYER_STATE2_80000) && (player->unk_AE7 == 1 || player->unk_AE7 == 3);
+ return (player->stateFlags2 & PLAYER_STATE2_80000) && ((player->unk_AE7 == 1) || (player->unk_AE7 == 3));
}
void func_8012300C(PlayState* play, s32 arg1) {
@@ -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;
@@ -1362,12 +1363,12 @@ s32 func_80123F2C(PlayState* play, s32 ammo) {
}
s32 Player_IsBurningStickInRange(PlayState* play, Vec3f* pos, f32 xzRange, f32 yRange) {
- Player* this = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
Vec3f diff;
s32 pad;
- if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_B28 != 0)) {
- Math_Vec3f_Diff(&this->meleeWeaponInfo[0].tip, pos, &diff);
+ if ((player->heldItemAction == PLAYER_IA_STICK) && (player->unk_B28 != 0)) {
+ Math_Vec3f_Diff(&player->meleeWeaponInfo[0].tip, pos, &diff);
return (SQXZ(diff) <= SQ(xzRange)) && (0.0f <= diff.y) && (diff.y <= yRange);
}
@@ -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;
}
@@ -1539,10 +1540,8 @@ void Player_UpdateBunnyEars(Player* player) {
sBunnyEarKinematics.angVel.y += -sBunnyEarKinematics.rot.y >> 2;
angle = player->actor.world.rot.y - player->actor.shape.rot.y;
- force.x =
- (s32)(player->actor.speed * -200.0f * Math_CosS(angle) * (randPlusMinusPoint5Scaled(2.0f) + 10.0f)) & 0xFFFF;
- force.y =
- (s32)(player->actor.speed * 100.0f * Math_SinS(angle) * (randPlusMinusPoint5Scaled(2.0f) + 10.0f)) & 0xFFFF;
+ force.x = (s32)(player->actor.speed * -200.0f * Math_CosS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF;
+ force.y = (s32)(player->actor.speed * 100.0f * Math_SinS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF;
sBunnyEarKinematics.angVel.x += force.x >> 2;
sBunnyEarKinematics.angVel.y += force.y >> 2;
@@ -1642,9 +1641,9 @@ TexturePtr sPlayerMouthTextures[PLAYER_MOUTH_MAX] = {
};
typedef struct PlayerFaceIndices {
- /* 0x00 */ u8 eyeIndex;
- /* 0x01 */ u8 mouthIndex;
-} PlayerFaceIndices; // size = 0x02
+ /* 0x0 */ u8 eyeIndex;
+ /* 0x1 */ u8 mouthIndex;
+} PlayerFaceIndices; // size = 0x2
PlayerFaceIndices sPlayerFaces[] = {
{ PLAYER_EYES_OPEN, PLAYER_MOUTH_CLOSED }, // PLAYER_FACE_0
@@ -1800,7 +1799,7 @@ void Player_AdjustSingleLeg(PlayState* play, Player* player, SkelAnime* skelAnim
temp_f20 = sp74 - SQ(sp58);
temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20);
- sp4C = func_80086B30(temp_f20, sp58);
+ sp4C = Math_FAtan2F(temp_f20, sp58);
distance = sqrtf(SQ(diffX) + SQ(yIntersect - sp90.y) + SQ(diffZ));
sp58 = (SQ(distance) + sp70) / (2.0f * distance);
sp54 = distance - sp58;
@@ -1808,8 +1807,8 @@ void Player_AdjustSingleLeg(PlayState* play, Player* player, SkelAnime* skelAnim
temp_f20 = sp74 - SQ(sp58);
temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20);
- sp48 = func_80086B30(temp_f20, sp58);
- phi_t1 = (M_PI - (func_80086B30(sp54, temp_f20) + ((M_PI / 2.0f) - sp48))) * (0x8000 / M_PI);
+ sp48 = Math_FAtan2F(temp_f20, sp58);
+ phi_t1 = (M_PI - (Math_FAtan2F(sp54, temp_f20) + ((M_PI / 2.0f) - sp48))) * (0x8000 / M_PI);
phi_t1 = -skelAnime->jointTable[shinLimbIndex].z + phi_t1;
temp_f8 = (sp48 - sp4C) * (0x8000 / M_PI);
@@ -1854,7 +1853,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 +2037,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 +2551,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 +2715,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 +3297,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 +3414,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 +3422,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 +3459,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 +3519,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 +3591,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 +3813,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 +3821,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..097d4d946 100644
--- a/src/code/z_prenmi.c
+++ b/src/code/z_prenmi.c
@@ -1,3 +1,4 @@
+#include "global.h"
#include "z_prenmi.h"
void PreNMI_Stop(PreNMIState* this) {
@@ -9,10 +10,9 @@ void PreNMI_Update(PreNMIState* this) {
if (this->timer == 0) {
ViConfig_UpdateVi(1);
PreNMI_Stop(this);
- return;
+ } else {
+ this->timer--;
}
-
- this->timer--;
}
void PreNMI_Draw(PreNMIState* this) {
@@ -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);
@@ -48,7 +48,7 @@ void PreNMI_Init(GameState* thisx) {
this->state.main = PreNMI_Main;
this->state.destroy = PreNMI_Destroy;
this->timer = 30;
- this->unkA8 = 10;
+ this->unk_A8 = 10;
Game_SetFramerateDivisor(&this->state, 1);
}
diff --git a/src/code/z_quake.c b/src/code/z_quake.c
index d8d526ca3..8225c6347 100644
--- a/src/code/z_quake.c
+++ b/src/code/z_quake.c
@@ -1,37 +1,31 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64quake.h"
#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 +34,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 +293,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 +362,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 +543,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 +565,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 +582,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 +603,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 +624,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 +645,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 +670,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 +691,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 +724,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 +741,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 +803,7 @@ void Distortion_Update(void) {
depthPhase = 0x3F0;
screenPlanePhase = 0x156;
- sDistortionRequest.countdown = 2;
+ sDistortionRequest.timer = 2;
player = GET_PLAYER(play);
depthPhaseStep = 359.2f;
@@ -796,12 +850,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 +894,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..4b5787129 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) {
@@ -1210,7 +1459,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(&masterGfx[0], D_0E000000.syncSegments);
gSPDisplayList(&masterGfx[1], sFillSetupDL);
- gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
if (zbuffer != NULL) {
gDPSetDepthImage(&masterGfx[3], zbuffer);
} else {
@@ -1222,7 +1471,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->setScissor;
- gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPSetScissor(&masterGfx[0], G_SC_NON_INTERLACE, 0, 0, gCfbWidth, gCfbHeight);
gSPEndDisplayList(&masterGfx[1]);
// Clear Z-Buffer
@@ -1232,13 +1481,13 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
if (zbuffer == NULL) {
gSPEndDisplayList(&masterGfx[0]);
} else {
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, zbuffer);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, zbuffer);
gDPPipeSync(&masterGfx[1]);
gDPSetCycleType(&masterGfx[2], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[3], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[4], (GPACK_RGBA5551(255, 255, 240, 0) << 16) | GPACK_RGBA5551(255, 255, 240, 0));
gSPDisplayList(&masterGfx[5], D_0E000000.clearFillRect);
- gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gSPEndDisplayList(&masterGfx[7]);
}
@@ -1246,7 +1495,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFrameBuffer;
- gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, D_801FBBCC, D_0F000000);
+ gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetCycleType(&masterGfx[1], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[2], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[3], (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
@@ -1256,7 +1505,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC - 1, D_801FBBCE - 1);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth - 1, gCfbHeight - 1);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
@@ -1264,7 +1513,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->fillRect;
- gDPFillRectangle(&masterGfx[0], 0, 0, D_801FBBCC, D_801FBBCE);
+ gDPFillRectangle(&masterGfx[0], 0, 0, gCfbWidth, gCfbHeight);
gDPPipeSync(&masterGfx[1]);
gSPEndDisplayList(&masterGfx[2]);
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 22db1035f..78eb5f98e 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);
}
@@ -53,10 +53,10 @@ typedef enum {
} RoomCullableDebugMode;
typedef struct RoomShapeCullableEntryLinked {
- /* 0x00 */ RoomShapeCullableEntry* entry;
- /* 0x04 */ f32 boundsNearZ;
- /* 0x08 */ struct RoomShapeCullableEntryLinked* prev;
- /* 0x0C */ struct RoomShapeCullableEntryLinked* next;
+ /* 0x0 */ RoomShapeCullableEntry* entry;
+ /* 0x4 */ f32 boundsNearZ;
+ /* 0x8 */ struct RoomShapeCullableEntryLinked* prev;
+ /* 0xC */ struct RoomShapeCullableEntryLinked* next;
} RoomShapeCullableEntryLinked; // size = 0x10
#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 128
@@ -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,11 +95,11 @@ 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);
}
- if ((room->enablePosLights != 0) || (MREG(93) != 0)) {
+ if (room->enablePosLights || (MREG(93) != 0)) {
gSPSetGeometryMode(POLY_OPA_DISP++, G_LIGHTING_POSITIONAL);
gSPSetGeometryMode(POLY_XLU_DISP++, G_LIGHTING_POSITIONAL);
}
@@ -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_scene.c b/src/code/z_scene.c
index 26dc39507..368b4509e 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -89,7 +89,7 @@ s32 Object_GetIndex(ObjectContext* objectCtx, s16 objectId) {
s32 i;
for (i = 0; i < objectCtx->num; i++) {
- if ((objectCtx->status[i].id < 0 ? -objectCtx->status[i].id : objectCtx->status[i].id) == objectId) {
+ if (ABS_ALT(objectCtx->status[i].id) == objectId) {
return i;
}
}
@@ -365,8 +365,8 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) {
// SceneTableEntry Header Command 0x11: Skybox Settings
void Scene_CommandSkyboxSettings(PlayState* play, SceneCmd* cmd) {
play->skyboxId = cmd->skyboxSettings.skyboxId & 3;
- play->envCtx.unk_17 = play->envCtx.unk_18 = cmd->skyboxSettings.unk5;
- play->envCtx.unk_1E = cmd->skyboxSettings.unk6;
+ play->envCtx.skyboxConfig = play->envCtx.changeSkyboxNextConfig = cmd->skyboxSettings.skyboxConfig;
+ play->envCtx.lightMode = cmd->skyboxSettings.envLightMode;
Scene_LoadAreaTextures(play, cmd->skyboxSettings.data1);
}
diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c
index 6ec3f2b80..b4597a5c2 100644
--- a/src/code/z_scene_proc.c
+++ b/src/code/z_scene_proc.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
s32 sMatAnimStep;
@@ -401,7 +400,7 @@ void AnimatedMat_DrawMain(PlayState* play, AnimatedMaterial* matAnim, f32 alphaR
if ((matAnim != NULL) && (matAnim->segment != 0)) {
do {
segment = matAnim->segment;
- segmentAbs = ((segment < 0) ? -segment : segment) + 7;
+ segmentAbs = ABS_ALT(segment) + 7;
matAnimDrawHandlers[matAnim->type](play, segmentAbs, Lib_SegmentedToVirtual(matAnim->params));
matAnim++;
} while (segment >= 0);
diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c
index f80ad551d..e31e4b185 100644
--- a/src/code/z_scene_table.c
+++ b/src/code/z_scene_table.c
@@ -1,127 +1,27 @@
#include "global.h"
-#define SCENE_ENTRY(name, textId, config) \
- { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, config, 0, 0 }
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ DECLARE_ROM_SEGMENT(name)
-#define SCENE_ENTRY_NONE() \
- { { 0, 0 }, 0, 0, 0, 0, 0 }
+#define DEFINE_SCENE_UNSET(_enumValue)
-SceneTableEntry gSceneTable[] = {
- /* 0x00 */ SCENE_ENTRY(Z2_20SICHITAI2, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x01 */ SCENE_ENTRY_NONE(),
- /* 0x02 */ SCENE_ENTRY_NONE(),
- /* 0x03 */ SCENE_ENTRY_NONE(),
- /* 0x04 */ SCENE_ENTRY_NONE(),
- /* 0x05 */ SCENE_ENTRY_NONE(),
- /* 0x06 */ SCENE_ENTRY_NONE(),
- /* 0x07 */ SCENE_ENTRY(KAKUSIANA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x08 */ SCENE_ENTRY(SPOT00, 0x0000, SCENE_DRAW_CFG_NOTHING),
- /* 0x09 */ SCENE_ENTRY_NONE(),
- /* 0x0A */ SCENE_ENTRY(Z2_WITCH_SHOP, 0x011A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0B */ SCENE_ENTRY(Z2_LAST_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0C */ SCENE_ENTRY(Z2_HAKASHITA, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0D */ SCENE_ENTRY(Z2_AYASHIISHOP, 0x010E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x0E */ SCENE_ENTRY_NONE(),
- /* 0x0F */ SCENE_ENTRY_NONE(),
- /* 0x10 */ SCENE_ENTRY(Z2_OMOYA, 0x0132, SCENE_DRAW_CFG_DEFAULT),
- /* 0x11 */ SCENE_ENTRY(Z2_BOWLING, 0x0108, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x12 */ SCENE_ENTRY(Z2_SONCHONOIE, 0x010B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x13 */ SCENE_ENTRY(Z2_IKANA, 0x0141, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x14 */ SCENE_ENTRY(Z2_KAIZOKU, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x15 */ SCENE_ENTRY(Z2_MILK_BAR, 0x010C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x16 */ SCENE_ENTRY(Z2_INISIE_N, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x17 */ SCENE_ENTRY(Z2_TAKARAYA, 0x0109, SCENE_DRAW_CFG_DEFAULT),
- /* 0x18 */ SCENE_ENTRY(Z2_INISIE_R, 0x0144, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x19 */ SCENE_ENTRY(Z2_OKUJOU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1A */ SCENE_ENTRY(Z2_OPENINGDAN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1B */ SCENE_ENTRY(Z2_MITURIN, 0x011F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1C */ SCENE_ENTRY(Z2_13HUBUKINOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x1D */ SCENE_ENTRY(Z2_CASTLE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1E */ SCENE_ENTRY(Z2_DEKUTES, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x1F */ SCENE_ENTRY(Z2_MITURIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x20 */ SCENE_ENTRY(Z2_SYATEKI_MIZU, 0x0107, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x21 */ SCENE_ENTRY(Z2_HAKUGIN, 0x012B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x22 */ SCENE_ENTRY(Z2_ROMANYMAE, 0x0149, SCENE_DRAW_CFG_DEFAULT),
- /* 0x23 */ SCENE_ENTRY(Z2_PIRATE, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x24 */ SCENE_ENTRY(Z2_SYATEKI_MORI, 0x011B, SCENE_DRAW_CFG_DEFAULT),
- /* 0x25 */ SCENE_ENTRY(Z2_SINKAI, 0x0135, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x26 */ SCENE_ENTRY(Z2_YOUSEI_IZUMI, 0x013E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x27 */ SCENE_ENTRY(Z2_KINSTA1, 0x011E, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x28 */ SCENE_ENTRY(Z2_KINDAN2, 0x013F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x29 */ SCENE_ENTRY(Z2_TENMON_DAI, 0x0114, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2A */ SCENE_ENTRY(Z2_LAST_DEKU, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2B */ SCENE_ENTRY(Z2_22DEKUCITY, 0x0118, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2C */ SCENE_ENTRY(Z2_KAJIYA, 0x0127, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2D */ SCENE_ENTRY(Z2_00KEIKOKU, 0x0100, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x2E */ SCENE_ENTRY(Z2_POSTHOUSE, 0x0111, SCENE_DRAW_CFG_DEFAULT),
- /* 0x2F */ SCENE_ENTRY(Z2_LABO, 0x013A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x30 */ SCENE_ENTRY(Z2_DANPEI2TEST, 0x0113, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x31 */ SCENE_ENTRY_NONE(),
- /* 0x32 */ SCENE_ENTRY(Z2_16GORON_HOUSE, 0x0124, SCENE_DRAW_CFG_DEFAULT),
- /* 0x33 */ SCENE_ENTRY(Z2_33ZORACITY, 0x0136, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x34 */ SCENE_ENTRY(Z2_8ITEMSHOP, 0x010F, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x35 */ SCENE_ENTRY(Z2_F01, 0x012E, SCENE_DRAW_CFG_DEFAULT),
- /* 0x36 */ SCENE_ENTRY(Z2_INISIE_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x37 */ SCENE_ENTRY(Z2_30GYOSON, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x38 */ SCENE_ENTRY(Z2_31MISAKI, 0x0134, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x39 */ SCENE_ENTRY(Z2_TAKARAKUJI, 0x0112, SCENE_DRAW_CFG_DEFAULT),
- /* 0x3A */ SCENE_ENTRY_NONE(),
- /* 0x3B */ SCENE_ENTRY(Z2_TORIDE, 0x0138, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3C */ SCENE_ENTRY(Z2_FISHERMAN, 0x013B, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3D */ SCENE_ENTRY(Z2_GORONSHOP, 0x0129, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3E */ SCENE_ENTRY(Z2_DEKU_KING, 0x011C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x3F */ SCENE_ENTRY(Z2_LAST_GORON, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x40 */ SCENE_ENTRY(Z2_24KEMONOMITI, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x41 */ SCENE_ENTRY(Z2_F01_B, 0x0130, SCENE_DRAW_CFG_DEFAULT),
- /* 0x42 */ SCENE_ENTRY(Z2_F01C, 0x012F, SCENE_DRAW_CFG_DEFAULT),
- /* 0x43 */ SCENE_ENTRY(Z2_BOTI, 0x0106, SCENE_DRAW_CFG_DEFAULT),
- /* 0x44 */ SCENE_ENTRY(Z2_HAKUGIN_BS, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x45 */ SCENE_ENTRY(Z2_20SICHITAI, 0x0116, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x46 */ SCENE_ENTRY(Z2_21MITURINMAE, 0x0117, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x47 */ SCENE_ENTRY(Z2_LAST_ZORA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x48 */ SCENE_ENTRY(Z2_11GORONNOSATO2, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x49 */ SCENE_ENTRY(Z2_SEA, 0x013D, SCENE_DRAW_CFG_GREAT_BAY_TEMPLE),
- /* 0x4A */ SCENE_ENTRY(Z2_35TAKI, 0x0137, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4B */ SCENE_ENTRY(Z2_REDEAD, 0x0145, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4C */ SCENE_ENTRY(Z2_BANDROOM, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4D */ SCENE_ENTRY(Z2_11GORONNOSATO, 0x0123, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4E */ SCENE_ENTRY(Z2_GORON_HAKA, 0x012A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x4F */ SCENE_ENTRY(Z2_SECOM, 0x0143, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x50 */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x51 */ SCENE_ENTRY(Z2_TOUGITES, 0x0146, SCENE_DRAW_CFG_DEFAULT),
- /* 0x52 */ SCENE_ENTRY(Z2_DANPEI, 0x0120, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x53 */ SCENE_ENTRY(Z2_IKANAMAE, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x54 */ SCENE_ENTRY(Z2_DOUJOU, 0x0110, SCENE_DRAW_CFG_DEFAULT),
- /* 0x55 */ SCENE_ENTRY(Z2_MUSICHOUSE, 0x0147, SCENE_DRAW_CFG_MAT_ANIM_MANUAL_STEP),
- /* 0x56 */ SCENE_ENTRY(Z2_IKNINSIDE, 0x0142, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x57 */ SCENE_ENTRY(Z2_MAP_SHOP, 0x0119, SCENE_DRAW_CFG_DEFAULT),
- /* 0x58 */ SCENE_ENTRY(Z2_F40, 0x0140, SCENE_DRAW_CFG_DEFAULT),
- /* 0x59 */ SCENE_ENTRY(Z2_F41, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5A */ SCENE_ENTRY(Z2_10YUKIYAMANOMURA2, 0x0122, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5B */ SCENE_ENTRY(Z2_14YUKIDAMANOMITI, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x5C */ SCENE_ENTRY(Z2_12HAKUGINMAE, 0x0125, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5D */ SCENE_ENTRY(Z2_17SETUGEN, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5E */ SCENE_ENTRY(Z2_17SETUGEN2, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x5F */ SCENE_ENTRY(Z2_SEA_BS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x60 */ SCENE_ENTRY(Z2_RANDOM, 0x012C, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x61 */ SCENE_ENTRY(Z2_YADOYA, 0x010A, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x62 */ SCENE_ENTRY(Z2_KONPEKI_ENT, 0x0139, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x63 */ SCENE_ENTRY(Z2_INSIDETOWER, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x64 */ SCENE_ENTRY(Z2_26SARUNOMORI, 0x011D, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x65 */ SCENE_ENTRY(Z2_LOST_WOODS, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x66 */ SCENE_ENTRY(Z2_LAST_LINK, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x67 */ SCENE_ENTRY(Z2_SOUGEN, 0x0000, SCENE_DRAW_CFG_DEFAULT),
- /* 0x68 */ SCENE_ENTRY(Z2_BOMYA, 0x010D, SCENE_DRAW_CFG_DEFAULT),
- /* 0x69 */ SCENE_ENTRY(Z2_KYOJINNOMA, 0x0000, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6A */ SCENE_ENTRY(Z2_KOEPONARACE, 0x0131, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x6B */ SCENE_ENTRY(Z2_GORONRACE, 0x0126, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6C */ SCENE_ENTRY(Z2_TOWN, 0x0101, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6D */ SCENE_ENTRY(Z2_ICHIBA, 0x0102, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6E */ SCENE_ENTRY(Z2_BACKTOWN, 0x0103, SCENE_DRAW_CFG_DEFAULT),
- /* 0x6F */ SCENE_ENTRY(Z2_CLOCKTOWER, 0x0104, SCENE_DRAW_CFG_MAT_ANIM),
- /* 0x70 */ SCENE_ENTRY(Z2_ALLEY, 0x0105, SCENE_DRAW_CFG_MAT_ANIM),
+#include "tables/scene_table.h"
+
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
+#define DEFINE_SCENE(name, _enumValue, textId, drawConfig, _restrictionFlags, _persistentCycleFlags) \
+ { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, drawConfig, 0, 0 },
+
+#define DEFINE_SCENE_UNSET(_enumValue) { 0 },
+
+SceneTableEntry gSceneTable[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
static EntranceTableEntry sMayorsResidenceEntrance0[] = {
{ SCENE_SONCHONOIE, 0, 0x4102 },
};
diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c
index 085cb4de2..79af1b73f 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#define ANIM_INTERP 1
@@ -1944,7 +1943,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_skin.c b/src/code/z_skin.c
index 9bfd8d566..0d3e0bf85 100644
--- a/src/code/z_skin.c
+++ b/src/code/z_skin.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64skin.h"
diff --git a/src/code/z_snap.c b/src/code/z_snap.c
index 9361cc1e0..3524fe3ab 100644
--- a/src/code/z_snap.c
+++ b/src/code/z_snap.c
@@ -42,9 +42,6 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
break;
}
- //! FAKE:
- if (1) {}
-
// Actors which may be pictographed anywhere
switch (actor->id) {
case ACTOR_EN_KAKASI:
@@ -71,15 +68,20 @@ s32 Snap_RecordPictographedActors(PlayState* play) {
case ACTOR_EN_GE2:
seen |= PICTO_SEEN_ANYWHERE;
break;
+
+ default:
+ break;
+ }
+
+ if (!seen) {
+ continue;
}
// If actor is recordable, run its validity function and record if valid
- if (seen) {
- pictoActor = (PictoActor*)actor;
- if (pictoActor->validationFunc != NULL) {
- if ((pictoActor->validationFunc)(play, actor) == 0) {
- validCount++;
- }
+ pictoActor = (PictoActor*)actor;
+ if (pictoActor->validationFunc != NULL) {
+ if (pictoActor->validationFunc(play, actor) == 0) {
+ validCount++;
}
}
}
diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c
index c10c1943e..21bfaf7ef 100644
--- a/src/code/z_sram_NES.c
+++ b/src/code/z_sram_NES.c
@@ -1,8 +1,9 @@
#include "prevent_bss_reordering.h"
#include "global.h"
-#include "overlays/gamestates/ovl_file_choose/z_file_choose.h"
+#include "z64horse.h"
+#include "overlays/gamestates/ovl_file_choose/z_file_select.h"
-void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages);
+void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages);
void func_80147314(SramContext* sramCtx, s32 fileNum);
void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
@@ -10,128 +11,30 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2);
((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \
(newf)[5] != '3')
-// default scene flags (?)
-// indices of subarray:
-// - 0: switch0
-// - 1: switch1
-// - 2: chest
-// - 3: collectible
-u32 D_801C5FC0[SCENE_MAX][4] = {
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI2
- { 0, 0, 0, 0 }, // SCENE_UNSET_1
- { 0, 0, 0, 0 }, // SCENE_UNSET_2
- { 0, 0, 0, 0 }, // SCENE_UNSET_3
- { 0, 0, 0, 0 }, // SCENE_UNSET_4
- { 0, 0, 0, 0 }, // SCENE_UNSET_5
- { 0, 0, 0, 0 }, // SCENE_UNSET_6
- { 0, 0, 0, 0xC04 }, // SCENE_KAKUSIANA
- { 0, 0, 0, 0 }, // SCENE_SPOT00
- { 0, 0, 0, 0 }, // SCENE_UNSET_9
- { 0, 0, 0, 0 }, // SCENE_WITCH_SHOP
- { 0, 0, 0, 0x80000000 }, // SCENE_LAST_BS
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKASHITA
- { 0, 0, 0, 0 }, // SCENE_AYASHIISHOP
- { 0, 0, 0, 0 }, // SCENE_UNSET_E
- { 0, 0, 0, 0 }, // SCENE_UNSET_F
- { 0, 0, 0, 0 }, // SCENE_OMOYA
- { 0, 0, 0, 0 }, // SCENE_BOWLING
- { 0, 0, 0, 0 }, // SCENE_SONCHONOIE
- { 0x100000, 0, 0, 0x40000002 }, // SCENE_IKANA
- { 0, 0, 0, 0 }, // SCENE_KAIZOKU
- { 0, 0, 0, 0 }, // SCENE_MILK_BAR
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_N
- { 2, 0, 0, 0 }, // SCENE_TAKARAYA
- { 0x4000000, 0, 0, 0 }, // SCENE_INISIE_R
- { 0, 0, 0, 0 }, // SCENE_OKUJOU
- { 0xF, 0, 0, 0 }, // SCENE_OPENINGDAN
- { 0x70B000, 0, 0, 0 }, // SCENE_MITURIN
- { 0, 0, 0, 0 }, // SCENE_13HUBUKINOMITI
- { 0, 0x80000000, 0, 0x400 }, // SCENE_CASTLE
- { 0, 0, 0, 0 }, // SCENE_DEKUTES
- { 0, 0, 0, 0x80000000 }, // SCENE_MITURIN_BS
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MIZU
- { 0x1A00020, 0, 0, 0 }, // SCENE_HAKUGIN
- { 0x400, 0, 0, 0 }, // SCENE_ROMANYMAE
- { 0, 0, 0, 0x1000 }, // SCENE_PIRATE
- { 0, 0, 0, 0 }, // SCENE_SYATEKI_MORI
- { 0, 0, 0, 2 }, // SCENE_SINKAI
- { 0x400, 0, 0, 0 }, // SCENE_YOUSEI_IZUMI
- { 0, 0, 0, 0 }, // SCENE_KINSTA1
- { 0, 0, 0, 0x80000000 }, // SCENE_KINDAN2
- { 0, 0, 0, 0 }, // SCENE_TENMON_DAI
- { 0, 0, 0, 2 }, // SCENE_LAST_DEKU
- { 0, 0, 0, 0x40000000 }, // SCENE_22DEKUCITY
- { 0, 0, 0, 0 }, // SCENE_KAJIYA
- { 0x10, 0, 0, 0 }, // SCENE_00KEIKOKU
- { 3, 0, 0, 0 }, // SCENE_POSTHOUSE
- { 0, 0, 0, 0 }, // SCENE_LABO
- { 0, 0, 0, 0x80000000 }, // SCENE_DANPEI2TEST
- { 0, 0, 0, 0 }, // SCENE_UNSET_31
- { 0, 0, 0, 0 }, // SCENE_16GORON_HOUSE
- { 0, 0, 0, 0 }, // SCENE_33ZORACITY
- { 0, 0, 0, 0 }, // SCENE_8ITEMSHOP
- { 0, 0, 0, 0 }, // SCENE_F01
- { 0, 0, 0, 0x80000000 }, // SCENE_INISIE_BS
- { 0x100400, 0, 0, 0x22 }, // SCENE_30GYOSON
- { 0x400, 0, 0, 0x80 }, // SCENE_31MISAKI
- { 0, 0, 0, 0 }, // SCENE_TAKARAKUJI
- { 0, 0, 0, 0 }, // SCENE_UNSET_3A
- { 0x400, 0, 0, 0 }, // SCENE_TORIDE
- { 0, 0, 0, 0 }, // SCENE_FISHERMAN
- { 0, 0, 0, 0 }, // SCENE_GORONSHOP
- { 0, 0, 0, 0 }, // SCENE_DEKU_KING
- { 0, 0, 0, 2 }, // SCENE_LAST_GORON
- { 0, 0, 0, 0x80000002 }, // SCENE_24KEMONOMITI
- { 0, 0, 0, 0 }, // SCENE_F01_B
- { 0, 0, 0, 0 }, // SCENE_F01C
- { 0, 0, 0, 0 }, // SCENE_BOTI
- { 0, 0, 0, 0x80000000 }, // SCENE_HAKUGIN_BS
- { 0xC00, 0, 0, 0x40000000 }, // SCENE_20SICHITAI
- { 0x102, 0, 0, 0x400 }, // SCENE_21MITURINMAE
- { 0, 0, 0, 2 }, // SCENE_LAST_ZORA
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO2
- { 0x70, 0, 0, 0 }, // SCENE_SEA
- { 0, 0, 0, 0 }, // SCENE_35TAKI
- { 0, 0, 0, 0 }, // SCENE_REDEAD
- { 0, 0, 0, 0x40000000 }, // SCENE_BANDROOM
- { 0, 0, 0, 0x40000000 }, // SCENE_11GORONNOSATO
- { 0, 0, 0, 0 }, // SCENE_GORON_HAKA
- { 0, 0, 0, 0 }, // SCENE_SECOM
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA
- { 0, 0, 0, 0 }, // SCENE_TOUGITES
- { 0, 0, 0, 0 }, // SCENE_DANPEI
- { 0, 0, 0, 0 }, // SCENE_IKANAMAE
- { 0, 0, 0, 0 }, // SCENE_DOUJOU
- { 0, 0, 0, 0 }, // SCENE_MUSICHOUSE
- { 0, 0, 0, 0 }, // SCENE_IKNINSIDE
- { 0, 0, 0, 0 }, // SCENE_MAP_SHOP
- { 0x400, 0, 0, 0 }, // SCENE_F40
- { 0x400, 0, 0, 0 }, // SCENE_F41
- { 0x100000, 0, 0, 0x80000000 }, // SCENE_10YUKIYAMANOMURA2
- { 0, 0, 0, 0x100 }, // SCENE_14YUKIDAMANOMITI
- { 0x400, 0, 0, 0 }, // SCENE_12HAKUGINMAE
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN
- { 0, 0, 0, 0x80 }, // SCENE_17SETUGEN2
- { 0, 0, 0, 0x80000000 }, // SCENE_SEA_BS
- { 0, 0, 0, 0x400 }, // SCENE_RANDOM
- { 0, 0, 0, 0 }, // SCENE_YADOYA
- { 0, 0, 0, 0 }, // SCENE_KONPEKI_ENT
- { 1, 0, 0, 0 }, // SCENE_INSIDETOWER
- { 0, 0, 0, 0 }, // SCENE_26SARUNOMORI
- { 0, 0, 0, 0 }, // SCENE_LOST_WOODS
- { 0, 0, 0, 2 }, // SCENE_LAST_LINK
- { 0, 0, 0, 0 }, // SCENE_SOUGEN
- { 0, 0, 0, 0 }, // SCENE_BOMYA
- { 0, 0, 0, 0 }, // SCENE_KYOJINNOMA
- { 0, 0, 0, 0 }, // SCENE_KOEPONARACE
- { 0, 0, 0, 0 }, // SCENE_GORONRACE
- { 1, 0, 0, 0 }, // SCENE_TOWN
- { 0, 0, 0, 0 }, // SCENE_ICHIBA
- { 0, 0, 0, 0x400 }, // SCENE_BACKTOWN
- { 0x100000, 0, 0, 0x400 }, // SCENE_CLOCKTOWER
- { 0, 0, 1, 0 }, // SCENE_ALLEY
+typedef struct PersistentCycleFlags {
+ /* 0x0 */ u32 switch0;
+ /* 0x4 */ u32 switch1;
+ /* 0x8 */ u32 chest;
+ /* 0xC */ u32 collectible;
+} PersistentCycleFlags; // size = 0x10
+
+#define PERSISTENT_CYCLE_FLAGS_SET(switch0, switch1, chest, collectible) { switch0, switch1, chest, collectible },
+#define PERSISTENT_CYCLE_FLAGS_NONE PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 0)
+
+#define DEFINE_SCENE(_name, _enumValue, _textId, _drawConfig, _restrictionFlags, persistentCycleFlags) \
+ persistentCycleFlags
+#define DEFINE_SCENE_UNSET(_enumValue) PERSISTENT_CYCLE_FLAGS_NONE
+
+/**
+ * Array of bitwise flags which won't be turned off on a cycle reset (will persist between cycles)
+ */
+PersistentCycleFlags sPersistentCycleFlags[SCENE_MAX] = {
+#include "tables/scene_table.h"
};
+#undef DEFINE_SCENE
+#undef DEFINE_SCENE_UNSET
+
// TODO: figure out a way to use the WEEKEVENTREG defines here
// weekEventReg flags which will be not be cleared on a cycle reset
u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = {
@@ -237,9 +140,21 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = {
/* 99 */ 0,
};
+// Unused remnant values from OoT. Not the correct sizes in MM.
+#define OOT_SAVECONTEXT_SIZE 0x1428
+#define OOT_SLOT_SIZE (OOT_SAVECONTEXT_SIZE + 0x28)
+#define OOT_SRAM_HEADER_SIZE 0x10
+#define OOT_SLOT_OFFSET(index) (OOT_SRAM_HEADER_SIZE + 0x10 + (index * OOT_SLOT_SIZE))
+
// used in other files
-s32 D_801C6798[] = {
- 0x00000020, 0x00001470, 0x000028C0, 0x00003D10, 0x00005160, 0x000065B0,
+u32 gSramSlotOffsets[] = {
+ OOT_SLOT_OFFSET(0),
+ OOT_SLOT_OFFSET(1),
+ OOT_SLOT_OFFSET(2),
+ // the latter three saves are backup saves for the former saves (in OoT)
+ OOT_SLOT_OFFSET(3),
+ OOT_SLOT_OFFSET(4),
+ OOT_SLOT_OFFSET(5),
};
u8 gAmmoItems[] = {
@@ -269,28 +184,89 @@ u8 gAmmoItems[] = {
ITEM_NONE, // SLOT_BOTTLE_6
};
-s32 D_801C67C8[] = { 0, 0x40, 0x80, 0xC0, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380 };
-
-s32 D_801C67F0[] = { 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 1, 1 };
-
-s32 D_801C6818[] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 1, 1 };
-
-s32 D_801C6840[] = { 0x100, 0x180, 0x200, 0x280 };
-
-s32 D_801C6850[] = { 0x80, 0x80, 0x80, 0x80, 0x300, 0x380, 1, 1 };
-
-s32 D_801C6870[] = {
- sizeof(Save),
- sizeof(Save),
- sizeof(Save),
- sizeof(Save),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
- offsetof(SaveContext, fileNum),
+// Stores flash start page number
+s32 gFlashSaveStartPages[] = {
+ 0, // File 1 New Cycle Save
+ 0x40, // File 1 New Cycle Save Backup
+ 0x80, // File 2 New Cycle Save
+ 0xC0, // File 2 New Cycle Save Backup
+ 0x100, // File 1 Owl Save
+ 0x180, // File 1 Owl Save Backup
+ 0x200, // File 2 Owl Save
+ 0x280, // File 2 Owl Save Backup
+ 0x300, // Sram Header (SaveOptions)
+ 0x380, // Sram Header Backup (SaveOptions)
};
-u8 D_801C6890[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
+// Flash rom number of pages
+s32 gFlashSaveNumPages[] = {
+ 0x40, // File 1 New Cycle Save
+ 0x40, // File 1 New Cycle Save Backup
+ 0x40, // File 2 New Cycle Save
+ 0x40, // File 2 New Cycle Save Backup
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Flash rom number of pages on very first time Player enters South Clock Town from the Clock Tower
+s32 gFlashSpecialSaveNumPages[] = {
+ 0x80, // File 1 New Cycle Save
+ 0x80, // File 1 New Cycle Save Backup
+ 0x80, // File 2 New Cycle Save
+ 0x80, // File 2 New Cycle Save Backup
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Owl Save flash rom start page number
+s32 gFlashOwlSaveStartPages[] = {
+ 0x100, // File 1 Owl Save
+ 0x180, // File 1 Owl Save Backup
+ 0x200, // File 2 Owl Save
+ 0x280, // File 2 Owl Save Backup
+};
+
+// Owl Save flash rom number of pages
+s32 gFlashOwlSaveNumPages[] = {
+ 0x80, // File 1 Owl Save
+ 0x80, // File 1 Owl Save Backup
+ 0x80, // File 2 Owl Save
+ 0x80, // File 2 Owl Save Backup
+};
+
+// Save Options Sram Header flash rom start page number
+s32 gFlashOptionsSaveStartPages[] = {
+ 0x300, // Sram Header (SaveOptions)
+ 0x380, // Sram Header Backup (SaveOptions)
+};
+
+// Save Options Sram Header flash rom number of pages
+s32 gFlashOptionsSaveNumPages[] = {
+ 1, // Sram Header (SaveOptions)
+ 1, // Sram Header Backup (SaveOptions)
+};
+
+// Flash rom actual size needed
+s32 gFlashSaveSizes[] = {
+ sizeof(Save), // size = 0x100C - File 1 New Cycle Save
+ sizeof(Save), // size = 0x100C - File 1 New Cycle Save Backup
+ sizeof(Save), // size = 0x100C - File 2 New Cycle Save
+ sizeof(Save), // size = 0x100C - File 2 New Cycle Save Backup
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save Backup
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save
+ offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save Backup
+};
+
+u8 D_801C6890[8] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
u16 D_801F6AF0;
u8 D_801F6AF2;
@@ -342,26 +318,29 @@ void Sram_SaveEndOfCycle(PlayState* play) {
gSaveContext.save.day = 0;
gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
- gSaveContext.save.saveInfo.playerData.deaths++;
- if (gSaveContext.save.saveInfo.playerData.deaths > 999) {
- gSaveContext.save.saveInfo.playerData.deaths = 999;
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount++;
+ if (gSaveContext.save.saveInfo.playerData.threeDayResetCount > 999) {
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount = 999;
}
sceneId = Play_GetOriginalSceneId(play->sceneId);
Play_SaveCycleSceneFlags(&play->state);
- play->actorCtx.sceneFlags.chest &= D_801C5FC0[sceneId][2];
- play->actorCtx.sceneFlags.switches[0] &= D_801C5FC0[sceneId][0];
- play->actorCtx.sceneFlags.switches[1] &= D_801C5FC0[sceneId][1];
- play->actorCtx.sceneFlags.collectible[0] &= D_801C5FC0[sceneId][3];
+ play->actorCtx.sceneFlags.chest &= sPersistentCycleFlags[sceneId].chest;
+ play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleFlags[sceneId].switch0;
+ play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleFlags[sceneId].switch1;
+ play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleFlags[sceneId].collectible;
play->actorCtx.sceneFlags.clearedRoom = 0;
for (i = 0; i < SCENE_MAX; i++) {
- gSaveContext.cycleSceneFlags[i].switch0 = ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & D_801C5FC0[i][0];
- gSaveContext.cycleSceneFlags[i].switch1 = ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & D_801C5FC0[i][1];
- gSaveContext.cycleSceneFlags[i].chest = ((void)0, gSaveContext.cycleSceneFlags[i].chest) & D_801C5FC0[i][2];
+ gSaveContext.cycleSceneFlags[i].switch0 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleFlags[i].switch0;
+ gSaveContext.cycleSceneFlags[i].switch1 =
+ ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleFlags[i].switch1;
+ gSaveContext.cycleSceneFlags[i].chest =
+ ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleFlags[i].chest;
gSaveContext.cycleSceneFlags[i].collectible =
- ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & D_801C5FC0[i][3];
+ ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleFlags[i].collectible;
gSaveContext.cycleSceneFlags[i].clearedRoom = 0;
gSaveContext.save.saveInfo.permanentSceneFlags[i].unk_14 = 0;
gSaveContext.save.saveInfo.permanentSceneFlags[i].rooms = 0;
@@ -549,7 +528,7 @@ void Sram_SaveEndOfCycle(PlayState* play) {
gSaveContext.jinxTimer = 0;
gSaveContext.rupeeAccumulator = 0;
- func_800F3B2C(play);
+ Horse_ResetHorseData(play);
}
void Sram_IncrementDay(void) {
@@ -642,7 +621,7 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
gSaveContext.save.saveInfo.bomberCode[0] = randBombers;
@@ -652,7 +631,7 @@ void Sram_GenerateRandomSaveFields(void) {
do {
randBombers = Rand_S16Offset(0, 6);
- } while (randBombers <= 0 || randBombers >= 6);
+ } while ((randBombers <= 0) || (randBombers >= 6));
sp2A = 0;
do {
@@ -671,7 +650,7 @@ void Sram_GenerateRandomSaveFields(void) {
SavePlayerData sSaveDefaultPlayerData = {
{ '\0', '\0', '\0', '\0', '\0', '\0' }, // newf
- 0, // deaths
+ 0, // threeDayResetCount
{ 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName " "
0x30, // healthCapacity
0x30, // health
@@ -772,7 +751,7 @@ void Sram_InitNewSave(void) {
SavePlayerData sSaveDebugPlayerData = {
{ 'Z', 'E', 'L', 'D', 'A', '3' }, // newf
- 0x0000, // deaths
+ 0, // threeDayResetCount
{ 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName "LINK "
0x80, // healthCapacity
0x80, // health
@@ -869,7 +848,18 @@ Inventory sSaveDebugInventory = {
(1 << QUEST_SONG_SOARING) | (1 << QUEST_SONG_STORMS) | (1 << QUEST_BOMBERS_NOTEBOOK) |
(1 << QUEST_SONG_LULLABY_INTRO),
// dungeonItems
- { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 },
+ {
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP),
+ },
// dungeonKeys
{ 8, 8, 8, 8, 8, 8, 8, 8, 8 },
// defenseHearts
@@ -945,15 +935,15 @@ void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]) !=
- 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]);
}
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1],
- D_801C67F0[gSaveContext.fileNum * 2 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
}
gSaveContext.save.cutsceneIndex = cutsceneIndex;
@@ -979,8 +969,8 @@ void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) {
gSaveContext.timerPausedOsTimes[i] = 0;
}
- D_801BDAA0 = 1;
- D_801BDA9C = 0;
+ D_801BDAA0 = true;
+ gHorseIsMounted = false;
gSaveContext.powderKegTimer = 0;
gSaveContext.unk_1014 = 0;
gSaveContext.jinxTimer = 0;
@@ -1001,32 +991,34 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
s32 pad1;
s32 fileNum;
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
if (gSaveContext.fileNum == 0xFF) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]);
- } else if (fileSelect->unk_2446A[gSaveContext.fileNum] != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[0], gFlashSaveNumPages[0]);
+ } else if (fileSelect->isOwlSave[gSaveContext.fileNum + 2]) {
phi_t1 = gSaveContext.fileNum + 2;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1],
+ gFlashSaveNumPages[phi_t1 + 1]);
}
} else {
phi_t1 = gSaveContext.fileNum;
phi_t1 *= 2;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1],
+ gFlashSaveNumPages[phi_t1 + 1]);
}
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]);
if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1], gFlashSaveNumPages[phi_t1 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]);
}
}
@@ -1057,7 +1049,7 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) {
if (gSaveContext.save.isFirstCycle) {
gSaveContext.save.entrance = ENTRANCE(SOUTH_CLOCK_TOWN, 0);
gSaveContext.save.day = 0;
- gSaveContext.save.time = 0x3FFF;
+ gSaveContext.save.time = CLOCK_TIME(6, 0) - 1;
} else {
gSaveContext.save.entrance = ENTRANCE(CUTSCENE, 0);
gSaveContext.nextCutsceneIndex = 0;
@@ -1122,7 +1114,7 @@ void func_8014546C(SramContext* sramCtx) {
gSaveContext.save.saveInfo.checksum = 0;
gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
}
@@ -1145,7 +1137,7 @@ void func_80145698(SramContext* sramCtx) {
gSaveContext.save.saveInfo.checksum = 0;
gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
}
@@ -1153,31 +1145,21 @@ void func_80145698(SramContext* sramCtx) {
// Verifies save and use backup if corrupted?
#ifdef NON_EQUIVALENT
-void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
- FileSelectState* fileSelect = fileSelect2;
+void func_801457CC(GameState* gameState, SramContext* sramCtx) {
+ FileSelectState* fileSelect = (FileSelectState*)gameState;
u16 sp7A;
- // u16 sp78;
+ u16 oldCheckSum; // s2
u16 sp76;
- // u16 sp74;
- u16 sp6E; //!
- // s32 sp68;
- // u16 sp66;
- u16 phi_s2; //!
- u16 sp64;
- // s32 sp60;
- // s32 sp5C;
- // s32 sp58;
- // u32 new_var;
- u16 phi_s2_3;
- // s16 fakevar;
+ u16 sp64; // sp74?
+ u16 phi_s2;
+ u16 phi_s7;
+ u16 sp6E;
+ u16 newCheckSum; // v0
+ u16 phi_a0; // maskCount
- u16 temp_s2;
- u16 temp_v0_2;
- u16 phi_a0; // maskCount
-
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
D_801F6AF0 = gSaveContext.save.time;
- D_801F6AF2 = gSaveContext.unk_3F3F;
+ D_801F6AF2 = gSaveContext.flashSaveAvailable;
sp64 = 0;
for (sp76 = 0; sp76 < 5; sp76++, sp64 += 2) {
@@ -1185,40 +1167,65 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
phi_s2 = false;
sp6E = 0;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) {
+ // read main save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]) != 0) {
+ // main save didn't work
sp6E = 1;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ // backup save didn't work
phi_s2 = true;
}
}
if (sp76 < 2) {
- fileSelect->unk_24468[sp76] = 0;
+ // Non-owl save
+ // sp76 = 0: main save
+ // sp76 = 1: backup save
+
+ fileSelect->isOwlSave[sp76] = 0;
if (phi_s2) {
+ // both main save and backup save failed
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
} else {
- // Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.saveInfo.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+
+ // test checksum of main save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
gSaveContext.save.saveInfo.checksum = 0;
- temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
- gSaveContext.save.saveInfo.checksum = temp_s2;
+ newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
+ gSaveContext.save.saveInfo.checksum = oldCheckSum;
- if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) {
+ // checksum didnt match, try backup save
sp6E = 1;
- if (CHECK_NEWF2(gSaveContext.save.saveInfo.playerData.newf)) {}
- phi_s2 = false;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') &&
+ (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) {
+ phi_s2 = false;
+ }
+
+ // phi_s2 = false;
+
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ // backup save didn't work
phi_s2 = true;
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.saveInfo.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+
+ // test checksum of backup save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
gSaveContext.save.saveInfo.checksum = 0;
+
+ //! FAKE: (s32)sp64
if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) ||
- (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[(s32)sp64]))) {
+ // backup save didn't work
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
sp6E = 999;
@@ -1227,29 +1234,30 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
gSaveContext.save.saveInfo.checksum = 0;
+ // FAKE: Needed?
gSaveContext.save.saveInfo.checksum =
- Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+ Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]);
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) {
fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A];
}
if (!CHECK_NEWF(fileSelect->newf[sp76])) {
- fileSelect->unk_2440C[sp76] = gSaveContext.save.saveInfo.playerData.deaths;
+ fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) {
- fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
+ fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
}
fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity;
fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health;
- fileSelect->unk_24454[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
- fileSelect->unk_24444[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
- fileSelect->unk_24458[sp76] = gSaveContext.save.time;
- fileSelect->unk_24460[sp76] = gSaveContext.save.day;
- fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[sp76] = gSaveContext.save.time;
+ fileSelect->day[sp76] = gSaveContext.save.day;
+ fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave;
fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees;
- fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) {
@@ -1262,90 +1270,106 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
if (sp6E == 1) {
+ // backup save
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
- } else if (sp6E == 0) { // TODO: == 0?
- temp_s2 = gSaveContext.save.saveInfo.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
- phi_s2_3 = 1;
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]);
+ } else if (!sp6E) {
+ // main save
+ phi_s7 = gSaveContext.save.saveInfo.checksum;
+
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]) != 0) {
+ oldCheckSum = 1;
} else {
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- phi_s2_3 = gSaveContext.save.saveInfo.checksum;
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
gSaveContext.save.saveInfo.checksum = 0;
sp7A = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save));
}
- if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) ||
- (phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) ||
+ (oldCheckSum != phi_s7)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]);
}
}
} else if (sp76 < 4) {
- fileSelect->unk_24468[sp76] = 0;
+ // Owl Save:
+ // sp76 = 3: main owl save
+ // sp76 = 4: backup owl save
+ fileSelect->isOwlSave[sp76] = 0;
- if (!CHECK_NEWF(fileSelect->newf2[(s32)sp76])) { // TODO: Needed?
+ if (!CHECK_NEWF(fileSelect->newf[sp76 - 2])) {
if (phi_s2) {
+ // both main save and backup save failed
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf,
- D_801C6870[sp64]); // TODO: Needed?
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
} else {
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.saveInfo.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
+ // test checksum of main save
gSaveContext.save.saveInfo.checksum = 0;
- temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
- gSaveContext.save.saveInfo.checksum = temp_s2;
- if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (temp_s2 != temp_v0_2)) {
+ newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
+ gSaveContext.save.saveInfo.checksum = oldCheckSum;
+
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) {
+ // checksum didnt match, try backup save
sp6E = 1;
if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') &&
(gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) {
phi_s2 = false;
}
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
+ // read backup save from flash
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1])) {
+ // backup save didn't work
phi_s2 = true;
}
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- temp_s2 = gSaveContext.save.saveInfo.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+
+ // test checksum of backup save
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
gSaveContext.save.saveInfo.checksum = 0;
+
if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) ||
- (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) {
+ (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]))) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
sp6E = 999;
}
}
}
gSaveContext.save.saveInfo.checksum = 0;
+ // FAKE: Needed?
gSaveContext.save.saveInfo.checksum =
- Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed?
+ Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]);
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) {
fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A];
}
if (!CHECK_NEWF(fileSelect->newf[sp76])) {
- fileSelect->unk_2440C[sp76] = gSaveContext.save.saveInfo.playerData.deaths;
+ fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) {
- phi_s2 += 0; // TODO: Needed?
- fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
+ fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A];
}
fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity;
fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health;
- fileSelect->unk_24454[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
- fileSelect->unk_24444[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
- fileSelect->unk_24458[sp76] = gSaveContext.save.time;
- fileSelect->unk_24460[sp76] = gSaveContext.save.day;
- fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave;
+ fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[sp76] = gSaveContext.save.time;
+ fileSelect->day[sp76] = gSaveContext.save.day;
+ fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave;
fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees;
- fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4);
+ fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET);
for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) {
if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) {
@@ -1358,39 +1382,44 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
if (sp6E == 1) {
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
- } else if (!sp6E) { // TODO: == 0?
- temp_s2 = gSaveContext.save.saveInfo.checksum;
- if (func_80185968(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) {
- phi_s2_3 = 1;
+ // backup save
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]);
+ } else if (!sp6E) {
+ // main save
+ phi_s7 = gSaveContext.save.saveInfo.checksum;
+
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1])) {
+ oldCheckSum = 1;
} else {
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- phi_s2_3 = gSaveContext.save.saveInfo.checksum;
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ oldCheckSum = gSaveContext.save.saveInfo.checksum;
gSaveContext.save.saveInfo.checksum = 0;
- // phi_s2_3 = gSaveContext.save.saveInfo.checksum;
- sp7A = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]);
+ sp7A = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]);
}
- if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) ||
- (phi_s2_3 != temp_s2)) {
- func_80185968(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) ||
+ (oldCheckSum != phi_s7)) {
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64],
+ gFlashSaveNumPages[sp64]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1],
+ gFlashSaveNumPages[sp64 + 1]);
}
}
} else {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
- Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]);
- func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]);
+ Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]);
}
} else {
if (phi_s2) {
gSaveContext.options.optionId = 0xA51D;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
} else {
@@ -1398,7 +1427,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
if (gSaveContext.options.optionId != 0xA51D) {
gSaveContext.options.optionId = 0xA51D;
gSaveContext.options.language = 1;
- gSaveContext.options.audioSetting = 0;
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
gSaveContext.options.languageSetting = 0;
gSaveContext.options.zTargetSetting = 0;
}
@@ -1408,7 +1437,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
gSaveContext.options.language = 1;
@@ -1417,50 +1446,52 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s")
#endif
-void func_80146580(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) {
+void Sram_EraseSave(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) {
FileSelectState* fileSelect = fileSelect2;
s32 pad;
- if (gSaveContext.unk_3F3F) {
- if (fileSelect->unk_2446A[fileNum]) {
+ if (gSaveContext.flashSaveAvailable) {
+ if (fileSelect->isOwlSave[fileNum + 2]) {
func_80147314(sramCtx, fileNum);
- fileSelect->unk_2446A[fileNum] = 0;
+ fileSelect->isOwlSave[fileNum + 2] = false;
}
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save));
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
#ifdef NON_MATCHING
// v0/v1
-void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
+void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) {
FileSelectState* fileSelect = fileSelect2;
u16 i;
s16 maskCount;
- if (gSaveContext.unk_3F3F) {
- if (fileSelect->unk_2446A[fileSelect->unk_2448E]) {
- func_80147414(sramCtx, fileSelect->unk_2448E, fileSelect->fileNum);
- fileSelect->unk_24410[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.deaths;
+ if (gSaveContext.flashSaveAvailable) {
+ if (fileSelect->isOwlSave[fileSelect->selectedFileIndex + 2]) {
+ func_80147414(sramCtx, fileSelect->selectedFileIndex, fileSelect->copyDestFileIndex);
+ fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
- fileSelect->unk_24424[fileSelect->fileNum][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
+ fileSelect->fileNames[fileSelect->copyDestFileIndex + 2][i] =
+ gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->unk_24438[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.healthCapacity;
- fileSelect->unk_24440[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.health;
- fileSelect->unk_24456[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.defenseHearts;
- fileSelect->unk_2444C[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.questItems;
- fileSelect->unk_2445C[fileSelect->fileNum] = gSaveContext.save.time;
- fileSelect->unk_24464[fileSelect->fileNum] = gSaveContext.save.day;
- fileSelect->unk_2446A[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
- fileSelect->unk_24470[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.rupees;
- // = CUR_UPG_VALUE(UPG_WALLET);
- fileSelect->unk_24476[fileSelect->fileNum] =
- (gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+ fileSelect->healthCapacity[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->copyDestFileIndex + 2] =
+ gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->copyDestFileIndex + 2] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
@@ -1468,41 +1499,42 @@ void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
}
- fileSelect->unk_2447A[fileSelect->fileNum] = maskCount;
- fileSelect->unk_2447E[fileSelect->fileNum] =
- (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->copyDestFileIndex + 2] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->copyDestFileIndex + 2] = GET_QUEST_HEART_PIECE_COUNT;
}
// clear buffer
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// read to buffer
- func_80185968(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2], D_801C67F0[fileSelect->unk_2448E * 2]);
-
+ SysFlashrom_ReadData(&sramCtx->saveBuf[0], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2],
+ gFlashSaveNumPages[fileSelect->selectedFileIndex * 2]);
if (1) {}
- func_80185968(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1],
- D_801C67F0[fileSelect->unk_2448E * 2 + 1]);
+
+ SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2 + 1],
+ gFlashSaveNumPages[fileSelect->selectedFileIndex * 2 + 1]);
if (1) {}
// copy buffer to save context
Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save));
- fileSelect->unk_2440C[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.deaths;
+ fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
- fileSelect->unk_24414[fileSelect->fileNum][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
+ fileSelect->fileNames[fileSelect->copyDestFileIndex][i] =
+ gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->healthCapacity[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.healthCapacity;
- fileSelect->health[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.health;
- fileSelect->unk_24454[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.defenseHearts;
- fileSelect->unk_24444[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.questItems;
- fileSelect->unk_24458[fileSelect->fileNum] = gSaveContext.save.time;
- fileSelect->unk_24460[fileSelect->fileNum] = gSaveContext.save.day;
- fileSelect->unk_24468[fileSelect->fileNum] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.rupees;
- // = CUR_UPG_VALUE(UPG_WALLET);
- fileSelect->unk_24474[fileSelect->fileNum] =
- (gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4];
+ fileSelect->healthCapacity[fileSelect->copyDestFileIndex] =
+ gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->copyDestFileIndex] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->copyDestFileIndex] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->copyDestFileIndex] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->copyDestFileIndex] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
@@ -1510,16 +1542,15 @@ void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
}
- fileSelect->maskCount[fileSelect->fileNum] = maskCount;
- fileSelect->heartPieceCount[fileSelect->fileNum] =
- (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->copyDestFileIndex] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->copyDestFileIndex] = GET_QUEST_HEART_PIECE_COUNT;
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146628.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_CopySave.s")
#endif
void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
@@ -1528,15 +1559,15 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
FileSelectState* fileSelect = fileSelect2;
s16 maskCount;
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
Sram_InitNewSave();
- if (fileSelect->unk_24480 == 0) {
+ if (fileSelect->buttonIndex == 0) {
gSaveContext.save.cutsceneIndex = 0xFFF0;
}
for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); phi_v0++) {
gSaveContext.save.saveInfo.playerData.playerName[phi_v0] =
- fileSelect->unk_24414[fileSelect->unk_24480][phi_v0];
+ fileSelect->fileNames[fileSelect->buttonIndex][phi_v0];
}
gSaveContext.save.saveInfo.playerData.newf[0] = 'Z';
@@ -1552,24 +1583,25 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save));
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); i++) {
- fileSelect->newf[fileSelect->unk_24480][i] = gSaveContext.save.saveInfo.playerData.newf[i];
+ fileSelect->newf[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
}
- fileSelect->unk_2440C[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.deaths;
+ fileSelect->threeDayResetCount[fileSelect->buttonIndex] =
+ gSaveContext.save.saveInfo.playerData.threeDayResetCount;
for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) {
- fileSelect->unk_24414[fileSelect->unk_24480][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
+ fileSelect->fileNames[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
}
- fileSelect->healthCapacity[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.healthCapacity;
- fileSelect->health[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.health;
- fileSelect->unk_24454[fileSelect->unk_24480] = gSaveContext.save.saveInfo.inventory.defenseHearts;
- fileSelect->unk_24444[fileSelect->unk_24480] = gSaveContext.save.saveInfo.inventory.questItems;
- fileSelect->unk_24458[fileSelect->unk_24480] = gSaveContext.save.time;
- fileSelect->unk_24460[fileSelect->unk_24480] = gSaveContext.save.day;
- fileSelect->unk_24468[fileSelect->unk_24480] = gSaveContext.save.isOwlSave;
- fileSelect->rupees[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.rupees;
- fileSelect->unk_24474[fileSelect->unk_24480] = CUR_UPG_VALUE(UPG_WALLET);
+ fileSelect->healthCapacity[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ fileSelect->health[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.health;
+ fileSelect->defenseHearts[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ fileSelect->questItems[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.questItems;
+ fileSelect->time[fileSelect->buttonIndex] = gSaveContext.save.time;
+ fileSelect->day[fileSelect->buttonIndex] = gSaveContext.save.day;
+ fileSelect->isOwlSave[fileSelect->buttonIndex] = gSaveContext.save.isOwlSave;
+ fileSelect->rupees[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.rupees;
+ fileSelect->walletUpgrades[fileSelect->buttonIndex] = CUR_UPG_VALUE(UPG_WALLET);
for (i = 0, maskCount = 0; i < 24; i++) {
if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) {
@@ -1577,17 +1609,19 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) {
}
}
- fileSelect->maskCount[fileSelect->unk_24480] = maskCount;
- fileSelect->heartPieceCount[fileSelect->unk_24480] =
- (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C;
+ fileSelect->maskCount[fileSelect->buttonIndex] = maskCount;
+ fileSelect->heartPieceCount[fileSelect->buttonIndex] = GET_QUEST_HEART_PIECE_COUNT;
}
gSaveContext.save.time = D_801F6AF0;
- gSaveContext.unk_3F3F = D_801F6AF2;
+ gSaveContext.flashSaveAvailable = D_801F6AF2;
}
-void func_80146DF8(SramContext* sramCtx) {
- if (gSaveContext.unk_3F3F) {
+/**
+ * Write the SaveOptions of SaveContext to the save buffer
+ */
+void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx) {
+ if (gSaveContext.flashSaveAvailable) {
// TODO: macros for languages
gSaveContext.options.language = 1;
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions));
@@ -1601,7 +1635,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) {
}
void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
- if (gSaveContext.unk_3F3F) {
+ if (gSaveContext.flashSaveAvailable) {
sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->heap, SAVE_BUFFER_SIZE);
sramCtx->status = 0;
}
@@ -1610,10 +1644,10 @@ void Sram_Alloc(GameState* gameState, SramContext* sramCtx) {
/**
* Synchronous flash write
*/
-void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages) {
+void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
- func_80185F64(sramCtx->saveBuf, curPage, numPages);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, curPage, numPages);
}
/**
@@ -1626,7 +1660,8 @@ void Sram_SaveSpecialEnterClockTown(PlayState* play) {
gSaveContext.save.isFirstCycle = true;
gSaveContext.save.isOwlSave = false;
func_80145698(sramCtx);
- func_80185F64(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C6818[gSaveContext.fileNum * 2]);
+ SysFlashrom_WriteDataSync(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]);
}
/**
@@ -1647,27 +1682,28 @@ void Sram_SaveSpecialNewDay(PlayState* play) {
gSaveContext.save.day = day;
gSaveContext.save.time = time;
gSaveContext.save.cutsceneIndex = cutsceneIndex;
- func_80185F64(play->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2], D_801C67F0[gSaveContext.fileNum * 2]);
+ SysFlashrom_WriteDataSync(play->sramCtx.saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2],
+ gFlashSaveNumPages[gSaveContext.fileNum * 2]);
}
-void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) {
+void Sram_SetFlashPagesDefault(SramContext* sramCtx, u32 curPage, u32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
sramCtx->status = 1;
}
-void func_80147020(SramContext* sramCtx) {
+void Sram_StartWriteToFlashDefault(SramContext* sramCtx) {
// async flash write
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
- sramCtx->unk_18 = osGetTime();
+ sramCtx->startWriteOsTime = osGetTime();
sramCtx->status = 2;
}
-void func_80147068(SramContext* sramCtx) {
+void Sram_UpdateWriteToFlashDefault(SramContext* sramCtx) {
if (sramCtx->status == 2) {
- if (func_80185EC4() != 0) { // if task running
- if (func_80185F04() == 0) { // wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // if task running
+ if (SysFlashrom_AwaitResult() == 0) { // wait for task done
// task success
sramCtx->status = 4;
} else {
@@ -1675,50 +1711,52 @@ void func_80147068(SramContext* sramCtx) {
sramCtx->status = 4;
}
}
- } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) {
+ } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) {
+ // Finished status is hardcoded to 2 seconds instead of when the task finishes
sramCtx->status = 0;
}
}
-void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages) {
+void Sram_SetFlashPagesOwlSave(SramContext* sramCtx, s32 curPage, s32 numPages) {
sramCtx->curPage = curPage;
sramCtx->numPages = numPages;
sramCtx->status = 6;
}
-void func_80147150(SramContext* sramCtx) {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+void Sram_StartWriteToFlashOwlSave(SramContext* sramCtx) {
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
- sramCtx->unk_18 = osGetTime();
+ sramCtx->startWriteOsTime = osGetTime();
sramCtx->status = 7;
}
-void func_80147198(SramContext* sramCtx) {
+void Sram_UpdateWriteToFlashOwlSave(SramContext* sramCtx) {
if (sramCtx->status == 7) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
} else {
- func_80185DDC(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
+ SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage + 0x80, sramCtx->numPages);
sramCtx->status = 8;
}
}
} else if (sramCtx->status == 8) {
- if (func_80185EC4() != 0) { // Is task running
- if (func_80185F04() == 0) { // Wait for task done
+ if (SysFlashrom_IsBusy() != 0) { // Is task running
+ if (SysFlashrom_AwaitResult() == 0) { // Wait for task done
sramCtx->status = 4;
} else {
sramCtx->status = 4;
}
}
- } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) {
+ } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) {
+ // Finished status is hardcoded to 2 seconds instead of when the task finishes
sramCtx->status = 0;
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
gSaveContext.save.isOwlSave = false;
gSaveContext.save.saveInfo.checksum = 0;
// flash read to buffer then copy to save context
- func_80185968(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
+ SysFlashrom_ReadData(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages);
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
}
}
@@ -1739,8 +1777,9 @@ void func_80147314(SramContext* sramCtx, s32 fileNum) {
gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum));
Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum));
- func_80146EBC(sramCtx, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]);
- func_80146EBC(sramCtx, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2], gFlashOwlSaveNumPages[fileNum * 2]);
+ //! Note: should be `gFlashOwlSaveNumPages[fileNum * 2 + 1]`?
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2 + 1], gFlashOwlSaveNumPages[fileNum * 2]);
gSaveContext.save.isOwlSave = true;
@@ -1752,6 +1791,7 @@ void func_80147314(SramContext* sramCtx, s32 fileNum) {
gSaveContext.save.saveInfo.playerData.newf[5] = '3';
}
+// Used by `Sram_CopySave` with `isOwlSave` set
void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
s32 pad;
@@ -1759,16 +1799,18 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) {
bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE);
// Read save file
- if (func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) {
+ if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2],
+ gFlashOwlSaveNumPages[fileNum * 2]) != 0) {
// If failed, read backup save file
- func_80185968(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]);
+ SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2 + 1],
+ gFlashOwlSaveNumPages[fileNum * 2 + 1]);
}
// Copy buffer to save context
Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum));
- func_80146EBC(sramCtx, D_801C6840[arg2 * 2], D_801C6850[arg2 * 2]);
- func_80146EBC(sramCtx, D_801C6840[arg2 * 2 + 1], D_801C6850[arg2 * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2], gFlashOwlSaveNumPages[arg2 * 2]);
+ Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2 + 1], gFlashOwlSaveNumPages[arg2 * 2]);
}
void Sram_nop8014750C(UNK_TYPE4 arg0) {
diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c
index a4d95af64..90d09a4b1 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;
}
@@ -128,7 +128,7 @@ Gfx* SubS_DrawTransformFlex(PlayState* play, void** skeleton, Vec3s* jointTable,
newDlist = rootLimb->dList;
limbDList = rootLimb->dList;
- if (overrideLimbDraw == NULL || !overrideLimbDraw(play, 1, &newDlist, &pos, &rot, actor, &gfx)) {
+ if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, 1, &newDlist, &pos, &rot, actor, &gfx)) {
Matrix_TranslateRotateZYX(&pos, &rot);
Matrix_Push();
@@ -489,9 +489,9 @@ Path* SubS_GetAdditionalPath(PlayState* play, u8 pathIndex, s32 limit) {
if (i >= limit) {
break;
}
- pathIndex = path->unk1;
+ pathIndex = path->additionalPathIndex;
i++;
- } while (pathIndex != 0xFF);
+ } while (pathIndex != ADDITIONAL_PATH_INDEX_NONE);
return path;
}
@@ -577,7 +577,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) {
diffZ = points[index + 1].z - points[index - 1].z;
}
- func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((px * actor->world.pos.x) + (pz * actor->world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -585,7 +585,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) {
return reached;
}
-Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 max, s32* startPointIndex) {
+Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 pathIndexNone, s32* startPointIndex) {
Path* path = NULL;
s32 found = false;
s32 time = (((s16)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60) +
@@ -593,17 +593,17 @@ Path* SubS_GetDayDependentPath(PlayState* play, u8 pathIndex, u8 max, s32* start
30;
s32 day = CURRENT_DAY;
- if (pathIndex == max) {
+ if (pathIndex == pathIndexNone) {
return NULL;
}
- while (pathIndex != 0xFF) {
+ while (pathIndex != ADDITIONAL_PATH_INDEX_NONE) {
path = &play->setupPathList[pathIndex];
- if (sPathDayFlags[day] & path->unk2) {
+ if (path->customValue & sPathDayFlags[day]) {
found = true;
break;
}
- pathIndex = path->unk1;
+ pathIndex = path->additionalPathIndex;
}
if (found == true) {
@@ -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);
@@ -1098,8 +1098,8 @@ s32 SubS_AngleDiffLessEqual(s16 angleA, s16 threshold, s16 angleB) {
return (ABS_ALT(BINANG_SUB(angleB, angleA)) <= threshold) ? true : false;
}
-Path* SubS_GetPathByIndex(PlayState* play, s16 pathIndex, s16 max) {
- return (pathIndex != max) ? &play->setupPathList[pathIndex] : NULL;
+Path* SubS_GetPathByIndex(PlayState* play, s16 pathIndex, s16 pathIndexNone) {
+ return (pathIndex != pathIndexNone) ? &play->setupPathList[pathIndex] : NULL;
}
s32 SubS_CopyPointFromPath(Path* path, s32 pointIndex, Vec3f* dst) {
@@ -1179,7 +1179,7 @@ Actor* SubS_FindActor(PlayState* play, Actor* actorListStart, u8 actorCategory,
actor = play->actorCtx.actorLists[actorCategory].first;
}
- while (actor != NULL && actorId != actor->id) {
+ while ((actor != NULL) && (actorId != actor->id)) {
actor = actor->next;
}
@@ -1503,10 +1503,10 @@ Actor* SubS_FindActorCustom(PlayState* play, Actor* actor, Actor* actorListStart
actorIter = play->actorCtx.actorLists[actorCategory].first;
}
- while (actorIter != NULL &&
- (actorId != actorIter->id ||
- (actorId == actorIter->id &&
- (verifyActor == NULL || (verifyActor != NULL && !verifyActor(play, actor, actorIter, verifyData)))))) {
+ while ((actorIter != NULL) &&
+ ((actorId != actorIter->id) ||
+ ((actorId == actorIter->id) &&
+ ((verifyActor == NULL) || ((verifyActor != NULL) && !verifyActor(play, actor, actorIter, verifyData)))))) {
actorIter = actorIter->next;
}
diff --git a/src/code/z_view.c b/src/code/z_view.c
index 105e6643a..4adc00b8d 100644
--- a/src/code/z_view.c
+++ b/src/code/z_view.c
@@ -18,8 +18,8 @@ void View_ViewportToVp(Vp* dest, Viewport* src) {
dest->vp.vtrans[2] = 0x01FF;
dest->vp.vtrans[3] = 0;
- if ((src->leftX == 0) && (src->rightX == SCREEN_WIDTH_HIGH_RES) && (src->topY == 0) &&
- (src->bottomY == SCREEN_HEIGHT_HIGH_RES)) {}
+ if ((src->leftX == 0) && (src->rightX == HIRES_BUFFER_WIDTH) && (src->topY == 0) &&
+ (src->bottomY == HIRES_BUFFER_HEIGHT)) {}
}
void View_Init(View* view, GraphicsContext* gfxCtx) {
diff --git a/src/code/z_vimode.c b/src/code/z_vimode.c
index b7d2dea64..2ddd27775 100644
--- a/src/code/z_vimode.c
+++ b/src/code/z_vimode.c
@@ -1,17 +1,377 @@
#include "global.h"
+#include "ultra64/viint.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140260.s")
+typedef struct {
+ /* 0x00 */ u32 burst;
+ /* 0x04 */ u32 vSync;
+ /* 0x08 */ u32 hSync;
+ /* 0x0C */ u32 leap;
+ /* 0x10 */ u32 hStart;
+ /* 0x14 */ u32 vStart;
+ /* 0x18 */ u32 vBurst;
+} ViModeStruct; // size = 0x1C
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014026C.s")
+void ViMode_LogPrint(OSViMode* osViMode) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140730.s")
+/**
+ * Configures the custom OSViMode for this ViMode
+ *
+ * @param viMode ViMode to configure the custom OSViMode for
+ * @param type Identifying type for the OSViMode
+ * @param tvType TV Type: NTSC, PAL, MPAL or FPAL
+ * @param loRes Boolean: true = low resolution, false = high resolution.
+ * Corresponds to "L" or "H" in libultra VI mode names
+ * @param antialiasOff Boolean: true = point-sampling, false = anti-aliasing.
+ * Corresponds to "P" or "A" in libultra VI mode names
+ * @param modeN Boolean: controls interlacing mode, different based on resolution.
+ * Corresponds to "N" or "F" in libultra VI mode names
+ * @param fb16Bit Bolean: true = 16-bit framebuffer, false = 32-bit framebuffer.
+ * Corresponds to "1" or "2" in libultra VI mode names
+ * @param width Screen width
+ * @param height Screen height
+ * @param leftAdjust Left edge adjustment
+ * @param rightAdjust Right edge adjustment
+ * @param upperAdjust Upper edge adjustment
+ * @param lowerAdjust Lower edge adjustment
+ */
+void ViMode_Configure(OSViMode* viMode, s32 type, s32 tvType, s32 loRes, s32 antialiasOff, s32 modeN, s32 fb16Bit,
+ s32 width, s32 height, s32 leftAdjust, s32 rightAdjust, s32 upperAdjust, s32 lowerAdjust) {
+ s32 hiRes;
+ s32 antialiasOn;
+ s32 modeF;
+ s32 fb32Bit;
+ s32 hiResDeflicker; // deflickered interlacing
+ s32 hiResInterlaced;
+ s32 loResDeinterlaced;
+ s32 loResInterlaced;
+ s32 modeLAN1; // L=(lo res) A=(antialias) N=(deinterlace) 1=(16-bit)
+ s32 modeLPN2; // L=(lo res) P=(point-sampled) N=(deinterlace) 2=(32-bit)
+ s32 modeHPN2; // H=(hi res) P=(point-sampled) N=(normal interlacing) 2=(32-bit)
+ s32 yScaleLo;
+ s32 yScaleHiEvenField;
+ s32 yScaleHiOddField;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140810.s")
+ hiRes = !loRes;
+ antialiasOn = !antialiasOff;
+ modeF = !modeN;
+ fb32Bit = !fb16Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140898.s")
+ hiResDeflicker = hiRes && modeF;
+ hiResInterlaced = hiRes && modeN;
+ loResDeinterlaced = loRes && modeN;
+ loResInterlaced = loRes && modeF;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140900.s")
+ modeLAN1 = loRes && antialiasOn && modeN && fb16Bit;
+ modeLPN2 = loRes && antialiasOff && modeN && fb32Bit;
+ modeHPN2 = hiRes && antialiasOff && modeN && fb32Bit;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_8014090C.s")
+ upperAdjust &= ~1;
+ lowerAdjust &= ~1;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_vimode/func_80140970.s")
+ yScaleLo = (hiResDeflicker ? 2 : 1) * (((SCREEN_HEIGHT << 11) / SCREEN_HEIGHT) / (loRes ? 1 : 2));
+
+ yScaleHiEvenField = modeF ? (loResInterlaced ? 0x1000000 : 0x2000000) : 0;
+ yScaleHiOddField = modeF ? (loResInterlaced ? 0x3000000 : 0x2000000) : 0;
+
+ viMode->type = type;
+ viMode->comRegs.ctrl = OS_VI_UNK2000 | OS_VI_UNK1000 | OS_VI_GAMMA | OS_VI_GAMMA_DITHER |
+ (!loResDeinterlaced ? OS_VI_UNK40 : 0) | (antialiasOn ? OS_VI_DIVOT : 0) |
+ (fb32Bit ? OS_VI_UNK2 | OS_VI_UNK1 : OS_VI_UNK2);
+
+ if (modeLAN1) {
+ // Anti-aliased, fetch extra lines as-needed
+ viMode->comRegs.ctrl |= 0x100;
+ } else if (modeLPN2 | modeHPN2) {
+ // Point-sampled, resampling disabled
+ viMode->comRegs.ctrl |= 0x300;
+ } else {
+ if (antialiasOff) {
+ // Point-sampled, resampling enabled
+ viMode->comRegs.ctrl |= 0x200;
+ } else {
+ // Anti-aliased, always fetch extra lines
+ viMode->comRegs.ctrl |= 0;
+ }
+ }
+
+ viMode->comRegs.width = width * (hiResInterlaced ? 2 : 1);
+
+ if (tvType < 3) {
+ static const ViModeStruct D_801DF0C0[] = {
+ {
+ // OS_TV_PAL
+ BURST(58, 35, 4, 64),
+ VSYNC(624),
+ HSYNC(3177, 21),
+ LEAP(3183, 3182),
+ HSTART(128, 768),
+ START(95, 569),
+ BURST(107, 2, 9, 0),
+ },
+ {
+ // OS_TV_NTSC
+ BURST(57, 34, 5, 62),
+ VSYNC(524),
+ HSYNC(3093, 0),
+ LEAP(3093, 3093),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ {
+ // OS_TV_MPAL
+ BURST(57, 30, 5, 70),
+ VSYNC(524),
+ HSYNC(3088, 0),
+ LEAP(3100, 3100),
+ HSTART(108, 748),
+ START(37, 511),
+ BURST(4, 2, 14, 0),
+ },
+ };
+ const ViModeStruct* ptr = &D_801DF0C0[tvType];
+
+ viMode->comRegs.burst = ptr->burst;
+ viMode->comRegs.vSync = ptr->vSync;
+ viMode->comRegs.hSync = ptr->hSync;
+ viMode->comRegs.leap = ptr->leap;
+ viMode->comRegs.hStart = ptr->hStart;
+ viMode->fldRegs[0].vStart = ptr->vStart;
+ viMode->fldRegs[1].vStart = ptr->vStart;
+ viMode->fldRegs[0].vBurst = ptr->vBurst;
+ viMode->fldRegs[1].vBurst = ptr->vBurst;
+ } else {
+ __assert("../z_vimode.c", 216);
+ }
+
+ viMode->comRegs.hStart += (leftAdjust << 16) + (s16)rightAdjust;
+ viMode->fldRegs[0].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+ viMode->fldRegs[1].vStart += (upperAdjust << 16) + (s16)lowerAdjust;
+
+ if (loResDeinterlaced) {
+ viMode->comRegs.vSync++;
+ if (tvType == OS_TV_MPAL) {
+ viMode->comRegs.hSync += HSYNC(1, 4);
+ viMode->comRegs.leap += LEAP((u16)-4, (u16)-2);
+ }
+ } else {
+ viMode->fldRegs[0].vStart += START((u16)-3, (u16)-2);
+ if (tvType == OS_TV_MPAL) {
+ viMode->fldRegs[0].vBurst += BURST((u8)-2, (u8)-1, 12, -1);
+ } else if (tvType == OS_TV_PAL) {
+ viMode->fldRegs[1].vBurst += BURST((u8)-2, (u8)-1, 2, 0);
+ }
+ }
+
+ viMode->comRegs.xScale = (SCREEN_WIDTH << 10) / SCREEN_WIDTH;
+ viMode->comRegs.vCurrent = 0;
+
+ viMode->fldRegs[0].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2));
+ viMode->fldRegs[1].origin = ORIGIN(width * 2 * (fb16Bit ? 1 : 2) * (loRes ? 1 : 2));
+
+ viMode->fldRegs[0].yScale = yScaleLo | yScaleHiEvenField;
+ viMode->fldRegs[1].yScale = yScaleLo | yScaleHiOddField;
+
+ viMode->fldRegs[0].vIntr = 2;
+ viMode->fldRegs[1].vIntr = 2;
+}
+
+void ViMode_Save(ViMode* viMode) {
+ R_VI_MODE_EDIT_STATE = viMode->editState;
+ R_VI_MODE_EDIT_WIDTH = viMode->viWidth;
+ R_VI_MODE_EDIT_HEIGHT = viMode->viHeight;
+ R_VI_MODE_EDIT_ULY_ADJ = viMode->upperAdjust;
+ R_VI_MODE_EDIT_LRY_ADJ = viMode->lowerAdjust;
+ R_VI_MODE_EDIT_ULX_ADJ = viMode->leftAdjust;
+ R_VI_MODE_EDIT_LRX_ADJ = viMode->rightAdjust;
+
+ if (SREG(58) == 1) {
+ SREG(58) = 0;
+ switch (SREG(59)) {
+ case 1:
+ ViMode_LogPrint(&osViModePalLan1);
+ break;
+
+ case 2:
+ ViMode_LogPrint(&osViModeFpalLan1);
+ break;
+
+ default:
+ ViMode_LogPrint(&viMode->customViMode);
+ break;
+ }
+ }
+}
+
+void ViMode_Load(ViMode* viMode) {
+ //! @bug This condition always fails as the lowest bit is masked out to 0
+ if ((R_VI_MODE_EDIT_WIDTH & ~3) == 1) {
+ R_VI_MODE_EDIT_WIDTH += 4;
+ }
+
+ viMode->editState = R_VI_MODE_EDIT_STATE;
+ viMode->viWidth = R_VI_MODE_EDIT_WIDTH & ~3;
+ viMode->viHeight = R_VI_MODE_EDIT_HEIGHT;
+ viMode->upperAdjust = R_VI_MODE_EDIT_ULY_ADJ;
+ viMode->lowerAdjust = R_VI_MODE_EDIT_LRY_ADJ;
+ viMode->leftAdjust = R_VI_MODE_EDIT_ULX_ADJ;
+ viMode->rightAdjust = R_VI_MODE_EDIT_LRX_ADJ;
+}
+
+void ViMode_Init(ViMode* viMode) {
+ viMode->editState = VI_MODE_EDIT_STATE_INACTIVE;
+ viMode->viWidth = SCREEN_WIDTH;
+ viMode->viHeight = SCREEN_HEIGHT;
+ viMode->leftAdjust = 0;
+ viMode->rightAdjust = 0;
+ viMode->upperAdjust = 0;
+ viMode->lowerAdjust = 0;
+ viMode->viFeatures = OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF;
+ viMode->tvType = osTvType;
+ viMode->fb16Bit = true;
+ viMode->modeN = true;
+ viMode->antialiasOff = false;
+ viMode->loRes = true;
+
+ ViMode_Save(viMode);
+}
+
+void ViMode_Destroy(ViMode* viMode) {
+}
+
+void ViMode_ConfigureFeatures(ViMode* viMode, s32 viFeatures) {
+ u32 ctrl = viMode->customViMode.comRegs.ctrl;
+
+ if (viFeatures & OS_VI_GAMMA_ON) {
+ ctrl |= OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_OFF) {
+ ctrl &= ~OS_VI_GAMMA;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_ON) {
+ ctrl |= OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_GAMMA_DITHER_OFF) {
+ ctrl &= ~OS_VI_GAMMA_DITHER;
+ }
+ if (viFeatures & OS_VI_DIVOT_ON) {
+ ctrl |= OS_VI_DIVOT;
+ }
+ if (viFeatures & OS_VI_DIVOT_OFF) {
+ ctrl &= ~OS_VI_DIVOT;
+ }
+ viMode->customViMode.comRegs.ctrl = ctrl;
+}
+
+/**
+ * Updates the custom VI mode with controller input and any edits made with the REG editor
+ * (through R_VI_MODE_EDIT_* entries)
+ */
+void ViMode_Update(ViMode* viMode, Input* input) {
+ ViMode_Load(viMode);
+
+ if ((viMode->editState == VI_MODE_EDIT_STATE_ACTIVE) || (viMode->editState == VI_MODE_EDIT_STATE_2) ||
+ (viMode->editState == VI_MODE_EDIT_STATE_3)) {
+ gScreenWidth = viMode->viWidth;
+ gScreenHeight = viMode->viHeight;
+
+ // Controls to reset the ViMode to defaults
+ if (CHECK_BTN_ALL(input->cur.button, BTN_START | BTN_CUP | BTN_CRIGHT)) {
+ ViMode_Init(viMode);
+ }
+
+ // Controls to adjust the screen dimensions (upper-left)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CUP)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->upperAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->upperAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->leftAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->leftAdjust++;
+ }
+ }
+
+ // Controls to adjust the screen dimensions (lower-right)
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DUP)) {
+ viMode->lowerAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DDOWN)) {
+ viMode->lowerAdjust++;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT)) {
+ viMode->rightAdjust--;
+ }
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT)) {
+ viMode->rightAdjust++;
+ }
+ }
+
+ // Controls to adjust key features
+ if (CHECK_BTN_ALL(input->cur.button, BTN_CDOWN)) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) {
+ viMode->loRes = !viMode->loRes;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) {
+ viMode->antialiasOff = !viMode->antialiasOff;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) {
+ viMode->modeN = !viMode->modeN;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) {
+ viMode->fb16Bit = !viMode->fb16Bit;
+ }
+ }
+
+ // Clamp adjustments
+ if (viMode->editState >= VI_MODE_EDIT_STATE_2) {
+ // Allow parts of the framebuffer to possibly be offscreen by a small margin
+ if (viMode->leftAdjust < -16) {
+ viMode->leftAdjust = -16;
+ }
+ if (viMode->upperAdjust < -50) {
+ viMode->upperAdjust = -50;
+ }
+ if (viMode->rightAdjust > 16) {
+ viMode->rightAdjust = 16;
+ }
+ if (viMode->lowerAdjust > 50) {
+ viMode->lowerAdjust = 50;
+ }
+ } else {
+ // Do not allow parts of the framebuffer to end up offscreen
+ if (viMode->leftAdjust < 0) {
+ viMode->leftAdjust = 0;
+ }
+ if (viMode->upperAdjust < 0) {
+ viMode->upperAdjust = 0;
+ }
+ if (viMode->rightAdjust > 0) {
+ viMode->rightAdjust = 0;
+ }
+ if (viMode->lowerAdjust > 0) {
+ viMode->lowerAdjust = 0;
+ }
+ }
+
+ ViMode_Configure(&viMode->customViMode, OS_VI_UNK28, osTvType, viMode->loRes, viMode->antialiasOff,
+ viMode->modeN, viMode->fb16Bit, viMode->viWidth, viMode->viHeight, viMode->leftAdjust,
+ viMode->rightAdjust, viMode->upperAdjust, viMode->lowerAdjust);
+ ViMode_ConfigureFeatures(viMode, viMode->viFeatures);
+
+ if (viMode->editState == VI_MODE_EDIT_STATE_3) {
+ // Log comparison between the NTSC LAN1 mode and the custom mode
+ ViMode_LogPrint(&osViModeNtscLan1);
+ ViMode_LogPrint(&viMode->customViMode);
+ viMode->editState = VI_MODE_EDIT_STATE_2;
+ }
+ }
+
+ ViMode_Save(viMode);
+}
diff --git a/src/code/z_viscvg.c b/src/code/z_viscvg.c
new file mode 100644
index 000000000..888fa19b3
--- /dev/null
+++ b/src/code/z_viscvg.c
@@ -0,0 +1,90 @@
+#include "global.h"
+
+Gfx D_801C5DD0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_VISCVG | G_RM_VISCVG2),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DE0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5DF0[] = {
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+Gfx D_801C5E00[] = {
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetOtherMode(G_AD_NOTPATTERN | G_CD_DISABLE | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsSPDisplayList(D_0E000000.fillRect),
+ gsDPSetOtherMode(G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_NONE | G_ZS_PRIM | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_MEM, G_BL_A_MEM)),
+ gsSPBranchList(D_0E000000.fillRect),
+};
+
+void VisCvg_Init(struct_801F8010* this) {
+ this->type = 0;
+ this->setScissor = false;
+ this->color.r = 255;
+ this->color.g = 255;
+ this->color.b = 255;
+ this->color.a = 255;
+}
+
+void VisCvg_Destroy(struct_801F8010* this) {
+}
+
+void VisCvg_Draw(struct_801F8010* this, Gfx** gfxp) {
+ Gfx* gfx = *gfxp;
+
+ gDPPipeSync(gfx++);
+ gDPSetPrimDepth(gfx++, -1, -1);
+
+ if (this->setScissor == true) {
+ gSPDisplayList(gfx++, D_0E000000.setScissor);
+ }
+
+ switch (this->type) {
+ case 1:
+ gSPDisplayList(gfx++, D_801C5DF0);
+ break;
+
+ case 2:
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5E00);
+ break;
+
+ case 3:
+ gDPSetColor(gfx++, G_SETBLENDCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DD0);
+ break;
+
+ case 4:
+ gDPSetColor(gfx++, G_SETFOGCOLOR, this->color.rgba);
+ gSPDisplayList(gfx++, D_801C5DE0);
+ break;
+
+ default:
+ break;
+ }
+
+ gDPPipeSync(gfx++);
+ *gfxp = gfx;
+}
diff --git a/src/code/z_viszbuf.c b/src/code/z_viszbuf.c
index 9970a1e1b..cf603f324 100644
--- a/src/code/z_viszbuf.c
+++ b/src/code/z_viszbuf.c
@@ -1,6 +1,6 @@
#include "global.h"
-#define VISZBUF_ZBUFFRAG_HEIGHT (TMEM_SIZE / (D_801FBBCC * G_IM_SIZ_16b_BYTES))
+#define VISZBUF_ZBUFFRAG_HEIGHT (TMEM_SIZE / (gCfbWidth * G_IM_SIZ_16b_BYTES))
void VisZbuf_Init(VisZbuf* this) {
this->useRgba = false;
@@ -42,12 +42,12 @@ void VisZbuf_Draw(VisZbuf* this, Gfx** gfxP, void* zbuffer) {
gDPSetColor(gfx++, G_SETPRIMCOLOR, this->primColor.rgba);
gDPSetColor(gfx++, G_SETENVCOLOR, this->envColor.rgba);
- for (y = 0; y < (D_801FBBCE - height) + 1; y += height) {
- gDPLoadTextureTile(gfx++, zbuffer, fmt, G_IM_SIZ_16b, D_801FBBCC, 0, 0, y, D_801FBBCC - 1, (y + height) - 1, 0,
+ for (y = 0; y < (gCfbHeight - height) + 1; y += height) {
+ gDPLoadTextureTile(gfx++, zbuffer, fmt, G_IM_SIZ_16b, gCfbWidth, 0, 0, y, gCfbWidth - 1, (y + height) - 1, 0,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
- gSPTextureRectangle(gfx++, 0, y << 2, D_801FBBCC << 2, (y + height) << 2, G_TX_RENDERTILE, 0, y << 5, 1 << 10,
+ gSPTextureRectangle(gfx++, 0, y << 2, gCfbWidth << 2, (y + height) << 2, G_TX_RENDERTILE, 0, y << 5, 1 << 10,
1 << 10);
}
diff --git a/src/code/z_vr_box.c b/src/code/z_vr_box.c
index 911e3e757..dd0785d94 100644
--- a/src/code/z_vr_box.c
+++ b/src/code/z_vr_box.c
@@ -239,7 +239,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
case SKYBOX_NORMAL_SKY:
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
- if (play->envCtx.unk_10 == 0) {
+ if (play->envCtx.skybox1Index == 0) {
// Send a DMA request for the clear sky texture
size = SEGMENT_ROM_SIZE(d2_fine_static);
@@ -256,7 +256,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) {
osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK);
osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1);
- if (play->envCtx.unk_11 == 0) {
+ if (play->envCtx.skybox2Index == 0) {
// Send a DMA request for the clear sky texture
size = SEGMENT_ROM_SIZE(d2_fine_static);
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/flash/osFlash.c b/src/libultra/flash/osFlash.c
index 3ed33f45d..f8649f4fd 100644
--- a/src/libultra/flash/osFlash.c
+++ b/src/libultra/flash/osFlash.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "ultra64.h"
#include "global.h"
@@ -11,8 +10,8 @@ s32 __osFlashVersion;
UNK_TYPE1 D_801FD0FC[0x14];
typedef enum {
- FLASH_OLD,
- FLASH_NEW,
+ /* 0 */ FLASH_OLD,
+ /* 1 */ FLASH_NEW
} FlashVersion;
u32 osFlashGetAddr(u32 pageNum) {
diff --git a/src/libultra/gu/position.c b/src/libultra/gu/position.c
index 4af6dadc4..9ba9d3570 100644
--- a/src/libultra/gu/position.c
+++ b/src/libultra/gu/position.c
@@ -6,8 +6,12 @@
*/
void guPositionF(f32 mf[4][4], f32 rot, f32 pitch, f32 yaw, f32 scale, f32 x, f32 y, f32 z) {
static f32 D_80134D00 = M_PI / 180.0f;
- f32 sinr, sinp, sinh;
- f32 cosr, cosp, cosh;
+ f32 sinr;
+ f32 sinp;
+ f32 sinh;
+ f32 cosr;
+ f32 cosp;
+ f32 cosh;
rot *= D_80134D00;
pitch *= D_80134D00;
diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c
index fd4c4e459..e9431a741 100644
--- a/src/libultra/io/contpfs.c
+++ b/src/libultra/io/contpfs.c
@@ -66,7 +66,8 @@ s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) {
u8 buf[BLOCKSIZE];
u8 comp[BLOCKSIZE];
u8 mask = 0;
- s32 i, j = 0;
+ s32 i = 0;
+ s32 j = 0;
u16 index[4];
newid->repaired = 0xFFFFFFFF;
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/libultra/io/osViModeMpalLan1.c b/src/libultra/io/osViModeMpalLan1.c
index c7c09f659..ccccf68ae 100644
--- a/src/libultra/io/osViModeMpalLan1.c
+++ b/src/libultra/io/osViModeMpalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeMpalLan1 = {
OS_VI_MPAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4651E39, // burst
- 0x20D, // vSync
- 0x40C11, // hSync
- 0xC190C1A, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 30, 5, 70), // burst
+ VSYNC(525), // vSync
+ HSYNC(3089, 4), // hSync
+ LEAP(3097, 3098), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscHpf1.c b/src/libultra/io/osViModeNtscHpf1.c
index ac0a1fa2b..5f88f4e94 100644
--- a/src/libultra/io/osViModeNtscHpf1.c
+++ b/src/libultra/io/osViModeNtscHpf1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscHpf1 = {
OS_VI_NTSC_HPF1, // type
{
// comRegs
- 0x324E, // ctrl
- 640, // width
- 0x3E52239, // burst
- 0x20C, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x400, // xScale
- 0, // vCurrent
+ 0x324E, // ctrl
+ WIDTH(640), // width
+ BURST(57, 34, 5, 62), // 0x3E52239, // burst
+ VSYNC(524), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // 0x6C02EC, // hStart
+ SCALE(1, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x500, // origin
- 0x2000800, // yScale
- 0x2301FD, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(1280), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(35, 509), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0xA00, // origin
- 0x2000800, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2 // vIntr
+ ORIGIN(2560), // origin
+ SCALE(0.5, 0.5), // 0x2000800, // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2) // vIntr
} },
};
diff --git a/src/libultra/io/osViModeNtscLan1.c b/src/libultra/io/osViModeNtscLan1.c
index 632d763f4..86eb473b7 100644
--- a/src/libultra/io/osViModeNtscLan1.c
+++ b/src/libultra/io/osViModeNtscLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModeNtscLan1 = {
OS_VI_NTSC_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x3E52239, // burst
- 0x20D, // vSync
- 0xC15, // hSync
- 0xC150C15, // leap
- 0x6C02EC, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(57, 34, 5, 62), // burst
+ VSYNC(525), // vSync
+ HSYNC(3093, 0), // hSync
+ LEAP(3093, 3093), // leap
+ HSTART(108, 748), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x2501FF, // vStart
- 0xE0204, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(37, 511), // vStart
+ BURST(4, 2, 14, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/osViModePalLan1.c b/src/libultra/io/osViModePalLan1.c
index 174cbf142..f875bb731 100644
--- a/src/libultra/io/osViModePalLan1.c
+++ b/src/libultra/io/osViModePalLan1.c
@@ -1,34 +1,35 @@
#include "global.h"
+#include "ultra64/viint.h"
OSViMode osViModePalLan1 = {
OS_VI_PAL_LAN1, // type
{
// comRegs
- 0x311E, // ctrl
- SCREEN_WIDTH, // width
- 0x4541E3A, // burst
- 0x271, // vSync
- 0x170C69, // hSync
- 0xC6F0C6D, // leap
- 0x800300, // hStart
- 0x200, // xScale
- 0, // vCurrent
+ 0x311E, // ctrl
+ WIDTH(320), // width
+ BURST(58, 30, 4, 69), // burst
+ VSYNC(625), // vSync
+ HSYNC(3177, 23), // hSync
+ LEAP(3183, 3181), // leap
+ HSTART(128, 768), // hStart
+ SCALE(2, 0), // xScale
+ VCURRENT(0), // vCurrent
},
{ // fldRegs
{
// [0]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2, // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
},
{
// [1]
- 0x280, // origin
- 0x400, // yScale
- 0x5F0239, // vStart
- 0x9026B, // vBurst
- 2 // vIntr
+ ORIGIN(640), // origin
+ SCALE(1, 0), // yScale
+ START(95, 569), // vStart
+ BURST(107, 2, 9, 0), // vBurst
+ VINTR(2), // vIntr
} },
};
diff --git a/src/libultra/io/pfschecker.c b/src/libultra/io/pfschecker.c
index bf885a1a4..d3a635768 100644
--- a/src/libultra/io/pfschecker.c
+++ b/src/libultra/io/pfschecker.c
@@ -18,8 +18,10 @@ s32 osPfsChecker(OSPfs* pfs) {
__OSInodeUnit nextNodeInFile[16];
__OSInodeCache cache;
s32 fixed = 0;
- u8 bank, prevBank = 254;
- s32 cc, cl;
+ u8 bank = 254;
+ u8 prevBank = 254;
+ s32 cc;
+ s32 cl;
s32 offset;
ret = __osCheckId(pfs);
diff --git a/src/libultra/io/pfsfilestate.c b/src/libultra/io/pfsfilestate.c
index a555199fc..f06c8d937 100644
--- a/src/libultra/io/pfsfilestate.c
+++ b/src/libultra/io/pfsfilestate.c
@@ -34,7 +34,7 @@ s32 osPfsFileState(OSPfs* pfs, s32 fileNo, OSPfsState* state) {
return ret;
}
- if (dir.company_code == 0 || dir.game_code == 0) {
+ if ((dir.company_code == 0) || (dir.game_code == 0)) {
return PFS_ERR_INVALID;
}
diff --git a/src/libultra/libc/ldiv.c b/src/libultra/libc/ldiv.c
index 21fe84e80..9f9d75031 100644
--- a/src/libultra/libc/ldiv.c
+++ b/src/libultra/libc/ldiv.c
@@ -5,7 +5,7 @@ ldiv_t ldiv(long numer, long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
@@ -18,7 +18,7 @@ lldiv_t lldiv(long long numer, long long denom) {
val.quot = numer / denom;
val.rem = numer - denom * val.quot;
- if (val.quot < 0 && val.rem > 0) {
+ if ((val.quot < 0) && (val.rem > 0)) {
val.quot++;
val.rem -= denom;
}
diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c
index 399d2caf4..0fd42d1ed 100644
--- a/src/libultra/libc/ll.c
+++ b/src/libultra/libc/ll.c
@@ -36,7 +36,7 @@ void __ull_divremi(unsigned long long* quotient, unsigned long long* remainder,
long long __ll_mod(long long left, long long right) {
long long rem = left % right;
- if ((rem < 0 && right > 0) || (rem > 0 && right < 0)) {
+ if (((rem < 0) && (right > 0)) || ((rem > 0) && (right < 0))) {
rem += right;
}
return rem;
diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c
index 776191227..4fabb4c4d 100644
--- a/src/libultra/os/initialize.c
+++ b/src/libultra/os/initialize.c
@@ -3,11 +3,11 @@
#define COLD_RESET 0
typedef struct {
- /* 0x0 */ u32 ins_00; // lui k0, 0x8000
- /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
- /* 0x8 */ u32 ins_08; // jr k0 ; __osException
- /* 0xC */ u32 ins_0C; // nop
-} struct_exceptionPreamble;
+ /* 0x0 */ u32 ins_00; // lui k0, 0x8000
+ /* 0x4 */ u32 ins_04; // addiu k0, k0, 0x39E0
+ /* 0x8 */ u32 ins_08; // jr k0 ; __osException
+ /* 0xC */ u32 ins_0C; // nop
+} struct_exceptionPreamble; // size = 0x10
u64 osClockRate = OS_CLOCK_RATE;
s32 osViClock = VI_NTSC_CLOCK;
diff --git a/src/libultra/os/seteventmesg.c b/src/libultra/os/seteventmesg.c
index 8be2ff9e2..26e837fcf 100644
--- a/src/libultra/os/seteventmesg.c
+++ b/src/libultra/os/seteventmesg.c
@@ -16,7 +16,7 @@ void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m) {
es->message = m;
if (e == 14) {
- if (__osShutdown != 0 && D_80097F10 == 0) {
+ if ((__osShutdown != 0) && (D_80097F10 == 0)) {
osSendMesg(mq, m, OS_MESG_NOBLOCK);
}
D_80097F10 = 1;
diff --git a/src/libultra/rmon/xldtob.c b/src/libultra/rmon/xldtob.c
index 460d0951c..66c058396 100644
--- a/src/libultra/rmon/xldtob.c
+++ b/src/libultra/rmon/xldtob.c
@@ -61,7 +61,7 @@ void _Ldtob(_Pft* args, u8 type) {
if (args->prec < 0) {
args->prec = 6;
- } else if (args->prec == 0 && (type == 'g' || type == 'G')) {
+ } else if ((args->prec == 0) && ((type == 'g') || (type == 'G'))) {
args->prec = 1;
}
err = _Ldunscale(&exp, (_Pft*)args);
@@ -101,13 +101,13 @@ void _Ldtob(_Pft* args, u8 type) {
gen = 0x13;
}
*ptr++ = '0';
- while (gen > 0 && 0 < val) {
+ while ((gen > 0) && (0 < val)) {
lo = val;
if ((gen -= 8) > 0) {
val = (val - lo) * 1.0e8;
}
ptr = ptr + 8;
- for (j = 8; lo > 0 && --j >= 0;) {
+ for (j = 8; (lo > 0) && (--j >= 0);) {
qr = ldiv(lo, 10);
*--ptr = qr.rem + '0';
lo = qr.quot;
@@ -124,12 +124,12 @@ void _Ldtob(_Pft* args, u8 type) {
--gen, --exp;
}
- nsig = ((type == 'f') ? exp + 1 : ((type == 'e' || type == 'E') ? 1 : 0)) + args->prec;
+ nsig = ((type == 'f') ? exp + 1 : (((type == 'e') || (type == 'E')) ? 1 : 0)) + args->prec;
if (gen < nsig) {
nsig = gen;
}
if (nsig > 0) {
- if (nsig < gen && ptr[nsig] > '4') {
+ if ((nsig < gen) && (ptr[nsig] > '4')) {
drop = '9';
} else {
drop = '0';
@@ -178,7 +178,7 @@ void _Genld(_Pft* px, u8 code, u8* p, s16 nsig, s16 xexp) {
p = (u8*)"0";
}
- if (code == 'f' || ((code == 'g' || code == 'G') && (-4 <= xexp) && (xexp < px->prec))) { /* 'f' format */
+ if ((code == 'f') || (((code == 'g') || (code == 'G')) && (-4 <= xexp) && (xexp < px->prec))) { /* 'f' format */
++xexp; /* change to leading digit count */
if (code != 'f') { /* fixup for 'g' */
if (!(px->flags & FLAGS_HASH) && nsig < px->prec) {
@@ -225,8 +225,8 @@ void _Genld(_Pft* px, u8 code, u8* p, s16 nsig, s16 xexp) {
px->n1 += nsig;
px->nz1 = px->prec - nsig;
}
- } else { /* 'e' format */
- if (code == 'g' || code == 'G') { /* fixup for 'g' */
+ } else { /* 'e' format */
+ if ((code == 'g') || (code == 'G')) { /* fixup for 'g' */
if (nsig < px->prec) {
px->prec = nsig;
}
diff --git a/src/libultra/rmon/xlitob.c b/src/libultra/rmon/xlitob.c
index f200e01a4..6c53ee094 100644
--- a/src/libultra/rmon/xlitob.c
+++ b/src/libultra/rmon/xlitob.c
@@ -27,13 +27,13 @@ void _Litob(_Pft* args, u8 type) {
num = -num;
}
- if (num != 0 || args->prec != 0) {
+ if ((num != 0) || (args->prec != 0)) {
buff[--idx] = numMap[num % base];
}
args->v.ll = num / base;
- while (args->v.ll > 0 && idx > 0) {
+ while ((args->v.ll > 0) && (idx > 0)) {
quotrem = lldiv(args->v.ll, base);
args->v.ll = quotrem.quot;
buff[--idx] = numMap[quotrem.rem];
@@ -47,7 +47,7 @@ void _Litob(_Pft* args, u8 type) {
args->nz0 = args->prec - args->n1;
}
- if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
+ if ((args->prec < 0) && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
idx = args->width - args->n0 - args->nz0 - args->n1;
if (idx > 0) {
args->nz0 += idx;
diff --git a/src/libultra/rmon/xprintf.c b/src/libultra/rmon/xprintf.c
index ddb83652d..6caac436f 100644
--- a/src/libultra/rmon/xprintf.c
+++ b/src/libultra/rmon/xprintf.c
@@ -42,7 +42,7 @@ int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
unsigned char ac[0x20];
s = fmt;
- while ((c = *s) != 0 && c != '%') {
+ while (((c = *s) != 0) && (c != '%')) {
s++;
}
_PROUT((char*)fmt, s - fmt);
@@ -206,7 +206,7 @@ void _Putfld(_Pft* px, va_list* pap, unsigned char code, unsigned char* ac) {
case 's':
px->s = va_arg(*pap, char*);
px->n1 = strlen(px->s);
- if (px->prec >= 0 && px->n1 > px->prec) {
+ if ((px->prec >= 0) && (px->n1 > px->prec)) {
px->n1 = px->prec;
}
break;
diff --git a/src/libultra/voice/voicegetstatus.c b/src/libultra/voice/voicegetstatus.c
index a3608277f..3840ec62b 100644
--- a/src/libultra/voice/voicegetstatus.c
+++ b/src/libultra/voice/voicegetstatus.c
@@ -37,7 +37,7 @@ s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) {
*status = header.status;
if (ret == 0) {
- if (header.typeh == 0 && header.typel == 1) {
+ if ((header.typeh == 0) && (header.typel == 1)) {
if (header.status & 4) {
ret = CONT_ERR_CONTRFAIL;
}
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..c7bff97f2 100644
--- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
+++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c
@@ -129,7 +129,7 @@ void ArmsHook_AttachHookToActor(ArmsHook* this, Actor* actor) {
void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((this->actor.parent == NULL) || (!Player_IsHoldingHookshot(player))) {
+ if ((this->actor.parent == NULL) || !Player_IsHoldingHookshot(player)) {
ArmsHook_DetachHookFromActor(this);
Actor_Kill(&this->actor);
return;
@@ -138,9 +138,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
func_800B8F98(&player->actor, NA_SE_IT_HOOKSHOT_CHAIN - SFX_FLAG);
ArmsHook_CheckForCancel(this);
- if (this->timer != 0 && (this->collider.base.atFlags & AT_HIT) &&
+ 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);
@@ -190,12 +191,10 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
} else {
if (this->actor.child != NULL) {
velocity = 30.0f;
+ } else if (grabbed != NULL) {
+ velocity = 50.0f;
} else {
- if (grabbed != NULL) {
- velocity = 50.0f;
- } else {
- velocity = 200.0f;
- }
+ velocity = 200.0f;
}
phi_f16 = bodyDistDiff - velocity;
if (bodyDistDiff <= velocity) {
@@ -244,7 +243,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) {
sp60.z = this->unk1EC.z - (this->unk1E0.z - this->unk1EC.z);
if (BgCheck_EntityLineTest1(&play->colCtx, &sp60, &this->unk1E0, &posResult, &poly, true, true, true, true,
&bgId) &&
- (func_800B90AC(play, &this->actor, poly, bgId, &posResult) == 0 ||
+ (!func_800B90AC(play, &this->actor, poly, bgId, &posResult) ||
BgCheck_ProjectileLineTest(&play->colCtx, &sp60, &this->unk1E0, &posResult, &poly, true, true, true, true,
&bgId))) {
f32 nx = COLPOLY_GET_NORMAL(poly->normal.x);
@@ -314,7 +313,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..efa7f04c4 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,
@@ -249,6 +249,7 @@ void ArrowFire_Draw(Actor* thisx, PlayState* play) {
Actor* transform = (arrow->unk_261 & 2) ? &this->actor : &arrow->actor;
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Translate(transform->world.pos.x, transform->world.pos.y, transform->world.pos.z, MTXMODE_NEW);
Matrix_RotateYS(transform->shape.rot.y, MTXMODE_APPLY);
Matrix_RotateXS(transform->shape.rot.x, MTXMODE_APPLY);
@@ -256,7 +257,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 +267,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..0391925ae 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
@@ -202,24 +202,28 @@ void BgAstrBombwall_Draw(Actor* thixs, PlayState* play) {
Gfx* opa;
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);
POLY_OPA_DISP = &opa[4];
+
CLOSE_DISPS(play->state.gfxCtx);
}
{
Gfx* xlu;
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);
POLY_XLU_DISP = &xlu[4];
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
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..efe92eebc 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.c
@@ -60,7 +60,7 @@ typedef struct {
/* 0x14 */ BgBreakwallUnkFunc unk_14;
/* 0x18 */ BgBreakwallUnkFunc2 unk_18;
/* 0x1C */ ActorFunc unk_1C;
-} BgBreakwallStruct;
+} BgBreakwallStruct; // size = 0x20
BgBreakwallStruct D_808B8140[] = {
{ OBJECT_OMOYA_OBJ, object_omoya_obj_DL_0001A0, NULL, NULL, NULL, func_808B7380, func_808B77D0, NULL },
@@ -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[] = {
@@ -146,7 +145,7 @@ s32 func_808B736C(BgBreakwall* this, PlayState* play) {
}
s32 func_808B7380(BgBreakwall* this, PlayState* play) {
- if ((gSaveContext.save.day >= 2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((gSaveContext.save.day >= 2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
return true;
@@ -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_Breakwall/z_bg_breakwall.h b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
index bcdda2327..c332fe82c 100644
--- a/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
+++ b/src/overlays/actors/ovl_Bg_Breakwall/z_bg_breakwall.h
@@ -12,11 +12,11 @@ typedef void (*BgBreakwallUnkFunc2)(struct BgBreakwall*, PlayState*);
#define BGBREAKWALL_GET_F(thisx) ((thisx)-> params & 0xF)
#define BGBREAKWALL_SWITCHFLAG(thisx) (((thisx)-> params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 7 */ BGBREAKWALL_F_7 = 7,
/* 9 */ BGBREAKWALL_F_9 = 9,
- /* 11 */ BGBREAKWALL_F_11 = 11,
-};
+ /* 11 */ BGBREAKWALL_F_11 = 11
+} BgBreakwallParam;
typedef struct BgBreakwall {
/* 0x000 */ DynaPolyActor dyna;
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..d8c39a098 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,11 +191,13 @@ 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_Ctower_Gear/z_bg_ctower_gear.h b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
index afea1bf0d..d59bfd3ea 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
+++ b/src/overlays/actors/ovl_Bg_Ctower_Gear/z_bg_ctower_gear.h
@@ -9,10 +9,10 @@ struct BgCtowerGear;
#define BGCTOWERGEAR_GET_TYPE(thisx) ((thisx)->params & 3)
typedef enum {
- /* 0x0 */ BGCTOWERGEAR_CEILING_COG,
- /* 0x1 */ BGCTOWERGEAR_CENTER_COG,
- /* 0x2 */ BGCTOWERGEAR_WATER_WHEEL,
- /* 0x3 */ BGCTOWERGEAR_ORGAN
+ /* 0 */ BGCTOWERGEAR_CEILING_COG,
+ /* 1 */ BGCTOWERGEAR_CENTER_COG,
+ /* 2 */ BGCTOWERGEAR_WATER_WHEEL,
+ /* 3 */ BGCTOWERGEAR_ORGAN
} BgCtowerGearType;
typedef struct BgCtowerGear {
diff --git a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
index 52a905ed5..a06934669 100644
--- a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
+++ b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.h
@@ -11,7 +11,7 @@ typedef enum {
/* 0 */ BGCTOWERROT_CORRIDOR,
/* 1 */ BGCTOWERROT_STONE_DOOR_MAIN, // Main door controls cutscene flow (updating Link fields and playing sounds).
// It is the one on the left when entering from the Lost Woods
- /* 2 */ BGCTOWERROT_STONE_DOOR,
+ /* 2 */ BGCTOWERROT_STONE_DOOR
} BgCtowerRotType;
typedef struct BgCtowerRot {
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..6d13f4ac3 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
@@ -34,9 +34,9 @@ void func_80A2B308(Actor* thisx, PlayState* play);
BgDblueMovebg* D_80A2BBF0;
typedef struct {
- u8 unk_00;
- u8 unk_01;
-} BgDblueMovebgUnkStruct;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
+} BgDblueMovebgUnkStruct; // size = 0x2
BgDblueMovebgUnkStruct D_80A2BBF4;
@@ -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_F40_Block/z_bg_f40_block.c b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
index be1958cb4..97ccc907a 100644
--- a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
+++ b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.c
@@ -56,8 +56,8 @@ s32 func_80BC3980(BgF40Block* this, PlayState* play) {
this->unk_160 = 0;
this->unk_164 = 0;
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
@@ -78,8 +78,8 @@ s32 func_80BC3A2C(BgF40Block* this, PlayState* play) {
this->unk_160 = this->path->count - 1;
this->unk_164 = this->path->count - 1;
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
points += this->unk_164;
@@ -229,10 +229,10 @@ void BgF40Block_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004640);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerBlockCol);
- if (BGF40BLOCK_GET_PATH(&this->dyna.actor) != 0x3F) {
- this->path = &play->setupPathList[BGF40BLOCK_GET_PATH(&this->dyna.actor)];
+ if (BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor) != BGF40BLOCK_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[BGF40BLOCK_GET_PATH_INDEX(&this->dyna.actor)];
} else {
this->path = NULL;
}
@@ -373,5 +373,5 @@ void BgF40Block_Update(Actor* thisx, PlayState* play) {
}
void BgF40Block_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_0043D0);
+ Gfx_DrawDListOpa(play, gStoneTowerBlockDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
index 37a5c360e..228fb6bfd 100644
--- a/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
+++ b/src/overlays/actors/ovl_Bg_F40_Block/z_bg_f40_block.h
@@ -7,9 +7,11 @@ struct BgF40Block;
typedef void (*BgF40BlockActionFunc)(struct BgF40Block*, PlayState*);
-#define BGF40BLOCK_GET_PATH(thisx) (((thisx)->params & 0x1FC) >> 2)
+#define BGF40BLOCK_GET_PATH_INDEX(thisx) (((thisx)->params & 0x1FC) >> 2)
#define BGF40BLOCK_GET_SWITCHFLAG(thisx) (((thisx)->params & 0xFE00) >> 9)
+#define BGF40BLOCK_PATH_INDEX_NONE 0x3F
+
typedef struct BgF40Block {
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ Path* path;
diff --git a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
index 075f38607..f47bf4394 100644
--- a/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Flift/z_bg_f40_flift.c
@@ -42,7 +42,7 @@ void BgF40Flift_Init(Actor* thisx, PlayState* play) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
- DynaPolyActor_LoadMesh(play, &this->dyna, &object_f40_obj_Colheader_004240);
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerTempleSquareElevatorCol);
this->dyna.actor.params = 1;
this->actionFunc = func_808D75F0;
}
@@ -64,10 +64,11 @@ void func_808D75F0(BgF40Flift* this, PlayState* play) {
}
this->timer--;
if (this->dyna.actor.params == 1) {
- this->dyna.actor.world.pos.y = (sin_rad(this->timer * (M_PI / 24.0f)) * 5.0f) + this->dyna.actor.home.pos.y;
+ this->dyna.actor.world.pos.y =
+ (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f) + this->dyna.actor.home.pos.y;
} else {
this->dyna.actor.world.pos.y =
- (sin_rad(this->timer * (M_PI / 24.0f)) * 5.0f) + (926.8f + this->dyna.actor.home.pos.y);
+ (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f) + (926.8f + this->dyna.actor.home.pos.y);
}
}
}
@@ -76,7 +77,7 @@ void func_808D7714(BgF40Flift* this, PlayState* play) {
if (this->timer != 0) {
this->timer--;
this->dyna.actor.world.pos.y =
- (((cos_rad(this->timer * (M_PI / 96.0f)) * this->dyna.actor.params) + 1.0f) * 463.4f) +
+ (((Math_CosF(this->timer * (M_PI / 96.0f)) * this->dyna.actor.params) + 1.0f) * 463.4f) +
this->dyna.actor.home.pos.y;
} else {
this->dyna.actor.params = -this->dyna.actor.params;
@@ -91,5 +92,5 @@ void BgF40Flift_Update(Actor* thisx, PlayState* play) {
}
void BgF40Flift_Draw(Actor* thisx, PlayState* play) {
- Gfx_DrawDListOpa(play, object_f40_obj_DL_004038);
+ Gfx_DrawDListOpa(play, gStoneTowerTempleSquareElevatorDL);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
index 67703f0cd..be3c9cb47 100644
--- a/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
+++ b/src/overlays/actors/ovl_Bg_F40_Switch/z_bg_f40_switch.c
@@ -53,21 +53,20 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
u32 inCsMode = Player_InCsMode(play);
for (actor = play->actorCtx.actorLists[ACTORCAT_SWITCH].first; actor != NULL; actor = actor->next) {
- if (actor->id == ACTOR_BG_F40_SWITCH && actor->room == this->dyna.actor.room && actor->update != NULL) {
+ if ((actor->id == ACTOR_BG_F40_SWITCH) && (actor->room == this->dyna.actor.room) &&
+ (actor->update != NULL)) {
actorAsSwitch = (BgF40Switch*)actor;
actorAsSwitch->wasPressed = actorAsSwitch->isPressed;
isPressed = DynaPolyActor_IsSwitchPressed(&actorAsSwitch->dyna);
- if (actorAsSwitch->isPressed && actorAsSwitch->actionFunc == BgF40Switch_IdlePressed) {
+ if (actorAsSwitch->isPressed && (actorAsSwitch->actionFunc == BgF40Switch_IdlePressed)) {
// Switch is fully pressed - if there's nothing keeping it pressed, wait a short time before
// reverting to unpressed state.
if (isPressed || inCsMode) {
actorAsSwitch->switchReleaseDelay = 6;
+ } else if (actorAsSwitch->switchReleaseDelay > 0) {
+ actorAsSwitch->switchReleaseDelay--;
} else {
- if (actorAsSwitch->switchReleaseDelay > 0) {
- actorAsSwitch->switchReleaseDelay--;
- } else {
- actorAsSwitch->isPressed = isPressed;
- }
+ actorAsSwitch->isPressed = isPressed;
}
} else {
// No delay when pressing switch, or releasing from a not-fully-pressed state.
@@ -75,9 +74,9 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
}
if (actorAsSwitch->isPressed) {
switchFlag = BGF40SWITCH_GET_SWITCHFLAG(&actorAsSwitch->dyna.actor);
- if (switchFlag >= 0 && switchFlag < 0x80) {
+ if ((switchFlag >= 0) && (switchFlag < 0x80)) {
pressedSwitchFlags[(switchFlag & ~0x1F) >> 5] |= 1 << (switchFlag & 0x1F);
- if (!actorAsSwitch->wasPressed && actorAsSwitch->actionFunc == BgF40Switch_IdleUnpressed &&
+ if (!actorAsSwitch->wasPressed && (actorAsSwitch->actionFunc == BgF40Switch_IdleUnpressed) &&
!Flags_GetSwitch(play, switchFlag)) {
actorAsSwitch->isInitiator = true;
}
@@ -86,9 +85,10 @@ void BgF40Switch_CheckAll(BgF40Switch* this, PlayState* play) {
}
}
for (actor = play->actorCtx.actorLists[ACTORCAT_SWITCH].first; actor != NULL; actor = actor->next) {
- if (actor->id == ACTOR_BG_F40_SWITCH && actor->room == this->dyna.actor.room && actor->update != 0) {
+ if ((actor->id == ACTOR_BG_F40_SWITCH) && (actor->room == this->dyna.actor.room) &&
+ (actor->update != NULL)) {
switchFlag = BGF40SWITCH_GET_SWITCHFLAG(actor);
- if (switchFlag >= 0 && switchFlag < 0x80 && Flags_GetSwitch(play, switchFlag) &&
+ if ((switchFlag >= 0) && (switchFlag < 0x80) && Flags_GetSwitch(play, switchFlag) &&
!(pressedSwitchFlags[(switchFlag & ~0x1F) >> 5] & (1 << (switchFlag & 0x1F)))) {
Flags_UnsetSwitch(play, switchFlag);
}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
index 97fd3f068..039d20f3c 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.c
@@ -5,6 +5,7 @@
*/
#include "z_bg_f40_swlift.h"
+#include "objects/object_f40_obj/object_f40_obj.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -12,11 +13,13 @@
void BgF40Swlift_Init(Actor* thisx, PlayState* play);
void BgF40Swlift_Destroy(Actor* thisx, PlayState* play);
-void BgF40Swlift_Update(Actor* thisx, PlayState* play);
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2);
void BgF40Swlift_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Bg_F40_Swlift_InitVars = {
+static s32 sSwitchFlags[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+static s32 sHeights[4];
+
+const ActorInit Bg_F40_Swlift_InitVars = {
ACTOR_BG_F40_SWLIFT,
ACTORCAT_BG,
FLAGS,
@@ -28,24 +31,86 @@ ActorInit Bg_F40_Swlift_InitVars = {
(ActorFunc)BgF40Swlift_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_8096F540[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneScale, 550, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 5000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-#endif
+void BgF40Swlift_Init(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+ s32 index;
+ s32 pad;
-extern InitChainEntry D_8096F540[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS);
+ index = BG_F40_SWLIFT_GET_INDEX(thisx);
+ if ((index < 0) || (index >= 5)) { //! @bug An index greater than 3 will cause an out of bounds array access.
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-extern UNK_TYPE D_06003B08;
-extern UNK_TYPE D_06003E80;
+ sHeights[index] = this->dyna.actor.world.pos.y;
+ sSwitchFlags[index] = BG_F40_SWLIFT_GET_SWITCHFLAG(thisx);
+ if (index != 0) {
+ Actor_Kill(&this->dyna.actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Init.s")
+ DynaPolyActor_LoadMesh(play, &this->dyna, &gStoneTowerVerticallyOscillatingPlatformCol);
+ this->dyna.actor.params = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Destroy.s")
+void BgF40Swlift_Destroy(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Update.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_F40_Swlift/BgF40Swlift_Draw.s")
+void BgF40Swlift_Update(Actor* thisx, PlayState* play2) {
+ PlayState* play = play2;
+ BgF40Swlift* this = THIS;
+ s32 i;
+
+ for (i = 1; i < ARRAY_COUNT(sSwitchFlags); i++) {
+ if ((sSwitchFlags[i] == 0xFF) || !Flags_GetSwitch(play, sSwitchFlags[i])) {
+ break;
+ }
+ }
+
+ i--;
+ if (i != this->dyna.actor.params) {
+ f32 heightOffset;
+
+ this->dyna.actor.params = -1;
+ heightOffset = (sHeights[i] - this->dyna.actor.world.pos.y) * 0.1f;
+ if (heightOffset > 0.0f) {
+ heightOffset = CLAMP(heightOffset, 0.5f, 15.0f);
+ } else {
+ heightOffset = CLAMP(heightOffset, -15.0f, -0.5f);
+ }
+
+ if (Math_StepToF(&this->dyna.actor.speed, heightOffset, 1.0f) && (fabsf(heightOffset) <= 0.5f)) {
+ if (Math_StepToF(&this->dyna.actor.world.pos.y, sHeights[i], fabsf(this->dyna.actor.speed))) {
+ this->dyna.actor.params = i;
+ this->timer = 48;
+ this->dyna.actor.speed = 0.0f;
+ }
+ } else {
+ this->dyna.actor.world.pos.y += this->dyna.actor.speed;
+ }
+ } else {
+ if (this->timer == 0) {
+ this->timer = 48;
+ }
+ this->timer--;
+ this->dyna.actor.world.pos.y =
+ sHeights[this->dyna.actor.params] + (Math_SinF(this->timer * (M_PI / 24.0f)) * 5.0f);
+ }
+}
+
+void BgF40Swlift_Draw(Actor* thisx, PlayState* play) {
+ BgF40Swlift* this = THIS;
+
+ Gfx_DrawDListOpa(play, gStoneTowerVerticallyOscillatingPlatformDL);
+}
diff --git a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
index a687fc642..e377b73e0 100644
--- a/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
+++ b/src/overlays/actors/ovl_Bg_F40_Swlift/z_bg_f40_swlift.h
@@ -1,13 +1,16 @@
#ifndef Z_BG_F40_SWLIFT_H
#define Z_BG_F40_SWLIFT_H
+#define BG_F40_SWLIFT_GET_SWITCHFLAG(thisx) ((thisx)->params & 0xFF)
+#define BG_F40_SWLIFT_GET_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+
#include "global.h"
struct BgF40Swlift;
typedef struct BgF40Swlift {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x1C];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ s32 timer;
} BgF40Swlift; // size = 0x160
#endif // Z_BG_F40_SWLIFT_H
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_Fire_Wall/z_bg_fire_wall.h b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
index af5a29923..bf5300758 100644
--- a/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
+++ b/src/overlays/actors/ovl_Bg_Fire_Wall/z_bg_fire_wall.h
@@ -8,9 +8,9 @@ struct BgFireWall;
typedef void (*BgFireWallActionFunc)(struct BgFireWall*, PlayState*);
typedef enum {
- /* 0 */ BGFIREWALL_PARAMS_0,
- /* 1 */ BGFIREWALL_PARAMS_1,
-} BgFireWallParams;
+ /* 0 */ BGFIREWALL_PARAM_0,
+ /* 1 */ BGFIREWALL_PARAM_1
+} BgFireWallParam;
typedef struct BgFireWall {
/* 0x000 */ Actor actor;
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_Haka_Tomb/z_bg_haka_tomb.c b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
index 693fff484..c226c89f3 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Tomb/z_bg_haka_tomb.c
@@ -85,7 +85,7 @@ void func_80BD66AC(BgHakaTomb* this, PlayState* play) {
if (Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
}
- if (!func_80BD6638(&csId, this->csIdList, ARRAY_COUNT(this->csIdList)) && (csId < 0) &&
+ if (!func_80BD6638(&csId, this->csIdList, ARRAY_COUNT(this->csIdList)) && (csId <= CS_ID_NONE) &&
Flags_GetClear(play, this->dyna.actor.room)) {
this->dyna.actor.flags |= ACTOR_FLAG_1;
if (this->dyna.actor.isTargeted) {
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..66666b82b 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
@@ -52,9 +52,9 @@ ActorInit Bg_Hakugin_Post_InitVars = {
};
typedef struct {
- f32 unk_00;
- u8 unk_04;
-} BgHakuginPostUnkStruct3;
+ /* 0x0 */ f32 unk_00;
+ /* 0x4 */ u8 unk_04;
+} BgHakuginPostUnkStruct3; // size = 0x8
static BgHakuginPostUnkStruct3 D_80A9D880[] = {
{ 1200.0f, false }, { 600.0f, false }, { 900.0f, false }, { 870.0f, false },
@@ -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,14 +1012,14 @@ 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);
for (i = 0; i < D_80A9E028.count; i++) {
unkStruct1 = &D_80A9E028.unk_0000[i];
- if (unkStruct1->unk_34 != 5 && unkStruct1->unk_34 != 4) {
+ if ((unkStruct1->unk_34 != 5) && (unkStruct1->unk_34 != 4)) {
sp68.x = unkStruct1->unk_14.x + this->dyna.actor.home.pos.x;
sp68.y = unkStruct1->unk_14.y + this->unk_16C;
sp68.z = unkStruct1->unk_14.z + this->dyna.actor.home.pos.z;
diff --git a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
index c7fa3d69e..2d8fc2683 100644
--- a/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
+++ b/src/overlays/actors/ovl_Bg_Hakugin_Switch/z_bg_hakugin_switch.c
@@ -4,6 +4,7 @@
* Description: Goron Link Switch
*/
+#include "prevent_bss_reordering.h"
#include "z_bg_hakugin_switch.h"
#include "z64rumble.h"
#include "objects/object_goronswitch/object_goronswitch.h"
@@ -77,7 +78,7 @@ typedef struct {
/* 0x0C */ f32 unk_C;
/* 0x10 */ Gfx* unk_10;
/* 0x14 */ u8 unk_14;
-} BgHakuginSwitchStruct;
+} BgHakuginSwitchStruct; // size = 0x18
BgHakuginSwitchStruct D_80B1688C[] = {
{ -156.0f, -178.0f, 6.0f, 10.0f, object_goronswitch_DL_000268, 0xB4 },
diff --git a/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c b/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
index 27e5d2fee..50e99c1aa 100644
--- a/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
+++ b/src/overlays/actors/ovl_Bg_Icefloe/z_bg_icefloe.c
@@ -96,8 +96,8 @@ void BgIcefloe_Grow(BgIcefloe* this, PlayState* play) {
Vec3f velocity;
Vec3f position;
- velocity.x = randPlusMinusPoint5Scaled(6.0f);
- velocity.z = randPlusMinusPoint5Scaled(6.0f);
+ velocity.x = Rand_CenteredFloat(6.0f);
+ velocity.z = Rand_CenteredFloat(6.0f);
velocity.y = Rand_ZeroFloat(4.0f) + 4.0f;
this->dyna.actor.scale.x += (0.65f * 0.01f);
this->dyna.actor.scale.z += (0.65f * 0.01f);
@@ -121,13 +121,13 @@ void func_80AC4C34(BgIcefloe* this, PlayState* play) {
WaterBox* water;
this->timer--;
- if (this->timer == 0 ||
+ if ((this->timer == 0) ||
!WaterBox_GetSurface1_2(play, &play->colCtx, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.z,
&this->dyna.actor.home.pos.y, &water)) {
func_80AC4CF0(this);
} else {
this->dyna.actor.world.pos.y =
- (sin_rad(this->timer * (M_PI / 30.0f)) * 3.0f) + (this->dyna.actor.home.pos.y + 10.0f);
+ (Math_SinF(this->timer * (M_PI / 30.0f)) * 3.0f) + (this->dyna.actor.home.pos.y + 10.0f);
}
}
@@ -144,8 +144,8 @@ void func_80AC4D2C(BgIcefloe* this, PlayState* play) {
Vec3f position;
velocity.y = (this->timer - 38) * (1 / 12.0f);
- velocity.x = randPlusMinusPoint5Scaled(1.5f) * velocity.y;
- velocity.z = randPlusMinusPoint5Scaled(1.5f) * velocity.y;
+ velocity.x = Rand_CenteredFloat(1.5f) * velocity.y;
+ velocity.z = Rand_CenteredFloat(1.5f) * velocity.y;
velocity.y += 0.8f;
position.x = this->dyna.actor.world.pos.x + (2.0f * velocity.x);
position.z = this->dyna.actor.world.pos.z + (2.0f * velocity.z);
diff --git a/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c b/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
index 740d807d8..a8eea2641 100644
--- a/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
+++ b/src/overlays/actors/ovl_Bg_Icicle/z_bg_icicle.c
@@ -109,12 +109,12 @@ void BgIcicle_Break(BgIcicle* this, PlayState* play, f32 arg2) {
for (i = 0; i < 2; i++) {
for (j = 0; j < 10; j++) {
- pos.x = this->dyna.actor.world.pos.x + randPlusMinusPoint5Scaled(8.0f);
+ pos.x = this->dyna.actor.world.pos.x + Rand_CenteredFloat(8.0f);
pos.y = this->dyna.actor.world.pos.y + (Rand_ZeroOne() * arg2) + (i * arg2);
- pos.z = this->dyna.actor.world.pos.z + randPlusMinusPoint5Scaled(8.0f);
+ pos.z = this->dyna.actor.world.pos.z + Rand_CenteredFloat(8.0f);
- velocity.x = randPlusMinusPoint5Scaled(7.0f);
- velocity.z = randPlusMinusPoint5Scaled(7.0f);
+ velocity.x = Rand_CenteredFloat(7.0f);
+ velocity.z = Rand_CenteredFloat(7.0f);
velocity.y = (Rand_ZeroOne() * 4.0f) + 8.0f;
EffectSsEnIce_Spawn(play, &pos, (Rand_ZeroOne() * 0.2f) + 0.1f, &velocity, &accel, &primColor, &envColor,
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..4646b8d45 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
@@ -151,7 +151,7 @@ void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
this->collider.base.acFlags &= ~AC_HIT;
}
- if (wasHit && sFirstHitBgIkanaDharma == NULL) {
+ if (wasHit && (sFirstHitBgIkanaDharma == NULL)) {
sFirstHitBgIkanaDharma = this2;
Flags_SetSwitch(play, BGIKANADHARMA_GET_SWITCHFLAG(&this->dyna.actor));
tempAngle1 = BINANG_ADD(this->dyna.actor.yawTowardsPlayer, 0x8000);
@@ -160,8 +160,8 @@ void BgIkanaDharma_WaitForHit(BgIkanaDharma* this, PlayState* play) {
this->dyna.actor.speed = 20.0f;
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_DARUMA_VANISH);
BgIkanaDharma_SetupStartCutscene(this);
- } else if ((this->dyna.actor.flags & ACTOR_FLAG_40) == ACTOR_FLAG_40 && sFirstHitBgIkanaDharma == NULL &&
- this->dyna.actor.xzDistToPlayer < 420.0f) {
+ } else if (CHECK_FLAG_ALL(this->dyna.actor.flags, ACTOR_FLAG_40) && (sFirstHitBgIkanaDharma == NULL) &&
+ (this->dyna.actor.xzDistToPlayer < 420.0f)) {
tempAngle1 = BINANG_SUB(this->dyna.actor.yawTowardsPlayer, player->actor.shape.rot.y);
tempAngle1 = ABS_ALT(tempAngle1);
@@ -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..ad2d9fbdd 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
@@ -116,9 +116,9 @@ Vec3f D_80B8216C = { 225.0f, -280.0f, -210.0f };
Vec3f D_80B82178 = { -255.0f, -280.0f, 210.0f };
typedef struct {
- /* 0x00 */ s8 unk_00;
- /* 0x01 */ s8 unk_01;
- /* 0x04 */ Vec3f unk_04;
+ /* 0x0 */ s8 unk_00;
+ /* 0x1 */ s8 unk_01;
+ /* 0x4 */ Vec3f unk_04;
} BgIkanaRotaryroomStruct4; // size = 0x10
BgIkanaRotaryroomStruct4 D_80B82184[2][2] = {
@@ -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..6ce5f7d81 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);
}
}
@@ -92,7 +93,10 @@ s32 func_80C0A95C(BgIkninSusceil* this, PlayState* play) {
f32 new_var;
Player* player = GET_PLAYER(play);
Vec3f offset;
- f32 temp1, temp2, temp3, temp4;
+ f32 temp1;
+ f32 temp2;
+ f32 temp3;
+ f32 temp4;
Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos);
for (i = 0; i < 7; i++) {
@@ -154,7 +158,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 +201,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 +220,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_Doukutu/z_bg_iknv_doukutu.h b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
index beeeb0b81..643be076c 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
+++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h
@@ -9,11 +9,11 @@ typedef void (*BgIknvDoukutuActionFunc)(struct BgIknvDoukutu*, PlayState*);
#define BGIKNVDOUKUTU_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
- BGIKNVDOUKUTU_F_0,
- BGIKNVDOUKUTU_F_1,
- BGIKNVDOUKUTU_F_2,
-};
+typedef enum {
+ /* 0 */ BGIKNVDOUKUTU_F_0,
+ /* 1 */ BGIKNVDOUKUTU_F_1,
+ /* 2 */ BGIKNVDOUKUTU_F_2
+} BgIknvDoukutuParam;
typedef struct BgIknvDoukutu {
/* 0x000 */ DynaPolyActor dyna;
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_Iknv_Obj/z_bg_iknv_obj.h b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
index a5c01165d..266ec81f2 100644
--- a/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
+++ b/src/overlays/actors/ovl_Bg_Iknv_Obj/z_bg_iknv_obj.h
@@ -19,7 +19,7 @@ typedef struct BgIknvObj {
typedef enum {
/* 0 */ IKNV_OBJ_WATERWHEEL,
/* 1 */ IKNV_OBJ_RAISED_DOOR, // defunct door covering entrance to Stone Tower
- /* 2 */ IKNV_OBJ_SAKON_DOOR, // door to Sakon's Hideout
+ /* 2 */ IKNV_OBJ_SAKON_DOOR // door to Sakon's Hideout
} BgIknvObjType;
#endif // Z_BG_IKNV_OBJ_H
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 502b29086..2796aed7e 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c
@@ -190,7 +190,7 @@ void func_80953F9C(BgIngate* this, PlayState* play) {
if (this->unk160 & 2) {
- if (this->timePath->unk1 != 0xFF) {
+ if (this->timePath->additionalPathIndex != ADDITIONAL_PATH_INDEX_NONE) {
func_80953E38(play);
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_WAIT);
this->dyna.actor.textId = 0x9E4;
@@ -259,10 +259,10 @@ void func_809542A0(BgIngate* this, PlayState* play) {
}
void func_80954340(BgIngate* this, PlayState* play) {
- if (!DECR(this->unk16A)) {
+ if (DECR(this->unk16A) == 0) {
if (this->timePath != NULL) {
func_800B7298(play, &this->dyna.actor, PLAYER_CSMODE_END);
- this->timePath = &play->setupPathList[this->timePath->unk1];
+ this->timePath = &play->setupPathList[this->timePath->additionalPathIndex];
func_80953F14(this, play);
Environment_StopTime();
}
@@ -287,7 +287,7 @@ void func_809543D4(BgIngate* this, PlayState* play) {
func_8019F208();
} else {
if (this->timePath != NULL) {
- this->timePath = &play->setupPathList[this->timePath->unk1];
+ this->timePath = &play->setupPathList[this->timePath->additionalPathIndex];
}
func_80953F14(this, play);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
@@ -328,7 +328,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
this->unk160 |= 0x8;
this->unk160 |= 0x10;
Actor_SetScale(&this->dyna.actor, 1.0f);
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), 0);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), 0);
this->dyna.actor.room = -1;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_WOODFALL_TEMPLE)) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40);
@@ -350,7 +350,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
this->actionFunc = func_80953F8C;
}
}
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), phi_a2);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), phi_a2);
if (this->timePath != NULL) {
sp38 = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp2C, &sp38[0]);
@@ -361,7 +361,7 @@ void BgIngate_Init(Actor* thisx, PlayState* play2) {
this->dyna.actor.world.pos.y = -15.0f;
this->dyna.actor.world.pos.z = sp2C.z;
}
- this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_FF(&this->dyna.actor), 0);
+ this->timePath = SubS_GetAdditionalPath(play, BGINGATE_GET_PATH_INDEX(&this->dyna.actor), 0);
} else {
Actor_Kill(&this->dyna.actor);
}
@@ -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_Ingate/z_bg_ingate.h b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
index 6046fc31e..bf272f342 100644
--- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
+++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.h
@@ -7,7 +7,7 @@ struct BgIngate;
typedef void (*BgIngateActionFunc)(struct BgIngate*, PlayState*);
-#define BGINGATE_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define BGINGATE_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct BgIngate {
/* 0x000 */ DynaPolyActor dyna;
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_Keikoku_Spr/z_bg_keikoku_spr.c b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
index 8246a0298..ac9d089a4 100644
--- a/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
+++ b/src/overlays/actors/ovl_Bg_Keikoku_Spr/z_bg_keikoku_spr.c
@@ -1,3 +1,9 @@
+/*
+ * File: z_bg_keikoku_spr.c
+ * Overlay: ovl_Bg_Keikoku_Spr
+ * Description: Termina Field Fountain Water
+ */
+
#include "z_bg_keikoku_spr.h"
#include "objects/object_keikoku_obj/object_keikoku_obj.h"
@@ -10,7 +16,6 @@ void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Update(Actor* thisx, PlayState* play);
void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play);
-/*
const ActorInit Bg_Keikoku_Spr_InitVars = {
ACTOR_BG_KEIKOKU_SPR,
ACTORCAT_PROP,
@@ -20,14 +25,42 @@ const ActorInit Bg_Keikoku_Spr_InitVars = {
(ActorFunc)BgKeikokuSpr_Init,
(ActorFunc)BgKeikokuSpr_Destroy,
(ActorFunc)BgKeikokuSpr_Update,
- (ActorFunc)BgKeikokuSpr_Draw
+ (ActorFunc)BgKeikokuSpr_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Init.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32(uncullZoneForward, 3000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_CONTINUE),
+ ICHAIN_VEC3F_DIV1000(scale, 20, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Destroy.s")
+void BgKeikokuSpr_Init(Actor* thisx, PlayState* play) {
+ BgKeikokuSpr* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Update.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Keikoku_Spr/BgKeikokuSpr_Draw.s")
+void BgKeikokuSpr_Destroy(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Update(Actor* thisx, PlayState* play) {
+}
+
+void BgKeikokuSpr_Draw(Actor* thisx, PlayState* play) {
+ s32 pad;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0001F8));
+ 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_000100);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0003F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000300);
+
+ AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_keikoku_obj_Matanimheader_0005F8));
+ gSPDisplayList(POLY_XLU_DISP++, object_keikoku_obj_DL_000500);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
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_Ladder/z_bg_ladder.h b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
index e4cd15c15..f920c18eb 100644
--- a/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
+++ b/src/overlays/actors/ovl_Bg_Ladder/z_bg_ladder.h
@@ -21,7 +21,7 @@ typedef enum {
/* 0 */ LADDER_SIZE_12RUNG,
/* 1 */ LADDER_SIZE_16RUNG,
/* 2 */ LADDER_SIZE_20RUNG,
- /* 3 */ LADDER_SIZE_24RUNG,
+ /* 3 */ LADDER_SIZE_24RUNG
} BgLadderSize;
#endif // Z_BG_LADDER_H
diff --git a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
index e6d752c28..cae36be27 100644
--- a/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
+++ b/src/overlays/actors/ovl_Bg_Last_Bwall/z_bg_last_bwall.h
@@ -12,8 +12,8 @@ typedef void (*BgLastBwallActionFunc)(struct BgLastBwall*, PlayState*);
#define BGLASTBWALL_GET_TYPE(thisx) (((thisx)->params >> 0xC) & 0xF)
typedef enum {
- BGLASTBWALL_TYPE_0 = 0,
- BGLASTBWALL_TYPE_1 = 1,
+ /* 0 */ BGLASTBWALL_TYPE_0,
+ /* 1 */ BGLASTBWALL_TYPE_1
} BgLastBwallType;
typedef struct BgLastBwall {
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_Numa_Hana/z_bg_numa_hana.h b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
index 0e377f539..d9f4a1ece 100644
--- a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
+++ b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.h
@@ -9,7 +9,7 @@
typedef enum {
/* 0 */ BG_NUMA_HANA_TYPE_NORMAL,
- /* 1 */ BG_NUMA_HANA_TYPE_OPEN_FLOWER_COLLISION,
+ /* 1 */ BG_NUMA_HANA_TYPE_OPEN_FLOWER_COLLISION
} BgNumaHanaType;
struct BgNumaHana;
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..e23504231 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
@@ -23,8 +23,8 @@ void func_80ACAE5C(BgOpenShutter* this, PlayState* play);
void func_80ACAEF0(BgOpenShutter* this, PlayState* play);
typedef enum {
- /* 0x1 */ BGOPENSHUTTER_DOOR_OPEN = 1,
- /* 0x2 */ BGOPENSHUTTER_DOOR_CLOSED,
+ /* 1 */ BGOPENSHUTTER_DOOR_OPEN = 1,
+ /* 2 */ BGOPENSHUTTER_DOOR_CLOSED
} BGOpenShutterDoorState;
ActorInit Bg_Open_Shutter_InitVars = {
@@ -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..b5eb3130a 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
@@ -64,9 +64,10 @@ void BgOpenSpot_Draw(Actor* thisx, PlayState* play) {
BgOpenSpot* this = (BgOpenSpot*)thisx;
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..c11df8af1 100644
--- a/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
+++ b/src/overlays/actors/ovl_Bg_Spdweb/z_bg_spdweb.c
@@ -240,7 +240,7 @@ void func_809CE234(BgSpdweb* this, PlayState* play) {
spA8.y = this->dyna.actor.world.pos.y;
for (i = 0; i < 6; i++) {
- temp_s0 = (s32)randPlusMinusPoint5Scaled(10240.0f) + phi_s2;
+ temp_s0 = (s32)Rand_CenteredFloat(0x2800) + phi_s2;
temp_f24 = Math_SinS(temp_s0);
temp_f22 = Math_CosS(temp_s0);
@@ -323,7 +323,8 @@ void func_809CE4C8(BgSpdweb* this, PlayState* play) {
this->unk_162--;
}
- this->dyna.actor.world.pos.y = (sin_rad(this->unk_162 * (M_PI / 6)) * this->unk_164) + this->dyna.actor.home.pos.y;
+ this->dyna.actor.world.pos.y =
+ (Math_SinF(this->unk_162 * (M_PI / 6)) * this->unk_164) + this->dyna.actor.home.pos.y;
Math_ApproachZeroF(&this->unk_164, 1.0f, 0.8f);
if (this->unk_162 == 4) {
@@ -388,7 +389,7 @@ void func_809CE830(BgSpdweb* this, PlayState* play) {
spC4.z = this->dyna.actor.world.pos.z + 90.0f * sinQ * cosF1;
for (i = 0; i < 6; i++) {
- temp_s0 = (s32)randPlusMinusPoint5Scaled(0x2800) + temp_s3;
+ temp_s0 = (s32)Rand_CenteredFloat(0x2800) + temp_s3;
sinF2 = Math_SinS(temp_s0);
cosF2 = Math_CosS(temp_s0);
@@ -496,7 +497,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..5302c6a90 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_GATEKEEPER_OPENED_GORON_SHRINE);
+ this->cutsceneRequested = false;
+ } else {
+ CutsceneManager_Queue(csId);
+ }
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE) && (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_GATEKEEPER_OPENED_GORON_SHRINE)) {
+ 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_GATEKEEPER_OPENED_GORON_SHRINE) &&
+ (DECR(this->timer) == 0)) {
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
+ }
+}
+
+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_GATEKEEPER_OPENED_GORON_SHRINE);
+ 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_Bg_Umajump/z_bg_umajump.c b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
index d4d2c7274..132f8f13f 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.c
@@ -89,13 +89,12 @@ void BgUmajump_Init(Actor* thisx, PlayState* play) {
DynaPolyActor_Init(&this->dyna, 0);
- this->objectIndex = BG_UMAJUMP_GET_OBJECT_INDEX(thisx);
- thisx->params = BG_UMAJUMP_GET_FF(thisx);
+ this->pathIndex = BG_UMAJUMP_GET_PATH_INDEX(thisx);
+ thisx->params = BG_UMAJUMP_GET_TYPE(thisx);
- if ((thisx->params == BG_UMAJUMP_TYPE_2)) {
- if ((((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20)) &&
- !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) &&
- (thisx->csId != CS_ID_NONE)) {
+ if (thisx->params == BG_UMAJUMP_TYPE_2) {
+ if ((play->sceneId == SCENE_F01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_89_20) &&
+ !CHECK_QUEST_ITEM(QUEST_SONG_EPONA) && (thisx->csId != CS_ID_NONE)) {
this->actionFunc = BgUmajump_CheckDistance;
thisx->update = func_8091A5A0;
thisx->flags |= ACTOR_FLAG_10;
@@ -134,11 +133,11 @@ void BgUmajump_Update(Actor* thisx, PlayState* play) {
Actor_SetObjectDependency(play, &this->dyna.actor);
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if (this->dyna.actor.params == BG_UMAJUMP_TYPE_6) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_4) || (this->dyna.actor.params == BG_UMAJUMP_TYPE_3)) {
@@ -155,11 +154,11 @@ void BgUmajump_Update(Actor* thisx, PlayState* play) {
this->dyna.actor.update = func_8091A5A0;
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_5) || (this->dyna.actor.params == BG_UMAJUMP_TYPE_6)) {
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
}
} else if ((this->dyna.actor.params == BG_UMAJUMP_TYPE_6) && (this->dyna.bgId == BGACTOR_NEG_ONE) &&
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) ||
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) ||
((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == true) &&
((gSaveContext.save.time >= CLOCK_TIME(5, 30)) &&
(gSaveContext.save.time <= CLOCK_TIME(6, 0)))))) {
@@ -191,18 +190,18 @@ void func_8091A5A0(Actor* thisx, PlayState* play) {
}
if (this->dyna.actor.params == BG_UMAJUMP_TYPE_5) {
- if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((this->dyna.bgId == BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
- } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
}
} else if (this->dyna.actor.params == BG_UMAJUMP_TYPE_6) {
if ((this->dyna.bgId == BGACTOR_NEG_ONE) &&
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) ||
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) ||
((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == true) &&
(gSaveContext.save.time >= CLOCK_TIME(5, 30)) && (gSaveContext.save.time <= CLOCK_TIME(6, 0))))) {
DynaPolyActor_LoadMesh(play, &this->dyna, &object_umajump_Colheader_001558);
- } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) &&
+ } else if ((this->dyna.bgId != BGACTOR_NEG_ONE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) &&
((gSaveContext.save.day != 2) || (gSaveContext.save.isNight != true) ||
(gSaveContext.save.time < CLOCK_TIME(5, 30)) || (gSaveContext.save.time > CLOCK_TIME(6, 0)))) {
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
diff --git a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
index 62aaf6cb7..ae35ac98c 100644
--- a/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
+++ b/src/overlays/actors/ovl_Bg_Umajump/z_bg_umajump.h
@@ -3,16 +3,16 @@
#include "global.h"
-#define BG_UMAJUMP_GET_OBJECT_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
-#define BG_UMAJUMP_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define BG_UMAJUMP_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+#define BG_UMAJUMP_GET_TYPE(thisx) ((thisx)->params & 0xFF)
typedef enum {
- BG_UMAJUMP_TYPE_1 = 1,
- BG_UMAJUMP_TYPE_2,
- BG_UMAJUMP_TYPE_3,
- BG_UMAJUMP_TYPE_4,
- BG_UMAJUMP_TYPE_5,
- BG_UMAJUMP_TYPE_6,
+ /* 1 */ BG_UMAJUMP_TYPE_1 = 1,
+ /* 2 */ BG_UMAJUMP_TYPE_2,
+ /* 3 */ BG_UMAJUMP_TYPE_3,
+ /* 4 */ BG_UMAJUMP_TYPE_4,
+ /* 5 */ BG_UMAJUMP_TYPE_5,
+ /* 6 */ BG_UMAJUMP_TYPE_6
} BgUmaJumpType;
struct BgUmajump;
@@ -24,7 +24,8 @@ typedef struct BgUmajump {
/* 0x15C */ BgUmajumpActionFunc actionFunc;
/* 0x160 */ union {
s32 objectIndex;
- s32 rotationTimer; // y rotation
+ s32 rotationTimer; // y rotation
+ s32 pathIndex;
};
/* 0x164 */ s32 hasSoundPlayed;
/* 0x168 */ Actor* horse;
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..5b19594fb 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -485,9 +485,9 @@ void Boss02_SpawnEffectSand(TwinmoldEffect* effects, Vec3f* pos, f32 scale) {
if (effects->type == TWINMOLD_EFFECT_NONE) {
effects->type = TWINMOLD_EFFECT_SAND;
effects->pos = *pos;
- effects->velocity.x = randPlusMinusPoint5Scaled(30.0f);
+ effects->velocity.x = Rand_CenteredFloat(30.0f);
effects->velocity.y = Rand_ZeroFloat(7.0f) + 7.0f;
- effects->velocity.z = randPlusMinusPoint5Scaled(30.0f);
+ effects->velocity.z = Rand_CenteredFloat(30.0f);
effects->accel.y = -0.3f;
effects->scale = scale;
effects->alpha = 255;
@@ -507,9 +507,9 @@ void Boss02_SpawnEffectFragment(TwinmoldEffect* effects, Vec3f* pos) {
effects->type = TWINMOLD_EFFECT_FRAGMENT;
effects->pos = *pos;
effects->timer = Rand_ZeroFloat(20.0f);
- effects->velocity.x = randPlusMinusPoint5Scaled(50.0f);
- effects->velocity.y = randPlusMinusPoint5Scaled(50.0f);
- effects->velocity.z = randPlusMinusPoint5Scaled(50.0f);
+ effects->velocity.x = Rand_CenteredFloat(50.0f);
+ effects->velocity.y = Rand_CenteredFloat(50.0f);
+ effects->velocity.z = Rand_CenteredFloat(50.0f);
effects->accel.z = 0.0f;
effects->accel.x = 0.0f;
effects->accel.y = -1.5f;
@@ -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;
@@ -774,8 +774,8 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->actor.world.pos.z = player->actor.world.pos.z;
this->actor.world.pos.y = player->actor.world.pos.y - (600.0f * D_809DF5B0);
} else {
- this->actor.world.pos.x = randPlusMinusPoint5Scaled(5000.0f * D_809DF5B0);
- this->actor.world.pos.z = randPlusMinusPoint5Scaled(5000.0f * D_809DF5B0);
+ this->actor.world.pos.x = Rand_CenteredFloat(5000.0f * D_809DF5B0);
+ this->actor.world.pos.z = Rand_CenteredFloat(5000.0f * D_809DF5B0);
this->actor.world.pos.y = -500.0f * D_809DF5B0;
if (sIsInGiantMode) {
this->actor.world.pos.y += 3150.0f;
@@ -802,8 +802,8 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_0146[0] = 150;
} else {
this->unk_0144 = 2;
- this->unk_01B0.x = randPlusMinusPoint5Scaled(3000.0f * D_809DF5B0);
- this->unk_01B0.z = randPlusMinusPoint5Scaled(3000.0f * D_809DF5B0);
+ this->unk_01B0.x = Rand_CenteredFloat(3000.0f * D_809DF5B0);
+ this->unk_01B0.z = Rand_CenteredFloat(3000.0f * D_809DF5B0);
if ((fabsf(this->unk_01B0.x) < (500.0f * D_809DF5B0)) &&
(fabsf(this->unk_01B0.z) < (500.0f * D_809DF5B0))) {
this->unk_01B0.x = 500.0f;
@@ -847,12 +847,12 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->unk_01B0.z = player->actor.world.pos.z;
if (this->unk_0146[0] == 0) {
this->unk_0144 = 3;
- this->unk_01B0.x = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + this->actor.world.pos.x;
+ this->unk_01B0.x = Rand_CenteredFloat(500.0f * D_809DF5B0) + this->actor.world.pos.x;
this->unk_01B0.y = -3000.0f * D_809DF5B0;
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
- this->unk_01B0.z = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + this->actor.world.pos.z;
+ this->unk_01B0.z = Rand_CenteredFloat(500.0f * D_809DF5B0) + this->actor.world.pos.z;
this->unk_0146[0] = 150;
this->unk_0164 = 0.0f;
}
@@ -917,7 +917,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
Matrix_MultVecZ(1500.0f * D_809DF5B0, &spA4);
this->unk_0146[0] = 50;
this->unk_01B0.x = player->actor.world.pos.x + spA4.x;
- this->unk_01B0.y = randPlusMinusPoint5Scaled(500.0f * D_809DF5B0) + (600.0f * D_809DF5B0);
+ this->unk_01B0.y = Rand_CenteredFloat(500.0f * D_809DF5B0) + (600.0f * D_809DF5B0);
if (sIsInGiantMode) {
this->unk_01B0.y += 3150.0f;
}
@@ -963,7 +963,7 @@ void func_809DAB78(Boss02* this, PlayState* play) {
this->actor.gravity = -1.0f * D_809DF5B0;
this->actor.velocity.y = 0.0f;
this->actor.terminalVelocity = -1000.0f * D_809DF5B0;
- this->unk_0164 = randPlusMinusPoint5Scaled(0.05f);
+ this->unk_0164 = Rand_CenteredFloat(0.05f);
spCC = player->actor.world.pos.x - this->actor.world.pos.x;
spC4 = player->actor.world.pos.z - this->actor.world.pos.z;
@@ -1205,16 +1205,16 @@ void Boss02_Twinmold_Update(Actor* thisx, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_INBOSS_SAND_OLD - SFX_FLAG);
if (this->unk_0144 > 20) {
- sp3C.x = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.x;
- sp3C.y = randPlusMinusPoint5Scaled(50.0f * D_809DF5B0) + this->unk_0170.y;
- sp3C.z = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.z;
+ sp3C.x = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * D_809DF5B0) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.z;
Boss02_SpawnEffectSand(play->specialEffects, &sp3C, Rand_ZeroFloat(3.0f) + 6.0f);
}
if ((this->unk_014C % 2) == 0) {
- sp3C.x = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.x;
- sp3C.y = randPlusMinusPoint5Scaled(50.0f * D_809DF5B0) + this->unk_0170.y;
- sp3C.z = randPlusMinusPoint5Scaled(100.0f * D_809DF5B0) + this->unk_0170.z;
+ sp3C.x = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.x;
+ sp3C.y = Rand_CenteredFloat(50.0f * D_809DF5B0) + this->unk_0170.y;
+ sp3C.z = Rand_CenteredFloat(100.0f * D_809DF5B0) + this->unk_0170.z;
Boss02_SpawnEffectSand(play->specialEffects, &sp3C, Rand_ZeroFloat(3.0f) + 6.0f);
}
}
@@ -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_02/z_boss_02.h b/src/overlays/actors/ovl_Boss_02/z_boss_02.h
index e7efc1199..4fbd8b471 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.h
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.h
@@ -27,15 +27,15 @@ typedef enum {
/* 1 */ TWINMOLD_EFFECT_SAND, // The sand kicked up when Twinmold touches the ground
/* 2 */ TWINMOLD_EFFECT_BLACK_DUST, // Unused
/* 3 */ TWINMOLD_EFFECT_FRAGMENT, // The fragments that fly off when the parts of Twinmold explode
- /* 4 */ TWINMOLD_EFFECT_FLASH, // The flashes of light that appear when the parts of Twinmold explode
+ /* 4 */ TWINMOLD_EFFECT_FLASH // The flashes of light that appear when the parts of Twinmold explode
} TwinmoldEffectType;
typedef enum {
/* 0 */ TWINMOLD_RED,
/* 35 */ TWINMOLD_BLUE = 35,
/* 100 */ TWINMOLD_TAIL = 100,
- /* 200 */ TWINMOLD_STATIC = 200,
-} TwinmoldParams;
+ /* 200 */ TWINMOLD_STATIC = 200
+} TwinmoldParam;
typedef struct Boss02 {
/* 0x0000 */ Actor actor;
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..d44c961e9 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"
@@ -161,8 +162,8 @@ void Boss03_SpawnEffectDroplet(PlayState* play, Vec3f* pos) {
eff->unk_34.y = 0.0f;
eff->unk_34.z = Rand_ZeroFloat(2 * M_PI);
eff->unk_02 = Rand_ZeroFloat(100.0f);
- eff->velocity.x = randPlusMinusPoint5Scaled(25.0f);
- eff->velocity.z = randPlusMinusPoint5Scaled(25.0f);
+ eff->velocity.x = Rand_CenteredFloat(25.0f);
+ eff->velocity.z = Rand_CenteredFloat(25.0f);
return;
}
@@ -424,17 +425,17 @@ void Boss03_SpawnDust(Boss03* this, PlayState* play) {
Vec3f accel;
for (i = 0; i < 5; i++) {
- velocity.x = randPlusMinusPoint5Scaled(10.0f);
+ velocity.x = Rand_CenteredFloat(10.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 2.0f;
- velocity.z = randPlusMinusPoint5Scaled(10.0f);
+ velocity.z = Rand_CenteredFloat(10.0f);
accel.y = -0.075f;
accel.z = 0.0f;
accel.x = 0.0f;
pos.y = Rand_ZeroFloat(20.0f) + 5.0f;
- pos.z = randPlusMinusPoint5Scaled(150.0f) + this->insideJawPos.z;
- pos.x = randPlusMinusPoint5Scaled(150.0f) + this->insideJawPos.x;
+ pos.z = Rand_CenteredFloat(150.0f) + this->insideJawPos.z;
+ pos.x = Rand_CenteredFloat(150.0f) + this->insideJawPos.x;
func_800B0EB0(play, &pos, &velocity, &accel, &sGyorgDustPrimColor, &sGyorgDustEnvColor,
Rand_ZeroFloat(200.0f) + 400.0f, 10, Rand_ZeroFloat(10.0f) + 25.0f);
@@ -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;
}
@@ -595,9 +597,9 @@ void func_809E34B8(Boss03* this, PlayState* play) {
if (this->workTimer[WORK_TIMER_UNK2_A] == 0) {
if ((sqrtf(SQ(xDiff) + SQ(zDiff)) < 100.0f) || (this->workTimer[WORK_TIMER_UNK0_A] == 0)) {
for (i = 0; i < 200; i++) {
- this->unk_268.x = randPlusMinusPoint5Scaled(2500.0f);
+ this->unk_268.x = Rand_CenteredFloat(2500.0f);
this->unk_268.y = Rand_ZeroFloat(100.0f) + 150.0f;
- this->unk_268.z = randPlusMinusPoint5Scaled(2500.0f);
+ this->unk_268.z = Rand_CenteredFloat(2500.0f);
xDiff = this->unk_268.x - this->actor.world.pos.x;
zDiff = this->unk_268.z - this->actor.world.pos.z;
@@ -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);
@@ -1098,9 +1100,9 @@ void Boss03_JumpOverPlatform(Boss03* this, PlayState* play) {
Vec3f sp30;
for (i = 0; i < 3; i++) {
- sp30.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(150.0f);
+ sp30.x = this->actor.world.pos.x + Rand_CenteredFloat(150.0f);
sp30.y = this->actor.world.pos.y;
- sp30.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(150.0f);
+ sp30.z = this->actor.world.pos.z + Rand_CenteredFloat(150.0f);
Boss03_SpawnEffectDroplet(play, &sp30);
}
}
@@ -1335,9 +1337,9 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
if (1) {}
for (i = 0; i < 3; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(150.0f) + this->actor.world.pos.x;
+ effectPos.x = Rand_CenteredFloat(150.0f) + this->actor.world.pos.x;
effectPos.y = this->actor.world.pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(150.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(150.0f) + this->actor.world.pos.z;
Boss03_SpawnEffectDroplet(play, &effectPos);
}
@@ -1397,9 +1399,9 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) {
this->subCamEye = this->actor.world.pos;
for (i = 0; i < bubblesToSpawnNum; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.x;
- effectPos.y = (randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.y) - 150.0f;
- effectPos.z = randPlusMinusPoint5Scaled(100.0f) + this->subCamAt.z;
+ effectPos.x = Rand_CenteredFloat(100.0f) + this->subCamAt.x;
+ effectPos.y = (Rand_CenteredFloat(100.0f) + this->subCamAt.y) - 150.0f;
+ effectPos.z = Rand_CenteredFloat(100.0f) + this->subCamAt.z;
Boss03_SpawnEffectBubble(play, &effectPos);
}
@@ -1571,17 +1573,15 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
this->actor.speed = ((Rand_ZeroFloat(5.0f) + 2.5f) * sp64) + 2.5f;
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetX =
- ((s16)randPlusMinusPoint5Scaled(500.0f) + this->shapeRotTargetX) + 0x8000;
+ this->shapeRotTargetX = ((s16)(s32)Rand_CenteredFloat(0x1F4) + this->shapeRotTargetX) + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetZ =
- ((s16)randPlusMinusPoint5Scaled(500.0f) + this->shapeRotTargetZ) + 0x8000;
+ this->shapeRotTargetZ = ((s16)(s32)Rand_CenteredFloat(0x1F4) + this->shapeRotTargetZ) + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
- this->shapeRotTargetY = Rand_ZeroFloat(65536.0f);
+ this->shapeRotTargetY = Rand_ZeroFloat(0x10000);
}
this->actor.world.rot.y = Math_Atan2S_XY(-this->actor.world.pos.z, -this->actor.world.pos.x);
@@ -1598,9 +1598,9 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) {
sp4C = 150.0f * sp64;
for (i = 0; i < 1; i++) {
- sp78.x = randPlusMinusPoint5Scaled(sp4C) + this->actor.world.pos.x;
+ sp78.x = Rand_CenteredFloat(sp4C) + this->actor.world.pos.x;
sp78.y = this->actor.world.pos.y;
- sp78.z = randPlusMinusPoint5Scaled(sp4C) + this->actor.world.pos.z;
+ sp78.z = Rand_CenteredFloat(sp4C) + this->actor.world.pos.z;
Boss03_SpawnEffectDroplet(play, &sp78);
}
@@ -1610,7 +1610,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 +1773,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 +1842,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;
}
}
}
@@ -2071,9 +2071,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
if ((this->unk_240 % 2) == 0) {
for (i = 0; i < this->bubbleEffectSpawnCount; i++) {
- bubblePos.x = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.x;
- bubblePos.y = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.y;
- bubblePos.z = randPlusMinusPoint5Scaled(100.0f) + this->actor.world.pos.z;
+ bubblePos.x = Rand_CenteredFloat(100.0f) + this->actor.world.pos.x;
+ bubblePos.y = Rand_CenteredFloat(100.0f) + this->actor.world.pos.y;
+ bubblePos.z = Rand_CenteredFloat(100.0f) + this->actor.world.pos.z;
Boss03_SpawnEffectBubble(play, &bubblePos);
}
@@ -2104,9 +2104,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
if (this->wetSpotEffectSpawnCount != 0) {
this->wetSpotEffectSpawnCount--;
- wetSpotPos.x = randPlusMinusPoint5Scaled(50.0f) + player->actor.world.pos.x;
+ wetSpotPos.x = Rand_CenteredFloat(50.0f) + player->actor.world.pos.x;
wetSpotPos.y = PLATFORM_HEIGHT;
- wetSpotPos.z = randPlusMinusPoint5Scaled(50.0f) + player->actor.world.pos.z;
+ wetSpotPos.z = Rand_CenteredFloat(50.0f) + player->actor.world.pos.z;
Boss03_SpawnEffectWetSpot(play, &wetSpotPos);
}
}
@@ -2129,9 +2129,9 @@ void Boss03_Update(Actor* thisx, PlayState* play2) {
for (j = 0, i = 0; i < 20; j++) {
Matrix_RotateYF(yRot, MTXMODE_NEW);
Matrix_MultVecZ(Rand_ZeroFloat(60.000004f) + 312.0f, &dropletPos);
- dropletPos.x += this->unk_284 + randPlusMinusPoint5Scaled(40.0f);
+ dropletPos.x += this->unk_284 + Rand_CenteredFloat(40.0f);
dropletPos.y = PLATFORM_HEIGHT;
- dropletPos.z += this->unk_28C + randPlusMinusPoint5Scaled(40.0f);
+ dropletPos.z += this->unk_28C + Rand_CenteredFloat(40.0f);
if (sqrtf(SQ(dropletPos.x) + SQ(dropletPos.z)) < 355.0f) {
Boss03_SpawnEffectDroplet(play, &dropletPos);
@@ -2263,7 +2263,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 +2394,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 +2426,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 +2460,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 +2597,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_03/z_boss_03.h b/src/overlays/actors/ovl_Boss_03/z_boss_03.h
index a00dbacff..236606369 100644
--- a/src/overlays/actors/ovl_Boss_03/z_boss_03.h
+++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.h
@@ -31,7 +31,7 @@ typedef enum {
/* 1 */ GYORG_EFFECT_BUBBLE,
/* 2 */ GYORG_EFFECT_DROPLET,
/* 3 */ GYORG_EFFECT_SPLASH,
- /* 4 */ GYORG_EFFECT_WET_SPOT,
+ /* 4 */ GYORG_EFFECT_WET_SPOT
} GyorgEffectType;
typedef struct Boss03 {
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..4e22822a4 100644
--- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c
+++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c
@@ -439,8 +439,8 @@ void func_809ECD18(Boss04* this, PlayState* play) {
if (Rand_ZeroOne() < 0.1f) {
Math_Vec3f_Copy(&this->unk_6C8, &player->actor.world.pos);
} else {
- this->unk_6C8.x = randPlusMinusPoint5Scaled(600.0f) + this->unk_6E8;
- this->unk_6C8.z = randPlusMinusPoint5Scaled(600.0f) + this->unk_6F0;
+ this->unk_6C8.x = Rand_CenteredFloat(600.0f) + this->unk_6E8;
+ this->unk_6C8.z = Rand_CenteredFloat(600.0f) + this->unk_6F0;
}
}
@@ -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..aa2929f28 100644
--- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c
+++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c
@@ -4,7 +4,6 @@
* Description: Igos du Ikana window - curtains and ray effects
*/
-#include "prevent_bss_reordering.h"
#include "z_boss_06.h"
#include "z64shrink_window.h"
#include "overlays/actors/ovl_En_Knight/z_en_knight.h"
@@ -516,8 +515,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_Kankyo/z_demo_kankyo.h b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
index 971adb3bd..cbee0a148 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.h
@@ -38,14 +38,14 @@ typedef struct DemoKankyo {
typedef enum {
/* 0 */ DEMO_KANKYO_TYPE_LOSTWOODS,
/* 1 */ DEMO_KANKYO_TYPE_GIANTS,
- /* 2 */ DEMO_KANKYO_TYPE_MOON,
+ /* 2 */ DEMO_KANKYO_TYPE_MOON
} DemoKankyoType;
typedef enum {
/* 0 */ DEMO_KANKYO_STATE_INIT,
/* 1 */ DEMO_KANKYO_STATE_SINGLE,
/* 2 */ DEMO_KANKYO_STATE_SKYFISH,
- /* 3 */ DEMO_KANKYO_STATE_DISABLED,
+ /* 3 */ DEMO_KANKYO_STATE_DISABLED
} DemoKankyoStateType;
#endif // Z_DEMO_KANKYO_H
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
index 76a4230f5..ec33a8a94 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.c
@@ -15,8 +15,12 @@ void DemoMoonend_Destroy(Actor* thisx, PlayState* play);
void DemoMoonend_Update(Actor* thisx, PlayState* play);
void DemoMoonend_Draw(Actor* thisx, PlayState* play);
-#if 0
-ActorInit Demo_Moonend_InitVars = {
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play);
+void func_80C17B60(DemoMoonend* this, PlayState* play);
+void func_80C17C48(DemoMoonend* this, PlayState* play);
+void func_80C17FCC(Actor* thisx, PlayState* play);
+
+const ActorInit Demo_Moonend_InitVars = {
ACTOR_DEMO_MOONEND,
ACTORCAT_ITEMACTION,
FLAGS,
@@ -28,28 +32,185 @@ ActorInit Demo_Moonend_InitVars = {
(ActorFunc)DemoMoonend_Draw,
};
-#endif
+void DemoMoonend_Init(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-extern UNK_TYPE D_06001214;
-extern UNK_TYPE D_0600B540;
-extern UNK_TYPE D_060129F0;
+ Actor_SetScale(&this->actor, 0.1f);
+ this->actionFunc = DemoMoonend_DoNothing;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Init.s")
+ if (DEMOMOONEND_GET_PARAM_F(thisx) == 1) {
+ Actor_SetScale(&this->actor, 0.05f);
+ Actor_SetScale(&this->actor, 6.0f);
+ this->actor.draw = NULL;
+ this->cueType = CS_CMD_ACTOR_CUE_558;
+ this->actionFunc = func_80C17B60;
+ } else {
+ Actor_SetScale(&this->actor, 0.095f);
+ func_80183430(&this->skeletonInfo, &object_moonend_Blob_00B5A0, &object_moonend_Blob_001214, this->jointTable,
+ this->morphTable, NULL);
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->cueType = CS_CMD_ACTOR_CUE_560;
+ this->actionFunc = func_80C17C48;
+ this->actor.home.rot.z = 0;
+ this->actor.draw = NULL;
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Destroy.s")
+void DemoMoonend_Destroy(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B50.s")
+ if (DEMOMOONEND_GET_PARAM_F(thisx) != 1) {
+ func_8018349C(&this->skeletonInfo);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17B60.s")
+void DemoMoonend_DoNothing(DemoMoonend* this, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17C48.s")
+void func_80C17B60(DemoMoonend* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Update.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = NULL;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17E70.s")
+ case 2:
+ this->actor.draw = func_80C17FCC;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17EE0.s")
+ default:
+ break;
+ }
+ }
+ if (this->cueId == 2) {
+ func_800B9010(&this->actor, NA_SE_EV_RAINBOW - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/DemoMoonend_Draw.s")
+void func_80C17C48(DemoMoonend* this, PlayState* play) {
+ if (func_80183DE0(&this->skeletonInfo)) {
+ this->actor.home.rot.z = 0;
+ }
+ if (Cutscene_IsCueInChannel(play, this->cueType)) {
+ u16 cueId = play->csCtx.actorCues[Cutscene_GetCueChannel(play, this->cueType)]->id;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Moonend/func_80C17FCC.s")
+ Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetCueChannel(play, this->cueType));
+
+ if (this->cueId != cueId) {
+ this->cueId = cueId;
+ switch (this->cueId) {
+ case 1:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 0.0f;
+ break;
+
+ case 2:
+ this->actor.draw = DemoMoonend_Draw;
+ func_801834A8(&this->skeletonInfo, &object_moonend_Blob_001214);
+ this->skeletonInfo.frameCtrl.unk_C = 2.0f / 3.0f;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_MOON_EXPLOSION);
+ this->actor.home.rot.z = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (this->actor.home.rot.z != 0) {
+ func_800B9010(&this->actor, NA_SE_EV_EARTHQUAKE_LAST2 - SFX_FLAG);
+ }
+ } else {
+ this->actor.draw = NULL;
+ }
+ if ((play->csCtx.state != CS_STATE_IDLE) && (gSaveContext.sceneLayer == 8) && (play->csCtx.scriptIndex == 0)) {
+ switch (play->csCtx.curFrame) {
+ case 5:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM1);
+ break;
+
+ case 50:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 100:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM3);
+ break;
+
+ case 150:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM2);
+ break;
+
+ case 200:
+ Actor_PlaySfx(&this->actor, NA_SE_EN_MOON_SCREAM4);
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+void DemoMoonend_Update(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+s32 func_80C17E70(PlayState* play, SkeletonInfo* skeletonInfo, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 2) {
+ Matrix_Push();
+ Matrix_RotateYS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000, MTXMODE_APPLY);
+ }
+
+ return true;
+}
+
+s32 func_80C17EE0(PlayState* play, SkeletonInfo* skeleton, s32 limbIndex, Gfx** dList, u8* flags, Actor* thisx,
+ Vec3f* scale, Vec3s* rot, Vec3f* pos) {
+ DemoMoonend* this = THIS;
+
+ if (limbIndex == 8) {
+ Matrix_Pop();
+ }
+
+ return true;
+}
+
+void DemoMoonend_Draw(Actor* thisx, PlayState* play) {
+ DemoMoonend* this = THIS;
+ Mtx* mtx;
+
+ AnimatedMat_Draw(play, (AnimatedMaterial*)Lib_SegmentedToVirtual(object_moonend_Matanimheader_00B540));
+
+ mtx = GRAPH_ALLOC(play->state.gfxCtx, this->skeletonInfo.unk_18->unk_1 * sizeof(Mtx));
+
+ if (mtx != NULL) {
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ func_8018450C(play, &this->skeletonInfo, mtx, func_80C17E70, func_80C17EE0, &this->actor);
+ }
+}
+
+void func_80C17FCC(Actor* thisx, PlayState* play) {
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_moonend_Matanimheader_0129F0));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_moonend_DL_010C40);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
index d36dcb284..b56c60a9b 100644
--- a/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
+++ b/src/overlays/actors/ovl_Demo_Moonend/z_demo_moonend.h
@@ -2,14 +2,21 @@
#define Z_DEMO_MOONEND_H
#include "global.h"
+#include "objects/object_moonend/object_moonend.h"
struct DemoMoonend;
typedef void (*DemoMoonendActionFunc)(struct DemoMoonend*, PlayState*);
+#define DEMOMOONEND_GET_PARAM_F(thisx) (((thisx)->params) & 0xF)
+
typedef struct DemoMoonend {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x19C];
+ /* 0x144 */ SkeletonInfo skeletonInfo;
+ /* 0x174 */ Vec3s jointTable[30];
+ /* 0x228 */ Vec3s morphTable[30];
+ /* 0x2DC */ u16 cueType;
+ /* 0x2DE */ u16 cueId;
/* 0x2E0 */ DemoMoonendActionFunc actionFunc;
} DemoMoonend; // size = 0x2E4
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_Syoten/z_demo_syoten.h b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
index 1997a2bc5..19f99bf2f 100644
--- a/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
+++ b/src/overlays/actors/ovl_Demo_Syoten/z_demo_syoten.h
@@ -12,13 +12,13 @@ typedef void (*DemoSyotenActionFunc)(struct DemoSyoten*, PlayState*);
#define DEMOSYOTEN_7E00_3F 0x3F
-enum {
+typedef enum {
/* 0 */ DEMOSYOTEN_F_0,
/* 1 */ DEMOSYOTEN_F_1,
/* 2 */ DEMOSYOTEN_F_2,
/* 3 */ DEMOSYOTEN_F_3,
/* 4 */ DEMOSYOTEN_F_4
-};
+} DemoSyotenParam;
typedef struct DemoSyoten {
/* 0x000 */ Actor actor;
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..2db282367 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
@@ -24,11 +24,11 @@ void DemoTreLgt_SetupAnimate(DemoTreLgt* this, PlayState* play, f32 frame);
void DemoTreLgt_Animate(DemoTreLgt* this, PlayState* play);
typedef struct {
- f32 unk0;
- f32 unk4;
- f32 unk8;
- f32 unkC;
-} DemoTreLgtInfo;
+ /* 0x0 */ f32 unk0;
+ /* 0x4 */ f32 unk4;
+ /* 0x8 */ f32 unk8;
+ /* 0xC */ f32 unkC;
+} DemoTreLgtInfo; // size = 0x10
static DemoTreLgtInfo D_808E1490[2] = {
{ 1.0f, 136.0f, 190.0f, 40.0f },
@@ -53,8 +53,8 @@ static TransformUpdateIndex* sBoxLightAnimations[] = {
};
typedef enum {
- /* 0x00 */ DEMO_TRE_LGT_ACTION_WAIT, // wait until animation is needed
- /* 0x01 */ DEMO_TRE_LGT_ACTION_ANIMATE
+ /* 0 */ DEMO_TRE_LGT_ACTION_WAIT, // wait until animation is needed
+ /* 1 */ DEMO_TRE_LGT_ACTION_ANIMATE
} DemoTreLgtAction;
static DemoTreLgtActionFunc sActionFuncs[] = {
@@ -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..ddd012426 100644
--- a/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
+++ b/src/overlays/actors/ovl_Dm_Ah/z_dm_ah.c
@@ -113,7 +113,7 @@ Actor* func_80C1D78C(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -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_Al/z_dm_al.h b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
index 4114b9f9c..3c77ed6c3 100644
--- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
+++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h
@@ -22,8 +22,8 @@ typedef struct DmAl {
} DmAl; // size = 0x460
typedef enum {
- /* 0x0 */ MADAME_AROMA_ANIMATION_0,
- /* 0x1 */ MADAME_AROMA_ANIMATION_1
+ /* 0 */ MADAME_AROMA_ANIMATION_0,
+ /* 1 */ MADAME_AROMA_ANIMATION_1
} DmAlAnimations;
#endif // Z_DM_AL_H
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..86d57660f 100644
--- a/src/overlays/actors/ovl_Dm_An/z_dm_an.c
+++ b/src/overlays/actors/ovl_Dm_An/z_dm_an.c
@@ -160,7 +160,7 @@ Actor* func_80C1C8E8(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -229,6 +229,9 @@ void func_80C1CAB0(DmAn* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
@@ -356,7 +359,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..33c6eed8f 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.c
@@ -74,8 +74,8 @@ void DmChar01_Init(Actor* thisx, PlayState* play) {
}
if (gSaveContext.sceneLayer == 0) {
- play->envCtx.unk_1F = 5;
- play->envCtx.unk_20 = 5;
+ play->envCtx.lightConfig = 5;
+ play->envCtx.changeLightNextConfig = 5;
}
this->unk_348 = 255.0f;
@@ -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_Char01/z_dm_char01.h b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
index 6f29531a0..7ce8df7d2 100644
--- a/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
+++ b/src/overlays/actors/ovl_Dm_Char01/z_dm_char01.h
@@ -9,12 +9,12 @@ typedef void (*DmChar01ActionFunc)(struct DmChar01*, PlayState*);
#define DMCHAR01_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 0 */ DMCHAR01_0,
/* 1 */ DMCHAR01_1,
/* 2 */ DMCHAR01_2,
- /* 3 */ DMCHAR01_3,
-};
+ /* 3 */ DMCHAR01_3
+} DmChar01Param;
typedef struct DmChar01 {
/* 0x000 */ DynaPolyActor dyna;
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..2f933c751 100644
--- a/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
+++ b/src/overlays/actors/ovl_Dm_Char02/z_dm_char02.c
@@ -35,7 +35,7 @@ typedef enum {
/* 0 */ DMCHAR02_ANIM_HIT_GROUND,
/* 1 */ DMCHAR02_ANIM_TURN_AROUND,
/* 2 */ DMCHAR02_ANIM_JUGGLE,
- /* 3 */ DMCHAR02_ANIM_FALL,
+ /* 3 */ DMCHAR02_ANIM_FALL
} DmChar02Animation;
static AnimationInfo sAnimationInfo[] = {
@@ -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..e348d145a 100644
--- a/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
+++ b/src/overlays/actors/ovl_Dm_Char03/z_dm_char03.c
@@ -163,9 +163,9 @@ void DmChar03_Draw(Actor* thisx, PlayState* play) {
DmChar03* this = THIS;
if (!this->unk_18E) {
- if ((Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136)) &&
+ 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_Char05/z_dm_char05.h b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
index 3bff39f6a..84f7c3e3e 100644
--- a/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
+++ b/src/overlays/actors/ovl_Dm_Char05/z_dm_char05.h
@@ -9,7 +9,7 @@ typedef void (*DmChar05ActionFunc)(struct DmChar05*, PlayState*);
#define DMCHAR05_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 0 */ DMCHAR05_0,
/* 1 */ DMCHAR05_1,
/* 2 */ DMCHAR05_2,
@@ -22,8 +22,8 @@ enum {
/* 9 */ DMCHAR05_9,
/* 10 */ DMCHAR05_10,
/* 11 */ DMCHAR05_11,
- /* 12 */ DMCHAR05_12,
-};
+ /* 12 */ DMCHAR05_12
+} DmChar05Param;
typedef struct DmChar05 {
/* 0x000 */ Actor 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..9f5d18967 100644
--- a/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
+++ b/src/overlays/actors/ovl_Dm_Char08/z_dm_char08.c
@@ -38,8 +38,8 @@ typedef enum {
/* 2 */ TURTLE_EYEMODE_CLOSED,
/* 3 */ TURTLE_EYEMODE_LOOK_STRAIGHT,
/* 4 */ TURTLE_EYEMODE_UNUSED,
- /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT,
-} EyeMode;
+ /* 5 */ TURTLE_EYEMODE_LOOK_RIGHT
+} TurtleEyeMode;
typedef enum {
/* 0 */ TURTLE_ANIM_IDLE,
@@ -48,7 +48,7 @@ typedef enum {
/* 3 */ TURTLE_ANIM_SPEAK1,
/* 4 */ TURTLE_ANIM_COUGH,
/* 5 */ TURTLE_ANIM_SPEAK2,
- /* 6 */ TURTLE_ANIM_YAWN,
+ /* 6 */ TURTLE_ANIM_YAWN
} TurtleAnimation;
ActorInit Dm_Char08_InitVars = {
@@ -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..587ca059d 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.c
@@ -129,7 +129,7 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
s32 i;
s32 cueChannel;
s32 max = 0;
- s32 pathnum;
+ s32 pathIndex;
u8 temp = false;
if (!DMCHAR09_GET_F(&this->actor)) {
@@ -160,12 +160,12 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
}
if (play->csCtx.actorCues[cueChannel]->id >= 2) {
- pathnum = DMCHAR09_GET_PATH(&this->actor);
- path = &play->setupPathList[pathnum];
+ pathIndex = DMCHAR09_GET_PATH_INDEX(&this->actor);
+ path = &play->setupPathList[pathIndex];
for (i = 0; i < max; i++) {
- pathnum = path->unk1;
- path = &play->setupPathList[pathnum];
+ pathIndex = path->additionalPathIndex;
+ path = &play->setupPathList[pathIndex];
}
this->unk_224 = Lib_SegmentedToVirtual(path->points);
@@ -175,7 +175,7 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
this->unk_220 = 1;
this->unk_22E = true;
- this->speed = (u16)play->csCtx.actorCues[cueChannel]->rot.z * 0.00390625f;
+ this->speed = (u16)play->csCtx.actorCues[cueChannel]->rot.z * (1.0f / 256.0f);
this->actionFunc = func_80AB1FDC;
} else {
this->unk_22E = false;
@@ -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_Char09/z_dm_char09.h b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
index cfb3523e6..cca08d079 100644
--- a/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
+++ b/src/overlays/actors/ovl_Dm_Char09/z_dm_char09.h
@@ -4,7 +4,7 @@
#include "global.h"
#include "objects/object_bee/object_bee.h"
-#define DMCHAR09_GET_PATH(thisx) (((thisx)->params >> 4) & 0xF)
+#define DMCHAR09_GET_PATH_INDEX(thisx) (((thisx)->params >> 4) & 0xF)
#define DMCHAR09_GET_100(thisx) ((thisx)->params & 0x100)
#define DMCHAR09_GET_F(thisx) ((thisx)->params & 0xF)
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..139d80bc3 100644
--- a/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
+++ b/src/overlays/actors/ovl_Dm_Gm/z_dm_gm.c
@@ -160,7 +160,7 @@ Actor* func_80C24838(PlayState* play) {
}
tempActor = foundActor->next;
- if (tempActor == NULL || false) {
+ if ((tempActor == NULL) || false) {
foundActor = NULL;
break;
}
@@ -229,6 +229,9 @@ void func_80C24A00(DmGm* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
@@ -356,7 +359,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_Opstage/z_dm_opstage.h b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
index 03fd093f3..964965cae 100644
--- a/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
+++ b/src/overlays/actors/ovl_Dm_Opstage/z_dm_opstage.h
@@ -14,7 +14,7 @@ typedef enum {
/* 0 */ DMOPSTAGE_TYPE_GROUND,
/* 1 */ DMOPSTAGE_TYPE_ROOT_TREE,
/* 2 */ DMOPSTAGE_TYPE_CUT_TREE,
- /* 3 */ DMOPSTAGE_TYPE_STRAIGHT_TREE,
+ /* 3 */ DMOPSTAGE_TYPE_STRAIGHT_TREE
} DmOpStageTypes;
typedef struct DmOpstage {
diff --git a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
index 01b9b52af..fbc5fcb8b 100644
--- a/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
+++ b/src/overlays/actors/ovl_Dm_Ravine/z_dm_ravine.h
@@ -10,7 +10,7 @@ typedef void (*DmRavineActionFunc)(struct DmRavine*, PlayState*);
typedef enum {
/* 0 */ DM_RAVINE_STATE_INITIALIZED,
/* 1 */ DM_RAVINE_STATE_ACTIVE,
- /* 2 */ DM_RAVINE_STATE_PENDING_DEATH,
+ /* 2 */ DM_RAVINE_STATE_PENDING_DEATH
} DmRavineState;
typedef struct DmRavine {
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..1787bcf6f 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.c
@@ -108,7 +108,7 @@ typedef enum {
/* 68 */ SK_ANIM_LOOK_LEFT_START,
/* 69 */ SK_ANIM_LOOK_LEFT_LOOP,
/* 70 */ SK_ANIM_SNIFF,
- /* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF,
+ /* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF
} SkullKidAnimation;
typedef enum {
@@ -116,7 +116,7 @@ typedef enum {
/* 1 */ SK_MASK_TYPE_NORMAL,
/* 2 */ SK_MASK_TYPE_GLOWING_EYES,
/* 3 */ SK_MASK_TYPE_FADING_OUT,
- /* 9 */ SK_MASK_TYPE_RAISED = 9,
+ /* 9 */ SK_MASK_TYPE_RAISED = 9
} SkullKidMaskType;
typedef enum {
@@ -127,19 +127,19 @@ typedef enum {
/* 4 */ SK_HAND_TYPE_JUGGLING_OR_DROPPING_OCARINA,
/* 5 */ SK_HAND_TYPE_HOLDING_MAJORAS_MASK_AND_FLUTE,
/* 6 */ SK_HAND_TYPE_HOLDING_FLUTE,
- /* 9 */ SK_HAND_TYPE_DEFAULT = 9,
+ /* 9 */ SK_HAND_TYPE_DEFAULT = 9
} SkullKidHandType;
typedef enum {
/* 0 */ SK_FADE_IN_STATE_NONE,
/* 1 */ SK_FADE_IN_STATE_START,
/* 2 */ SK_FADE_IN_STATE_INCREASE_FOG,
- /* 3 */ SK_FADE_IN_STATE_INCREASE_ALPHA,
+ /* 3 */ SK_FADE_IN_STATE_INCREASE_ALPHA
} SkullKidFadeInState;
typedef enum {
/* 0 */ SK_FADE_OUT_STATE_NONE,
- /* 1 */ SK_FADE_OUT_STATE_FADING_OUT,
+ /* 1 */ SK_FADE_OUT_STATE_FADING_OUT
} SkullKidFadeOutState;
typedef enum {
@@ -843,9 +843,10 @@ void DmStk_PlaySfxForCutsceneAfterPlayingOathToOrder(DmStk* this, PlayState* pla
case 594:
Audio_PlaySfxAtPos(&this->oathToOrderCutsceneVoicePos, NA_SE_EN_STAL24_SCREAM2);
break;
- }
- if (1) {}
+ default:
+ break;
+ }
if ((play->csCtx.curFrame >= 62) && (play->csCtx.curFrame < 273)) {
if ((Rand_ZeroOne() < 0.75f) && ((play->state.frames % 2) != 0)) {
@@ -1128,8 +1129,8 @@ void DmStk_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.scriptIndex > 0)) {
- play->envCtx.unk_17 = 15;
- play->envCtx.unk_18 = 15;
+ play->envCtx.skyboxConfig = 15;
+ play->envCtx.changeSkyboxNextConfig = 15;
}
}
@@ -1825,8 +1826,8 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
}
if ((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 3) && (play->csCtx.scriptIndex > 0)) {
- play->envCtx.unk_17 = 15;
- play->envCtx.unk_18 = 15;
+ play->envCtx.skyboxConfig = 15;
+ play->envCtx.changeSkyboxNextConfig = 15;
}
}
@@ -2033,10 +2034,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_Stk/z_dm_stk.h b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
index 0f58c534d..cc7ac89ea 100644
--- a/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
+++ b/src/overlays/actors/ovl_Dm_Stk/z_dm_stk.h
@@ -12,7 +12,7 @@ typedef void (*DmStkActionFunc)(struct DmStk*, PlayState*);
typedef enum {
/* 0 */ DM_STK_TYPE_SKULL_KID,
- /* 1 */ DM_STK_TYPE_MAJORAS_MASK,
+ /* 1 */ DM_STK_TYPE_MAJORAS_MASK
} DmStkType;
typedef struct DmStk {
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..30d1cb3ef 100644
--- a/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
+++ b/src/overlays/actors/ovl_Dm_Zl/z_dm_zl.c
@@ -47,7 +47,7 @@ typedef enum {
/* 4 */ ZELDA_ANIM_GIVING_OCARINA,
/* 5 */ ZELDA_ANIM_PLAYING_OCARINA_START,
/* 6 */ ZELDA_ANIM_PLAYING_OCARINA,
- /* 7 */ ZELDA_ANIM_MAX,
+ /* 7 */ ZELDA_ANIM_MAX
} DmZlAnimation;
static TexturePtr sMouthTextures[] = {
@@ -61,7 +61,7 @@ typedef enum {
/* 0 */ ZELDA_MOUTH_NEUTRAL,
/* 1 */ ZELDA_MOUTH_SMILING,
/* 2 */ ZELDA_MOUTH_FROWNING,
- /* 3 */ ZELDA_MOUTH_OPEN,
+ /* 3 */ ZELDA_MOUTH_OPEN
} DmZlMouthTextures;
static TexturePtr sEyeTextures[] = {
@@ -81,7 +81,7 @@ typedef enum {
/* 3 */ ZELDA_EYE_WIDE,
/* 4 */ ZELDA_EYE_HAPPY,
/* 5 */ ZELDA_EYE_OPEN_LOOKING_LEFT,
- /* 6 */ ZELDA_EYE_OPEN_LOOKING_RIGHT,
+ /* 6 */ ZELDA_EYE_OPEN_LOOKING_RIGHT
} DmZlEyeTextures;
// Unused in MM
@@ -92,7 +92,7 @@ typedef enum {
/* 3 */ ZELDA_EYE_STATE_LOOKING_RIGHT,
/* 4 */ ZELDA_EYE_STATE_WIDE,
/* 5 */ ZELDA_EYE_STATE_HAPPY,
- /* 6 */ ZELDA_EYE_STATE_CLOSED2,
+ /* 6 */ ZELDA_EYE_STATE_CLOSED2
} DmZlEyeStates;
/**
@@ -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 f8fef514d..7e202b0af 100644
--- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
+++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c
@@ -101,8 +101,8 @@ static InitChainEntry sInitChain[] = {
};
typedef struct {
- /* 0x00 */ s16 sceneId;
- /* 0x02 */ u8 index;
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ u8 index;
} ShutterSceneInfo; // size = 0x4
ShutterSceneInfo D_808A2258[] = {
@@ -115,9 +115,9 @@ ShutterSceneInfo D_808A2258[] = {
};
typedef struct {
- /* 0x00 */ s16 dungeonSceneId;
- /* 0x02 */ s16 bossSceneId;
- /* 0x04 */ u8 index;
+ /* 0x0 */ s16 dungeonSceneId;
+ /* 0x2 */ s16 bossSceneId;
+ /* 0x4 */ u8 index;
} BossDoorInfo; // size = 0x6
BossDoorInfo D_808A22A0[] = {
@@ -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) {
- gSaveContext.save.saveInfo.inventory.dungeonKeys[gSaveContext.mapIndex]--;
- Actor_PlaySfx(&this->actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ DUNGEON_KEY_COUNT(gSaveContext.mapIndex) = DUNGEON_KEY_COUNT(gSaveContext.mapIndex) - 1;
+ 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..de20e6f63 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -572,6 +572,9 @@ void func_808B9CE8(DoorWarp1* this, PlayState* play) {
gSaveContext.save.saveInfo.unk_EA8[0] = (((void)0, gSaveContext.save.saveInfo.unk_EA8[0]) & 0x00FFFFFF) |
((((u8)gSaveContext.save.saveInfo.unk_EA8[1]) & 0xFF) << 0x18);
break;
+
+ default:
+ break;
}
gSaveContext.save.saveInfo.unk_EA8[1] = (gSaveContext.save.saveInfo.unk_EA8[1] & 0xFFFFFF00) |
@@ -810,6 +813,9 @@ void func_808BA550(DoorWarp1* this, PlayState* play) {
case PLAYER_FORM_HUMAN:
temp_f0 = -25.0f;
break;
+
+ default:
+ break;
}
temp_f2 = this->dyna.actor.world.pos.y + (this->dyna.actor.shape.yOffset * 0.1f) + temp_f0;
@@ -931,7 +937,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 +975,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 +1065,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 +1082,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_Door_Warp1/z_door_warp1.h b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
index 1bc7e13bc..de67845ed 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
@@ -13,15 +13,15 @@ typedef void (*DoorWarp1ActionFunc)(struct DoorWarp1*, PlayState*);
#define DOORWARP1_GET_FF00_2(thisx) ((thisx)->params & 0xFF00)
#define DOORWARP1_GET_FF00_3(thisx) ((thisx)->params >> 8)
-enum {
+typedef enum {
/* 0 */ ENDOORWARP1_FF_0,
/* 1 */ ENDOORWARP1_FF_1,
/* 2 */ ENDOORWARP1_FF_2,
/* 3 */ ENDOORWARP1_FF_3,
/* 4 */ ENDOORWARP1_FF_4,
/* 5 */ ENDOORWARP1_FF_5,
- /* 6 */ ENDOORWARP1_FF_6,
-};
+ /* 6 */ ENDOORWARP1_FF_6
+} DoorWarp1Param;
typedef struct DoorWarp1 {
/* 0x000 */ DynaPolyActor dyna;
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..742b3bb70 100644
--- a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
+++ b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.c
@@ -63,6 +63,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dz = 1.0f;
this->scalingFactor = 0.2f;
break;
+
case EFF_DUST_TYPE_1:
this->actionFunc = func_80918FE4;
this->actor.draw = func_80919768;
@@ -71,6 +72,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dz = 0.8f;
this->scalingFactor = 0.5f;
break;
+
case EFF_DUST_TYPE_SPIN_ATTACK_CHARGE:
case EFF_DUST_TYPE_3:
this->actionFunc = func_80919230;
@@ -79,6 +81,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 15.0f;
break;
+
case EFF_DUST_TYPE_4:
this->actionFunc = func_80919230;
this->actor.draw = func_809199FC;
@@ -86,6 +89,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 10.0f;
break;
+
case EFF_DUST_TYPE_5:
this->actionFunc = func_80919230;
this->actor.draw = func_809199FC;
@@ -93,6 +97,7 @@ void EffDust_Init(Actor* thisx, PlayState* play) {
this->dx = 0.5f;
this->scalingFactor = 20.0f;
break;
+
default:
SystemArena_Free(this);
break;
@@ -105,7 +110,7 @@ void EffDust_Destroy(Actor* thisx, PlayState* play) {
void func_80918D64(EffDust* this, PlayState* play) {
s16 theta;
- s16 fi;
+ s16 phi;
s32 i;
s32 j;
f32* distanceTraveled = this->distanceTraveled;
@@ -122,10 +127,10 @@ void func_80918D64(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
// Spherical coordinate system.
- fi = randPlusMinusPoint5Scaled(0x10000);
+ phi = Rand_CenteredFloat(0x10000);
theta = Rand_ZeroFloat(0x1000);
- this->initialPositions[i].x = -(f32)this->actor.home.rot.z * Math_CosS(fi) * Math_CosS(theta);
- this->initialPositions[i].y = -(f32)this->actor.home.rot.z * Math_SinS(fi) * Math_CosS(theta);
+ this->initialPositions[i].x = -(f32)this->actor.home.rot.z * Math_CosS(phi) * Math_CosS(theta);
+ this->initialPositions[i].y = -(f32)this->actor.home.rot.z * Math_SinS(phi) * Math_CosS(theta);
this->initialPositions[i].z = -(f32)this->actor.home.rot.z * Math_SinS(theta);
this->distanceTraveled[i] = 0.0f;
this->index++;
@@ -136,7 +141,7 @@ void func_80918D64(EffDust* this, PlayState* play) {
void func_80918FE4(EffDust* this, PlayState* play) {
s16 theta;
- s16 fi;
+ s16 phi;
f32* distanceTraveled = this->distanceTraveled;
s32 i;
s32 j;
@@ -152,11 +157,11 @@ void func_80918FE4(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
// Spherical coordinate system.
- fi = randPlusMinusPoint5Scaled(0x10000);
+ phi = Rand_CenteredFloat(0x10000);
theta = Rand_ZeroFloat(0x2000);
- this->initialPositions[i].x = 400.0f * Math_CosS(fi) * Math_CosS(theta);
+ this->initialPositions[i].x = 400.0f * Math_CosS(phi) * Math_CosS(theta);
this->initialPositions[i].y = 400.0f * Math_SinS(theta);
- this->initialPositions[i].z = 400.0f * Math_SinS(fi) * Math_CosS(theta);
+ this->initialPositions[i].z = 400.0f * Math_SinS(phi) * Math_CosS(theta);
this->distanceTraveled[i] = 0.0f;
this->index++;
}
@@ -171,7 +176,7 @@ void func_80919230(EffDust* this, PlayState* play) {
s32 i;
s32 j;
- if (parent == NULL || parent->update == NULL || !(player->stateFlags1 & PLAYER_STATE1_1000)) {
+ if ((parent == NULL) || (parent->update == NULL) || !(player->stateFlags1 & PLAYER_STATE1_1000)) {
if (this->life != 0) {
this->life--;
} else {
@@ -201,7 +206,7 @@ void func_80919230(EffDust* this, PlayState* play) {
i = this->index & 0x3F;
if (this->distanceTraveled[i] >= 1.0f) {
- theta = randPlusMinusPoint5Scaled(0x10000);
+ theta = Rand_CenteredFloat(0x10000);
switch (this->actor.params) {
case EFF_DUST_TYPE_SPIN_ATTACK_CHARGE:
this->initialPositions[i].x = (Rand_ZeroOne() * 4500.0f) + 700.0f;
@@ -235,6 +240,9 @@ void func_80919230(EffDust* this, PlayState* play) {
this->initialPositions[i].z = 4000.0f * Math_CosS(theta);
}
break;
+
+ default:
+ break;
}
this->distanceTraveled[i] = 0.0f;
@@ -268,7 +276,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 +327,8 @@ 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 +336,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 +349,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_Dust/z_eff_dust.h b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
index 38b724865..20a1df27e 100644
--- a/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
+++ b/src/overlays/actors/ovl_Eff_Dust/z_eff_dust.h
@@ -22,12 +22,12 @@ typedef struct EffDust {
} EffDust; // size = 0x560
typedef enum {
- /* 0x0 */ EFF_DUST_TYPE_0,
- /* 0x1 */ EFF_DUST_TYPE_1,
- /* 0x2 */ EFF_DUST_TYPE_SPIN_ATTACK_CHARGE,
- /* 0x3 */ EFF_DUST_TYPE_3,
- /* 0x4 */ EFF_DUST_TYPE_4,
- /* 0x5 */ EFF_DUST_TYPE_5
+ /* 0 */ EFF_DUST_TYPE_0,
+ /* 1 */ EFF_DUST_TYPE_1,
+ /* 2 */ EFF_DUST_TYPE_SPIN_ATTACK_CHARGE,
+ /* 3 */ EFF_DUST_TYPE_3,
+ /* 4 */ EFF_DUST_TYPE_4,
+ /* 5 */ EFF_DUST_TYPE_5
} EffDustType;
#endif // Z_EFF_DUST_H
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..9b5290907 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"
@@ -50,7 +49,7 @@ void EffKamejimaWave_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.2f);
this->actor.scale.y = 0.0f;
- if (EFFKAMEJIMAWAVE_GET_F(thisx) == EFFKAMEJIMAWAVE_PARAMS_1) {
+ if (EFFKAMEJIMAWAVE_GET_F(thisx) == EFFKAMEJIMAWAVE_PARAM_1) {
this->actionFunc = func_80BCEDE0;
sVtxAlpha = 255;
} else {
@@ -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_Kamejima_Wave/z_eff_kamejima_wave.h b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
index c79537363..de5567ff0 100644
--- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
+++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h
@@ -16,9 +16,9 @@ typedef struct EffKamejimaWave {
/* 0x14C */ EffKamejimaWaveActionFunc actionFunc;
} EffKamejimaWave; // size = 0x150
-typedef enum params {
- /* 0x0 */ EFFKAMEJIMAWAVE_PARAMS_0,
- /* 0x1 */ EFFKAMEJIMAWAVE_PARAMS_1
-} EffKamejimaWaveParams;
+typedef enum EffKamejimaWaveParam {
+ /* 0 */ EFFKAMEJIMAWAVE_PARAM_0,
+ /* 1 */ EFFKAMEJIMAWAVE_PARAM_1
+} EffKamejimaWaveParam;
#endif // Z_EFF_KAMEJIMA_WAVE_H
diff --git a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
index a37f4ec07..8ec3ac959 100644
--- a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
+++ b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.c
@@ -22,10 +22,10 @@ void func_80BEBEB8(EffLastday* this, PlayState* play);
void func_80BEBF78(EffLastday* this, PlayState* play);
typedef enum EffLastDayAction {
- /* 0x0 */ EFFLASTDAY_ACTION_NONE,
- /* 0x1 */ EFFLASTDAY_ACTION_1,
- /* 0x2 */ EFFLASTDAY_ACTION_2,
- /* 0x3 */ EFFLASTDAY_ACTION_3
+ /* 0 */ EFFLASTDAY_ACTION_NONE,
+ /* 1 */ EFFLASTDAY_ACTION_1,
+ /* 2 */ EFFLASTDAY_ACTION_2,
+ /* 3 */ EFFLASTDAY_ACTION_3
} EffLastDayAction;
ActorInit Eff_Lastday_InitVars = {
@@ -46,7 +46,7 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.1f);
switch (EFFLASTDAY_GET_F(&this->actor)) {
- case EFFLASTDAY_PARAMS_1:
+ case EFFLASTDAY_PARAM_1:
this->dList = object_lastday_DL_000510;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000608);
this->cueType = CS_CMD_ACTOR_CUE_508;
@@ -54,7 +54,7 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 1.0f);
break;
- case EFFLASTDAY_PARAMS_2:
+ case EFFLASTDAY_PARAM_2:
this->dList = object_lastday_DL_000210;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000308);
this->cueType = CS_CMD_ACTOR_CUE_509;
@@ -62,7 +62,7 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.5f);
break;
- case EFFLASTDAY_PARAMS_3:
+ case EFFLASTDAY_PARAM_3:
this->dList = object_lastday_DL_000060;
this->matAnim = Lib_SegmentedToVirtual(object_lastday_Matanimheader_000148);
this->cueType = CS_CMD_ACTOR_CUE_510;
@@ -79,13 +79,13 @@ void EffLastday_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 1.0f);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_1);
+ EFFLASTDAY_PARAM_1);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_2);
+ EFFLASTDAY_PARAM_2);
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EFF_LASTDAY, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0,
- EFFLASTDAY_PARAMS_3);
+ EFFLASTDAY_PARAM_3);
break;
}
}
@@ -238,10 +238,10 @@ void EffLastday_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
switch (EFFLASTDAY_GET_F(thisx)) {
- case EFFLASTDAY_PARAMS_1:
- case EFFLASTDAY_PARAMS_2:
+ case EFFLASTDAY_PARAM_1:
+ case EFFLASTDAY_PARAM_2:
break;
- case EFFLASTDAY_PARAMS_3:
+ case EFFLASTDAY_PARAM_3:
EffLastday_SetVtxAlpha(this->alpha);
break;
default:
diff --git a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
index 0b5002863..9d2087ae1 100644
--- a/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
+++ b/src/overlays/actors/ovl_Eff_Lastday/z_eff_lastday.h
@@ -19,11 +19,11 @@ typedef struct EffLastday {
/* 0x154 */ EffLastdayActionFunc actionFunc;
} EffLastday; // size = 0x158
-typedef enum EffLastDayParams {
- /* 0x0 */ EFFLASTDAY_PARAMS_0,
- /* 0x1 */ EFFLASTDAY_PARAMS_1,
- /* 0x2 */ EFFLASTDAY_PARAMS_2,
- /* 0x3 */ EFFLASTDAY_PARAMS_3
-} EffLastDayParams;
+typedef enum EffLastDayParam {
+ /* 0 */ EFFLASTDAY_PARAM_0,
+ /* 1 */ EFFLASTDAY_PARAM_1,
+ /* 2 */ EFFLASTDAY_PARAM_2,
+ /* 3 */ EFFLASTDAY_PARAM_3
+} EffLastDayParam;
#endif // Z_EFF_LASTDAY_H
diff --git a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
index 4d66cc827..88c604c5e 100644
--- a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
+++ b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c
@@ -5,6 +5,7 @@
*/
#include "z_eff_stk.h"
+#include "objects/object_stk2/object_stk2.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -15,7 +16,8 @@ void EffStk_Destroy(Actor* thisx, PlayState* play);
void EffStk_Update(Actor* thisx, PlayState* play);
void EffStk_Draw(Actor* thisx, PlayState* play);
-#if 0
+void func_80BF0DE0(EffStk* this, PlayState* play);
+
ActorInit Eff_Stk_InitVars = {
ACTOR_EFF_STK,
ACTORCAT_ITEMACTION,
@@ -28,16 +30,75 @@ ActorInit Eff_Stk_InitVars = {
(ActorFunc)EffStk_Draw,
};
-#endif
+void EffStk_Init(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
-extern UNK_TYPE D_06009F60;
+ Actor_SetScale(&this->actor, 0.2f);
+ this->actionFunc = func_80BF0DE0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Init.s")
+void EffStk_Destroy(Actor* thisx, PlayState* play) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Destroy.s")
+void func_80BF0DE0(EffStk* this, PlayState* play) {
+ if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_512)) {
+ switch (play->csCtx.actorCues[Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_512)]->id) {
+ case 2:
+ this->actor.draw = EffStk_Draw;
+ if (this->unk146 < 0x3C00) {
+ this->unk146 += 0x400;
+ this->unk148 = Math_SinS(this->unk146) * -630.0f;
+ }
+ this->unk144++;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/func_80BF0DE0.s")
+ case 3:
+ this->actor.draw = EffStk_Draw;
+ if (this->unk146 < 0x3C00) {
+ this->unk146 += 0x400;
+ this->unk148 = Math_SinS(this->unk146) * -630.0f;
+ }
+ this->unk144--;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Update.s")
+ default:
+ this->actor.draw = NULL;
+ this->unk146 = 0;
+ this->unk148 = 0.0f;
+ break;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Stk/EffStk_Draw.s")
+void EffStk_Update(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EffStk_Draw(Actor* thisx, PlayState* play) {
+ EffStk* this = THIS;
+ s32 pad;
+ Camera* activeCam = GET_ACTIVE_CAM(play);
+ Vec3f eye = activeCam->eye;
+ Vec3f quakeOffset;
+
+ Camera_GetQuakeOffset(&quakeOffset, activeCam);
+
+ OPEN_DISPS(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.2f, 0.2f, 0.2f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Translate(0.0f, 0.0f, this->unk148, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ AnimatedMat_DrawAlphaStep(play, Lib_SegmentedToVirtual(object_stk2_Matanimheader_009F60), 1.0f, this->unk144);
+ gDPSetColorDither(POLY_XLU_DISP++, G_CD_NOISE);
+ gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_NOISE);
+ gSPDisplayList(POLY_XLU_DISP++, object_stk2_DL_008920);
+ gSPDisplayList(POLY_XLU_DISP++, object_stk2_DL_008A38);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
index 4b2b84783..03b6660d2 100644
--- a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
+++ b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.h
@@ -9,7 +9,9 @@ typedef void (*EffStkActionFunc)(struct EffStk*, PlayState*);
typedef struct EffStk {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x8];
+ /* 0x144 */ s16 unk144;
+ /* 0x146 */ s16 unk146;
+ /* 0x148 */ f32 unk148;
/* 0x14C */ EffStkActionFunc actionFunc;
} EffStk; // size = 0x150
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..0a8df4f40 100644
--- a/src/overlays/actors/ovl_En_Ah/z_en_ah.c
+++ b/src/overlays/actors/ovl_En_Ah/z_en_ah.c
@@ -25,7 +25,7 @@ static u8 D_80BD3DB0[] = {
/* 0x08 */ SCHEDULE_CMD_RET_VAL_L(1),
/* 0x0B */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_S(2, 0x20 - 0x0F),
/* 0x0F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 0, 23, 0, 0x1D - 0x15),
- /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_50_20, 0x1C - 0x19),
+ /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x1C - 0x19),
/* 0x19 */ SCHEDULE_CMD_RET_VAL_L(1),
/* 0x1C */ SCHEDULE_CMD_RET_NONE(),
/* 0x1D */ SCHEDULE_CMD_RET_VAL_L(3),
@@ -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..6e56cc609 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
@@ -179,7 +179,7 @@ s32 func_80BECD10(EnAkindonuts* this, Path* path, s32 arg2) {
phi_f14 = sp5C[idx + 1].z - sp5C[idx - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
}
@@ -232,8 +232,10 @@ s32 func_80BECFBC(EnAkindonuts* this) {
case 3:
Inventory_DeleteItem(ITEM_DEED_OCEAN, SLOT(ITEM_DEED_OCEAN));
return GI_RUPEE_HUGE;
+
+ default:
+ return GI_NONE;
}
- return GI_NONE;
}
s32 func_80BED034(EnAkindonuts* this) {
@@ -249,8 +251,10 @@ s32 func_80BED034(EnAkindonuts* this) {
case 3:
return GI_POTION_BLUE;
+
+ default:
+ return GI_NONE;
}
- return GI_NONE;
}
void func_80BED090(PlayState* play) {
@@ -1606,7 +1610,7 @@ void EnAkindonuts_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = -1.0f;
if (!ENAKINDONUTS_GET_4(&this->actor)) {
- this->path = SubS_GetPathByIndex(play, ENAKINDONUTS_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENAKINDONUTS_GET_PATH_INDEX(&this->actor), ENAKINDONUTS_PATH_INDEX_NONE);
if (this->path == NULL) {
Actor_Kill(&this->actor);
return;
@@ -1705,7 +1709,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_Akindonuts/z_en_akindonuts.h b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
index 180d73ed4..680fdbb75 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
@@ -10,12 +10,14 @@ typedef void (*EnAkindonutsUnkFunc)(struct EnAkindonuts*, PlayState*);
#define ENAKINDONUTS_GET_3(thisx) ((thisx)->params & 3)
#define ENAKINDONUTS_GET_4(thisx) (((thisx)->params & 4) >> 2)
-#define ENAKINDONUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENAKINDONUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
-enum {
+#define ENAKINDONUTS_PATH_INDEX_NONE 0x3F
+
+typedef enum {
/* 1 */ ENAKINDONUTS_3_1 = 1,
- /* 2 */ ENAKINDONUTS_3_2,
-};
+ /* 2 */ ENAKINDONUTS_3_2
+} EnAkindonutsParam;
typedef struct EnAkindonuts {
/* 0x000 */ Actor 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..2568d6617 100644
--- a/src/overlays/actors/ovl_En_Al/z_en_al.c
+++ b/src/overlays/actors/ovl_En_Al/z_en_al.c
@@ -480,10 +480,10 @@ s32 func_80BDEC2C(EnAl* this, PlayState* play) {
if ((this->unk_4C2 & 7) && Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->unk_4C2 &= ~0x1800;
- if (player->exchangeItemId == 0x33) {
+ if (player->exchangeItemId == PLAYER_IA_LETTER_MAMA) {
this->unk_4C2 |= 0x800;
this->unk_4F4 = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
+ } else if (player->exchangeItemId != PLAYER_IA_NONE) {
this->unk_4C2 |= 0x1000;
this->unk_4F4 = player->exchangeItemId;
}
@@ -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..7d1f1e140 100644
--- a/src/overlays/actors/ovl_En_Am/z_en_am.c
+++ b/src/overlays/actors/ovl_En_Am/z_en_am.c
@@ -193,9 +193,9 @@ void EnAm_SpawnEffects(EnAm* this, PlayState* play) {
// Dust Clouds that spawn from the hop
for (i = 4; i > 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(65.0f) + this->actor.world.pos.x;
- effectPos.y = randPlusMinusPoint5Scaled(10.0f) + (this->actor.world.pos.y + 40.0f);
- effectPos.z = randPlusMinusPoint5Scaled(65.0f) + this->actor.world.pos.z;
+ effectPos.x = Rand_CenteredFloat(65.0f) + this->actor.world.pos.x;
+ effectPos.y = Rand_CenteredFloat(10.0f) + (this->actor.world.pos.y + 40.0f);
+ effectPos.z = Rand_CenteredFloat(65.0f) + this->actor.world.pos.z;
EffectSsKirakira_SpawnSmall(play, &effectPos, &sVelocity, &sAccel, &D_808B1118, &D_808B111C);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_AMOS_WALK);
@@ -254,7 +254,7 @@ void EnAm_ApplyEnemyTexture(EnAm* this, PlayState* play) {
func_808B0358(this);
} else {
tempTextureBlend = this->textureBlend + 20;
- rand = randPlusMinusPoint5Scaled(10.0f);
+ rand = Rand_CenteredFloat(10.0f);
cos = Math_CosS(this->actor.shape.rot.y) * rand;
sin = Math_SinS(this->actor.shape.rot.y) * rand;
this->actor.world.pos.x = this->actor.home.pos.x + cos;
@@ -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;
}
@@ -432,7 +433,7 @@ void func_808B0894(EnAm* this, PlayState* play) {
for (i = 0; i < 8; i++) {
dustPos.x = (Math_SinS(0) * 7.0f) + this->actor.world.pos.x;
- dustPos.y = (randPlusMinusPoint5Scaled(10.0f) * 6.0f) + (this->actor.world.pos.y + 40.0f);
+ dustPos.y = (Rand_CenteredFloat(10.0f) * 6.0f) + (this->actor.world.pos.y + 40.0f);
dustPos.z = (Math_CosS(0) * 7.0f) + this->actor.world.pos.z;
func_800B0EB0(play, &dustPos, &gZeroVec3f, &gZeroVec3f, &D_808B1120, &D_808B1124, 200, 45, 12);
@@ -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_Ani/z_en_ani.h b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
index fcced964b..d0f2e6a12 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.h
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.h
@@ -28,10 +28,10 @@ typedef struct EnAni {
/* 0x2FC */ EnAniActionFunc actionFunc;
} EnAni; // size = 0x300
-enum EnAniType {
- /* else */ ANI_TYPE_STANDING, // unfinshed and unused
- /* 1 */ ANI_TYPE_TREE_HANGING = 1,
-};
+typedef enum EnAniType {
+ /* 1 */ ANI_TYPE_TREE_HANGING = 1,
+ /* 2 */ ANI_TYPE_STANDING // unfinshed and unused. Never read as 2, only taken as the "else" case from `ANI_TYPE_TREE_HANGING`
+} EnAniType;
#define ANI_GET_TYPE(thisx) ((thisx)->params & 0xFF)
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..dcd380256 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 != ENAOB01_PATH_INDEX_NONE) {
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, ENAOB01_PATH_INDEX_NONE);
+ pathIndex = this->dogPaths[i]->additionalPathIndex;
i++;
- } while (temp_s0 != 0xFF);
+ } while (pathIndex != ADDITIONAL_PATH_INDEX_NONE);
}
}
-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]->additionalPathIndex, 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..5f7775368 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,58 @@ 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)
+
+#define ENAOB01_PATH_INDEX_NONE 0x3F
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..e47a726a4 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,14 +329,14 @@ 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)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
- this->actor.world.rot.y += BINANG_ROT180((s16)randPlusMinusPoint5Scaled(8000.0f));
+ this->actor.world.rot.y += BINANG_ROT180((s16)(s32)Rand_CenteredFloat(0x1F40));
this->actor.velocity.y = -this->actor.velocity.y;
this->bubble.unk_149 = -1;
return;
@@ -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;
@@ -468,12 +468,13 @@ void func_8088ACE0(EnArrow* this, PlayState* play) {
if ((this->unk_262 = BgCheck_ProjectileLineTest(&play->colCtx, &this->actor.prevPos, &this->actor.world.pos,
&sp9C, &this->actor.wallPoly, true, true, true, true, &spA8))) {
+ // `func_800B90AC` only returns a boolean, and does not process any code
func_800B90AC(play, &this->actor, this->actor.wallPoly, spA8, &sp9C);
Math_Vec3f_Copy(&this->actor.world.pos, &sp9C);
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 +541,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 +586,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 +642,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 +700,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 +736,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 +744,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..e8b74f8ec 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
@@ -54,9 +54,9 @@ void EnAttackNiw_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.gravity = 0.0f;
- this->randomTargetCenterOffset.x = randPlusMinusPoint5Scaled(100.0f);
- this->randomTargetCenterOffset.y = randPlusMinusPoint5Scaled(10.0f);
- this->randomTargetCenterOffset.z = randPlusMinusPoint5Scaled(100.0f);
+ this->randomTargetCenterOffset.x = Rand_CenteredFloat(100.0f);
+ this->randomTargetCenterOffset.y = Rand_CenteredFloat(10.0f);
+ this->randomTargetCenterOffset.z = Rand_CenteredFloat(100.0f);
Actor_SetScale(&this->actor, 0.01f);
this->actor.flags &= ~ACTOR_FLAG_1; // Unnecessary: this actor does not start with this flag
@@ -68,7 +68,7 @@ void EnAttackNiw_Destroy(Actor* thisx, PlayState* play) {
EnAttackNiw* this = THIS;
EnNiw* parent = (EnNiw*)this->actor.parent;
- if (this->actor.parent != NULL && this->actor.parent->update != NULL) {
+ if ((this->actor.parent != NULL) && (this->actor.parent->update != NULL)) {
if (parent->attackNiwCount > 0) {
parent->attackNiwCount--;
}
@@ -78,11 +78,11 @@ void EnAttackNiw_Destroy(Actor* thisx, PlayState* play) {
/**
* Summary: instead of using SkelAnime animations AttackNiw modifies head+wings directly to create animations
*
- * EnNiw has its own version of this function, probably copy paste since AttackNiw only uses two animationState (2/5)
+ * EnNiw has its own version of this function, probably copy paste since AttackNiw only uses two animIndex (2/5)
*/
-void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animationState) {
+void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animIndex) {
if (this->unkTimer24C == 0) {
- if (animationState == 0) {
+ if (animIndex == 0) {
this->targetBodyRotY = 0.0f;
} else {
this->targetBodyRotY = -10000.0f;
@@ -92,7 +92,7 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->unkTimer24C = 3;
if ((this->clearRotYToggleTimer % 2) == 0) {
this->targetBodyRotY = 0.0f;
- if (animationState == 0) {
+ if (animIndex == 0) {
this->unkTimer24C = Rand_ZeroFloat(30.0f);
}
}
@@ -102,7 +102,7 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->unkToggle28A++;
this->unkToggle28A &= 1;
- switch (animationState) { // only case 2 and 5 are ever called in AttackNiw
+ switch (animIndex) { // only case 2 and 5 are ever called in AttackNiw
case NIW_ANIM_STILL:
this->targetLeftWingRotZ = 0.0f;
this->targetRightWingRotZ = 0.0f;
@@ -156,6 +156,9 @@ void EnAttackNiw_AnimateWingHead(EnAttackNiw* this, PlayState* play, s16 animati
this->targetLeftWingRotY = 10000.0f;
}
break;
+
+ default:
+ break;
}
}
@@ -308,7 +311,7 @@ void EnAttackNiw_AimAtPlayer(EnAttackNiw* this, PlayState* play) {
}
if (this->randomAngleChangeTimer == 50) {
- this->targetRotY = randPlusMinusPoint5Scaled(200.0f) + this->actor.yawTowardsPlayer;
+ this->targetRotY = Rand_CenteredFloat(200.0f) + this->actor.yawTowardsPlayer;
}
Math_SmoothStepToS(&this->actor.world.rot.y, this->targetRotY, 2, this->rotStep, 0);
@@ -446,7 +449,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..f4a9005f6 100644
--- a/src/overlays/actors/ovl_En_Az/z_en_az.c
+++ b/src/overlays/actors/ovl_En_Az/z_en_az.c
@@ -72,7 +72,7 @@ typedef enum {
/* 10 */ BEAVER_ANIM_TALK_TO_RIGHT,
/* 11 */ BEAVER_ANIM_BOW,
/* 12 */ BEAVER_ANIM_IDLE_FACE_LEFT,
- /* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT,
+ /* 13 */ BEAVER_ANIM_IDLE_FACE_RIGHT
} BeaverAnimation;
static AnimationSpeedInfo sAnimationInfo[] = {
@@ -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) {
@@ -1792,13 +1794,16 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
func_80A98DA4, func_80A98E48, &this->actor);
} else {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sYoungerBrotherEyeTextures[this->unk_37E]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sYoungerBrotherBeltTextures[this->unk_380]));
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
func_80A98DA4, func_80A98E48, &this->actor);
+
CLOSE_DISPS(play->state.gfxCtx);
}
OPEN_DISPS(play->state.gfxCtx);
+
if ((this->actor.depthInWater >= 28.0f) && (this->actor.speed > 0.5f)) {
Matrix_Translate(this->unk_3B4.x, this->unk_3B4.y, this->unk_3B4.z, MTXMODE_NEW);
Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_APPLY);
@@ -1806,7 +1811,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;
@@ -1853,6 +1858,7 @@ void EnAz_Draw(Actor* thisx, PlayState* play2) {
gSPDisplayList(POLY_XLU_DISP++, gBeaverYoungerBrotherTailSplashDL);
}
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
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..e62cc45f4 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.c
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.c
@@ -293,9 +293,9 @@ void EnBaba_HandleConversation(EnBaba* this, PlayState* play) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_END_CONVERSATION) {
if (this->stateFlags & BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK) {
this->stateFlags &= ~BOMB_SHOP_LADY_STATE_GAVE_BLAST_MASK;
- func_80151BB4(play, 0x33);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK);
}
- func_80151BB4(play, 4);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY);
}
}
@@ -511,7 +511,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
} else if (play->sceneId == SCENE_BACKTOWN) {
if ((BOMB_SHOP_LADY_GET_TYPE(&this->actor) == BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE) &&
(gSaveContext.save.entrance != ENTRANCE(NORTH_CLOCK_TOWN, 7)) &&
- (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F)) {
+ (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != BOMB_SHOP_LADY_PATH_INDEX_NONE)) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_58_40) ||
(gSaveContext.save.time >= CLOCK_TIME(0, 20) && (gSaveContext.save.time < CLOCK_TIME(6, 0)))) {
Actor_Kill(&this->actor);
@@ -550,7 +550,7 @@ void EnBaba_FinishInit(EnBaba* this, PlayState* play) {
this->animIndex = BOMB_SHOP_LADY_ANIM_SWAY;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnBaba_DoNothing;
- } else if (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != 0x3F) {
+ } else if (BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor) != BOMB_SHOP_LADY_PATH_INDEX_NONE) {
this->animIndex = BOMB_SHOP_LADY_ANIM_WALKING_HOLDING_BAG;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->actionFunc = EnBaba_Walk;
@@ -602,7 +602,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
if (this->stateFlags & BOMB_SHOP_LADY_STATE_AUTOTALK) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_02);
EnBaba_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
return;
@@ -625,7 +625,7 @@ void EnBaba_Talk(EnBaba* this, PlayState* play) {
}
}
} else if (talkState == TEXT_STATE_DONE) {
- if (Message_ShouldAdvance(play) && (play->msgCtx.unk120B1 == 0)) {
+ if (Message_ShouldAdvance(play) && (play->msgCtx.bombersNotebookEventQueueCount == 0)) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_02);
EnBaba_TriggerTransition(play, ENTRANCE(NORTH_CLOCK_TOWN, 7));
}
@@ -728,7 +728,7 @@ void EnBaba_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, BOMB_SHOP_LADY_GET_PATH_INDEX(&this->actor), BOMB_SHOP_LADY_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
@@ -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_Baba/z_en_baba.h b/src/overlays/actors/ovl_En_Baba/z_en_baba.h
index 7da0ed054..9618dd3a2 100644
--- a/src/overlays/actors/ovl_En_Baba/z_en_baba.h
+++ b/src/overlays/actors/ovl_En_Baba/z_en_baba.h
@@ -12,6 +12,8 @@ typedef void (*EnBabaActionFunc)(struct EnBaba*, PlayState*);
#define BOMB_SHOP_LADY_GET_PATH_INDEX(thisx) (((thisx)->params & 0x3F00) >> 8)
#define BOMB_SHOP_LADY_GET_TYPE(thisx) (((thisx)->params & 0xC000) >> 0xE)
+#define BOMB_SHOP_LADY_PATH_INDEX_NONE 0x3F
+
// Types BOMB_SHOP_LADY_TYPE_FOLLOW_SCHEDULE and BOMB_SHOP_LADY_TYPE_IDLE can only be used in SCENE_BACKTOWN
// Type BOMB_SHOP_LADY_TYPE_SWAY can be used anywhere except SCENE_BACKTOWN and SCENE_BOMYA
typedef enum {
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..406270ff8 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -27,18 +27,18 @@ void EnBaguo_UpdateEffects(EnBaguo* this, PlayState* play);
void EnBaguo_DrawEffects(EnBaguo* this, PlayState* play);
typedef enum {
- /* 0x0 */ NEJIRON_ACTION_INACTIVE, // The Nejiron is either underground or emerging from underground
- /* 0x1 */ NEJIRON_ACTION_ACTIVE, // The Nejiron is above ground and actively chasing the player
- /* 0x2 */ NEJIRON_ACTION_RETREATING, // The Nejiron is burrowing back underground
- /* 0x3 */ NEJIRON_ACTION_EXPLODING // The Nejiron has detonated
+ /* 0 */ NEJIRON_ACTION_INACTIVE, // The Nejiron is either underground or emerging from underground
+ /* 1 */ NEJIRON_ACTION_ACTIVE, // The Nejiron is above ground and actively chasing the player
+ /* 2 */ NEJIRON_ACTION_RETREATING, // The Nejiron is burrowing back underground
+ /* 3 */ NEJIRON_ACTION_EXPLODING // The Nejiron has detonated
} NejironAction;
/**
* These directions are relative to the Nejiron.
*/
typedef enum {
- /* 0x0 */ NEJIRON_DIRECTION_RIGHT,
- /* 0x1 */ NEJIRON_DIRECTION_LEFT
+ /* 0 */ NEJIRON_DIRECTION_RIGHT,
+ /* 1 */ NEJIRON_DIRECTION_LEFT
} NejironRollDirection;
ActorInit En_Baguo_InitVars = {
@@ -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;
@@ -449,9 +449,9 @@ void EnBaguo_InitializeEffect(EnBaguo* this, Vec3f* pos, Vec3f* velocity, Vec3f*
effect->accel = *accel;
effect->scale = scale;
effect->timer = timer;
- effect->rotation.x = (s16)randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.y = (s16)randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.z = (s16)randPlusMinusPoint5Scaled(30000.0f);
+ effect->rotation.x = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rotation.y = (s16)(s32)Rand_CenteredFloat(0x7530);
+ effect->rotation.z = (s16)(s32)Rand_CenteredFloat(0x7530);
return;
}
}
@@ -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..acb47b743 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)
@@ -162,11 +161,10 @@ void EnBat_Init(Actor* thisx, PlayState* play) {
EnBat_SetupFlyIdle(this);
while (BAD_BAT_GET_NUMBER_TO_SPAWN(thisx) > 1) {
Actor_SpawnAsChildAndCutscene(
- &play->actorCtx, play, ACTOR_EN_BAT, thisx->world.pos.x + randPlusMinusPoint5Scaled(200.0f),
- thisx->world.pos.y + randPlusMinusPoint5Scaled(100.0f),
- thisx->world.pos.z + randPlusMinusPoint5Scaled(200.0f), randPlusMinusPoint5Scaled(0x2000),
- 0xFFFF * Rand_ZeroOne(), 0, BAD_BAT_PARAMS(this->switchFlag, this->paramFlags, 0), CS_ID_NONE,
- thisx->halfDaysBits, NULL);
+ &play->actorCtx, play, ACTOR_EN_BAT, thisx->world.pos.x + Rand_CenteredFloat(200.0f),
+ thisx->world.pos.y + Rand_CenteredFloat(100.0f), thisx->world.pos.z + Rand_CenteredFloat(200.0f),
+ Rand_CenteredFloat(0x2000), 0xFFFF * Rand_ZeroOne(), 0,
+ BAD_BAT_PARAMS(this->switchFlag, this->paramFlags, 0), CS_ID_NONE, thisx->halfDaysBits, NULL);
BAD_BAT_GET_NUMBER_TO_SPAWN(thisx)--;
}
}
@@ -531,7 +529,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..c1d13be5a 100644
--- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c
+++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c
@@ -32,7 +32,7 @@ void EnBb_Revive(EnBb* this, PlayState* play);
typedef enum {
/* -1 */ BB_BODY_PART_DRAW_STATUS_BROKEN = -1,
/* 0 */ BB_BODY_PART_DRAW_STATUS_ALIVE,
- /* 1 */ BB_BODY_PART_DRAW_STATUS_DEAD,
+ /* 1 */ BB_BODY_PART_DRAW_STATUS_DEAD
} EnBbBodyPartDrawStatus;
ActorInit En_Bb_InitVars = {
@@ -73,7 +73,7 @@ typedef enum {
/* 0x3 */ EN_BB_DMGEFF_ICE_ARROW = 0x3,
/* 0x4 */ EN_BB_DMGEFF_LIGHT_ARROW,
/* 0x5 */ EN_BB_DMGEFF_ZORA_MAGIC,
- /* 0xE */ EN_BB_DMGEFF_HOOKSHOT = 0xE,
+ /* 0xE */ EN_BB_DMGEFF_HOOKSHOT = 0xE
} EnBbDamageEffect;
static DamageTable sDamageTable = {
@@ -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..d124f0b77 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
@@ -162,7 +162,7 @@ void EnBba01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnBba01_Draw;
this->waitingOnInit = false;
- if (ENBBA01_GET_PATH(&this->actor) == 0x3F) {
+ if (ENBBA01_GET_PATH_INDEX(&this->actor) == ENBBA01_PATH_INDEX_NONE) {
this->actionFunc = EnBba01_FaceFoward;
} else {
this->actionFunc = EnBba01_Walk;
@@ -227,7 +227,7 @@ void EnBba01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1;
- this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH(&this->enHy.actor), 0x3F);
+ this->enHy.path = SubS_GetPathByIndex(play, ENBBA01_GET_PATH_INDEX(&this->enHy.actor), ENBBA01_PATH_INDEX_NONE);
this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnBba01_FinishInit;
@@ -261,11 +261,14 @@ s32 EnBba01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (limbIndex == BBA_LIMB_RIGHT_LOWER_ARM_ROOT) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
+
if (limbIndex == BBA_LIMB_RIGHT_LOWER_ARM_ROOT) {
Matrix_Translate(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateXS(this->enHy.headRot.y, MTXMODE_APPLY);
@@ -297,8 +300,10 @@ void EnBba01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
if (limbIndex == BBA_LIMB_HEAD) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -318,7 +323,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_Bba_01/z_en_bba_01.h b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
index 7160594d8..0cc158f2a 100644
--- a/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
+++ b/src/overlays/actors/ovl_En_Bba_01/z_en_bba_01.h
@@ -7,7 +7,9 @@ struct EnBba01;
typedef void (*EnBba01ActionFunc)(struct EnBba01*, PlayState*);
-#define ENBBA01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENBBA01_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENBBA01_PATH_INDEX_NONE 0x3F
typedef struct EnBba01 {
/* 0x000 */ EnHy enHy;
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..d52f12ccf 100644
--- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
+++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c
@@ -32,7 +32,7 @@ void EnBbfall_Frozen(EnBbfall* this, PlayState* play);
typedef enum {
/* -1 */ BBFALL_BODY_PART_DRAW_STATUS_BROKEN = -1,
/* 0 */ BBFALL_BODY_PART_DRAW_STATUS_ALIVE,
- /* 1 */ BBFALL_BODY_PART_DRAW_STATUS_DEAD,
+ /* 1 */ BBFALL_BODY_PART_DRAW_STATUS_DEAD
} EnBbfallBodyPartDrawStatus;
ActorInit En_Bbfall_InitVars = {
@@ -102,7 +102,7 @@ typedef enum {
/* 0x3 */ EN_BBFALL_DMGEFF_ICE_ARROW = 0x3,
/* 0x4 */ EN_BBFALL_DMGEFF_LIGHT_ARROW,
/* 0x5 */ EN_BBFALL_DMGEFF_ZORA_MAGIC,
- /* 0xE */ EN_BBFALL_DMGEFF_HOOKSHOT = 0xE,
+ /* 0xE */ EN_BBFALL_DMGEFF_HOOKSHOT = 0xE
} EnBbfallDamageEffect;
static DamageTable sDamageTable = {
@@ -340,7 +340,7 @@ void EnBbfall_Fly(EnBbfall* this, PlayState* play) {
// Bounce upwards off the ground
this->actor.velocity.y *= -1.2f;
this->actor.velocity.y = CLAMP(this->actor.velocity.y, 8.0f, 12.0f);
- this->actor.shape.rot.y += (s16)randPlusMinusPoint5Scaled(73728.0f);
+ this->actor.shape.rot.y += (s16)(s32)Rand_CenteredFloat(0x12000);
}
this->actor.bgCheckFlags &= ~BGCHECKFLAG_GROUND;
@@ -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..1c2d1ed0f 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.c
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.c
@@ -158,9 +158,9 @@ void EnBee_FlyIdle(EnBee* this, PlayState* play) {
nextPos.z += Math_CosS(this->targetYaw) * 30.0f;
if ((this->instanceId % 2) == 0) {
- this->targetYaw += (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ this->targetYaw += (s16)((s32)Rand_CenteredFloat(1000.0f) + 4000);
} else {
- this->targetYaw -= (s16)((s32)randPlusMinusPoint5Scaled(1000.0f) + 4000);
+ this->targetYaw -= (s16)((s32)Rand_CenteredFloat(1000.0f) + 4000);
}
this->flightHoverOffset += 1000;
@@ -197,10 +197,10 @@ void EnBee_Attack(EnBee* this, PlayState* play) {
yawOffset = (this->instanceId * 0x700) + 0x2000;
for (i = 0; i < 2; i++) {
- rand = randPlusMinusPoint5Scaled(20.0f);
+ rand = Rand_CenteredFloat(20.0f);
nextPos.x += Math_SinS((f32)this->actor.yawTowardsPlayer + this->targetYaw + yawOffset) * (rand + 30.0f);
nextPos.y = (Math_SinS(this->flightHoverOffset) * 10.0f) + (player->actor.floorHeight + 40.0f);
- rand = randPlusMinusPoint5Scaled(20.0f);
+ rand = Rand_CenteredFloat(20.0f);
nextPos.z += Math_CosS((f32)this->actor.yawTowardsPlayer + this->targetYaw + yawOffset) * (rand + 30.0f);
Math_Vec3f_Copy(&this->targetPos[i], &nextPos);
@@ -210,14 +210,12 @@ void EnBee_Attack(EnBee* this, PlayState* play) {
Math_Vec3f_Copy(&nextPos, &this->targetPos[this->posIndex]);
if ((this->instanceId % 2) == 0) {
- this->targetYaw +=
- (this->instanceId * 0x700) + (s32)randPlusMinusPoint5Scaled((this->instanceId * 0x700) * 0.5f);
+ this->targetYaw += (this->instanceId * 0x700) + (s32)Rand_CenteredFloat((this->instanceId * 0x700) * 0.5f);
} else {
- this->targetYaw -=
- (this->instanceId * 0x700) + (s32)randPlusMinusPoint5Scaled((this->instanceId * 0x700) * 0.5f);
+ this->targetYaw -= (this->instanceId * 0x700) + (s32)Rand_CenteredFloat((this->instanceId * 0x700) * 0.5f);
}
- this->flightHoverOffset += (s32)randPlusMinusPoint5Scaled(500.0f) + 1000;
+ this->flightHoverOffset += (s32)Rand_CenteredFloat(500.0f) + 1000;
if (this->targetYaw > 0x10000) {
this->targetYaw = 0;
@@ -284,7 +282,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_Bee/z_en_bee.h b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
index 09d9ef931..b1773a5ca 100644
--- a/src/overlays/actors/ovl_En_Bee/z_en_bee.h
+++ b/src/overlays/actors/ovl_En_Bee/z_en_bee.h
@@ -9,8 +9,8 @@ struct EnBee;
typedef void (*EnBeeActionFunc)(struct EnBee*, PlayState*);
typedef enum {
- /* 0 */ BEE_BEHAVIOR_IDLE = 0,
- /* 1 */ BEE_BEHAVIOR_ATTACK,
+ /* 0 */ BEE_BEHAVIOR_IDLE,
+ /* 1 */ BEE_BEHAVIOR_ATTACK
} BeeBehaviorType;
typedef struct EnBee {
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..6d99ada15 100644
--- a/src/overlays/actors/ovl_En_Bh/z_en_bh.c
+++ b/src/overlays/actors/ovl_En_Bh/z_en_bh.c
@@ -59,9 +59,9 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
xzDist = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timer2 == 0) || (xzDist < 100.0f)) {
- this->pos.x = randPlusMinusPoint5Scaled(300.0f) + this->actor.home.pos.x;
- this->pos.y = randPlusMinusPoint5Scaled(100.0f) + this->actor.home.pos.y;
- this->pos.z = randPlusMinusPoint5Scaled(300.0f) + this->actor.home.pos.z;
+ this->pos.x = Rand_CenteredFloat(300.0f) + this->actor.home.pos.x;
+ this->pos.y = Rand_CenteredFloat(100.0f) + this->actor.home.pos.y;
+ this->pos.z = Rand_CenteredFloat(300.0f) + this->actor.home.pos.z;
this->timer2 = Rand_ZeroFloat(50.0f) + 30.0f;
this->step = 0;
}
@@ -85,7 +85,7 @@ void func_80C22DEC(EnBh* this, PlayState* play) {
this->skelanime.playSpeed = 1.0f;
this->timer = Rand_ZeroFloat(70.0f) + 50.0f;
} else if (((this->timer & 7) == 7) && (Rand_ZeroOne() < 0.5f)) {
- this->unk1E4 = randPlusMinusPoint5Scaled(3000.0f);
+ this->unk1E4 = Rand_CenteredFloat(3000.0f);
}
} else {
SkelAnime_Update(&this->skelanime);
@@ -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..1b849799a 100644
--- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
+++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c
@@ -436,9 +436,9 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) {
bubblePos.y = this->picto.actor.world.pos.y;
for (i = 0; i < 20; i++) {
- bubbleVel.x = randPlusMinusPoint5Scaled(10.0f);
+ bubbleVel.x = Rand_CenteredFloat(10.0f);
bubbleVel.y = Rand_ZeroFloat(5.5f) + 5.5f;
- bubbleVel.z = randPlusMinusPoint5Scaled(10.0f);
+ bubbleVel.z = Rand_CenteredFloat(10.0f);
bubblePos.x = this->picto.actor.world.pos.x + (2.0f * bubbleVel.x);
bubblePos.z = this->picto.actor.world.pos.z + (2.0f * bubbleVel.z);
@@ -604,7 +604,7 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
MTXMODE_APPLY);
}
} else if (this->actionFunc == EnBigokuta_SuckInPlayer) {
- f32 sin = sin_rad(this->timer * (M_PI / 3.0f)) * 0.5f;
+ f32 sin = Math_SinF(this->timer * (M_PI / 3.0f)) * 0.5f;
Matrix_Scale(((this->timer * (2 / 90.0f)) * (0.5f + sin)) + 1.0f,
((this->timer * (2 / 90.0f)) * (0.5f - sin)) + 1.0f, 1.0f - ((this->timer * 0.3f) / 9.0f),
@@ -613,7 +613,7 @@ s32 EnBigokuta_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
if (this->timer == 0) {
Matrix_Scale(0.9f, 0.9f, 1.15f, MTXMODE_APPLY);
} else if (this->timer > 0) {
- f32 sin = sin_rad(this->timer * (M_PI / 3.0f)) * 0.5f;
+ f32 sin = Math_SinF(this->timer * (M_PI / 3.0f)) * 0.5f;
Matrix_Scale(((0.5f + sin) * 0.2f) + 1.0f, ((0.5f - sin) * 0.2f) + 1.0f, 0.7f, MTXMODE_APPLY);
} else {
@@ -657,10 +657,11 @@ void EnBigokuta_Draw(Actor* thisx, PlayState* play) {
Gfx* gfx;
OPEN_DISPS(play->state.gfxCtx);
+
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 +669,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..3daaf1f85 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.c
@@ -267,7 +267,7 @@ void func_80A27B58(EnBigpamet* this) {
this->unk_2A2 = 40;
for (ptr = &this->unk_2FC[0], i = 0; i < ARRAY_COUNT(this->unk_2FC); i++, ptr++) {
- temp_s1 = (s32)randPlusMinusPoint5Scaled(20480.0f) + this->actor.wallYaw;
+ temp_s1 = (s32)Rand_CenteredFloat(0x5000) + this->actor.wallYaw;
temp_s2 = Rand_S16Offset(0x1000, 0x3000);
temp_fs2 = Math_SinS(temp_s2);
@@ -342,7 +342,7 @@ void func_80A27FE8(EnBigpamet* this, PlayState* play) {
pos.y += 8.0f;
if (this->actionFunc != func_80A28D0C) {
- sp32 = (s32)randPlusMinusPoint5Scaled(0x8000) + this->actor.world.rot.y;
+ sp32 = (s32)Rand_CenteredFloat(0x8000) + this->actor.world.rot.y;
pos.x -= 55.0f * Math_SinS(sp32);
pos.z -= 55.0f * Math_CosS(sp32);
}
@@ -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_Bigpamet/z_en_bigpamet.h b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
index bb9d29280..a3561c33b 100644
--- a/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
+++ b/src/overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h
@@ -8,10 +8,10 @@ struct EnBigpamet;
typedef void (*EnBigpametActionFunc)(struct EnBigpamet*, PlayState*);
-enum {
+typedef enum {
/* 0 */ ENBIGPAMET_0,
- /* 1 */ ENBIGPAMET_1,
-};
+ /* 1 */ ENBIGPAMET_1
+} EnBigpametParam;
typedef struct {
/* 0x00 */ Vec3f unk_00;
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..762141ed4 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)
@@ -375,7 +375,6 @@ void EnBigpo_SpawnCutsceneStage4(EnBigpo* this, PlayState* play) {
this->actor.shape.rot.y += this->rotVelocity;
EnBigpo_RotateSpawnCutsceneFires(this);
- if (1) {}
for (i = 0; i < ARRAY_COUNT(this->fires); i++) {
this->fires[i].pos.y += this->actor.velocity.y;
}
@@ -555,7 +554,7 @@ void EnBigpo_IdleFlying(EnBigpo* this, PlayState* play) {
// flight position calculations
this->hoverHeightCycleTimer = (this->hoverHeightCycleTimer == 0) ? 40 : (this->hoverHeightCycleTimer - 1);
Math_StepToF(&this->savedHeight, player->actor.world.pos.y + 100.0f, 1.5f);
- this->actor.world.pos.y = (sin_rad(this->hoverHeightCycleTimer * (M_PI / 20)) * 10.0f) + this->savedHeight;
+ this->actor.world.pos.y = (Math_SinF(this->hoverHeightCycleTimer * (M_PI / 20)) * 10.0f) + this->savedHeight;
Math_StepToF(&this->actor.speed, 3.0f, 0.2f);
func_800B9010(&this->actor, NA_SE_EN_PO_FLY - SFX_FLAG);
if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 300.0f) {
@@ -828,7 +827,7 @@ void EnBigpo_ScoopSoulIdle(EnBigpo* this, PlayState* play) {
EnBigpo_SetupScoopSoulLeaving(this);
} else {
Actor_OfferGetItem(&this->actor, play, GI_MAX, 35.0f, 60.0f);
- this->actor.world.pos.y = (sin_rad(this->idleTimer * (M_PI / 20)) * 5.0f) + this->savedHeight;
+ this->actor.world.pos.y = (Math_SinF(this->idleTimer * (M_PI / 20)) * 5.0f) + this->savedHeight;
}
}
@@ -861,7 +860,7 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
// count the number of possible fires we can find (4 in vanilla)
for (enemyPtr = GET_FIRST_ENEMY(play); enemyPtr != NULL; enemyPtr = enemyPtr->next) {
- if (enemyPtr->id == ACTOR_EN_BIGPO && enemyPtr->params == ENBIGPO_POSSIBLEFIRE) {
+ if ((enemyPtr->id == ACTOR_EN_BIGPO) && (enemyPtr->params == ENBIGPO_POSSIBLEFIRE)) {
fireCount++;
}
}
@@ -882,7 +881,7 @@ void EnBigpo_SelectRandomFireLocations(EnBigpo* this, PlayState* play) {
randomIndex = ((s32)Rand_ZeroFloat(fireCount)) % fireCount;
while (enemyPtr != NULL) {
- if (enemyPtr->id == ACTOR_EN_BIGPO && enemyPtr->params == ENBIGPO_POSSIBLEFIRE) {
+ if ((enemyPtr->id == ACTOR_EN_BIGPO) && (enemyPtr->params == ENBIGPO_POSSIBLEFIRE)) {
if (randomIndex == 0) {
randomFirePo = (EnBigpo*)enemyPtr;
randomFirePo->actor.params = ENBIGPO_CHOSENFIRE;
@@ -1225,8 +1224,8 @@ s32 EnBigpo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
Gfx** gfx) {
EnBigpo* this = THIS;
// not fully invisible
- if (!(this->mainColor.a != 0 && limbIndex != 7) ||
- (this->actionFunc == EnBigpo_BurnAwayDeath && this->idleTimer >= 2)) {
+ if ((this->mainColor.a == 0) || (limbIndex == 7) ||
+ ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2))) {
*dList = NULL;
}
return false;
@@ -1291,7 +1290,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 +1300,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 +1329,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 +1381,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));
@@ -1416,9 +1415,10 @@ void EnBigpo_DrawCircleFlames(Actor* thisx, PlayState* play) {
s32 i;
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_Bigpo/z_en_bigpo.h b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
index 9b84784f4..b532d6d08 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.h
@@ -53,16 +53,16 @@ typedef struct EnBigpo {
/* 0x338 */ EnBigpoFireEffect fires[3];
} EnBigpo; // size = 0x398
-// well ver is regular, dampe basement ver is summoned
-// on spawn, 3/possible fires are turned into chosenfire
-enum EnBigpoType {
+// well version is "regular" (spawns automatically), dampe basement version is "summoned"
+// on room enter, 3 "possiblefire" are turned into "chosenfire" at random
+typedef enum EnBigpoType {
/* 0 */ ENBIGPO_REGULAR,
/* 1 */ ENBIGPO_SUMMONED,
/* 2 */ ENBIGPO_POSSIBLEFIRE,
/* 3 */ ENBIGPO_CHOSENFIRE,
/* 4 */ ENBIGPO_REVEALEDFIRE,
- /* 5 */ ENBIGPO_UNK5,
-};
+ /* 5 */ ENBIGPO_UNK5
+} EnBigpoType;
#define BIGPO_GET_SWITCHFLAGS(thisx) (u8)((thisx)->params >> 0x8)
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..695ac9153 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -254,7 +254,7 @@ typedef enum {
/* 0x5 */ BIGSLIME_DMGEFF_ELECTRIC_STUN,
/* 0xD */ BIGSLIME_DMGEFF_DEKU_STUN = 0xD,
/* 0xE */ BIGSLIME_DMGEFF_HOOKSHOT,
- /* 0xF */ BIGSLIME_DMGEFF_BREAK_ICE,
+ /* 0xF */ BIGSLIME_DMGEFF_BREAK_ICE
} BigslimeDamageEffect;
static DamageTable sDamageTable = {
@@ -657,7 +657,7 @@ void EnBigslime_AddWavySurface(EnBigslime* this) {
randFloat = (Rand_ZeroOne() * 40.0f) + 50.0f;
}
- this->vtxSurfacePerturbation[i] = sin_rad((randInt + i) * (M_PI / 3)) * randFloat * 0.001f;
+ this->vtxSurfacePerturbation[i] = Math_SinF((randInt + i) * (M_PI / 3)) * randFloat * 0.001f;
}
}
@@ -673,7 +673,7 @@ void EnBigslime_UpdateWavySurface(EnBigslime* this) {
}
this->wavySurfaceTimer--;
- vtxSurfaceWave = sin_rad(this->wavySurfaceTimer * (M_PI / 12));
+ vtxSurfaceWave = Math_SinF(this->wavySurfaceTimer * (M_PI / 12));
for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
staticVtx = &sBigslimeStaticVtx[i];
dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
@@ -692,9 +692,9 @@ void EnBigslime_InitFallMinislime(EnBigslime* this) {
for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
minislime = this->minislime[i];
minislime->actor.params = MINISLIME_INIT_FALL;
- minislime->actor.world.pos.x = randPlusMinusPoint5Scaled(80.0f) + (GBT_ROOM_5_MIN_X + ((i % 4) + 1) * 192.0f);
+ minislime->actor.world.pos.x = Rand_CenteredFloat(80.0f) + (GBT_ROOM_5_MIN_X + ((i % 4) + 1) * 192.0f);
minislime->actor.world.pos.y = Rand_ZeroFloat(250.0f) + (GBT_ROOM_5_CENTER_Y + 50.0f);
- minislime->actor.world.pos.z = randPlusMinusPoint5Scaled(80.0f) + (GBT_ROOM_5_MIN_Z + ((i / 4) + 1) * 192.0f);
+ minislime->actor.world.pos.z = Rand_CenteredFloat(80.0f) + (GBT_ROOM_5_MIN_Z + ((i / 4) + 1) * 192.0f);
}
this->minislimeState = MINISLIME_ACTIVE_INIT_STATE;
@@ -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);
@@ -1169,7 +1169,7 @@ void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
s32 j;
for (i = 0; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- vtxY = (((cos_rad(i * (M_PI / 6)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
+ vtxY = (((Math_CosF(i * (M_PI / 6)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1188,7 +1188,7 @@ void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
}
for (; i < BIGSLIME_NUM_RING_VTX; i++) {
- vtxY = ((cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 16)) * 0.05f) + -1.0f) * BIGSLIME_RADIUS_F;
+ vtxY = ((Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 16)) * 0.05f) + -1.0f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1301,7 +1301,7 @@ void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this) {
sBigslimeTargetVtx[0].n.ob[2] = 0;
for (i = 1; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- upperSphereCos = (((cos_rad((i - 1) * (M_PI / 5)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
+ upperSphereCos = (((Math_CosF((i - 1) * (M_PI / 5)) + 1.0f) * 0.925f) + -0.85f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1318,7 +1318,7 @@ void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this) {
}
for (; i < BIGSLIME_NUM_RING_FACES; i++) {
- lowerSphereCos = cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / BIGSLIME_NUM_RING_FACES));
+ lowerSphereCos = Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / BIGSLIME_NUM_RING_FACES));
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1361,7 +1361,7 @@ void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this) {
sBigslimeTargetVtx[0].n.ob[2] = 0;
for (i = 1; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
- upperSphereCos = cos_rad((i - 1) * (M_PI / 10));
+ upperSphereCos = Math_CosF((i - 1) * (M_PI / 10));
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1374,7 +1374,7 @@ void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this) {
for (; i < BIGSLIME_NUM_RING_FACES; i++) {
lowerSphereCos =
- (((cos_rad((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 5)) + 1) * 0.925f) + -1.0f) * BIGSLIME_RADIUS_F;
+ (((Math_CosF((i - BIGSLIME_NUM_RING_FACES / 2) * (M_PI / 5)) + 1) * 0.925f) + -1.0f) * BIGSLIME_RADIUS_F;
for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
staticVtx = &sBigslimeStaticVtx[j];
targetVtx = &sBigslimeTargetVtx[j];
@@ -1692,7 +1692,7 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
EnBigslime_UpdateCameraGrabPlayer(this, play);
if (this->windupPunchTimer > 0) {
invWindupPunchTimer = 1.0f / this->windupPunchTimer;
- scale = cos_rad(this->windupPunchTimer * (M_PI / 27)) + 1.0f;
+ scale = Math_CosF(this->windupPunchTimer * (M_PI / 27)) + 1.0f;
player->actor.world.pos.y = this->actor.world.pos.y + (this->actor.scale.y * -500.0f);
// Linearly interpolate gekkoRot.y --> this->actor.world.rot.y
@@ -1705,7 +1705,7 @@ void EnBigslime_WindupThrowPlayer(EnBigslime* this, PlayState* play) {
EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_PUNCH1);
}
- scale = 0.5f - cos_rad(-this->windupPunchTimer * (M_PI / 5)) * 0.5f;
+ scale = 0.5f - Math_CosF(-this->windupPunchTimer * (M_PI / 5)) * 0.5f;
if (this->windupPunchTimer == -5) {
if (player->stateFlags2 & PLAYER_STATE2_80) {
player->actor.parent = NULL;
@@ -1879,7 +1879,7 @@ void EnBigslime_Freeze(EnBigslime* this, PlayState* play) {
if (vtxIceSeed < BIGSLIME_NUM_VTX) {
dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][vtxIceSeed];
targetVtx = &sBigslimeTargetVtx[vtxIceSeed];
- randFloat = randPlusMinusPoint5Scaled(40.0f);
+ randFloat = Rand_CenteredFloat(40.0f);
dynamicVtx->n.ob[0] += (s16)(randFloat / this->actor.scale.x);
dynamicVtx->n.ob[1] += (s16)(randFloat / this->actor.scale.y);
dynamicVtx->n.ob[2] += (s16)(randFloat / this->actor.scale.z);
@@ -2444,9 +2444,9 @@ void EnBigslime_SetupFrogSpawn(EnBigslime* this, PlayState* play) {
func_800B0DE0(play, &dustPos, &gZeroVec3f, &gZeroVec3f, &dustPrimColor, &dustEnvColor, 500, 50);
for (i = 0; i < 25; i++) {
- hahenVel.x = randPlusMinusPoint5Scaled(5.0f);
+ hahenVel.x = Rand_CenteredFloat(5.0f);
hahenVel.y = Rand_ZeroFloat(3.0f) + 4.0f;
- hahenVel.z = randPlusMinusPoint5Scaled(5.0f);
+ hahenVel.z = Rand_CenteredFloat(5.0f);
EffectSsHahen_Spawn(play, worldPos, &hahenVel, &hahenAccel, 0, Rand_S16Offset(12, 3), HAHEN_OBJECT_DEFAULT, 10,
0);
}
@@ -2464,7 +2464,8 @@ void EnBigslime_FrogSpawn(EnBigslime* this, PlayState* play) {
this->spawnFrogTimer--;
// Zoom the camera in and out at the newly spawned red frog
- subCamZoom = sin_rad(this->spawnFrogTimer * (M_PI / 5)) * ((0.04f * (this->spawnFrogTimer * 0.1f)) + 0.02f) + 1.0f;
+ subCamZoom =
+ Math_SinF(this->spawnFrogTimer * (M_PI / 5)) * ((0.04f * (this->spawnFrogTimer * 0.1f)) + 0.02f) + 1.0f;
subCamEye.x = subCam->at.x + (this->subCamDistToFrog.x * subCamZoom);
subCamEye.z = subCam->at.z + (this->subCamDistToFrog.z * subCamZoom);
subCamEye.y = subCam->at.y + (this->subCamDistToFrog.y * subCamZoom);
@@ -2884,7 +2885,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 +2909,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 +2939,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 +2967,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 +2985,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 +3024,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 +3077,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 +3130,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_Bigslime/z_en_bigslime.h b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
index f10938b37..8f2b5bee3 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
@@ -87,7 +87,7 @@ typedef struct EnBigslime {
s16 isDespawned;
s16 isInitJump;
};
- /* 0x02BC */ s16 wavySurfaceTimer; // decrements from 24, used in sin_rad for currData2
+ /* 0x02BC */ s16 wavySurfaceTimer; // decrements from 24, used in Math_SinF for currData2
/* 0x02BE */ s16 stunTimer;
/* 0x02C0 */ union {
s16 freezeTimer;
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..ef5c9c0e2 100644
--- a/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
+++ b/src/overlays/actors/ovl_En_Bjt/z_en_bjt.c
@@ -229,7 +229,7 @@ typedef enum {
/* 1 */ TOILET_HAND_BEHAVIOUR_TAKE_ITEM, // take paper and disappear to use it
/* 2 */ TOILET_HAND_BEHAVIOUR_USE_ITEM, // using paper, flushing
/* 3 */ TOILET_HAND_BEHAVIOUR_REAPPEAR, // reappear with reward
- /* 4 */ TOILET_HAND_BEHAVIOUR_REWARD_GIVEN,
+ /* 4 */ TOILET_HAND_BEHAVIOUR_REWARD_GIVEN
} ToiletHandBehaviour;
// msgevent callback/communication. Follow and choose parts of script to run
@@ -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..d11547230 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,
+ /* 1 */ BOMB_TYPE_EXPLOSION
} BombType;
+// Passed via x rotation
+typedef enum BombExplosiveType {
+ /* 0 */ BOMB_EXPLOSIVE_TYPE_BOMB,
+ /* 1 */ BOMB_EXPLOSIVE_TYPE_POWDER_KEG
+} BombExplosiveType;
+
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..19f2e1d9b 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
@@ -93,8 +93,8 @@ void EnBomBowlMan_Init(Actor* thisx, PlayState* play) {
return;
}
- this->unk_29A = ENBOMBOWLMAN_GET_FF00(&this->actor);
- this->path = SubS_GetPathByIndex(play, this->unk_29A, 0x3F);
+ this->pathIndex = ENBOMBOWLMAN_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENBOMBOWLMAN_PATH_INDEX_NONE);
this->unk_2C8 = 80.0f;
if ((gSaveContext.save.entrance == ENTRANCE(EAST_CLOCK_TOWN, 2)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_73_80) &&
@@ -156,7 +156,7 @@ void func_809C4B50(EnBomBowlMan* this) {
}
void func_809C4B6C(EnBomBowlMan* this) {
- if ((this->unk_29A != ENBOMBOWLMAN_FF00_MINUS1) && (this->path != NULL)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
if (!SubS_CopyPointFromPath(this->path, this->unk_298, &this->unk_2A0)) {
Actor_Kill(&this->actor);
}
@@ -309,9 +309,9 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
break;
case 5:
- func_80151BB4(play, 0x24);
- func_80151BB4(play, 0x25);
- func_80151BB4(play, 0);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS);
this->actionFunc = func_809C51B4;
sp28 = true;
break;
@@ -330,7 +330,7 @@ void func_809C4DA4(EnBomBowlMan* this, PlayState* play) {
void func_809C51B4(EnBomBowlMan* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if ((play->msgCtx.unk120B1 == 0) &&
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
play->nextEntrance = Entrance_CreateFromSpawn(6);
gSaveContext.nextCutsceneIndex = 0;
@@ -432,9 +432,9 @@ void func_809C5598(EnBomBowlMan* this, PlayState* play) {
} else if (this->actor.textId == 0x735) {
this->unk_2C2 = 0;
func_809C493C(this, 17, 1.0f);
- func_80151BB4(play, 0x24);
- func_80151BB4(play, 0x25);
- func_80151BB4(play, 0);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS);
func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
this->actionFunc = func_809C5738;
return;
@@ -448,7 +448,7 @@ void func_809C5738(EnBomBowlMan* this, PlayState* play) {
s16 yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_2A0);
if (this->unk_2C2 == 0) {
- if ((play->msgCtx.unk120B1 == 0) &&
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) &&
((play->msgCtx.msgMode == 0) || (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE))) {
this->unk_2C2 = 1;
func_809C4B6C(this);
@@ -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_Bowl_Man/z_en_bom_bowl_man.h b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
index e958b84a1..df515ef4f 100644
--- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
+++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h
@@ -9,13 +9,13 @@ typedef void (*EnBomBowlManActionFunc)(struct EnBomBowlMan*, PlayState*);
#define ENBOMBOWLMAN_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBOWLMAN_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
-#define ENBOMBOWLMAN_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+#define ENBOMBOWLMAN_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
+
+#define ENBOMBOWLMAN_PATH_INDEX_NONE 0x3F
#define ENBOMBOWLMAN_F0_0 0
#define ENBOMBOWLMAN_F0_2 2
-#define ENBOMBOWLMAN_FF00_MINUS1 -1
-
typedef struct EnBomBowlMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -30,7 +30,7 @@ typedef struct EnBomBowlMan {
/* 0x292 */ UNK_TYPE1 unk292[2];
/* 0x294 */ Path* path;
/* 0x298 */ s16 unk_298;
- /* 0x29A */ s16 unk_29A;
+ /* 0x29A */ s16 pathIndex;
/* 0x29C */ s16 unk_29C;
/* 0x29E */ s16 unk_29E;
/* 0x2A0 */ Vec3f unk_2A0;
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..ee00081db 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
@@ -120,7 +120,7 @@ s32 EnBomChu_UpdateFloorPoly(EnBomChu* this, CollisionPoly* floorPoly, PlayState
return false;
}
- angle = func_80086C48(normDotUp);
+ angle = Math_FAcosF(normDotUp);
if (angle < 0.001f) {
return false;
}
@@ -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..55f7ff281 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.c
@@ -236,8 +236,8 @@ void func_80C03AF4(EnBombers* this, PlayState* play) {
if (this->unk_2A8 == 0) {
Math_Vec3f_Copy(&sp60, &this->actor.home.pos);
- sp60.x += randPlusMinusPoint5Scaled(150.0f);
- sp60.z += randPlusMinusPoint5Scaled(150.0f);
+ sp60.x += Rand_CenteredFloat(150.0f);
+ sp60.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp60)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp60, &sp6C,
@@ -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_Bombers/z_en_bombers.h b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
index 85c5ecdb3..1585613ce 100644
--- a/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
+++ b/src/overlays/actors/ovl_En_Bombers/z_en_bombers.h
@@ -10,13 +10,13 @@ typedef void (*EnBombersActionFunc)(struct EnBombers*, PlayState*);
#define ENBOMBERS_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBERS_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
-enum {
+typedef enum {
/* 0 */ ENBOMBERS_F_0,
/* 1 */ ENBOMBERS_F_1,
/* 2 */ ENBOMBERS_F_2,
/* 3 */ ENBOMBERS_F_3,
- /* 4 */ ENBOMBERS_F_4,
-};
+ /* 4 */ ENBOMBERS_F_4
+} EnBombersParam;
#define ENBOMBERS_F0_0 0
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..229a1e695 100644
--- a/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
+++ b/src/overlays/actors/ovl_En_Bomjima/z_en_bomjima.c
@@ -39,7 +39,7 @@ void func_80C00168(EnBomjima* this, PlayState* play);
void func_80C00234(EnBomjima* this);
void func_80C00284(EnBomjima* this, PlayState* play);
-typedef enum EN_BOMJIMA_ACTION {
+typedef enum EnBomjimaAction {
/* 0 */ EN_BOMJIMA_ACTION_0,
/* 1 */ EN_BOMJIMA_ACTION_1,
/* 2 */ EN_BOMJIMA_ACTION_2,
@@ -47,8 +47,8 @@ typedef enum EN_BOMJIMA_ACTION {
/* 4 */ EN_BOMJIMA_ACTION_4,
/* 5 */ EN_BOMJIMA_ACTION_5,
/* 6 */ EN_BOMJIMA_ACTION_6,
- /* 7 */ EN_BOMJIMA_ACTION_7,
-} EN_BOMJIMA_ACTION;
+ /* 7 */ EN_BOMJIMA_ACTION_7
+} EnBomjimaAction;
static s32 D_80C009F0 = 0;
static s32 D_80C009F4 = 0;
@@ -266,8 +266,8 @@ void func_80BFE67C(EnBomjima* this, PlayState* play) {
if (this->unk_2C0 == 0) {
Math_Vec3f_Copy(&sp54, &this->actor.home.pos);
- sp54.x += randPlusMinusPoint5Scaled(150.0f);
- sp54.z += randPlusMinusPoint5Scaled(150.0f);
+ sp54.x += Rand_CenteredFloat(150.0f);
+ sp54.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp54)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp54, &sp6C,
@@ -422,7 +422,7 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
}
sp40.x = (Math_SinS(sp3E) * (Rand_ZeroFloat(20.0f) + 40.0f)) + this->bombal->actor.world.pos.x;
- sp40.y = this->bombal->actor.world.pos.y - randPlusMinusPoint5Scaled(40.0f);
+ sp40.y = this->bombal->actor.world.pos.y - Rand_CenteredFloat(40.0f);
sp40.z = (Math_CosS(sp3E) * (Rand_ZeroFloat(20.0f) + 40.0f)) + this->bombal->actor.world.pos.z;
SoundSource_PlaySfxAtFixedWorldPos(play, &sp40, 50, NA_SE_EV_BOMBERS_SHOT_EXPLOSUIN);
@@ -433,8 +433,8 @@ void func_80BFEB64(EnBomjima* this, PlayState* play) {
func_80BFE494(this, 5, 1.0f);
this->unk_29A = 0;
Math_Vec3f_Copy(&this->unk_2A4, &this->actor.home.pos);
- this->unk_2A4.x += randPlusMinusPoint5Scaled(150.0f);
- this->unk_2A4.z += randPlusMinusPoint5Scaled(150.0f);
+ this->unk_2A4.x += Rand_CenteredFloat(150.0f);
+ this->unk_2A4.z += Rand_CenteredFloat(150.0f);
this->unk_2A2++;
}
}
@@ -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 7cc78d9cf..fbdcb860f 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
@@ -275,8 +275,8 @@ void func_80C014E4(EnBomjimb* this, PlayState* play) {
case 0:
if (this->unk_2AE == 0) {
Math_Vec3f_Copy(&sp48, &this->actor.home.pos);
- sp48.x += randPlusMinusPoint5Scaled(150.0f);
- sp48.z += randPlusMinusPoint5Scaled(150.0f);
+ sp48.x += Rand_CenteredFloat(150.0f);
+ sp48.z += Rand_CenteredFloat(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp48)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp48, &sp60,
@@ -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_Bomjimb/z_en_bomjimb.h b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
index f411f21a2..a784e335d 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
@@ -11,19 +11,19 @@ typedef void (*EnBomjimbActionFunc)(struct EnBomjimb*, PlayState*);
#define ENBOMJIMB_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
#define ENBOMJIMB_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0 */ ENBOMJIMB_F_0,
/* 1 */ ENBOMJIMB_F_1,
/* 2 */ ENBOMJIMB_F_2,
/* 3 */ ENBOMJIMB_F_3,
- /* 4 */ ENBOMJIMB_F_4,
-};
+ /* 4 */ ENBOMJIMB_F_4
+} EnBomjimbParamF;
-enum {
+typedef enum {
/* 0 */ ENBOMJIMB_F0_0,
/* 1 */ ENBOMJIMB_F0_1,
- /* 2 */ ENBOMJIMB_F0_2,
-};
+ /* 2 */ ENBOMJIMB_F0_2
+} EnBomjimbParamF0;
typedef struct EnBomjimb {
/* 0x000 */ Actor actor;
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..f9b5b3d41 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--;
@@ -202,7 +203,7 @@ void func_808A2918(EnBoom* this, PlayState* play) {
}
Math_ScaledStepToS(&this->actor.world.rot.y, sp72,
- (this->unk_1CF > 0) ? 1000 : (s16)(((sp70 < 0) ? -sp70 : sp70) * sp64));
+ (this->unk_1CF > 0) ? 1000 : (s16)(ABS_ALT(sp70) * sp64));
}
Math_ScaledStepToS(&this->actor.world.rot.x, sp6E, ABS_ALT(sp6C) * sp64);
@@ -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++;
@@ -310,7 +311,7 @@ typedef struct {
/* 0x00 */ Gfx* unk_00;
/* 0x04 */ Vec3f unk_04;
/* 0x10 */ Vec3f unk_10;
-} EnBoomStruct;
+} EnBoomStruct; // size = 0x1C
EnBoomStruct D_808A3078[] = {
{ gameplay_keep_DL_06FE20, { -960.0f, 0.0f, 0.0f }, { 960.0f, 0.0f, 0.0f } },
@@ -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..044f54334 100644
--- a/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -73,7 +73,7 @@ static InitChainEntry sInitChain[] = {
};
typedef struct {
- f32 data[5];
+ /* 0x0 */ f32 data[5];
} EnBox_PlaybackSpeed; // 0x14
static EnBox_PlaybackSpeed sPlaybackSpeed = { { 1.5f, 1.0f, 1.5f, 1.0f, 1.5f } };
@@ -122,6 +122,7 @@ void func_80867C8C(struct_80867BDC_a0* arg0, PlayState* play) {
if (temp_s6 > 0) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Push();
for (i = 0; i < temp_s6; i++) {
f32 temp_f0 = (f32)i / temp_s6;
@@ -143,13 +144,14 @@ 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);
}
Matrix_Pop();
gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -694,6 +696,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
EnBox* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->unk_1F4.unk_10 != NULL) {
this->unk_1F4.unk_10(&this->unk_1F4, play);
}
@@ -704,12 +707,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));
@@ -719,5 +722,6 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL,
EnBox_PostLimbDraw, &this->dyna.actor, POLY_XLU_DISP);
}
+
CLOSE_DISPS(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..8e3e907bb 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
@@ -20,7 +20,7 @@ typedef enum {
/* 0x05 */ CLEAR_TAG_EFFECT_LIGHT_RAYS,
/* 0x06 */ CLEAR_TAG_EFFECT_SHOCKWAVE,
/* 0x07 */ CLEAR_TAG_EFFECT_SPLASH,
- /* 0x08 */ CLEAR_TAG_EFFECT_ISOLATED_SMOKE,
+ /* 0x08 */ CLEAR_TAG_EFFECT_ISOLATED_SMOKE
} ClearTagEffectType;
void EnClearTag_Init(Actor* thisx, PlayState* play);
@@ -494,8 +494,8 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) {
vel.z = cosf(i * (33.0f / 40.0f)) * i * .5f;
vel.y = Rand_ZeroFloat(8.0f) + 7.0f;
- vel.x += randPlusMinusPoint5Scaled(0.5f);
- vel.z += randPlusMinusPoint5Scaled(0.5f);
+ vel.x += Rand_CenteredFloat(0.5f);
+ vel.z += Rand_CenteredFloat(0.5f);
accel.x = 0.0f;
accel.y = -1.0f;
@@ -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..8eb9eb839 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
@@ -152,7 +152,7 @@ void EnCne01_FinishInit(EnHy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnCne01_Draw;
this->waitingOnInit = false;
- if (ENCNE01_GET_PATH(&this->actor) == 0x3F) {
+ if (ENCNE01_GET_PATH_INDEX(&this->actor) == ENCNE01_PATH_INDEX_NONE) {
this->actionFunc = EnCne01_FaceForward;
} else {
this->actionFunc = EnCne01_Walk;
@@ -217,7 +217,7 @@ void EnCne01_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1;
- this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH(&this->enHy.actor), 0x3F);
+ this->enHy.path = SubS_GetPathByIndex(play, ENCNE01_GET_PATH_INDEX(&this->enHy.actor), ENCNE01_PATH_INDEX_NONE);
this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnCne01_FinishInit;
@@ -251,10 +251,12 @@ s32 EnCne01_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (limbIndex == CNE_LIMB_HEAD) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.headObjIndex].segment);
*dList = gCneHeadBrownHairDL;
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
if (limbIndex == CNE_LIMB_HEAD) {
@@ -289,8 +291,10 @@ void EnCne01_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
if (limbIndex == CNE_LIMB_RIGHT_FOOT) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -310,7 +314,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_Cne_01/z_en_cne_01.h b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
index 253025760..feee462a9 100644
--- a/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
+++ b/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.h
@@ -7,7 +7,9 @@ struct EnCne01;
typedef void (*EnCne01ActionFunc)(struct EnCne01*, PlayState*);
-#define ENCNE01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENCNE01_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENCNE01_PATH_INDEX_NONE 0x3F
typedef struct EnCne01 {
/* 0x000 */ EnHy enHy;
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..fa6349871 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
@@ -163,7 +163,7 @@ void func_80AFDFB4(EnColMan* this, PlayState* play) {
if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->actor.velocity.y < 0.0f)) {
if (!this->hasSetRandomValues) {
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(30000.0f);
+ this->actor.world.rot.y = Rand_CenteredFloat(30000.0f);
this->actor.speed = 2.0f + BREG(56) + Rand_ZeroFloat(2.0f);
this->actor.velocity.y = 12.0f + BREG(57) + Rand_ZeroFloat(5.0f);
this->hasSetRandomValues = true;
@@ -172,9 +172,9 @@ void func_80AFDFB4(EnColMan* this, PlayState* play) {
}
for (i = 0; i < 2; i++) {
- velocity.x = randPlusMinusPoint5Scaled(2.0f);
+ velocity.x = Rand_CenteredFloat(2.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 1.0f;
- velocity.z = randPlusMinusPoint5Scaled(2.0f);
+ velocity.z = Rand_CenteredFloat(2.0f);
accel.y = -0.1f;
accel.z = 0.0f;
accel.x = 0.0f;
@@ -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_Col_Man/z_en_col_man.h b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
index 977bf2473..c002dc5e3 100644
--- a/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
+++ b/src/overlays/actors/ovl_En_Col_Man/z_en_col_man.h
@@ -21,7 +21,7 @@ typedef enum {
/* 1 */ EN_COL_MAN_RECOVERY_HEART,
/* 2 */ EN_COL_MAN_FALLING_ROCK,
/* 3 */ EN_COL_MAN_CUTSCENE_BOMB,
- /* 4 */ EN_COL_MAN_GAMEPLAY_BOMB,
+ /* 4 */ EN_COL_MAN_GAMEPLAY_BOMB
} EnColManType;
#endif // Z_EN_COL_MAN_H
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..aa74c5007 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -5,6 +5,7 @@
*/
#include "z_en_cow.h"
+#include "z64horse.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@@ -116,7 +117,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnCow_Idle;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) && (CURRENT_DAY != 1) &&
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) && (CURRENT_DAY != 1) &&
(EN_COW_TYPE(thisx) == EN_COW_TYPE_ABDUCTED)) {
Actor_Kill(&this->actor);
return;
@@ -130,7 +131,7 @@ void EnCow_Init(Actor* thisx, PlayState* play) {
this->animationCycle = 0;
this->actor.targetMode = 6;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
func_801A5080(4);
break;
case EN_COW_TYPE_TAIL:
@@ -264,13 +265,13 @@ void EnCow_Talk(EnCow* this, PlayState* play) {
void EnCow_Idle(EnCow* this, PlayState* play) {
if ((play->msgCtx.ocarinaMode == 0) || (play->msgCtx.ocarinaMode == 4)) {
- if (D_801BDAA4 != 0) {
+ if (gHorsePlayedEponasSong) {
if (this->flags & EN_COW_FLAG_WONT_GIVE_MILK) {
this->flags &= ~EN_COW_FLAG_WONT_GIVE_MILK;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
} else if ((this->actor.xzDistToPlayer < 150.0f) &&
ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 25000) {
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
this->actionFunc = EnCow_Talk;
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8614(&this->actor, play, 170.0f);
@@ -421,7 +422,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 +430,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_Cow/z_en_cow.h b/src/overlays/actors/ovl_En_Cow/z_en_cow.h
index 3c73b747f..200ec5bec 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.h
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.h
@@ -10,9 +10,9 @@
#define EN_COW_FLAG_WONT_GIVE_MILK (1 << 2)
typedef enum {
- /* 0 */ EN_COW_TYPE_DEFAULT,
- /* 1 */ EN_COW_TYPE_TAIL,
- /* 2 */ EN_COW_TYPE_ABDUCTED,
+ /* 0 */ EN_COW_TYPE_DEFAULT,
+ /* 1 */ EN_COW_TYPE_TAIL,
+ /* 2 */ EN_COW_TYPE_ABDUCTED
} EnCowType;
struct EnCow;
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..4c88b84cb 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)
@@ -74,7 +74,7 @@ typedef enum {
/* 2 */ GUAY_DMGEFF_FIRE,
/* 3 */ GUAY_DMGEFF_ICE,
/* 4 */ GUAY_DMGEFF_LIGHT,
- /* 5 */ GUAY_DMGEFF_ELECTRIC,
+ /* 5 */ GUAY_DMGEFF_ELECTRIC
} GuayDamageEffect;
static DamageTable sDamageTable = {
@@ -552,9 +552,9 @@ s32 EnCrow_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (this->actor.colChkInfo.health != 0) {
if (limbIndex == OBJECT_CROW_LIMB_UPPER_TAIL) {
- rot->y += (s16)(0xC00 * sin_rad(this->skelAnime.curFrame * (M_PI / 4)));
+ rot->y += (s16)(0xC00 * Math_SinF(this->skelAnime.curFrame * (M_PI / 4)));
} else if (limbIndex == OBJECT_CROW_LIMB_TAIL) {
- rot->y += (s16)(0x1400 * sin_rad((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
+ rot->y += (s16)(0x1400 * Math_SinF((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
}
}
return false;
@@ -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..2c232f096 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.c
@@ -76,14 +76,14 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->unk_278 = ENDAIKU_GET_FF(&this->actor);
- if (this->unk_278 == ENDAIKU_PARAMS_FF_3) {
- this->unk_288 = ENDAIKU_GET_FF00(&this->actor);
- this->unk_258 = SubS_GetPathByIndex(play, this->unk_288, 0x3F);
- } else if (this->unk_278 == ENDAIKU_PARAMS_FF_2) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_3) {
+ this->pathIndex = ENDAIKU_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENDAIKU_PATH_INDEX_NONE);
+ } else if (this->unk_278 == ENDAIKU_PARAM_FF_2) {
this->unk_264 = -2000;
}
- if (this->unk_278 == ENDAIKU_PARAMS_FF_0) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_0) {
this->collider.dim.radius = 30;
this->collider.dim.height = 60;
this->collider.dim.yShift = 0;
@@ -100,20 +100,20 @@ void EnDaiku_Init(Actor* thisx, PlayState* play) {
this->actor.gravity = -3.0f;
switch (this->unk_278) {
- case ENDAIKU_PARAMS_FF_0:
+ case ENDAIKU_PARAM_FF_0:
this->unk_27E = this->unk_278 * 4 + 4;
- case ENDAIKU_PARAMS_FF_1:
+ case ENDAIKU_PARAM_FF_1:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_002FA0,
this->jointTable, this->morphTable, 17);
break;
- case ENDAIKU_PARAMS_FF_2:
+ case ENDAIKU_PARAM_FF_2:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_00B690,
this->jointTable, this->morphTable, 17);
break;
- case ENDAIKU_PARAMS_FF_3:
+ case ENDAIKU_PARAM_FF_3:
SkelAnime_InitFlex(play, &this->skelAnime, &object_daiku_Skel_00A850, &object_daiku_Anim_001114,
this->jointTable, this->morphTable, 17);
break;
@@ -134,8 +134,8 @@ void func_8094373C(EnDaiku* this, s32 arg1) {
}
void func_809437C8(EnDaiku* this) {
- if ((this->unk_288 != -1) && (this->unk_258 != 0)) {
- if (!SubS_CopyPointFromPath(this->unk_258, this->unk_25C, &this->unk_26C)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
+ if (!SubS_CopyPointFromPath(this->path, this->unk_25C, &this->unk_26C)) {
Actor_Kill(&this->actor);
}
}
@@ -173,7 +173,7 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
s32 pad2;
if (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
- if (this->unk_278 == ENDAIKU_PARAMS_FF_1) {
+ if (this->unk_278 == ENDAIKU_PARAM_FF_1) {
this->actor.textId = 0x2365;
} else {
this->actor.textId = 0x2366;
@@ -188,7 +188,7 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
return;
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_2) && (this->unk_284 <= currentFrame)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_2) && (this->unk_284 <= currentFrame)) {
if (Rand_ZeroOne() < 0.5f) {
func_8094373C(this, 7);
} else {
@@ -196,8 +196,9 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
}
}
- if (this->unk_278 == ENDAIKU_PARAMS_FF_3) {
- f32 sq, abs;
+ if (this->unk_278 == ENDAIKU_PARAM_FF_3) {
+ f32 xzDist;
+ f32 yawDiff;
Math_ApproachF(&this->actor.world.pos.x, this->unk_26C.x, 0.5f,
fabsf(2.0f * Math_SinS(this->actor.world.rot.y)));
@@ -205,11 +206,11 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
fabsf(2.0f * Math_CosS(this->actor.world.rot.y)));
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_282, 1, 0x7D0, 0xA);
- sq = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
- abs = fabsf(this->actor.world.rot.y - this->unk_282);
- if ((sq < SQ(2.0f)) && (this->unk_258 != NULL) && (abs < 10.0f)) {
+ xzDist = sqrtf(SQ(this->actor.world.pos.x - this->unk_26C.x) + SQ(this->actor.world.pos.z - this->unk_26C.z));
+ yawDiff = fabsf(this->actor.world.rot.y - this->unk_282);
+ if ((xzDist < 4.0f) && (this->path != NULL) && (yawDiff < 10.0f)) {
this->unk_25C++;
- if (this->unk_25C >= this->unk_258->count) {
+ if (this->unk_25C >= this->path->count) {
this->unk_25C = 0;
}
@@ -218,10 +219,11 @@ void func_809438F8(EnDaiku* this, PlayState* play) {
}
}
- if (this->unk_278 != ENDAIKU_PARAMS_FF_0) {
+ if (this->unk_278 != ENDAIKU_PARAM_FF_0) {
s16 angle = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.world.rot.y));
+
this->unk_280 = this->actor.yawTowardsPlayer;
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_1) || (this->unk_278 == ENDAIKU_PARAMS_FF_2) || (angle <= 0x2890)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_1) || (this->unk_278 == ENDAIKU_PARAM_FF_2) || (angle <= 0x2890)) {
func_800B8614(&this->actor, play, 100.0f);
}
}
@@ -235,7 +237,7 @@ void func_80943BC0(EnDaiku* this) {
void func_80943BDC(EnDaiku* this, PlayState* play) {
f32 currentFrame = this->skelAnime.curFrame;
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_2) && (this->unk_284 <= currentFrame)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_2) && (this->unk_284 <= currentFrame)) {
if (Rand_ZeroOne() < 0.5f) {
func_8094373C(this, 7);
} else {
@@ -257,7 +259,7 @@ void EnDaiku_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_0) && (gSaveContext.save.day == 3) && (gSaveContext.save.isNight)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_0) && (gSaveContext.save.day == 3) && (gSaveContext.save.isNight)) {
Actor_Kill(&this->actor);
return;
}
@@ -312,7 +314,7 @@ void EnDaiku_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
gSPDisplayList(POLY_OPA_DISP++, D_809440D4[this->unk_278]);
}
- if ((this->unk_278 == ENDAIKU_PARAMS_FF_3) && (limbIndex == 8)) {
+ if ((this->unk_278 == ENDAIKU_PARAM_FF_3) && (limbIndex == 8)) {
gSPDisplayList(POLY_OPA_DISP++, object_daiku_DL_008EC8);
}
@@ -324,7 +326,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_Daiku/z_en_daiku.h b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
index 4a3c9b444..ff88c8c9a 100644
--- a/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
+++ b/src/overlays/actors/ovl_En_Daiku/z_en_daiku.h
@@ -8,14 +8,16 @@ struct EnDaiku;
typedef void (*EnDaikuActionFunc)(struct EnDaiku*, PlayState*);
#define ENDAIKU_GET_FF(thisx) ((thisx)->params & 0xFF)
-#define ENDAIKU_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+#define ENDAIKU_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
- /* 0x0 */ ENDAIKU_PARAMS_FF_0,
- /* 0x1 */ ENDAIKU_PARAMS_FF_1,
- /* 0x2 */ ENDAIKU_PARAMS_FF_2,
- /* 0x3 */ ENDAIKU_PARAMS_FF_3,
-};
+#define ENDAIKU_PATH_INDEX_NONE 0x3F
+
+typedef enum {
+ /* 0 */ ENDAIKU_PARAM_FF_0,
+ /* 1 */ ENDAIKU_PARAM_FF_1,
+ /* 2 */ ENDAIKU_PARAM_FF_2,
+ /* 3 */ ENDAIKU_PARAM_FF_3
+} EnDaikuParam;
typedef struct EnDaiku {
/* 0x000 */ Actor actor;
@@ -23,7 +25,7 @@ typedef struct EnDaiku {
/* 0x188 */ Vec3s jointTable[17];
/* 0x1EE */ Vec3s morphTable[17];
/* 0x254 */ EnDaikuActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x25E */ s16 unk_25E;
/* 0x260 */ s16 unk_260;
@@ -38,7 +40,7 @@ typedef struct EnDaiku {
/* 0x280 */ s16 unk_280;
/* 0x282 */ s16 unk_282;
/* 0x284 */ f32 unk_284;
- /* 0x288 */ s16 unk_288;
+ /* 0x288 */ s16 pathIndex;
/* 0x28A */ s16 unk_28A;
/* 0x28C */ s16 unk_28C;
/* 0x28E */ UNK_TYPE1 unk_28E[0xE];
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..311b6d216 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.c
@@ -69,8 +69,8 @@ static ColliderCylinderInit sCylinderInit = {
};
void func_80BE61D0(EnDaiku2* this) {
- if ((this->unk_27A != -1) && (this->unk_258 != 0)) {
- if (!SubS_CopyPointFromPath(this->unk_258, this->unk_25C, &this->unk_268)) {
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL)) {
+ if (!SubS_CopyPointFromPath(this->path, this->unk_25C, &this->unk_268)) {
Actor_Kill(&this->actor);
}
}
@@ -87,8 +87,8 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 0;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->unk_278 = ENDAIKU2_GET_7F(&this->actor);
- this->unk_27A = ENDAIKU2_GET_1F80(&this->actor);
- this->unk_258 = SubS_GetPathByIndex(play, this->unk_27A, 0x3F);
+ this->pathIndex = ENDAIKU2_GET_PATH_INDEX(&this->actor);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENDAIKU2_PATH_INDEX_NONE);
this->unk_280 = ENDAIKU2_GET_8000(&this->actor);
Actor_SetScale(&this->actor, 0.01f);
if (!this->unk_280) {
@@ -100,7 +100,7 @@ void EnDaiku2_Init(Actor* thisx, PlayState* play) {
if (this->unk_278 == ENDAIKU2_GET_7F_127) {
this->unk_278 = ENDAIKU2_GET_7F_MINUS1;
} else if (Flags_GetSwitch(play, this->unk_278)) {
- this->unk_25C = this->unk_258->count - 1;
+ this->unk_25C = this->path->count - 1;
func_80BE61D0(this);
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_268);
}
@@ -243,9 +243,9 @@ void func_80BE66E4(EnDaiku2* this, PlayState* play) {
sp70.y += 40.0f;
sp70.z += Math_CosS(this->actor.world.rot.y) * 70.0f;
- sp70.x += randPlusMinusPoint5Scaled(5.0f);
- sp70.y += randPlusMinusPoint5Scaled(5.0f);
- sp70.z += randPlusMinusPoint5Scaled(5.0f);
+ sp70.x += Rand_CenteredFloat(5.0f);
+ sp70.y += Rand_CenteredFloat(5.0f);
+ sp70.z += Rand_CenteredFloat(5.0f);
sp88.y = -1.0f;
@@ -342,9 +342,9 @@ void func_80BE6D40(EnDaiku2* this, PlayState* play) {
Math_ApproachF(&this->actor.world.pos.z, this->unk_268.z, 0.5f, fabsf(Math_CosS(this->actor.world.rot.y) * 6.0f));
if ((sqrtf(SQ(this->actor.world.pos.x - this->unk_268.x) + SQ(this->actor.world.pos.z - this->unk_268.z)) < 4.0f) &&
- (this->unk_258 != 0)) {
+ (this->path != NULL)) {
this->unk_25C++;
- if (this->unk_25C >= this->unk_258->count) {
+ if (this->unk_25C >= this->path->count) {
func_80BE6EB0(this);
return;
}
@@ -385,7 +385,7 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
fabsf(Math_CosS(this->actor.world.rot.y) * 4.0f));
if ((sqrtf(SQ(this->actor.world.pos.x - this->unk_268.x) + SQ(this->actor.world.pos.z - this->unk_268.z)) <
4.0f) &&
- (this->unk_258 != 0)) {
+ (this->path != NULL)) {
if (!func_80BE64C0(this, play)) {
if (this->unk_276 != 3) {
func_80BE6408(this, 3);
@@ -412,7 +412,7 @@ void func_80BE6EF0(EnDaiku2* this, PlayState* play) {
Math_Vec3f_Copy(&sp40, &this->unk_268);
var = this->unk_25C;
this->unk_25C++;
- if (this->unk_25C < this->unk_258->count) {
+ if (this->unk_25C < this->path->count) {
func_80BE61D0(this);
func_80BE6CFC(this);
return;
@@ -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);
@@ -507,9 +507,9 @@ void func_80BE7504(EnDaiku2* this, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, f32 ar
effect->unk_1C = *arg3;
effect->unk_30 = arg4;
effect->unk_34 = arg5;
- effect->unk_28.x = randPlusMinusPoint5Scaled(30000.0f);
- effect->unk_28.y = randPlusMinusPoint5Scaled(30000.0f);
- effect->unk_28.z = randPlusMinusPoint5Scaled(30000.0f);
+ effect->unk_28.x = Rand_CenteredFloat(30000.0f);
+ effect->unk_28.y = Rand_CenteredFloat(30000.0f);
+ effect->unk_28.z = Rand_CenteredFloat(30000.0f);
break;
}
}
@@ -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_Daiku2/z_en_daiku2.h b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
index 130a06a23..58fc26b9a 100644
--- a/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
+++ b/src/overlays/actors/ovl_En_Daiku2/z_en_daiku2.h
@@ -8,14 +8,16 @@ struct EnDaiku2;
typedef void (*EnDaiku2ActionFunc)(struct EnDaiku2*, PlayState*);
#define ENDAIKU2_GET_7F(thisx) ((thisx)->params & 0x7F)
-#define ENDAIKU2_GET_1F80(thisx) (((thisx)->params >> 7) & 0x3F)
+#define ENDAIKU2_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x3F)
#define ENDAIKU2_GET_8000(thisx) (((thisx)->params >> 15) & 0x1)
-enum {
+#define ENDAIKU2_PATH_INDEX_NONE 0x3F
+
+typedef enum {
/* -1 */ ENDAIKU2_GET_7F_MINUS1 = -1,
/* 0 */ ENDAIKU2_GET_7F_0,
- /* 127 */ ENDAIKU2_GET_7F_127 = 127,
-};
+ /* 127 */ ENDAIKU2_GET_7F_127 = 127
+} EnDaiku2Param;
typedef struct EnDaiku2Effect {
/* 0x00 */ u8 isEnabled;
@@ -35,7 +37,7 @@ typedef struct EnDaiku2 {
/* 0x188 */ Vec3s jointTable[17];
/* 0x1EE */ Vec3s morphTable[17];
/* 0x254 */ EnDaiku2ActionFunc actionFunc;
- /* 0x258 */ Path* unk_258;
+ /* 0x258 */ Path* path;
/* 0x25C */ s16 unk_25C;
/* 0x260 */ f32 unk_260;
/* 0x264 */ f32 unk_264;
@@ -43,7 +45,7 @@ typedef struct EnDaiku2 {
/* 0x274 */ s16 unk_274;
/* 0x276 */ s16 unk_276;
/* 0x278 */ s16 unk_278;
- /* 0x27A */ s16 unk_27A;
+ /* 0x27A */ s16 pathIndex;
/* 0x27C */ UNK_TYPE1 unk_27C[0x4];
/* 0x280 */ s32 unk_280;
/* 0x284 */ f32 unk_284;
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..422b35e87 100644
--- a/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
+++ b/src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.c
@@ -384,7 +384,7 @@ void EnDekubaba_Grow(EnDekubaba* this, PlayState* play) {
this->size * 0.01f * (0.5f + (15 - this->timer) * 0.5f / 15.0f);
Math_ScaledStepToS(&this->actor.shape.rot.x, 0x1800, 0x800);
- headDistVertical = sin_rad(CLAMP_MAX((15 - this->timer) * (1.0f / 15), 0.7f) * M_PI) * 32.0f + 14.0f;
+ headDistVertical = Math_SinF(CLAMP_MAX((15 - this->timer) * (1.0f / 15), 0.7f) * M_PI) * 32.0f + 14.0f;
if (this->actor.shape.rot.x < -0x38E3) {
headDistHorizontal = 0.0f;
@@ -468,7 +468,7 @@ void EnDekubaba_Retract(EnDekubaba* this, PlayState* play) {
this->size * 0.01f * (0.5f + this->timer * (1.0f / 30));
Math_ScaledStepToS(&this->actor.shape.rot.x, -0x4000, 0x300);
- headDistVertical = (sin_rad(CLAMP_MAX(this->timer * 0.033f, 0.7f) * M_PI) * 32.0f) + 14.0f;
+ headDistVertical = (Math_SinF(CLAMP_MAX(this->timer * 0.033f, 0.7f) * M_PI) * 32.0f) + 14.0f;
if (this->actor.shape.rot.x < -0x38E3) {
headDistHorizontal = 0.0f;
@@ -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_Dekunuts/z_en_dekunuts.c b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
index 2496a4cc2..cef97a8b0 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -667,7 +667,9 @@ void EnDekunuts_Update(Actor* thisx, PlayState* play) {
s32 EnDekunuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnDekunuts* this = THIS;
- f32 arg1, arg2, arg3;
+ f32 arg1;
+ f32 arg2;
+ f32 arg3;
f32 currentFrame;
if (this->actionFunc == func_808BDA4C) {
diff --git a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
index 59b6677a0..248f758ac 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.h
@@ -10,12 +10,12 @@ typedef void (*EnDekunutsActionFunc)(struct EnDekunuts*, PlayState*);
#define ENDEKUNUTS_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0x00 */ ENDEKUNUTS_GET_FF00_0,
/* 0x01 */ ENDEKUNUTS_GET_FF00_1,
/* 0x02 */ ENDEKUNUTS_GET_FF00_2,
/* 0xFF */ ENDEKUNUTS_GET_FF00_FF = 0xFF
-};
+} EnDekunutsParam;
typedef struct EnDekunuts {
/* 0x000 */ Actor actor;
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..faacd7510 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
@@ -23,11 +23,11 @@ void EnDemoheishi_Talk(EnDemoheishi* this, PlayState* play);
s32 EnDemoheishi_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
typedef enum {
- /* 0 */ DEMOHEISHI_ANIM_STAND_HAND_ON_HIP,
- /* 1 */ DEMOHEISHI_ANIM_CHEER_WITH_SPEAR,
- /* 2 */ DEMOHEISHI_ANIM_WAVE,
- /* 3 */ DEMOHEISHI_ANIM_SIT_AND_REACH,
- /* 4 */ DEMOHEISHI_ANIM_STAND_UP
+ /* 0 */ DEMOHEISHI_ANIM_STAND_HAND_ON_HIP,
+ /* 1 */ DEMOHEISHI_ANIM_CHEER_WITH_SPEAR,
+ /* 2 */ DEMOHEISHI_ANIM_WAVE,
+ /* 3 */ DEMOHEISHI_ANIM_SIT_AND_REACH,
+ /* 4 */ DEMOHEISHI_ANIM_STAND_UP
} EnDemoheishiAnimation;
ActorInit En_Demo_heishi_InitVars = {
@@ -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..46c6de979 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);
@@ -63,7 +62,7 @@ ActorInit En_Dg_InitVars = {
typedef enum {
/* 0 */ DOG_GRAB_STATE_NONE,
/* 1 */ DOG_GRAB_STATE_HELD,
- /* 2 */ DOG_GRAB_STATE_THROWN_OR_SITTING_AFTER_THROW,
+ /* 2 */ DOG_GRAB_STATE_THROWN_OR_SITTING_AFTER_THROW
} DogGrabState;
typedef enum {
@@ -75,7 +74,7 @@ typedef enum {
/* 5 */ DOG_BEHAVIOR_ZORA_WAIT,
/* 6 */ DOG_BEHAVIOR_DEKU,
/* 7 */ DOG_BEHAVIOR_DEKU_WAIT,
- /* 8 */ DOG_BEHAVIOR_DEFAULT,
+ /* 8 */ DOG_BEHAVIOR_DEFAULT
} DogBehavior;
static u8 sIsAnyDogHeld = false;
@@ -86,10 +85,10 @@ static s16 sBremenMaskFollowerIndex = ENDG_INDEX_NO_BREMEN_MASK_FOLLOWER;
* Stores the state for the dogs milling about at the Doggy Racetrack.
*/
typedef struct {
- s16 color; // The dog's color, which is used as an index into sBaseSpeeds
- s16 index; // The dog's index within sDogInfo
- s16 textId; // The ID of the text to display when the dog is picked up
-} RacetrackDogInfo;
+ /* 0x0 */ s16 color; // The dog's color, which is used as an index into sBaseSpeeds
+ /* 0x2 */ s16 index; // The dog's index within sDogInfo
+ /* 0x4 */ s16 textId; // The ID of the text to display when the dog is picked up
+} RacetrackDogInfo; // size = 0x6
/**
* A table of RacetrackDogInfo for every dog at the Doggy Racetrack. Note that the textId values
@@ -281,7 +280,7 @@ s32 EnDg_HasReachedPoint(EnDg* this, Path* path, s32 pointIndex) {
diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
@@ -359,9 +358,9 @@ void EnDg_SpawnFloorDustRing(EnDg* this, PlayState* play) {
Vec3f pos;
if (((this->index + curFrame) % mod) == 0) {
- pos.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ pos.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
pos.y = this->actor.world.pos.y;
- pos.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ pos.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &pos, 10.0f, 0, 2.0f, 300, 0, true);
}
}
@@ -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);
}
@@ -908,14 +900,14 @@ void EnDg_JumpAttack(EnDg* this, PlayState* play) {
if (curFrame < 9) {
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
- sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = randPlusMinusPoint5Scaled(1.0f) + 3.0f;
+ sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = Rand_CenteredFloat(1.0f) + 3.0f;
}
EnDg_SpawnFloorDustRing(this, play);
} else {
this->dogFlags |= DOG_FLAG_JUMP_ATTACKING;
if (Animation_OnFrame(&this->skelAnime, 9.0f)) {
- f32 rand = randPlusMinusPoint5Scaled(1.5f);
+ f32 rand = Rand_CenteredFloat(1.5f);
sAnimationInfo[DOG_ANIM_JUMP_ATTACK].playSpeed = 1.2f;
this->actor.velocity.y = 2.0f * rand + 3.0f;
@@ -1310,7 +1302,7 @@ void EnDg_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->path = SubS_GetPathByIndex(play, ENDG_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENDG_GET_PATH_INDEX(&this->actor), ENDG_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.0075f);
this->actor.targetMode = 1;
this->actor.gravity = -3.0f;
@@ -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_Dg/z_en_dg.h b/src/overlays/actors/ovl_En_Dg/z_en_dg.h
index 62c01a011..e36342706 100644
--- a/src/overlays/actors/ovl_En_Dg/z_en_dg.h
+++ b/src/overlays/actors/ovl_En_Dg/z_en_dg.h
@@ -11,17 +11,19 @@ typedef enum {
/* 3 */ DOG_COLOR_BEIGE,
/* 4 */ DOG_COLOR_BROWN,
/* 5 */ DOG_COLOR_BLUE,
- /* 6 */ DOG_COLOR_GOLD,
-} DogColors;
+ /* 6 */ DOG_COLOR_GOLD
+} DogColor;
struct EnDg;
typedef void (*EnDgActionFunc)(struct EnDg*, PlayState*);
#define ENDG_GET_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENDG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENDG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
#define ENDG_PARAMS(path, index) ((path << 10) | (index << 5))
+#define ENDG_PATH_INDEX_NONE 0x3F
+
typedef enum {
/* 0 */ ENDG_INDEX_RACETRACK_0,
/* 1 */ ENDG_INDEX_RACETRACK_1,
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..e24e2691b 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 {
@@ -1061,7 +1062,7 @@ void func_8089CB10(EnDinofos* this, PlayState* play) {
}
void func_8089CBEC(EnDinofos* this, PlayState* play) {
- s16 temp_s3 = ((s32)randPlusMinusPoint5Scaled(0x1000) + this->actor.shape.rot.y) + this->unk_28E;
+ s16 temp_s3 = ((s32)Rand_CenteredFloat(0x1000) + this->actor.shape.rot.y) + this->unk_28E;
Vec3f sp88;
Vec3f sp7C;
ColliderJntSphElementDim* dim;
@@ -1080,10 +1081,10 @@ void func_8089CBEC(EnDinofos* this, PlayState* play) {
temp_s0 = CLAMP_MIN(temp_s0, 0);
sp88.x = 11.0f * temp_f20;
- sp88.y = randPlusMinusPoint5Scaled(2.0f) + -5.4f;
+ sp88.y = Rand_CenteredFloat(2.0f) + -5.4f;
sp88.z = 11.0f * temp_f22;
sp7C.x = 0.9f * temp_f20;
- sp7C.y = randPlusMinusPoint5Scaled(0.6f) + 1.4f;
+ sp7C.y = Rand_CenteredFloat(0.6f) + 1.4f;
sp7C.z = 0.9f * temp_f22;
func_800B9010(&this->actor, NA_SE_EN_DODO_J_FIRE - SFX_FLAG);
EffectSsDFire_Spawn(play, &this->limbPos[10], &sp88, &sp7C, 30, 22, 255 - (temp_s0 * 20), 20, 3, 8);
@@ -1097,7 +1098,7 @@ void func_8089CBEC(EnDinofos* this, PlayState* play) {
for (i = 6; i < end; i++) {
dim = &this->colliderJntSph.elements[i].dim;
- temp_s3 = (s32)(cos_rad((this->unk_290 + ((i - 5) << 1)) * (M_PI / 20)) * 0x2C00) + this->actor.shape.rot.y;
+ temp_s3 = (s32)(Math_CosF((this->unk_290 + ((i - 5) << 1)) * (M_PI / 20)) * 0x2C00) + this->actor.shape.rot.y;
dim->worldSphere.center.x = (s32)this->limbPos[10].x + (s32)(Math_SinS(temp_s3) * dim->modelSphere.center.z);
dim->worldSphere.center.y = (s32)this->limbPos[10].y + (s32)dim->modelSphere.center.y;
@@ -1231,9 +1232,9 @@ void func_8089D42C(EnDinofos* this, PlayState* play) {
if ((this->actionFunc == func_8089B834) && (this->unk_290 != 0)) {
Math_ScaledStepToS(&this->unk_28E, Math_SinS(this->unk_290 * 1400) * 0x2C00, 0x300);
} else if (this->actionFunc == func_8089CA74) {
- Math_ScaledStepToS(&this->unk_28E, cos_rad(M_PI) * 0x2C00, 0x233);
+ Math_ScaledStepToS(&this->unk_28E, Math_CosF(M_PI) * 0x2C00, 0x2C00 / 20);
} else if (this->actionFunc == func_8089CBEC) {
- this->unk_28E = cos_rad(this->unk_290 * (M_PI / 20)) * 0x2C00;
+ this->unk_28E = Math_CosF(this->unk_290 * (M_PI / 20)) * 0x2C00;
} else if (!Play_InCsMode(play)) {
temp_v0_2 = this->unk_28E + this->actor.shape.rot.y;
temp_v0_2 = BINANG_SUB(this->actor.yawTowardsPlayer, temp_v0_2);
@@ -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..c7dbd8888 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,37 +263,36 @@ 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);
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000000);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0);
- isGfxSetup = true;
- }
- Matrix_Push();
-
- //! FAKE:
- if (1) {}
-
- arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
-
- Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
- Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
- gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
-
- Matrix_Pop();
- sp5C += 1;
+ if (arg0->isEnabled != 1) {
+ continue;
}
+
+ if (!isGfxSetup) {
+ 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;
+ }
+ Matrix_Push();
+
+ arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f;
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24);
+
+ Matrix_Translate(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW);
+ Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[idx]));
+ gSPDisplayList(POLY_XLU_DISP++, object_hanareyama_obj_DL_000020);
+
+ Matrix_Pop();
+ sp5C += 1;
}
CLOSE_DISPS(play->state.gfxCtx);
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_Dnk/z_en_dnk.h b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
index f0665f1b5..57467b3f1 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.h
@@ -10,13 +10,13 @@ typedef void (*EnDnkActionFunc)(struct EnDnk*, PlayState*);
#define ENDNK_GET_3(thisx) ((thisx)->params & 0x3)
#define ENDNK_GET_3C(thisx) ((thisx)->params & 0x3C)
-enum {
- /* 0x0 */ ENDNK_GET_3_0,
- /* 0x1 */ ENDNK_GET_3_1,
- /* 0x2 */ ENDNK_GET_3_2,
- /* 0x3 */ ENDNK_GET_3_3,
- /* 0x4 */ ENDNK_GET_3_4,
-};
+typedef enum {
+ /* 0 */ ENDNK_GET_3_0,
+ /* 1 */ ENDNK_GET_3_1,
+ /* 2 */ ENDNK_GET_3_2,
+ /* 3 */ ENDNK_GET_3_3,
+ /* 4 */ ENDNK_GET_3_4
+} EnDnkParam;
typedef struct EnDnk {
/* 0x000 */ Actor 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..904a18e62 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -63,7 +63,7 @@ typedef enum {
/* 16 */ EN_DNO_ANIM_IMPLORE_START,
/* 17 */ EN_DNO_ANIM_SHOCK_START,
/* 18 */ EN_DNO_ANIM_SHOCK_LOOP,
- /* 19 */ EN_DNO_ANIM_GRIEVE,
+ /* 19 */ EN_DNO_ANIM_GRIEVE
} EnDnoAnimation;
static AnimationSpeedInfo sAnimations[] = {
@@ -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_Dno/z_en_dno.h b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
index f9a55cd4e..b2e7f750f 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.h
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.h
@@ -13,8 +13,8 @@ typedef void (*EnDnoActionFunc)(struct EnDno*, PlayState*);
#define EN_DNO_GET_C000(thisx) (((thisx)->params >> 0xE) & 0x3)
typedef enum {
- /* 0x0 */ EN_DNO_GET_C000_0,
- /* 0x1 */ EN_DNO_GET_C000_1,
+ /* 0 */ EN_DNO_GET_C000_0,
+ /* 1 */ EN_DNO_GET_C000_1
} EnDnoUnkC000;
typedef struct EnDno {
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..1dd5dac34 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
@@ -29,7 +29,7 @@ typedef enum {
/* 1 */ EN_DNP_EYE_HALF,
/* 2 */ EN_DNP_EYE_CLOSED,
/* 3 */ EN_DNP_EYE_ANGRY,
- /* 4 */ EN_DNP_EYE_MAX,
+ /* 4 */ EN_DNP_EYE_MAX
} EnDnpEyeIndex;
ActorInit En_Dnp_InitVars = {
@@ -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_Dnp/z_en_dnp.h b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
index 64f0baf93..9b02f19d3 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.h
@@ -11,9 +11,9 @@ typedef void (*EnDnpActionFunc)(struct EnDnp*, PlayState*);
#define EN_DNP_GET_TYPE(thisx) ((thisx)->params & 7)
typedef enum {
- /* 0x0 */ EN_DNP_TYPE_WOODFALL_TEMPLE,
- /* 0x1 */ EN_DNP_TYPE_RELEASED_FROM_BOTTLE,
- /* 0x2 */ EN_DNP_TYPE_DEKU_KINGS_CHAMBER,
+ /* 0 */ EN_DNP_TYPE_WOODFALL_TEMPLE,
+ /* 1 */ EN_DNP_TYPE_RELEASED_FROM_BOTTLE,
+ /* 2 */ EN_DNP_TYPE_DEKU_KINGS_CHAMBER
} EnDnpType;
typedef struct EnDnp {
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..d662e7e55 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -30,7 +30,7 @@ typedef enum {
/* 7 */ EN_DNS_ANIM_RUN_LOOP,
/* 8 */ EN_DNS_ANIM_DANCE,
/* 9 */ EN_DNS_ANIM_FLIP,
- /* 10 */ EN_DNS_ANIM_MAX,
+ /* 10 */ EN_DNS_ANIM_MAX
} EnDnsAnimation;
static s32 D_8092DCB0[] = {
@@ -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_Dns/z_en_dns.h b/src/overlays/actors/ovl_En_Dns/z_en_dns.h
index 4b730abd3..ade8b6174 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.h
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.h
@@ -13,12 +13,12 @@ typedef s32 (*EnDnsFunc)(struct EnDns*, PlayState*);
#define ENDNS_GET_4000(thisx) ((thisx)->params & 0x4000)
#define ENDNS_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
- /* 0x0 */ ENDNS_GET_7_0,
- /* 0x1 */ ENDNS_GET_7_1,
- /* 0x2 */ ENDNS_GET_7_2,
- /* 0x3 */ ENDNS_GET_7_3,
-};
+typedef enum {
+ /* 0 */ ENDNS_GET_7_0,
+ /* 1 */ ENDNS_GET_7_1,
+ /* 2 */ ENDNS_GET_7_2,
+ /* 3 */ ENDNS_GET_7_3
+} EnDnsParam;
typedef struct EnDns {
/* 0x000 */ Actor actor;
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..6149a7360 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -371,11 +371,11 @@ void func_80876930(EnDodongo* this, PlayState* play, Vec3f* arg2) {
temp3 = this->unk_334 * 30.0f;
for (i = 0; i < 3; i++) {
- sp88.x = randPlusMinusPoint5Scaled(temp3) + arg2->x;
+ sp88.x = Rand_CenteredFloat(temp3) + arg2->x;
sp88.y = Rand_ZeroFloat(5.0f) + this->actor.floorHeight;
- sp88.z = randPlusMinusPoint5Scaled(temp3) + arg2->z;
- D_8087933C.x = randPlusMinusPoint5Scaled(2.0f);
- D_8087933C.z = randPlusMinusPoint5Scaled(2.0f);
+ sp88.z = Rand_CenteredFloat(temp3) + arg2->z;
+ D_8087933C.x = Rand_CenteredFloat(2.0f);
+ D_8087933C.z = Rand_CenteredFloat(2.0f);
func_800B0DE0(play, &sp88, &gZeroVec3f, &D_8087933C, sp80, sp7C, temp1, temp2);
}
}
@@ -738,9 +738,9 @@ void func_80877E60(EnDodongo* this, PlayState* play) {
this->timer--;
if (this->timer == 10) {
for (i = 10; i >= 0; i--) {
- sp84.x = randPlusMinusPoint5Scaled(10.0f);
- sp84.y = randPlusMinusPoint5Scaled(10.0f);
- sp84.z = randPlusMinusPoint5Scaled(10.0f);
+ sp84.x = Rand_CenteredFloat(10.0f);
+ sp84.y = Rand_CenteredFloat(10.0f);
+ sp84.z = Rand_CenteredFloat(10.0f);
sp78.x = sp84.x * -0.1f;
sp78.y = sp84.y * -0.1f;
sp78.z = sp84.z * -0.1f;
@@ -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 e2b225e23..60d0ec673 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"
@@ -290,10 +289,10 @@ ActorInit En_Door_InitVars = {
};
typedef struct {
- /* 0x00 */ s16 sceneId;
- /* 0x02 */ u8 dListIndex;
- /* 0x04 */ s16 objectId;
-} EnDoorInfo;
+ /* 0x0 */ s16 sceneId;
+ /* 0x2 */ u8 dListIndex;
+ /* 0x4 */ s16 objectId;
+} EnDoorInfo; // size = 0x6
static EnDoorInfo sObjInfo[] = {
{ SCENE_MITURIN, 0x01, OBJECT_NUMA_OBJ },
@@ -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);
+ this->switchFlag = ENDOOR_GET_PARAM_7F(thisx);
+ 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) {
- gSaveContext.save.saveInfo.inventory.dungeonKeys[gSaveContext.mapIndex]--;
+ 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 (gSaveContext.save.saveInfo.inventory.dungeonKeys[((void)0, gSaveContext.mapIndex)] <= 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,18 @@ 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);
@@ -672,6 +676,7 @@ void EnDoor_Draw(Actor* thisx, PlayState* play) {
if (this->unk_1A6) {
Actor_DrawDoorLock(play, this->unk_1A6, 0);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
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..03dc31ab6 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_PARAMS_7F(thisx) (((thisx)->params) & 0x7F)
+#define ENDOOR_GET_TYPE(thisx) (((thisx)->params >> 7) & 7)
+#define ENDOOR_GET_PARAM_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..fae9fc4fc 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c
@@ -35,17 +35,17 @@ typedef enum {
/* 0 */ DEEP_PYTHON_EXTEND_STATE_NOT_FULLY_EXTENDED,
/* 1 */ DEEP_PYTHON_EXTEND_STATE_FULLY_EXTENDED,
/* 2 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_LARGE_SWAY,
- /* 3 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_SMALL_SWAY,
+ /* 3 */ DEEP_PYTHON_EXTEND_STATE_REPEAT_SMALL_SWAY
} DeepPythonExtendState;
typedef enum {
/* 0 */ DEEP_PYTHON_GRAB_STATE_START,
- /* 1 */ DEEP_PYTHON_GRAB_STATE_GRABBED,
+ /* 1 */ DEEP_PYTHON_GRAB_STATE_GRABBED
} DeepPythonGrabState;
typedef enum {
/* 0 */ DEEP_PYTHON_ATTACK_STATE_START,
- /* 1 */ DEEP_PYTHON_ATTACK_STATE_RELEASED,
+ /* 1 */ DEEP_PYTHON_ATTACK_STATE_RELEASED
} DeepPythonAttackState;
static s32 sNumPythonsDead = 0;
@@ -299,11 +299,11 @@ void EnDragon_SpawnBubbles(EnDragon* this, PlayState* play, Vec3f basePos) {
Vec3f bubblePos;
s32 i;
- bubbleCount = (s32)randPlusMinusPoint5Scaled(5.0f) + 10;
+ bubbleCount = (s32)Rand_CenteredFloat(5.0f) + 10;
colorIndex = 0;
if (this->action == DEEP_PYTHON_ACTION_DEAD) {
colorIndex = 1;
- bubbleCount = (s32)randPlusMinusPoint5Scaled(5.0f) + 10;
+ bubbleCount = (s32)Rand_CenteredFloat(5.0f) + 10;
}
for (i = 0; i < bubbleCount; i++) {
@@ -311,9 +311,9 @@ void EnDragon_SpawnBubbles(EnDragon* this, PlayState* play, Vec3f basePos) {
sBubbleVelocity.x = Rand_ZeroFloat(1.0f) * 23.0f;
sBubbleVelocity.y = Rand_ZeroFloat(1.0f) * 10.0f;
sBubbleVelocity.z = Rand_ZeroFloat(1.0f) * 23.0f;
- bubblePos.x += randPlusMinusPoint5Scaled(i * 30.0f);
- bubblePos.y += randPlusMinusPoint5Scaled(5.0f);
- bubblePos.z += randPlusMinusPoint5Scaled(i * 30.0f);
+ bubblePos.x += Rand_CenteredFloat(i * 30.0f);
+ bubblePos.y += Rand_CenteredFloat(5.0f);
+ bubblePos.z += Rand_CenteredFloat(i * 30.0f);
sBubbleAccel.y = Rand_ZeroFloat(1.0f) * 20.0f * 3.0f;
scale = Rand_S16Offset(380, 240);
EffectSsDtBubble_SpawnCustomColor(play, &bubblePos, &sBubbleVelocity, &sBubbleAccel,
@@ -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_Dragon/z_en_dragon.h b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
index 2d5f31b54..a35c8fa9b 100644
--- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
+++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.h
@@ -13,7 +13,7 @@ typedef enum {
/* 3 */ DEEP_PYTHON_ACTION_DAMAGE,
/* 4 */ DEEP_PYTHON_ACTION_RETREAT,
/* 5 */ DEEP_PYTHON_ACTION_SETUP_DEAD,
- /* 6 */ DEEP_PYTHON_ACTION_DEAD,
+ /* 6 */ DEEP_PYTHON_ACTION_DEAD
} DeepPythonAction;
struct EnDragon;
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..9fc28c952 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
@@ -110,9 +110,11 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
// after that it will no longer be rendered.
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_02) && (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp].segment);
gSPDisplayList(POLY_OPA_DISP++, &gMoonMaskDL);
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[temp2].segment);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -120,7 +122,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..06b4308a0 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
@@ -55,7 +55,7 @@ void func_80A61334(EnDyExtra* this, PlayState* play) {
this->actor.velocity.y = 0.0f;
}
- if (this->unk14C == 0 && this->unk14A != 0) {
+ if ((this->unk14C == 0) && (this->unk14A != 0)) {
this->unk14C = 0x32;
this->actionFunc = func_80A613C8;
}
@@ -64,7 +64,7 @@ void func_80A61334(EnDyExtra* this, PlayState* play) {
void func_80A613C8(EnDyExtra* this, PlayState* play) {
Math_ApproachF(&this->actor.gravity, 0.0f, 0.1f, 0.005f);
- if (this->unk14C == 0 || this->unk150 < 0.02f) {
+ if ((this->unk14C == 0) || (this->unk150 < 0.02f)) {
Actor_Kill(&this->actor);
return;
}
@@ -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..bd9949c61 100644
--- a/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
+++ b/src/overlays/actors/ovl_En_Egblock/z_en_egblock.c
@@ -13,7 +13,7 @@
typedef enum {
/* 0 */ EGBLOCK_EFFECT_DEBRIS_SOLID,
- /* 1 */ EGBLOCK_EFFECT_DEBRIS_FLAT,
+ /* 1 */ EGBLOCK_EFFECT_DEBRIS_FLAT
} EnEgblockEffectType;
void EnEgblock_Init(Actor* thisx, PlayState* play);
@@ -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);
@@ -134,8 +134,8 @@ void EnEgblock_SpawnEffect(EnEgblock* this, Vec3f* pos, s16 lifetime, s16 arg3)
if (!effect->isActive) {
effect->isActive = true;
effect->pos = *pos;
- effect->pos.x += randPlusMinusPoint5Scaled(50.0f);
- effect->pos.z += randPlusMinusPoint5Scaled(50.0f);
+ effect->pos.x += Rand_CenteredFloat(50.0f);
+ effect->pos.z += Rand_CenteredFloat(50.0f);
effect->timer = lifetime;
effect->alpha = 255;
effect->type = arg3;
@@ -146,9 +146,9 @@ void EnEgblock_SpawnEffect(EnEgblock* this, Vec3f* pos, s16 lifetime, s16 arg3)
effect->velocity.y = 5.0f + (10.0f * Rand_ZeroOne());
effect->velocity.z = 2.0f * (Rand_ZeroOne() - 0.5f);
effect->scale = 0.5f + (0.2f * Rand_ZeroFloat(1.0f));
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
break;
}
}
@@ -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..1a54c8c33 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.c
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.c
@@ -37,7 +37,7 @@ typedef enum {
/* 0 */ EYEGORE_EFFECT_IMPACT,
/* 1 */ EYEGORE_EFFECT_PIECE_LARGE,
/* 2 */ EYEGORE_EFFECT_PIECE_SMALL,
- /* 3 */ EYEGORE_EFFECT_DEBRIS,
+ /* 3 */ EYEGORE_EFFECT_DEBRIS
} EnEgolEffectType;
typedef enum {
@@ -56,7 +56,7 @@ typedef enum {
/* 12 */ EYEGORE_ANIM_SIT,
/* 13 */ EYEGORE_ANIM_LEFT_PUNCH,
/* 14 */ EYEGORE_ANIM_RIGHT_PUNCH,
- /* 15 */ EYEGORE_ANIM_MAX,
+ /* 15 */ EYEGORE_ANIM_MAX
} EnEgolAnimation;
typedef enum {
@@ -64,7 +64,7 @@ typedef enum {
/* 1 */ EYEGORE_LASER_START,
/* 2 */ EYEGORE_LASER_CHARGING,
/* 3 */ EYEGORE_LASER_FIRE,
- /* 7 */ EYEGORE_LASER_ON = 7,
+ /* 7 */ EYEGORE_LASER_ON = 7
} EnEgolLaserState;
void EnEgol_Init(Actor* thisx, PlayState* play);
@@ -238,7 +238,7 @@ typedef enum {
/* 0x0 */ EYEGORE_DMGEFF_IMMUNE_0,
/* 0x4 */ EYEGORE_DMGEFF_LIGHT_ARROW = 4,
/* 0xE */ EYEGORE_DMGEFF_NONE = 0xE,
- /* 0xF */ EYEGORE_DMGEFF_IMMUNE_F,
+ /* 0xF */ EYEGORE_DMGEFF_IMMUNE_F
} EnEgolDamageEffect;
static DamageTable sDamageTable = {
@@ -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);
@@ -394,7 +394,7 @@ void EnEgol_DestroyBlocks(EnEgol* this, PlayState* play, Vec3f pos1, Vec3f pos2)
}
void EnEgol_GetWaypoint(EnEgol* this) {
- if ((this->pathIndex != -1) && (this->path != NULL) &&
+ if ((this->pathIndex != PATH_INDEX_NONE) && (this->path != NULL) &&
!SubS_CopyPointFromPath(this->path, this->waypoint, &this->waypointPos)) {
Actor_Kill(&this->actor);
}
@@ -426,9 +426,9 @@ void EnEgol_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetJntSph(play, &this->eyeCollider, &this->actor, &sEyeJntSphInit, this->eyeElements);
Collider_InitAndSetQuad(play, &this->laserCollider, &this->actor, &sLaserQuadInit);
- this->pathIndex = EYEGORE_GET_PATH(&this->actor);
- if (this->pathIndex == 0x3F) {
- this->pathIndex = -1;
+ this->pathIndex = EYEGORE_GET_PATH_INDEX(&this->actor);
+ if (this->pathIndex == EYEGORE_PATH_INDEX_NONE) {
+ this->pathIndex = PATH_INDEX_NONE;
Actor_Kill(&this->actor);
return;
}
@@ -445,7 +445,7 @@ void EnEgol_Init(Actor* thisx, PlayState* play) {
this->minLaserRange = 200.0f;
}
- this->path = SubS_GetPathByIndex(play, this->pathIndex, 0x3F);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, EYEGORE_PATH_INDEX_NONE);
EYEGORE_SET_SPH_DIM(this->eyeCollider.elements[0], 500, 0, 0, 26, 1.0f);
@@ -610,8 +610,7 @@ void EnEgol_Retreat(EnEgol* this, PlayState* play) {
if ((ABS_ALT(angleToFacing) < 0x3000) && (fabsf(this->actor.world.pos.y - player->actor.world.pos.y) < 50.0f) &&
(this->actor.xzDistToPlayer < 100.0f) && (player->invincibilityTimer == 0)) {
- func_800B8D50(play, &this->actor, 2.0f, (s32)randPlusMinusPoint5Scaled(0x2000) + this->actor.world.rot.y, 5.0f,
- 0x10);
+ func_800B8D50(play, &this->actor, 2.0f, (s32)Rand_CenteredFloat(0x2000) + this->actor.world.rot.y, 5.0f, 0x10);
}
Math_Vec3f_Copy(&spawnPos, &gZeroVec3f);
if ((this->actor.world.pos.y - 50.0f) <= player->actor.world.pos.y) {
@@ -755,7 +754,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);
@@ -764,23 +763,23 @@ void EnEgol_Laser(EnEgol* this, PlayState* play) {
/*! @bug The following is supposed to calculate the rotation from vertical to the collision poly normal.
* However, the calculation is performed incorrectly. The correct calculation is
- * rotToNorm.x = func_80086B30(nz, ny) * 0x8000 / M_PI;
- * rotToNorm.z = func_80086B30(-nx, sqrtf(1.0f - SQ(nx))) * 0x8000 / M_PI;
+ * rotToNorm.x = Math_FAtan2F(nz, ny) * 0x8000 / M_PI;
+ * rotToNorm.z = Math_FAtan2F(-nx, sqrtf(1.0f - SQ(nx))) * 0x8000 / M_PI;
*/
- rotToNorm.x = RAD_TO_BINANG_ALT2(-func_80086B30(-nz * ny, 1.0f));
- rotToNorm.z = RAD_TO_BINANG_ALT2(func_80086B30(-nx * ny, 1.0f));
+ rotToNorm.x = RAD_TO_BINANG_ALT2(-Math_FAtan2F(-nz * ny, 1.0f));
+ rotToNorm.z = RAD_TO_BINANG_ALT2(Math_FAtan2F(-nx * ny, 1.0f));
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 +879,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 +1063,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 +1079,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;
@@ -1101,7 +1100,7 @@ void EnEgol_Death(EnEgol* this, PlayState* play) {
typedef enum {
/* 0 */ EYEGORE_HIT_NONE,
/* 1 */ EYEGORE_HIT_DAMAGE,
- /* 2 */ EYEGORE_HIT_IMMUNE, // Makes hitmarks, but no reaction
+ /* 2 */ EYEGORE_HIT_IMMUNE // Makes hitmarks, but no reaction
} EyegoreHitReaction;
void EnEgol_CollisionCheck(EnEgol* this, PlayState* play) {
@@ -1268,7 +1267,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 +1451,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 +1476,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;
@@ -1533,9 +1533,9 @@ void EnEgol_SpawnEffect(EnEgol* this, Vec3f* pos, Vec3s* rot, s16 lifetime, f32
effect->timer = lifetime;
effect->alpha = 255;
effect->type = type;
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
if ((effect->type == EYEGORE_EFFECT_PIECE_LARGE) || (effect->type == EYEGORE_EFFECT_PIECE_SMALL)) {
effect->accel.y = -1.0f;
effect->velocity.x = 4.0f * (Rand_ZeroOne() - 0.5f);
@@ -1599,7 +1599,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_Egol/z_en_egol.h b/src/overlays/actors/ovl_En_Egol/z_en_egol.h
index cec69e5a1..e85e4b98a 100644
--- a/src/overlays/actors/ovl_En_Egol/z_en_egol.h
+++ b/src/overlays/actors/ovl_En_Egol/z_en_egol.h
@@ -8,10 +8,12 @@ struct EnEgol;
typedef void (*EnEgolActionFunc)(struct EnEgol*, PlayState*);
-#define EYEGORE_GET_PATH(thisx) ((thisx)->params & 0x3F)
+#define EYEGORE_GET_PATH_INDEX(thisx) ((thisx)->params & 0x3F)
#define EYEGORE_GET_SWITCH(thisx) (((thisx)->params >> 6) & 0x7F)
-#define EYEGORE_PARAMS(switch, path) ((((switch) & 0x7F) << 6) | ((path) & 0x3F))
+#define EYEGORE_PATH_INDEX_NONE 0x3F
+
+#define EYEGORE_PARAMS(switch, pathIndex) ((((switch) & 0x7F) << 6) | ((pathIndex) & 0x3F))
#define EYEGORE_EFFECT_COUNT 100
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..3dc6e4a72 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -62,8 +62,10 @@ static Color_RGBAf sOuterColors[] = {
};
typedef struct {
- u8 r, g, b;
-} FairyColorFlags;
+ /* 0x0 */ u8 r;
+ /* 0x1 */ u8 g;
+ /* 0x2 */ u8 b;
+} FairyColorFlags; // size = 0x3
static FairyColorFlags sColorFlags[] = {
{ 0, 0, 0 }, { 1, 0, 0 }, { 1, 2, 0 }, { 1, 0, 2 }, { 0, 1, 0 }, { 2, 1, 0 }, { 0, 1, 2 },
@@ -199,7 +201,7 @@ void func_8088C858(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
}
}
@@ -214,7 +216,7 @@ void func_8088C920(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
}
}
@@ -262,7 +264,7 @@ void func_8088C9CC(EnElf* this, PlayState* play) {
this->unk_244 = 1;
this->unk_248 = 128;
this->unk_254 = Rand_ZeroFloat(0.5f) + 0.5f;
- this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_24C = Rand_CenteredFloat(0x7FFF);
}
}
@@ -291,7 +293,7 @@ void func_8088CC48(EnElf* this, PlayState* play) {
this->unk_246 = 0;
this->unk_24A = (s32)Rand_ZeroFloat(1048.0f) + 0x200;
this->unk_224 = this->actor.world.pos;
- this->unk_258 = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_258 = Rand_CenteredFloat(0x7FFF);
this->unk_26C = func_8088C9CC;
func_8088CBAC(this, play);
this->unk_25C = 0;
@@ -636,9 +638,9 @@ s32 func_8088DCA4(EnElf* this) {
}
void func_8088DD34(EnElf* this, PlayState* play) {
- Player* refActor = GET_PLAYER(play);
+ Actor* playerActor = &GET_PLAYER(play)->actor;
s32 pad;
- Player* player2 = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
f32 heightDiff;
SkelAnime_Update(&this->skelAnime);
@@ -650,7 +652,7 @@ void func_8088DD34(EnElf* this, PlayState* play) {
func_8088CBAC(this, play);
if (this->fairyFlags & 0x800) {
- this->unk_224.y = player2->bodyPartsPos[0].y;
+ this->unk_224.y = player->bodyPartsPos[0].y;
}
func_8088D8D0(this, &this->unk_224);
@@ -670,17 +672,17 @@ void func_8088DD34(EnElf* this, PlayState* play) {
return;
}
- heightDiff = this->actor.world.pos.y - refActor->actor.world.pos.y;
+ heightDiff = this->actor.world.pos.y - playerActor->world.pos.y;
if ((this->fairyFlags & 0x1000) && (heightDiff > 0.0f) && (heightDiff < 60.0f) &&
- !func_8088C804(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) {
+ !func_8088C804(&this->actor.world.pos, &playerActor->world.pos, 10.0f)) {
Health_ChangeBy(play, 0x80);
if (this->fairyFlags & 0x200) {
Magic_Add(play, MAGIC_FILL_TO_CAPACITY);
}
gSaveContext.jinxTimer = 0;
this->unk_254 = 50.0f;
- this->unk_248 = refActor->actor.shape.rot.y;
+ this->unk_248 = playerActor->shape.rot.y;
this->unk_24C = -0x1000;
this->unk_224.y = 30.0f;
this->unk_250 = 0.0f;
@@ -1245,9 +1247,9 @@ void func_8088F5F4(EnElf* this, PlayState* play, s32 sparkleLife) {
Color_RGBA8 envColor;
if (!(this->fairyFlags & 8)) {
- sparklePos.x = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.x;
+ sparklePos.x = Rand_CenteredFloat(6.0f) + this->actor.world.pos.x;
sparklePos.y = (Rand_ZeroOne() * 6.0f) + this->actor.world.pos.y;
- sparklePos.z = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.z;
+ sparklePos.z = Rand_CenteredFloat(6.0f) + this->actor.world.pos.z;
primColor.r = this->innerColor.r;
primColor.g = this->innerColor.g;
@@ -1588,7 +1590,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_Elf/z_en_elf.h b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
index 680d59158..18e444e97 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.h
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
@@ -50,14 +50,14 @@ typedef struct EnElf {
} EnElf; // size = 0x274
typedef enum {
- /* 0x00 */ ENELF_TYPE_0,
- /* 0x01 */ ENELF_TYPE_1,
- /* 0x02 */ ENELF_TYPE_2,
- /* 0x03 */ ENELF_TYPE_3,
- /* 0x04 */ ENELF_TYPE_4,
- /* 0x05 */ ENELF_TYPE_5,
- /* 0x06 */ ENELF_TYPE_6,
- /* 0x07 */ ENELF_TYPE_7
+ /* 0 */ ENELF_TYPE_0,
+ /* 1 */ ENELF_TYPE_1,
+ /* 2 */ ENELF_TYPE_2,
+ /* 3 */ ENELF_TYPE_3,
+ /* 4 */ ENELF_TYPE_4,
+ /* 5 */ ENELF_TYPE_5,
+ /* 6 */ ENELF_TYPE_6,
+ /* 7 */ ENELF_TYPE_7
} FairyType;
#endif // Z_EN_ELF_H
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..2584a1c73 100644
--- a/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
+++ b/src/overlays/actors/ovl_En_Elfbub/z_en_elfbub.c
@@ -66,7 +66,7 @@ void EnElfbub_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 1.25f);
this->actionFunc = EnElfbub_Idle;
- this->zRot = randPlusMinusPoint5Scaled(0x10000);
+ this->zRot = Rand_CenteredFloat(0x10000);
this->zRotDelta = 1000;
this->xScale = 0.08f;
@@ -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_Elfgrp/z_en_elfgrp.c b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
index a3f17f605..cacef3f4d 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.c
@@ -262,8 +262,8 @@ void func_80A39DC8(EnElfgrp* this, PlayState* play, s32 arg2, s32 arg3) {
}
for (i = 0; i < arg2; i++) {
- elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, randPlusMinusPoint5Scaled(20.0f) + sp6C.x, sp6C.y,
- randPlusMinusPoint5Scaled(20.0f) + sp6C.z, 0, 0, 0, params);
+ elforg = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELFORG, Rand_CenteredFloat(20.0f) + sp6C.x, sp6C.y,
+ Rand_CenteredFloat(20.0f) + sp6C.z, 0, 0, 0, params);
if (elforg == NULL) {
continue;
}
diff --git a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
index 975b08c2c..692a76d82 100644
--- a/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
+++ b/src/overlays/actors/ovl_En_Elfgrp/z_en_elfgrp.h
@@ -10,13 +10,13 @@ typedef void (*EnElfgrpActionFunc)(struct EnElfgrp*, PlayState*);
#define ENELFGRP_GET(thisx) ((thisx)->params & 0xF)
#define ENELFGRP_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 0 */ ENELFGRP_0,
/* 2 */ ENELFGRP_1,
/* 2 */ ENELFGRP_2,
/* 3 */ ENELFGRP_3,
- /* 4 */ ENELFGRP_4,
-};
+ /* 4 */ ENELFGRP_4
+} EnElfgrpParam;
typedef struct EnElfgrp {
/* 0x000 */ Actor actor;
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..9b65ae2a6 100644
--- a/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
+++ b/src/overlays/actors/ovl_En_Elforg/z_en_elforg.c
@@ -58,7 +58,7 @@ void EnElforg_InitializeParams(EnElforg* this) {
this->actor.speed = 1.0f;
this->targetSpeedXZ = 1.0f;
this->actor.velocity.y = 0.0f;
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x10000);
this->timer = 0;
this->secondaryTimer = Rand_ZeroFloat(100.0f);
this->actor.shape.yOffset = 0.0f;
@@ -93,18 +93,18 @@ void EnElforg_Init(Actor* thisx, PlayState* play) {
}
break;
+ case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
+ case STRAY_FAIRY_TYPE_BUBBLE:
+ case STRAY_FAIRY_TYPE_CHEST:
+ case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
+ break;
+
default:
if (Flags_GetSwitch(play, STRAY_FAIRY_FLAG(thisx))) {
Actor_Kill(thisx);
return;
}
break;
-
- case STRAY_FAIRY_TYPE_FAIRY_FOUNTAIN:
- case STRAY_FAIRY_TYPE_BUBBLE:
- case STRAY_FAIRY_TYPE_CHEST:
- case STRAY_FAIRY_TYPE_TURN_IN_TO_FAIRY_FOUNTAIN:
- break;
}
if (Map_IsInDungeonOrBossArea(play)) {
@@ -176,9 +176,9 @@ void EnElforg_SpawnSparkles(EnElforg* this, PlayState* play, s32 life) {
s32 pad;
s32 index;
- pos.x = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.x;
+ pos.x = Rand_CenteredFloat(6.0f) + this->actor.world.pos.x;
pos.y = (Rand_ZeroOne() * 6.0f) + this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y);
- pos.z = randPlusMinusPoint5Scaled(6.0f) + this->actor.world.pos.z;
+ pos.z = Rand_CenteredFloat(6.0f) + this->actor.world.pos.z;
index = (this->area < STRAY_FAIRY_AREA_CLOCK_TOWN || this->area >= STRAY_FAIRY_AREA_MAX)
? STRAY_FAIRY_AREA_CLOCK_TOWN
: this->area;
@@ -561,7 +561,7 @@ void EnElforg_TrappedByEnemy(EnElforg* this, PlayState* play) {
void EnElforg_SetupTrappedByEnemy(EnElforg* this, PlayState* play) {
Actor* enemy = EnElforg_GetHoldingEnemy(this, play);
- if (enemy != NULL && enemy->update != NULL) {
+ if ((enemy != NULL) && (enemy->update != NULL)) {
this->actionFunc = EnElforg_TrappedByEnemy;
this->enemy = enemy;
}
@@ -587,7 +587,7 @@ void EnElforg_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
- if (this->timer == 0 && this->secondaryTimer > 0) {
+ if ((this->timer == 0) && (this->secondaryTimer > 0)) {
this->secondaryTimer--;
} else {
this->timer++;
@@ -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..737ffd2d3 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, ENENCOUNT1_PATH_INDEX_NONE);
+ 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 = Rand_CenteredFloat(40.0f) + 200.0f;
+ rotY = player->actor.shape.rot.y;
+ if (this->spawnActiveCount & 1) {
+ rotY = -rotY;
+ scale = Rand_CenteredFloat(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) + Rand_CenteredFloat(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) + Rand_CenteredFloat(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 = Rand_CenteredFloat(250.0f) + 500.0f;
+ rotY = player->actor.shape.rot.y;
+ spawnPos.x = player->actor.world.pos.x + (Math_SinS(rotY) * scale) + Rand_CenteredFloat(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) + Rand_CenteredFloat(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..0eb675272 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,24 @@
#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_PATH_INDEX_NONE 0x3F
+
+#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 +31,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_Encount4/z_en_encount4.c b/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
index 8d9a18cf1..5e28850c6 100644
--- a/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
+++ b/src/overlays/actors/ovl_En_Encount4/z_en_encount4.c
@@ -103,11 +103,11 @@ void func_809C4078(EnEncount4* this, PlayState* play) {
return;
}
- fireWallParams = BGFIREWALL_PARAMS_0;
+ fireWallParams = BGFIREWALL_PARAM_0;
if ((this->unk_148 == 0) || (captainKeeta->unk2DC != 0)) {
i = 0;
if (this->unk_148 != 0) {
- fireWallParams = BGFIREWALL_PARAMS_1;
+ fireWallParams = BGFIREWALL_PARAM_1;
i = 2;
}
while (i < ARRAY_COUNT(D_809C46DC)) {
@@ -171,10 +171,10 @@ void func_809C42A8(EnEncount4* this, PlayState* play) {
if (this->unk_14C != 0) {
yRot += 0x8000;
}
- pos.x += Math_SinS(yRot) * (40.0f + randPlusMinusPoint5Scaled(40.0f));
- pos.z += Math_CosS(yRot) * (40.0f + randPlusMinusPoint5Scaled(40.0f));
+ pos.x += Math_SinS(yRot) * (40.0f + Rand_CenteredFloat(40.0f));
+ pos.z += Math_CosS(yRot) * (40.0f + Rand_CenteredFloat(40.0f));
if (Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_SKB, pos.x, pos.y, pos.z, 0, 0, 0,
- ENSKB_PARAMS_0) != NULL) {
+ ENSKB_PARAM_0) != NULL) {
this->unk_14C++;
if (this->unk_14C >= 2) {
this->actionFunc = func_809C4598;
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..dd656f903 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,26 +85,34 @@ 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) {
case 0:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
+
case 1:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
+
case 2:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
+
case 3:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
+
case 4:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL,
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..9c5bbf42e 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
@@ -114,7 +114,7 @@ void EnEndingHero6_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec
OPEN_DISPS(play->state.gfxCtx);
- if (this->npcIndex >= 4 && limbIndex == 15) {
+ if ((this->npcIndex >= 4) && (limbIndex == 15)) {
index = this->npcIndex - 4;
gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[index]);
}
@@ -133,28 +133,35 @@ 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)) {
+ if ((this->objectIndex >= 0) && Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.status[this->objectIndex].segment);
switch (this->npcIndex) {
case 4:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255);
break;
+
case 5:
gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255);
break;
+
case 6:
gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255);
break;
+
case 7:
gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255);
break;
+
case 8:
gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255);
break;
+
+ default:
+ break;
}
if (this->npcIndex == 0) {
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..64bfdaecc 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.c
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.c
@@ -64,10 +64,10 @@ void EnEstone_Init(Actor* thisx, PlayState* play) {
s32 pad;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 15.0f);
- this->rotVel.x = this->rotVel.y = this->rotVel.z = randPlusMinusPoint5Scaled(1.0f) * 20.0f;
+ this->rotVel.x = this->rotVel.y = this->rotVel.z = Rand_CenteredFloat(1.0f) * 20.0f;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
- this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x2710);
+ this->actor.world.rot.y += (s16)(s32)Rand_CenteredFloat(0x2710);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.params == ENESTONE_TYPE_LARGE) {
@@ -224,9 +224,9 @@ void EnEstone_SpawnEffect(EnEstone* this, Vec3f* pos, Vec3f* velocity, Vec3f* ac
effect->accel = *accel;
effect->scale = scale;
effect->timer = lifetime;
- effect->rot.x = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.y = randPlusMinusPoint5Scaled(0x7530);
- effect->rot.z = randPlusMinusPoint5Scaled(0x7530);
+ effect->rot.x = Rand_CenteredFloat(0x7530);
+ effect->rot.y = Rand_CenteredFloat(0x7530);
+ effect->rot.z = Rand_CenteredFloat(0x7530);
break;
}
}
@@ -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_Estone/z_en_estone.h b/src/overlays/actors/ovl_En_Estone/z_en_estone.h
index ceb26c9c6..f9b44b944 100644
--- a/src/overlays/actors/ovl_En_Estone/z_en_estone.h
+++ b/src/overlays/actors/ovl_En_Estone/z_en_estone.h
@@ -11,7 +11,7 @@ typedef void (*EnEstoneActionFunc)(struct EnEstone*, PlayState*);
typedef enum {
/* 0 */ ENESTONE_TYPE_LARGE,
- /* 1 */ ENESTONE_TYPE_SMALL,
+ /* 1 */ ENESTONE_TYPE_SMALL
} EnEstoneType;
typedef struct {
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..03989b01f 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.c
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.c
@@ -52,11 +52,11 @@ void EnFall_FireRing_Draw(Actor* thisx, PlayState* play);
void EnFall_MoonsTear_Draw(Actor* thisx, PlayState* play);
typedef struct {
- u8 modelIndex;
- Vec3f pos;
- Vec3f velocity;
- Vec3s rot;
-} EnFallDebrisEffect;
+ /* 0x00 */ u8 modelIndex;
+ /* 0x04 */ Vec3f pos;
+ /* 0x10 */ Vec3f velocity;
+ /* 0x1C */ Vec3s rot;
+} EnFallDebrisEffect; // size = 0x24
#define EN_FALL_DEBRIS_EFFECT_COUNT 50
@@ -662,16 +662,16 @@ s32 EnFall_RisingDebris_InitializeEffect(EnFall* this) {
debrisEffects[i].pos.x = this->actor.world.pos.x;
debrisEffects[i].pos.y = this->actor.world.pos.y;
debrisEffects[i].pos.z = this->actor.world.pos.z;
- angle = randPlusMinusPoint5Scaled(0x10000);
+ angle = Rand_CenteredFloat(0x10000);
scale = (1.0f - (Rand_ZeroFloat(1.0f) * Rand_ZeroFloat(1.0f))) * 3000.0f;
debrisEffects[i].pos.x += Math_SinS(angle) * scale;
debrisEffects[i].pos.z += Math_CosS(angle) * scale;
debrisEffects[i].velocity.x = 0.0f;
debrisEffects[i].velocity.z = 0.0f;
debrisEffects[i].velocity.y = 80.0f;
- debrisEffects[i].rot.x = randPlusMinusPoint5Scaled(0x10000);
- debrisEffects[i].rot.y = randPlusMinusPoint5Scaled(0x10000);
- debrisEffects[i].rot.z = randPlusMinusPoint5Scaled(0x10000);
+ debrisEffects[i].rot.x = Rand_CenteredFloat(0x10000);
+ debrisEffects[i].rot.y = Rand_CenteredFloat(0x10000);
+ debrisEffects[i].rot.z = Rand_CenteredFloat(0x10000);
this->activeDebrisEffectCount++;
return true;
}
@@ -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);
@@ -890,11 +890,12 @@ void EnFall_FireRing_Draw(Actor* thisx, PlayState* play) {
if (this->fireRingAlpha > 1.0f) {
this->fireRingAlpha = 1.0f;
}
+
OPEN_DISPS(play->state.gfxCtx);
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 +915,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_Fall/z_en_fall.h b/src/overlays/actors/ovl_En_Fall/z_en_fall.h
index c9eaaf44f..60bb7ec33 100644
--- a/src/overlays/actors/ovl_En_Fall/z_en_fall.h
+++ b/src/overlays/actors/ovl_En_Fall/z_en_fall.h
@@ -19,7 +19,7 @@ typedef enum {
/* 9 */ EN_FALL_TYPE_CLOCK_TOWER_MOON,
/* 10 */ EN_FALL_TYPE_STOPPED_MOON_OPEN_MOUTH,
/* 11 */ EN_FALL_TYPE_CRASH_FIRE_RING,
- /* 12 */ EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER,
+ /* 12 */ EN_FALL_TYPE_LODMOON_INVERTED_STONE_TOWER
} EnFallType;
struct EnFall;
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..269866ff0 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c
@@ -166,13 +166,13 @@ void EnFamos_Init(Actor* thisx, PlayState* play) {
s32 i;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if (FAMOS_GET_PATH(thisx) != 0xFF) {
- path = &play->setupPathList[this->actor.params];
+ if (FAMOS_GET_PATH_INDEX(&this->actor) != FAMOS_PATH_INDEX_NONE) {
+ path = &play->setupPathList[FAMOS_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathNodeCount = path->count;
- if (this->pathNodeCount == 1) {
+ this->pathCount = path->count;
+ if (this->pathCount == 1) {
this->pathPoints = NULL;
- this->pathNodeCount = 0;
+ this->pathCount = 0;
}
}
@@ -265,7 +265,7 @@ void EnFamos_SetupDeathDebris(EnFamos* this) {
rock->rotation.y = (s32)Rand_Next() >> 0x10;
rock->rotation.z = (s32)Rand_Next() >> 0x10;
rock->pos.x = Math_SinS(randVelDirection) * 20.0f + this->actor.world.pos.x;
- rock->pos.y = randPlusMinusPoint5Scaled(60.0f) + (this->actor.world.pos.y + 40.0f);
+ rock->pos.y = Rand_CenteredFloat(60.0f) + (this->actor.world.pos.y + 40.0f);
rock->pos.z = Math_CosS(randVelDirection) * 20.0f + this->actor.world.pos.z;
rock->scale = Rand_ZeroFloat(0.002f) + (2.5f * 0.001f);
}
@@ -365,15 +365,15 @@ void EnFamos_StillIdle(EnFamos* this, PlayState* play) {
*/
void EnFamos_SetupPathingIdle(EnFamos* this) {
if (this->isCalm) {
- this->currentPathNode++;
- if (this->currentPathNode == this->pathNodeCount) {
- this->currentPathNode = 0;
+ this->waypointIndex++;
+ if (this->waypointIndex == this->pathCount) {
+ this->waypointIndex = 0;
}
} else {
this->isCalm = true;
}
- Math_Vec3s_ToVec3f(&this->targetDest, &this->pathPoints[this->currentPathNode]);
+ Math_Vec3s_ToVec3f(&this->targetDest, &this->pathPoints[this->waypointIndex]);
this->targetYaw = Actor_WorldYawTowardPoint(&this->actor, &this->targetDest);
this->actionFunc = EnFamos_PathingIdle;
this->actor.speed = 0.0f;
@@ -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) ||
@@ -545,7 +545,8 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) {
surfaceType = SurfaceType_GetFloorProperty2(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
hitFloor = this->actor.bgCheckFlags & BGCHECKFLAG_GROUND;
- if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == 0xC) || (surfaceType == 0xD)) {
+ if (hitFloor || (this->actor.floorHeight == BGCHECK_Y_MIN) || (surfaceType == FLOOR_PROPERTY_12) ||
+ (surfaceType == FLOOR_PROPERTY_13)) {
this->collider1.base.atFlags &= ~AT_ON;
this->collider2.base.atFlags |= AT_ON;
if (hitFloor) {
@@ -686,12 +687,12 @@ void EnFamos_DeathExplosion(EnFamos* this, PlayState* play) {
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 4);
}
- this->actor.world.pos.x = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.x;
- this->actor.world.pos.z = randPlusMinusPoint5Scaled(5.0f) + this->targetDest.z;
+ this->actor.world.pos.x = Rand_CenteredFloat(5.0f) + this->targetDest.x;
+ this->actor.world.pos.z = Rand_CenteredFloat(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
}
@@ -747,7 +748,7 @@ void EnFamos_Update(Actor* thisx, PlayState* play) {
f32 oldHeight;
s32 oldHoverTimer; // save old value to test if changed
- if (this->debrisTimer <= 0 ||
+ if ((this->debrisTimer <= 0) ||
(this->debrisTimer--, EnFamos_UpdateDebrisPosRot(this), (this->actionFunc != EnFamos_DeathFade))) {
oldHoverTimer = this->hoverTimer;
EnFamos_UpdateFlipStatus(this);
@@ -829,9 +830,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 +860,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_Famos/z_en_famos.h b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
index 874da9034..468356376 100644
--- a/src/overlays/actors/ovl_En_Famos/z_en_famos.h
+++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.h
@@ -15,9 +15,11 @@ typedef struct EnFamosRock {
/* 0x20 */ f32 scale;
} EnFamosRock; // size = 0x24
-#define FAMOS_GET_PATH(thisx) ((thisx)->params)
+#define FAMOS_GET_PATH_INDEX(thisx) ((thisx)->params)
#define FAMOS_GET_AGGRO_DISTANCE(thisx) ((thisx)->shape.rot.x)
+#define FAMOS_PATH_INDEX_NONE 0xFF
+
// stateTimer gets reused:
// after spotting player, counts frames until first attack (8)
// after lost aggro, measures frames looking around before returning to home (60)
@@ -33,8 +35,8 @@ typedef struct EnFamos {
/* 0x1D0 */ EnFamosActionFunc actionFunc;
/* 0x1D4 */ u8 animatedMaterialIndex;
/* 0x1D5 */ u8 hasFinishedRotating; // stable up or down
- /* 0x1D6 */ u8 pathNodeCount;
- /* 0x1D7 */ u8 currentPathNode;
+ /* 0x1D6 */ u8 pathCount;
+ /* 0x1D7 */ u8 waypointIndex;
/* 0x1D8 */ u8 isCalm; // is NOT aware of player
/* 0x1DA */ s16 hoverTimer; // start 30, decr to 0, repeat: for trig height adjustment when hovering
/* 0x1DC */ s16 stateTimer; // reused for different actionFunc
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..491d3c499 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c
@@ -107,7 +107,7 @@ s32 EnFg_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s32 ret;
ret = false;
- if (animIndex >= 0 && animIndex < 4) {
+ if ((animIndex >= 0) && (animIndex < 4)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -151,15 +151,19 @@ s32 EnFg_GetDamageEffect(EnFg* this) {
case 1:
ret = FG_DMGEFFECT_DEKUSTICK;
break;
+
case 15:
ret = FG_DMGEFFECT_HOOKSHOT;
break;
+
case 14:
ret = FG_DMGEFFECT_ARROW;
break;
+
case 3:
ret = FG_DMGEFFECT_ICEARROW;
break;
+
default:
ret = FG_DMGEFFECT_EXPLOSION;
break;
@@ -187,8 +191,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.world.pos.y = this->actor.floorHeight + 2.0f;
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_ARROW:
this->actor.flags &= ~ACTOR_FLAG_1;
this->skelAnime.playSpeed = 0.0f;
@@ -202,10 +208,10 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
- if (1) {}
this->actor.params = FG_BLACK;
this->skelAnime.playSpeed = 0.0f;
ac = this->collider.base.ac;
@@ -218,6 +224,7 @@ void EnFg_Idle(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (DECR(this->timer) == 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_JUMP);
@@ -251,8 +258,10 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->actor.scale.z = CLAMP_MIN(this->actor.scale.z, 0.001f);
this->actionFunc = EnFg_DoNothing;
break;
+
case FG_DMGEFFECT_HOOKSHOT:
break;
+
case FG_DMGEFFECT_EXPLOSION:
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_PlaySfx(&this->actor, NA_SE_EV_FROG_CRY_0);
@@ -269,6 +278,7 @@ void EnFg_Jump(EnFg* this, PlayState* play) {
this->timer = 0;
this->actionFunc = EnFg_Knockback;
break;
+
default:
if (Animation_OnFrame(&this->skelAnime, 8.0f)) {
this->skelAnime.curFrame = 8.0f;
@@ -377,11 +387,13 @@ void EnFg_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if ((limbIndex == 7) || (limbIndex == 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_Push();
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, *dList);
Matrix_Pop();
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -403,7 +415,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 +424,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,29 +470,32 @@ 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);
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B328);
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 0);
- firstDone = true;
- }
-
- if (1) {}
- alpha = (255.0f / 16.0f) * dustEffect->timer;
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
- gDPPipeSync(POLY_XLU_DISP++);
- Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- index = 0.5f * dustEffect->timer;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
- gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
+ if (dustEffect->type == 0) {
+ continue;
}
+
+ if (!firstDone) {
+ 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;
+ }
+
+ alpha = (255.0f / 16.0f) * dustEffect->timer;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, alpha);
+ gDPPipeSync(POLY_XLU_DISP++);
+ Matrix_Translate(dustEffect->pos.x, dustEffect->pos.y, dustEffect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(dustEffect->xyScale, dustEffect->xyScale, 1.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ index = 0.5f * dustEffect->timer;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
+ gSPDisplayList(POLY_XLU_DISP++, object_fr_DL_00B338);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.h b/src/overlays/actors/ovl_En_Fg/z_en_fg.h
index 6440812ca..a1917b9bc 100644
--- a/src/overlays/actors/ovl_En_Fg/z_en_fg.h
+++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.h
@@ -9,21 +9,21 @@ typedef void (*EnFgActionFunc)(struct EnFg*, PlayState*);
// Based on the envColor data. Related to params but mostly unused.
typedef enum {
- /* 0x0 */ FG_YELLOW,
- /* 0x1 */ FG_CYAN,
- /* 0x2 */ FG_PINK,
- /* 0x3 */ FG_BLUE,
- /* 0x4 */ FG_WHITE,
- /* 0x5 */ FG_BLACK, // All frogs are blackened when hit by an explosion
+ /* 0 */ FG_YELLOW,
+ /* 1 */ FG_CYAN,
+ /* 2 */ FG_PINK,
+ /* 3 */ FG_BLUE,
+ /* 4 */ FG_WHITE,
+ /* 5 */ FG_BLACK // All frogs are blackened when hit by an explosion
} FrogType;
typedef enum {
- /* 0x0 */ FG_DMGEFFECT_NONE,
- /* 0x1 */ FG_DMGEFFECT_EXPLOSION, // Bomb or bombchu, not powderkeg
- /* 0x2 */ FG_DMGEFFECT_DEKUSTICK,
- /* 0x3 */ FG_DMGEFFECT_HOOKSHOT,
- /* 0x4 */ FG_DMGEFFECT_ARROW,
- /* 0x5 */ FG_DMGEFFECT_ICEARROW,
+ /* 0 */ FG_DMGEFFECT_NONE,
+ /* 1 */ FG_DMGEFFECT_EXPLOSION, // Bomb or bombchu, not powderkeg
+ /* 2 */ FG_DMGEFFECT_DEKUSTICK,
+ /* 3 */ FG_DMGEFFECT_HOOKSHOT,
+ /* 4 */ FG_DMGEFFECT_ARROW,
+ /* 5 */ FG_DMGEFFECT_ICEARROW
} FrogDamageEffect;
typedef struct {
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..fd3b723d8 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)
@@ -301,7 +301,7 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) {
Math_ScaledStepToS(&this->actor.shape.rot.y,
Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos), 0x300);
} else if (rand < 0.8f) {
- this->actor.shape.rot.y += (s16)randPlusMinusPoint5Scaled(1536.0f);
+ this->actor.shape.rot.y += (s16)(s32)Rand_CenteredFloat(0x600);
}
// Climb if too close to ground
@@ -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_Fish/z_en_fish.h b/src/overlays/actors/ovl_En_Fish/z_en_fish.h
index d3941906c..2a348051e 100644
--- a/src/overlays/actors/ovl_En_Fish/z_en_fish.h
+++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.h
@@ -7,12 +7,12 @@ struct EnFish;
typedef void (*EnFishUnkFunc)(Actor*, PlayState*);
-enum {
+typedef enum {
/* -1 */ ENFISH_MINUS1 = -1,
/* 0 */ ENFISH_0,
/* 1 */ ENFISH_1,
- /* 2 */ ENFISH_2,
-};
+ /* 2 */ ENFISH_2
+} EnFishParam;
typedef struct EnFish {
/* 0x000 */ Actor actor;
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..923cfeef2 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
@@ -352,7 +352,7 @@ void func_80B28C14(EnFish2* this, PlayState* play) {
this->unk_2B4 = (s32)Rand_ZeroFloat(20.0f) + 10;
} else if (this->unk_2B4 == 1) {
if ((this->unk_348 == 0) || (Rand_ZeroOne() < 0.6f)) {
- this->unk_348 = randPlusMinusPoint5Scaled(0x2000);
+ this->unk_348 = Rand_CenteredFloat(0x2000);
} else {
this->unk_348 = Math_Vec3f_Pitch(&this->actor.world.pos, &this->unk_324);
if (this->unk_348 < -0x1000) {
@@ -545,8 +545,8 @@ void func_80B295A4(EnFish2* this, PlayState* play) {
Math_ApproachZeroF(&this->actor.speed, 0.3f, 0.3f);
if (this->unk_2B4 != 0) {
Math_Vec3f_Copy(&sp60, &this->unk_318);
- sp60.x += randPlusMinusPoint5Scaled(100.0f);
- sp60.z += randPlusMinusPoint5Scaled(100.0f);
+ sp60.x += Rand_CenteredFloat(100.0f);
+ sp60.z += Rand_CenteredFloat(100.0f);
for (i = 0; i < 2; i++) {
EffectSsBubble_Spawn(play, &sp60, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(this->unk_330 * 4.0f) + 0.1f);
@@ -912,10 +912,10 @@ void func_80B2A498(EnFish2* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp6C, &this->actor.world.pos);
- sp6C.x += randPlusMinusPoint5Scaled(70.0f);
+ sp6C.x += Rand_CenteredFloat(70.0f);
sp6C.y = this->unk_334 + 10.0f;
- sp6C.z += randPlusMinusPoint5Scaled(70.0f);
- EffectSsGSplash_Spawn(play, &sp6C, NULL, NULL, 0, (s32)randPlusMinusPoint5Scaled(50.0f) + 350);
+ sp6C.z += Rand_CenteredFloat(70.0f);
+ EffectSsGSplash_Spawn(play, &sp6C, NULL, NULL, 0, (s32)Rand_CenteredFloat(50.0f) + 350);
}
}
}
@@ -970,11 +970,11 @@ void EnFish2_Update(Actor* thisx, PlayState* play2) {
if ((play->gameplayFrames % 8) == 0) {
Math_Vec3f_Copy(&sp5C, &this->unk_324);
- sp5C.x += randPlusMinusPoint5Scaled(100.0f);
+ sp5C.x += Rand_CenteredFloat(100.0f);
sp5C.y = this->actor.floorHeight;
- sp5C.z += randPlusMinusPoint5Scaled(100.0f);
+ sp5C.z += Rand_CenteredFloat(100.0f);
- for (i = 0; i < (s32)randPlusMinusPoint5Scaled(5.0f) + 10; i++) {
+ for (i = 0; i < (s32)Rand_CenteredFloat(5.0f) + 10; i++) {
EffectSsBubble_Spawn(play, &sp5C, 0, 5.0f, 5.0f, Rand_ZeroFloat(this->unk_330 * 4.0f) + 0.1f);
}
}
@@ -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);
@@ -1102,9 +1102,9 @@ void func_80B2ADB0(EnFish2* this, Vec3f* vec, s16 arg2) {
ptr->unk_20 = VIRTUAL_TO_PHYSICAL(SEGMENTED_TO_VIRTUAL(phi_v0));
ptr->unk_00 = true;
ptr->unk_04 = *vec;
- ptr->unk_04.x += randPlusMinusPoint5Scaled(ptr->unk_00 + (this->unk_330 * 4000.0f));
- ptr->unk_04.y += randPlusMinusPoint5Scaled(20.0f);
- ptr->unk_04.z += randPlusMinusPoint5Scaled(ptr->unk_00 + (this->unk_330 * 4000.0f));
+ ptr->unk_04.x += Rand_CenteredFloat(ptr->unk_00 + (this->unk_330 * 4000.0f));
+ ptr->unk_04.y += Rand_CenteredFloat(20.0f);
+ ptr->unk_04.z += Rand_CenteredFloat(ptr->unk_00 + (this->unk_330 * 4000.0f));
ptr->unk_18 = (this->unk_330 * 20.0f) - (Rand_ZeroFloat(5.0f) * 0.01f);
ptr->unk_1C = 0x42;
ptr->unk_10 = arg2;
@@ -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..20edbcbc2 100644
--- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
+++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c
@@ -3,7 +3,7 @@
* Overlay: ovl_En_Fishing
* Description: Fishing Pond Elements (Owner, Fish, Props, Effects...)
*/
-#include "prevent_bss_reordering.h"
+
#include "z_en_fishing.h"
#include "z64rumble.h"
#include "z64shrink_window.h"
@@ -25,24 +25,24 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2);
void EnFishing_DrawOwner(Actor* thisx, PlayState* play);
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x02 */ Vec3s pos;
- /* 0x08 */ u8 unk_08;
- /* 0x0C */ f32 unk_0C;
+ /* 0x0 */ u8 unk_00;
+ /* 0x2 */ Vec3s pos;
+ /* 0x8 */ u8 unk_08;
+ /* 0xC */ f32 unk_0C;
} FishingFishInit; // size = 0x10
#define EFFECT_COUNT 130
typedef enum {
- /* 0x00 */ FS_EFF_NONE,
- /* 0x01 */ FS_EFF_RIPPLE,
- /* 0x02 */ FS_EFF_DUST_SPLASH,
- /* 0x03 */ FS_EFF_WATER_DUST,
- /* 0x04 */ FS_EFF_BUBBLE,
- /* 0x05 */ FS_EFF_RAIN_DROP,
- /* 0x06 */ FS_EFF_OWNER_HAT,
- /* 0x07 */ FS_EFF_RAIN_RIPPLE,
- /* 0x08 */ FS_EFF_RAIN_SPLASH
+ /* 0 */ FS_EFF_NONE,
+ /* 1 */ FS_EFF_RIPPLE,
+ /* 2 */ FS_EFF_DUST_SPLASH,
+ /* 3 */ FS_EFF_WATER_DUST,
+ /* 4 */ FS_EFF_BUBBLE,
+ /* 5 */ FS_EFF_RAIN_DROP,
+ /* 6 */ FS_EFF_OWNER_HAT,
+ /* 7 */ FS_EFF_RAIN_RIPPLE,
+ /* 8 */ FS_EFF_RAIN_SPLASH
} FishingEffectType;
typedef struct {
@@ -73,9 +73,9 @@ typedef enum {
} FishingPropType;
typedef struct {
- /* 0x00 */ u8 type;
- /* 0x02 */ Vec3s pos;
-} FishingPropInit; // size = 0x08
+ /* 0x0 */ u8 type;
+ /* 0x2 */ Vec3s pos;
+} FishingPropInit; // size = 0x8
typedef struct {
/* 0x00 */ Vec3f pos;
@@ -93,8 +93,8 @@ typedef struct {
} FishingProp; // size = 0x3C
typedef enum {
- /* 0x00 */ FS_GROUP_FISH_NONE,
- /* 0x01 */ FS_GROUP_FISH_NORMAL
+ /* 0 */ FS_GROUP_FISH_NONE,
+ /* 1 */ FS_GROUP_FISH_NORMAL
} FishingGroupFishType;
#define GROUP_FISH_COUNT 60
@@ -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);
@@ -1838,9 +1838,9 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
dy = sLurePos.y - sRodTipPos.y;
dz = sLurePos.z - sRodTipPos.z;
- ry = func_80086B30(dx, dz);
+ ry = Math_FAtan2F(dx, dz);
dist = sqrtf(SQ(dx) + SQ(dz));
- rx = -func_80086B30(dy, dist);
+ rx = -Math_FAtan2F(dy, dist);
dist = sqrtf(SQ(dx) + SQ(dy) + SQ(dz)) * 0.001f;
@@ -1865,9 +1865,9 @@ void EnFishing_DrawLureAndLine(PlayState* play, Vec3f* linePos, Vec3f* lineRot)
dy = D_80917218.y - (linePos + i)->y;
dz = D_80917218.z - (linePos + i)->z;
- ry = func_80086B30(dx, dz);
+ ry = Math_FAtan2F(dx, dz);
dist = sqrtf(SQ(dx) + SQ(dz));
- rx = -func_80086B30(dy, dist);
+ rx = -Math_FAtan2F(dy, dist);
dist = sqrtf(SQ(dx) + SQ(dy) + SQ(dz)) * 0.001f;
@@ -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);
@@ -3003,9 +3003,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->actor.shape.rot.y = -0x8000;
if ((this->actor.projectedPos.z < 200.0f) && (this->actor.projectedPos.z > 0.0f)) {
- spC4.x = randPlusMinusPoint5Scaled(5.0f) + 130.0f;
+ spC4.x = Rand_CenteredFloat(5.0f) + 130.0f;
spC4.y = 40.0f;
- spC4.z = randPlusMinusPoint5Scaled(5.0f) + 1280.0f;
+ spC4.z = Rand_CenteredFloat(5.0f) + 1280.0f;
EnFishing_SpawnBubble(NULL, play->specialEffects, &spC4, Rand_ZeroFloat(0.02f) + 0.03f, 1);
}
@@ -3080,9 +3080,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
} else {
this->unk_150 = 1;
this->unk_172[0] = Rand_ZeroFloat(30.0f) + 10.0f;
- this->unk_1AC.x = randPlusMinusPoint5Scaled(300.0f);
+ this->unk_1AC.x = Rand_CenteredFloat(300.0f);
this->unk_1AC.y = (WATER_SURFACE_Y(play) - 50.0f) - Rand_ZeroFloat(50.0f);
- this->unk_1AC.z = randPlusMinusPoint5Scaled(300.0f);
+ this->unk_1AC.z = Rand_CenteredFloat(300.0f);
this->unk_188 = 1.0f;
this->unk_18C = 2000.0f;
}
@@ -3144,8 +3144,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
Math_ApproachF(&this->unk_1A8, 4096.0f, 1.0f, 256.0f);
if ((play->gameplayFrames % 32) == 0) {
- this->unk_1AC.x = randPlusMinusPoint5Scaled(600.0f);
- this->unk_1AC.z = randPlusMinusPoint5Scaled(600.0f);
+ this->unk_1AC.x = Rand_CenteredFloat(600.0f);
+ this->unk_1AC.z = Rand_CenteredFloat(600.0f);
this->unk_1AC.y = -120.0f;
}
} else if (sp124 > 50.0f) {
@@ -3600,7 +3600,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
for (spA2 = 0; spA2 < 100; spA2++) {
- Matrix_RotateYF(randPlusMinusPoint5Scaled(0.75f * M_PI) +
+ Matrix_RotateYF(Rand_CenteredFloat(0.75f * M_PI) +
BINANG_TO_RAD_ALT(this->actor.yawTowardsPlayer + 0x8000),
MTXMODE_NEW);
Matrix_MultVec3f(&sp10C, &sp100);
@@ -4067,7 +4067,7 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
func_80903C60(this, 1);
this->unk_17C = this->actor.velocity.y;
this->actor.velocity.y = 0.0f;
- this->unk_162 = randPlusMinusPoint5Scaled(32768.0f);
+ this->unk_162 = (s16)(s32)Rand_CenteredFloat(0x8000);
} else if ((this->actor.world.pos.y < WATER_SURFACE_Y(play)) &&
(this->actor.prevPos.y >= WATER_SURFACE_Y(play))) {
if (this->unk_17C < -5.0f) {
@@ -4128,10 +4128,10 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if (Rand_ZeroOne() < 0.5f) {
this->unk_15E = 0;
} else {
- this->unk_15E = (s16)randPlusMinusPoint5Scaled(32.0f) + 0x8000;
+ this->unk_15E = (s16)(s32)Rand_CenteredFloat(0x20) + 0x8000;
}
- this->unk_160 = (s16)randPlusMinusPoint5Scaled(16384.0f);
+ this->unk_160 = (s16)(s32)Rand_CenteredFloat(0x4000);
this->unk_188 = 1.0f;
this->unk_18C = 5000.0f;
this->unk_194 = 5000.0f;
@@ -4141,8 +4141,8 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
if ((this->unk_150 == 5) && !(this->unk_154 & 1)) {
Vec3f pos;
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat(10.0f) + this->actor.world.pos.z;
pos.y = this->actor.floorHeight + 5.0f;
EnFishing_SpawnWaterDust(&this->actor.projectedPos, play->specialEffects, &pos,
(this->unk_1A4 * 0.005f) + 0.15f);
@@ -4160,9 +4160,9 @@ void EnFishing_UpdateFish(Actor* thisx, PlayState* play2) {
this->unk_1CA--;
for (i = 0; i < 2; i++) {
- pos.x = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.x;
- pos.y = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.y;
- pos.z = randPlusMinusPoint5Scaled(range) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(range) + this->actor.world.pos.x;
+ pos.y = Rand_CenteredFloat(range) + this->actor.world.pos.y;
+ pos.z = Rand_CenteredFloat(range) + this->actor.world.pos.z;
EnFishing_SpawnBubble(&this->actor.projectedPos, play->specialEffects, &pos, Rand_ZeroFloat(0.035f) + 0.04f,
0);
}
@@ -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);
@@ -4568,14 +4568,14 @@ void EnFishing_UpdateGroupFishes(PlayState* play) {
spD6 = Math_Atan2S_XY(dist, dy);
if ((dist < 10.0f) || (((fish->timer % 32) == 0) && (Rand_ZeroOne() > 0.5f))) {
- fish->unk_10.y = basePos[groupIndex].y + randPlusMinusPoint5Scaled(10.0f);
+ fish->unk_10.y = basePos[groupIndex].y + Rand_CenteredFloat(10.0f);
if (D_8090CF18 != 0) {
- fish->unk_10.x = basePos[groupIndex].x + randPlusMinusPoint5Scaled(200.0f);
- fish->unk_10.z = basePos[groupIndex].z + randPlusMinusPoint5Scaled(200.0f);
+ fish->unk_10.x = basePos[groupIndex].x + Rand_CenteredFloat(200.0f);
+ fish->unk_10.z = basePos[groupIndex].z + Rand_CenteredFloat(200.0f);
} else {
- fish->unk_10.x = basePos[groupIndex].x + randPlusMinusPoint5Scaled(100.0f);
- fish->unk_10.z = basePos[groupIndex].z + randPlusMinusPoint5Scaled(100.0f);
+ fish->unk_10.x = basePos[groupIndex].x + Rand_CenteredFloat(100.0f);
+ fish->unk_10.z = basePos[groupIndex].z + Rand_CenteredFloat(100.0f);
}
ripplePos = fish->pos;
@@ -5460,8 +5460,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
((play->gameplayFrames % 2) == 0)) {
Vec3f pos;
- pos.x = randPlusMinusPoint5Scaled(20.0f) + player->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled(20.0f) + player->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(20.0f) + player->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat(20.0f) + player->actor.world.pos.z;
pos.y = player->actor.floorHeight + 5.0f;
EnFishing_SpawnWaterDust(NULL, play->specialEffects, &pos, 0.5f);
}
@@ -5552,9 +5552,9 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) {
rot.z = (Camera_GetInputDirYaw(mainCam) * -(M_PI / 0x8000)) + rot.y;
for (i = 0; i < (u8)D_8090CCD0; i++) {
- pos.x = randPlusMinusPoint5Scaled(700.0f) + play->view.eye.x;
+ pos.x = Rand_CenteredFloat(700.0f) + play->view.eye.x;
pos.y = (Rand_ZeroFloat(100.0f) + 150.0f) - 170.0f;
- pos.z = randPlusMinusPoint5Scaled(700.0f) + play->view.eye.z;
+ pos.z = Rand_CenteredFloat(700.0f) + play->view.eye.z;
if (pos.z < 1160.0f) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &pos, &projectedPos, &sProjectedW);
@@ -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_Floormas/z_en_floormas.h b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
index 002f9e67c..628cad4f6 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.h
@@ -11,12 +11,12 @@ typedef void (*EnFloormasActionFunc)(struct EnFloormas*, PlayState*);
#define ENFLOORMAS_GET_7FFF(thisx) ((thisx)->params & 0x7FFF)
#define ENFLOORMAS_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
+typedef enum {
/* 0x00 */ ENFLOORMAS_GET_7FFF_0,
/* 0x10 */ ENFLOORMAS_GET_7FFF_10 = 0x10,
/* 0x20 */ ENFLOORMAS_GET_7FFF_20 = 0x20,
- /* 0x40 */ ENFLOORMAS_GET_7FFF_40 = 0x40,
-};
+ /* 0x40 */ ENFLOORMAS_GET_7FFF_40 = 0x40
+} EnFloormasParam;
typedef struct EnFloormas {
/* 0x000 */ Actor actor;
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 8130f3cc9..89bf08d7b 100644
--- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
+++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c
@@ -126,7 +126,7 @@ static Vec3f sShopItemPositions[3] = {
s32 EnFsn_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -138,13 +138,17 @@ u16 EnFsn_GetWelcome(PlayState* play) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_NONE:
return 0x29CC;
+
case PLAYER_MASK_DEKU:
return 0x29FC;
+
case PLAYER_MASK_GORON:
case PLAYER_MASK_ZORA:
return 0x29FD;
+
case PLAYER_MASK_KAFEIS_MASK:
return 0x2364;
+
default:
return 0x29FE;
}
@@ -153,64 +157,72 @@ u16 EnFsn_GetWelcome(PlayState* play) {
void EnFsn_HandleConversationBackroom(EnFsn* this, PlayState* play) {
switch (this->textId) {
case 0:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_80_10)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL)) {
this->textId = 0x29E0;
break;
} else {
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
- break;
}
+ break;
+
case 0x29E0:
if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) {
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_LETTER_TO_MAMA;
this->getItemId = GI_LETTER_TO_MAMA;
- SET_WEEKEVENTREG(WEEKEVENTREG_80_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL);
this->textId = 0x29F1;
break;
} else {
this->textId = 0x29E1;
- break;
}
+ break;
+
case 0x29E1:
this->textId = 0x29E2;
break;
+
case 0x29E2:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_KEATONS_MASK;
this->getItemId = GI_MASK_KEATON;
this->textId = 0x29E3;
break;
+
case 0x29E3:
this->flags |= ENFSN_GIVE_ITEM;
this->flags |= ENFSN_GAVE_LETTER_TO_MAMA;
this->getItemId = GI_LETTER_TO_MAMA;
- SET_WEEKEVENTREG(WEEKEVENTREG_80_10);
+ SET_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PRIORITY_MAIL);
this->textId = 0x29F1;
break;
+
case 0x29F1:
this->textId = 0x29E4;
this->flags |= ENFSN_END_CONVERSATION;
break;
+
+ default:
+ break;
}
Message_StartTextbox(play, this->textId, &this->actor);
if (this->flags & ENFSN_END_CONVERSATION) {
if (this->flags & ENFSN_GAVE_LETTER_TO_MAMA) {
this->flags &= ~ENFSN_GAVE_LETTER_TO_MAMA;
- func_80151BB4(play, 34);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL);
}
if (this->flags & ENFSN_GAVE_KEATONS_MASK) {
this->flags &= ~ENFSN_GAVE_KEATONS_MASK;
- func_80151BB4(play, 33);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK);
}
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
}
}
void EnFsn_HandleSetupResumeInteraction(EnFsn* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play) &&
- this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED) {
+ (this->cutsceneState == ENFSN_CUTSCENESTATE_STOPPED)) {
Actor_ProcessTalkRequest(&this->actor, &play->state);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
if (ENFSN_IS_SHOP(&this->actor)) {
@@ -301,7 +313,7 @@ void EnFsn_CursorLeftRight(EnFsn* this) {
}
s16 EnFsn_GetThirdDayItemId(void) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && CURRENT_DAY == 3) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04) && (CURRENT_DAY == 3)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_79_40)) {
return SI_BOMB_BAG_30_1;
}
@@ -314,16 +326,22 @@ s16 EnFsn_GetStolenItemId(u32 stolenItem) {
switch (stolenItem) {
case ITEM_BOTTLE:
return SI_BOTTLE;
+
case ITEM_SWORD_GREAT_FAIRY:
return SI_SWORD_GREAT_FAIRY;
+
case ITEM_SWORD_KOKIRI:
return SI_SWORD_KOKIRI;
+
case ITEM_SWORD_RAZOR:
return SI_SWORD_RAZOR;
+
case ITEM_SWORD_GILDED:
return SI_SWORD_GILDED;
+
+ default:
+ return SI_NONE;
}
- return SI_NONE;
}
s32 EnFsn_HasItemsToSell(void) {
@@ -407,7 +425,7 @@ s32 EnFsn_TestEndInteraction(EnFsn* this, PlayState* play, Input* input) {
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
return true;
}
@@ -450,15 +468,18 @@ s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
return true;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
return true;
+
+ default:
+ return false;
}
- return false;
}
s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, PlayState* play, Input* input) {
@@ -487,10 +508,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -503,10 +524,10 @@ void EnFsn_UpdateJoystickInputState(EnFsn* this, PlayState* play) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -765,7 +786,7 @@ void EnFsn_Haggle(EnFsn* this, PlayState* play) {
this->animIndex = FSN_ANIM_SLAM_COUNTER_LOOP;
SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, this->animIndex);
} else {
- if (this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP && Animation_OnFrame(&this->skelAnime, 18.0f)) {
+ if ((this->animIndex == FSN_ANIM_SLAM_COUNTER_LOOP) && Animation_OnFrame(&this->skelAnime, 18.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_HANKO);
}
if (this->flags & ENFSN_CALM_DOWN) {
@@ -828,20 +849,26 @@ void EnFsn_StartBuying(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29CD;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CD:
this->actor.textId = 0x29CE;
EnFsn_HandleLookToShopkeeperBuyingCutscene(this);
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29CE:
this->actor.textId = 0xFF;
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 0x29CF:
player->exchangeItemId = PLAYER_IA_NONE;
this->actionFunc = EnFsn_SetupDeterminePrice;
break;
+
+ default:
+ break;
}
}
}
@@ -860,6 +887,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_04)) {
this->actor.textId = 0x2A01;
@@ -870,6 +898,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
case 0x29D3:
case 0x29D4:
case 0x29FA:
@@ -877,6 +906,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29D5;
Message_StartTextbox(play, this->actor.textId, &this->actor);
break;
+
+ default:
+ break;
}
}
} else if (talkState == TEXT_STATE_CHOICE) {
@@ -892,6 +924,7 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_FaceShopkeeperSelling;
break;
+
case 1:
func_8019F208();
this->isSelling = false;
@@ -900,6 +933,9 @@ void EnFsn_AskBuyOrSell(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
+ default:
+ break;
}
}
}
@@ -941,7 +977,7 @@ void EnFsn_DeterminePrice(EnFsn* this, PlayState* play) {
this->actor.textId = 0x29D1;
}
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
this->actionFunc = EnFsn_SetupEndInteraction;
}
}
@@ -965,21 +1001,29 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
case 5:
this->getItemId = GI_RUPEE_BLUE;
break;
+
case 10:
this->getItemId = GI_RUPEE_10;
break;
+
case 20:
this->getItemId = GI_RUPEE_RED;
break;
+
case 50:
this->getItemId = GI_RUPEE_PURPLE;
break;
+
case 200:
this->getItemId = GI_RUPEE_HUGE;
break;
+
+ default:
+ break;
}
this->actionFunc = EnFsn_GiveItem;
break;
+
case 1:
func_8019F230();
player->exchangeItemId = PLAYER_IA_NONE;
@@ -992,8 +1036,8 @@ void EnFsn_MakeOffer(EnFsn* this, PlayState* play) {
void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
if (Actor_HasParent(&this->actor, play)) {
if ((this->isSelling == true) && (this->items[this->cursorIndex]->getItemId == GI_MASK_ALL_NIGHT)) {
- func_80151BB4(play, 45);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
}
this->actor.parent = NULL;
if (ENFSN_IS_SHOP(&this->actor) && !this->isSelling) {
@@ -1009,7 +1053,7 @@ void EnFsn_GiveItem(EnFsn* this, PlayState* play) {
void EnFsn_SetupResumeInteraction(EnFsn* this, PlayState* play) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_HandleSetupResumeInteraction(this, play);
}
} else {
@@ -1146,6 +1190,7 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
SET_WEEKEVENTREG(WEEKEVENTREG_33_04);
+ // fallthrough
case CANBUY_RESULT_SUCCESS_1:
if (this->cutsceneState == ENFSN_CUTSCENESTATE_PLAYING) {
CutsceneManager_Stop(this->csId);
@@ -1171,16 +1216,21 @@ void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, PlayState* play) {
this->itemIds[this->cursorIndex] = -1;
this->actionFunc = EnFsn_GiveItem;
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29F0);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
Message_ContinueTextbox(play, 0x29DD);
this->actionFunc = EnFsn_PlayerCannotBuy;
break;
+
+ default:
+ break;
}
}
@@ -1189,7 +1239,7 @@ void EnFsn_SetupEndInteraction(EnFsn* this, PlayState* play) {
if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1211,10 +1261,15 @@ void EnFsn_SelectItem(EnFsn* this, PlayState* play) {
case 0:
EnFsn_HandleCanPlayerBuyItem(this, play);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
+ break;
+
+ default:
+ break;
}
}
}
@@ -1251,17 +1306,21 @@ void EnFsn_AskCanBuyMore(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_DeterminePrice;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
+ break;
+
+ default:
break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1298,17 +1357,21 @@ void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, PlayState* play) {
Message_StartTextbox(play, this->actor.textId, &this->actor);
this->actionFunc = EnFsn_StartBuying;
break;
+
case 1:
func_8019F230();
this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1;
Message_StartTextbox(play, this->actor.textId, &this->actor);
- func_80151BB4(play, 3);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN);
+ break;
+
+ default:
break;
}
}
} else if (((talkState == TEXT_STATE_5) || (talkState == TEXT_STATE_DONE)) && Message_ShouldAdvance(play)) {
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
- if (play->msgCtx.unk120B1 == 0) {
+ if (play->msgCtx.bombersNotebookEventQueueCount == 0) {
EnFsn_EndInteraction(this, play);
} else {
play->msgCtx.msgMode = 0x43;
@@ -1341,6 +1404,7 @@ void EnFsn_FaceShopkeeperSelling(EnFsn* this, PlayState* play) {
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
this->actor.textId = 0x29D6;
Message_StartTextbox(play, this->actor.textId, &this->actor);
+ //! FAKE:
if (play) {}
}
}
@@ -1470,7 +1534,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 +1591,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,
@@ -1576,12 +1640,15 @@ s32 EnFsn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
case FSN_LIMB_TORSO:
limbRotTableIdx = 0;
break;
+
case FSN_LIMB_LEFT_HAND:
limbRotTableIdx = 1;
break;
+
case FSN_LIMB_HEAD:
limbRotTableIdx = 2;
break;
+
default:
limbRotTableIdx = 9;
break;
@@ -1622,7 +1689,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..bfc157fcb 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -171,7 +171,7 @@ void func_809619D0(EnFu* this, PlayState* play) {
}
for (i = 0; i < this->unk_542; i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->unk_520 = path->count;
@@ -426,23 +426,24 @@ void func_80962340(EnFu* this, PlayState* play) {
}
void func_80962588(EnFu* this, PlayState* play) {
- if (Message_ShouldAdvance(play) && (this->unk_552 == 0x2871)) {
- if (1) {}
- if (play->msgCtx.choiceIndex == 0) {
- if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
- func_8019F208();
- Rupees_ChangeBy(-10);
- func_80963DE4(this, play);
- } else {
- play_sound(NA_SE_SY_ERROR);
- Message_StartTextbox(play, 0x2873, &this->actor);
- this->unk_552 = 0x2873;
- }
+ if (!Message_ShouldAdvance(play) || (this->unk_552 != 0x2871)) {
+ return;
+ }
+
+ if (play->msgCtx.choiceIndex == 0) {
+ if (gSaveContext.save.saveInfo.playerData.rupees >= 10) {
+ func_8019F208();
+ Rupees_ChangeBy(-10);
+ func_80963DE4(this, play);
} else {
- func_8019F230();
- Message_StartTextbox(play, 0x2872, &this->actor);
- this->unk_552 = 0x2872;
+ play_sound(NA_SE_SY_ERROR);
+ Message_StartTextbox(play, 0x2873, &this->actor);
+ this->unk_552 = 0x2873;
}
+ } else {
+ func_8019F230();
+ Message_StartTextbox(play, 0x2872, &this->actor);
+ this->unk_552 = 0x2872;
}
}
@@ -728,8 +729,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 +1386,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 +1450,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..71f980d47 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -306,14 +306,14 @@ void func_809328F4(EnFz* this, PlayState* play, Vec3f* arg2, s32 arg3, f32 arg4)
sp88.b = 200;
for (i = 0; i < arg3; i++) {
- temp_f24 = randPlusMinusPoint5Scaled(0.3f) + 0.6f;
- temp_s1 = (s32)randPlusMinusPoint5Scaled(5.0f) + 12;
- spA8.x = randPlusMinusPoint5Scaled(arg4) + arg2->x;
+ temp_f24 = Rand_CenteredFloat(0.3f) + 0.6f;
+ temp_s1 = (s32)Rand_CenteredFloat(5.0f) + 12;
+ spA8.x = Rand_CenteredFloat(arg4) + arg2->x;
spA8.y = Rand_ZeroFloat(arg4) + arg2->y;
- spA8.z = randPlusMinusPoint5Scaled(arg4) + arg2->z;
- sp9C.x = randPlusMinusPoint5Scaled(10.0f);
+ spA8.z = Rand_CenteredFloat(arg4) + arg2->z;
+ sp9C.x = Rand_CenteredFloat(10.0f);
sp9C.y = Rand_ZeroFloat(10.0f) + 2.0f;
- sp9C.z = randPlusMinusPoint5Scaled(10.0f);
+ sp9C.z = Rand_CenteredFloat(10.0f);
EffectSsEnIce_Spawn(play, &spA8, temp_f24, &sp9C, &sp90, &sp8C, &sp88, temp_s1);
}
@@ -329,9 +329,9 @@ void func_80932AF4(EnFz* this) {
Vec3f sp2C;
if (!(this->unk_BC6 & 0xF)) {
- sp44.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
- sp44.y = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.y + 30.0f;
- sp44.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp44.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
+ sp44.y = Rand_CenteredFloat(40.0f) + this->actor.world.pos.y + 30.0f;
+ sp44.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
sp2C.x = sp2C.z = 0.0f;
sp2C.y = 0.1f;
sp38.x = sp38.y = sp38.z = 0.0f;
@@ -345,9 +345,9 @@ void func_80932BD4(EnFz* this) {
Vec3f sp2C;
if (!(this->unk_BC6 & 3)) {
- sp44.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
+ sp44.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
sp44.y = this->unk_BB4;
- sp44.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp44.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
sp2C.x = sp2C.z = 0.0f;
sp2C.y = 0.1f;
sp38.x = sp38.y = sp38.z = 0.0f;
@@ -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_Fz/z_en_fz.h b/src/overlays/actors/ovl_En_Fz/z_en_fz.h
index 539560c88..ac1cb0648 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.h
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.h
@@ -13,12 +13,12 @@ typedef void (*EnFzUnkFunc)(struct EnFz*);
#define ENFZ_GET_4000(thisx) ((thisx)->params & 0x4000)
#define ENFZ_GET_8000(thisx) ((thisx)->params & 0x8000)
-enum {
+typedef enum {
/* 0 */ ENFZ_F_0,
/* 1 */ ENFZ_F_1,
/* 2 */ ENFZ_F_2,
- /* 3 */ ENFZ_F_3,
-};
+ /* 3 */ ENFZ_F_3
+} EnFzParam;
typedef struct {
/* 0x00 */ u8 unk_00;
diff --git a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
index 04d9c7159..5602a3b4f 100644
--- a/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
+++ b/src/overlays/actors/ovl_En_Gakufu/z_en_gakufu.h
@@ -10,8 +10,8 @@ typedef void (*EnGakufuActionFunc)(struct EnGakufu*, PlayState*);
#define GAKUFU_GET_TYPE(thisx) ((thisx)->params & 0xF)
typedef enum {
- /* 0x0 */ GAKUFU_TERMINA_FIELD,
- /* 0x1 */ GAKUFU_MILK_BAR
+ /* 0 */ GAKUFU_TERMINA_FIELD,
+ /* 1 */ GAKUFU_MILK_BAR
} GakufuType;
typedef struct EnGakufu {
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 14afe3270..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;
@@ -615,24 +615,24 @@ void func_80B10868(EnGb2* this, PlayState* play) {
}
void func_80B10924(EnGb2* this, PlayState* play) {
- s32 sp24;
+ s32 getItemId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_54_40)) {
- sp24 = 5;
+ getItemId = GI_RUPEE_PURPLE;
} else {
- sp24 = 12;
+ getItemId = GI_HEART_PIECE;
}
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (sp24 == 12) {
+ if (getItemId == GI_HEART_PIECE) {
SET_WEEKEVENTREG(WEEKEVENTREG_54_40);
} else {
Rupees_ChangeBy(50);
}
this->actionFunc = func_80B109DC;
} else {
- Actor_OfferGetItem(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -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_Gb2/z_en_gb2.h b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
index 87cee9e99..a257ab3d4 100644
--- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
+++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.h
@@ -10,11 +10,11 @@ typedef void (*EnGb2ActionFunc)(struct EnGb2*, PlayState*);
#define ENGB2_GET_7(thisx) ((thisx)->params & 7)
#define ENGB2_GET_7F8(thisx) (((thisx)->params & 0x7F8) >> 3)
-enum {
+typedef enum {
/* 0 */ ENGB2_7_0,
/* 1 */ ENGB2_7_1,
- /* 2 */ ENGB2_7_2,
-};
+ /* 2 */ ENGB2_7_2
+} EnGb2Param;
typedef struct EnGb2 {
/* 0x0000 */ Actor actor;
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..c78f14048 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c
@@ -69,8 +69,8 @@ typedef enum {
/* 6 */ GERUDO_WHITE_ANIM_EXCITED_CLAPPING,
/* 7 */ GERUDO_WHITE_ANIM_SALUTE,
/* 8 */ GERUDO_WHITE_ANIM_LEADING_BOAT,
- /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY,
-} GerudoWhiteAnimations;
+ /* 9 */ GERUDO_WHITE_ANIM_BLOWN_AWAY
+} GerudoWhiteAnimation;
void EnGe1_ChangeAnim(EnGe1* this, s16 animIndex, u8 mode, f32 morphFrames);
void EnGe1_ShadowDraw(Actor* thisx, Lights* lights, PlayState* play);
@@ -191,8 +191,8 @@ void EnGe1_SetupPath(EnGe1* this, PlayState* play) {
this->curPointIndex = 0;
- if (GERUDO_WHITE_GET_PATH(&this->picto.actor) != 0x3F) {
- this->path = &play->setupPathList[GERUDO_WHITE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_WHITE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_WHITE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_WHITE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
point = Lib_SegmentedToVirtual(this->path->points);
Math_Vec3s_ToVec3f(&this->picto.actor.world.pos, point);
@@ -441,6 +441,9 @@ void EnGe1_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList(POLY_OPA_DISP++, sHairstyleDLs[this->hairstyle]);
Matrix_MultVec3f(&sInitialFocusPos, &this->picto.actor.focus.pos);
break;
+
+ default:
+ break;
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -457,7 +460,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_Ge1/z_en_ge1.h b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
index 63a2a3c7f..f1684315b 100644
--- a/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
+++ b/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h
@@ -6,7 +6,9 @@
#include "objects/object_ge1/object_ge1.h"
#define GERUDO_WHITE_GET_TYPE(thisx) (((thisx)->params) & 0xF)
-#define GERUDO_WHITE_GET_PATH(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+#define GERUDO_WHITE_GET_PATH_INDEX(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+
+#define GERUDO_WHITE_PATH_INDEX_NONE 0x3F
//! Only the first type is used
typedef enum {
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..facc4def2 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c
@@ -200,8 +200,8 @@ s32 EnGe2_LookForPlayer(PlayState* play, Actor* actor, Vec3f* pos, s16 yaw, s16
* @return true if path is set up in reverse
*/
s32 EnGe2_SetupPath(EnGe2* this, PlayState* play) {
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
Path* path = this->path;
Vec3s* points = Lib_SegmentedToVirtual(path->points);
@@ -228,14 +228,14 @@ void EnGe2_GetNextPath(EnGe2* this, PlayState* play) {
Path* curPath;
Path* nextPath;
Vec3s* points;
- u8 unk1;
+ u8 nextPathIndex;
this->curPointIndex = 0;
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- curPath = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
- unk1 = curPath->unk1;
- nextPath = &play->setupPathList[unk1];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ curPath = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
+ nextPathIndex = curPath->additionalPathIndex;
+ nextPath = &play->setupPathList[nextPathIndex];
this->path = nextPath;
points = Lib_SegmentedToVirtual(nextPath->points);
this->picto.actor.world.pos.x = points[0].x;
@@ -252,8 +252,8 @@ void EnGe2_SetupBlownAwayPath(EnGe2* this, PlayState* play) {
this->curPointIndex = 0;
- if (GERUDO_PURPLE_GET_PATH(&this->picto.actor) != GERUDO_PURPLE_PATH_NONE) {
- this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH(&this->picto.actor)];
+ if (GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor) != GERUDO_PRUPLE_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[GERUDO_PURPLE_GET_PATH_INDEX(&this->picto.actor)];
if (this->path != NULL) {
points = Lib_SegmentedToVirtual(this->path->points);
Math_Vec3s_ToVec3f(&this->picto.actor.world.pos, points);
@@ -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_Ge2/z_en_ge2.h b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
index 0a85e3bfe..ee0d99d00 100644
--- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
+++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.h
@@ -11,12 +11,12 @@ typedef void (*EnGe2ActionFunc)(struct EnGe2*, PlayState*);
#define GERUDO_PURPLE_GET_EXIT(thisx) (((thisx)->params) & 0x1F) //!< Exit to send Player to when caught
#define GERUDO_PURPLE_GET_TYPE(thisx) (((thisx)->params & 0xE0) >> 5)
-#define GERUDO_PURPLE_GET_PATH(thisx) ((((thisx)->params) & 0xFC00) >> 10)
+#define GERUDO_PURPLE_GET_PATH_INDEX(thisx) ((((thisx)->params) & 0xFC00) >> 10)
-#define GERUDO_PURPLE_PARAMS(path, type, exit) (((path) & 0x1F) | (((type) & 7) << 5) | (((exit) & 0x3F) << 10))
+#define GERUDO_PURPLE_PARAMS(exit, type, pathIndex) (((exit) & 0x1F) | (((type) & 7) << 5) | (((pathIndex) & 0x3F) << 10))
#define GERUDO_PURPLE_EXIT_NONE 0x1F
-#define GERUDO_PURPLE_PATH_NONE 0x3F
+#define GERUDO_PRUPLE_PATH_INDEX_NONE 0x3F
typedef enum {
/* 0 */ GERUDO_PURPLE_TYPE_CUTSCENE,
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..6621ecc93 100644
--- a/src/overlays/actors/ovl_En_Geg/z_en_geg.c
+++ b/src/overlays/actors/ovl_En_Geg/z_en_geg.c
@@ -135,17 +135,17 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronDropKegAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
@@ -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_Gg/z_en_gg.h b/src/overlays/actors/ovl_En_Gg/z_en_gg.h
index cc744cffa..802024897 100644
--- a/src/overlays/actors/ovl_En_Gg/z_en_gg.h
+++ b/src/overlays/actors/ovl_En_Gg/z_en_gg.h
@@ -21,7 +21,7 @@ typedef struct EnGgStruct {
/* 0x40 */ s32 unk_40;
/* 0x44 */ s32 unk_44;
/* 0x48 */ u8 unk_48;
-} EnGgStruct; // size == 0x4C
+} EnGgStruct; // size = 0x4C
typedef struct EnGg {
/* 0x000 */ Actor actor;
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..3540b1a24 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.c
@@ -183,14 +183,14 @@ void func_80B3B0A0(EnGg2* this, PlayState* play) {
void func_80B3B120(EnGg2* this, PlayState* play) {
Vec3s sp30;
- if (this->unk_1D8 != NULL) {
- func_80B3B7E4(this->unk_1D8, this->unk_1DC, &this->actor.world.pos, &sp30);
+ if (this->path != NULL) {
+ func_80B3B7E4(this->path, this->unk_1DC, &this->actor.world.pos, &sp30);
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
Math_SmoothStepToS(&this->actor.shape.rot.x, sp30.x, 4, 0x3E8, 1);
this->actor.world.rot.x = -this->actor.shape.rot.x;
- if (func_80B3B648(this, this->unk_1D8, this->unk_1DC) != 0) {
- if (this->unk_1DC >= (this->unk_1D8->count - 2)) {
+ if (func_80B3B648(this, this->path, this->unk_1DC) != 0) {
+ if (this->unk_1DC >= (this->path->count - 2)) {
this->actionFunc = func_80B3AE60;
this->actor.speed = 0.0f;
} else {
@@ -227,15 +227,15 @@ void func_80B3B294(EnGg2* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_20_10);
}
- if (this->unk_1D8 != NULL) {
- func_80B3B7E4(this->unk_1D8, this->unk_1DC, &this->actor.world.pos, &sp30);
+ if (this->path != NULL) {
+ func_80B3B7E4(this->path, this->unk_1DC, &this->actor.world.pos, &sp30);
Math_SmoothStepToS(&this->actor.world.rot.y, sp30.y, 4, 0x3E8, 1);
this->actor.shape.rot.y = this->actor.world.rot.y;
Math_SmoothStepToS(&this->actor.shape.rot.x, sp30.x, 4, 0x3E8, 1);
this->actor.world.rot.x = -this->actor.shape.rot.x;
- if (func_80B3B648(this, this->unk_1D8, this->unk_1DC)) {
- if (this->unk_1DC < (this->unk_1D8->count - 1)) {
+ if (func_80B3B648(this, this->path, this->unk_1DC)) {
+ if (this->unk_1DC < (this->path->count - 1)) {
this->unk_1DC++;
} else {
this->unk_2F1 = 1;
@@ -310,7 +310,7 @@ s32 func_80B3B648(EnGg2* this, Path* path, s32 arg2_) {
phi_f14 = points[arg2 + 1].z - points[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -369,7 +369,7 @@ void EnGg2_Init(Actor* thisx, PlayState* play2) {
this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_400;
SkelAnime_InitFlex(play, &this->skelAnime, &object_gg_Skel_00F6C0, &object_gg_Anim_00F578, this->jointTable,
this->morphTable, 20);
- this->unk_1D8 = SubS_GetPathByIndex(play, ENGG2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENGG2_GET_PATH_INDEX(&this->actor), ENGG2_PATH_INDEX_NONE);
this->actor.flags &= ~ACTOR_FLAG_REACT_TO_LENS;
this->unk_2F0 = 0;
this->unk_2F1 = 0;
@@ -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_Gg2/z_en_gg2.h b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
index ff7aec4a6..83b4bad42 100644
--- a/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
+++ b/src/overlays/actors/ovl_En_Gg2/z_en_gg2.h
@@ -7,14 +7,16 @@ struct EnGg2;
typedef void (*EnGg2ActionFunc)(struct EnGg2*, PlayState*);
-#define ENGG2_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENGG2_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENGG2_PATH_INDEX_NONE 0x3F
typedef struct EnGg2 {
/* 0x000 */ Actor actor;
/* 0x144 */ UNK_TYPE1 unk144[0x4C];
/* 0x190 */ SkelAnime skelAnime;
/* 0x1D4 */ EnGg2ActionFunc actionFunc;
- /* 0x1D8 */ Path* unk_1D8;
+ /* 0x1D8 */ Path* path;
/* 0x1DC */ s32 unk_1DC;
/* 0x1E0 */ Vec3s unk_1E0;
/* 0x1E6 */ Vec3s unk_1E6;
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..29f7059a5 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
@@ -114,6 +114,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_MOUNTAIN_TERMINA_FIELD:
case GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_MOUNTAIN_GIANTS_CHAMBER_AND_ENDING:
@@ -122,6 +123,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_OCEAN_TERMINA_FIELD:
case GIANT_TYPE_OCEAN_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_OCEAN_GIANTS_CHAMBER_AND_ENDING:
@@ -130,6 +132,7 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
case GIANT_TYPE_CANYON_TERMINA_FIELD:
case GIANT_TYPE_CANYON_CLOCK_TOWER_SUCCESS:
case GIANT_TYPE_CANYON_GIANTS_CHAMBER_AND_ENDING:
@@ -138,6 +141,9 @@ s32 EnGiant_IsImprisoned(EnGiant* this) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
@@ -229,11 +235,13 @@ void EnGiant_Init(Actor* thisx, PlayState* play) {
case 10:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE2 - SFX_FLAG;
break;
+
case 1:
case 2:
case 3:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE1 - SFX_FLAG;
break;
+
default:
this->sfxId = NA_SE_EV_KYOJIN_GRATITUDE0 - SFX_FLAG;
break;
@@ -361,47 +369,56 @@ void EnGiant_PlayAndUpdateAnimation(EnGiant* this) {
case GIANT_CUE_ID_LOOKING_UP:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_LOOK_UP_START);
break;
+
case GIANT_CUE_ID_RAISING_ARMS:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_RAISED_ARMS_START);
break;
+
case GIANT_CUE_ID_STRUGGLING:
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_STRUGGLE_START);
break;
+
case GIANT_CUE_ID_FALLING_OVER:
// Unused
EnGiant_ChangeToStartOrLoopAnimation(this, GIANT_ANIM_FALLING_OVER);
break;
+
case GIANT_CUE_ID_TALKING:
EnGiant_ChangeAnim(this, GIANT_ANIM_BIG_CALL_LOOP);
break;
+
case GIANT_CUE_ID_DONE_TALKING:
case GIANT_CUE_ID_PLAYER_LEARNED_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_IDLE_LOOP);
break;
+
case GIANT_CUE_ID_TEACHING_OATH_TO_ORDER:
EnGiant_ChangeAnim(this, GIANT_ANIM_SMALL_CALL_LOOP);
break;
+
+ default:
+ break;
}
SkelAnime_Update(&this->skelAnime);
}
}
void EnGiant_PlaySound(EnGiant* this) {
- if (this->actor.draw != NULL && this->alpha > 0) {
- if (this->animIndex == GIANT_ANIM_WALKING_LOOP &&
+ if ((this->actor.draw != NULL) && (this->alpha > 0)) {
+ if ((this->animIndex == GIANT_ANIM_WALKING_LOOP) &&
(Animation_OnFrame(&this->skelAnime, 40.0f) || Animation_OnFrame(&this->skelAnime, 100.0f))) {
Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_WALK);
}
- if (this->animIndex == GIANT_ANIM_FALLING_OVER && Animation_OnFrame(&this->skelAnime, 40.0f)) {
+ if ((this->animIndex == GIANT_ANIM_FALLING_OVER) && Animation_OnFrame(&this->skelAnime, 40.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_KYOJIN_VOICE_FAIL);
}
- if (this->sfxId != 0xFFFF &&
- ((this->animIndex == GIANT_ANIM_BIG_CALL_START && this->skelAnime.curFrame >= 18.0f) ||
- this->animIndex == GIANT_ANIM_BIG_CALL_LOOP)) {
+ if ((this->sfxId != 0xFFFF) &&
+ (((this->animIndex == GIANT_ANIM_BIG_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_BIG_CALL_LOOP))) {
func_800B9010(&this->actor, this->sfxId);
}
- if ((this->animIndex == GIANT_ANIM_SMALL_CALL_START && this->skelAnime.curFrame >= 18.0f) ||
- this->animIndex == GIANT_ANIM_SMALL_CALL_LOOP) {
+ if (((this->animIndex == GIANT_ANIM_SMALL_CALL_START) && (this->skelAnime.curFrame >= 18.0f)) ||
+ (this->animIndex == GIANT_ANIM_SMALL_CALL_LOOP)) {
func_800B9010(&this->actor, NA_SE_EV_KYOJIN_SIGN - SFX_FLAG);
}
}
@@ -509,7 +526,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 +534,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_Giant/z_en_giant.h b/src/overlays/actors/ovl_En_Giant/z_en_giant.h
index 45e89dd55..5842a62da 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.h
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.h
@@ -35,7 +35,7 @@ typedef enum {
/* 12 */ GIANT_TYPE_MOUNTAIN_CLOCK_TOWER_FAILURE,
/* 13 */ GIANT_TYPE_CANYON_CLOCK_TOWER_FAILURE,
/* 14 */ GIANT_TYPE_SWAMP_CLOCK_TOWER_FAILURE,
- /* 15 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE,
+ /* 15 */ GIANT_TYPE_OCEAN_CLOCK_TOWER_FAILURE
} GiantType;
struct EnGiant;
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..b40c2287a 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
@@ -47,7 +47,7 @@ typedef enum {
/* 1 */ GINKO_ANIM_SITTING,
/* 2 */ GINKO_ANIM_REACHING,
/* 3 */ GINKO_ANIM_AMAZED,
- /* 4 */ GINKO_ANIM_ADVERTISING,
+ /* 4 */ GINKO_ANIM_ADVERTISING
} GinkoAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -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_GirlA/z_en_girla.c b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
index 90e449be3..1859cf83f 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c
@@ -234,7 +234,7 @@ s32 EnGirlA_CanBuyArrows(PlayState* play, EnGirlA* this) {
}
s32 EnGirlA_CanBuyNuts(PlayState* play, EnGirlA* this) {
- if (CUR_CAPACITY(UPG_NUTS) != 0 && CUR_CAPACITY(UPG_NUTS) <= AMMO(ITEM_NUT)) {
+ if ((CUR_CAPACITY(UPG_NUTS) != 0) && (CUR_CAPACITY(UPG_NUTS) <= AMMO(ITEM_NUT))) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
@@ -257,7 +257,7 @@ s32 EnGirlA_CanBuyShieldHero(PlayState* play, EnGirlA* this) {
}
s32 EnGirlA_CanBuyStick(PlayState* play, EnGirlA* this) {
- if (CUR_CAPACITY(UPG_STICKS) != 0 && AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS)) {
+ if ((CUR_CAPACITY(UPG_STICKS) != 0) && (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS))) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.save.saveInfo.playerData.rupees < play->msgCtx.unk1206C) {
@@ -385,18 +385,24 @@ void EnGirlA_BuyBottleItem(PlayState* play, EnGirlA* this) {
case SI_POTION_RED_6:
Item_Give(play, ITEM_POTION_RED);
break;
+
case SI_POTION_GREEN_1:
case SI_POTION_GREEN_2:
case SI_POTION_GREEN_3:
Item_Give(play, ITEM_POTION_GREEN);
break;
+
case SI_POTION_BLUE:
Item_Give(play, ITEM_POTION_BLUE);
break;
+
case SI_FAIRY_1:
case SI_FAIRY_2:
Item_Give(play, ITEM_FAIRY);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -411,9 +417,13 @@ void EnGirlA_BuyNuts(PlayState* play, EnGirlA* this) {
case 5:
Item_Give(play, ITEM_NUTS_5);
break;
+
case 10:
Item_Give(play, ITEM_NUTS_10);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -439,12 +449,17 @@ void EnGirlA_BuyBombBag(PlayState* play, EnGirlA* this) {
case 20:
Item_Give(play, ITEM_BOMB_BAG_20);
break;
+
case 21:
Item_Give(play, ITEM_BOMB_BAG_30);
break;
+
case 22:
Item_Give(play, ITEM_BOMB_BAG_40);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -461,15 +476,21 @@ void EnGirlA_BuyBombs(PlayState* play, EnGirlA* this) {
case 5:
Item_Give(play, ITEM_BOMBS_5);
break;
+
case 10:
Item_Give(play, ITEM_BOMBS_10);
break;
+
case 20:
Item_Give(play, ITEM_BOMBS_20);
break;
+
case 30:
Item_Give(play, ITEM_BOMBS_30);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
@@ -484,15 +505,21 @@ void EnGirlA_BuySword(PlayState* play, EnGirlA* this) {
case 1:
Item_Give(play, ITEM_SWORD_KOKIRI);
break;
+
case 2:
Item_Give(play, ITEM_SWORD_RAZOR);
break;
+
case 3:
Item_Give(play, ITEM_SWORD_GILDED);
break;
+
case 4:
Item_Give(play, ITEM_SWORD_GREAT_FAIRY);
break;
+
+ default:
+ break;
}
Rupees_ChangeBy(-play->msgCtx.unk1206C);
}
diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
index f61b50b5a..e155ef6df 100644
--- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
+++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h
@@ -48,16 +48,16 @@ typedef struct EnGirlA {
} EnGirlA; // size = 0x1CC
typedef enum {
- /* 0x0 */ CANBUY_RESULT_SUCCESS_1,
- /* 0x1 */ CANBUY_RESULT_SUCCESS_2,
- /* 0x2 */ CANBUY_RESULT_NO_ROOM,
- /* 0x3 */ CANBUY_RESULT_NEED_EMPTY_BOTTLE,
- /* 0x4 */ CANBUY_RESULT_NEED_RUPEES,
- /* 0x5 */ CANBUY_RESULT_CANNOT_GET_NOW,
- /* 0x6 */ CANBUY_RESULT_CANNOT_GET_NOW_2,
- /* 0x7 */ CANBUY_RESULT_NO_ROOM_2,
- /* 0x8 */ CANBUY_RESULT_ALREADY_HAVE,
- /* 0x9 */ CANBUY_RESULT_HAVE_BETTER
+ /* 0 */ CANBUY_RESULT_SUCCESS_1,
+ /* 1 */ CANBUY_RESULT_SUCCESS_2,
+ /* 2 */ CANBUY_RESULT_NO_ROOM,
+ /* 3 */ CANBUY_RESULT_NEED_EMPTY_BOTTLE,
+ /* 4 */ CANBUY_RESULT_NEED_RUPEES,
+ /* 5 */ CANBUY_RESULT_CANNOT_GET_NOW,
+ /* 6 */ CANBUY_RESULT_CANNOT_GET_NOW_2,
+ /* 7 */ CANBUY_RESULT_NO_ROOM_2,
+ /* 8 */ CANBUY_RESULT_ALREADY_HAVE,
+ /* 9 */ CANBUY_RESULT_HAVE_BETTER
} EnGirlACanBuyResult;
typedef enum {
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..1db4d7c5b 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.c
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.c
@@ -374,7 +374,7 @@ s32 func_80B50C78(EnGk* this, Path* path, s32 arg2_) {
phi_f14 = sp5C[arg2 + 1].z - sp5C[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -830,7 +830,7 @@ void func_80B51EA4(EnGk* this, PlayState* play) {
}
void func_80B51FD0(EnGk* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (this->unk_1E4 & 2) {
func_801A4748(&this->actor.projectedPos, NA_SE_EN_GOLON_KID_CRY - SFX_FLAG);
} else {
@@ -897,7 +897,7 @@ void func_80B5227C(EnGk* this, PlayState* play) {
func_800B14D4(play, 20.0f, &this->actor.home.pos);
this->unk_350 = 60;
if (!(this->unk_1E4 & 0x80)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
this->unk_350 = 0x4000;
@@ -955,22 +955,22 @@ void func_80B52430(EnGk* this, PlayState* play) {
}
void func_80B5253C(EnGk* this, PlayState* play) {
- s32 sp24;
+ s32 getItemId;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_41_08)) {
- sp24 = 0x93;
+ getItemId = GI_GOLD_DUST_2;
} else {
- sp24 = 0x6A;
+ getItemId = GI_GOLD_DUST;
}
if (Actor_HasParent(&this->actor, play)) {
this->actor.parent = NULL;
- if (sp24 == 0x6A) {
+ if (getItemId == GI_GOLD_DUST) {
SET_WEEKEVENTREG(WEEKEVENTREG_41_08);
}
this->actionFunc = func_80B525E0;
} else {
- Actor_OfferGetItem(&this->actor, play, sp24, 300.0f, 300.0f);
+ Actor_OfferGetItem(&this->actor, play, getItemId, 300.0f, 300.0f);
}
}
@@ -987,7 +987,7 @@ void func_80B525E0(EnGk* this, PlayState* play) {
void func_80B52654(EnGk* this, PlayState* play) {
this->unk_350 += 0x400;
if ((this->unk_1E4 & 0x80) && (play->csCtx.curFrame == 250)) {
- SET_WEEKEVENTREG(WEEKEVENTREG_22_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON);
}
this->unk_354 = Math_SinS(this->unk_350) * 0.006f * 0.06f;
@@ -1025,7 +1025,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
} else {
this->csId = this->actor.csId;
- this->path = SubS_GetPathByIndex(play, ENGK_GET_F0(&this->actor), 0xF);
+ this->path = SubS_GetPathByIndex(play, ENGK_GET_PATH_INDEX(&this->actor), ENGK_PATH_INDEX_NONE);
this->actionFunc = func_80B51760;
}
} else if (play->sceneId == SCENE_GORONRACE) {
@@ -1044,7 +1044,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
}
} else if (ENGK_GET_F(&this->actor) == ENGK_F_2) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFunc = func_80B51FD0;
this->actor.draw = NULL;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1052,7 +1052,7 @@ void EnGk_Init(Actor* thisx, PlayState* play) {
} else {
Actor_Kill(&this->actor);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->unk_2E4 = 0;
this->csId = this->actor.csId;
this->actor.flags |= ACTOR_FLAG_10;
@@ -1076,7 +1076,7 @@ void EnGk_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((ENGK_GET_F(&this->actor) == ENGK_F_1) ||
- ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((ENGK_GET_F(&this->actor) == ENGK_F_0) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
func_80B507A0(this, play);
SkelAnime_Update(&this->skelAnime);
Actor_TrackPlayer(play, &this->actor, &this->unk_1D8, &this->unk_1DE, this->actor.focus.pos);
@@ -1233,16 +1233,16 @@ 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)) {
+ if ((ENGK_GET_F(&this->actor) == ENGK_F_0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
Matrix_RotateXS(-0x4000, 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_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_Gk/z_en_gk.h b/src/overlays/actors/ovl_En_Gk/z_en_gk.h
index 0f74c1d65..130b97675 100644
--- a/src/overlays/actors/ovl_En_Gk/z_en_gk.h
+++ b/src/overlays/actors/ovl_En_Gk/z_en_gk.h
@@ -8,17 +8,19 @@ struct EnGk;
typedef void (*EnGkActionFunc)(struct EnGk*, PlayState*);
#define ENGK_GET_F(thisx) ((thisx)->params & 0xF)
-#define ENGK_GET_F0(thisx) (((thisx)->params & 0xF0) >> 4)
+#define ENGK_GET_PATH_INDEX(thisx) (((thisx)->params & 0xF0) >> 4)
#define ENGK_GET_3F00(thisx) (((thisx)->params & 0x3F00) >> 8)
-enum {
+#define ENGK_PATH_INDEX_NONE 0xF
+
+typedef enum {
/* 0 */ ENGK_F_0,
/* 1 */ ENGK_F_1,
/* 2 */ ENGK_F_2,
/* 3 */ ENGK_F_3,
/* 4 */ ENGK_F_4,
- /* 5 */ ENGK_F_5,
-};
+ /* 5 */ ENGK_F_5
+} EnGkParam;
typedef struct EnGk {
/* 0x000 */ Actor actor;
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..bcdb20431 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -973,7 +973,7 @@ s32 func_8094F53C(EnGm* this, PlayState* play) {
}
s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 arg3, s16 arg4) {
- u8 sp4F = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -985,7 +985,7 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
actor = func_8094DEE0(this, play, arg3, arg4);
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if ((actor != NULL) && (actor->update != NULL)) {
@@ -1004,7 +1004,7 @@ s32 func_8094F7D0(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -1016,10 +1016,10 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
door = func_8094DF90(play, scheduleOutput->result);
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, 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;
@@ -1051,14 +1051,14 @@ s32 func_8094F904(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_8094FAC4(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
this->timePath = NULL;
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -1152,7 +1152,7 @@ s32 func_8094FE10(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
static Vec3f D_80951D9C = { 64.0f, 0.0f, -122.0f };
- u8 sp4F = ENGM_GET_FF(&this->actor);
+ u8 pathIndex = ENGM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -1162,7 +1162,7 @@ s32 func_8094FF04(EnGm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80951A0C[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80951A0C[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80951A0C[scheduleOutput->result]);
}
if (this->timePath != NULL) {
@@ -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_Gm/z_en_gm.h b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
index 6eede0744..760c9d91c 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.h
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
@@ -9,7 +9,7 @@ typedef void (*EnGmActionFunc)(struct EnGm*, PlayState*);
typedef s32 (*EnGmUnkFunc)(struct EnGm*, PlayState*);
typedef void (*EnGmUnkFunc2)(struct EnGm*, PlayState*);
-#define ENGM_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define ENGM_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct EnGm {
/* 0x000 */ Actor actor;
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..216d5c301 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.c
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.c
@@ -2,41 +2,208 @@
* File: z_en_go.c
* Overlay: ovl_En_Go
* Description: Goron
+ *
+ * This actor handles multiple (but not all) Gorons. The Gorons included are:
+ * - Athletics Goron: Gorons in the racetrack performing stretches before/after a race.
+ * - Spectator Goron: Gorons scattered throughout the racetrack watching the race.
+ * - Gatekeeper Goron: The Gatekeeper of the Goron Shrine.
+ * - Graveyard Goron: Both Gorons outside the Goron Graveyard (one of which is initially frozen).
+ * - Shrine Goron: Gorons in the Goron Shrine (specifically, one in the elders room, one outside the elder's room, and
+ * one outside the shop, not all Gorons in the Goron Shrine are covered by this actor).
+ * - Medigoron: The Powder Keg making Medigoron in Goron Village.
*/
-
#include "z_en_go.h"
#include "z64quake.h"
-#include "objects/object_oF1d_map/object_oF1d_map.h"
+#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "objects/object_hakugin_demo/object_hakugin_demo.h"
#include "objects/object_taisou/object_taisou.h"
#include "objects/gameplay_keep/gameplay_keep.h"
+#include "overlays/actors/ovl_Obj_Aqua/z_obj_aqua.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
-
#define THIS ((EnGo*)thisx)
+#define ENGO_STANDING_Y_OFFSET 0.0f // Actor shape offset in use when a Goron is in any standing state.
+#define ENGO_ROLLEDUP_Y_OFFSET 14.0f // Actor shape offset in use when a Goron is "rolled up".
+#define ENGO_SNOWBALL_Y_OFFSET 46.0f // Actor shape offset in use when a Goron is in a snowball.
+
+#define ENGO_NORMAL_SCALE 0.01f // "Unit Scale" of a normal Goron.
+#define ENGO_MEDIGORON_SCALE_MULTIPLIER 5.0f // Scale factor for the Medigoron in the Powder Keg Shop.
+
+#define ENGO_POUND_INITIAL_RISE_VEL 10.0f // Velocity at which the Gatekeeper's pound surges into the air.
+#define ENGO_POUND_INITIAL_FALL_VEL -6.0f // Velocity at which the Gatekeeper's pound surges to the ground.
+
+#define ENGO_DUST_STEAM_LIFETIME 16 // Lifetime in frames of the Dust and Steam effects.
+
+#define ENGO_FLAG_ENGAGED (1 << 3)
+#define ENGO_FLAG_FACE_TARGET (1 << 4)
+#define ENGO_FLAG_EYES_OPEN (1 << 5)
+#define ENGO_FLAG_LOST_ATTENTION (1 << 6)
+#define ENGO_FLAG_STANDING (1 << 7)
+#define ENGO_FLAG_SNOWBALLED (1 << 8)
+#define ENGO_FLAG_ROLLED_UP (1 << 9)
+#define ENGO_FLAG_FROZEN (1 << 10)
+#define ENGO_FLAG_HIT_OTHER (1 << 11)
+#define ENGO_FLAG_HIT_BY_OTHER (1 << 12)
+#define ENGO_FLAG_HIT_OBJ (1 << 13)
+#define ENGO_FLAG_ROLLING_UP (1 << 14)
+#define ENGO_FLAG_UNROLLING (1 << 15)
+
void EnGo_Init(Actor* thisx, PlayState* play);
void EnGo_Destroy(Actor* thisx, PlayState* play);
void EnGo_Update(Actor* thisx, PlayState* play);
+void EnGo_Draw(Actor* thisx, PlayState* play);
-void func_80A14798(EnGo* this, PlayState* play);
-void func_80A149B0(EnGo* this, PlayState* play);
-void func_80A14B30(EnGo* this, PlayState* play);
-void func_80A14E14(EnGo* this, PlayState* play);
-void func_80A14E74(EnGo* this, PlayState* play);
-void func_80A14EB0(EnGo* this, PlayState* play);
-void func_80A14FC8(EnGo* this, PlayState* play);
-void func_80A153FC(EnGo* this, PlayState* play);
-void func_80A157C4(EnGo* this, PlayState* play);
-void func_80A15FEC(Actor* thisx, PlayState* play);
+typedef enum EnGoEyeTexture {
+ /* 0 */ ENGO_EYETEX_OPEN,
+ /* 1 */ ENGO_EYETEX_HALF,
+ /* 2 */ ENGO_EYETEX_CLOSED,
+ /* 3 */ ENGO_EYETEX_HALF2,
+ /* 4 */ ENGO_EYETEX_CLOSED2
+} EnGoEyeTexture;
-static s32 D_80A16100[] = {
+typedef enum EnGoSleepState {
+ /* -1 */ ENGO_ASLEEP_NEG = -1,
+ /* 0 */ ENGO_AWAKE,
+ /* 1 */ ENGO_ASLEEP_POS
+} EnGoSleepState;
+
+typedef enum EnGoEffectType {
+ /* 0 */ ENGO_EFFECT_NONE,
+ /* 1 */ ENGO_EFFECT_SNOW1,
+ /* 2 */ ENGO_EFFECT_SNOW2,
+ /* 3 */ ENGO_EFFECT_SNOW3,
+ /* 4 */ ENGO_EFFECT_DUST_MIN,
+ /* 4 */ ENGO_EFFECT_DUST1 = ENGO_EFFECT_DUST_MIN,
+ /* 5 */ ENGO_EFFECT_DUST2,
+ /* 6 */ ENGO_EFFECT_DUST3,
+ /* 7 */ ENGO_EFFECT_STEAM_MIN,
+ /* 7 */ ENGO_EFFECT_STEAM = ENGO_EFFECT_STEAM_MIN
+} EnGoEffectType;
+
+typedef enum EnGoAnimationIndex {
+ /* -1 */ ENGO_ANIM_INVALID = -1,
+ /* 0 */ ENGO_ANIM_GORON_MIN,
+ /* 0 */ ENGO_ANIM_LYINGDOWNIDLE = ENGO_ANIM_GORON_MIN,
+ /* 1 */ ENGO_ANIM_LYINGDOWNIDLE_IMM,
+ /* 2 */ ENGO_ANIM_UNROLL,
+ /* 3 */ ENGO_ANIM_UNROLL_IMM,
+ /* 4 */ ENGO_ANIM_ROLL,
+ /* 5 */ ENGO_ANIM_SHIVER,
+ /* 6 */ ENGO_ANIM_SHIVER_IMM,
+ /* 7 */ ENGO_ANIM_DROPKEG,
+ /* 8 */ ENGO_ANIM_COVEREARS,
+ /* 9 */ ENGO_ANIM_SHIVERINGSURPRISED,
+ /* 10 */ ENGO_ANIM_ATHLETICS_MIN,
+ /* 10 */ ENGO_ANIM_DOUBLE_ARM_SIDEBEND = ENGO_ANIM_ATHLETICS_MIN,
+ /* 11 */ ENGO_ANIM_SQUAT_SIDE_TO_SIDE,
+ /* 12 */ ENGO_ANIM_SHAKE_LIMBS,
+ /* 13 */ ENGO_ANIM_SINGLE_ARM_SIDEBEND,
+ /* 14 */ ENGO_ANIM_SITTING_STRETCH,
+ /* 15 */ ENGO_ANIM_CHEER,
+ /* 16 */ ENGO_ANIM_SHOUT,
+ /* 17 */ ENGO_ANIM_HELP_SITTING_STRETCH,
+ /* 18 */ ENGO_ANIM_SPRING_MIN,
+ /* 18 */ ENGO_ANIM_SHOW = ENGO_ANIM_SPRING_MIN,
+ /* 19 */ ENGO_ANIM_SHOW_LOOPED,
+ /* 20 */ ENGO_ANIM_LOOK_AROUND,
+ /* 21 */ ENGO_ANIM_LOOK_AROUND_LOOPED
+} EnGoAnimationIndex;
+
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f velocity, f32 scale, f32 deltaScale,
+ s32 maxFrames);
+void EnGo_DrawSteam(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitDust(EnGoEffect effect[], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale, f32 deltaScale, s32 maxFrames,
+ EnGoEffectType parentEffectType);
+void EnGo_DrawDust(EnGoEffect effect[], PlayState* play2);
+
+void EnGo_InitSnow(EnGoEffect effect[], Vec3f pos);
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight);
+void EnGo_DrawSnow(EnGoEffect effect[], PlayState* play, Gfx* material, Gfx* model, u8 effectType);
+
+void EnGo_UpdateEffects(EnGo* this);
+void EnGo_DrawEffects(EnGo* this, PlayState* play);
+
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play);
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateFocus(EnGo* this);
+
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play);
+void EnGo_UpdateCollider(EnGo* this, PlayState* play);
+
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play);
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play);
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play);
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex);
+void EnGo_UpdateEyes(EnGo* this);
+
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play);
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play);
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play);
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play);
+
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play);
+void EnGo_FrozenIdle(EnGo* this, PlayState* play);
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play);
+
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg);
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId);
+
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime);
+void EnGo_AddGatekeeperPoundQuake(PlayState* play, s16 speed, s16 verticalMag, s16 countdown);
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play);
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha);
+void EnGo_MakeSteam(EnGo* this);
+
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play);
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play);
+
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play);
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play);
+
+void EnGo_SetupAthletic(EnGo* this, PlayState* play);
+void EnGo_SetupSpectator(EnGo* this, PlayState* play);
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play);
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play);
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play);
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play);
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play);
+
+void EnGo_Idle(EnGo* this, PlayState* play);
+void EnGo_Sleep(EnGo* this, PlayState* play);
+void EnGo_Frozen(EnGo* this, PlayState* play);
+void EnGo_AwaitThaw(EnGo* this, PlayState* play);
+void EnGo_Thaw(EnGo* this, PlayState* play);
+
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play);
+
+void EnGo_Snowball(EnGo* this, PlayState* play);
+
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play);
+
+void EnGo_Talk(EnGo* this, PlayState* play);
+
+// MsgEvent script for the Goron who made Darmani's grave in the mountain village.
+static s32 sMsgScriptGoronGravemaker[] = {
0x00150800, 0x40010022, 0x00150200, 0x180E0E10, 0x0C0F0E11, 0x0C0F0E12, 0x0C0F0E13, 0x0C0F0E14, 0x0C111502,
0x100E0E15, 0x0C100015, 0x0400110E, 0x0E160C0F, 0x0E170C0F, 0x0E180C11, 0x15041610, 0x0E0E190C, 0x10001504,
0x000D0100, 0x050E0E31, 0x0C100E0E, 0x2F0C1001, 0x00050E0E, 0x2D0C100E, 0x0E2B0C10,
};
-static s32 D_80A16164[] = {
+// MsgEvent script for the frozen Goron aside the gravemaker in the mountain village.
+static s32 sMsgScriptGoronFrozen[] = {
0x00150800, 0x7E01004D, 0x00150400, 0x180E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C12, 0x16111508,
0x100E0E1A, 0x0C170F0E, 0x230C180F, 0x0E240C0F, 0x0E250C17, 0x0F0E260C, 0x180F0E27, 0x0C170F0E, 0x280C180F,
0x0E290C17, 0x0F0E2A0C, 0x16111508, 0x100E0E1A, 0x0C170F0E, 0x1B0C180F, 0x0E1C0C0F, 0x0E1D0C0F, 0x0E1E0C17,
@@ -44,19 +211,23 @@ static s32 D_80A16164[] = {
0x0E0E300C, 0x10010005, 0x0E0E2E0C, 0x100E0E2C, 0x0C100000,
};
-static s32 D_80A16208[2] = { 0xE0E520C, 0x10000000 };
+// MsgEvent script for the shrine Goron standing aside the store.
+static s32 sMsgScriptGoronAsideStore[] = { 0xE0E520C, 0x10000000 };
-static s32 D_80A16210[17] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's son.
+static s32 sMsgScriptGoronAsideEldersSon[] = {
0x160400, 0x38010010, 0xE0E430C, 0xF0E440C, 0xF0E450C, 0x11188010, 0x160800, 0x1B0E0E46, 0xC0F0E47,
0xC0F0E48, 0xC0F0E49, 0xC0F0E4A, 0xC111608, 0x11188010, 0xE0E4B0C, 0x100E0E42, 0xC100000,
};
-static s32 D_80A16254[11] = {
+// MsgEvent script for the shrine Goron standing aside the Elder's room.
+static s32 sMsgScriptGoronAsideEldersRoom[] = {
0x160400, 0x22010009, 0xE0E4D0C, 0xF0E4E0C, 0x10001701, 0xC0E0E,
0x4F0C0F0E, 0x500C1117, 0x1100E0E, 0x510C100E, 0xE4C0C10,
};
-static s32 D_80A16280[52] = {
+// MsgEvent script for the Goron in Goron Village who sells Powder Kegs.
+static s32 sMsgScriptGoronMedigoron[] = {
0x1001200, 0x12200008, 0xE0C8E0C, 0x11122010, 0xE0C8F0C, 0x10001240, 0x1D0E0C, 0x800C1112, 0x40001280,
0x742500, 0xC006F00, 0x13010045, 0xF0C810C, 0x19001300, 0x1280005E, 0x25000C00, 0x59001301, 0x2F0E0C,
0x810C0F0C, 0x820C0500, 0x1A00, 0x1A300E0C, 0x830C1209, 0x700, 0xE0C84, 0x160C1113, 0x1100E0C,
@@ -65,18 +236,30 @@ static s32 D_80A16280[52] = {
0x14FF9C12, 0x6003400, 0x130034, 0x700000E, 0xC870C16, 0x100E0C8B, 0xC100000,
};
-static s32 D_80A16350[27] = {
+// MsgEvent script for the gatekeeper Goron in Goron Village who opens the shrine gate.
+static s32 sMsgScriptGoronGatekeeper[] = {
0x584000, 0x2903000E, 0x2001301, 0x180058, 0x80005119, 0x1E0059, 0x1004919, 0x160059, 0x2004119,
0xE0059, 0x4003919, 0x2F0E0D, 0x4D0C1210, 0xE0D480C, 0xF0D490C, 0xF0D4A0C, 0x5000000, 0xF000F30,
0xE0D4B0C, 0x15090000, 0xE0D4D0C, 0x1210310E, 0xD4C0C12, 0x100E0D4E, 0xC19FFD8, 0xE0D4F0C, 0x19FFD500,
};
-static s32 D_80A163BC[4] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
-static s32 D_80A163CC[4] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
-static s32 D_80A163DC[4] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
-static s32 D_80A163EC[4] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
-static s32 D_80A163FC[4] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
-static s32 D_80A1640C[2] = { 0xE023A0C, 0x12100000 };
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially stretching side to side while squatting).
+static s32 sMsgScriptGoronAthleticA[] = { 0x100060E, 0xDFE0C12, 0x100E0DFF, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially doing sidebend stretches with one arm).
+static s32 sMsgScriptGoronAthleticB[] = { 0x100060E, 0xE000C12, 0x100E0E01, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers at the racetrack (Initially shaking out their limbs).
+static s32 sMsgScriptGoronAthleticC[] = { 0x100060E, 0xE020C12, 0x100E0E03, 0xC121000 };
+
+// MsgEvent script for one of the Goron stretchers (Initially doing sidebend stretches with both arms).
+static s32 sMsgScriptGoronAthleticD[] = { 0x100060E, 0xE040C12, 0x100E0E05, 0xC121000 };
+
+// MsgEvent script for the pair of Gorons stretching one Goron's hamstrings.
+static s32 sMsgScriptGoronAthleticHamstring[] = { 0x100060E, 0xE060C12, 0x100E0E07, 0xC121000 };
+
+// MsgEvent script for any sleeping Goron.
+static s32 sMsgScriptGoronSleeping[] = { 0xE023A0C, 0x12100000 };
ActorInit En_Go_InitVars = {
ACTOR_EN_GO,
@@ -110,7 +293,8 @@ static ColliderSphereInit sSphereInit = {
{ 0, { { 0, 0, 0 }, 0 }, 100 },
};
-static ColliderCylinderInit sCylinderInit1 = {
+// Collider for the frozen solid Gorons.
+static ColliderCylinderInit sCylinderInitFrozen = {
{
COLTYPE_METAL,
AT_ON | AT_TYPE_ENEMY,
@@ -130,7 +314,8 @@ static ColliderCylinderInit sCylinderInit1 = {
{ 0, 0, 0, { 0, 0, 0 } },
};
-static ColliderCylinderInit sCylinderInit2 = {
+// Collider for normal Gorons.
+static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT1,
AT_NONE,
@@ -152,42 +337,55 @@ static ColliderCylinderInit sCylinderInit2 = {
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
+typedef enum {
+ /* 0x0 */ ENGO_DMGEFF_NONE,
+ /* 0x2 */ ENGO_DMGEFF_FIRE = 0x2,
+ /* 0xF */ ENGO_DMGEFF_BREAK = 0xF
+} EnGoDamageEffect;
+
static DamageTable sDamageTable = {
- /* Deku Nut */ DMG_ENTRY(1, 0x0),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(1, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0x0),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(1, 0x0),
- /* Hookshot */ DMG_ENTRY(1, 0x0),
- /* Goron punch */ DMG_ENTRY(1, 0xF),
- /* Sword */ DMG_ENTRY(1, 0x0),
- /* Goron pound */ DMG_ENTRY(1, 0xF),
- /* Fire arrow */ DMG_ENTRY(1, 0x2),
- /* Ice arrow */ DMG_ENTRY(1, 0x0),
- /* Light arrow */ DMG_ENTRY(1, 0x0),
- /* Goron spikes */ DMG_ENTRY(1, 0xF),
- /* Deku spin */ DMG_ENTRY(1, 0x0),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(1, 0x0),
- /* Zora barrier */ DMG_ENTRY(1, 0x0),
- /* Normal shield */ DMG_ENTRY(1, 0x0),
- /* Light ray */ DMG_ENTRY(1, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0x0),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0x0),
- /* Sword beam */ DMG_ENTRY(1, 0x0),
- /* Normal Roll */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(1, 0x0),
- /* Unblockable */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(1, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0x0),
+ /* Deku Nut */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku Stick */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora boomerang */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron punch */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Sword */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Fire arrow */ DMG_ENTRY(1, ENGO_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light arrow */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Goron spikes */ DMG_ENTRY(1, ENGO_DMGEFF_BREAK),
+ /* Deku spin */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku bubble */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora barrier */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal shield */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Zora punch */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, ENGO_DMGEFF_NONE),
};
+/**
+ * Animations used in the actor.
+ *
+ * @see EnGoAnimationIndex
+ */
static AnimationInfoS sAnimationInfo[] = {
+
+ /* Animations for generic Goron actions */
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronLyingDownIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronUnrollAnim, 2.0f, 0, -1, ANIMMODE_ONCE, 0 },
@@ -199,366 +397,453 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiveringSurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0016C8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_0031D8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ /* Animations for stretching Gorons at the racetrack */
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSquatSideToSideAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchSittingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShoutAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_hakugin_demo_Anim_001420, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_001A4C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_hakugin_demo_Anim_002704, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
- { &object_hakugin_demo_Anim_003378, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ /* Animations for the Goron during the spring arrival cutscene */
+ { &gGoronSpringShowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringShowLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronSpringLookAroundAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
+ { &gGoronSpringLookAroundLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
};
-EnGoStruct* func_80A10FD0(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6) {
+/**
+ * Initialize the latter section of the effects in 'effectTable' to be of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be between 'maxFrames / 3' and
+ * 'maxFrames'
+ */
+EnGoEffect* EnGo_InitSteam(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f velocity,
+ f32 scale, f32 deltaScale, s32 maxFrames) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = 7;
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Steam effects are from the end of the snow effects to the end of all effects
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
- }
- return ptr;
+ effect->type = ENGO_EFFECT_STEAM;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = velocity;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
+ }
+ return effect;
}
-void func_80A11144(EnGoStruct* ptr, PlayState* play) {
- s32 pad;
+/**
+ * Draw all effects of type ENGO_EFFECT_STEAM.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawSteam(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
+ PlayState* play = play2;
s32 i;
- s32 flag = false;
- f32 temp;
+ s32 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C2DC(play->state.gfxCtx);
-
- for (i = 0; i < 32; i++, ptr++) {
-
- if (ptr->unk_00 == 7) {
- gDPPipeSync(POLY_XLU_DISP++);
-
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
- flag = true;
- }
-
- Matrix_Push();
-
- temp = ((f32)ptr->unk_02 / ptr->unk_01);
- temp *= 255;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)temp);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, (ptr->unk_02 + (i * 3)) * 3,
- (ptr->unk_02 + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
-
- Matrix_Pop();
- if (play->state.gfxCtx) {}
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_STEAM) {
+ continue;
}
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ alpha *= 255.0f;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)alpha);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, (effect->alphaNumer + (i * 3)) * 3,
+ (effect->alphaNumer + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronSteamModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-void func_80A1143C(EnGoStruct* ptr, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5, s32 arg6, s32 arg7) {
+/**
+ * Initialize the first available effect to be of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect Latter section of the EnGoEffect table (&effectTable[ENGO_SNOW_EFFECT_COUNT])
+ * @param pos Initial pos
+ * @param accel Initial acceleration
+ * @param velocity Initial velocity
+ * @param scale Initial scale
+ * @param deltaScale How much the effect scales per frame (additive)
+ * @param maxFrames Maximum number of frames the effect will last. Actual lifetime will be 1/3 * maxFrames -> maxFrames
+ * @param parentEffectType Type of the parent effect, determines which of the possible dust effects correspond
+ */
+void EnGo_InitDust(EnGoEffect effect[ENGO_OTHER_EFFECT_COUNT], Vec3f pos, Vec3f accel, Vec3f vel, f32 scale,
+ f32 deltaScale, s32 maxFrames, EnGoEffectType parentEffectType) {
s32 i;
- for (i = 16; i < 32; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_00 = arg7 + 4;
-
- ptr->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
- ptr->unk_02 = ptr->unk_01;
-
- ptr->unk_10 = arg1;
- ptr->unk_1C = arg2;
- ptr->unk_28 = arg3;
- ptr->unk_34 = arg4;
- ptr->unk_38 = arg5;
- break;
+ // Dust effects are from the end of the snow effects to the end of all effects.
+ for (i = ENGO_SNOW_EFFECT_COUNT; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->type = parentEffectType + ENGO_EFFECT_DUST_MIN;
+ effect->alphaDenom = (Rand_ZeroOne() * (2.0f * (maxFrames / 3.0f))) + (maxFrames / 3.0f);
+ effect->alphaNumer = effect->alphaDenom;
+ effect->pos = pos;
+ effect->accel = accel;
+ effect->velocity = vel;
+ effect->scaleXY = scale;
+ effect->scaleXYDelta = deltaScale;
+ break;
}
}
-void func_80A115B4(EnGoStruct* ptr, PlayState* play) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_DUST1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ */
+void EnGo_DrawDust(EnGoEffect effect[ENGO_EFFECT_COUNT], PlayState* play2) {
static TexturePtr sDustTextures[] = {
gEffDust8Tex, gEffDust7Tex, gEffDust6Tex, gEffDust5Tex, gEffDust4Tex, gEffDust3Tex, gEffDust2Tex, gEffDust1Tex,
};
- static Color_RGBA8 D_80A16664[] = {
- { 255, 255, 255, 0 },
- { 170, 130, 90, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustPrimColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 170, 130, 90, 0 }, // Light Brown
+ { 0, 0, 0, 0 }, // Black
};
- static Color_RGBA8 D_80A16670[] = {
- { 255, 255, 255, 0 },
- { 100, 60, 20, 0 },
- { 0, 0, 0, 0 },
+ static Color_RGBA8 sEnGoDustEnvColor[] = {
+ { 255, 255, 255, 0 }, // White
+ { 100, 60, 20, 0 }, // Dark Brown
+ { 0, 0, 0, 0 }, // Black
};
+ PlayState* play = play2;
s32 i;
- u8 flag = false;
- f32 temp;
+ u8 isMaterialSet = false;
+ f32 alpha;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C2DC(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);
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
- flag = true;
- }
- Matrix_Push();
-
- temp = (f32)ptr->unk_02 / ptr->unk_01;
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A16664[(s32)ptr->unk_00 - 4].r,
- D_80A16664[(s32)ptr->unk_00 - 4].g, D_80A16664[(s32)ptr->unk_00 - 4].b, (u8)(temp * 255));
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A16670[(s32)ptr->unk_00 - 4].r, D_80A16670[(s32)ptr->unk_00 - 4].g,
- D_80A16670[(s32)ptr->unk_00 - 4].b, 0);
-
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_34, ptr->unk_34, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(temp * 7.0f)]));
- gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
-
- Matrix_Pop();
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if ((effect->type < ENGO_EFFECT_DUST_MIN) || (effect->type >= ENGO_EFFECT_STEAM_MIN)) {
+ continue;
}
- if (play->state.gfxCtx) {}
+
+ if (!isMaterialSet) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustMaterialDL);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)effect->alphaNumer / effect->alphaDenom;
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustPrimColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, (u8)(alpha * UINT8_MAX));
+ gDPSetEnvColor(POLY_XLU_DISP++, sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].r,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].g,
+ sEnGoDustEnvColor[(s32)effect->type - ENGO_EFFECT_DUST_MIN].b, 0);
+
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(effect->scaleXY, effect->scaleXY, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[(s32)(alpha * 7.0f)]));
+ gSPDisplayList(POLY_XLU_DISP++, gGoronDustModelDL);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#ifdef NON_MATCHING
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1) {
- static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
+/**
+ * Initialize the snowball break effects.
+ *
+ * Half of the elements will be 'ENGO_EFFECT_SNOW1'/'2'/'3' randomly generated around the character. The second half
+ * will be dedicated 'ENGO_EFFECT_DUST1'/'2'/'3' paired with the snow.
+ *
+ * @param effect The EnGoEffect table
+ * @param pos Position around which the effects appear
+ */
+void EnGo_InitSnow(EnGoEffect effect[ENGO_EFFECT_COUNT], Vec3f pos) {
+ static u8 effectIndexToSnowEffectTable[] = {
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
+ ENGO_EFFECT_SNOW3, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW1, ENGO_EFFECT_SNOW2,
};
- EnGoStruct* ptr2 = &ptr[16];
+
+ EnGoEffect* dustEffects = &effect[ENGO_SNOW_EFFECT_COUNT];
s32 i;
- Vec3f spB4;
- Vec3f spA8;
- f32 temp_f20;
+ Vec3f randRelativeToWorldPos;
+ Vec3f randYOneToFour;
+ f32 velMagnitude;
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == 0) {
- ptr->unk_10 = arg1;
- ptr->unk_10.y += 56.0f;
-
- ptr->unk_04.x = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.y = (Rand_ZeroOne() - 0.5f) * 5460.0f;
- ptr->unk_04.z = (Rand_ZeroOne() - 0.5f) * 5460.0f;
-
- temp_f20 = (Rand_ZeroOne() * 4.0f) + 6.0f;
- ptr->unk_28.x = Math_SinS(i * 0x1000) * temp_f20;
- ptr->unk_28.z = Math_CosS(i * 0x1000) * temp_f20;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
-
- ptr->unk_1C = gZeroVec3f;
- ptr->unk_1C.y = -0.8f;
-
- ptr->unk_01 = ptr->unk_02 = 1;
- ptr->unk_00 = D_80A1667C[i];
-
- spB4.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.x;
- spB4.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + ptr->unk_10.y;
- spB4.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + ptr->unk_10.z;
-
- spA8 = gZeroVec3f;
- spA8.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
-
- func_80A1143C(ptr2, spB4, gZeroVec3f, spA8, 0.6f, 0.2f, 16, 0);
+ // Snow effects consume the first part of the effects table, and are paired with dust effects in the latter part
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != ENGO_EFFECT_NONE) {
+ continue;
}
+
+ effect->pos = pos;
+ effect->pos.y += 56.0f;
+
+ // Generate a +-15 degree rotational velocity
+ effect->rotVelocity.x = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.y = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+ effect->rotVelocity.z = (Rand_ZeroOne() - 0.5f) * (f32)0x1554;
+
+ // Generate a radially outward velocity for each of the effects
+ velMagnitude = (Rand_ZeroOne() * 4.0f) + 6.0f;
+ effect->velocity.x = Math_SinS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.z = Math_CosS(i * (0x10000 / ENGO_SNOW_EFFECT_COUNT)) * velMagnitude;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 6.0f;
+
+ // No acceleration on the X,Z axis, negative acceleration on the Y axis
+ effect->accel = gZeroVec3f;
+ effect->accel.y = -0.8f;
+
+ // Full visibility (1/1)
+ effect->alphaDenom = effect->alphaNumer = 1;
+
+ // Assign a snow effect value of 'ENGO_EFFECT_SNOW1'/'2'/'3'
+ effect->type = effectIndexToSnowEffectTable[i];
+
+ // Initialize the parameters for the paired element
+ randRelativeToWorldPos.x = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.x;
+ randRelativeToWorldPos.y = ((Rand_ZeroOne() - 0.5f) * 40.0f) + effect->pos.y;
+ randRelativeToWorldPos.z = ((Rand_ZeroOne() - 0.5f) * 80.0f) + effect->pos.z;
+
+ randYOneToFour = gZeroVec3f;
+ randYOneToFour.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+
+ // Initialize the paired element.
+ EnGo_InitDust(dustEffects, randRelativeToWorldPos, gZeroVec3f, randYOneToFour, 0.6f, 0.2f,
+ ENGO_DUST_STEAM_LIFETIME, 0);
}
}
-#else
-static u8 D_80A1667C[] = {
- 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2,
-};
-void func_80A118F8(EnGoStruct* ptr, Vec3f arg1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A118F8.s")
-#endif
-void func_80A11BF8(EnGoStruct* ptr, f32 arg1) {
- f32 test;
- f32 test2;
+/**
+ * Update the snow effect's movement.
+ *
+ * When the snow drops to the ground, it is converted to dust.
+ *
+ * @param effect Pointer to the effect to update
+ * @param dustConversionHeight Height above the ground at which to convert the effect to dust
+ */
+void EnGo_UpdateSnow(EnGoEffect* effect, f32 dustConversionHeight) {
f32 x;
f32 z;
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_34 += ptr->unk_38;
+ effect->velocity.y += effect->accel.y;
+ effect->scaleXY += effect->scaleXYDelta;
- if (ptr->unk_10.y < arg1) {
- ptr->unk_10.y = arg1;
+ if (effect->pos.y < dustConversionHeight) {
+ effect->pos.y = dustConversionHeight;
- ptr->unk_00 = 4;
- ptr->unk_01 = (Rand_ZeroOne() * 8.0f) + 4.0f;
- ptr->unk_02 = ptr->unk_01;
+ effect->type = ENGO_EFFECT_DUST1;
+ effect->alphaDenom = (Rand_ZeroOne() * 8.0f) + 4.0f;
+ effect->alphaNumer = effect->alphaDenom;
- ptr->unk_28 = gZeroVec3f;
- ptr->unk_28.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
+ effect->velocity = gZeroVec3f;
+ effect->velocity.y = (Rand_ZeroOne() * 3.0f) + 1.0f;
- ptr->unk_34 = 0.4f;
- ptr->unk_38 = 0.1f;
+ effect->scaleXY = 0.4f;
+ effect->scaleXYDelta = 0.1f;
return;
}
- if (ptr->unk_28.x != 0.0f) {
- x = ptr->unk_28.x / fabsf(ptr->unk_28.x);
- x *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.x, x, (sREG(14) + 40) * 0.01f);
+ if (effect->velocity.x != 0.0f) {
+ x = effect->velocity.x / fabsf(effect->velocity.x);
+ x *= (sREG(13) + 140) * 0.01f;
+ Math_StepToF(&effect->velocity.x, x, (sREG(14) + 40) * 0.01f);
}
- if (ptr->unk_28.z != 0.0f) {
- z = ptr->unk_28.z / fabsf(ptr->unk_28.z);
+ if (effect->velocity.z != 0.0f) {
+ z = effect->velocity.z / fabsf(effect->velocity.z);
z *= ((sREG(13) + 140) * 0.01f);
- Math_StepToF(&ptr->unk_28.z, z, (sREG(14) + 40) * 0.01f);
+ Math_StepToF(&effect->velocity.z, z, (sREG(14) + 40) * 0.01f);
}
- ptr->unk_0A.x += ptr->unk_04.x;
- ptr->unk_0A.y += ptr->unk_04.y;
- ptr->unk_0A.z += ptr->unk_04.z;
+ effect->rotAngle.x += effect->rotVelocity.x;
+ effect->rotAngle.y += effect->rotVelocity.y;
+ effect->rotAngle.z += effect->rotVelocity.z;
}
-#ifdef NON_MATCHING
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4) {
+/**
+ * Draw all effects of type 'ENGO_EFFECT_SNOW1'/'2'/'3'.
+ *
+ * @param effect The EnGoEffect table
+ * @param material Snow Material
+ * @param model Snow Model
+ * @param type Snow Effect type to draw
+ */
+void EnGo_DrawSnow(EnGoEffect effect[ENGO_SNOW_EFFECT_COUNT], PlayState* play, Gfx* material, Gfx* model,
+ u8 effectType) {
s32 i;
- u8 flag = false;
+ u8 isMaterialSet = false;
OPEN_DISPS(play->state.gfxCtx);
-
- func_8012C28C(play->state.gfxCtx);
-
- for (i = 0; i < 16; i++, ptr++) {
- if (ptr->unk_00 == arg4) {
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, arg2);
- flag = true;
- }
-
- Matrix_Push();
- Matrix_Translate(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
- Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
- Matrix_RotateZS(ptr->unk_0A.z, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_0A.x, MTXMODE_APPLY);
- Matrix_RotateYS(ptr->unk_0A.y, MTXMODE_APPLY);
-
- if (1) {
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, arg3);
- }
-
- Matrix_Pop();
+ Gfx_SetupDL25_Opa(play->state.gfxCtx);
+ for (i = 0; i < ENGO_SNOW_EFFECT_COUNT; i++, effect++) {
+ if (effect->type != effectType) {
+ continue;
}
+
+ if (!isMaterialSet) {
+ gSPDisplayList(POLY_OPA_DISP++, material);
+ isMaterialSet = true;
+ }
+
+ Matrix_Push();
+ Matrix_Translate(effect->pos.x, effect->pos.y, effect->pos.z, MTXMODE_NEW);
+ Matrix_Scale(0.08f, 0.08f, 0.08f, MTXMODE_APPLY);
+ Matrix_RotateZS(effect->rotAngle.z, MTXMODE_APPLY);
+ Matrix_RotateXS(effect->rotAngle.x, MTXMODE_APPLY);
+ Matrix_RotateYS(effect->rotAngle.y, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, model);
+
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A11EC0(EnGoStruct* ptr, PlayState* play, Gfx* arg2, Gfx* arg3, u8 arg4);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Go/func_80A11EC0.s")
-#endif
-void func_80A1203C(EnGo* this) {
- EnGoStruct* ptr = this->unk_3F8;
+/**
+ * Update all effects, potentially fading them away to nothing.
+ */
+void EnGo_UpdateEffects(EnGo* this) {
+ EnGoEffect* effect = this->effectTable;
s32 i;
- for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) {
- if (ptr->unk_00 != 0) {
- if (ptr->unk_02 == 0) {
- ptr->unk_00 = 0;
- } else if ((ptr->unk_00 > 0) && (ptr->unk_00 < 4)) {
- func_80A11BF8(ptr, this->actor.world.pos.y);
- } else {
- ptr->unk_10.x += ptr->unk_28.x;
- ptr->unk_10.y += ptr->unk_28.y;
- ptr->unk_10.z += ptr->unk_28.z;
+ for (i = 0; i < ENGO_EFFECT_COUNT; i++, effect++) {
+ if (effect->type == ENGO_EFFECT_NONE) {
+ continue;
+ }
- ptr->unk_28.x += ptr->unk_1C.x;
- ptr->unk_28.y += ptr->unk_1C.y;
- ptr->unk_28.z += ptr->unk_1C.z;
+ if (effect->alphaNumer == 0) {
+ // End usage of the effect
+ effect->type = ENGO_EFFECT_NONE;
+ } else if ((effect->type > ENGO_EFFECT_NONE) && (effect->type < ENGO_EFFECT_DUST_MIN)) {
+ // Snow rotates, and changes to dust upon dropping below the actor position
+ EnGo_UpdateSnow(effect, this->actor.world.pos.y);
+ } else {
+ // Dust and steam move according to their initial values
+ effect->pos.x += effect->velocity.x;
+ effect->pos.y += effect->velocity.y;
+ effect->pos.z += effect->velocity.z;
- ptr->unk_34 += ptr->unk_38;
- ptr->unk_02--;
- }
+ effect->velocity.x += effect->accel.x;
+ effect->velocity.y += effect->accel.y;
+ effect->velocity.z += effect->accel.z;
+
+ effect->scaleXY += effect->scaleXYDelta;
+ effect->alphaNumer--;
}
}
}
-void func_80A1213C(EnGo* this, PlayState* play) {
- func_80A11EC0(this->unk_3F8, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL, 1);
- func_80A11EC0(this->unk_3F8, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL, 2);
- func_80A11EC0(this->unk_3F8, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL, 3);
- func_80A11144(this->unk_3F8, play);
- func_80A115B4(this->unk_3F8, play);
+/**
+ * Draw all effects.
+ */
+void EnGo_DrawEffects(EnGo* this, PlayState* play) {
+ EnGo_DrawSnow(this->effectTable, play, gGoronLargeSnowballFragmentMaterialDL, gGoronLargeSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW1);
+ EnGo_DrawSnow(this->effectTable, play, gGoronMediumSnowballFragmentMaterialDL, gGoronMediumSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW2);
+ EnGo_DrawSnow(this->effectTable, play, gGoronSmallSnowballFragmentMaterialDL, gGoronSmallSnowballFragmentModelDL,
+ ENGO_EFFECT_SNOW3);
+ EnGo_DrawSteam(this->effectTable, play);
+ EnGo_DrawDust(this->effectTable, play);
}
-s32 func_80A121F4(PlayState* play) {
+/**
+ * Check if the Goron can hurt the player.
+ */
+s32 EnGo_CanSnowballHurtPlayer(PlayState* play) {
Player* player = GET_PLAYER(play);
if ((player->transformation == PLAYER_FORM_GORON) && (player->stateFlags3 & PLAYER_STATE3_2000000)) {
return false;
+ } else {
+ return true;
}
- return true;
}
-s32 func_80A1222C(EnGo* this, PlayState* play) {
+/**
+ * Check if the Goron is falling asleep.
+ */
+s32 EnGo_IsFallingAsleep(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 ret = false;
+ s32 isFallingAsleep = false;
if (((player->transformation == PLAYER_FORM_GORON) && (play->msgCtx.ocarinaMode == 3) &&
- (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->unk_3EC == 0) &&
+ (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) && (this->sleepState == ENGO_AWAKE) &&
(this->actor.xzDistToPlayer < 400.0f)) ||
- (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04) && (play->sceneId == SCENE_16GORON_HOUSE) &&
- (gSaveContext.sceneLayer == 0) && (this->unk_3EC == 0) && (play->csCtx.scriptIndex == 1))) {
- ret = true;
+ (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON) && (play->sceneId == SCENE_16GORON_HOUSE) &&
+ (gSaveContext.sceneLayer == 0) && (this->sleepState == ENGO_AWAKE) && (play->csCtx.scriptIndex == 1))) {
+ isFallingAsleep = true;
}
- return ret;
+ return isFallingAsleep;
}
-s32 func_80A122EC(EnGo* this) {
- static Vec3f D_80A1668C = { 0.0f, 100.0f, 160.0f };
+/**
+ * Update the actor's focus.
+ */
+s32 EnGo_UpdateFocus(EnGo* this) {
+ static Vec3f sMedigoronPos = { 0.0f, 100.0f, 160.0f };
s32 pad;
- f32 sp20 = 58.0f;
+ f32 yAxisOffsetToFocusPoint = 58.0f;
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A1668C,
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sMedigoronPos,
&this->actor.focus.pos);
} else {
- if ((this->unk_390 & 0x200) || (this->unk_390 & 0x100)) {
- sp20 = this->actor.shape.yOffset;
+ if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) || (this->actionFlags & ENGO_FLAG_SNOWBALLED)) {
+ yAxisOffsetToFocusPoint = this->actor.shape.yOffset;
}
Math_Vec3f_Copy(&this->actor.focus.pos, &this->actor.world.pos);
- this->actor.focus.pos.y += sp20;
+ this->actor.focus.pos.y += yAxisOffsetToFocusPoint;
}
this->actor.focus.rot.x = this->actor.world.rot.x;
@@ -567,21 +852,24 @@ s32 func_80A122EC(EnGo* this) {
return false;
}
-void func_80A123A0(EnGo* this, PlayState* play) {
- Vec3f sp2C;
+/**
+ * Update the collider for the snowball form of the Goron Shrine gatekeeper.
+ */
+void EnGo_UpdateSnowballCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp2C, &this->actor.world.pos);
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
- this->colliderSphere.dim.worldSphere.center.x = sp2C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp2C.y;
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp2C.z;
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 48;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
- if (func_80A121F4(play)) {
+ if (EnGo_CanSnowballHurtPlayer(play)) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderSphere.base);
}
@@ -589,175 +877,203 @@ void func_80A123A0(EnGo* this, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124A0(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Medigoron in the Powder Keg Shop.
+ */
+void EnGo_UpdateMedigoronCollider(EnGo* this, PlayState* play) {
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A124FC(EnGo* this, PlayState* play) {
- Vec3f sp1C;
+/**
+ * Update the collider for the rolled up form of a Goron.
+ */
+void EnGo_UpdateRolledUpCollider(EnGo* this, PlayState* play) {
+ Vec3f worldPos;
- Math_Vec3f_Copy(&sp1C, &this->actor.world.pos);
-
- this->colliderSphere.dim.worldSphere.center.x = sp1C.x;
- this->colliderSphere.dim.worldSphere.center.y = sp1C.y;
+ Math_Vec3f_Copy(&worldPos, &this->actor.world.pos);
+ this->colliderSphere.dim.worldSphere.center.x = worldPos.x;
+ this->colliderSphere.dim.worldSphere.center.y = worldPos.y;
this->colliderSphere.dim.worldSphere.center.y += (s16)this->actor.shape.yOffset;
- this->colliderSphere.dim.worldSphere.center.z = sp1C.z;
-
+ this->colliderSphere.dim.worldSphere.center.z = worldPos.z;
this->colliderSphere.dim.modelSphere.radius = 20;
this->colliderSphere.dim.worldSphere.radius =
this->colliderSphere.dim.modelSphere.radius * this->colliderSphere.dim.scale;
-
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderSphere.base);
}
-void func_80A125BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the frozen form of a Goron.
+ */
+void EnGo_UpdateFrozenCollider(EnGo* this, PlayState* play) {
s32 pad;
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
-
this->colliderCylinder.dim.radius = 46;
this->colliderCylinder.dim.height = 78;
-
- if (this->unk_3C6 == 0) {
+ if (this->harmlessTimer == 0) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->colliderCylinder.base);
}
CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderCylinder.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A12660(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for all standing forms of a Goron.
+ */
+void EnGo_UpdateStandingCollider(EnGo* this, PlayState* play) {
Math_Vec3f_ToVec3s(&this->colliderCylinder.dim.pos, &this->actor.world.pos);
this->colliderCylinder.dim.radius = 24;
this->colliderCylinder.dim.height = 62;
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderCylinder.base);
}
-void func_80A126BC(EnGo* this, PlayState* play) {
+/**
+ * Update the collider for the Goron.
+ *
+ * Both the rolling snowball and frozen forms can hurt Player on collision, others do not.
+ */
+void EnGo_UpdateCollider(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (!(player->stateFlags2 & PLAYER_STATE2_4000)) {
- if (this->unk_3C6 != 0) {
- this->unk_3C6--;
- }
+ DECR(this->harmlessTimer);
}
-
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- func_80A124A0(this, play);
- } else if (this->unk_390 & 0x100) {
- func_80A123A0(this, play);
- } else if (this->unk_390 & 0x200) {
- func_80A124FC(this, play);
- } else if (this->unk_390 & 0x400) {
- func_80A125BC(this, play);
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ EnGo_UpdateMedigoronCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
+ EnGo_UpdateSnowballCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ EnGo_UpdateRolledUpCollider(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_UpdateFrozenCollider(this, play);
} else {
- func_80A12660(this, play);
+ EnGo_UpdateStandingCollider(this, play);
}
}
-s32 func_80A12774(EnGo* this, PlayState* play) {
- if (!(this->unk_390 & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
+/**
+ * Check if the actor is talking, and if so set the action function to handle it.
+ *
+ * @return True if talking
+ */
+s32 EnGo_UpdateTalking(EnGo* this, PlayState* play) {
+ if (!(this->actionFlags & 7) || !Actor_ProcessTalkRequest(&this->actor, &play->state)) {
return false;
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
- if (!(this->unk_390 & 0x200)) {
- this->unk_390 |= 8;
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
+ if (!(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
}
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_390 |= 0x20;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3C0 = 0;
- this->unk_3C4 = 0;
- this->unk_18C = this->actionFunc;
- this->actionFunc = func_80A157C4;
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->cutsceneState = 0;
+ this->gatekeeperAnimState = 0;
+ this->interruptedActionFunc = this->actionFunc;
+ this->actionFunc = EnGo_Talk;
return true;
}
-s32 func_80A12868(EnGo* this, PlayState* play) {
- this->unk_390 &= ~0x800;
- this->unk_390 &= ~0x1000;
- this->unk_390 &= ~0x2000;
+/**
+ * Detect any collisions, and convert detections to object specific 'actionFlags'.
+ */
+s32 EnGo_DetectCollisions(EnGo* this, PlayState* play) {
+ this->actionFlags &= ~ENGO_FLAG_HIT_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_BY_OTHER;
+ this->actionFlags &= ~ENGO_FLAG_HIT_OBJ;
if ((this->colliderCylinder.base.atFlags & AT_HIT) || (this->colliderSphere.base.atFlags & AT_HIT)) {
this->colliderCylinder.base.atFlags &= ~AT_HIT;
this->colliderSphere.base.atFlags &= ~AT_HIT;
- this->unk_390 |= 0x800;
- this->unk_3C6 = 0x28;
+ this->actionFlags |= ENGO_FLAG_HIT_OTHER;
+ this->harmlessTimer = 40;
}
if ((this->colliderCylinder.base.acFlags & AC_HIT) || (this->colliderSphere.base.acFlags & AC_HIT)) {
this->colliderCylinder.base.acFlags &= ~AC_HIT;
this->colliderSphere.base.acFlags &= ~AC_HIT;
- this->unk_390 |= 0x1000;
+ this->actionFlags |= ENGO_FLAG_HIT_BY_OTHER;
}
if ((this->colliderCylinder.base.ocFlags1 & OC1_HIT) || (this->colliderSphere.base.ocFlags1 & OC1_HIT)) {
this->colliderCylinder.base.ocFlags1 &= ~OC1_HIT;
this->colliderSphere.base.ocFlags1 &= ~OC1_HIT;
- this->unk_390 |= 0x2000;
+ this->actionFlags |= ENGO_FLAG_HIT_OBJ;
}
return false;
}
-s32 func_80A12954(EnGo* this, PlayState* play) {
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (play->csCtx.state != CS_STATE_IDLE) && (this->actor.draw != NULL) &&
- (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
+/**
+ * Start, or finish, the cutscene for the arrival of springtime.
+ */
+s32 EnGo_UpdateSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) && (play->csCtx.state != CS_STATE_IDLE) &&
+ (this->actor.draw != NULL) && (play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
(play->csCtx.scriptIndex == 0)) {
- if (this->unk_3F0 == 0) {
+ if (this->springArrivalCutsceneActive == false) {
this->actor.flags &= ~ACTOR_FLAG_1;
- this->cueId = 255;
- this->unk_3F0 = 1;
- this->unk_18C = this->actionFunc;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = true;
+ this->interruptedActionFunc = this->actionFunc;
}
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->actionFunc = func_80A14FC8;
- } else if (this->unk_3F0 != 0) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->actionFunc = EnGo_HandleSpringArrivalCutscene;
+ } else if (this->springArrivalCutsceneActive) {
this->actor.flags |= ACTOR_FLAG_1;
- this->cueId = 255;
- this->unk_3F0 = 0;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->actionFunc = this->unk_18C;
+ this->springArrivalCueId = 255;
+ this->springArrivalCutsceneActive = false;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFunc = this->interruptedActionFunc;
}
return false;
}
-s32 func_80A12A64(EnGo* this, PlayState* play) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
- s32 ret = 0;
+/**
+ * Update the animation to the actor's currently set value.
+ *
+ * @return True if non-repeating animation has finished
+ */
+s32 EnGo_UpdateAnimationToCurrent(EnGo* this, PlayState* play) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
+ s32 ret = false;
- if ((this->unk_3DC >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((this->unk_3DC >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (this->unk_3DC < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((this->curAnimIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((this->curAnimIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (this->curAnimIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->skelAnime.playSpeed = this->unk_398;
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->skelAnime.playSpeed = this->curAnimPlaySpeed;
ret = SkelAnime_Update(&this->skelAnime);
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-s32 func_80A12B78(EnGo* this, PlayState* play) {
+/**
+ * Update sound effects based on animation.
+ */
+s32 EnGo_UpdateSfx(EnGo* this, PlayState* play) {
if (play->csCtx.state == CS_STATE_IDLE) {
- if (this->unk_3DC == 4) {
+ if (this->curAnimIndex == ENGO_ANIM_ROLL) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE);
}
@@ -765,7 +1081,7 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, 22.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SIT_IMT);
}
- } else if ((this->unk_3DC == 2) || (this->unk_3DC == 3)) {
+ } else if ((this->curAnimIndex == ENGO_ANIM_UNROLL) || (this->curAnimIndex == ENGO_ANIM_UNROLL_IMM)) {
if (Animation_OnFrame(&this->skelAnime, 2.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_CIRCLE_OFF);
}
@@ -778,189 +1094,231 @@ s32 func_80A12B78(EnGo* this, PlayState* play) {
return 0;
}
-s32 func_80A12C48(EnGo* this, PlayState* play, s32 arg2) {
- s8 objIdx = this->actor.objBankIndex;
- s8 objIdx2 = -1;
+/**
+ * Change the Goron's animation.
+ *
+ * Goron animations come from one of three categories:
+ * - Basic Goron animations
+ * - Goron athletics like stretches, cheers, etc...
+ * - Spring arrival cutscene animations
+ * Changing animations with this function handles the transitions between the three categories.
+ *
+ * @return True if animation was changed
+ */
+s32 EnGo_ChangeAnim(EnGo* this, PlayState* play, EnGoAnimationIndex animIndex) {
+ s8 objIndex = this->actor.objBankIndex;
+ s8 extraObjIndex = -1;
s32 ret = false;
- if ((arg2 >= 18) && (this->unk_289 >= 0)) {
- objIdx2 = this->unk_289;
- } else if ((arg2 >= 10) && (this->unk_288 >= 0)) {
- objIdx2 = this->unk_288;
- } else if (arg2 < 10) {
- objIdx2 = this->actor.objBankIndex;
+ if ((animIndex >= ENGO_ANIM_SPRING_MIN) && (this->hakuginDemoObjIndex >= 0)) {
+ extraObjIndex = this->hakuginDemoObjIndex;
+ } else if ((animIndex >= ENGO_ANIM_ATHLETICS_MIN) && (this->taisouObjIndex >= 0)) {
+ extraObjIndex = this->taisouObjIndex;
+ } else if (animIndex < ENGO_ANIM_ATHLETICS_MIN) {
+ extraObjIndex = this->actor.objBankIndex;
}
- if (objIdx2 >= 0) {
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx2].segment);
- this->unk_3DC = arg2;
- ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
- this->unk_398 = this->skelAnime.playSpeed;
- gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIdx].segment);
+ if (extraObjIndex >= 0) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[extraObjIndex].segment);
+ this->curAnimIndex = animIndex;
+ ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
+ this->curAnimPlaySpeed = this->skelAnime.playSpeed;
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objIndex].segment);
}
return ret;
}
-void func_80A12D6C(EnGo* this) {
- if ((this->unk_390 & 0x20) && (DECR(this->unk_3BC) == 0)) {
- this->unk_3BE++;
- if (this->unk_3BE >= 4) {
- this->unk_3BC = Rand_S16Offset(30, 30);
- this->unk_3BE = 0;
+/**
+ * Update the eye textures to blink.
+ */
+void EnGo_UpdateEyes(EnGo* this) {
+ if (this->actionFlags & ENGO_FLAG_EYES_OPEN) {
+ if (DECR(this->blinkTimer) == 0) {
+ this->eyeTexIndex++;
+ if (this->eyeTexIndex >= ENGO_EYETEX_CLOSED2) {
+ this->blinkTimer = Rand_S16Offset(30, 30);
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ }
}
}
}
-void func_80A12DF4(EnGo* this, PlayState* play) {
- if (this->unk_3D4 == 0) {
- func_80A12C48(this, play, 9);
- this->unk_3D4++;
- } else if ((this->unk_3D4 == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 6);
- this->unk_3D4++;
+/**
+ * Play the surprise animation then return to shivering.
+ */
+void EnGo_UpdateShiverSurprisedAnimation(EnGo* this, PlayState* play) {
+ if (this->surprisePhase == 0) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVERINGSURPRISED);
+ this->surprisePhase++;
+ } else if ((this->surprisePhase == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER_IMM);
+ this->surprisePhase++;
}
}
-s32 func_80A12E80(EnGo* this, PlayState* play) {
- u16 temp = play->msgCtx.currentTextId;
+/**
+ * Change the attention target, and dialog reactions of the Gorons outside Darmani's grave.
+ */
+s32 EnGo_UpdateGraveyardAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ u16 textId = play->msgCtx.currentTextId;
Player* player = GET_PLAYER(play);
- if (ENGO_GET_F(&this->actor) != ENGO_F_4) {
+ if (ENGO_GET_TYPE(&this->actor) != ENGO_GRAVEYARD) {
return false;
}
if (player->stateFlags1 & PLAYER_STATE1_40) {
- if (this->unk_392 != temp) {
- switch (temp) {
- case 0xE1A:
- this->unk_390 |= 8;
- this->unk_38C = this->actor.child;
+ if (this->lastTextId != textId) {
+ switch (textId) {
+ case 0xE1A: // Awakening from frozen form, confused, turn to other Goron
+ this->actionFlags |= ENGO_FLAG_ENGAGED;
+ this->attentionTarget = this->actor.child;
break;
- case 0xE1D:
- case 0xE25:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1D: // Turn to player (Goron form) while stating Darmani is dead
+ case 0xE25: // Turn to player (Other form) while thanking player
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
- case 0xE27:
- if (ENGO_GET_70(&this->actor) == ENGO_70_1) {
- this->unk_38C = this->actor.child;
+ case 0xE27: // (spoken) "What's this?..."
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) {
+ this->attentionTarget = this->actor.child;
}
- case 0xE16:
- case 0xE1E:
- this->unk_190 = func_80A12DF4;
+ case 0xE16: // Surprised, questioning if player is Darmani
+ case 0xE1E: // Surprised, seeing Darmani
+ this->graveyardDialogActionFunc = EnGo_UpdateShiverSurprisedAnimation;
break;
- case 0xE1F:
- if (ENGO_GET_70(&this->actor) == ENGO_70_0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+ case 0xE1F: // Turn to player stating Darmani is not dead
+ if (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_GRAVEMAKER) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
break;
+
+ default:
+ break;
}
}
- this->unk_3F4 = 1;
- this->unk_392 = temp;
- } else if (this->unk_3F4 != 0) {
- this->unk_3F4 = 0;
- this->unk_190 = NULL;
- this->unk_392 = 0;
- func_80A12C48(this, play, 5);
- this->unk_390 &= ~8;
+ this->changedText = true;
+ this->lastTextId = textId;
+ } else if (this->changedText) {
+ // If the player isn't talking, and the text has changed, its the last text.
+ // Set everything back to the "Idle" behavior.
+ this->changedText = false;
+ this->graveyardDialogActionFunc = NULL;
+ this->lastTextId = 0;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
}
- if (this->unk_190 != NULL) {
- this->unk_190(this, play);
+ if (this->graveyardDialogActionFunc != NULL) {
+ this->graveyardDialogActionFunc(this, play);
}
return false;
}
-s32 func_80A12FE8(EnGo* this, PlayState* play) {
+/**
+ * Update the actor's rotation to point towards the target.
+ */
+s32 EnGo_UpdateRotationToTarget(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
- s16 sp32;
+ Vec3f targetPos;
+ Vec3f thisPos;
+ s16 desiredYaw;
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- sp32 = Math_Vec3f_Yaw(&sp34, &sp40);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ desiredYaw = Math_Vec3f_Yaw(&thisPos, &targetPos);
- Math_ApproachS(&this->unk_3B2, (sp32 - this->unk_3B6) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B2 = CLAMP(this->unk_3B2, -0x1FFE, 0x1FFE);
+ Math_ApproachS(&this->headRotY, (desiredYaw - this->bodyRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->headRotY = CLAMP(this->headRotY, -0x1FFE, 0x1FFE);
- Math_ApproachS(&this->unk_3B6, (sp32 - this->unk_3B2) - this->actor.shape.rot.y, 4, 0x2AA8);
- this->unk_3B6 = CLAMP(this->unk_3B6, -0x1C70, 0x1C70);
+ Math_ApproachS(&this->bodyRotY, (desiredYaw - this->headRotY) - this->actor.shape.rot.y, 4, 0x2AA8);
+ this->bodyRotY = CLAMP(this->bodyRotY, -0x1C70, 0x1C70);
- Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
-
- if (this->unk_38C->id == ACTOR_PLAYER) {
- sp40.y = ((Player*)this->unk_38C)->bodyPartsPos[7].y + 3.0f;
+ Math_Vec3f_Copy(&thisPos, &this->actor.focus.pos);
+ if (this->attentionTarget->id == ACTOR_PLAYER) {
+ targetPos.y = ((Player*)this->attentionTarget)->bodyPartsPos[7].y + 3.0f;
} else {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->focus.pos);
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->focus.pos);
}
- Math_ApproachS(&this->unk_3B0, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B4, 4, 0x2AA8);
- this->unk_3B0 = CLAMP(this->unk_3B0, -0x1554, 0x1554);
+ Math_ApproachS(&this->headRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->bodyRotZ, 4, 0x2AA8);
+ this->headRotZ = CLAMP(this->headRotZ, -0x1554, 0x1554);
- Math_ApproachS(&this->unk_3B4, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_3B0, 4, 0x2AA8);
- this->unk_3B4 = CLAMP(this->unk_3B4, -0xE38, 0xE38);
+ Math_ApproachS(&this->bodyRotZ, Math_Vec3f_Pitch(&thisPos, &targetPos) - this->headRotZ, 4, 0x2AA8);
+ this->bodyRotZ = CLAMP(this->bodyRotZ, -0xE38, 0xE38);
return false;
}
-s32 func_80A131F8(EnGo* this, PlayState* play) {
- if (this->unk_3F4 == 0) {
- this->unk_38C = &GET_PLAYER(play)->actor;
+/**
+ * Handle updating of Goron's attention target, and reactions during dialog.
+ */
+s32 EnGo_UpdateAttentionTargetAndReactions(EnGo* this, PlayState* play) {
+ if (!this->changedText) {
+ this->attentionTarget = &GET_PLAYER(play)->actor;
}
- func_80A12E80(this, play);
+ EnGo_UpdateGraveyardAttentionTargetAndReactions(this, play);
- if (this->unk_390 & 8) {
- this->unk_390 &= ~0x40;
- this->unk_390 |= 0x10;
- func_80A12FE8(this, play);
- } else if (this->unk_390 & 0x10) {
- this->unk_390 &= ~0x10;
- this->unk_3B0 = 0;
- this->unk_3B2 = 0;
- this->unk_3B4 = 0;
- this->unk_3B6 = 0;
- this->unk_3BA = 0x14;
- } else if (DECR(this->unk_3BA) == 0) {
- this->unk_390 |= 0x40;
- this->unk_3BA = 0x14;
+ if (this->actionFlags & ENGO_FLAG_ENGAGED) {
+ this->actionFlags &= ~ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FACE_TARGET;
+ EnGo_UpdateRotationToTarget(this, play);
+ } else if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
+ this->actionFlags &= ~ENGO_FLAG_FACE_TARGET;
+ this->headRotZ = 0;
+ this->headRotY = 0;
+ this->bodyRotZ = 0;
+ this->bodyRotY = 0;
+ this->loseAttentionTimer = 20;
+ } else if (DECR(this->loseAttentionTimer) == 0) {
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->loseAttentionTimer = 20;
}
return true;
}
-void func_80A132C8(EnGo* this, PlayState* play) {
+/**
+ * Idle action function for the gravemaker at the Goron Graveyard.
+ */
+void EnGo_GravemakerIdle(EnGo* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s16 temp_v1 = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
+ s16 deltaYaw = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
if ((fabsf(this->actor.playerHeightRel) > 20.0f) || (this->actor.xzDistToPlayer > 300.0f)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(temp_v1) >= 0x1C70) ||
- CHECK_WEEKEVENTREG(WEEKEVENTREG_21_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ } else if ((player->transformation != PLAYER_FORM_GORON) || (ABS_ALT(deltaYaw) >= 0x1C70) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON) ||
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-void func_80A133A8(EnGo* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08)) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+/**
+ * Idle action function for the Goron frozen at the Goron Graveyard
+ */
+void EnGo_FrozenIdle(EnGo* this, PlayState* play) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON)) {
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
}
}
-Actor* func_80A13400(EnGo* this, PlayState* play) {
+/**
+ * Obtain a pointer to the gravemaker at the Goron Graveyard.
+ */
+Actor* EnGo_FindGravemaker(EnGo* this, PlayState* play) {
Actor* actor;
Actor* retActor = NULL;
@@ -968,8 +1326,8 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
actor = SubS_FindActor(play, retActor, ACTORCAT_NPC, ACTOR_EN_GO);
retActor = actor;
- if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_F(actor) == ENGO_F_4) &&
- (ENGO_GET_70(actor) == ENGO_70_0)) {
+ if ((actor != NULL) && ((EnGo*)actor != this) && (ENGO_GET_TYPE(actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(actor) == ENGO_GRAVEYARD_GRAVEMAKER)) {
return retActor;
}
@@ -987,15 +1345,27 @@ Actor* func_80A13400(EnGo* this, PlayState* play) {
return NULL;
}
-void func_80A134B0(EnGo* this, PlayState* play, s32 arg2) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_80) || (play->actorCtx.flags & ACTORCTX_FLAG_0) || arg2) {
+/**
+ * The Medigoron's collider radius is greater when it needs to be able to drop the Powder Keg in front of the player.
+ */
+void EnGo_UpdateMedigoronColliderRadius(EnGo* this, PlayState* play, s32 isGivenPowderKeg) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES) ||
+ (play->actorCtx.flags & ACTORCTX_FLAG_0) // Same check occurs in Powder Keg ammo check MsgScript Command
+ || isGivenPowderKeg) {
this->colliderSphere.dim.modelSphere.radius = 300;
} else {
this->colliderSphere.dim.modelSphere.radius = 380;
}
}
-s32 func_80A134F4(EnGo* this, s16 csId) {
+/**
+ * Helper to change a cutscene.
+ *
+ * @returns Status of cutscene change
+ * @retval true Cutscene has started
+ * @retval false Cutscene is queued to start
+ */
+s32 EnGo_ChangeCutscene(EnGo* this, s16 csId) {
if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
} else if (CutsceneManager_IsNext(csId)) {
@@ -1006,83 +1376,111 @@ s32 func_80A134F4(EnGo* this, s16 csId) {
return false;
}
-s32 func_80A13564(EnGo* this, f32 arg1, f32 arg2, s32 arg3) {
+/**
+ * Handle the animation of the "Goron Pound".
+ *
+ * There are Several Phases to the pound:
+ * - Phase 1: (Once in Rolled-Up form) the pound starts by leaping into the air.
+ * - The Goron rotates until its back faces the ground at its peak.
+ * - The Goron distorts shape until at its peak.
+ * - Transition: At the peak, all movement is halted.
+ * - Phase 2: While hanging, the Goron reverts back to normal shape.
+ * - Transition: At reaching maxHangTime, ENGO_POUND_INITIAL_FALL_VEL is applied.
+ * - Phase 3: The Goron falls to the ground.
+ * - Transition: At reaching the ground.
+ *
+ * @param initialVelocity Initial +Y velocity of the pound.
+ * @param maxDistortion Maximum distortion of the Goron's shape.
+ * @param maxHangtime Maximum hangtime at the peak of the pound.
+ * @returns True when pound finishes.
+ */
+s32 EnGo_HandleGatekeeperPoundCutscene(EnGo* this, f32 initialVelocity, f32 maxDistortion, s32 maxHangtime) {
s32 pad;
- f32 temp_f0 = 1.0f;
- f32 temp_f14 = this->actor.velocity.y + this->actor.gravity;
- s32 ret;
+ f32 rotAndDistortFactor = 1.0f;
+ f32 velocity = this->actor.velocity.y + this->actor.gravity;
+ s32 isFinished;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_TOUCH) {
- ret = true;
+ // Transition 3->DONE
+ isFinished = true;
} else {
- if (temp_f14 > 0.0f) {
- temp_f0 = temp_f14 / arg1;
- this->actor.shape.rot.x += (s16)(9100.0f * temp_f0);
- this->unk_3AE = 0;
+ if (velocity > 0.0f) {
+ // PHASE 1: Goron is rising
+ rotAndDistortFactor = velocity / initialVelocity;
+ this->actor.shape.rot.x += (s16)(0x238C * rotAndDistortFactor);
+ this->elapsedHangtime = 0;
} else if ((s32)this->actor.velocity.y == 0) {
- if (arg3 >= this->unk_3AE) {
- temp_f0 = (f32)this->unk_3AE / arg3;
+ if (maxHangtime >= this->elapsedHangtime) {
+ // PHASE 2: Goron is hanging in the air
+ rotAndDistortFactor = (f32)this->elapsedHangtime / maxHangtime;
} else {
- this->actor.gravity = -6.0f;
+ // Transition 2->3: Hanging is complete
+ this->actor.gravity = ENGO_POUND_INITIAL_FALL_VEL;
}
- this->unk_3AE++;
- } else if (this->unk_3AE == 0) {
+ this->elapsedHangtime++;
+ } else if (this->elapsedHangtime == 0) {
+ // Transition 1->2: Goron has reached the peak
this->actor.velocity.y = 0.0f;
this->actor.gravity = 0.0f;
- temp_f0 = temp_f14 / arg1;
+ rotAndDistortFactor = velocity / initialVelocity;
+ } else {
+ // PHASE 3: Goron is falling (Just letting gravity take effect)
}
- ret = false;
+ isFinished = false;
}
- this->unk_3A8 = (1.0f - temp_f0) * arg2;
- this->actor.scale.x = this->unk_3A4 - this->unk_3A8;
- this->actor.scale.y = this->unk_3A4 + this->unk_3A8;
+ // Handle shape distortions
+ this->scaleFactorPoundDistortion = (1.0f - rotAndDistortFactor) * maxDistortion;
+ this->actor.scale.x = this->scaleFactor - this->scaleFactorPoundDistortion;
+ this->actor.scale.y = this->scaleFactor + this->scaleFactorPoundDistortion;
+ this->actor.scale.z = MAX(this->actor.scale.x, this->actor.scale.y);
- if (this->actor.scale.y < this->actor.scale.x) {
- this->actor.scale.z = this->actor.scale.x;
- } else {
- this->actor.scale.z = this->actor.scale.y;
- }
- return ret;
+ return isFinished;
}
-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);
+/**
+ * Create the visual effects caused by the gatekeeper's pound.
+ */
+void EnGo_CreateGatekeeperPoundEffects(EnGo* this, PlayState* play) {
+ 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);
EffectSsBlast_SpawnWhiteShockwave(play, &this->actor.world.pos, &gZeroVec3f, &gZeroVec3f);
}
-void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
- u32 frames1;
- u32 frames2;
+/**
+ * Draw the ice encasing a frozen Goron.
+ */
+void EnGo_DrawIceBlockWhenFrozen(EnGo* this, PlayState* play, f32 scale, f32 alpha) {
+ u32 y1;
+ u32 y2;
- if (this->unk_390 & 0x400) {
+ if (this->actionFlags & ENGO_FLAG_FROZEN) {
Matrix_Push();
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);
+ Matrix_Scale(scale * 0.7f, scale * 0.8f, scale, MTXMODE_APPLY);
func_800B8118(&this->actor, play, 0);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- frames1 = play->gameplayFrames % 256;
- frames2 = (play->gameplayFrames * 2) % 256;
+ y1 = play->gameplayFrames % 256;
+ y2 = (play->gameplayFrames * 2) % 256;
gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, frames1, 0x20, 0x10, 1, 0, frames2, 0x40, 0x20));
- gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)arg3);
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, y1, 0x20, 0x10, 1, 0, y2, 0x40, 0x20));
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)alpha);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
CLOSE_DISPS(play->state.gfxCtx);
@@ -1091,154 +1489,172 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
}
}
-void func_80A139E4(EnGo* this) {
- static Vec3f D_80A16698 = { 0.0f, 0.06f, 0.0f };
- Vec3f sp54;
- Vec3f sp48;
- s16 sp46 = Rand_ZeroOne() * 360.0f * 182.0f;
+/**
+ * Initialize the steam effect used for melting ice.
+ */
+void EnGo_MakeSteam(EnGo* this) {
+ static Vec3f sAccel = { 0.0f, 0.06f, 0.0f };
+ Vec3f tempPos;
+ Vec3f effectPos;
+ s16 rotAngle = Rand_ZeroOne() * 360.0f * 182.0f;
- Math_Vec3f_Copy(&sp54, &gZeroVec3f);
- sp54.z = 28.0f;
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, sp46, &sp54, &sp48);
- sp48.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
- sp48.y += this->actor.floorHeight;
- func_80A10FD0(&this->unk_3F8[16], sp48, D_80A16698, gZeroVec3f, 0.01f, 0.002f, 16);
+ Math_Vec3f_Copy(&tempPos, &gZeroVec3f);
+ tempPos.z = 28.0f;
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, rotAngle, &tempPos, &effectPos);
+ effectPos.y = (Rand_ZeroOne() * 10.0f) + 4.0f;
+ effectPos.y += this->actor.floorHeight;
+ EnGo_InitSteam(&this->effectTable[ENGO_SNOW_EFFECT_COUNT], effectPos, sAccel, gZeroVec3f, ENGO_NORMAL_SCALE,
+ (0.2f * ENGO_NORMAL_SCALE), ENGO_DUST_STEAM_LIFETIME);
}
-s32 func_80A13B1C(EnGo* this, PlayState* play) {
+/**
+ * Transition through the cutscenes when the gatekeeper is opening the shrine.
+ *
+ * @return True when cutscenes end.
+ */
+s32 EnGo_HandleOpenShrineCutscene(Actor* thisx, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 pad;
+ EnGo* this = THIS;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId);
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C4 = 1;
- this->unk_3C0 = 1;
- } else {
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->gatekeeperAnimState = 1;
+ this->cutsceneState = 1;
+ // fallthrough
case 1:
- if (CutsceneManager_GetCurrentCsId() != this->csId) {
- this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
- this->unk_3C0 = 2;
- } else {
+ if (CutsceneManager_GetCurrentCsId() == this->csId) {
break;
}
-
+ this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
+ this->cutsceneState = 2;
+ // fallthrough
case 2:
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C0 = 3;
- } else {
+ if (!EnGo_ChangeCutscene(this, this->csId)) {
break;
}
-
+ this->cutsceneState = 3;
+ // fallthrough
case 3:
if (CutsceneManager_IsNext(CS_ID_GLOBAL_TALK)) {
CutsceneManager_StartWithPlayerCs(CS_ID_GLOBAL_TALK, NULL);
- this->unk_3C0 = 4;
+ this->cutsceneState = 4;
} else if (CutsceneManager_GetCurrentCsId() == this->csId) {
CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
}
+ // fallthrough
+ default:
+ break;
}
- switch (this->unk_3C4) {
+ switch (this->gatekeeperAnimState) {
case 1:
- func_80A12C48(this, play, 4);
- this->unk_390 |= 0x4000;
- this->unk_3C4++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->gatekeeperAnimState++;
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 &= ~0x80;
- this->unk_390 |= 0x200;
- this->unk_3C4++;
- this->unk_3C2 = 0;
- this->actor.shape.yOffset = 14.0f;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
break;
case 3:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_JUMP);
- this->actor.velocity.y = 10.0f;
+ this->actor.velocity.y = ENGO_POUND_INITIAL_RISE_VEL;
this->actor.gravity = -1.0f;
- this->unk_3C4++;
+ this->gatekeeperAnimState++;
}
break;
case 4:
- if (func_80A13564(this, 10.0f, 0.004f, 6)) {
+ if (EnGo_HandleGatekeeperPoundCutscene(this, ENGO_POUND_INITIAL_RISE_VEL, (0.4f) * ENGO_NORMAL_SCALE, 6)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
- func_80A13728(this, play);
- this->unk_3C4++;
- this->unk_3C2 = 0;
- SET_WEEKEVENTREG(WEEKEVENTREG_88_40);
+ EnGo_CreateGatekeeperPoundEffects(this, play);
+ this->gatekeeperAnimState++;
+ this->cutsceneDelayTimer = 0;
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE);
}
break;
case 5:
- this->unk_3C2++;
- if (this->unk_3C2 >= 10) {
- func_80A12C48(this, play, 5);
+ this->cutsceneDelayTimer++;
+ if (this->cutsceneDelayTimer >= 10) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
this->actor.shape.rot.x = 0;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x80;
- this->unk_3C4++;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->gatekeeperAnimState++;
}
break;
case 6:
- this->unk_3C0++;
- if (this->unk_3C0 >= 65) {
+ this->cutsceneState++;
+ if (this->cutsceneState >= 65) {
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
- SET_WEEKEVENTREG(WEEKEVENTREG_88_80);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN);
break;
case PLAYER_FORM_GORON:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_04);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON);
break;
case PLAYER_FORM_ZORA:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_02);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA);
break;
case PLAYER_FORM_DEKU:
- SET_WEEKEVENTREG(WEEKEVENTREG_89_01);
+ SET_WEEKEVENTREG(WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU);
+ break;
+
+ default:
break;
}
ret = true;
}
break;
+
+ default:
+ break;
}
Actor_MoveWithGravity(&this->actor);
return ret;
}
-s32 func_80A13E80(EnGo* this, PlayState* play) {
- static Vec3f D_80A166A4 = { 0.0f, 200.0f, 280.0f };
- s32 pad;
- Vec3f sp48;
+/**
+ * Medigoron's MsgEvent callback to give the Powder Keg for the test.
+ */
+s32 EnGo_HandleGivePowderKegCutscene(Actor* thisx, PlayState* play) {
+ static Vec3f sPowderKegSpawnOffset = { 0.0f, 200.0f, 280.0f };
+ EnGo* this = THIS;
+ Vec3f powderKegSpawnPos;
s32 ret = false;
- switch (this->unk_3C0) {
+ switch (this->cutsceneState) {
case 0:
this->csId = this->actor.csId;
- if (func_80A134F4(this, this->csId)) {
- this->unk_3C0++;
+ if (EnGo_ChangeCutscene(this, this->csId)) {
+ this->cutsceneState++;
}
break;
case 1:
- func_80A12C48(this, play, 7);
- this->unk_3C0++;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_DROPKEG);
+ this->cutsceneState++;
case 2:
if (Animation_OnFrame(&this->skelAnime, 16.0f)) {
@@ -1246,262 +1662,349 @@ s32 func_80A13E80(EnGo* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- func_80A12C48(this, play, 1);
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166A4, &sp48);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE_IMM);
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sPowderKegSpawnOffset,
+ &powderKegSpawnPos);
gSaveContext.powderKegTimer = 2400;
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, sp48.x, sp48.y, sp48.z, 1, 0, 0, 0);
- func_80A134B0(this, play, 1);
- this->unk_3C2 = 0;
- this->unk_3C0++;
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, powderKegSpawnPos.x, powderKegSpawnPos.y,
+ powderKegSpawnPos.z, BOMB_EXPLOSIVE_TYPE_POWDER_KEG, 0, 0, BOMB_TYPE_BODY);
+ EnGo_UpdateMedigoronColliderRadius(this, play, true);
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState++;
}
break;
case 3:
- if (this->unk_3C2 >= 60) {
+ if (this->cutsceneDelayTimer >= 60) {
CutsceneManager_Stop(this->csId);
- this->unk_3C2 = 0;
- this->unk_3C0 = 0;
+ this->cutsceneDelayTimer = 0;
+ this->cutsceneState = 0;
ret = true;
} else {
- this->unk_3C2++;
+ this->cutsceneDelayTimer++;
}
break;
+
+ default:
+ break;
}
return ret;
}
-void func_80A14018(EnGo* this, PlayState* play) {
- static Vec3f D_80A166B0 = { 0.0f, 0.0f, 40.0f };
- static s32 D_80A166BC[] = { 11, 10, 12, 13, 14, 17 };
- Vec3f sp2C;
- s32 phi_v0 = ENGO_GET_70(&this->actor) % 6;
+/**
+ * Update the stretching racer's animation and actionFlags.
+ *
+ * 'ENGO_ATHLETIC_A' through 'ENGO_ATHLETIC_D' exchange animations before and after the race, while the hamstring
+ * stretchers have the same animation every time.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToStretchingAnimation(EnGo* this, PlayState* play) {
+ static Vec3f sStretchingGoronOffset = { 0.0f, 0.0f, 40.0f };
+ static s32 sSubtypeToAnimIndex[] = {
+ ENGO_ANIM_SQUAT_SIDE_TO_SIDE, ENGO_ANIM_DOUBLE_ARM_SIDEBEND, ENGO_ANIM_SHAKE_LIMBS,
+ ENGO_ANIM_SINGLE_ARM_SIDEBEND, ENGO_ANIM_SITTING_STRETCH, ENGO_ANIM_HELP_SITTING_STRETCH,
+ };
+ Vec3f newSittingStretcherPos;
- if (phi_v0 < 4) {
- phi_v0 = ((gSaveContext.eventInf[2] & 0xF) + phi_v0) % 4;
+ // The first four Racer Gorons have different stretches depending on context
+ // The last two remain the same (since they are dependent on one-another)
+ s32 subtypeLookup = ENGO_GET_SUBTYPE(&this->actor) % 6;
+
+ if (subtypeLookup < 4) {
+ subtypeLookup = ((gSaveContext.eventInf[2] & 0xF) + subtypeLookup) % 4;
}
- func_80A12C48(this, play, D_80A166BC[phi_v0]);
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[subtypeLookup]);
- if (this->unk_3DC == 14) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80A166B0, &sp2C);
- Math_Vec3f_Copy(&this->actor.world.pos, &sp2C);
+ // Move the sitting Goron forward, since their spawn location is the same as their standing counterpart.
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
+
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &sStretchingGoronOffset,
+ &newSittingStretcherPos);
+ Math_Vec3f_Copy(&this->actor.world.pos, &newSittingStretcherPos);
}
+
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= (0x40 | 0x20);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= (ENGO_FLAG_LOST_ATTENTION | ENGO_FLAG_EYES_OPEN);
this->actor.gravity = 0.0f;
}
-void func_80A14104(EnGo* this, PlayState* play) {
- static s32 D_80A166D4[] = { 15, 16 };
- s16 temp;
+/**
+ * Update the Goron's animation and actionFlags to 'spectating'.
+ *
+ * Spectators engage in one of two cheering animations. Either cheering with their hands above their head, or
+ * cupping their hands infront of their face and shouting.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToSpectatingAnimation(EnGo* this, PlayState* play) {
+ static s32 sSubtypeToAnimIndex[] = { ENGO_ANIM_CHEER, ENGO_ANIM_SHOUT };
+ s16 animFrame;
+
+ EnGo_ChangeAnim(this, play, sSubtypeToAnimIndex[ENGO_GET_SUBTYPE(&this->actor) % 2]);
+ animFrame = Rand_ZeroOne() * this->skelAnime.endFrame;
+ this->skelAnime.curFrame = animFrame;
- func_80A12C48(this, play, D_80A166D4[ENGO_GET_70(&this->actor) % 2]);
- temp = Rand_ZeroOne() * this->skelAnime.endFrame;
- this->skelAnime.curFrame = temp;
this->actor.flags &= ~ACTOR_FLAG_1;
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_3EC = 0;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
this->actor.gravity = 0.0f;
}
-void func_80A141D4(EnGo* this, PlayState* play) {
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit1);
+/**
+ * Update the Goron's animation and actionFlags to 'frozen'.
+ *
+ * The Goron will shiver upon awakening, but is otherwise encased in a block of ice which deals damage upon contact.
+ *
+ * @see EnGo_Frozen
+ */
+void EnGo_ChangeToFrozenAnimation(EnGo* this, PlayState* play) {
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInitFrozen);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 5);
- this->unk_3EC = 0;
- this->unk_39C = (this->unk_3A4 / 0.01f) * 0.9f;
- this->unk_3BE = 2;
- this->unk_390 = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x400;
- this->unk_3A0 = 100.0f;
+ this->curAnimIndex = -1;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ this->sleepState = ENGO_AWAKE;
+ this->iceBlockScale = (this->scaleFactor / 0.01f) * 0.9f;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_FROZEN;
+ this->iceBlockAlpha = 100.0f;
}
-void func_80A1428C(EnGo* this, PlayState* play) {
- s16 temp;
- Vec3f sp30;
- Vec3f sp24;
+/**
+ * Update the Goron Gatekeeper's animation and actionFlags to 'snowball'.
+ *
+ * @see EnGo_Snowball
+ */
+void EnGo_ChangeToSnowballAnimation(EnGo* this, PlayState* play) {
+ s16 yawToPathPoint;
+ Vec3f currentPos;
+ Vec3f startingPathPoint;
- Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
- if (this->unk_284 != NULL) {
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ if (this->gatekeeperPath != NULL) {
this->actor.flags &= ~ACTOR_FLAG_2000000;
- SubS_CopyPointFromPathCheckBounds(this->unk_284, 0, &sp24);
- temp = Math_Vec3f_Yaw(&sp30, &sp24);
- this->actor.shape.rot.y = temp;
- this->actor.world.rot.y = temp;
+ SubS_CopyPointFromPathCheckBounds(this->gatekeeperPath, 0, &startingPathPoint);
+ yawToPathPoint = Math_Vec3f_Yaw(¤tPos, &startingPathPoint);
+ this->actor.shape.rot.y = yawToPathPoint;
+ this->actor.world.rot.y = yawToPathPoint;
}
- this->unk_390 = 0;
- this->unk_390 |= 0x100;
- this->actor.shape.yOffset = 46.0f;
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_SNOWBALLED;
+ this->actor.shape.yOffset = ENGO_SNOWBALL_Y_OFFSET;
this->actor.gravity = -1.0f;
}
-void func_80A14324(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 8);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'covering ears'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToCoveringEarsAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_COVEREARS);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_3BC = 0;
- this->unk_3BE = 4;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A143A8(EnGo* this, PlayState* play) {
- func_80A12C48(this, play, 5);
- Actor_SetScale(&this->actor, this->unk_3A4);
- this->unk_390 = 0;
+/**
+ * Update the Goron's animation and actionFlags to 'shivering'.
+ *
+ * @see EnGo_Idle
+ */
+void EnGo_ChangeToShiveringAnimation(EnGo* this, PlayState* play) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHIVER);
+ Actor_SetScale(&this->actor, this->scaleFactor);
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_3EC = 0;
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3BC = 0;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->sleepState = ENGO_AWAKE;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->blinkTimer = 0;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
}
-void func_80A14430(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron stretching at the racetrack.
+ *
+ * Stretching Gorons placed in the starting area of the racetrack doing various stretches.
+ */
+void EnGo_SetupAthletic(EnGo* this, PlayState* play) {
if (((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 0)) ||
(gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 2))) &&
(CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE))) {
- func_80A14018(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToStretchingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A1449C(EnGo* this, PlayState* play) {
+/**
+ * Setup a Goron spectating at the racetrack.
+ *
+ * Spectators to the Goron races cannot be engaged, they simply stand idle and cheer.
+ */
+void EnGo_SetupSpectator(EnGo* this, PlayState* play) {
if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) ||
(gSaveContext.save.entrance == ENTRANCE(CUTSCENE, 0))) {
- func_80A14104(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToSpectatingAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
Actor_Kill(&this->actor);
}
}
-void func_80A144F4(EnGo* this, PlayState* play) {
+/**
+ * Setup the Goron Shrine's Gatekeeper.
+ *
+ * When spoken to, can open the Goron Shrine for the player.
+ * - On Day 1: Can be found in the open, shivering.
+ * - On Days 2,3: Can be found in a snowball.
+ */
+void EnGo_SetupGatekeeper(EnGo* this, PlayState* play) {
if (gSaveContext.save.day >= 2) {
- this->unk_284 = SubS_GetDayDependentPath(play, ENGO_GET_7F80(&this->actor), 0xFF, &this->unk_3E4);
- if (this->unk_284 != NULL) {
- this->unk_3E4 = 1;
+ this->gatekeeperPath = SubS_GetDayDependentPath(play, ENGO_GET_PATH_INDEX(&this->actor), ENGO_PATH_INDEX_NONE,
+ &this->indexPathPoint);
+ if (this->gatekeeperPath != NULL) {
+ this->indexPathPoint = 1;
}
- func_80A1428C(this, play);
- this->actionFunc = func_80A153FC;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToSnowballAnimation(this, play);
+ this->actionFunc = EnGo_Snowball;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
- this->unk_3D8 = func_80A13B1C;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
+ this->msgEventFunc = EnGo_HandleOpenShrineCutscene;
}
}
-void func_80A145AC(EnGo* this, PlayState* play) {
- if ((ENGO_GET_70(&this->actor) == ENGO_70_1) &&
+/**
+ * Setup a Goron at the graveyard
+ *
+ * The Gorons are together, one shivering from the cold, another frozen solid.
+ */
+void EnGo_SetupGraveyardGoron(EnGo* this, PlayState* play) {
+ if ((ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN) &&
(((play->sceneId == SCENE_10YUKIYAMANOMURA2) && (gSaveContext.sceneLayer == 1) &&
(play->csCtx.scriptIndex == 0)) ||
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_21_08))) {
- this->actor.child = func_80A13400(this, play);
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON))) {
+ this->actor.child = EnGo_FindGravemaker(this, play);
this->actor.child->child = &this->actor;
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14668(EnGo* this, PlayState* play) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- func_80A14324(this, play);
- this->actionFunc = func_80A149B0;
+/**
+ * Setup a shrine Goron.
+ *
+ * There are three, but they all behave the same way aside from dialog.
+ */
+void EnGo_SetupShrineGoron(EnGo* this, PlayState* play) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ EnGo_ChangeToCoveringEarsAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A146CC(EnGo* this, PlayState* play) {
- func_80A134B0(this, play, 0);
- func_80A12C48(this, play, 0);
- this->unk_3A4 *= 5.0f;
- Actor_SetScale(&this->actor, this->unk_3A4);
+/**
+ * Setup the Medigoron in the Powder Keg Shop.
+ *
+ * This Goron sells Powder Kegs, and gives the player a Powder Keg as part of a challenge to gain
+ * the privilege to buy them.
+ */
+void EnGo_SetupMedigoron(EnGo* this, PlayState* play) {
+ EnGo_UpdateMedigoronColliderRadius(this, play, false);
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LYINGDOWNIDLE);
+ this->scaleFactor *= ENGO_MEDIGORON_SCALE_MULTIPLIER;
+ Actor_SetScale(&this->actor, this->scaleFactor);
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.targetMode = 3;
- this->unk_390 = 0;
+ this->actionFlags = 0;
this->actor.gravity = -1.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_390 |= 0x40;
- this->unk_390 |= 0x20;
- this->unk_3D8 = func_80A13E80;
- this->actionFunc = func_80A149B0;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->msgEventFunc = EnGo_HandleGivePowderKegCutscene;
+ this->actionFunc = EnGo_Idle;
}
-void func_80A14798(EnGo* this, PlayState* play) {
- EffectTireMarkInit sp38 = {
- 0,
- 62,
- { 0, 0, 15, 100 },
- };
+/**
+ * Default setup function as the initial action function.
+ */
+void EnGo_SetupInitialAction(EnGo* this, PlayState* play) {
+ EffectTireMarkInit tireMarkInit = { 0, 62, { 0, 0, 15, 100 } };
- if ((this->unk_288 < 0) || SubS_IsObjectLoaded(this->unk_288, play) || (this->unk_289 < 0) ||
- SubS_IsObjectLoaded(this->unk_289, play)) {
+ if (((this->taisouObjIndex < 0) || SubS_IsObjectLoaded(this->taisouObjIndex, play)) ||
+ ((this->hakuginDemoObjIndex < 0) || SubS_IsObjectLoaded(this->hakuginDemoObjIndex, play))) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gGoronSkel, NULL, this->jointTable, this->morphTable,
GORON_LIMB_MAX);
- this->unk_3DC = -1;
- func_80A12C48(this, play, 2);
- this->actor.draw = func_80A15FEC;
+ this->curAnimIndex = ENGO_ANIM_INVALID;
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL);
+ this->actor.draw = EnGo_Draw;
Collider_InitAndSetSphere(play, &this->colliderSphere, &this->actor, &sSphereInit);
- Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit2);
+ Collider_InitAndSetCylinder(play, &this->colliderCylinder, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- Effect_Add(play, &this->unk_3E8, EFFECT_TIRE_MARK, 0, 0, &sp38);
+ Effect_Add(play, &this->indexEffect, EFFECT_TIRE_MARK, 0, 0, &tireMarkInit);
this->actor.targetMode = 1;
- this->unk_3A4 = 0.01f;
- this->unk_3D8 = NULL;
+ this->scaleFactor = ENGO_NORMAL_SCALE;
+ this->msgEventFunc = NULL;
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_1:
- func_80A14430(this, play);
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_ATHLETIC:
+ EnGo_SetupAthletic(this, play);
break;
- case ENGO_F_2:
- func_80A1449C(this, play);
+ case ENGO_SPECTATOR:
+ EnGo_SetupSpectator(this, play);
break;
- case ENGO_F_3:
- func_80A144F4(this, play);
+ case ENGO_GATEKEEPER:
+ EnGo_SetupGatekeeper(this, play);
break;
- case ENGO_F_4:
- func_80A145AC(this, play);
+ case ENGO_GRAVEYARD:
+ EnGo_SetupGraveyardGoron(this, play);
break;
- case ENGO_F_5:
- case ENGO_F_6:
- case ENGO_F_7:
- func_80A14668(this, play);
+ case ENGO_ASIDE_STORE:
+ case ENGO_ASIDE_ELDERSROOM:
+ case ENGO_ASIDE_ELDERSSON:
+ EnGo_SetupShrineGoron(this, play);
break;
- case ENGO_F_8:
- func_80A146CC(this, play);
+ case ENGO_MEDIGORON:
+ EnGo_SetupMedigoron(this, play);
break;
default:
@@ -1511,147 +2014,192 @@ void func_80A14798(EnGo* this, PlayState* play) {
}
}
-void func_80A149B0(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Default action for the Gorons. Different types have different default actions.
+ *
+ * The default action possibilities include:
+ * - Shivering
+ * - Covering ears
+ * - Spectating (cheering or shouting)
+ * - Stretching (side-to-side squatting, two-arm side bend, limb shake, one-arm side bend, hamstring stretching while
+ * sitting, and helping the hamstring stretching Goron.)
+ */
+void EnGo_Idle(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_2) && (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_SPECTATOR) &&
+ (gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1))) {
+ // Spectators only cheer. No other interactions
Actor_PlaySfx(&this->actor, NA_SE_EV_GORON_CHEER - SFX_FLAG);
- } else if (ENGO_GET_F(&this->actor) != ENGO_F_8) {
- if (func_80A1222C(this, play)) {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
- this->unk_3EC = 1;
- this->actionFunc = func_80A14B30;
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_4) {
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
- func_80A132C8(this, play);
+ } else if (ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) {
+ // All others besides the Medigoron in the Powder Keg Shop can fall asleep
+ if (EnGo_IsFallingAsleep(this, play)) {
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
+ this->sleepState = ENGO_ASLEEP_POS;
+ this->actionFunc = EnGo_Sleep;
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) {
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
+ EnGo_GravemakerIdle(this, play);
break;
- case ENGO_70_1:
- func_80A133A8(this, play);
+ case ENGO_GRAVEYARD_FROZEN:
+ EnGo_FrozenIdle(this, play);
+ break;
+
+ default:
break;
}
- } else if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
+ } else if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
if (ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 0x3FFC) {
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
} else {
- SubS_UpdateFlags(&this->unk_390, 0, 7);
+ SubS_UpdateFlags(&this->actionFlags, 0, 7);
}
}
}
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14B30(EnGo* this, PlayState* play) {
- s16 sp26 = this->actor.world.rot.y;
+/**
+ * Handles falling asleep, as well as snoring while asleep.
+ */
+void EnGo_Sleep(EnGo* this, PlayState* play) {
+ s16 targetRot = this->actor.world.rot.y;
u16 sfxId;
- if (func_80A1222C(this, play)) {
- this->unk_3EC = 1;
+ if (EnGo_IsFallingAsleep(this, play)) {
+ this->sleepState = ENGO_ASLEEP_POS;
}
- if (this->unk_390 & 0x4000) {
+ if (this->actionFlags & ENGO_FLAG_ROLLING_UP) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 &= ~0x4000;
- this->unk_390 |= 0x200;
- if (this->unk_3EC != 0) {
- this->unk_3AE = 0;
+ this->actionFlags &= ~ENGO_FLAG_ROLLING_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLED_UP;
+ if (this->sleepState != ENGO_AWAKE) {
+ this->snorePhase = 0;
}
- this->actor.shape.yOffset = 14.0f;
+ this->actor.shape.yOffset = ENGO_ROLLEDUP_Y_OFFSET;
}
- } else if (this->unk_390 & 0x8000) {
+ } else if (this->actionFlags & ENGO_FLAG_UNROLLING) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
- this->unk_390 |= 0x80;
- this->unk_390 &= ~0x8000;
+ this->actionFlags |= ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_UNROLLING;
}
- } else if (this->unk_390 & 0x200) {
- if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) && (this->unk_3EC == 0)) {
- func_80A12C48(this, play, 3);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x8000;
- this->actor.shape.yOffset = 0.0f;
- } else if ((this->unk_3EC != 0) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
- this->actor.scale.x = this->unk_3A4 - (Math_SinS(this->unk_3AE) * 0.001f);
- this->actor.scale.y = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- this->actor.scale.z = (Math_SinS(this->unk_3AE) * 0.001f) + this->unk_3A4;
- if (this->unk_3AE == 0) {
- this->unk_3EC = -this->unk_3EC;
- if (this->unk_3EC > 0) {
- sfxId = NA_SE_EN_GOLON_SNORE1;
- } else {
- sfxId = NA_SE_EN_GOLON_SNORE2;
- }
+ } else if (this->actionFlags & ENGO_FLAG_ROLLED_UP) {
+ if ((this->actor.xzDistToPlayer < 160.0f) && (this->actor.playerHeightRel < 20.0f) &&
+ (this->sleepState == ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_UNROLL_IMM);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_UNROLLING;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
+ } else if ((this->sleepState != ENGO_AWAKE) && CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
+ // While asleep, rhythmicallly snore and change shape to show breathing.
+ this->actor.scale.x = this->scaleFactor - (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.y = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+ this->actor.scale.z = this->scaleFactor + (Math_SinS(this->snorePhase) * (0.1f * ENGO_NORMAL_SCALE));
+
+ if (this->snorePhase == 0) {
+ this->sleepState = -this->sleepState;
+ sfxId = (this->sleepState > ENGO_AWAKE) ? NA_SE_EN_GOLON_SNORE1 : NA_SE_EN_GOLON_SNORE2;
Actor_PlaySfx(&this->actor, sfxId);
}
- this->unk_3AE += 0x400;
- this->actor.shape.yOffset = (this->actor.scale.y / this->unk_3A4) * 14.0f;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
+ this->snorePhase += 0x400;
+ this->actor.shape.yOffset = (this->actor.scale.y / this->scaleFactor) * ENGO_ROLLEDUP_Y_OFFSET;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
}
} else if ((this->actor.xzDistToPlayer >= 240.0f) || (this->actor.playerHeightRel >= 20.0f) ||
- (this->unk_3EC != 0)) {
- func_80A12C48(this, play, 4);
- this->unk_390 &= ~0x80;
- this->unk_390 &= ~0x200;
- this->unk_390 |= 0x4000;
- this->actor.shape.yOffset = 0.0f;
+ (this->sleepState != ENGO_AWAKE)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_ROLL);
+ this->actionFlags &= ~ENGO_FLAG_STANDING;
+ this->actionFlags &= ~ENGO_FLAG_ROLLED_UP;
+ this->actionFlags |= ENGO_FLAG_ROLLING_UP;
+ this->actor.shape.yOffset = ENGO_STANDING_Y_OFFSET;
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
- Math_ApproachS(&this->actor.shape.rot.y, sp26, 4, 0x2AA8);
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
+ Math_ApproachS(&this->actor.shape.rot.y, targetRot, 4, 0x2AA8);
}
-void func_80A14E14(EnGo* this, PlayState* play) {
- Actor* actor = this->colliderCylinder.base.ac;
+/**
+ * Action function for a frozen Goron.
+ *
+ * Transitions to the thawing cutscene when colliding with hot water or fire effect.
+ */
+void EnGo_Frozen(EnGo* this, PlayState* play) {
+ Actor* actorCollidedWith = this->colliderCylinder.base.ac;
- if ((this->unk_390 & 0x1000) && (((actor != NULL) && (actor->id == ACTOR_OBJ_AQUA) && (actor->params & 1)) ||
- (this->actor.colChkInfo.damageEffect == 2))) {
- this->actionFunc = func_80A14E74;
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) &&
+ (((actorCollidedWith != NULL) && (actorCollidedWith->id == ACTOR_OBJ_AQUA) && AQUA_HOT(actorCollidedWith)) ||
+ (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_FIRE))) {
+ this->actionFunc = EnGo_AwaitThaw;
}
}
-void func_80A14E74(EnGo* this, PlayState* play) {
- if (func_80A134F4(this, this->actor.csId)) {
- this->actionFunc = func_80A14EB0;
+/**
+ * Action function for transitioning to thawing.
+ */
+void EnGo_AwaitThaw(EnGo* this, PlayState* play) {
+ if (EnGo_ChangeCutscene(this, this->actor.csId)) {
+ this->actionFunc = EnGo_Thaw;
}
}
-void func_80A14EB0(EnGo* this, PlayState* play) {
- EnGo* sp24 = (EnGo*)this->actor.child;
+/**
+ * Action function for thawing of the Goron, melting sounds, and steam.
+ */
+void EnGo_Thaw(EnGo* this, PlayState* play) {
+ EnGo* otherGoron = (EnGo*)this->actor.child;
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
} else {
CutsceneManager_Stop(this->actor.csId);
- func_80A143A8(this, play);
- if ((ENGO_GET_F(&this->actor) == ENGO_F_4) && (ENGO_GET_70(&this->actor) == ENGO_70_1)) {
- SubS_UpdateFlags(&this->unk_390, 4, 7);
- func_80A143A8(sp24, play);
- sp24->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_GRAVEYARD) &&
+ (ENGO_GET_SUBTYPE(&this->actor) == ENGO_GRAVEYARD_FROZEN)) {
+ SubS_UpdateFlags(&this->actionFlags, 4, 7);
+ EnGo_ChangeToShiveringAnimation(otherGoron, play);
+ otherGoron->actionFunc = EnGo_Idle;
}
- this->actionFunc = func_80A149B0;
+ this->actionFunc = EnGo_Idle;
}
}
-void func_80A14FC8(EnGo* this, PlayState* play) {
- s32 sp38[] = {
- 0, 2, 6, 20, 18, 5, 5, 15,
+/**
+ * Cutscene action function for the arrival of springtime.
+ *
+ * This cutscene consists of:
+ * - The gravemaker stops shivering and looks around.
+ * - The other Goron thaws and shivers briefly.
+ * - The gravemaker pats the other's back and gestures broadly.
+ * - They both look around.
+ * - They both cheer.
+ */
+void EnGo_HandleSpringArrivalCutscene(EnGo* this, PlayState* play) {
+ s32 animationIndices[] = {
+ ENGO_ANIM_LYINGDOWNIDLE, ENGO_ANIM_UNROLL, ENGO_ANIM_SHIVER_IMM, ENGO_ANIM_LOOK_AROUND,
+ ENGO_ANIM_SHOW, ENGO_ANIM_SHIVER, ENGO_ANIM_SHIVER, ENGO_ANIM_CHEER,
};
u16 cueType = 0;
s32 cueId;
s32 cueChannel;
- switch (ENGO_GET_70(&this->actor)) {
- case ENGO_70_0:
+ switch (ENGO_GET_SUBTYPE(&this->actor)) {
+ case ENGO_GRAVEYARD_GRAVEMAKER:
cueType = CS_CMD_ACTOR_CUE_128;
break;
- case ENGO_70_1:
+ case ENGO_GRAVEYARD_FROZEN:
cueType = CS_CMD_ACTOR_CUE_129;
break;
+
+ default:
+ break;
}
if ((cueType == CS_CMD_ACTOR_CUE_128) || (cueType == CS_CMD_ACTOR_CUE_129)) {
@@ -1659,51 +2207,59 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
cueChannel = Cutscene_GetCueChannel(play, cueType);
cueId = play->csCtx.actorCues[cueChannel]->id;
- if (this->cueId != (u8)cueId) {
- this->cueId = cueId;
- func_80A12C48(this, play, sp38[cueId]);
- this->unk_390 = 0;
- this->unk_390 |= 0x20;
- this->unk_3BE = 0;
- this->unk_39C = 0.0f;
- this->unk_3A0 = 0.0f;
+ if (this->springArrivalCueId != (u8)cueId) {
+ this->springArrivalCueId = cueId;
+ EnGo_ChangeAnim(this, play, animationIndices[cueId]);
+ this->actionFlags = 0;
+ this->actionFlags |= ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_OPEN;
+ this->iceBlockScale = 0.0f;
+ this->iceBlockAlpha = 0.0f;
switch (cueId) {
case 1:
- this->unk_390 |= 0x80;
+ this->actionFlags |= ENGO_FLAG_STANDING;
this->skelAnime.curFrame = this->skelAnime.endFrame;
break;
case 5:
case 6:
- func_80A141D4(this, play);
+ EnGo_ChangeToFrozenAnimation(this, play);
+ break;
+
+ default:
break;
}
}
- switch (this->cueId) {
+ switch (this->springArrivalCueId) {
case 3:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 20)) {
- func_80A12C48(this, play, 21);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_LOOK_AROUND)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_LOOK_AROUND_LOOPED);
}
break;
case 4:
- if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->unk_3DC == 18)) {
- func_80A12C48(this, play, 19);
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) &&
+ (this->curAnimIndex == ENGO_ANIM_SHOW)) {
+ EnGo_ChangeAnim(this, play, ENGO_ANIM_SHOW_LOOPED);
}
break;
case 6:
- if ((s32)(this->unk_39C * 3.0f) != 0) {
+ if ((s32)(this->iceBlockScale * 3.0f) != 0) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
- Math_ApproachF(&this->unk_39C, 0.0f, 0.02f, 1.0f);
- this->unk_3A0 = (this->unk_39C / 0.9f) * 100.0f;
- func_80A139E4(this);
- } else if (this->unk_390 & 0x400) {
- func_80A143A8(this, play);
+ Math_ApproachF(&this->iceBlockScale, 0.0f, 0.02f, 1.0f);
+ this->iceBlockAlpha = (this->iceBlockScale / 0.9f) * 100.0f;
+ EnGo_MakeSteam(this);
+ } else if (this->actionFlags & ENGO_FLAG_FROZEN) {
+ EnGo_ChangeToShiveringAnimation(this, play);
}
break;
+
+ default:
+ break;
}
if (cueType == 128) {
@@ -1729,6 +2285,9 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 490:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
} else if (cueType == 129) {
switch (play->csCtx.curFrame) {
@@ -1748,65 +2307,72 @@ void func_80A14FC8(EnGo* this, PlayState* play) {
case 480:
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_VOICE_EATFULL);
break;
+
+ default:
+ break;
}
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
}
}
-void func_80A153FC(EnGo* this, PlayState* play) {
- Vec3s* sp5C;
- Vec3f sp50;
- Vec3f sp44;
+/**
+ * Action function for the Gatekeeper while they're in a snowball.
+ *
+ * On Day 2, they'll roll along a set path, and can be halted with certain attacks.
+ * On Day 3, they're frozen solid.
+ */
+void EnGo_Snowball(EnGo* this, PlayState* play) {
+ Vec3s* pathPoints;
+ Vec3f currentPos;
+ Vec3f currentPathPoint;
- if ((this->unk_390 & 0x1000) && (this->actor.colChkInfo.damageEffect == 0xF)) {
+ if ((this->actionFlags & ENGO_FLAG_HIT_BY_OTHER) && (this->actor.colChkInfo.damageEffect == ENGO_DMGEFF_BREAK)) {
+ // Stop the Gatekeeper when hit by an appropriate effect
Actor_PlaySfx(&this->actor, NA_SE_EV_SNOWBALL_BROKEN);
-
this->actor.flags &= ~ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_2000000;
-
- func_80A118F8(this->unk_3F8, this->actor.world.pos);
+ EnGo_InitSnow(this->effectTable, this->actor.world.pos);
this->actor.shape.rot.x = 0;
this->actor.speed = 0.0f;
-
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_COLD);
if (gSaveContext.save.day == 3) {
- func_80A141D4(this, play);
- this->actionFunc = func_80A14E14;
+ EnGo_ChangeToFrozenAnimation(this, play);
+ this->actionFunc = EnGo_Frozen;
} else {
- func_80A143A8(this, play);
- this->actionFunc = func_80A149B0;
+ EnGo_ChangeToShiveringAnimation(this, play);
+ this->actionFunc = EnGo_Idle;
}
- } else if (this->unk_284 != NULL) {
- if (this->unk_390 & 0x800) {
+ } else if (this->gatekeeperPath != NULL) {
+ if (this->actionFlags & ENGO_FLAG_HIT_OTHER) {
Player_PlaySfx(GET_PLAYER(play), NA_SE_PL_BODY_HIT);
func_800B8D50(play, &this->actor, 2.0f, this->actor.yawTowardsPlayer, 0.0f, 0);
}
- sp5C = Lib_SegmentedToVirtual(this->unk_284->points);
- if (SubS_HasReachedPoint(&this->actor, this->unk_284, this->unk_3E4)) {
- if (this->unk_3E4 >= (this->unk_284->count - 1)) {
- this->unk_3E4 = 0;
+ pathPoints = Lib_SegmentedToVirtual(this->gatekeeperPath->points);
+ if (SubS_HasReachedPoint(&this->actor, this->gatekeeperPath, this->indexPathPoint)) {
+ if (this->indexPathPoint >= (this->gatekeeperPath->count - 1)) {
+ this->indexPathPoint = 0;
} else {
- this->unk_3E4++;
+ this->indexPathPoint++;
}
}
- Math_Vec3s_ToVec3f(&sp44, &sp5C[this->unk_3E4]);
- Math_Vec3f_Copy(&sp50, &this->actor.world.pos);
- Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&sp50, &sp44), 4, 0x38E);
+ Math_Vec3s_ToVec3f(¤tPathPoint, &pathPoints[this->indexPathPoint]);
+ Math_Vec3f_Copy(¤tPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.world.rot.y, Math_Vec3f_Yaw(¤tPos, ¤tPathPoint), 4, 0x38E);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BIGBALL_ROLL - SFX_FLAG);
- func_800AE930(&play->colCtx, Effect_GetByIndex(this->unk_3E8), &this->actor.world.pos, 18.0f,
+ func_800AE930(&play->colCtx, Effect_GetByIndex(this->indexEffect), &this->actor.world.pos, 18.0f,
this->actor.shape.rot.y, this->actor.floorPoly, this->actor.floorBgId);
} else {
- func_800AEF44(Effect_GetByIndex(this->unk_3E8));
+ func_800AEF44(Effect_GetByIndex(this->indexEffect));
}
this->actor.speed = 4.0f;
@@ -1815,86 +2381,107 @@ void func_80A153FC(EnGo* this, PlayState* play) {
}
}
-s32* func_80A15684(EnGo* this, PlayState* play) {
- static s32* D_80A16704[] = {
- D_80A16100,
- D_80A16164,
+/**
+ * Return the MsgEvent script appropriate for the actor.
+ */
+s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play) {
+ static s32 sMsgScriptGraveyard[] = {
+ sMsgScriptGoronGravemaker,
+ sMsgScriptGoronFrozen,
};
- if (this->unk_3EC != 0) {
- return D_80A1640C;
+ if (this->sleepState != ENGO_AWAKE) {
+ return sMsgScriptGoronSleeping; // Lullaby hint
}
- if (ENGO_GET_F(&this->actor) == ENGO_F_1) {
- switch (ENGO_GET_70(&this->actor) % 6) {
- case ENGO_70_0:
- return D_80A163BC;
- case ENGO_70_1:
- return D_80A163CC;
- case ENGO_70_2:
- return D_80A163DC;
- case ENGO_70_3:
- return D_80A163EC;
- case ENGO_70_4:
- return D_80A163FC;
- case ENGO_70_5:
- return D_80A163FC;
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_ATHLETIC) {
+ switch (ENGO_GET_SUBTYPE(&this->actor) % 6) {
+ case ENGO_ATHLETIC_A:
+ return sMsgScriptGoronAthleticA;
+
+ case ENGO_ATHLETIC_B: // Unused!
+ return sMsgScriptGoronAthleticB;
+
+ case ENGO_ATHLETIC_C:
+ return sMsgScriptGoronAthleticC;
+
+ case ENGO_ATHLETIC_D:
+ return sMsgScriptGoronAthleticD;
+
+ case ENGO_ATHLETIC_HAMSTRINGSIT:
+ return sMsgScriptGoronAthleticHamstring;
+
+ case ENGO_ATHLETIC_HAMSTRINGSTAND:
+ return sMsgScriptGoronAthleticHamstring;
+
+ default:
+ break;
}
}
- switch (ENGO_GET_F(&this->actor)) {
- case ENGO_F_3:
- return D_80A16350;
- case ENGO_F_4:
- return D_80A16704[ENGO_GET_70(&this->actor)];
- case ENGO_F_5:
- return D_80A16208;
- case ENGO_F_6:
- return D_80A16254;
- case ENGO_F_7:
- return D_80A16210;
- case ENGO_F_8:
- return D_80A16280;
+ switch (ENGO_GET_TYPE(&this->actor)) {
+ case ENGO_GATEKEEPER:
+ return sMsgScriptGoronGatekeeper;
+
+ case ENGO_GRAVEYARD:
+ return sMsgScriptGraveyard[ENGO_GET_SUBTYPE(&this->actor)];
+
+ case ENGO_ASIDE_STORE:
+ return sMsgScriptGoronAsideStore;
+
+ case ENGO_ASIDE_ELDERSROOM:
+ return sMsgScriptGoronAsideEldersRoom;
+
+ case ENGO_ASIDE_ELDERSSON:
+ return sMsgScriptGoronAsideEldersSon;
+
+ case ENGO_MEDIGORON:
+ return sMsgScriptGoronMedigoron;
+
default:
- return D_80A16208;
+ return sMsgScriptGoronAsideStore;
}
}
-void func_80A157C4(EnGo* this, PlayState* play) {
+/**
+ * Action function for dialog, movement due to dialog, and ending dialog
+ */
+void EnGo_Talk(EnGo* this, PlayState* play) {
s32 pad;
- Vec3f sp40;
- Vec3f sp34;
+ Vec3f targetPos;
+ Vec3f thisPos;
- if (!func_8010BF58(&this->actor, play, func_80A15684(this, play), this->unk_3D8, &this->unk_28C)) {
- if ((ENGO_GET_F(&this->actor) != ENGO_F_1) && !(this->unk_390 & 0x200)) {
- Math_Vec3f_Copy(&sp40, &this->unk_38C->world.pos);
- Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp34, &sp40), 4, 0x2AA8);
+ if (!func_8010BF58(&this->actor, play, EnGo_GetMsgEventScript(this, play), this->msgEventFunc,
+ &this->msgScriptResumePos)) {
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP)) {
+ Math_Vec3f_Copy(&targetPos, &this->attentionTarget->world.pos);
+ Math_Vec3f_Copy(&thisPos, &this->actor.world.pos);
+ Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&thisPos, &targetPos), 4, 0x2AA8);
}
- SubS_FillLimbRotTables(play, this->unk_3CE, this->unk_3C8, ARRAY_COUNT(this->unk_3CE));
+ SubS_FillLimbRotTables(play, this->limbRotTableY, this->limbRotTableZ, ARRAY_COUNT(this->limbRotTableY));
return;
}
- if ((ENGO_GET_F(&this->actor) == ENGO_F_5) || (ENGO_GET_F(&this->actor) == ENGO_F_6) ||
- (ENGO_GET_F(&this->actor) == ENGO_F_7)) {
- this->unk_3BC = 0;
- this->unk_390 &= ~0x20;
- this->unk_3BE = 4;
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_STORE) || (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSROOM) ||
+ (ENGO_GET_TYPE(&this->actor) == ENGO_ASIDE_ELDERSSON)) {
+ this->blinkTimer = 0;
+ this->actionFlags &= ~ENGO_FLAG_EYES_OPEN;
+ this->eyeTexIndex = ENGO_EYETEX_CLOSED2;
}
- this->unk_390 &= ~0x8;
- SubS_UpdateFlags(&this->unk_390, 3, 7);
- this->unk_28C = 0;
- this->unk_390 |= 0x40;
- this->actionFunc = this->unk_18C;
+ this->actionFlags &= ~ENGO_FLAG_ENGAGED;
+ SubS_UpdateFlags(&this->actionFlags, 3, 7);
+ this->msgScriptResumePos = 0;
+ this->actionFlags |= ENGO_FLAG_LOST_ATTENTION;
+ this->actionFunc = this->interruptedActionFunc;
}
void EnGo_Init(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- this->unk_288 = SubS_GetObjectIndex(OBJECT_TAISOU, play);
- this->unk_289 = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
- this->actionFunc = func_80A14798;
+ this->taisouObjIndex = SubS_GetObjectIndex(OBJECT_TAISOU, play);
+ this->hakuginDemoObjIndex = SubS_GetObjectIndex(OBJECT_HAKUGIN_DEMO, play);
+ this->actionFunc = EnGo_SetupInitialAction;
}
void EnGo_Destroy(Actor* thisx, PlayState* play) {
@@ -1902,55 +2489,60 @@ void EnGo_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->colliderCylinder);
Collider_DestroySphere(play, &this->colliderSphere);
- Effect_Destroy(play, this->unk_3E8);
+ Effect_Destroy(play, this->indexEffect);
}
void EnGo_Update(Actor* thisx, PlayState* play) {
EnGo* this = THIS;
- f32 phi_f0;
+ f32 xzRange;
- func_80A12868(this, play);
- if (!func_80A12774(this, play)) {
- func_80A12954(this, play);
+ EnGo_DetectCollisions(this, play);
+
+ if (!EnGo_UpdateTalking(this, play)) {
+ EnGo_UpdateSpringArrivalCutscene(this, play);
}
this->actionFunc(this, play);
- if (!(this->unk_390 & 0x400)) {
- func_80A12D6C(this);
- func_80A12A64(this, play);
- func_80A131F8(this, play);
- func_80A12B78(this, play);
+ if (!(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ EnGo_UpdateEyes(this);
+ EnGo_UpdateAnimationToCurrent(this, play);
+ EnGo_UpdateAttentionTargetAndReactions(this, play);
+ EnGo_UpdateSfx(this, play);
}
- if (!(this->unk_390 & 0x100) && !(this->unk_390 & 0x200) && !(this->unk_390 & 0x400)) {
- if (ENGO_GET_F(&this->actor) == ENGO_F_8) {
- phi_f0 = this->colliderSphere.dim.worldSphere.radius + 60;
+ if (!(this->actionFlags & ENGO_FLAG_SNOWBALLED) && !(this->actionFlags & ENGO_FLAG_ROLLED_UP) &&
+ !(this->actionFlags & ENGO_FLAG_FROZEN)) {
+ if (ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) {
+ xzRange = this->colliderSphere.dim.worldSphere.radius + 60;
} else {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
+ xzRange = this->colliderCylinder.dim.radius + 40;
}
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
- } else if ((this->unk_390 & 0x200) && (this->unk_3EC != 0)) {
- phi_f0 = this->colliderCylinder.dim.radius + 40;
- func_8013C964(&this->actor, play, phi_f0, 20.0f, PLAYER_IA_NONE, this->unk_390 & 7);
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
+ } else if ((this->actionFlags & ENGO_FLAG_ROLLED_UP) && (this->sleepState != ENGO_AWAKE)) {
+ xzRange = this->colliderCylinder.dim.radius + 40;
+ func_8013C964(&this->actor, play, xzRange, 20.0f, PLAYER_IA_NONE, this->actionFlags & 7);
}
- if ((ENGO_GET_F(&this->actor) != ENGO_F_8) && (ENGO_GET_F(&this->actor) != ENGO_F_2) &&
- (ENGO_GET_F(&this->actor) != ENGO_F_1)) {
+ if ((ENGO_GET_TYPE(&this->actor) != ENGO_MEDIGORON) && (ENGO_GET_TYPE(&this->actor) != ENGO_SPECTATOR) &&
+ (ENGO_GET_TYPE(&this->actor) != ENGO_ATHLETIC)) {
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
}
- func_80A122EC(this);
- func_80A126BC(this, play);
- func_80A1203C(this);
+ EnGo_UpdateFocus(this);
+ EnGo_UpdateCollider(this, play);
+ EnGo_UpdateEffects(this);
}
-void func_80A15B80(EnGo* this, PlayState* play) {
+/**
+ * Draw function for a snowballed or rolled up Goron (no need to draw limbs).
+ */
+void EnGo_Draw_NoSkeleton(EnGo* this, PlayState* play) {
Gfx* gfx;
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);
@@ -1959,7 +2551,7 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
Matrix_Translate(0.0f, this->actor.shape.yOffset, 0.0f, MTXMODE_APPLY);
- if (this->unk_390 & 0x100) {
+ if (this->actionFlags & ENGO_FLAG_SNOWBALLED) {
Matrix_Scale(this->actor.scale.x * 8.0f, this->actor.scale.y * 8.0f, this->actor.scale.z * 8.0f, MTXMODE_APPLY);
} else {
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
@@ -1968,60 +2560,59 @@ void func_80A15B80(EnGo* this, PlayState* play) {
Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, (this->unk_390 & 0x100) ? gGoronSnowballDL : gGoronRolledUpDL);
+ gSPDisplayList(POLY_OPA_DISP++, (this->actionFlags & ENGO_FLAG_SNOWBALLED) ? gGoronSnowballDL : gGoronRolledUpDL);
CLOSE_DISPS(play->state.gfxCtx);
}
s32 EnGo_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnGo* this = THIS;
- Vec3f sp30;
- s32 idx;
+ Vec3f worldPos;
+ s32 rotTableIndex;
- if ((ENGO_GET_F(&this->actor) == ENGO_F_8) && (limbIndex == 10)) {
- Matrix_MultZero(&sp30);
- sp30.y = this->actor.world.pos.y;
- Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30);
+ if ((ENGO_GET_TYPE(&this->actor) == ENGO_MEDIGORON) && (limbIndex == GORON_LIMB_BODY)) {
+ Matrix_MultZero(&worldPos);
+ worldPos.y = this->actor.world.pos.y;
+ Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &worldPos);
}
switch (limbIndex) {
- case 10:
- idx = 0;
+ case GORON_LIMB_BODY:
+ rotTableIndex = 0;
break;
- case 11:
- idx = 1;
+ case GORON_LIMB_LEFT_UPPER_ARM:
+ rotTableIndex = 1;
break;
- case 14:
- idx = 2;
+ case GORON_LIMB_RIGHT_UPPER_ARM:
+ rotTableIndex = 2;
break;
default:
- idx = 9;
+ rotTableIndex = 9;
break;
}
- if ((this->unk_390 & 0x80) && (idx < 9)) {
- rot->y += (s16)(Math_SinS(this->unk_3CE[idx]) * 200.0f);
- rot->z += (s16)(Math_CosS(this->unk_3C8[idx]) * 200.0f);
+ if ((this->actionFlags & ENGO_FLAG_STANDING) && (rotTableIndex < 9)) {
+ rot->y += (s16)(Math_SinS(this->limbRotTableY[rotTableIndex]) * 200.0f);
+ rot->z += (s16)(Math_CosS(this->limbRotTableZ[rotTableIndex]) * 200.0f);
}
return false;
}
void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
EnGo* this = THIS;
- u16 temp_v0;
s32 stepRot;
s32 overrideRot;
- if (this->unk_390 & 0x40) {
+ if (this->actionFlags & ENGO_FLAG_LOST_ATTENTION) {
stepRot = false;
} else {
stepRot = true;
}
- if (this->unk_390 & 0x10) {
+ if (this->actionFlags & ENGO_FLAG_FACE_TARGET) {
overrideRot = true;
} else {
overrideRot = false;
@@ -2032,47 +2623,50 @@ void EnGo_TransfromLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
}
switch (limbIndex) {
- case 17:
- SubS_UpdateLimb(this->unk_3B0 + this->unk_3B4 + 0x4000,
- this->unk_3B2 + this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_290,
- &this->unk_2A8, stepRot, overrideRot);
+ case GORON_LIMB_HEAD:
+ SubS_UpdateLimb(this->headRotZ + this->bodyRotZ + 0x4000,
+ this->headRotY + this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->headPos,
+ &this->headRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_290.x, this->unk_290.y, this->unk_290.z, MTXMODE_NEW);
+ Matrix_Translate(this->headPos.x, this->headPos.y, this->headPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2A8.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2A8.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2A8.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->headRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->headRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->headRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
- case 10:
- SubS_UpdateLimb(this->unk_3B4 + 0x4000, this->unk_3B6 + this->actor.shape.rot.y + 0x4000, &this->unk_29C,
- &this->unk_2AE, stepRot, overrideRot);
+ case GORON_LIMB_BODY:
+ SubS_UpdateLimb(this->bodyRotZ + 0x4000, this->bodyRotY + this->actor.shape.rot.y + 0x4000, &this->bodyPos,
+ &this->bodyRot, stepRot, overrideRot);
Matrix_Pop();
- Matrix_Translate(this->unk_29C.x, this->unk_29C.y, this->unk_29C.z, MTXMODE_NEW);
+ Matrix_Translate(this->bodyPos.x, this->bodyPos.y, this->bodyPos.z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
- Matrix_RotateYS(this->unk_2AE.y, MTXMODE_APPLY);
- Matrix_RotateXS(this->unk_2AE.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->unk_2AE.z, MTXMODE_APPLY);
+ Matrix_RotateYS(this->bodyRot.y, MTXMODE_APPLY);
+ Matrix_RotateXS(this->bodyRot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(this->bodyRot.z, MTXMODE_APPLY);
Matrix_Push();
break;
+
+ default:
+ break;
}
}
-void func_80A15FEC(Actor* thisx, PlayState* play) {
- static TexturePtr D_80A1670C[] = {
+void EnGo_Draw(Actor* thisx, PlayState* play) {
+ static TexturePtr sEyeTextures[] = {
gGoronEyeOpenTex, gGoronEyeHalfTex, gGoronEyeClosedTex, gGoronEyeHalfTex, gGoronEyeClosed2Tex,
};
EnGo* this = THIS;
- if (!(this->unk_390 & 0x300)) {
+ if (!(this->actionFlags & (ENGO_FLAG_SNOWBALLED | ENGO_FLAG_ROLLED_UP))) {
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]));
+ gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex]));
- if (this->unk_3DC == 14) {
+ if (this->curAnimIndex == ENGO_ANIM_SITTING_STRETCH) {
Matrix_Translate(0.0f, 0.0f, -4000.0f, MTXMODE_APPLY);
}
SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
@@ -2081,8 +2675,8 @@ void func_80A15FEC(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
} else {
- func_80A15B80(this, play);
+ EnGo_Draw_NoSkeleton(this, play);
}
- func_80A137C0(this, play, this->unk_39C, this->unk_3A0);
- func_80A1213C(this, play);
+ EnGo_DrawIceBlockWhenFrozen(this, play, this->iceBlockScale, this->iceBlockAlpha);
+ EnGo_DrawEffects(this, play);
}
diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.h b/src/overlays/actors/ovl_En_Go/z_en_go.h
index 9d12dfdce..5162a4f77 100644
--- a/src/overlays/actors/ovl_En_Go/z_en_go.h
+++ b/src/overlays/actors/ovl_En_Go/z_en_go.h
@@ -2,103 +2,142 @@
#define Z_EN_GO_H
#include "global.h"
+#include "objects/object_oF1d_map/object_oF1d_map.h"
struct EnGo;
typedef void (*EnGoActionFunc)(struct EnGo*, PlayState*);
+typedef s32 (*MsgEventFunc)(Actor*, PlayState*);
-#define ENGO_GET_F(thisx) (((thisx)->params & 0xF) & 0xFF)
-#define ENGO_GET_70(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
-#define ENGO_GET_7F80(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+#define ENGO_GET_TYPE(thisx) (((thisx)->params & 0xF) & 0xFF)
+#define ENGO_GET_SUBTYPE(thisx) ((((thisx)->params & 0x70) >> 4) & 0xFF)
+#define ENGO_GET_PATH_INDEX(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
-enum {
+#define ENGO_PATH_INDEX_NONE 0xFF
+
+#define ENGO_SNOW_EFFECT_COUNT 16
+#define ENGO_OTHER_EFFECT_COUNT 16
+#define ENGO_EFFECT_COUNT (ENGO_SNOW_EFFECT_COUNT + ENGO_OTHER_EFFECT_COUNT)
+
+/**
+ * Struct to track the state of various visual effects.
+ *
+ * A Goron's 'effectTable' is comprised of a number of these effects, which depending on the context in which they are
+ * used, take on the form of snow, dust, or steam. The functions using these objects have an expectation that they are
+ * iterating through the full effectTable, or half of the effectTable. See individual functions containing 'EnGoEffect*'
+ * parameters for more details.
+ */
+typedef struct EnGoEffect {
+ /* 0x00 */ u8 type;
+ /* 0x01 */ u8 alphaDenom;
+ /* 0x02 */ u8 alphaNumer;
+ /* 0x04 */ Vec3s rotVelocity;
+ /* 0x0A */ Vec3s rotAngle;
+ /* 0x10 */ Vec3f pos;
+ /* 0x1C */ Vec3f accel;
+ /* 0x28 */ Vec3f velocity;
+ /* 0x34 */ f32 scaleXY;
+ /* 0x38 */ f32 scaleXYDelta;
+} EnGoEffect; // size = 0x3C;
+
+/**
+ * Goron Type, identified by bits [3..0] of the actor's params
+ *
+ * - The ENGO_ATHLETIC and ENGO_SPECTATOR types share the same subtype domain (EnGoRacetrackSubtype: [0,7])
+ * - ENGO_GRAVEYARD types have their own subtype domain (EnGoGraveyardSubtype: [0,1])
+ * - Others have no subtypes.
+ */
+typedef enum EnGoType {
/* 0 */ ENGO_F_0,
- /* 1 */ ENGO_F_1,
- /* 2 */ ENGO_F_2,
- /* 3 */ ENGO_F_3,
- /* 4 */ ENGO_F_4,
- /* 5 */ ENGO_F_5,
- /* 6 */ ENGO_F_6,
- /* 7 */ ENGO_F_7,
- /* 8 */ ENGO_F_8,
-};
+ /* 1 */ ENGO_ATHLETIC, // Racers stretching before the race
+ /* 2 */ ENGO_SPECTATOR, // Spectators to the race
+ /* 3 */ ENGO_GATEKEEPER, // Gatekeeper to the Goron Shrine
+ /* 4 */ ENGO_GRAVEYARD, // Gravemaker and other
+ /* 5 */ ENGO_ASIDE_STORE, // Shrine Goron outside store
+ /* 6 */ ENGO_ASIDE_ELDERSROOM, // Shrine Goron outside Elder's room
+ /* 7 */ ENGO_ASIDE_ELDERSSON, // Shrine Goron aside the Elder's Son
+ /* 8 */ ENGO_MEDIGORON // Medigoron selling Powder Kegs
+} EnGoType;
-enum {
- /* 0 */ ENGO_70_0,
- /* 1 */ ENGO_70_1,
- /* 2 */ ENGO_70_2,
- /* 3 */ ENGO_70_3,
- /* 4 */ ENGO_70_4,
- /* 5 */ ENGO_70_5,
-};
+/**
+ * Subtype for Gorons at the racetrack (ENGO_ATHLETIC and ENGO_SPECTATOR)
+ */
+typedef enum EnGoRacetrackSubtype {
+ /* 0 */ ENGO_ATHLETIC_A,
+ /* 1 */ ENGO_ATHLETIC_B,
+ /* 2 */ ENGO_ATHLETIC_C,
+ /* 3 */ ENGO_ATHLETIC_D,
+ /* 4 */ ENGO_ATHLETIC_HAMSTRINGSIT,
+ /* 5 */ ENGO_ATHLETIC_HAMSTRINGSTAND,
+ /* 6 */ ENGO_SPECTATOR_CHEER,
+ /* 7 */ ENGO_SPECTATOR_SHOUTING
+} EnGoRacetrackSubtype;
-typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
- /* 0x02 */ u8 unk_02;
- /* 0x04 */ Vec3s unk_04;
- /* 0x0A */ Vec3s unk_0A;
- /* 0x10 */ Vec3f unk_10;
- /* 0x1C */ Vec3f unk_1C;
- /* 0x28 */ Vec3f unk_28;
- /* 0x34 */ f32 unk_34;
- /* 0x38 */ f32 unk_38;
-} EnGoStruct; // size = 0x3C;
+/**
+ * Subtype for Gorons outside the Goron Graveyard (ENGO_GRAVEYARD)
+ */
+typedef enum EnGoGraveyardSubtype {
+ /* 0 */ ENGO_GRAVEYARD_GRAVEMAKER,
+ /* 1 */ ENGO_GRAVEYARD_FROZEN
+} EnGoGraveyardSubtype;
typedef struct EnGo {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnGoActionFunc actionFunc;
- /* 0x18C */ EnGoActionFunc unk_18C;
- /* 0x190 */ EnGoActionFunc unk_190;
+ /* 0x18C */ EnGoActionFunc interruptedActionFunc;
+ /* 0x190 */ EnGoActionFunc graveyardDialogActionFunc;
/* 0x194 */ ColliderCylinder colliderCylinder;
- /* 0x1E0 */ UNK_TYPE1 unk1E0[0x4C];
+ /* 0x1E0 */ ColliderCylinder unusedCylinder;
/* 0x22C */ ColliderSphere colliderSphere;
- /* 0x284 */ Path* unk_284;
- /* 0x288 */ s8 unk_288;
- /* 0x289 */ s8 unk_289;
- /* 0x28C */ s32 unk_28C;
- /* 0x290 */ Vec3f unk_290;
- /* 0x29C */ Vec3f unk_29C;
- /* 0x2A8 */ Vec3s unk_2A8;
- /* 0x2AE */ Vec3s unk_2AE;
- /* 0x2B4 */ Vec3s jointTable[18];
- /* 0x320 */ Vec3s morphTable[18];
- /* 0x38C */ Actor* unk_38C;
- /* 0x390 */ u16 unk_390;
- /* 0x392 */ u16 unk_392;
- /* 0x394 */ u8 cueId;
- /* 0x398 */ f32 unk_398;
- /* 0x39C */ f32 unk_39C;
- /* 0x3A0 */ f32 unk_3A0;
- /* 0x3A4 */ f32 unk_3A4;
- /* 0x3A8 */ f32 unk_3A8;
+ /* 0x284 */ Path* gatekeeperPath;
+ /* 0x288 */ s8 taisouObjIndex;
+ /* 0x289 */ s8 hakuginDemoObjIndex;
+ /* 0x28C */ s32 msgScriptResumePos;
+ /* 0x290 */ Vec3f headPos;
+ /* 0x29C */ Vec3f bodyPos;
+ /* 0x2A8 */ Vec3s headRot;
+ /* 0x2AE */ Vec3s bodyRot;
+ /* 0x2B4 */ Vec3s jointTable[GORON_LIMB_MAX];
+ /* 0x320 */ Vec3s morphTable[GORON_LIMB_MAX];
+ /* 0x38C */ Actor* attentionTarget;
+ /* 0x390 */ u16 actionFlags;
+ /* 0x392 */ u16 lastTextId;
+ /* 0x394 */ u8 springArrivalCueId;
+ /* 0x398 */ f32 curAnimPlaySpeed;
+ /* 0x39C */ f32 iceBlockScale;
+ /* 0x3A0 */ f32 iceBlockAlpha;
+ /* 0x3A4 */ f32 scaleFactor;
+ /* 0x3A8 */ f32 scaleFactorPoundDistortion;
/* 0x3AC */ UNK_TYPE1 unk3AC[0x2];
- /* 0x3AE */ s16 unk_3AE;
- /* 0x3B0 */ s16 unk_3B0;
- /* 0x3B2 */ s16 unk_3B2;
- /* 0x3B4 */ s16 unk_3B4;
- /* 0x3B6 */ s16 unk_3B6;
+ /* 0x3AE */ union {
+ s16 snorePhase; // Used whilst a Goron is sleeping, +0x400 at a time
+ s16 elapsedHangtime; // Hangtime at the top of a pound.
+ };
+ /* 0x3B0 */ s16 headRotZ;
+ /* 0x3B2 */ s16 headRotY;
+ /* 0x3B4 */ s16 bodyRotZ;
+ /* 0x3B6 */ s16 bodyRotY;
/* 0x3B8 */ s16 csId;
- /* 0x3BA */ s16 unk_3BA;
- /* 0x3BC */ s16 unk_3BC;
- /* 0x3BE */ s16 unk_3BE;
- /* 0x3C0 */ s16 unk_3C0;
- /* 0x3C2 */ s16 unk_3C2;
- /* 0x3C4 */ s16 unk_3C4;
- /* 0x3C6 */ s16 unk_3C6;
- /* 0x3C8 */ s16 unk_3C8[3];
- /* 0x3CE */ s16 unk_3CE[3];
- /* 0x3D4 */ s16 unk_3D4;
- /* 0x3D8 */ void* unk_3D8;
- /* 0x3DC */ s32 unk_3DC;
+ /* 0x3BA */ s16 loseAttentionTimer;
+ /* 0x3BC */ s16 blinkTimer;
+ /* 0x3BE */ s16 eyeTexIndex;
+ /* 0x3C0 */ s16 cutsceneState;
+ /* 0x3C2 */ s16 cutsceneDelayTimer;
+ /* 0x3C4 */ s16 gatekeeperAnimState;
+ /* 0x3C6 */ s16 harmlessTimer;
+ /* 0x3C8 */ s16 limbRotTableZ[3];
+ /* 0x3CE */ s16 limbRotTableY[3];
+ /* 0x3D4 */ s16 surprisePhase;
+ /* 0x3D8 */ MsgEventFunc msgEventFunc;
+ /* 0x3DC */ s32 curAnimIndex;
/* 0x3E0 */ UNK_TYPE1 unk3E0[0x4];
- /* 0x3E4 */ s32 unk_3E4;
- /* 0x3E8 */ s32 unk_3E8;
- /* 0x3EC */ s32 unk_3EC;
- /* 0x3F0 */ s32 unk_3F0;
- /* 0x3F4 */ s32 unk_3F4;
- /* 0x3F8 */ EnGoStruct unk_3F8[32];
+ /* 0x3E4 */ s32 indexPathPoint;
+ /* 0x3E8 */ s32 indexEffect;
+ /* 0x3EC */ s32 sleepState;
+ /* 0x3F0 */ s32 springArrivalCutsceneActive;
+ /* 0x3F4 */ s32 changedText;
+ /* 0x3F8 */ EnGoEffect effectTable[ENGO_EFFECT_COUNT];
} EnGo; // size = 0xB78
#endif // Z_EN_GO_H
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_Goroiwa/z_en_goroiwa.h b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
index e672355e5..2ace5ff85 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.h
@@ -14,27 +14,27 @@ typedef s32 (*EnGoroiwaUnkFunc)(struct EnGoroiwa*);
#define ENGOROIWA_GET_300(thisx) (((thisx)->params >> 0x8) & 3)
#define ENGOROIWA_GET_FF(thisx) ((thisx)->params & 0xFF)
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_300_0,
/* 1 */ ENGOROIWA_300_1,
- /* 3 */ ENGOROIWA_300_3 = 3,
-};
+ /* 3 */ ENGOROIWA_300_3 = 3
+} EnGoroiwaParam300;
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_400_0,
- /* 1 */ ENGOROIWA_400_1,
-};
+ /* 1 */ ENGOROIWA_400_1
+} EnGoroiwaParam400;
-enum {
+typedef enum {
/* 0 */ ENGOROIWA_3000_0,
/* 1 */ ENGOROIWA_3000_1,
- /* 2 */ ENGOROIWA_3000_2,
-};
+ /* 2 */ ENGOROIWA_3000_2
+} EnGoroiwaParam3000;
-enum {
+typedef enum {
/* 1 */ ENGOROIWA_C000_1 = 1,
- /* 2 */ ENGOROIWA_C000_2,
-};
+ /* 2 */ ENGOROIWA_C000_2
+} EnGoroiwaParamC000;
typedef struct {
/* 0x00 */ Vec3f unk_00;
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..bfd2d19ab 100644
--- a/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
+++ b/src/overlays/actors/ovl_En_Grasshopper/z_en_grasshopper.c
@@ -52,18 +52,18 @@ typedef enum {
/* 7 */ EN_GRASSHOPPER_ACTION_WAIT_AFTER_ATTACK,
/* 8 */ EN_GRASSHOPPER_ACTION_DAMAGED,
/* 9 */ EN_GRASSHOPPER_ACTION_DEAD,
- /* 10 */ EN_GRASSHOPPER_ACTION_FALL,
+ /* 10 */ EN_GRASSHOPPER_ACTION_FALL
} EnGrasshopperAction;
typedef enum {
/* 0 */ EN_GRASSHOPPER_DECISION_ATTACK,
/* 1 */ EN_GRASSHOPPER_DECISION_FLY,
- /* 2 */ EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES, // Never used in the final game
+ /* 2 */ EN_GRASSHOPPER_DECISION_ROAM_IN_CIRCLES // Never used in the final game
} EnGrasshopperNextAction;
typedef enum {
/* 0 */ EN_GRASSHOPPER_BANK_STATE_BANKING,
- /* 1 */ EN_GRASSHOPPER_BANK_STATE_DONE,
+ /* 1 */ EN_GRASSHOPPER_BANK_STATE_DONE
} EnGrasshopperBankState;
typedef enum {
@@ -74,7 +74,7 @@ typedef enum {
/* 4 */ EN_GRASSHOPPER_ANIM_HOVER,
/* 5 */ EN_GRASSHOPPER_ANIM_DAMAGE,
/* 6 */ EN_GRASSHOPPER_ANIM_DEAD,
- /* 7 */ EN_GRASSHOPPER_ANIM_FALL,
+ /* 7 */ EN_GRASSHOPPER_ANIM_FALL
} EnGrasshopperAnim;
static s32 sOccupiedIndices[] = {
@@ -99,7 +99,7 @@ typedef enum {
/* 0x3 */ EN_GRASSHOPPER_DMGEFF_FREEZE, // Damages and freezes the Dragonfly in ice
/* 0x4 */ EN_GRASSHOPPER_DMGEFF_LIGHT_ORB, // Damages and surrounds the Dragonfly with light orbs
/* 0xE */ EN_GRASSHOPPER_DMGEFF_HOOK = 0xE, // If hit by the Hookshot, it pulls the Dragonfly towards the player
- /* 0xF */ EN_GRASSHOPPER_DMGEFF_NONE, // Deals regular damage with no extra effect
+ /* 0xF */ EN_GRASSHOPPER_DMGEFF_NONE // Deals regular damage with no extra effect
} EnDragonflyDamageEffect;
static DamageTable sDamageTable = {
@@ -246,7 +246,7 @@ void EnGrasshopper_Init(Actor* thisx, PlayState* play) {
this->type;
}
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
EnGrasshopper_SetupFly(this);
}
@@ -343,7 +343,7 @@ void EnGrasshopper_DecideAction(EnGrasshopper* this, PlayState* play) {
void EnGrasshopper_SetupFly(EnGrasshopper* this) {
EnGrasshopper_ChangeAnim(this, EN_GRASSHOPPER_ANIM_FLY);
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
this->action = EN_GRASSHOPPER_ACTION_FLY;
this->actionFunc = EnGrasshopper_Fly;
}
@@ -384,7 +384,7 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
}
if (this->shouldTurn) {
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
this->targetRot.y = Math_Atan2S(diffX, diffZ);
this->timer = Rand_S16Offset(30, 30);
}
@@ -412,7 +412,7 @@ void EnGrasshopper_Fly(EnGrasshopper* this, PlayState* play) {
this->targetRot.y = Math_Atan2S(diffX, diffZ);
this->timer = Rand_S16Offset(30, 70);
- this->baseFlyHeight = randPlusMinusPoint5Scaled(50.0f) + this->flyingHomePos.y;
+ this->baseFlyHeight = Rand_CenteredFloat(50.0f) + this->flyingHomePos.y;
}
}
}
@@ -441,7 +441,7 @@ void EnGrasshopper_RoamInCircles(EnGrasshopper* this, PlayState* play) {
this->baseFlyHeight = Math_SinS(this->bobPhase) * 10.0f;
if (this->timer == 0) {
- this->baseFlyHeight = randPlusMinusPoint5Scaled(10.0f);
+ this->baseFlyHeight = Rand_CenteredFloat(10.0f);
this->timer = Rand_S16Offset(30, 30);
}
@@ -583,8 +583,8 @@ void EnGrasshopper_ApproachPlayer(EnGrasshopper* this, PlayState* play) {
if ((this->splashCount < 3) || !(play->gameplayFrames % 8)) {
this->splashCount++;
Math_Vec3f_Copy(&splashPos, &this->tailTipPos);
- splashPos.x += randPlusMinusPoint5Scaled(20.0f);
- splashPos.z += randPlusMinusPoint5Scaled(20.0f);
+ splashPos.x += Rand_CenteredFloat(20.0f);
+ splashPos.z += Rand_CenteredFloat(20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (((s32)Rand_ZeroOne() * 100) + 400));
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EV_BOMB_DROP_WATER);
}
@@ -633,8 +633,8 @@ void EnGrasshopper_Attack(EnGrasshopper* this, PlayState* play) {
if ((this->splashCount < 3) || !(play->gameplayFrames % 8)) {
this->splashCount++;
Math_Vec3f_Copy(&splashPos, &this->tailTipPos);
- splashPos.x += randPlusMinusPoint5Scaled(20.0f);
- splashPos.z += randPlusMinusPoint5Scaled(20.0f);
+ splashPos.x += Rand_CenteredFloat(20.0f);
+ splashPos.z += Rand_CenteredFloat(20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, ((s32)Rand_ZeroOne() * 100) + 400);
SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 50, NA_SE_EV_BOMB_DROP_WATER);
}
@@ -796,8 +796,8 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
for (i = 0; i < 3; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled((i * 5.0f) + 20.0f);
- splashPos.z += randPlusMinusPoint5Scaled((i * 5.0f) + 20.0f);
+ splashPos.x += Rand_CenteredFloat((i * 5.0f) + 20.0f);
+ splashPos.z += Rand_CenteredFloat((i * 5.0f) + 20.0f);
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (((s32)Rand_ZeroOne() * 100) + 400));
}
@@ -826,7 +826,7 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sFireVelocityAndAccel); i++) {
Math_Vec3f_Copy(&firePos, &this->actor.world.pos);
- firePos.x += randPlusMinusPoint5Scaled(30.0f);
+ firePos.x += Rand_CenteredFloat(30.0f);
if (!isUnderWater) {
firePos.y = this->actor.floorHeight;
} else if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
@@ -834,7 +834,7 @@ void EnGrasshopper_Fall(EnGrasshopper* this, PlayState* play) {
firePos.y = waterSurface;
}
- firePos.z += randPlusMinusPoint5Scaled(30.0f);
+ firePos.z += Rand_CenteredFloat(30.0f);
func_800B3030(play, &firePos, &sFireVelocityAndAccel[i], &sFireVelocityAndAccel[i], 100, 0, 2);
}
@@ -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) &&
@@ -1062,10 +1062,10 @@ void EnGrasshopper_InitializeEffect(EnGrasshopper* this, Vec3f* pos) {
effect->isEnabled = true;
effect->pos = *pos;
effect->timer = 10;
- effect->velocity.x = randPlusMinusPoint5Scaled(20.0f);
- effect->velocity.y = randPlusMinusPoint5Scaled(20.0f);
- effect->velocity.z = randPlusMinusPoint5Scaled(20.0f);
- effect->yaw = randPlusMinusPoint5Scaled(30000.0f);
+ effect->velocity.x = Rand_CenteredFloat(20.0f);
+ effect->velocity.y = Rand_CenteredFloat(20.0f);
+ effect->velocity.z = Rand_CenteredFloat(20.0f);
+ effect->yaw = Rand_CenteredFloat(30000.0f);
return;
}
}
@@ -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..049091393 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*);
@@ -15,7 +17,7 @@ typedef enum EnGrasshopperType {
/* 0 */ EN_GRASSHOPPER_TYPE_NORMAL,
/* 1 */ EN_GRASSHOPPER_TYPE_GROWS_WHEN_SPAWNED, // Spawned by EnEncount1
/* 2 */ EN_GRASSHOPPER_TYPE_WOODFALL_TEMPLE_FINAL_ROOM,
- /* 3 */ EN_GRASSHOPPER_TYPE_WOODFALL,
+ /* 3 */ EN_GRASSHOPPER_TYPE_WOODFALL
} EnGrasshopperType;
typedef struct EnGrasshopperEffect {
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..6f6f2cad9 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"
@@ -457,25 +458,25 @@ void func_8099874C(EnGs* this, PlayState* play) {
}
if (phi_v0 != 0) {
- this->unk_20C = -1;
+ this->getItemId = -1;
switch (this->unk_194) {
case 1:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_08)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_08);
}
break;
case 3:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_10)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_10);
}
break;
case 2:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_77_20)) {
- this->unk_20C = 6;
+ this->getItemId = GI_RUPEE_SILVER;
SET_WEEKEVENTREG(WEEKEVENTREG_77_20);
}
break;
@@ -483,10 +484,10 @@ void func_8099874C(EnGs* this, PlayState* play) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_90_10)) {
SET_WEEKEVENTREG(WEEKEVENTREG_90_10);
- this->unk_20C = 12;
+ this->getItemId = GI_HEART_PIECE;
}
- if (this->unk_20C > 0) {
+ if (this->getItemId > GI_NONE) {
func_809989B4(this, play);
} else {
func_80997D14(this, play);
@@ -501,7 +502,7 @@ void func_8099874C(EnGs* this, PlayState* play) {
}
void func_809989B4(EnGs* this, PlayState* play) {
- Actor_OfferGetItem(&this->actor, play, this->unk_20C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
this->actionFunc = func_809989F4;
}
@@ -510,7 +511,8 @@ void func_809989F4(EnGs* this, PlayState* play) {
this->actor.parent = NULL;
func_80997D14(this, play);
} else {
- Actor_OfferGetItem(&this->actor, play, this->unk_20C, this->actor.xzDistToPlayer, this->actor.playerHeightRel);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, this->actor.xzDistToPlayer,
+ this->actor.playerHeightRel);
}
}
@@ -523,8 +525,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 +560,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 +587,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 +613,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 +643,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 +716,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 +802,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++;
}
@@ -813,9 +815,9 @@ s32 func_809995A4(EnGs* this, PlayState* play) {
Vec3f sp60;
for (i = 0; i < 3; i++) {
- sp60.x = randPlusMinusPoint5Scaled(15.0f);
+ sp60.x = Rand_CenteredFloat(15.0f);
sp60.y = Rand_ZeroFloat(-1.0f);
- sp60.z = randPlusMinusPoint5Scaled(15.0f);
+ sp60.z = Rand_CenteredFloat(15.0f);
sp6C.x = this->actor.world.pos.x + (2.0f * sp60.x);
sp6C.y = this->actor.world.pos.y + 7.0f;
@@ -834,8 +836,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 +873,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 +1030,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 +1050,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 +1071,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 +1093,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..b7af0c582 100644
--- a/src/overlays/actors/ovl_En_Gs/z_en_gs.h
+++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.h
@@ -11,12 +11,12 @@ typedef void (*EnGsActionFunc)(struct EnGs*, PlayState*);
#define ENGS_GET_FE0(thisx) (((thisx)->params >> 5) & 0x7F)
#define ENGS_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF)
-enum {
+typedef enum {
/* 0 */ ENGS_0,
/* 1 */ ENGS_1,
/* 2 */ ENGS_2,
- /* 3 */ ENGS_3,
-};
+ /* 3 */ ENGS_3
+} EnGsParam;
typedef struct EnGs {
/* 0x000 */ Actor actor;
@@ -47,14 +47,14 @@ typedef struct EnGs {
/* 0x200 */ f32 unk_200;
/* 0x204 */ s32 unk_204;
/* 0x208 */ s32 unk_208;
- /* 0x20C */ s32 unk_20C;
+ /* 0x20C */ s32 getItemId;
/* 0x210 */ u16 unk_210;
/* 0x212 */ s16 csIdList[2];
/* 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..ea93d617f 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
@@ -84,7 +84,7 @@ typedef enum {
/* 0 */ WAIT_HEAD_TILT_ANIM,
/* 1 */ WALK_ANIM,
/* 2 */ DIG_ANIM,
- /* 3 */ WALK_ANIM_2,
+ /* 3 */ WALK_ANIM_2
} EnGuardNutsAnim;
typedef enum {
@@ -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..cb9545d7a 100644
--- a/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
+++ b/src/overlays/actors/ovl_En_Guruguru/z_en_guruguru.c
@@ -131,7 +131,7 @@ void func_80BC6E10(EnGuruguru* this) {
this->headZRotTarget = 0;
this->unk268 = 1;
this->actor.textId = textIDs[this->textIdIndex];
- if ((this->textIdIndex == 0 || this->textIdIndex == 1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04)) {
+ if (((this->textIdIndex == 0) || (this->textIdIndex == 1)) && CHECK_WEEKEVENTREG(WEEKEVENTREG_77_04)) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_88_04)) {
this->actor.textId = 0x295F;
} else {
@@ -175,7 +175,7 @@ void func_80BC701C(EnGuruguru* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((this->unk268 != 0) &&
- (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU)) {
+ ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU))) {
this->headZRotTarget = 5000;
}
@@ -211,7 +211,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
Message_CloseTextbox(play);
this->headZRotTarget = 0;
if ((this->textIdIndex == 13) || (this->textIdIndex == 14)) {
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
SET_WEEKEVENTREG(WEEKEVENTREG_79_04);
func_80BC6E10(this);
return;
@@ -223,7 +223,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
if (this->actor.textId == 0x292A) {
SET_WEEKEVENTREG(WEEKEVENTREG_38_10);
}
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
return;
}
@@ -234,8 +234,8 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
if (this->textIdIndex == 12) {
SET_WEEKEVENTREG(WEEKEVENTREG_38_40);
func_801A3B48(0);
- func_80151BB4(play, 0x36);
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
return;
}
@@ -275,7 +275,7 @@ void func_80BC7068(EnGuruguru* this, PlayState* play) {
return;
}
func_801A3B48(0);
- func_80151BB4(play, 0x13);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU);
func_80BC6E10(this);
}
}
@@ -324,7 +324,7 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
- } else if (this->actor.params == 0 || this->actor.params == 2) {
+ } else if ((this->actor.params == 0) || (this->actor.params == 2)) {
Actor_Kill(&this->actor);
return;
}
@@ -352,10 +352,10 @@ void EnGuruguru_Update(Actor* thisx, PlayState* play) {
this->headXRotTarget = 0;
if (yaw < 0x2AF8) {
this->headXRotTarget = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
- if (this->headXRotTarget > 5000) {
- this->headXRotTarget = 5000;
- } else if (this->headXRotTarget < -5000) {
- this->headXRotTarget = -5000;
+ if (this->headXRotTarget > 0x1388) {
+ this->headXRotTarget = 0x1388;
+ } else if (this->headXRotTarget < -0x1388) {
+ this->headXRotTarget = -0x1388;
}
}
Actor_SetScale(&this->actor, 0.01f);
@@ -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..f5885b3cf 100644
--- a/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
+++ b/src/overlays/actors/ovl_En_Hakurock/z_en_hakurock.c
@@ -265,7 +265,7 @@ void func_80B22500(EnHakurock* this, PlayState* play) {
if (this->counter > 0) {
this->counter--;
if ((this->counter & 1) == 0) {
- this->actor.world.pos.y = (sin_rad(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
+ this->actor.world.pos.y = (Math_SinF(this->counter * (M_PI / 20)) * 4.0f) + this->actor.floorHeight;
} else {
this->actor.world.pos.y = this->actor.floorHeight;
}
@@ -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..4294a8320 100644
--- a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
+++ b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
@@ -107,9 +107,9 @@ void func_80B22E0C(EnHanabiStruct* arg0) {
arg0->unk_20.y *= arg0->unk_14.x;
arg0->unk_20.y -= 1.0f;
- arg0->unk_20.x += randPlusMinusPoint5Scaled(0.8f);
- arg0->unk_20.y += randPlusMinusPoint5Scaled(0.8f);
- arg0->unk_20.z += randPlusMinusPoint5Scaled(0.8f);
+ arg0->unk_20.x += Rand_CenteredFloat(0.8f);
+ arg0->unk_20.y += Rand_CenteredFloat(0.8f);
+ arg0->unk_20.z += Rand_CenteredFloat(0.8f);
if (arg0->unk_01 > 0) {
arg0->unk_01--;
@@ -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);
@@ -286,10 +286,10 @@ void func_80B236C8(EnHanabi* this, PlayState* play) {
}
sp34.x += sp30 * Math_SinS(this->actor.home.rot.y);
- sp34.y += randPlusMinusPoint5Scaled(300.0f);
+ sp34.y += Rand_CenteredFloat(300.0f);
sp34.z += sp30 * Math_CosS(this->actor.home.rot.y);
- if (this->actor.home.rot.x >= 0x259) {
+ if (this->actor.home.rot.x > 0x258) {
sp28 = func_80B22C80(&sp34, this->unk_148, 2.0f);
} else {
sp28 = func_80B22C80(&sp34, this->unk_148, 1.0f);
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..180bf8cab 100644
--- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c
+++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c
@@ -37,14 +37,14 @@ typedef enum {
/* 4 */ HG_ANIM_REACH_FORWARD,
/* 5 */ HG_ANIM_CURL_UP,
/* 6 */ HG_ANIM_CROUCHED_PANIC,
- /* 7 */ HG_ANIM_PANIC,
+ /* 7 */ HG_ANIM_PANIC
} HgAnimation;
typedef enum {
/* 0 */ HG_CS_FIRST_ENCOUNTER,
/* 1 */ HG_CS_GET_MASK,
/* 2 */ HG_CS_SUBSEQUENT_ENCOUNTER,
- /* 3 */ HG_CS_SONG_OF_HEALING,
+ /* 3 */ HG_CS_SONG_OF_HEALING
} HgCsIndex;
ActorInit En_Hg_InitVars = {
@@ -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..f6c90f6b4 100644
--- a/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
+++ b/src/overlays/actors/ovl_En_Hgo/z_en_hgo.c
@@ -45,7 +45,7 @@ typedef enum {
/* 3 */ HGO_ANIM_CONSOLE,
/* 4 */ HGO_ANIM_CONSOLE_HEAD_UP,
/* 5 */ HGO_ANIM_REACH_DOWN_TO_LIFT,
- /* 6 */ HGO_ANIM_TOSS,
+ /* 6 */ HGO_ANIM_TOSS
} HgoAnimation;
ActorInit En_Hgo_InitVars = {
@@ -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..8ad694a11 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
@@ -87,7 +87,7 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
- this->unk_21E = ENHIDDENNUTS_GET_F80(&this->actor);
+ this->pathIndex = ENHIDDENNUTS_GET_PATH_INDEX(&this->actor);
this->switchFlag = ENHIDDENNUTS_GET_SWITCHFLAG(&this->actor);
if (this->switchFlag == 0x7F) {
@@ -99,12 +99,12 @@ void EnHiddenNuts_Init(Actor* thisx, PlayState* play) {
return;
}
- if (this->unk_21E == 0x1F) {
+ if (this->pathIndex == ENHIDDENNUTS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
- this->path = SubS_GetPathByIndex(play, this->unk_21E, 0x3F);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENHIDDENNUTS_PATH_INDEX_NONE_ALT);
this->csId = this->actor.csId;
func_801A5080(2);
func_80BDB268(this);
@@ -156,7 +156,7 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
this->unk_20A = 0;
}
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
func_80BDB580(this);
return;
}
@@ -173,8 +173,8 @@ void func_80BDB2B8(EnHiddenNuts* this, PlayState* play) {
Math_Vec3f_Copy(&sp74, &this->actor.world.pos);
- sp74.x += randPlusMinusPoint5Scaled(15.0f);
- sp74.z += randPlusMinusPoint5Scaled(15.0f);
+ sp74.x += Rand_CenteredFloat(15.0f);
+ sp74.z += Rand_CenteredFloat(15.0f);
EffectSsDtBubble_SpawnCustomColor(play, &sp74, &sp94, &sp88, &sp84, &sp80, Rand_S16Offset(120, 90), 30,
true);
@@ -216,8 +216,8 @@ void func_80BDB59C(EnHiddenNuts* this, PlayState* play) {
Math_Vec3f_Copy(&sp78, &this->actor.world.pos);
- sp78.x += randPlusMinusPoint5Scaled(15.0f);
- sp78.z += randPlusMinusPoint5Scaled(15.0f);
+ sp78.x += Rand_CenteredFloat(15.0f);
+ sp78.z += Rand_CenteredFloat(15.0f);
EffectSsDtBubble_SpawnCustomColor(play, &sp78, &sp98, &sp8C, &sp88, &sp84, Rand_S16Offset(120, 90), 30,
true);
@@ -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_Hidden_Nuts/z_en_hidden_nuts.h b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
index 435e4662c..03a0a52b7 100644
--- a/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
+++ b/src/overlays/actors/ovl_En_Hidden_Nuts/z_en_hidden_nuts.h
@@ -8,7 +8,10 @@ struct EnHiddenNuts;
typedef void (*EnHiddenNutsActionFunc)(struct EnHiddenNuts*, PlayState*);
#define ENHIDDENNUTS_GET_SWITCHFLAG(thisx) ((thisx)->params & 0x7F)
-#define ENHIDDENNUTS_GET_F80(thisx) (((thisx)->params >> 7) & 0x1F)
+#define ENHIDDENNUTS_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x1F)
+
+#define ENHIDDENNUTS_PATH_INDEX_NONE 0x1F
+#define ENHIDDENNUTS_PATH_INDEX_NONE_ALT 0x3F
typedef struct EnHiddenNuts {
/* 0x000 */ Actor actor;
@@ -23,7 +26,7 @@ typedef struct EnHiddenNuts {
/* 0x218 */ s16 unk_218;
/* 0x21A */ s16 unk_21A;
/* 0x21C */ s16 switchFlag;
- /* 0x21E */ s16 unk_21E;
+ /* 0x21E */ s16 pathIndex;
/* 0x220 */ s32 unk_220;
/* 0x224 */ s16 unk_224;
/* 0x226 */ s16 csId;
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..1a0105788 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
@@ -814,11 +814,11 @@ void func_80C215E4(PlayState* play, EnHintSkb* this, Vec3f* arg2) {
s32 pad;
sp5C.y = this->actor.floorHeight;
- sp5C.x = (sin_rad(sp40) * 15.0f) + arg2->x;
- sp5C.z = (cos_rad(sp40) * 15.0f) + arg2->z;
+ sp5C.x = (Math_SinF(sp40) * 15.0f) + arg2->x;
+ sp5C.z = (Math_CosF(sp40) * 15.0f) + arg2->z;
- sp44.x = randPlusMinusPoint5Scaled(1.0f);
- sp44.z = randPlusMinusPoint5Scaled(1.0f);
+ sp44.x = Rand_CenteredFloat(1.0f);
+ sp44.z = Rand_CenteredFloat(1.0f);
sp50.y += (Rand_ZeroOne() - 0.5f) * 4.0f;
@@ -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..ed3fe65b9 100644
--- a/src/overlays/actors/ovl_En_Holl/z_en_holl.c
+++ b/src/overlays/actors/ovl_En_Holl/z_en_holl.c
@@ -191,7 +191,7 @@ void EnHoll_VisibleIdle(EnHoll* this, PlayState* play) {
}
} else if (this->type == EN_HOLL_TYPE_SCENE_CHANGER) {
play->nextEntrance = play->setupExitList[EN_HOLL_GET_EXIT_LIST_INDEX(&this->actor)];
- gSaveContext.unk_3DBB = 1;
+ gSaveContext.retainWeatherMode = true;
Scene_SetExitFade(play);
play->transitionTrigger = TRANS_TRIGGER_START;
play->unk_1878C(play);
@@ -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 df4f17d4c..787a40da7 100644
--- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c
+++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c
@@ -5,6 +5,7 @@
*/
#include "z_en_horse.h"
+#include "z64horse.h"
#include "z64rumble.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "overlays/actors/ovl_Obj_Um/z_obj_um.h"
@@ -91,34 +92,22 @@ void EnHorse_StickDirection(Vec2f* curStick, f32* stickMag, s16* angle);
s32 EnHorse_GetMountSide(EnHorse* this, PlayState* play);
typedef struct {
- s32 cueId;
- s32 csFuncIdx;
-} CsActionEntry;
+ /* 0x0 */ s32 cueId;
+ /* 0x4 */ s32 csFuncIdx;
+} CsActionEntry; // size = 0x8
typedef struct {
- s16 x;
- s16 y;
- s16 z;
- s16 speed;
- s16 angle;
-} RaceWaypoint;
+ /* 0x0 */ s16 x;
+ /* 0x2 */ s16 y;
+ /* 0x4 */ s16 z;
+ /* 0x6 */ s16 speed;
+ /* 0x8 */ s16 angle;
+} RaceWaypoint; // size = 0xA
typedef struct {
- s32 numWaypoints;
- 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;
+ /* 0x0 */ s32 numWaypoints;
+ /* 0x4 */ RaceWaypoint* waypoints;
+} RaceInfo; // size = 0x8
static AnimationHeader* sEponaAnimations[] = {
&object_horse_link_child_Anim_006D44, &object_horse_link_child_Anim_007468, &object_horse_link_child_Anim_005F64,
@@ -290,8 +279,8 @@ void EnHorse_RaceWaypointPos(RaceWaypoint* waypoints, s32 idx, Vec3f* pos) {
pos->z = waypoints[idx].z;
}
-void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnAmount) {
- func_800F415C(&this->actor, pos, turnAmount);
+void EnHorse_RotateToPoint(EnHorse* this, PlayState* play, Vec3f* pos, s16 turnYaw) {
+ Horse_RotateToPoint(&this->actor, pos, turnYaw);
}
void func_8087B7C0(EnHorse* this, PlayState* play, Path* path) {
@@ -594,15 +583,15 @@ s32 EnHorse_Spawn(EnHorse* this, PlayState* play) {
f32 minDist = 1.0e+38;
Player* player = GET_PLAYER(play);
Vec3f spawnPos;
- s32 pathIdx = func_800F3940(play);
+ s32 pathIndex = Horse_GetJumpingFencePathIndex(play);
s32 pathCount;
Vec3s* pathPoints;
- if (pathIdx == -1) {
+ if (pathIndex == -1) {
return false;
}
- path = &play->setupPathList[pathIdx];
+ path = &play->setupPathList[pathIndex];
pathCount = path->count;
pathPoints = Lib_SegmentedToVirtual(path->points);
@@ -703,7 +692,7 @@ void EnHorse_Init(Actor* thisx, PlayState* play2) {
Actor_ProcessInitChain(&this->actor, sInitChain);
EnHorse_ClearDustFlags(&this->dustFlags);
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Skin_Setup(&this->skin);
this->riderPos = thisx->world.pos;
this->unk_52C = 0;
@@ -792,7 +781,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;
}
@@ -1885,8 +1875,8 @@ void EnHorse_InitInactive(EnHorse* this) {
}
void EnHorse_Inactive(EnHorse* this, PlayState* play) {
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -1965,8 +1955,8 @@ void EnHorse_Idle(EnHorse* this, PlayState* play) {
this->actor.speed = 0.0f;
EnHorse_IdleAnimSounds(this, play);
- if ((D_801BDAA4 != 0) && (this->type == HORSE_TYPE_2)) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong && (this->type == HORSE_TYPE_2)) {
+ gHorsePlayedEponasSong = false;
if (!func_8087C38C(play, this, &this->actor.world.pos)) {
if (EnHorse_Spawn(this, play)) {
if (this->type == HORSE_TYPE_2) {
@@ -2061,7 +2051,7 @@ void EnHorse_SetFollowAnimation(EnHorse* this, PlayState* play) {
void EnHorse_FollowPlayer(EnHorse* this, PlayState* play) {
f32 distToPlayer;
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
distToPlayer = Actor_WorldDistXZToActor(&this->actor, &GET_PLAYER(play)->actor);
if (((this->playerDir == PLAYER_DIR_BACK_R) || (this->playerDir == PLAYER_DIR_BACK_L)) && (distToPlayer > 300.0f) &&
@@ -2471,7 +2461,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,
@@ -2970,7 +2960,7 @@ void EnHorse_FleePlayer(EnHorse* this, PlayState* play) {
s32 animFinished;
s16 yaw;
- if ((D_801BDAA4 != 0) || (this->type == HORSE_TYPE_HNI)) {
+ if (gHorsePlayedEponasSong || (this->type == HORSE_TYPE_HNI)) {
EnHorse_StartIdleRidable(this);
if (this->type == HORSE_TYPE_2) {
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
@@ -3329,7 +3319,7 @@ void func_808848C8(EnHorse* this, PlayState* play) {
EnHorse_PlayWalkingSound(this);
this->actor.speed = 4.0f;
- func_800F415C(&this->actor, &sp24, 2000);
+ Horse_RotateToPoint(&this->actor, &sp24, 0x7D0);
this->skin.skelAnime.playSpeed = this->actor.speed * 0.75f;
SkelAnime_Update(&this->skin.skelAnime);
if (Math3D_Distance(&sp24, &this->actor.world.pos) < 30.0f) {
@@ -4682,7 +4672,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..3cfc1fb54 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,
@@ -100,7 +112,7 @@ typedef enum {
#define ENHORSE_IS_4000_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_4000)
#define ENHORSE_IS_DONKEY_TYPE(thisx) ((thisx)->params & ENHORSE_PARAM_DONKEY)
-typedef enum {
+typedef enum EnHorseParam {
/* 0 */ ENHORSE_0,
/* 1 */ ENHORSE_1,
/* 2 */ ENHORSE_2,
@@ -121,7 +133,7 @@ typedef enum {
/* 17 */ ENHORSE_17,
/* 18 */ ENHORSE_18,
/* 19 */ ENHORSE_19,
- /* 20 */ ENHORSE_20,
+ /* 20 */ ENHORSE_20
} EnHorseParam;
/**
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..c7a2edaaa 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
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_game_check.h"
+#include "z64horse.h"
#include "objects/object_horse_game_check/object_horse_game_check.h"
#define FLAGS (ACTOR_FLAG_10)
@@ -59,7 +60,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 +117,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,21 +157,21 @@ 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;
}
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->nextEntrance = ENTRANCE(GORMAN_TRACK, 2);
play->transitionTrigger = TRANS_TRIGGER_START;
@@ -252,7 +253,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 +286,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 +319,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 +348,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_Game_Check/z_en_horse_game_check.h b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
index d43f1f90c..9033878a4 100644
--- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
+++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h
@@ -11,7 +11,7 @@ typedef s32 (*EnHorseGameCheckUnkFunc)(struct EnHorseGameCheck*, PlayState*);
#define ENHORSEGAMECHECK_GET_FF(thisx) ((thisx)->params & 0xFF)
#define ENHORSEGAMECHECK_GET_FF00(thisx) (((thisx)->params & 0xFF00) >> 8)
-enum {
+typedef enum {
/* 0 */ ENHORSEGAMECHECK_FF_0,
/* 1 */ ENHORSEGAMECHECK_FF_1,
/* 2 */ ENHORSEGAMECHECK_FF_2,
@@ -22,8 +22,8 @@ enum {
/* 7 */ ENHORSEGAMECHECK_FF_7,
/* 8 */ ENHORSEGAMECHECK_FF_8,
/* 9 */ ENHORSEGAMECHECK_FF_9,
- /* 10 */ ENHORSEGAMECHECK_FF_MAX,
-};
+ /* 10 */ ENHORSEGAMECHECK_FF_MAX
+} EnHorseGameCheckParam;
typedef struct EnHorseGameCheck {
/* 0x000 */ DynaPolyActor dyna;
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..0217e8fa8 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
@@ -5,6 +5,7 @@
*/
#include "z_en_horse_link_child.h"
+#include "z64horse.h"
#include "objects/object_horse_link_child/object_horse_link_child.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_2000000)
@@ -417,7 +418,7 @@ void func_808DF560(EnHorseLinkChild* this) {
this->unk_148 = 1;
}
- D_801BDAA4 = 0;
+ gHorsePlayedEponasSong = false;
Animation_Change(&this->skin.skelAnime, D_808DFEC0[this->unk_148], func_808DE728(this), 0.0f,
Animation_GetLastFrame(D_808DFEC0[this->unk_148]), ANIMMODE_ONCE, 0.0f);
}
@@ -425,8 +426,8 @@ void func_808DF560(EnHorseLinkChild* this) {
void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
s16 sp36;
- if (D_801BDAA4 != 0) {
- D_801BDAA4 = 0;
+ if (gHorsePlayedEponasSong) {
+ gHorsePlayedEponasSong = false;
Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_KID_HORSE_NEIGH);
func_808DF788(this);
return;
@@ -436,7 +437,7 @@ void func_808DF620(EnHorseLinkChild* this, PlayState* play) {
sp36 = Actor_WorldYawTowardActor(&this->actor, &GET_PLAYER(play)->actor) - this->actor.world.rot.y;
if ((Math_CosS(sp36) < 0.7071f) && (this->unk_148 == 2)) {
- func_800F415C(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &GET_PLAYER(play)->actor.world.pos, 0x12C);
}
if (SkelAnime_Update(&this->skin.skelAnime)) {
@@ -472,9 +473,9 @@ void func_808DF838(EnHorseLinkChild* this, PlayState* play) {
if ((this->unk_148 == 4) || (this->unk_148 == 3) || (this->unk_148 == 2)) {
if (this->unk_1E0 == 0) {
- func_800F415C(&this->actor, &player->actor.world.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &player->actor.world.pos, 0x12C);
} else {
- func_800F415C(&this->actor, &this->actor.home.pos, 0x12C);
+ Horse_RotateToPoint(&this->actor, &this->actor.home.pos, 0x12C);
}
}
@@ -593,7 +594,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..648a13d46 100644
--- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c
+++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c
@@ -99,9 +99,9 @@ void EnHs_Destroy(Actor* thisx, PlayState* play) {
void func_80952DFC(PlayState* play) {
if (INV_CONTENT(ITEM_MASK_BUNNY) == ITEM_MASK_BUNNY) {
- func_80151BB4(play, 0x2E);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD);
}
- func_80151BB4(play, 0x10);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GROG);
}
void EnHs_UpdateChickPos(Vec3f* dst, Vec3f src, f32 offset) {
@@ -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..abdf870b9 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c
@@ -25,7 +25,7 @@ static u8 D_80BF3260[] = {
/* 0x05 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_TOWN, 0x57 - 0x09),
/* 0x09 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 25, 15, 45, 0x51 - 0x0F),
/* 0x0F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 45, 15, 50, 0x4B - 0x15),
- /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_75_10, 0x1A - 0x19),
+ /* 0x15 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x1A - 0x19),
/* 0x19 */ SCHEDULE_CMD_RET_NONE(),
/* 0x1A */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 50, 16, 55, 0x45 - 0x20),
/* 0x20 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 55, 17, 15, 0x3F - 0x26),
@@ -42,7 +42,7 @@ static u8 D_80BF3260[] = {
/* 0x5B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 45, 15, 50, 0xAF - 0x61),
/* 0x61 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 50, 16, 10, 0xA9 - 0x67),
/* 0x67 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 10, 16, 30, 0xA3 - 0x6D),
- /* 0x6D */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_75_10, 0x8A - 0x71),
+ /* 0x6D */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_RECEIVED_ROOM_KEY, 0x8A - 0x71),
/* 0x71 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 30, 16, 50, 0x84 - 0x77),
/* 0x77 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 50, 16, 55, 0x7E - 0x7D),
/* 0x7D */ SCHEDULE_CMD_RET_NONE(),
@@ -372,7 +372,7 @@ s32 func_80BF17BC(EnIg* this, PlayState* play) {
case 1:
case 3:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_75_10) && (this->unk_3F6 == 3)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_ROOM_KEY) && (this->unk_3F6 == 3)) {
CutsceneManager_Stop(csId);
this->unk_3F6 = 5;
} else {
@@ -497,7 +497,7 @@ s32 func_80BF1B40(EnIg* this, PlayState* play) {
}
s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput, s32 arg3, s32 arg4) {
- u8 sp4F = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -509,7 +509,7 @@ s32 func_80BF1C44(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput, s
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((sp2C != NULL) && (sp2C->update != NULL)) {
@@ -541,7 +541,7 @@ s32 func_80BF1D78(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -553,10 +553,10 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
door = func_80BF1200(play, scheduleOutput->result);
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, 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;
@@ -587,7 +587,7 @@ s32 func_80BF1DF4(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
@@ -595,7 +595,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -635,7 +635,7 @@ s32 func_80BF1FA8(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = ENIG_GET_FF(&this->actor);
+ u8 pathIndex = ENIG_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -645,7 +645,7 @@ s32 func_80BF219C(EnIg* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80BF3318[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80BF3318[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BF3318[scheduleOutput->result]);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -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_Ig/z_en_ig.h b/src/overlays/actors/ovl_En_Ig/z_en_ig.h
index c3fd0c3fb..274338a11 100644
--- a/src/overlays/actors/ovl_En_Ig/z_en_ig.h
+++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.h
@@ -9,7 +9,7 @@ typedef void (*EnIgActionFunc)(struct EnIg*, PlayState*);
typedef s32 (*EnIgUnkFunc)(struct EnIg*, PlayState*);
typedef void (*EnIgUnkFunc2)(struct EnIg*, PlayState*);
-#define ENIG_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define ENIG_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
typedef struct EnIg {
/* 0x000 */ Actor actor;
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..a116c323a 100644
--- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c
+++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c
@@ -169,8 +169,7 @@ typedef enum {
/* 0x4 */ DMG_EFF_FIRE = 0x2,
/* 0x0 */ DMG_EFF_ICE,
/* 0x4 */ DMG_EFF_LIGHT_SPARKS,
- /* 0xF */ DMG_EFF_IMMUNE = 0xF,
-
+ /* 0xF */ DMG_EFF_IMMUNE = 0xF
} EnIkDmgEff;
static DamageTable sDamageTableArmor = {
@@ -488,7 +487,7 @@ void EnIk_VerticalAttack(EnIk* this, PlayState* play) {
if ((this->skelAnime.curFrame > 13.0f) && (this->skelAnime.curFrame < 23.0f)) {
this->colliderQuad.base.atFlags |= AT_ON;
if (this->drawArmorFlags) {
- this->actor.speed = sin_rad((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
+ this->actor.speed = Math_SinF((this->skelAnime.curFrame - 13.0f) * (M_PI / 20)) * 10.0f;
}
} else {
this->colliderQuad.base.atFlags &= ~AT_ON;
@@ -551,7 +550,7 @@ void EnIk_HorizontalDoubleAttack(EnIk* this, PlayState* play) {
} else {
phi_f2 = this->skelAnime.curFrame - 1.0f;
}
- this->actor.speed = sin_rad((M_PI / 8) * phi_f2) * 4.5f;
+ this->actor.speed = Math_SinF((M_PI / 8) * phi_f2) * 4.5f;
}
this->colliderQuad.base.atFlags |= AT_ON;
} else {
@@ -686,9 +685,9 @@ void EnIk_Die(EnIk* this, PlayState* play) {
if (this->timer != 0) {
this->timer--;
for (i = 6 - (this->timer >> 2); i >= 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.x;
- effectPos.z = randPlusMinusPoint5Scaled(80.0f) + this->actor.world.pos.z;
- effectPos.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ effectPos.x = Rand_CenteredFloat(80.0f) + this->actor.world.pos.x;
+ effectPos.z = Rand_CenteredFloat(80.0f) + this->actor.world.pos.z;
+ effectPos.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &effectPos, &sEffectVelAndAccel, &sEffectVelAndAccel, 100, 0, 2);
}
if (this->timer == 0) {
@@ -846,9 +845,9 @@ void EnIk_UpdateArmor(EnIk* this, PlayState* play) {
ikEffect->pos.y = this->actor.floorHeight;
for (i = 0; i < 4; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(20.0f) + ikEffect->pos.x;
+ effectPos.x = Rand_CenteredFloat(20.0f) + ikEffect->pos.x;
effectPos.y = Rand_ZeroFloat(20.0f) + ikEffect->pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(20.0f) + ikEffect->pos.z;
+ effectPos.z = Rand_CenteredFloat(20.0f) + ikEffect->pos.z;
func_800B3030(play, &effectPos, &gZeroVec3f, &gZeroVec3f, 40, 7, 2);
}
@@ -1033,6 +1032,7 @@ void EnIk_UpdateArmorDraw(EnIk* this, PlayState* play) {
sp54 = 0;
OPEN_DISPS(play->state.gfxCtx);
+
gfxOpa = POLY_OPA_DISP;
gfxXlu = POLY_XLU_DISP;
@@ -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..ca764b134 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -5,6 +5,7 @@
*/
#include "z_en_in.h"
+#include "z64horse.h"
#include "objects/object_in/object_in.h"
#include "overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.h"
@@ -150,7 +151,7 @@ s32 EnIn_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s16 frameCount;
s32 ret = false;
- if (animIndex >= 0 && animIndex < 18) {
+ if ((animIndex >= 0) && (animIndex < 18)) {
ret = true;
frameCount = sAnimationInfo[animIndex].frameCount;
if (frameCount < 0) {
@@ -224,7 +225,7 @@ s32 func_808F33B8(void) {
s32 ret = (((gSaveContext.save.day == 1) &&
((gSaveContext.save.time >= CLOCK_TIME(5, 30)) && (gSaveContext.save.time <= CLOCK_TIME(6, 0)))) ||
(gSaveContext.save.day >= 2)) &&
- !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01);
+ !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM);
return ret;
}
@@ -273,10 +274,10 @@ void EnIn_DoNothing(EnIn* this, PlayState* play) {
}
void func_808F3618(EnIn* this, PlayState* play) {
- if (ENIN_GET_PATH(&this->actor) != 0x3F) {
+ if (ENIN_GET_PATH_INDEX(&this->actor) != ENIN_PATH_INDEX_NONE) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_9);
}
- if (ENIN_GET_PATH(&this->actor) != 0x3F) {
+ if (ENIN_GET_PATH_INDEX(&this->actor) != ENIN_PATH_INDEX_NONE) {
this->actionFunc = func_808F3690;
} else {
this->actionFunc = EnIn_DoNothing;
@@ -328,7 +329,7 @@ void func_808F38F8(EnIn* this, PlayState* play) {
while (true) {
//! @bug: Infinite loop if there is only one ACTOR_EN_IN
this->unk4A4 = (EnIn*)SubS_FindActor(play, &this->unk4A4->actor, ACTORCAT_NPC, ACTOR_EN_IN);
- if (this->unk4A4 != NULL && this->unk4A4 != this) {
+ if ((this->unk4A4 != NULL) && (this->unk4A4 != this)) {
break;
}
this->unk4A4 = (EnIn*)this->unk4A4->actor.next;
@@ -336,7 +337,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 +353,38 @@ 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;
+
+ default:
+ 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;
+
+ default:
+ 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);
@@ -481,6 +490,7 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x345B;
}
break;
+
case 1:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_15_10)) {
textId = 0x3463;
@@ -488,11 +498,12 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x346B;
}
break;
+
case 3:
if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x3485;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x3484;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_56_04)) {
textId = 0x346D;
@@ -500,8 +511,10 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3482;
}
break;
+
case 4:
- if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA || gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x348A;
} else if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x348B;
@@ -511,6 +524,7 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3489;
}
break;
+
case 5:
if (func_808F33B8()) {
textId = 0x34B3;
@@ -520,17 +534,22 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
textId = 0x3493;
}
break;
+
case 7:
if (gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
textId = 0x34A8;
- } else if (gSaveContext.save.playerForm == PLAYER_FORM_ZORA ||
- gSaveContext.save.playerForm == PLAYER_FORM_GORON) {
+ } else if ((gSaveContext.save.playerForm == PLAYER_FORM_ZORA) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_GORON)) {
textId = 0x34A7;
} else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_16_04)) {
textId = 0x3495;
} else {
textId = 0x34A5;
}
+ break;
+
+ default:
+ break;
}
if (textId == 0) {
textId = 1;
@@ -539,12 +558,12 @@ u16 func_808F3DD4(PlayState* play, EnIn* this, u32 arg2) {
}
void func_808F4054(PlayState* play, EnIn* this, s32 arg2, u16 textId) {
- s32 unused;
+ s32 pad;
- if (textId == 0x34AE || textId == 0x34B0 || textId == 0x34B2) {
- unused = textId;
- func_80151BB4(play, 0x11);
+ if ((textId == 0x34AE) || (textId == 0x34B0) || (textId == 0x34B2)) {
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
}
+
switch (arg2) {
case 1:
case 5:
@@ -553,12 +572,15 @@ void func_808F4054(PlayState* play, EnIn* this, s32 arg2, u16 textId) {
func_808F35D8(this, play);
}
break;
+
case 2:
if (textId == 0x3473) {
func_808F35D8(this, play);
}
break;
+
case 0:
+ default:
break;
}
}
@@ -572,7 +594,7 @@ void func_808F4108(EnIn* this, PlayState* play, u16 textId) {
}
s32 func_808F4150(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx) {
- EnIn* this2 = this;
+ Actor* thisx = &this->actor;
if (msgCtx->choiceIndex == 0) {
func_8019F208();
@@ -583,22 +605,22 @@ s32 func_808F4150(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx)
} else if (this->unk4AC & 8) {
func_808F4108(this, play, 0x3475);
} else {
- Actor_ContinueText(play, &this->actor, 0x3475);
+ Actor_ContinueText(play, thisx, 0x3475);
}
} else {
play_sound(NA_SE_SY_ERROR);
- Actor_ContinueText(play, &this->actor, 0x3473);
+ Actor_ContinueText(play, thisx, 0x3473);
}
} else {
func_8019F230();
- Actor_ContinueText(play, &this->actor, 0x3472);
+ Actor_ContinueText(play, thisx, 0x3472);
}
return 0;
}
s32 func_808F4270(PlayState* play, EnIn* this, s32 arg2, MessageContext* msgCtx, s32 arg4) {
s32 pad;
- s32 fee = play->msgCtx.unk1206C != 0xFFFF ? play->msgCtx.unk1206C : 10;
+ s32 fee = (play->msgCtx.unk1206C != 0xFFFF) ? play->msgCtx.unk1206C : 10;
if (msgCtx->choiceIndex == 0) {
func_8019F208();
@@ -635,7 +657,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;
}
@@ -650,31 +672,38 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x34B0);
ret = false;
break;
+
case 0x34A9:
func_808F4108(this, play, 0x34AA);
SET_WEEKEVENTREG(WEEKEVENTREG_63_40);
ret = false;
break;
+
case 0x34AA:
func_808F4108(this, play, 0x34AB);
ret = false;
break;
+
case 0x34AB:
func_808F4108(this, play, 0x34AC);
ret = false;
break;
+
case 0x34AC:
func_808F4108(this, play, 0x34AD);
ret = false;
break;
+
case 0x34AD:
Actor_ContinueText(play, &this->actor, 0x34AE);
ret = false;
break;
+
case 0x34B1:
Actor_ContinueText(play, &this->actor, 0x34B2);
ret = false;
break;
+
default:
break;
}
@@ -687,48 +716,62 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x3459);
ret = false;
break;
+
case 0x3459:
Actor_ContinueText(play, &this->actor, 0x345A);
ret = false;
break;
+
case 0x345A:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x345B:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x345C:
Actor_ContinueText(play, &this->actor, 0x345D);
ret = false;
break;
+
case 0x345D:
Actor_ContinueText(play, &this->actor, 0x345E);
ret = false;
break;
+
case 0x345E:
Actor_ContinueText(play, &this->actor, 0x345F);
ret = false;
break;
+
case 0x345F:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3460:
Actor_ContinueText(play, &this->actor, 0x3461);
ret = false;
break;
+
case 0x3461:
Actor_ContinueText(play, &this->actor, 0x3462);
ret = false;
break;
+
case 0x3462:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 1:
switch (textId) {
case 0x3463:
@@ -736,14 +779,17 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
Actor_ContinueText(play, &this->actor, 0x3464);
ret = false;
break;
+
case 0x3464:
Actor_ContinueText(play, &this->actor, 0x3465);
ret = false;
break;
+
case 0x3465:
Actor_ContinueText(play, &this->actor, 0x3466);
ret = false;
break;
+
case 0x3466:
if (msgCtx->choiceIndex == 0) {
func_8019F208();
@@ -768,62 +814,74 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x3467:
case 0x3468:
case 0x3469:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x346B:
Actor_ContinueText(play, &this->actor, 0x346C);
ret = false;
break;
+
case 0x346C:
Actor_ContinueText(play, &this->actor, 0x3466);
ret = false;
break;
+
case 0x346A:
this->actionFunc = func_808F5A94;
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
}
break;
+
case 2:
switch (textId) {
case 0x346E:
func_808F4108(this, play, 0x346F);
ret = false;
break;
+
case 0x3470:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3483:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3471:
func_808F4150(play, this, arg2, msgCtx);
ret = false;
break;
+
case 0x3472:
func_808F43E0(this);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3473:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
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;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_57_01);
break;
+
case 0x3478:
if (msgCtx->choiceIndex == 0) {
func_808F4150(play, this, arg2, msgCtx);
@@ -835,13 +893,18 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x347B:
func_808F4108(this, play, 0x347C);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
+ default:
+ break;
}
break;
+
case 3:
switch (textId) {
case 0x346D:
@@ -850,36 +913,44 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x346F:
func_808F4108(this, play, 0x3470);
ret = false;
break;
+
case 0x3482:
func_808F4108(this, play, 0x3483);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3484:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3485:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3474:
func_808F4108(this, play, 0x3475);
ret = false;
break;
+
case 0x3476:
Actor_ContinueText(play, &this->actor, 0x3477);
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
ret = false;
break;
+
case 0x3477:
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
func_808F4108(this, play, 0x3478);
ret = false;
break;
+
case 0x347A:
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
@@ -903,42 +974,52 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x347F:
Actor_ContinueText(play, &this->actor, 0x3480);
ret = false;
break;
+
case 0x3480:
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3479:
func_808F43E0(this);
func_808F35D8(this, play);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x347C:
this->actionFunc = func_808F3D40;
Actor_OfferGetItem(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
func_808F35D8(this, play);
ret = true;
break;
+
case 0x3481:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x347D:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
- func_80151BB4(play, 0x2F);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 4:
switch (textId) {
case 0x3486:
@@ -946,56 +1027,71 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_16_01);
ret = false;
break;
+
case 0x3487:
Actor_ContinueText(play, &this->actor, 0x3488);
ret = false;
break;
+
case 0x3488:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3489:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348A:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348B:
Actor_ContinueText(play, &this->actor, 0x348C);
ret = false;
break;
+
case 0x348C:
Actor_ContinueText(play, &this->actor, 0x348D);
ret = false;
break;
+
case 0x348D:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 5:
switch (textId) {
case 0x3468:
case 0x3469:
case 0x3491:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x348E:
case 0x34B3:
Actor_ContinueText(play, &this->actor, 0x348F);
SET_WEEKEVENTREG(WEEKEVENTREG_16_02);
ret = false;
break;
+
case 0x3493:
Actor_ContinueText(play, &this->actor, 0x3494);
ret = false;
break;
+
case 0x348F:
case 0x3494:
Actor_ContinueText(play, &this->actor, 0x3490);
ret = false;
break;
+
case 0x3490:
if (msgCtx->choiceIndex == 0) {
func_8019F208();
@@ -1020,57 +1116,68 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x3492:
this->actionFunc = func_808F5A94;
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
}
break;
+
case 7:
switch (textId) {
case 0x34A8:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x34A7:
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3495:
func_808F4108(this, play, 0x3496);
SET_WEEKEVENTREG(WEEKEVENTREG_16_04);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3497:
func_808F4108(this, play, 0x3498);
ret = false;
break;
+
case 0x34A4:
this->actionFunc = func_808F5A34;
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x34A5:
func_808F4108(this, play, 0x34A6);
SET_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
case 0x3473:
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
break;
+
case 0x3474:
Actor_ContinueText(play, &this->actor, 0x3475);
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;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_57_01);
break;
+
case 0x349D:
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
@@ -1083,19 +1190,22 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x349F:
this->actionFunc = func_808F3D40;
Actor_OfferGetItem(&this->actor, play, GI_MASK_GARO, 500.0f, 100.0f);
func_808F35D8(this, play);
ret = true;
break;
+
case 0x34A0:
this->actionFunc = func_808F5A34;
- func_80151BB4(play, 0x11);
- func_80151BB4(play, 0x2F);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK);
func_808F43E0(this);
ret = true;
break;
+
case 0x34A1:
func_808F35D8(this, play);
if (Inventory_HasEmptyBottle()) {
@@ -1107,25 +1217,30 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x34A2:
Actor_ContinueText(play, &this->actor, 0x34A3);
ret = false;
break;
+
case 0x34A3:
func_808F43E0(this);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x3499:
Actor_ContinueText(play, &this->actor, 0x349A);
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_1);
EnIn_ChangeAnim(&this->unk4A4->skelAnime, ENIN_ANIM_7);
ret = false;
break;
+
case 0x349A:
Actor_ContinueText(play, &this->actor, 0x349B);
ret = false;
break;
+
case 0x349B:
if (msgCtx->choiceIndex == 0) {
func_808F4270(play, this, arg2, msgCtx, 1);
@@ -1136,42 +1251,57 @@ s32 func_808F4414(PlayState* play, EnIn* this, s32 arg2) {
ret = false;
}
break;
+
case 0x349C:
func_808F43E0(this);
func_808F35D8(this, play);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
+ default:
+ break;
}
break;
+
case 6:
switch (textId) {
case 0x3496:
func_808F4108(this, play, 0x3497);
ret = false;
break;
+
case 0x3498:
case 0x34A6:
Actor_ContinueText(play, &this->actor, 0x3471);
ret = false;
break;
+
case 0x3471:
func_808F4270(play, this, arg2, msgCtx, 0);
ret = false;
break;
+
case 0x3472:
func_808F43E0(this);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
- func_80151BB4(play, 0x11);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS);
ret = true;
break;
+
case 0x349E:
func_808F4108(this, play, 0x349F);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_56_08);
ret = false;
break;
+
+ default:
+ break;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1185,6 +1315,7 @@ s32 func_808F5674(PlayState* play, EnIn* this, s32 arg2) {
func_808F4054(play, this, arg2, this->actor.textId);
ret = true;
break;
+
case TEXT_STATE_CHOICE:
case TEXT_STATE_5:
if (Message_ShouldAdvance(play) && func_808F4414(play, this, arg2)) {
@@ -1192,6 +1323,9 @@ s32 func_808F5674(PlayState* play, EnIn* this, s32 arg2) {
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1286,7 +1420,7 @@ void func_808F5A34(EnIn* this, PlayState* play) {
}
void func_808F5A94(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if (gSaveContext.save.day == 3) {
func_808F5728(play, this, 7, &this->unk48C);
} else {
@@ -1302,7 +1436,7 @@ void func_808F5A94(EnIn* this, PlayState* play) {
}
void func_808F5B58(EnIn* this, PlayState* play) {
- if (func_800F41E4(play, &play->actorCtx)) {
+ if (Horse_IsActive(play, &play->actorCtx)) {
if ((Player_GetMask(play) == PLAYER_MASK_CIRCUS_LEADER && CHECK_WEEKEVENTREG(WEEKEVENTREG_63_40)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_56_08)) {
if (gSaveContext.save.day == 3) {
@@ -1322,7 +1456,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 +1468,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,11 +1500,11 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
this->unk48C = 0;
this->unk4AC = 0;
type = ENIN_GET_TYPE(thisx);
- this->unk4B0 = GET_WEEKEVENTREG_RACE_FLAGS;
- if (type == ENIN_HORSE_RIDER_BLUE_SHIRT || type == ENIN_BLUE_SHIRT) {
+ this->unk4B0 = GET_WEEKEVENTREG_HORSE_RACE_STATE;
+ if ((type == ENIN_HORSE_RIDER_BLUE_SHIRT) || (type == ENIN_BLUE_SHIRT)) {
this->unk4AC |= 8;
}
- if (type == ENIN_HORSE_RIDER_YELLOW_SHIRT || type == ENIN_HORSE_RIDER_BLUE_SHIRT) {
+ if ((type == ENIN_HORSE_RIDER_YELLOW_SHIRT) || (type == ENIN_HORSE_RIDER_BLUE_SHIRT)) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
this->unk488 = 1;
Animation_Change(&this->skelAnime, &object_in_Anim_016A60, 1.0f, 0.0f,
@@ -1384,24 +1518,24 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
Collider_SetJntSph(play, &this->colliderJntSph, &this->actor, &sJntSphInit, &this->colliderJntSphElement);
Actor_SetScale(&this->actor, 0.01f);
this->actor.gravity = -4.0f;
- this->path = SubS_GetPathByIndex(play, ENIN_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENIN_GET_PATH_INDEX(&this->actor), ENIN_PATH_INDEX_NONE);
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 ((type == ENIN_YELLOW_SHIRT) || (type == ENIN_BLUE_SHIRT)) {
+ 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;
func_808F35AC(this, play);
this->unk23C = 0;
- D_801BDAA0 = 0;
+ D_801BDAA0 = false;
- 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 +1544,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;
@@ -1419,7 +1553,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_0);
this->actionFunc = func_808F5A94;
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_KANBAN, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, this->actor.shape.rot.x,
this->actor.shape.rot.y, this->actor.shape.rot.z, 0xF);
@@ -1430,7 +1564,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
}
}
} else {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Kill(&this->actor);
} else {
EnIn_ChangeAnim(&this->skelAnime, ENIN_ANIM_7);
@@ -1477,15 +1611,15 @@ void func_808F6334(EnIn* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 talkState = Message_GetState(&play->msgCtx);
- this->unk4C4 += this->unk4C0 != 0.0f ? 40.0f : -40.0f;
+ this->unk4C4 += (this->unk4C0 != 0.0f) ? 40.0f : -40.0f;
this->unk4C4 = CLAMP(this->unk4C4, 0.0f, 80.0f);
Matrix_Translate(this->unk4C4, 0.0f, 0.0f, MTXMODE_APPLY);
if ((&this->actor == player->talkActor) &&
- !((play->msgCtx.currentTextId >= 0xFF) && (play->msgCtx.currentTextId <= 0x200)) &&
- (talkState == TEXT_STATE_3) && (this->prevTalkState == TEXT_STATE_3)) {
+ ((play->msgCtx.currentTextId < 0xFF) || (play->msgCtx.currentTextId > 0x200)) && (talkState == TEXT_STATE_3) &&
+ (this->prevTalkState == TEXT_STATE_3)) {
if (!(play->state.frames & 1)) {
- this->unk4C0 = this->unk4C0 != 0.0f ? 0.0f : 1.0f;
+ this->unk4C0 = (this->unk4C0 != 0.0f) ? 0.0f : 1.0f;
}
} else {
this->unk4C0 = 0.0f;
@@ -1519,16 +1653,17 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
object_in_DL_013440,
};
- if (this->unk23C != 0 && limbIndex != 16) {
+ if ((this->unk23C != 0) && (limbIndex != 16)) {
if (sp50[limbIndex] != NULL) {
*dList = sp50[limbIndex];
}
}
- if (this->unk4AC & 4 && limbIndex == 16) {
+ if ((this->unk4AC & 4) && (limbIndex == 16)) {
*dList = object_in_DL_01C528;
}
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 16) {
TexturePtr sp38[] = { object_in_Tex_0035E0, object_in_Tex_004820, object_in_Tex_004C20, object_in_Tex_0043E0 };
@@ -1537,6 +1672,7 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
} else {
AnimatedMat_DrawStep(play, Lib_SegmentedToVirtual(object_in_Matanimheader_001C30), this->unk4AC & 8 ? 1 : 0);
}
+
CLOSE_DISPS(play->state.gfxCtx);
if (limbIndex == 16) {
@@ -1550,7 +1686,7 @@ s32 EnIn_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
Matrix_RotateYS(this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateXS(this->torsoRot.x, MTXMODE_APPLY);
}
- if (limbIndex == 9 || limbIndex == 10 || limbIndex == 13) {
+ if ((limbIndex == 9) || (limbIndex == 10) || (limbIndex == 13)) {
rot->y += (s16)(Math_SinS(this->unk376[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->unk39E[limbIndex]) * 200.0f);
}
@@ -1592,21 +1728,25 @@ void EnIn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
if (this->unk23C == 0) {
if (!(this->unk4AC & 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 12) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007A70);
}
if (limbIndex == 15) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
}
if (this->unk4AC & 0x20) {
OPEN_DISPS(play->state.gfxCtx);
+
if (limbIndex == 12) {
gSPDisplayList(POLY_OPA_DISP++, object_in_DL_007C48);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1615,9 +1755,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_In/z_en_in.h b/src/overlays/actors/ovl_En_In/z_en_in.h
index dd32ac9c6..6f4dd5d95 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.h
+++ b/src/overlays/actors/ovl_En_In/z_en_in.h
@@ -33,11 +33,13 @@ typedef enum {
/* 14 */ ENIN_ANIM_14,
/* 15 */ ENIN_ANIM_15,
/* 16 */ ENIN_ANIM_16,
- /* 17 */ ENIN_ANIM_17,
+ /* 17 */ ENIN_ANIM_17
} EnInAnimation;
#define ENIN_GET_TYPE(thisx) ((thisx)->params & 0x1FF)
-#define ENIN_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+#define ENIN_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9) // Only used with ENIN_UNK_TYPE
+
+#define ENIN_PATH_INDEX_NONE 0x3F
typedef struct EnIn {
/* 0x000 */ Actor actor;
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..da813182e 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);
}
@@ -685,7 +685,7 @@ void func_8095F180(EnIshi* this) {
}
void func_8095F194(EnIshi* this, PlayState* play) {
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
Actor_Kill(&this->actor);
} else if (CutsceneManager_GetCurrentCsId() != this->actor.csId) {
Actor_Kill(&this->actor);
@@ -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_Jg/z_en_jg.c b/src/overlays/actors/ovl_En_Jg/z_en_jg.c
index 451b9e553..449acf212 100644
--- a/src/overlays/actors/ovl_En_Jg/z_en_jg.c
+++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.c
@@ -54,14 +54,14 @@ typedef enum {
/* 16 */ EN_JG_ANIM_DEPRESSED,
/* 17 */ EN_JG_ANIM_CUTSCENE_IDLE,
/* 18 */ EN_JG_ANIM_CRADLE,
- /* 19 */ EN_JG_ANIM_MAX,
+ /* 19 */ EN_JG_ANIM_MAX
} EnJgAnimation;
typedef enum {
- /* 0x0 */ EN_JG_ACTION_FIRST_THAW,
- /* 0x1 */ EN_JG_ACTION_SPAWNING,
- /* 0x2 */ EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW,
- /* 0x3 */ EN_JG_ACTION_LULLABY_INTRO_CS,
+ /* 0 */ EN_JG_ACTION_FIRST_THAW,
+ /* 1 */ EN_JG_ACTION_SPAWNING,
+ /* 2 */ EN_JG_ACTION_FROZEN_OR_NON_FIRST_THAW,
+ /* 3 */ EN_JG_ACTION_LULLABY_INTRO_CS
} EnJgAction;
ActorInit En_Jg_InitVars = {
@@ -242,7 +242,7 @@ s32 EnJg_ReachedPoint(EnJg* this, Path* path, s32 pointIndex) {
diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
@@ -957,7 +957,7 @@ void EnJg_Init(Actor* thisx, PlayState* play) {
this->actionFunc = EnJg_LullabyIntroCutsceneAction;
} else {
// This is the elder that appears in Mountain Village or the Path to Goron Village in winter.
- this->path = SubS_GetPathByIndex(play, EN_JG_GET_PATH(thisx), 0x3F);
+ this->path = SubS_GetPathByIndex(play, EN_JG_GET_PATH_INDEX(thisx), EN_JG_PATH_INDEX_NONE);
this->animIndex = EN_JG_ANIM_SURPRISE_START;
this->action = EN_JG_ACTION_SPAWNING;
this->freezeTimer = 1000;
diff --git a/src/overlays/actors/ovl_En_Jg/z_en_jg.h b/src/overlays/actors/ovl_En_Jg/z_en_jg.h
index ad8eee0a8..b63f34dce 100644
--- a/src/overlays/actors/ovl_En_Jg/z_en_jg.h
+++ b/src/overlays/actors/ovl_En_Jg/z_en_jg.h
@@ -5,7 +5,9 @@
#include "objects/object_jg/object_jg.h"
#define EN_JG_IS_IN_GORON_SHRINE(thisx) ((thisx)->params & 0x1)
-#define EN_JG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define EN_JG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+
+#define EN_JG_PATH_INDEX_NONE 0x3F
struct EnJg;
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..b023bf688 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
@@ -119,7 +119,7 @@ void func_80C13A2C(EnJgameTsn* this, PlayState* play) {
this->unk_1D8[i].points = Lib_SegmentedToVirtual(path->points);
this->unk_1D8[i].count = path->count;
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
if (path == NULL) {
Actor_Kill(&this->actor);
}
@@ -128,7 +128,7 @@ void func_80C13A2C(EnJgameTsn* this, PlayState* play) {
this->unk_1F8.points = Lib_SegmentedToVirtual(path->points);
this->unk_1F8.count = path->count;
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
if (path == NULL) {
Actor_Kill(&this->actor);
}
@@ -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..350f4ae82 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.c
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.c
@@ -194,7 +194,7 @@ s32 func_80968B8C(EnJs* this, PlayState* play) {
f32 sp18 = 0.0f;
Vec3s* points;
- if (pathIndex != 0x3F) {
+ if (pathIndex != ENJS_PATH_INDEX_NONE) {
this->path = &play->setupPathList[pathIndex];
if (this->path != NULL) {
path = this->path;
@@ -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_Js/z_en_js.h b/src/overlays/actors/ovl_En_Js/z_en_js.h
index c4dd3e3a2..f673a97d6 100644
--- a/src/overlays/actors/ovl_En_Js/z_en_js.h
+++ b/src/overlays/actors/ovl_En_Js/z_en_js.h
@@ -8,6 +8,8 @@
#define ENJS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
#define ENJS_GET_EXIT_INDEX(thisx) (((thisx)->params & 0x3F0) >> 4)
+#define ENJS_PATH_INDEX_NONE 0x3F
+
struct EnJs;
typedef void (*EnJsActionFunc)(struct EnJs*, PlayState*);
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..d572c1331 100644
--- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
+++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c
@@ -321,15 +321,15 @@ s32 func_80B85858(EnKaizoku* this, PlayState* play) {
for (itemAction = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].first; itemAction != NULL;
itemAction = itemAction->next) {
- //! FAKE:
- if (1) {}
- if (((itemAction->id == ACTOR_ARMS_HOOK) || (itemAction->id == ACTOR_EN_ARROW)) && (player->unk_D57)) {
- if (((itemAction->id != ACTOR_ARMS_HOOK) || (this->action != KAIZOKU_ACTION_13)) &&
- (this->action != KAIZOKU_ACTION_6)) {
- func_80B87C7C(this);
- }
- break;
+ if (((itemAction->id != ACTOR_ARMS_HOOK) && (itemAction->id != ACTOR_EN_ARROW)) || (player->unk_D57 == 0)) {
+ continue;
}
+
+ if (((itemAction->id != ACTOR_ARMS_HOOK) || (this->action != KAIZOKU_ACTION_13)) &&
+ (this->action != KAIZOKU_ACTION_6)) {
+ func_80B87C7C(this);
+ }
+ break;
}
if (prevAction != this->action) {
@@ -423,8 +423,8 @@ s32 func_80B85A00(EnKaizoku* this, PlayState* play, s16 arg2) {
func_80B87900(this);
} else {
sp2A = player->actor.shape.rot.y - this->picto.actor.shape.rot.y;
- if (this->picto.actor.xzDistToPlayer <= 65.0f && !Actor_OtherIsTargeted(play, &this->picto.actor) &&
- ABS_ALT(sp2A) < 0x5000) {
+ if ((this->picto.actor.xzDistToPlayer <= 65.0f) && !Actor_OtherIsTargeted(play, &this->picto.actor) &&
+ (ABS_ALT(sp2A) < 0x5000)) {
if (this->action != KAIZOKU_ACTION_9) {
func_80B87F70(this);
return 1;
@@ -508,7 +508,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
this->unk_598 = 0;
Audio_SetMainBgmVolume(0, 0xA);
this->unk_59C++;
-
+ // fallthrough
case 1:
player->actor.shape.rot.y = player->actor.world.rot.y =
Math_Vec3f_Yaw(&player->actor.world.pos, &this->picto.actor.world.pos);
@@ -611,7 +611,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
func_800B7298(play, &this->picto.actor, 6);
CutsceneManager_Stop(this->csId);
this->unk_59C = 0;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags &= ~ACTOR_FLAG_100000;
this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
this->picto.actor.flags |= ACTOR_FLAG_1;
@@ -657,7 +657,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
Math_Vec3f_Copy(&this->subCamAt, &this->unk_5D4);
}
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
Play_SetCameraAtEyeUp(play, this->subCamId, &this->subCamAt, &this->subCamEye, &this->subCamUp);
@@ -665,7 +665,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) {
}
void func_80B86804(EnKaizoku* this, PlayState* play) {
- if (this->subCamId == 0) {
+ if (this->subCamId == SUB_CAM_ID_DONE) {
if (!CutsceneManager_IsNext(this->csId)) {
CutsceneManager_Queue(this->csId);
return;
@@ -725,7 +725,7 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
Message_CloseTextbox(play);
func_800B7298(play, &this->picto.actor, 6);
CutsceneManager_Stop(this->csId);
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
play->nextEntrance = play->setupExitList[this->exitIndex];
gSaveContext.nextCutsceneIndex = 0;
Scene_SetExitFade(play);
@@ -733,11 +733,13 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) {
this->unk_59C++;
this->action = KAIZOKU_ACTION_16;
}
+ break;
+ default:
break;
}
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
@@ -861,7 +863,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
play->envCtx.screenFillColor[3] = 0;
play->envCtx.fillScreen = false;
this->unk_59C = 0;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
func_800B7298(play, &this->picto.actor, 6);
CutsceneManager_Stop(this->csId);
if (this->switchFlag >= 0) {
@@ -871,6 +873,9 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Math_ApproachF(&this->subCamEye.x, this->unk_5C8.x, 0.5f, this->unk_5E0);
Math_ApproachF(&this->subCamEye.y, this->unk_5C8.y, 0.5f, this->unk_5E0);
@@ -880,7 +885,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) {
Math_ApproachF(&this->subCamAt.z, this->unk_5D4.z, 0.5f, this->unk_5E0);
Math_ApproachF(&this->unk_5E0, 10.0f, 0.5f, 100.0f);
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.z = 0.0f;
this->subCamUp.y = 1.0f;
@@ -902,7 +907,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)) {
@@ -989,7 +995,8 @@ void func_80B8760C(EnKaizoku* this, PlayState* play) {
this->skelAnime.playSpeed = 1.0f;
temp_ft0 = this->skelAnime.curFrame - this->skelAnime.playSpeed;
temp_ft1 = this->skelAnime.curFrame + this->skelAnime.playSpeed;
- if (this->skelAnime.curFrame != 0.0f && ((temp_ft0 < 0 && temp_ft1 > 0) || (temp_ft0 < 5 && temp_ft1 >= 6))) {
+ if ((this->skelAnime.curFrame != 0.0f) &&
+ (((temp_ft0 < 0) && (temp_ft1 > 0)) || ((temp_ft0 < 5) && (temp_ft1 >= 6)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
@@ -1006,12 +1013,10 @@ void func_80B8760C(EnKaizoku* this, PlayState* play) {
func_80B87E28(this);
}
}
+ } else if (this->picto.actor.speed >= 0.0f) {
+ this->picto.actor.shape.rot.y += 0x4000;
} else {
- if (this->picto.actor.speed >= 0.0f) {
- this->picto.actor.shape.rot.y += 0x4000;
- } else {
- this->picto.actor.shape.rot.y -= 0x4000;
- }
+ this->picto.actor.shape.rot.y -= 0x4000;
}
}
@@ -1041,8 +1046,8 @@ void func_80B8798C(EnKaizoku* this, PlayState* play) {
if (this->lookTimer == 0) {
this->unk_2D8 = 0;
temp_v0 = this->picto.actor.yawTowardsPlayer - this->picto.actor.shape.rot.y;
- if (ABS_ALT(temp_v0) <= 0x4000 && this->picto.actor.xzDistToPlayer < 40.0f &&
- fabsf(this->picto.actor.playerHeightRel) < 50.0f) {
+ if ((ABS_ALT(temp_v0) <= 0x4000) && (this->picto.actor.xzDistToPlayer < 40.0f) &&
+ (fabsf(this->picto.actor.playerHeightRel) < 50.0f)) {
if (func_800BE184(play, &this->picto.actor, 100.0f, 10000, 0x4000, this->picto.actor.shape.rot.y)) {
if (player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_START) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
@@ -1067,7 +1072,7 @@ void func_80B8798C(EnKaizoku* this, PlayState* play) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
func_80B88CD8(this);
}
- } else if (this->unk_2B2 == 0 &&
+ } else if ((this->unk_2B2 == 0) &&
func_800BE184(play, &this->picto.actor, 100.0f, 10000, 0x4000, this->picto.actor.shape.rot.y)) {
if (player->meleeWeaponAnimation == PLAYER_MWA_JUMPSLASH_START) {
this->bodyCollider.base.acFlags &= ~AC_HARD;
@@ -1285,7 +1290,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);
@@ -1312,7 +1318,7 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
}
if (!func_80B85A00(this, play, false)) {
- if (this->picto.actor.xzDistToPlayer < 210.0f && this->picto.actor.xzDistToPlayer > 150.0f &&
+ if ((this->picto.actor.xzDistToPlayer < 210.0f) && (this->picto.actor.xzDistToPlayer > 150.0f) &&
Actor_IsFacingPlayer(&this->picto.actor, 0x1388)) {
if (Actor_IsTargeted(play, &this->picto.actor)) {
if (Rand_ZeroOne() > 0.5f) {
@@ -1330,7 +1336,7 @@ void func_80B88378(EnKaizoku* this, PlayState* play) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_BREATH);
}
- if ((this->skelAnime.curFrame != 0.0f) && ((sp30 < 0 && sp2C > 0) || (sp30 < 4 && sp2C >= 5))) {
+ if ((this->skelAnime.curFrame != 0.0f) && (((sp30 < 0) && (sp2C > 0)) || ((sp30 < 4) && (sp2C >= 5)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
@@ -1412,7 +1418,7 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
}
this->unk_2D8 = 0;
- if (this->frameCount <= curFrame && this->unk_2D0 < 2) {
+ if ((this->frameCount <= curFrame) && (this->unk_2D0 < 2)) {
if (!Actor_IsFacingPlayer(&this->picto.actor, 0x1554)) {
func_80B872A4(this);
this->unk_2B2 = Rand_ZeroOne() * 5.0f + 5.0f;
@@ -1455,7 +1461,7 @@ void func_80B88964(EnKaizoku* this, PlayState* play) {
void func_80B88CD8(EnKaizoku* this) {
EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_3);
- this->picto.actor.speed = randPlusMinusPoint5Scaled(12.0f);
+ this->picto.actor.speed = Rand_CenteredFloat(12.0f);
this->skelAnime.playSpeed = 1.0f;
this->picto.actor.world.rot.y = this->picto.actor.shape.rot.y;
this->unk_2B2 = Rand_ZeroOne() * 30.0f + 30.0f;
@@ -1529,7 +1535,7 @@ void func_80B88D6C(EnKaizoku* this, PlayState* play) {
temp_ft4 = this->skelAnime.curFrame - this->skelAnime.playSpeed;
temp_ft5 = this->skelAnime.curFrame + this->skelAnime.playSpeed;
if (this->skelAnime.curFrame != 0.0f) {
- if (((temp_ft4 < 0 && temp_ft5 > 0) || (temp_ft4 < 5 && temp_ft5 > 5))) {
+ if ((((temp_ft4 < 0) && (temp_ft5 > 0)) || ((temp_ft4 < 5) && (temp_ft5 > 5)))) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EN_GERUDOFT_WALK);
}
}
@@ -1582,7 +1588,7 @@ void func_80B891B8(EnKaizoku* this) {
// EnKaizoku_Stunned
void func_80B89280(EnKaizoku* this, PlayState* play) {
if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) {
- if (this->unk_2B8 != 0 && this->unk_2B8 < 60) {
+ if ((this->unk_2B8 != 0) && (this->unk_2B8 < 60)) {
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX;
}
}
@@ -1602,8 +1608,8 @@ void func_80B89280(EnKaizoku* this, PlayState* play) {
this->unk_2D8 = 0;
func_80B85A00(this, play, true);
- if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX ||
- this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX) {
+ if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) ||
+ (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) {
Actor_SpawnIceEffects(play, &this->picto.actor, this->bodyPartsPos, ARRAY_COUNT(this->bodyPartsPos), 2,
0.7f, 0.4f);
this->unk_2B8 = 0;
@@ -1653,7 +1659,7 @@ void func_80B894C0(EnKaizoku* this, PlayState* play) {
}
}
- if (this->picto.actor.xzDistToPlayer <= 65.0f && ((play->gameplayFrames % 8) != 0)) {
+ if ((this->picto.actor.xzDistToPlayer <= 65.0f) && ((play->gameplayFrames % 8) != 0)) {
this->swordCollider.info.elemType = ELEMTYPE_UNK2;
func_80B87F70(this);
} else {
@@ -1715,7 +1721,7 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
if (curFrame >= 25.0f) {
player = GET_PLAYER(play);
- if (this->subCamId == 0) {
+ if (this->subCamId == SUB_CAM_ID_DONE) {
if (!CutsceneManager_IsNext(this->csId)) {
CutsceneManager_Queue(this->csId);
return;
@@ -1741,7 +1747,7 @@ void func_80B8971C(EnKaizoku* this, PlayState* play) {
player->actor.shape.rot.y = player->actor.world.rot.y =
Math_Vec3f_Yaw(&player->actor.world.pos, &this->picto.actor.world.pos);
- if (this->subCamId != 0) {
+ if (this->subCamId != SUB_CAM_ID_DONE) {
this->subCamUp.x = 0.0f;
this->subCamUp.y = 1.0f;
this->subCamUp.z = 0.0f;
@@ -1773,7 +1779,7 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
if (!(this->swordCollider.base.atFlags & AT_BOUNCED) && (this->swordCollider.base.atFlags & AT_HIT)) {
if ((gSaveContext.save.saveInfo.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
this->unk_2D0 = 2;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags |= ACTOR_FLAG_100000;
if (!CutsceneManager_IsNext(this->csId)) {
@@ -1791,7 +1797,7 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
if ((gSaveContext.save.saveInfo.playerData.health <= 0x10) && (this->action != KAIZOKU_ACTION_16)) {
Health_ChangeBy(play, 0x10);
this->unk_2D0 = 2;
- this->subCamId = 0;
+ this->subCamId = SUB_CAM_ID_DONE;
this->picto.actor.flags |= ACTOR_FLAG_100000;
if (!CutsceneManager_IsNext(this->csId)) {
@@ -1831,7 +1837,7 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
this->unk_2B8 = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_MEDIUM;
}
- /* fallthrough */
+ // fallthrough
case KAIZOKU_DMGEFF_1:
if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) &&
(this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) ||
@@ -1906,6 +1912,9 @@ void func_80B89A08(EnKaizoku* this, PlayState* play) {
sp64 = 1;
}
break;
+
+ default:
+ break;
}
if (sp64) {
@@ -1938,8 +1947,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;
@@ -2102,11 +2111,11 @@ void EnKaizoku_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVec3f(&sFootOffset, &this->rightFootPos);
}
- if (limbIndex == KAIZOKU_LIMB_02 || limbIndex == KAIZOKU_LIMB_06 || limbIndex == KAIZOKU_LIMB_07 ||
- limbIndex == KAIZOKU_LIMB_08 || limbIndex == KAIZOKU_LIMB_0A || limbIndex == KAIZOKU_LIMB_0C ||
- limbIndex == KAIZOKU_LIMB_0D || limbIndex == KAIZOKU_LIMB_0F || limbIndex == KAIZOKU_LIMB_11 ||
- limbIndex == KAIZOKU_LIMB_12 || limbIndex == KAIZOKU_LIMB_L_FOOT || limbIndex == KAIZOKU_LIMB_14 ||
- limbIndex == KAIZOKU_LIMB_15 || limbIndex == KAIZOKU_LIMB_R_FOOT || limbIndex == KAIZOKU_LIMB_17) {
+ if ((limbIndex == KAIZOKU_LIMB_02) || (limbIndex == KAIZOKU_LIMB_06) || (limbIndex == KAIZOKU_LIMB_07) ||
+ (limbIndex == KAIZOKU_LIMB_08) || (limbIndex == KAIZOKU_LIMB_0A) || (limbIndex == KAIZOKU_LIMB_0C) ||
+ (limbIndex == KAIZOKU_LIMB_0D) || (limbIndex == KAIZOKU_LIMB_0F) || (limbIndex == KAIZOKU_LIMB_11) ||
+ (limbIndex == KAIZOKU_LIMB_12) || (limbIndex == KAIZOKU_LIMB_L_FOOT) || (limbIndex == KAIZOKU_LIMB_14) ||
+ (limbIndex == KAIZOKU_LIMB_15) || (limbIndex == KAIZOKU_LIMB_R_FOOT) || (limbIndex == KAIZOKU_LIMB_17)) {
Matrix_MultZero(&this->bodyPartsPos[this->bodyPartsPosIndex]);
this->bodyPartsPosIndex++;
@@ -2132,8 +2141,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..fc8d3d201 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -113,15 +113,15 @@ Vec3f D_80972030 = { -3.0f, 50.0f, 90.0f };
Vec3f D_8097203C = { 10.0f, -15.0f, 2.0f };
typedef enum {
- /* 0x0 */ ENKAKASI_ANIM_ARMS_CROSSED_ROCKING, // arms crossed and rocking back and forth
- /* 0x1 */ ENKAKASI_ANIM_SIDEWAYS_SHAKING,
- /* 0x2 */ ENKAKASI_ANIM_HOPPING_REGULAR, // bounce bounce bounce (repeat)
- /* 0x3 */ ENKAKASI_ANIM_SPIN_REACH_OFFER, // spin and then reaching toward player
- /* 0x4 */ ENKAKASI_ANIM_TWIRL, // slower cinimatic twirl
- /* 0x5 */ ENKAKASI_ANIM_ARMS_CROSSED_STILL, // arms crossed but still, also some noise sfx
- /* 0x6 */ ENKAKASI_ANIM_WAVE, // "wave" short sideways shake, stops early, partial? unused?
- /* 0x7 */ ENKAKASI_ANIM_SLOWROLL, // partial bounch, ends looking left, OFFER anim takes over
- /* 0x8 */ ENKAKASI_ANIM_IDLE, // slow stretching wiggle, ends in regular position
+ /* 0 */ ENKAKASI_ANIM_ARMS_CROSSED_ROCKING, // arms crossed and rocking back and forth
+ /* 1 */ ENKAKASI_ANIM_SIDEWAYS_SHAKING,
+ /* 2 */ ENKAKASI_ANIM_HOPPING_REGULAR, // bounce bounce bounce (repeat)
+ /* 3 */ ENKAKASI_ANIM_SPIN_REACH_OFFER, // spin and then reaching toward player
+ /* 4 */ ENKAKASI_ANIM_TWIRL, // slower cinimatic twirl
+ /* 5 */ ENKAKASI_ANIM_ARMS_CROSSED_STILL, // arms crossed but still, also some noise sfx
+ /* 6 */ ENKAKASI_ANIM_WAVE, // "wave" short sideways shake, stops early, partial? unused?
+ /* 7 */ ENKAKASI_ANIM_SLOWROLL, // partial bounch, ends looking left, OFFER anim takes over
+ /* 8 */ ENKAKASI_ANIM_IDLE // slow stretching wiggle, ends in regular position
} EnKakasiAnimation;
static AnimationHeader* sAnimations[] = {
@@ -157,7 +157,7 @@ void EnKakasi_Init(Actor* thisx, PlayState* play) {
this->unkHeight = (this->picto.actor.world.rot.z * 20.0f) + 60.0f;
this->picto.actor.world.rot.z = 0;
this->picto.actor.targetMode = 0;
- if (this->picto.actor.world.rot.x > 0 && this->picto.actor.world.rot.x < 8) {
+ if ((this->picto.actor.world.rot.x > 0) && (this->picto.actor.world.rot.x < 8)) {
this->picto.actor.targetMode = KAKASI_GET_TARGETMODE(thisx);
}
this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y;
@@ -208,12 +208,12 @@ s32 EnKakasi_ValidatePictograph(PlayState* play, Actor* thisx) {
}
void EnKakasi_CheckAnimationSfx(EnKakasi* this) {
- if (this->animIndex == ENKAKASI_ANIM_SIDEWAYS_SHAKING || this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_STILL) {
+ if ((this->animIndex == ENKAKASI_ANIM_SIDEWAYS_SHAKING) || (this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_STILL)) {
if (Animation_OnFrame(&this->skelanime, 1.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
}
}
- if (this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR || this->animIndex == ENKAKASI_ANIM_SLOWROLL) {
+ if ((this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR) || (this->animIndex == ENKAKASI_ANIM_SLOWROLL)) {
if (Animation_OnFrame(&this->skelanime, 4.0f) || Animation_OnFrame(&this->skelanime, 8.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_SWING);
}
@@ -225,7 +225,7 @@ void EnKakasi_CheckAnimationSfx(EnKakasi* this) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASHI_ROLL);
}
}
- if (this->animIndex == ENKAKASI_ANIM_SPIN_REACH_OFFER || this->animIndex == ENKAKASI_ANIM_TWIRL) {
+ if ((this->animIndex == ENKAKASI_ANIM_SPIN_REACH_OFFER) || (this->animIndex == ENKAKASI_ANIM_TWIRL)) {
if (Animation_OnFrame(&this->skelanime, 1.0f)) {
Actor_PlaySfx(&this->picto.actor, NA_SE_EV_KAKASH_LONGI_ROLL);
}
@@ -274,12 +274,12 @@ void func_8096FAAC(EnKakasi* this, PlayState* play) {
* goes off every frame of song teach, but... doing what?
*/
void func_8096FBB8(EnKakasi* this, PlayState* play) {
- if (play->msgCtx.unk12048 == 0 || play->msgCtx.unk12048 == 1 || play->msgCtx.unk12048 == 2 ||
- play->msgCtx.unk12048 == 3 || play->msgCtx.unk12048 == 4) {
+ if ((play->msgCtx.unk12048 == 0) || (play->msgCtx.unk12048 == 1) || (play->msgCtx.unk12048 == 2) ||
+ (play->msgCtx.unk12048 == 3) || (play->msgCtx.unk12048 == 4)) {
// why not 0 < x < 4? fewer branches
this->unk190++;
}
- if (this->unk190 != 0 && this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
+ if ((this->unk190 != 0) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
if (this->unk190 > 8) {
@@ -299,8 +299,8 @@ void EnKakasi_InitTimeSkipDialogue(EnKakasi* this) {
void EnKakasi_TimeSkipDialogue(EnKakasi* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (gSaveContext.respawnFlag != -4 && gSaveContext.respawnFlag != -8) {
- if (gSaveContext.save.time != CLOCK_TIME(6, 0) && gSaveContext.save.time != CLOCK_TIME(18, 0) &&
+ if ((gSaveContext.respawnFlag != -4) && (gSaveContext.respawnFlag != -8)) {
+ if ((gSaveContext.save.time != CLOCK_TIME(6, 0)) && (gSaveContext.save.time != CLOCK_TIME(18, 0)) &&
!CHECK_EVENTINF(EVENTINF_17)) {
if (this->picto.actor.textId == 0) {
@@ -348,8 +348,8 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
}
if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
Actor_GetScreenPos(play, &this->picto.actor, &x, &y);
- if (this->picto.actor.projectedPos.z > -20.0f && x > 0 && x < SCREEN_WIDTH && y > 0 && y < SCREEN_HEIGHT &&
- this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
+ if ((this->picto.actor.projectedPos.z > -20.0f) && (x > 0) && (x < SCREEN_WIDTH) && (y > 0) &&
+ (y < SCREEN_HEIGHT) && (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING)) {
// faster shaking
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
this->skelanime.playSpeed = 2.0f;
@@ -359,7 +359,7 @@ void EnKakasi_IdleStanding(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
this->skelanime.playSpeed = 2.0f;
}
- } else if (saveContextDay == 3 && gSaveContext.save.isNight) {
+ } else if ((saveContextDay == 3) && gSaveContext.save.isNight) {
this->skelanime.playSpeed = 1.0f;
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
EnKakasi_ChangeAnim(this, 1);
@@ -391,16 +391,16 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Math_SmoothStepToS(&this->picto.actor.shape.rot.y, this->picto.actor.yawTowardsPlayer, 5, 2000, 0);
// if first dialogue
- if (this->picto.actor.textId != 0x1644 && this->animeFrameCount <= currentAnimeFrame &&
- this->animIndex == ENKAKASI_ANIM_SLOWROLL) {
+ if ((this->picto.actor.textId != 0x1644) && (this->animeFrameCount <= currentAnimeFrame) &&
+ (this->animIndex == ENKAKASI_ANIM_SLOWROLL)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
this->unkCounter1A4 = 0;
}
// if dialogue: oh sorry come back again
- if (this->picto.actor.textId == 0x1651 || this->picto.actor.textId == 0x1659) {
- if (this->animeFrameCount <= currentAnimeFrame && this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER) {
+ if ((this->picto.actor.textId == 0x1651) || (this->picto.actor.textId == 0x1659)) {
+ if ((this->animeFrameCount <= currentAnimeFrame) && (this->animIndex != ENKAKASI_ANIM_SPIN_REACH_OFFER)) {
if (++this->unkCounter1A4 >= 2) {
this->unkCounter1A4 = 0;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
@@ -408,7 +408,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
}
}
- if (this->unkState1A8 == 2 && this->unkState196 == 2) {
+ if ((this->unkState1A8 == 2) && (this->unkState196 == 2)) {
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_73);
this->unkState1A8 = 0;
}
@@ -417,7 +417,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Message_CloseTextbox(play);
if (this->talkState == TEXT_STATE_5) {
// bad song input
- if (this->unkState196 == 2 && this->picto.actor.textId == 0x1647) {
+ if ((this->unkState196 == 2) && (this->picto.actor.textId == 0x1647)) {
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_END);
}
@@ -429,7 +429,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
- if (saveContextDay2 == 3 && gSaveContext.save.isNight) {
+ if ((saveContextDay2 == 3) && gSaveContext.save.isNight) {
// text: dangerous outside
this->picto.actor.textId = 0x164F;
} else if (gSaveContext.save.isNight) {
@@ -443,8 +443,8 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
Message_ContinueTextbox(play, this->picto.actor.textId);
return;
- } else if (this->picto.actor.textId == 0x165D || this->picto.actor.textId == 0x165F ||
- this->picto.actor.textId == 0x1660 || this->picto.actor.textId == 0x1652) {
+ } else if ((this->picto.actor.textId == 0x165D) || (this->picto.actor.textId == 0x165F) ||
+ (this->picto.actor.textId == 0x1660) || (this->picto.actor.textId == 0x1652)) {
func_800B7298(play, &this->picto.actor, PLAYER_CSMODE_4);
if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
@@ -462,7 +462,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
}
return;
- } else if (this->picto.actor.textId == 0x1645 || this->picto.actor.textId == 0x164E) {
+ } else if ((this->picto.actor.textId == 0x1645) || (this->picto.actor.textId == 0x164E)) {
this->picto.actor.textId = 0x1650; // "Shall we dance? No Yes"
if (this->animIndex != ENKAKASI_ANIM_SIDEWAYS_SHAKING) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
@@ -517,7 +517,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) {
this->picto.actor.textId = 0x1658;
} else if (this->picto.actor.textId == 0x165C) {
this->picto.actor.textId = 0x165E;
- } else if (saveContextDay == 3 && gSaveContext.save.isNight) {
+ } else if ((saveContextDay == 3) && gSaveContext.save.isNight) {
this->picto.actor.textId = 0x164F;
} else {
this->picto.actor.textId = 0x1652;
@@ -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);
@@ -642,11 +642,12 @@ void EnKakasi_TeachingSong(EnKakasi* this, PlayState* play) {
void EnKakasi_PostSongLearnTwirl(EnKakasi* this, PlayState* play) {
f32 animeFrame = this->skelanime.curFrame;
- if (this->postTeachTimer == 0 && this->animIndex != ENKAKASI_ANIM_TWIRL) {
+ if ((this->postTeachTimer == 0) && (this->animIndex != ENKAKASI_ANIM_TWIRL)) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_TWIRL);
this->skelanime.playSpeed = 2.0f;
}
- if (this->postTeachTimer == 0 && this->animIndex == ENKAKASI_ANIM_TWIRL && this->animeFrameCount <= animeFrame) {
+ if ((this->postTeachTimer == 0) && (this->animIndex == ENKAKASI_ANIM_TWIRL) &&
+ (this->animeFrameCount <= animeFrame)) {
EnKakasi_SetupPostSongLearnDialogue(this, play);
}
}
@@ -682,16 +683,16 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
this->unk190 = 1;
}
- if (this->picto.actor.textId == 0x1648 && this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR &&
- this->animeFrameCount <= tempAnimFrame) {
+ if ((this->picto.actor.textId == 0x1648) && (this->animIndex == ENKAKASI_ANIM_HOPPING_REGULAR) &&
+ (this->animeFrameCount <= tempAnimFrame)) {
this->unkCounter1A4++;
if (this->unkCounter1A4 >= 2) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING);
}
}
- if (this->picto.actor.textId == 0x164B && this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_ROCKING &&
- this->animeFrameCount <= tempAnimFrame) {
+ if ((this->picto.actor.textId == 0x164B) && (this->animIndex == ENKAKASI_ANIM_ARMS_CROSSED_ROCKING) &&
+ (this->animeFrameCount <= tempAnimFrame)) {
this->unkCounter1A4++;
if (this->unkCounter1A4 >= 2) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SPIN_REACH_OFFER);
@@ -722,7 +723,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;
@@ -762,7 +763,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) {
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_TWIRL);
} else {
- if (this->picto.actor.textId == 0x164C || this->picto.actor.textId == 0x1661) {
+ if ((this->picto.actor.textId == 0x164C) || (this->picto.actor.textId == 0x1661)) {
EnKakasi_SetupDigAway(this);
return;
}
@@ -797,7 +798,7 @@ void EnKakasi_DancingRemark(EnKakasi* this, PlayState* play) {
} else {
CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor);
this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId);
- if (currentDay == 3 && gSaveContext.save.isNight) {
+ if ((currentDay == 3) && gSaveContext.save.isNight) {
EnKakasi_SetupDigAway(this);
} else {
Audio_PlaySubBgm(NA_BGM_SARIAS_SONG);
@@ -831,17 +832,16 @@ 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;
this->subCamAtNext.y = D_80971EEC[this->unk190].y + this->unk22C.y;
this->subCamAtNext.z = D_80971EEC[this->unk190].z + this->unk22C.z;
- if (this->unk190 != 6 && this->unk190 != 7) {
+ if ((this->unk190 != 6) && (this->unk190 != 7)) {
Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext);
Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext);
}
- if (this->unk190 >= 7 && this->unk190 != 0xE) {
+ if ((this->unk190 >= 7) && (this->unk190 != 0xE)) {
this->picto.actor.shape.rot.y += 0x800;
}
@@ -853,57 +853,64 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
// twirling
this->unk204 = 0x28;
this->unk190++;
- return;
+ break;
+
case 1:
// end of twirl, start shaking back and forth
- if (this->unk204 == 0 && this->animeFrameCount <= currentFrame) {
+ if ((this->unk204 == 0) && (this->animeFrameCount <= currentFrame)) {
this->unk204 = 0x14;
this->unk190++;
EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_SIDEWAYS_SHAKING);
}
- return;
+ break;
+
case 2:
// camera view on the left
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 3:
// camera view on the right
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 4:
// camera view close up front
if (this->unk204 == 0) {
this->unk204 = 0x14;
this->unk190++;
}
- return;
+ break;
+
case 5:
// camera view zoomed out front
if (this->unk204 == 0) {
this->unk204 = 0xF;
this->unk190++;
}
- return;
+ break;
+
case 6:
// zoom in and sweep down in from case 5
if (this->unk204 == 0) {
this->unk204 = 0xF;
this->unk190++;
}
- return;
+ break;
+
case 7:
// zoom in close from case 6
if (this->unk204 == 0) {
this->unk204 = 0xA;
this->unk190++;
}
- return;
+ break;
case 8:
case 9:
@@ -921,7 +928,8 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->unk204 = 0x14;
}
}
- return;
+ break;
+
case 14:
// goes off once for some camera changes,
// otherwise it's the end when camera is back to normal and Player is confused
@@ -933,10 +941,7 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
PLAYER_PARAMS(0xFF, PLAYER_INITMODE_B), &player->unk_3C0, player->unk_3CC);
func_80169EFC(&play->state);
- //! FAKE
- if (1) {}
-
- if (gSaveContext.save.time > CLOCK_TIME(18, 0) || gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(18, 0)) || (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
gSaveContext.save.time = CLOCK_TIME(6, 0);
gSaveContext.respawnFlag = -4;
SET_EVENTINF(EVENTINF_27);
@@ -948,6 +953,10 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) {
this->unk190 = 0;
this->actionFunc = EnKakasi_DoNothing;
}
+ break;
+
+ default:
+ break;
}
}
@@ -978,7 +987,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;
@@ -997,11 +1006,11 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) {
if ((play->gameplayFrames % 4) == 0) {
Math_Vec3f_Copy(&tempWorldPos, &this->picto.actor.world.pos);
tempWorldPos.y = this->picto.actor.floorHeight;
- tempWorldPos.x += randPlusMinusPoint5Scaled(2.0f);
- tempWorldPos.z += randPlusMinusPoint5Scaled(2.0f);
+ tempWorldPos.x += Rand_CenteredFloat(2.0f);
+ tempWorldPos.z += Rand_CenteredFloat(2.0f);
if (play->sceneId == SCENE_8ITEMSHOP) {
- EffectSsGSplash_Spawn(play, &tempWorldPos, 0, 0, 0, randPlusMinusPoint5Scaled(100.0f) + 200.0f);
+ EffectSsGSplash_Spawn(play, &tempWorldPos, 0, 0, 0, Rand_CenteredFloat(100.0f) + 200.0f);
SoundSource_PlaySfxAtFixedWorldPos(play, &tempWorldPos, 0x32, NA_SE_EV_BOMB_DROP_WATER);
} else {
@@ -1031,8 +1040,8 @@ void EnKakasi_SetupIdleUnderground(EnKakasi* this) {
}
void EnKakasi_IdleUnderground(EnKakasi* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && this->picto.actor.xzDistToPlayer < this->songSummonDist &&
- (BREG(1) != 0 || play->msgCtx.ocarinaMode == 0xD)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_79_08) && (this->picto.actor.xzDistToPlayer < this->songSummonDist) &&
+ ((BREG(1) != 0) || (play->msgCtx.ocarinaMode == 0xD))) {
this->picto.actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON;
play->msgCtx.ocarinaMode = 4;
this->actionFunc = EnKakasi_SetupRiseOutOfGround;
@@ -1119,10 +1128,10 @@ void EnKakasi_Update(Actor* thisx, PlayState* play) {
DECR(this->unk204);
if (this->unkState196 != 5) {
- if (this->unk1BC.x != 0.0f || this->unk1BC.z != 0.0f) {
+ 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 +1162,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..820dd1f4e 100644
--- a/src/overlays/actors/ovl_En_Kame/z_en_kame.c
+++ b/src/overlays/actors/ovl_En_Kame/z_en_kame.c
@@ -606,9 +606,9 @@ void func_80AD8388(EnKame* this, PlayState* play) {
this->actor.scale.y = this->actor.scale.x;
this->actor.scale.z = this->actor.scale.x;
}
- sp34.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
+ sp34.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y + 15.0f;
- sp34.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z;
+ sp34.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z;
func_800B3030(play, &sp34, &gZeroVec3f, &gZeroVec3f, 100, 0, 2);
}
}
@@ -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..ff7e4bb08 100644
--- a/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
+++ b/src/overlays/actors/ovl_En_Kanban/z_en_kanban.c
@@ -135,8 +135,8 @@ void func_80954960(EnKanban* this) {
ny = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.y);
nz = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.z);
- this->floorRot.x = -func_80086B30(-nz * ny, 1.0f);
- this->floorRot.z = func_80086B30(-nx * ny, 1.0f);
+ this->floorRot.x = -Math_FAtan2F(-nz * ny, 1.0f);
+ this->floorRot.z = Math_FAtan2F(-nx * ny, 1.0f);
}
}
@@ -198,20 +198,16 @@ void func_80954BE8(EnKanban* this, PlayState* play) {
}
}
-#ifdef NON_MATCHING
-// Lots of branch likely stuff
void EnKanban_Update(Actor* thisx, PlayState* play) {
- // PlayState* play = play2;
u8 bounced = false;
- s32 pad;
EnKanban* this = THIS;
+ s32 pad;
+ FloorType floorType;
+ f32 phi_f0;
Player* player = GET_PLAYER(play);
Vec3f offset;
EnKanban* piece;
EnKanban* signpost;
- FloorType floorType;
- f32 phi_f0;
- s32 pad2;
this->frameCount++;
@@ -354,7 +350,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
piece->actionState = ENKANBAN_AIR;
piece->actor.gravity = -1.0f;
piece->actor.world.rot.y =
- BINANG_ROT180((s32)randPlusMinusPoint5Scaled(0x4000) + this->actor.yawTowardsPlayer);
+ BINANG_ROT180((s32)Rand_CenteredFloat(0x4000) + this->actor.yawTowardsPlayer);
if ((hitItem->toucher.dmgFlags & 0x10) || (hitItem->toucher.dmgFlags & 8) ||
(hitItem->toucher.dmgFlags & 0x80000000)) {
@@ -373,7 +369,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
piece->bounceZ = Rand_ZeroFloat(7.0f) + 3.0f;
}
- piece->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ piece->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
piece->direction = 1;
@@ -423,8 +419,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
f32 tempY;
f32 tempZ;
f32 tempWaterDepth;
+ s32 pad2;
u16 bgCheckFlags;
- u8 onGround;
if (this->unk_198 != 0) {
this->actor.velocity.y = -2.0f;
@@ -452,103 +448,103 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.bgCheckFlags = bgCheckFlags;
this->actor.depthInWater = tempWaterDepth;
- if (1) {}
+ if (1) {
+ u8 onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
- onGround = (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND);
-
- if (this->spinXFlag != 0) {
- this->spinRot.x += this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x <= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- } else {
- this->spinRot.x -= this->spinVel.x;
- this->spinVel.x -= 0x800;
- if ((this->spinRot.x >= 0) && onGround) {
- this->spinRot.x = 0;
- this->spinVel.x = 0;
- }
- }
-
- if (this->spinVel.x < -0xC00) {
- this->spinVel.x = -0xC00;
- }
-
- if (this->spinZFlag != 0) {
- this->spinRot.z += this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z <= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- } else {
- this->spinRot.z -= this->spinVel.z;
- this->spinVel.z -= 0x800;
- if ((this->spinRot.z >= 0) && onGround) {
- this->spinRot.z = 0;
- this->spinVel.z = 0;
- }
- }
-
- if (this->spinVel.z < -0xC00) {
- this->spinVel.z = -0xC00;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
- Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
- }
- this->actor.speed *= -0.5f;
- }
-
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
- this->actionState = ENKANBAN_WATER;
- Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
- this->bounceX = this->bounceZ = 0;
- this->actor.world.pos.y += this->actor.depthInWater;
- EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
- EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
- this->actor.velocity.y = 0.0f;
- this->actor.gravity = 0.0f;
- break;
- }
-
- if (onGround) {
- floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
-
- if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
- this->unk_197 = 1;
- } else if (floorType == FLOOR_TYPE_5) {
- this->unk_197 = -1;
- }
-
- if (this->bounceCount <= 0) {
- this->bounceCount++;
- if (this->unk_197 != 0) {
- this->actor.velocity.y = 0.0f;
- } else {
- this->actor.velocity.y *= -0.3f;
- this->actor.world.rot.y += (s16)randPlusMinusPoint5Scaled(0x4000);
+ if (this->spinXFlag != 0) {
+ this->spinRot.x += this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x <= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
}
- bounced = true;
} else {
- this->actor.velocity.y = 0.0f;
+ this->spinRot.x -= this->spinVel.x;
+ this->spinVel.x -= 0x800;
+ if ((this->spinRot.x >= 0) && onGround) {
+ this->spinRot.x = 0;
+ this->spinVel.x = 0;
+ }
}
- if (this->unk_197 != 0) {
- if (this->unk_197 > 0) {
- this->actor.speed = 0.0f;
- } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
- this->airTimer = 10;
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
- this->actionState = ENKANBAN_GROUND;
- this->actor.speed = 0.0f;
- goto nextCase;
+ if (this->spinVel.x < -0xC00) {
+ this->spinVel.x = -0xC00;
+ }
+
+ if (this->spinZFlag != 0) {
+ this->spinRot.z += this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z <= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ } else {
+ this->spinRot.z -= this->spinVel.z;
+ this->spinVel.z -= 0x800;
+ if ((this->spinRot.z >= 0) && onGround) {
+ this->spinRot.z = 0;
+ this->spinVel.z = 0;
+ }
+ }
+
+ if (this->spinVel.z < -0xC00) {
+ this->spinVel.z = -0xC00;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ Actor_PlaySfx(&this->actor, NA_SE_EV_WOODPLATE_BOUND);
+ }
+ this->actor.speed *= -0.5f;
+ }
+
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ this->actionState = ENKANBAN_WATER;
+ Actor_PlaySfx(&this->actor, NA_SE_EV_BOMB_DROP_WATER);
+ this->bounceX = this->bounceZ = 0;
+ this->actor.world.pos.y += this->actor.depthInWater;
+ EffectSsGSplash_Spawn(play, &this->actor.world.pos, NULL, NULL, 0, (this->partCount * 20) + 300);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 150, 650, 0);
+ EffectSsGRipple_Spawn(play, &this->actor.world.pos, 300, 800, 5);
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ break;
+ }
+
+ if (onGround) {
+ floorType = SurfaceType_GetFloorType(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId);
+
+ if ((floorType == FLOOR_TYPE_15) || (floorType == FLOOR_TYPE_14)) {
+ this->unk_197 = 1;
+ } else if (floorType == FLOOR_TYPE_5) {
+ this->unk_197 = -1;
+ }
+
+ if (this->bounceCount <= 0) {
+ this->bounceCount++;
+ if (this->unk_197 != 0) {
+ this->actor.velocity.y = 0.0f;
} else {
- Vec3f spC8;
+ this->actor.velocity.y *= -0.3f;
+ this->actor.world.rot.y += (s16)(s32)Rand_CenteredFloat(0x4000);
+ }
+ bounced = true;
+ } else {
+ this->actor.velocity.y = 0.0f;
+ }
+
+ if (this->unk_197 != 0) {
+ Vec3f spC8;
+
+ if (this->unk_197 > 0) {
+ this->actor.speed = 0.0f;
+ } else if ((this->floorRot.x > 0.1f) || (this->floorRot.z > 0.1f)) {
+ this->airTimer = 10;
+ if (this->actor.bgCheckFlags & BGCHECKFLAG_WALL) {
+ this->actionState = ENKANBAN_GROUND;
+ this->actor.speed = 0.0f;
+ goto nextCase;
+ }
Matrix_RotateXFNew(this->floorRot.x);
Matrix_RotateZF(this->floorRot.z, MTXMODE_APPLY);
@@ -558,67 +554,67 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.world.rot.y = Math_Atan2S(spC8.x, spC8.z);
this->unk_198 = 1;
this->actor.speed = sqrtf(SQXZ(this->actor.velocity));
+ } else {
+ this->unk_198 = 0;
+ Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
}
} else {
- this->unk_198 = 0;
- Math_ApproachZeroF(&this->actor.speed, 1, 0.1f);
+ this->actor.speed *= 0.7f;
}
+
+ if (this->spinRot.x == 0) {
+ if (this->bounceX != 0) {
+ bounced = true;
+ if (this->unk_197 != 0) {
+ this->spinRot.x = 0;
+ this->bounceX = 0;
+ } else {
+ this->spinVel.x = this->bounceX << 9;
+ if (this->bounceX != 0) {
+ this->bounceX -= 5;
+ if (this->bounceX <= 0) {
+ this->bounceX = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinXFlag = 1;
+ } else {
+ this->spinXFlag = 0;
+ }
+ }
+ }
+ }
+
+ if (this->spinRot.z == 0) {
+ if (this->bounceZ != 0) {
+ bounced = 1;
+ if (this->unk_197 != 0) {
+ this->spinRot.z = 0;
+ this->bounceZ = 0;
+ } else {
+ this->spinVel.z = this->bounceZ << 9;
+ if (this->bounceZ != 0) {
+ this->bounceZ -= 5;
+ if (this->bounceZ <= 0) {
+ this->bounceZ = 0;
+ }
+ }
+
+ if (Rand_ZeroOne() < 0.5f) {
+ this->spinZFlag = 1;
+ } else {
+ this->spinZFlag = 0;
+ }
+ }
+ }
+ }
+
+ Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
} else {
- this->actor.speed *= 0.7f;
+ this->actor.shape.rot.y += this->spinVel.y;
+ this->actor.shape.rot.x += this->direction * 0x7D0;
}
-
- if (this->spinRot.x == 0) {
- if (this->bounceX != 0) {
- bounced = true;
- if (this->unk_197 != 0) {
- this->spinRot.x = 0;
- this->bounceX = 0;
- } else {
- this->spinVel.x = this->bounceX << 9;
- if (this->bounceX != 0) {
- this->bounceX -= 5;
- if (this->bounceX <= 0) {
- this->bounceX = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinXFlag = 1;
- } else {
- this->spinXFlag = 0;
- }
- }
- }
- }
-
- if (this->spinRot.z == 0) {
- if (this->bounceZ != 0) {
- bounced = 1;
- if (this->unk_197 != 0) {
- this->spinRot.z = 0;
- this->bounceZ = 0;
- } else {
- this->spinVel.z = this->bounceZ << 9;
- if (this->bounceZ != 0) {
- this->bounceZ -= 5;
- if (this->bounceZ <= 0) {
- this->bounceZ = 0;
- }
- }
-
- if (Rand_ZeroOne() < 0.5f) {
- this->spinZFlag = 1;
- } else {
- this->spinZFlag = 0;
- }
- }
- }
- }
-
- Math_ApproachS(&this->actor.shape.rot.x, this->direction << 0xE, 1, 0x2000);
- } else {
- this->actor.shape.rot.y += this->spinVel.y;
- this->actor.shape.rot.x += this->direction * 0x7D0;
}
if (bounced) {
@@ -630,15 +626,16 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
if (bounced && (this->unk_197 >= 0)) {
+ static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
+ static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
s16 dustCount;
s16 j;
Vec3f velocity = { 0.0f, 0.0f, 0.0f };
- static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
- static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
Vec3f accel;
Vec3f pos;
Color_RGBA8 primColor;
Color_RGBA8 envColor;
+ s32 pad3;
if (this->unk_197 != 0) {
primColor = D_8095754C;
@@ -656,8 +653,8 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
dustCount = this->partCount * 0.5f;
for (j = 0; j < dustCount + 3; j++) {
- pos.x = randPlusMinusPoint5Scaled((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.x;
- pos.z = randPlusMinusPoint5Scaled((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.x;
+ pos.z = Rand_CenteredFloat((this->partCount * 0.5f) + 20.0f) + this->actor.world.pos.z;
func_800B0F18(play, &pos, &velocity, &accel, &primColor, &envColor, 100, 5,
Rand_ZeroFloat(5.0f) + 14.0f);
}
@@ -667,10 +664,10 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actionState = ENKANBAN_GROUND;
}
}
-
+ nextCase:
+ // fallthrough
case ENKANBAN_GROUND:
case ENKANBAN_WATER:
- nextCase:
signpost = (EnKanban*)this->actor.parent;
if (signpost->partFlags == 0xFFFF) {
@@ -753,7 +750,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actionState = ENKANBAN_AIR;
this->actor.gravity = -1.0f;
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x10000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x10000);
if (this->partCount >= 4) {
this->bounceX = Rand_ZeroFloat(10.0f) + 6.0f;
this->bounceZ = Rand_ZeroFloat(10.0f) + 6.0f;
@@ -766,7 +763,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.speed = Rand_ZeroFloat(1.5f);
}
- this->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ this->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
this->direction = 1;
@@ -811,7 +808,7 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
this->actor.speed = 4.0f + bombStrength;
}
- this->spinVel.y = randPlusMinusPoint5Scaled(0x1800);
+ this->spinVel.y = Rand_CenteredFloat(0x1800);
if (Rand_ZeroOne() < 0.5f) {
this->direction = 1;
@@ -839,6 +836,9 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
}
break;
+
+ default:
+ break;
}
break;
@@ -883,14 +883,11 @@ void EnKanban_Update(Actor* thisx, PlayState* play) {
}
break;
}
+
+ default:
+ break;
}
}
-#else
-static Vec3f D_8095753C = { 0.0f, 0.0f, 0.0f };
-static Color_RGBA8 D_80957548 = { 185, 140, 70, 255 };
-static Color_RGBA8 D_8095754C = { 255, 255, 255, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Kanban/EnKanban_Update.s")
-#endif
static Gfx* sDisplayLists[] = {
object_kanban_DL_000CB0, object_kanban_DL_000DB8, object_kanban_DL_000E78, object_kanban_DL_000F38,
@@ -923,8 +920,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..34b3d6405 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.c
@@ -93,11 +93,11 @@ static ColliderCylinderInit sAttackCylinderInit = {
static CollisionCheckInfoInit sColChkInfoInit = { 1, 15, 80, MASS_HEAVY };
typedef enum {
- /* 0x0 */ KAREBABA_DMGEFF_NONE,
- /* 0x2 */ KAREBABA_DMGEFF_FIRE = 2,
- /* 0x3 */ KAREBABA_DMGEFF_ICE,
- /* 0x4 */ KAREBABA_DMGEFF_LIGHT,
- /* 0x5 */ KAREBABA_DMGEFF_ELECTRIC,
+ /* 0 */ KAREBABA_DMGEFF_NONE,
+ /* 2 */ KAREBABA_DMGEFF_FIRE = 2,
+ /* 3 */ KAREBABA_DMGEFF_ICE,
+ /* 4 */ KAREBABA_DMGEFF_LIGHT,
+ /* 5 */ KAREBABA_DMGEFF_ELECTRIC
} DekuBabaDamageEffect;
static DamageTable sDamageTable = {
@@ -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_Karebaba/z_en_karebaba.h b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
index aa05aec0a..045bef42a 100644
--- a/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
+++ b/src/overlays/actors/ovl_En_Karebaba/z_en_karebaba.h
@@ -11,7 +11,7 @@ typedef void (*EnKarebabaActionFunc)(struct EnKarebaba*, PlayState*);
typedef enum {
/* 0 */ ENKAREBABA_0, // Unused, always shrinks and drops a Deku Nut
/* 1 */ ENKAREBABA_1, // Drops sticks (Only type OoT has)
- /* 2 */ KAREBABA_MINI,
+ /* 2 */ KAREBABA_MINI
} KarebabaType;
typedef struct EnKarebaba {
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..fbb8346e5 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
@@ -159,7 +159,7 @@ void func_80B2654C(EnKendoJs* this, PlayState* play) {
s32 phi_v0;
s32 sp30;
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (CURRENT_DAY != 0) {
sp30 = CURRENT_DAY - 1;
} else {
@@ -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..e80807b08 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
@@ -72,7 +72,7 @@ void EnKgy_Init(Actor* thisx, PlayState* play) {
this->actionFunc = func_80B419B0;
this->actor.textId = 0xC4E;
this->unk_29C |= 1;
- this->unk_2EA = 3;
+ this->getItemId = GI_RUPEE_10;
} else {
EnKgy_ChangeAnim(this, 4, ANIMMODE_LOOP, 0);
this->actionFunc = func_80B42714;
@@ -420,12 +420,12 @@ void func_80B4163C(EnKgy* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->unk_2D2 == 6) {
- if (this->unk_2EA > 0) {
+ if (this->getItemId > GI_NONE) {
EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, 0.0f);
- this->unk_2EA--;
+ this->getItemId--;
} else {
EnKgy_ChangeAnim(this, 9, ANIMMODE_ONCE, -5.0f);
- this->unk_2EA = (s32)Rand_ZeroFloat(3.0f) + 2;
+ this->getItemId = (s32)Rand_ZeroFloat(GI_RUPEE_PURPLE - GI_RUPEE_BLUE) + GI_RUPEE_BLUE;
}
} else {
EnKgy_ChangeAnim(this, 6, ANIMMODE_ONCE, -5.0f);
@@ -598,7 +598,7 @@ void func_80B41D64(EnKgy* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_10000;
func_800B8500(&this->actor, play, 1000.0f, 1000.0f, PLAYER_IA_MINUS1);
} else {
- Actor_OfferGetItem(&this->actor, play, this->unk_2EA, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 2000.0f, 1000.0f);
}
func_80B40EE8(this, play);
}
@@ -790,16 +790,16 @@ void func_80B41E18(EnKgy* this, PlayState* play) {
case 0xC50:
if (func_80B40D8C(play)) {
- this->unk_2EA = 57;
+ this->getItemId = GI_SWORD_GILDED;
this->actor.textId = 0xC53;
} else {
- this->unk_2EA = 56;
+ this->getItemId = GI_SWORD_RAZOR;
this->actor.textId = 0xC51;
}
Message_CloseTextbox(play);
this->actionFunc = func_80B41D64;
func_80B413C8(this);
- Actor_OfferGetItem(&this->actor, play, this->unk_2EA, 2000.0f, 1000.0f);
+ Actor_OfferGetItem(&this->actor, play, this->getItemId, 2000.0f, 1000.0f);
break;
case 0xC51:
@@ -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_Kgy/z_en_kgy.h b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
index 8207678fd..94f2aabd5 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.h
@@ -31,7 +31,7 @@ typedef struct EnKgy {
/* 0x2E4 */ s16 unk_2E4;
/* 0x2E6 */ s16 unk_2E6;
/* 0x2E8 */ s16 unk_2E8;
- /* 0x2EA */ s16 unk_2EA;
+ /* 0x2EA */ s16 getItemId;
/* 0x2EC */ LightInfo lightInfo;
/* 0x2FC */ LightNode* lightNode;
/* 0x300 */ s16 unk_300;
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..16ce97153 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -245,14 +245,14 @@ void EnKusa_DropCollectible(EnKusa* this, PlayState* play) {
s32 collectableParams;
if ((KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_GRASS) || (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_BUSH)) {
- if (!KUSA_GET_PARAMS_0C(&this->actor)) {
+ if (!KUSA_GET_PARAM_0C(&this->actor)) {
Item_DropCollectibleRandom(play, NULL, &this->actor.world.pos,
KUSA_GET_RAND_COLLECTIBLE_ID(&this->actor) * 0x10);
}
} else if (KUSA_GET_TYPE(&this->actor) == ENKUSA_TYPE_REGROWING_GRASS) {
Item_DropCollectible(play, &this->actor.world.pos, 3);
} else {
- collectible = func_800A8150(KUSA_GET_PARAMS_3F(&this->actor));
+ collectible = func_800A8150(KUSA_GET_PARAM_3F(&this->actor));
if (collectible >= 0) {
collectableParams = KUSA_GET_COLLECTIBLE_ID(&this->actor);
Item_DropCollectible(play, &this->actor.world.pos, (collectableParams << 8) | collectible);
@@ -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_Kusa/z_en_kusa.h b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
index 56f55af3e..b231f3e0e 100644
--- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
+++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h
@@ -28,8 +28,8 @@ typedef struct EnKusa {
#define KUSA_GET_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0x7F)
#define KUSA_GET_RAND_COLLECTIBLE_ID(thisx) (((thisx)->params >> 8) & 0xF)
#define KUSA_SHOULD_SPAWN_BUGS(thisx) (((thisx)->params >> 0x4) & 1)
-#define KUSA_GET_PARAMS_0C(thisx) (((thisx)->params >> 0xC) & 0x1)
-#define KUSA_GET_PARAMS_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
+#define KUSA_GET_PARAM_0C(thisx) (((thisx)->params >> 0xC) & 0x1)
+#define KUSA_GET_PARAM_3F(thisx) (((thisx)->params >> 0x2) & 0x3F)
#define KUSA_GET_TYPE(thisx)((thisx)->params & 0x3)
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..cfc3efdc0 100644
--- a/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
+++ b/src/overlays/actors/ovl_En_Kusa2/z_en_kusa2.c
@@ -4,7 +4,6 @@
* Description: Keaton grass
*/
-#include "prevent_bss_reordering.h"
#include "z_en_kusa2.h"
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -961,14 +960,14 @@ void func_80A5D7A4(EnKusa2* this) {
}
void func_80A5D7C4(EnKusa2* this, PlayState* play) {
- EnKusa2* this2 = this;
+ Actor* thisx = &this->actor;
s16 sp2A;
if (Actor_HasParent(&this->actor, play)) {
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.shape.shadowAlpha = 60;
- this->actor.room = -1;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ thisx->shape.shadowAlpha = 60;
+ thisx->room = -1;
func_80A5BD94(this);
func_80A5D964(this);
return;
@@ -976,23 +975,23 @@ void func_80A5D7C4(EnKusa2* this, PlayState* play) {
if (!func_80A5BFD8(this, play)) {
if ((this->unk_1C0 != NULL) && (this->unk_1C0->unk_1BE != 0)) {
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- if (this2->unk_1C0 != NULL) {
- sp2A = Actor_WorldYawTowardActor(&this->unk_1C0->actor, &this->actor);
- this->actor.home.rot.y = Rand_S16Offset(-1500, 3000) + sp2A;
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ if (this->unk_1C0 != NULL) {
+ sp2A = Actor_WorldYawTowardActor(&this->unk_1C0->actor, thisx);
+ thisx->home.rot.y = Rand_S16Offset(-1500, 3000) + sp2A;
}
this->unk_1C8 = Rand_S16Offset(72, 16);
- this->actor.velocity.y = 8.8f;
- Actor_PlaySfx(&this->actor, NA_SE_EN_NUTS_WALK);
+ thisx->velocity.y = 8.8f;
+ Actor_PlaySfx(thisx, NA_SE_EN_NUTS_WALK);
func_80A5DC70(this);
}
- if (this->actor.xzDistToPlayer < 600.0f) {
+ if (thisx->xzDistToPlayer < 600.0f) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- if (this->actor.xzDistToPlayer < 400.0f) {
+ if (thisx->xzDistToPlayer < 400.0f) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- if (this->actor.xzDistToPlayer < 100.0f) {
- Actor_OfferCarry(&this->actor, play);
+ if (thisx->xzDistToPlayer < 100.0f) {
+ Actor_OfferCarry(thisx, play);
}
}
}
@@ -1323,7 +1322,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 +1342,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..fd7795f7c 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
@@ -316,7 +316,7 @@ void func_80AEA128(EnLiftNuts* this, PlayState* play) {
}
void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
- if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && this->unk_34E == 1) {
+ if ((func_80AE9B4C(0, 3) || func_80AE9B4C(0, 1)) && (this->unk_34E == 1)) {
this->actor.flags |= ACTOR_FLAG_10000;
} else if (this->actor.xzDistToPlayer > 120.0f) {
func_80AE9FC8(this);
@@ -326,7 +326,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
if (func_80AE9B4C(0, 0)) {
switch (CURRENT_DAY) {
case 1:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10)) {
@@ -339,7 +340,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 2:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else {
@@ -360,7 +362,8 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
break;
case 3:
- if (gSaveContext.save.time > CLOCK_TIME(23, 30) || gSaveContext.save.time <= CLOCK_TIME(6, 0)) {
+ if ((gSaveContext.save.time > CLOCK_TIME(23, 30)) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0))) {
Message_StartTextbox(play, 0x27F7, &this->actor);
this->textId = 0x27F7;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_40)) {
@@ -383,7 +386,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Flags_UnsetSwitch(play, 0x40);
Inventory_SaveDekuPlaygroundHighScore(4);
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_10) && CHECK_WEEKEVENTREG(WEEKEVENTREG_14_20) &&
- CURRENT_DAY == 3) {
+ (CURRENT_DAY == 3)) {
this->unk_354 = 0;
Message_StartTextbox(play, 0x27F4, &this->actor);
this->textId = 0x27F4;
@@ -394,7 +397,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
} else {
if (((void)0, gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2]) >=
gSaveContext.save.saveInfo.dekuPlaygroundHighScores[CURRENT_DAY - 1]) {
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < 0x2EE0) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] < SECONDS_TO_TIMER(120)) {
Message_StartTextbox(play, 0x27F9, &this->actor);
this->textId = 0x27F9;
} else {
@@ -428,6 +431,9 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
}
} else {
@@ -435,7 +441,7 @@ void func_80AEA1A0(EnLiftNuts* this, PlayState* play) {
this->textId = 0x27D8;
}
func_80AEABF0(this);
- } else if (func_80AE9AC4(this, 0) || this->unk_34E == 1) {
+ } else if (func_80AE9AC4(this, 0) || (this->unk_34E == 1)) {
if (this->unk_34E == 1) {
func_800B8614(&this->actor, play, 200.0f);
} else if (this->actor.playerHeightRel >= -13.0f) {
@@ -533,6 +539,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27E9, &this->actor);
this->textId = 0x27E9;
break;
+
+ default:
+ break;
}
break;
@@ -589,6 +598,9 @@ void func_80AEA910(EnLiftNuts* this, PlayState* play) {
Message_StartTextbox(play, 0x27ED, &this->actor);
this->textId = 0x27ED;
break;
+
+ default:
+ break;
}
}
}
@@ -644,6 +656,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
}
}
break;
+
+ default:
+ break;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x2000, 0x500);
@@ -668,6 +683,9 @@ void func_80AEACF8(EnLiftNuts* this, PlayState* play) {
this->unk_354++;
}
break;
+
+ default:
+ break;
}
}
func_80AEB974(this);
@@ -759,7 +777,7 @@ void func_80AEB1C8(EnLiftNuts* this) {
void func_80AEB230(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > 0) {
+ if (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] > SECONDS_TO_TIMER(0)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
func_80AEB280(this);
}
@@ -773,8 +791,8 @@ void func_80AEB294(EnLiftNuts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (player->actor.floorBgId == BG_ACTOR_MAX) &&
- player->actor.world.pos.y < 20.0f) ||
- gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= 0x2EE0) {
+ (player->actor.world.pos.y < 20.0f)) ||
+ (gSaveContext.timerCurTimes[TIMER_ID_MINIGAME_2] >= SECONDS_TO_TIMER(120))) {
player->stateFlags1 |= PLAYER_STATE1_20;
Flags_SetSwitch(play, 0x41);
func_80AEB3E0(this, play);
@@ -986,9 +1004,9 @@ void EnLiftNuts_Update(Actor* thisx, PlayState* play) {
s32 EnLiftNuts_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnLiftNuts* this = THIS;
- if (limbIndex == OBJECT_DNT_LIMB_0F || limbIndex == OBJECT_DNT_LIMB_10 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_17 || limbIndex == OBJECT_DNT_LIMB_18 || limbIndex == OBJECT_DNT_LIMB_15 ||
- limbIndex == OBJECT_DNT_LIMB_1B) {
+ if ((limbIndex == OBJECT_DNT_LIMB_0F) || (limbIndex == OBJECT_DNT_LIMB_10) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_17) || (limbIndex == OBJECT_DNT_LIMB_18) || (limbIndex == OBJECT_DNT_LIMB_15) ||
+ (limbIndex == OBJECT_DNT_LIMB_1B)) {
*dList = NULL;
}
@@ -1009,7 +1027,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..f3c3f4705 100644
--- a/src/overlays/actors/ovl_En_Light/z_en_light.c
+++ b/src/overlays/actors/ovl_En_Light/z_en_light.c
@@ -31,9 +31,9 @@ ActorInit En_Light_InitVars = {
};
typedef struct {
- /* 0x00 */ Color_RGBA8 unk_00;
- /* 0x04 */ Color_RGB8 unk_04;
- /* 0x07 */ u8 unk_07;
+ /* 0x0 */ Color_RGBA8 unk_00;
+ /* 0x4 */ Color_RGB8 unk_04;
+ /* 0x7 */ u8 unk_07;
} EnLightStruct; // size = 0x8
EnLightStruct D_808666D0[] = {
@@ -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..908bbf374 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
@@ -112,7 +112,7 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play) {
this->actor.targetMode = 1;
Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON;
- this->pathLocation = LOOKNUTS_GET_PATROL_LOCATION(&this->actor);
+ this->pathIndex = LOOKNUTS_GET_PATH_INDEX(&this->actor);
this->switchFlag = LOOKNUTS_GET_SCENE_FLAG(&this->actor);
this->spawnIndex = LOOKNUTS_GET_SPAWN_INDEX(&this->actor);
@@ -123,7 +123,7 @@ void EnLookNuts_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
- if (this->pathLocation == 0x1F) {
+ if (this->pathIndex == LOOKNUTS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
@@ -165,17 +165,17 @@ void EnLookNuts_Patrol(EnLookNuts* this, PlayState* play) {
return;
}
- this->path = SubS_GetPathByIndex(play, this->pathLocation, 0x1F);
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, LOOKNUTS_PATH_INDEX_NONE);
if (this->path != NULL) {
- sp34 = SubS_GetDistSqAndOrientPath(this->path, this->currentPathIndex, &this->actor.world.pos, &sp30);
+ sp34 = SubS_GetDistSqAndOrientPath(this->path, this->waypointIndex, &this->actor.world.pos, &sp30);
}
//! @bug sp30 is uninitialised if path == NULL. Fix by enclosing everything in the path NULL check.
if (sp30 < 10.0f) {
if (this->path != NULL) {
- this->currentPathIndex++;
- if (this->currentPathIndex >= this->path->count) {
- this->currentPathIndex = 0;
+ this->waypointIndex++;
+ if (this->waypointIndex >= this->path->count) {
+ this->waypointIndex = 0;
}
if (Rand_ZeroOne() < 0.6f) {
EnLookNuts_SetupStandAndWait(this);
@@ -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_Look_Nuts/z_en_look_nuts.h b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
index b72215ce6..92c24cfbd 100644
--- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
+++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.h
@@ -10,7 +10,9 @@ typedef void (*EnLookNutsActionFunc)(struct EnLookNuts*, PlayState*);
#define LOOKNUTS_GET_SPAWN_INDEX(thisx) (((thisx)->params >> 0xC) & 0xF)
#define LOOKNUTS_GET_SCENE_FLAG(thisx) ((thisx)->params & 0x7F)
-#define LOOKNUTS_GET_PATROL_LOCATION(thisx) (((thisx)->params >> 0x7) & 0x1F)
+#define LOOKNUTS_GET_PATH_INDEX(thisx) (((thisx)->params >> 0x7) & 0x1F)
+
+#define LOOKNUTS_PATH_INDEX_NONE 0x1F
typedef struct EnLookNuts {
/* 0x000 */ Actor actor;
@@ -19,13 +21,13 @@ typedef struct EnLookNuts {
/* 0x1CA */ Vec3s morphTable[DEKU_PALACE_GUARD_LIMB_MAX];
/* 0x20C */ EnLookNutsActionFunc actionFunc;
/* 0x210 */ Path *path;
- /* 0x214 */ s16 currentPathIndex; // Index for the point where the deku guard is in its path
+ /* 0x214 */ s16 waypointIndex; // Index for the point where the deku guard is in its path
/* 0x216 */ s16 eyeState;
/* 0x218 */ s16 blinkTimer;
/* 0x21A */ s16 eventTimer; // Timer to trigger when another event within the actor will happen
/* 0x21C */ s16 state;
/* 0x21E */ s16 switchFlag;
- /* 0x220 */ s16 pathLocation; // Determines path that a guard will patrol
+ /* 0x220 */ s16 pathIndex; // Determines path that a guard will patrol
/* 0x222 */ s16 isPlayerDetected;
/* 0x224 */ s16 waitTimer; // Timer for how long the deku guard will take a break for
/* 0x226 */ s16 spawnIndex;
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..29a09cd90 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c
@@ -44,14 +44,14 @@ void EnMa4_InitFaceExpression(EnMa4* this);
typedef enum {
/* 0 */ MA4_TYPE_DAY1,
/* 1 */ MA4_TYPE_ALIENS_DEFEATED,
- /* 2 */ MA4_TYPE_ALIENS_WON,
+ /* 2 */ MA4_TYPE_ALIENS_WON
} EnMa4Type;
typedef enum {
/* 0 */ MA4_STATE_DEFAULT,
/* 1 */ MA4_STATE_HORSEBACKGAME,
/* 2 */ MA4_STATE_AFTERHORSEBACKGAME,
- /* 3 */ MA4_STATE_AFTERDESCRIBETHEMCS,
+ /* 3 */ MA4_STATE_AFTERDESCRIBETHEMCS
} EnMa4State;
ActorInit En_Ma4_InitVars = {
@@ -163,9 +163,9 @@ void EnMa4_InitPath(EnMa4* this, PlayState* play) {
Path* path;
Vec3f nextPoint;
- path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8];
+ path = &play->setupPathList[ENMA_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
+ this->waypointIndex = 0;
this->pathPointsCount = path->count;
this->actor.home.pos.x = this->pathPoints[0].x;
@@ -202,7 +202,7 @@ void EnMa4_Init(Actor* thisx, PlayState* play) {
if (CURRENT_DAY == 1) {
this->type = MA4_TYPE_DAY1;
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
this->type = MA4_TYPE_ALIENS_DEFEATED;
} else {
this->type = MA4_TYPE_ALIENS_WON;
@@ -252,7 +252,7 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
s32 pad;
s16 sp2E;
- if (sAnimIndex != 9 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if ((sAnimIndex != 9) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (sAnimIndex == 3) {
if (D_80AC0250 < 3) {
D_80AC0250++;
@@ -268,13 +268,13 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
}
}
- if (sAnimIndex == 13 && Animation_OnFrame(&this->skelAnime, 37.0f)) {
+ if ((sAnimIndex == 13) && Animation_OnFrame(&this->skelAnime, 37.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_ROMANI_BOW_FLICK);
}
- sp34.x = this->pathPoints[this->pathIndex].x;
- sp34.y = this->pathPoints[this->pathIndex].y;
- sp34.z = this->pathPoints[this->pathIndex].z;
+ sp34.x = this->pathPoints[this->waypointIndex].x;
+ sp34.y = this->pathPoints[this->waypointIndex].y;
+ sp34.z = this->pathPoints[this->waypointIndex].z;
sp2E = Math_Vec3f_Yaw(&this->actor.world.pos, &sp34);
if (Math_Vec3f_DistXZ(&this->actor.world.pos, &sp34) > 50.0f) {
Math_SmoothStepToS(&this->actor.world.rot.y, sp2E, 10, 0x3000, 0x100);
@@ -291,10 +291,10 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) {
}
}
- if (this->pathIndex < this->pathPointsCount - 1) {
- this->pathIndex++;
+ if (this->waypointIndex < (this->pathPointsCount - 1)) {
+ this->waypointIndex++;
} else {
- this->pathIndex = 0;
+ this->waypointIndex = 0;
}
}
@@ -345,7 +345,7 @@ void EnMa4_Wait(EnMa4* this, PlayState* play) {
}
}
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
EnMa4_StartDialogue(this, play);
EnMa4_SetupDialogueHandler(this);
} else if (this->type != MA4_TYPE_ALIENS_WON || ABS_ALT(yaw) < 0x4000) {
@@ -374,7 +374,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
case 0x3341:
if (play->msgCtx.choiceIndex == 0) {
func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_21_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
@@ -383,14 +383,14 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x3342, &this->actor);
this->textId = 0x3342;
this->state = MA4_STATE_DEFAULT;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
case 0x3346:
if (play->msgCtx.choiceIndex == 0) {
func_8019F208();
- SET_WEEKEVENTREG(WEEKEVENTREG_21_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM);
Message_StartTextbox(play, 0x3343, &this->actor);
this->textId = 0x3343;
} else {
@@ -410,7 +410,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
func_8019F230();
Message_StartTextbox(play, 0x3348, &this->actor);
this->textId = 0x3348;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
@@ -422,9 +422,9 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
Message_StartTextbox(play, 0x334E, &this->actor);
this->textId = 0x334E;
if (CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
- func_80151BB4(play, 0x1C);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM);
}
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else { // No.
func_8019F230();
EnMa4_SetFaceExpression(this, 0, 0);
@@ -443,7 +443,7 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 1, 0);
Message_StartTextbox(play, 0x3355, &this->actor);
this->textId = 0x3355;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
@@ -459,13 +459,13 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3357, &this->actor);
this->textId = 0x3357;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
func_8019F230();
EnMa4_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x335B, &this->actor);
this->textId = 0x335B;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
}
break;
@@ -480,9 +480,12 @@ void EnMa4_HandlePlayerChoice(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x335A, &this->actor);
this->textId = 0x335A;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
break;
+
+ default:
+ break;
}
}
}
@@ -502,7 +505,7 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x3336, &this->actor);
this->textId = 0x3336;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3338:
@@ -608,12 +611,15 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) {
if ((gSaveContext.save.playerForm != PLAYER_FORM_HUMAN) || !CHECK_QUEST_ITEM(QUEST_SONG_EPONA)) {
Message_StartTextbox(play, 0x335C, &this->actor);
this->textId = 0x335C;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3359, &this->actor);
this->textId = 0x3359;
}
break;
+
+ default:
+ break;
}
}
}
@@ -629,9 +635,6 @@ void EnMa4_SetupDialogueHandler(EnMa4* this) {
void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
switch (Message_GetState(&play->msgCtx)) {
- default:
- break;
-
case TEXT_STATE_CHOICE: // Player answered a question
EnMa4_HandlePlayerChoice(this, play);
break;
@@ -642,7 +645,7 @@ void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
case TEXT_STATE_DONE: // End conversation
if (Message_ShouldAdvance(play)) {
- if ((play->msgCtx.unk120B1 == 0) || !CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
+ if ((play->msgCtx.bombersNotebookEventQueueCount == 0) || !CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
EnMa4_SetupWait(this);
}
}
@@ -652,6 +655,9 @@ void EnMa4_DialogueHandler(EnMa4* this, PlayState* play) {
case TEXT_STATE_CLOSING:
case TEXT_STATE_3:
break;
+
+ default:
+ break;
}
if (this->type != MA4_TYPE_ALIENS_WON) {
@@ -818,12 +824,15 @@ void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) {
this->hasBow = false;
EnMa4_ChangeAnim(this, 4);
break;
+
+ default:
+ break;
}
}
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
- if (sCueId == 2 && this->animTimer == 0 && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if ((sCueId == 2) && (this->animTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMa4_ChangeAnim(this, 7);
}
} else {
@@ -845,7 +854,7 @@ void EnMa4_EndEponasSongCs(EnMa4* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->actor.flags |= ACTOR_FLAG_10000;
- if (Actor_ProcessTalkRequest(&this->actor, &play->state) != 0) {
+ if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
Message_StartTextbox(play, 0x334C, &this->actor);
this->textId = 0x334C;
@@ -879,7 +888,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3337, &this->actor);
this->textId = 0x3337;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3335, &this->actor);
this->textId = 0x3335;
@@ -887,7 +896,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
}
} else if (this->state == MA4_STATE_DEFAULT) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_21_40)) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM)) {
Message_StartTextbox(play, 0x3346, &this->actor);
this->textId = 0x3346;
} else {
@@ -935,7 +944,7 @@ void EnMa4_StartDialogue(EnMa4* this, PlayState* play) {
EnMa4_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x3337, &this->actor);
this->textId = 0x3337;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
} else {
Message_StartTextbox(play, 0x3335, &this->actor);
this->textId = 0x3335;
@@ -1054,7 +1063,9 @@ void EnMa4_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
} else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1064,12 +1075,13 @@ void EnMa4_Draw(Actor* thisx, PlayState* play) {
EnMa4* this = THIS;
OPEN_DISPS(play->state.gfxCtx);
+
if (this->type == MA4_TYPE_ALIENS_WON) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
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_Ma4/z_en_ma4.h b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
index 91876c938..dfedd3330 100644
--- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
+++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.h
@@ -8,6 +8,8 @@ struct EnMa4;
typedef void (*EnMa4ActionFunc)(struct EnMa4*, PlayState*);
+#define ENMA_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
+
typedef struct EnMa4 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@@ -19,7 +21,7 @@ typedef struct EnMa4 {
/* 0x28E */ UNK_TYPE1 unk28E[0x6];
/* 0x294 */ Vec3s morphTable[ROMANI_LIMB_MAX];
/* 0x31E */ UNK_TYPE1 unk31E[0x6];
- /* 0x324 */ s16 pathIndex;
+ /* 0x324 */ s16 waypointIndex;
/* 0x326 */ s16 pathPointsCount;
/* 0x328 */ UNK_TYPE1 unk_328[0x2];
/* 0x32A */ s16 blinkTimer;
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..5dd713019 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
@@ -153,7 +153,7 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
this->unk320 = 0;
this->eyeTexIndex = 0;
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_SetFaceExpression(this, 0, 1);
} else {
EnMaYto_SetFaceExpression(this, 5, 2);
@@ -186,38 +186,39 @@ void EnMaYto_Init(Actor* thisx, PlayState* play) {
s32 EnMaYto_CheckValidSpawn(EnMaYto* this, PlayState* play) {
switch (this->type) {
case MA_YTO_TYPE_DEFAULT:
- if (CURRENT_DAY == 3 && !CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 3) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTO_TYPE_DINNER:
- if (CURRENT_DAY != 1 && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY != 1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (((this->actor.params & 0x0F00) >> 8) != 0) {
return false;
}
} else if (((this->actor.params & 0x0F00) >> 8) == 0) {
return false;
}
- if (gSaveContext.save.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) {
+ if ((gSaveContext.save.time >= CLOCK_TIME(20, 0)) && (CURRENT_DAY == 3)) {
return false;
}
break;
case MA_YTO_TYPE_AFTERMILKRUN:
- if ((!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) ||
+ if ((!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_14_01)) {
return false;
}
break;
case MA_YTO_TYPE_4:
+ default:
break;
}
@@ -239,7 +240,7 @@ void EnMaYto_InitAnimation(EnMaYto* this, PlayState* play) {
break;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_ChangeAnim(this, 12);
} else {
EnMaYto_ChangeAnim(this, 8);
@@ -277,8 +278,8 @@ void EnMaYto_ChooseAction(EnMaYto* this, PlayState* play) {
case MA_YTO_TYPE_AFTERMILKRUN:
this->unk310 = 0;
- if ((INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) && CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) &&
- (Rand_Next() & 0x80)) {
+ if ((INV_CONTENT(ITEM_MASK_ROMANI) == ITEM_MASK_ROMANI) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && (Rand_Next() & 0x80)) {
EnMaYto_SetupBeginWarmFuzzyFeelingCs(this);
} else {
EnMaYto_SetupAfterMilkRunInit(this);
@@ -304,8 +305,8 @@ s32 EnMaYto_SearchRomani(EnMaYto* this, PlayState* play) {
EnMaYts* romani = (EnMaYts*)npcActor;
s16 romaniType = EN_MA_YTS_GET_TYPE(&romani->actor);
- if ((this->type == MA_YTO_TYPE_DINNER && romaniType == MA_YTS_TYPE_SITTING) ||
- (this->type == MA_YTO_TYPE_BARN && romaniType == MA_YTS_TYPE_BARN)) {
+ if (((this->type == MA_YTO_TYPE_DINNER) && (romaniType == MA_YTS_TYPE_SITTING)) ||
+ ((this->type == MA_YTO_TYPE_BARN) && (romaniType == MA_YTS_TYPE_BARN))) {
this->actor.child = &romani->actor;
romani->actor.parent = &this->actor;
return true;
@@ -332,7 +333,7 @@ s32 EnMaYto_TryFindRomani(EnMaYto* this, PlayState* play) {
return 0;
case MA_YTO_TYPE_DINNER:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) && (CURRENT_DAY == 2)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) && (CURRENT_DAY == 2)) {
return 0;
}
if (EnMaYto_SearchRomani(this, play)) {
@@ -341,7 +342,7 @@ s32 EnMaYto_TryFindRomani(EnMaYto* this, PlayState* play) {
return 1;
case MA_YTO_TYPE_BARN:
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (EnMaYto_SearchRomani(this, play)) {
return 2;
}
@@ -394,8 +395,8 @@ void EnMaYto_DefaultWait(EnMaYto* this, PlayState* play) {
s16 direction;
direction = rotY - this->actor.yawTowardsPlayer;
- if (Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) == 0 &&
- this->animIndex == 1) {
+ if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) &&
+ (this->animIndex == 1)) {
this->animIndex = 11;
EnMaYto_ChangeAnim(this, 11);
}
@@ -439,7 +440,7 @@ void EnMaYto_DefaultDialogueHandler(EnMaYto* this, PlayState* play) {
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3000, 0x100);
- if (this->textId == 0x3395 && this->skelAnime.animation == &gCremiaSpreadArmsStartAnim &&
+ if ((this->textId == 0x3395) && (this->skelAnime.animation == &gCremiaSpreadArmsStartAnim) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 4);
}
@@ -475,7 +476,7 @@ void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 3, 1);
Message_StartTextbox(play, 0x3393, &this->actor);
this->textId = 0x3393;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x3394:
@@ -488,14 +489,17 @@ void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_ChangeAnim(this, 1);
Message_StartTextbox(play, 0x3396, &this->actor);
this->textId = 0x3396;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ break;
+
+ default:
break;
}
}
}
void EnMaYto_SetupDinnerWait(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 0);
this->unk31E = 0;
} else {
@@ -516,7 +520,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
} else {
Actor* child = this->actor.child;
- if (child != NULL && Actor_ProcessTalkRequest(child, &play->state)) {
+ if ((child != NULL) && Actor_ProcessTalkRequest(child, &play->state)) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
EnMaYto_DinnerStartDialogue(this, play);
EnMaYto_SetupDinnerDialogueHandler(this);
@@ -524,7 +528,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
func_800B8614(&this->actor, play, 120.0f);
child = this->actor.child;
- if (child != NULL && CURRENT_DAY != 2) {
+ if ((child != NULL) && (CURRENT_DAY != 2)) {
s16 childDirection = child->shape.rot.y - child->yawTowardsPlayer;
if (ABS_ALT(childDirection) < 0x4000) {
@@ -536,7 +540,7 @@ void EnMaYto_DinnerWait(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupDinnerDialogueHandler(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 1);
} else {
func_80B90E50(this, 2);
@@ -631,8 +635,8 @@ void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetRomaniFaceExpression(this, 0, 1);
Message_StartTextbox(play, 0x339E, &this->actor);
this->textId = 0x339E;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x339F:
@@ -667,27 +671,30 @@ void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x33A4, &this->actor);
this->textId = 0x33A4;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33A5:
Message_StartTextbox(play, 0x33A6, &this->actor);
this->textId = 0x33A6;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x33A7:
Message_StartTextbox(play, 0x33A8, &this->actor);
this->textId = 0x33A8;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ break;
+
+ default:
break;
}
}
}
void EnMaYto_SetupBarnWait(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_ChangeAnim(this, 13);
func_80B90E50(this, 0);
this->unk31E = 0;
@@ -711,11 +718,11 @@ void EnMaYto_BarnWait(EnMaYto* this, PlayState* play) {
} else {
Actor* child = this->actor.child;
- if (child != NULL && Actor_ProcessTalkRequest(child, &play->state)) {
+ if ((child != NULL) && Actor_ProcessTalkRequest(child, &play->state)) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
EnMaYto_BarnStartDialogue(this, play);
EnMaYto_SetupBarnDialogueHandler(this);
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01) || ABS_ALT(direction) < 0x2000) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM) || (ABS_ALT(direction) < 0x2000)) {
func_800B8614(&this->actor, play, 100.0f);
child = this->actor.child;
@@ -727,7 +734,7 @@ void EnMaYto_BarnWait(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupBarnDialogueHandler(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
func_80B90E50(this, 1);
} else {
func_80B90E50(this, 2);
@@ -789,8 +796,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
Actor_ChangeFocus(&this->actor, play, &this->actor);
Message_StartTextbox(play, 0x33AD, &this->actor);
this->textId = 0x33AD;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33AE:
@@ -807,8 +814,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x33B0, &this->actor);
this->textId = 0x33B0;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x33B1:
@@ -817,7 +824,7 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
// "I should had believed what Romani said"
Message_StartTextbox(play, 0x33B2, &this->actor);
this->textId = 0x33B2;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
break;
case 0x33C6:
@@ -864,8 +871,8 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetRomaniFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x33CC, &this->actor);
this->textId = 0x33CC;
- func_80151BB4(play, 6);
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
default:
@@ -875,7 +882,7 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) {
}
void EnMaYto_SetupAfterMilkRunInit(EnMaYto* this) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
EnMaYto_SetFaceExpression(this, 3, 1);
} else {
Audio_PlayFanfare(NA_BGM_FAILURE_1);
@@ -890,7 +897,7 @@ void EnMaYto_AfterMilkRunInit(EnMaYto* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
this->actor.flags &= ~ACTOR_FLAG_10000;
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Message_StartTextbox(play, 0x33C1, &this->actor);
this->textId = 0x33C1;
} else {
@@ -901,7 +908,7 @@ void EnMaYto_AfterMilkRunInit(EnMaYto* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 4;
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
return;
}
@@ -948,6 +955,9 @@ void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetupPostMilkRunGiveReward(this);
EnMaYto_PostMilkRunGiveReward(this, play);
break;
+
+ default:
+ break;
}
}
}
@@ -981,9 +991,9 @@ void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, PlayState* play) {
this->textId = 0x33C3;
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 3;
- func_80151BB4(play, 0x20);
- func_80151BB4(play, 0x1F);
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
} else {
// You already have the mask
@@ -992,7 +1002,7 @@ void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, PlayState* play) {
this->textId = 0x33D0;
SET_WEEKEVENTREG(WEEKEVENTREG_14_01);
this->unk310 = 3;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
EnMaYto_SetupPostMilkRunWaitDialogueEnd(this);
}
} else {
@@ -1047,12 +1057,15 @@ void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) {
case 3:
EnMaYto_ChangeAnim(this, 22);
break;
+
+ default:
+ break;
}
}
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
- if (sCueId == 2 && this->skelAnime.animation == &gCremiaHugStartAnim &&
+ if ((sCueId == 2) && (this->skelAnime.animation == &gCremiaHugStartAnim) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
EnMaYto_ChangeAnim(this, 20);
}
@@ -1066,14 +1079,14 @@ void EnMaYto_SetupPostMilkRunWaitDialogueEnd(EnMaYto* this) {
}
void EnMaYto_PostMilkRunWaitDialogueEnd(EnMaYto* this, PlayState* play) {
- if (Message_GetState(&play->msgCtx) == TEXT_STATE_DONE || Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
- if (Message_ShouldAdvance(play) && Message_GetState(&play->msgCtx) == TEXT_STATE_5) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
+ if (Message_ShouldAdvance(play) && (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) {
func_800B7298(play, &this->actor, PLAYER_CSMODE_WAIT);
Message_CloseTextbox(play);
}
}
- if (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE && play->msgCtx.unk120B1 == 0) {
+ if ((Message_GetState(&play->msgCtx) == TEXT_STATE_NONE) && (play->msgCtx.bombersNotebookEventQueueCount == 0)) {
EnMaYto_SetupPostMilkRunEnd(this);
}
}
@@ -1096,7 +1109,7 @@ void EnMaYto_PostMilkRunEnd(EnMaYto* this, PlayState* play) {
void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
if (CURRENT_DAY == 1) {
- if (Player_GetMask(play) != PLAYER_MASK_NONE && gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((Player_GetMask(play) != PLAYER_MASK_NONE) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_ROMANI:
Message_StartTextbox(play, 0x235D, &this->actor);
@@ -1141,13 +1154,13 @@ void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x33C5, &this->actor);
this->textId = 0x33C5;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
EnMaYto_SetFaceExpression(this, 0, 3);
Message_StartTextbox(play, 0x33C4, &this->actor);
this->textId = 0x33C4;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
}
}
}
@@ -1155,7 +1168,7 @@ void EnMaYto_DefaultStartDialogue(EnMaYto* this, PlayState* play) {
void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
switch (CURRENT_DAY) {
case 1:
- if (Player_GetMask(play) != PLAYER_MASK_NONE && gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((Player_GetMask(play) != PLAYER_MASK_NONE) && (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
switch (Player_GetMask(play)) {
case PLAYER_MASK_ROMANI:
Message_StartTextbox(play, 0x235D, &this->actor);
@@ -1198,7 +1211,7 @@ void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
if (EnMaYto_HasSpokenToPlayer()) {
Message_StartTextbox(play, 0x33A6, &this->actor);
this->textId = 0x33A6;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
Message_StartTextbox(play, 0x33A5, &this->actor);
@@ -1210,18 +1223,21 @@ void EnMaYto_DinnerStartDialogue(EnMaYto* this, PlayState* play) {
if (EnMaYto_HasSpokenToPlayer()) {
Message_StartTextbox(play, 0x33A8, &this->actor);
this->textId = 0x33A8;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
Message_StartTextbox(play, 0x33A7, &this->actor);
this->textId = 0x33A7;
}
break;
+
+ default:
+ break;
}
}
void EnMaYto_BarnStartDialogue(EnMaYto* this, PlayState* play) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (CURRENT_DAY == 2) {
if (this->unk310 == 1) {
Message_StartTextbox(play, 0x33AE, &this->actor);
@@ -1250,7 +1266,7 @@ void EnMaYto_BarnStartDialogue(EnMaYto* this, PlayState* play) {
EnMaYto_SetFaceExpression(this, 5, 3);
Message_StartTextbox(play, 0x33B3, &this->actor);
this->textId = 0x33B3;
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
} else {
EnMaYto_SetTalkedFlag();
EnMaYto_SetFaceExpression(this, 5, 3);
@@ -1324,7 +1340,7 @@ void EnMaYto_UpdateEyes(EnMaYto* this) {
void func_80B90E50(EnMaYto* this, s16 arg1) {
EnMaYts* romani = (EnMaYts*)this->actor.child;
- if (romani != NULL && romani->actor.id == ACTOR_EN_MA_YTS) {
+ if ((romani != NULL) && (romani->actor.id == ACTOR_EN_MA_YTS)) {
romani->unk_32C = arg1;
}
}
@@ -1344,7 +1360,7 @@ void EnMaYto_SetFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouth
}
void EnMaYto_InitFaceExpression(EnMaYto* this) {
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYto_SetFaceExpression(this, 0, 1);
EnMaYto_SetRomaniFaceExpression(this, 0, 0);
} else {
@@ -1372,27 +1388,33 @@ s32 EnMaYto_HasSpokenToPlayerToday(void) {
return true;
}
break;
+
+ default:
+ break;
}
return false;
}
s32 EnMaYto_HasSpokenToPlayer(void) {
- // Please note no case here has a `break`.
switch (CURRENT_DAY) {
case 3:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_10)) {
return true;
}
-
+ // fallthrough
case 2:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_08)) {
return true;
}
-
+ // fallthrough
case 1:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_13_04)) {
return true;
}
+ break;
+
+ default:
+ break;
}
return false;
}
@@ -1410,6 +1432,9 @@ void EnMaYto_SetTalkedFlag(void) {
case 3:
SET_WEEKEVENTREG(WEEKEVENTREG_13_10);
break;
+
+ default:
+ break;
}
}
@@ -1458,11 +1483,12 @@ void EnMaYto_Draw(Actor* thisx, PlayState* play) {
s32 pad;
OPEN_DISPS(play->state.gfxCtx);
- if (this->type == MA_YTO_TYPE_BARN && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+
+ if ((this->type == MA_YTO_TYPE_BARN) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
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..bb9c9c926 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
@@ -123,7 +123,7 @@ void func_80B8D12C(EnMaYts* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s16 trackingMode = (this->unk_32C == 2) ? NPC_TRACKING_NONE : NPC_TRACKING_PLAYER_AUTO_TURN;
- if (this->unk_32C == 0 || this->actor.parent == NULL) {
+ if ((this->unk_32C == 0) || (this->actor.parent == NULL)) {
this->interactInfo.trackPos = player->actor.world.pos;
this->interactInfo.trackPos.y -= -10.0f;
} else {
@@ -144,7 +144,7 @@ void EnMaYts_InitAnimation(EnMaYts* this, PlayState* play) {
case MA_YTS_TYPE_SITTING:
this->actor.targetMode = 6;
// Day 1 or "Winning" the alien invasion
- if (CURRENT_DAY == 1 || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYts_ChangeAnim(this, 14);
} else {
EnMaYts_ChangeAnim(this, 18);
@@ -177,38 +177,44 @@ s32 EnMaYts_CheckValidSpawn(EnMaYts* this, PlayState* play) {
case 2:
// Failing the alien invasion
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case 3:
// "Winning" the alien invasion
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
+
+ default:
+ break;
}
break;
case MA_YTS_TYPE_BARN:
// Failing the alien invasion
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
- } else if (gSaveContext.save.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) {
+ } else if ((gSaveContext.save.time >= CLOCK_TIME(20, 0)) && (CURRENT_DAY == 3)) {
return false;
}
break;
case MA_YTS_TYPE_SLEEPING:
// "Winning" the alien invasion
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
break;
case MA_YTS_TYPE_ENDCREDITS:
break;
+
+ default:
+ break;
}
return true;
@@ -248,7 +254,7 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
this->hasBow = false;
}
- if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
this->overrideEyeTexIndex = 0;
this->eyeTexIndex = 0;
this->mouthTexIndex = 0;
@@ -266,7 +272,8 @@ void EnMaYts_Init(Actor* thisx, PlayState* play) {
this->mouthTexIndex = 0;
this->unk_32C = 2;
EnMaYts_SetupEndCreditsHandler(this);
- } else if (CURRENT_DAY == 2 && gSaveContext.save.isNight == 1 && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ } else if ((CURRENT_DAY == 2) && (gSaveContext.save.isNight == 1) &&
+ CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
EnMaYts_SetupStartDialogue(this);
} else {
EnMaYts_SetupDoNothing(this);
@@ -307,7 +314,7 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3362, &this->actor);
this->textId = 0x3362;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
} else if (Player_GetMask(play) != PLAYER_MASK_NONE) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_65_40)) {
@@ -319,9 +326,9 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x3366, &this->actor);
this->textId = 0x3366;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
- } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_21_20)) {
+ } else if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM)) {
EnMaYts_SetFaceExpression(this, 0, 0);
Message_StartTextbox(play, 0x3367, &this->actor);
this->textId = 0x3367;
@@ -337,7 +344,7 @@ void EnMaYts_StartDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 0, 0);
Message_StartTextbox(play, 0x336C, &this->actor);
this->textId = 0x336C;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
}
}
EnMaYts_SetupDialogueHandler(this);
@@ -406,6 +413,9 @@ void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) {
this->hasBow = true;
EnMaYts_ChangeAnim(this, 20);
break;
+
+ default:
+ break;
}
}
}
@@ -436,7 +446,7 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3361, &this->actor);
this->textId = 0x3361;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3363:
@@ -449,14 +459,14 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 4, 2);
Message_StartTextbox(play, 0x3365, &this->actor);
this->textId = 0x3365;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3367:
EnMaYts_SetFaceExpression(this, 4, 3);
Message_StartTextbox(play, 0x3368, &this->actor);
this->textId = 0x3368;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
case 0x3369:
@@ -469,7 +479,7 @@ void EnMaYts_ChooseNextDialogue(EnMaYts* this, PlayState* play) {
EnMaYts_SetFaceExpression(this, 3, 3);
Message_StartTextbox(play, 0x336B, &this->actor);
this->textId = 0x336B;
- func_80151BB4(play, 5);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROMANI);
break;
default:
@@ -526,7 +536,9 @@ void EnMaYts_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* ro
} else if (limbIndex == ROMANI_LIMB_LEFT_HAND) {
if (this->hasBow == true) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, gRomaniBowDL);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -536,7 +548,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 +563,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..94590f5b6 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.c
@@ -233,9 +233,9 @@ void EnMinifrog_SpawnDust(EnMinifrog* this, PlayState* play) {
vec5.z = this->actor.world.pos.z - (5.0f * Math_CosS(yaw) * Math_CosS(pitch));
for (i = 0; i < 5; i++) {
- vel.x = randPlusMinusPoint5Scaled(4.0f);
- vel.y = randPlusMinusPoint5Scaled(4.0f);
- vel.z = randPlusMinusPoint5Scaled(4.0f);
+ vel.x = Rand_CenteredFloat(4.0f);
+ vel.y = Rand_CenteredFloat(4.0f);
+ vel.z = Rand_CenteredFloat(4.0f);
accel.x = -vel.x * 0.1f;
accel.y = -vel.y * 0.1f;
accel.z = -vel.z * 0.1f;
@@ -608,9 +608,11 @@ void EnMinifrog_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s*
if ((limbIndex == 7) || (limbIndex == 8)) {
OPEN_DISPS(play->state.gfxCtx);
+
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, *dList);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -628,12 +630,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_Minifrog/z_en_minifrog.h b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
index 9a3801d91..3e321cc56 100644
--- a/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
+++ b/src/overlays/actors/ovl_En_Minifrog/z_en_minifrog.h
@@ -19,9 +19,9 @@ typedef enum {
} MinifrogType;
typedef enum {
- /* 0x00 */ MINIFROG_STATE_JUMP,
- /* 0x01 */ MINIFROG_STATE_AIR,
- /* 0x02 */ MINIFROG_STATE_GROUND
+ /* 0 */ MINIFROG_STATE_JUMP,
+ /* 1 */ MINIFROG_STATE_AIR,
+ /* 2 */ MINIFROG_STATE_GROUND
} MinifrogJumpState;
typedef struct EnMinifrog {
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..68d08b223 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
@@ -80,7 +80,7 @@ typedef enum {
/* 0x2 */ MINISLIME_DMGEFF_FIRE = 0x2,
/* 0x3 */ MINISLIME_DMGEFF_ICE,
/* 0xE */ MINISLIME_DMGEFF_HOOKSHOT = 0xE,
- /* 0xF */ MINISLIME_DMGEFF_BREAK_ICE,
+ /* 0xF */ MINISLIME_DMGEFF_BREAK_ICE
} MinislimeDamageEffect;
static DamageTable sDamageTable = {
@@ -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;
@@ -209,11 +209,11 @@ void EnMinislime_AddIceSmokeEffect(EnMinislime* this, PlayState* play) {
Vec3f pos;
Vec3f vel;
- pos.x = (randPlusMinusPoint5Scaled(200.0f) * this->actor.scale.x) + this->actor.world.pos.x;
+ pos.x = (Rand_CenteredFloat(200.0f) * this->actor.scale.x) + this->actor.world.pos.x;
pos.y = CLAMP_MIN(this->actor.world.pos.y, GBT_ROOM_5_MIN_Y + 30.0f);
- pos.z = (randPlusMinusPoint5Scaled(200.0f) * this->actor.scale.z) + this->actor.world.pos.z;
- vel.x = randPlusMinusPoint5Scaled(1.5f);
- vel.z = randPlusMinusPoint5Scaled(1.5f);
+ pos.z = (Rand_CenteredFloat(200.0f) * this->actor.scale.z) + this->actor.world.pos.z;
+ vel.x = Rand_CenteredFloat(1.5f);
+ vel.z = Rand_CenteredFloat(1.5f);
vel.y = 2.0f;
EffectSsIceSmoke_Spawn(play, &pos, &vel, &gZeroVec3f, 500);
}
@@ -401,8 +401,8 @@ void EnMinislime_GrowAndShrink(EnMinislime* this, PlayState* play) {
this->growShrinkTimer--;
scaleFactor = (this->growShrinkTimer / 6) + 1.0f;
this->actor.scale.z = this->actor.scale.x =
- ((cos_rad(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * (2.0f / 30.0f))) + 1.5f) * 0.1f;
- this->actor.scale.y = ((sin_rad(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * 0.05f)) + 0.75f) * 0.1f;
+ ((Math_CosF(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * (2.0f / 30.0f))) + 1.5f) * 0.1f;
+ this->actor.scale.y = ((Math_SinF(this->growShrinkTimer * (M_PI / 3)) * (scaleFactor * 0.05f)) + 0.75f) * 0.1f;
if (this->actor.params == MINISLIME_SETUP_GEKKO_THROW) {
EnMinislime_SetupMoveToGekko(this);
} else if ((this->actor.xzDistToPlayer < 150.0f) && (this->growShrinkTimer < 38)) {
@@ -424,11 +424,12 @@ void EnMinislime_Idle(EnMinislime* this, PlayState* play) {
f32 speedXZ;
this->idleTimer--;
- speedXZ = sin_rad(this->idleTimer * (M_PI / 10));
+ speedXZ = Math_SinF(this->idleTimer * (M_PI / 10));
this->actor.speed = speedXZ * 1.5f;
this->actor.speed = CLAMP_MIN(this->actor.speed, 0.0f);
Math_StepToF(&this->actor.scale.x, ((0.14f * speedXZ) + 1.5f) * 0.1f, 0.010000001f);
- Math_StepToF(&this->actor.scale.y, ((cos_rad(this->idleTimer * (M_PI / 10)) * 0.07f) + 0.75f) * 0.1f, 0.010000001f);
+ Math_StepToF(&this->actor.scale.y, ((Math_CosF(this->idleTimer * (M_PI / 10)) * 0.07f) + 0.75f) * 0.1f,
+ 0.010000001f);
Math_StepToF(&this->actor.scale.z, 0.3f - this->actor.scale.x, 0.010000001f);
if (this->idleTimer == 0) {
if (this->actor.xzDistToPlayer < 300.0f) {
@@ -537,13 +538,13 @@ void EnMinislime_Knockback(EnMinislime* this, PlayState* play) {
this->knockbackTimer--;
Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
sqrtFrozenTimer = sqrtf(this->knockbackTimer);
- this->actor.scale.x = ((cos_rad(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.15f;
+ this->actor.scale.x = ((Math_CosF(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.15f;
this->actor.scale.z = this->actor.scale.x;
if (this->knockbackTimer == 15) {
this->collider.base.acFlags |= AC_ON;
}
- this->actor.scale.y = ((sin_rad(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.075f;
+ this->actor.scale.y = ((Math_SinF(this->knockbackTimer * (M_PI / 3)) * (0.05f * sqrtFrozenTimer)) + 1.0f) * 0.075f;
if (this->actor.params == MINISLIME_SETUP_GEKKO_THROW) {
EnMinislime_SetupMoveToGekko(this);
} else if (this->knockbackTimer == 0) {
@@ -575,9 +576,10 @@ void EnMinislime_DefeatIdle(EnMinislime* this, PlayState* play) {
f32 xzScale;
this->idleTimer--;
- xzScale = sin_rad(this->idleTimer * (M_PI / 10));
+ xzScale = Math_SinF(this->idleTimer * (M_PI / 10));
Math_StepToF(&this->actor.scale.x, ((0.14f * xzScale) + 1.5f) * 0.1f, 0.010000001f);
- Math_StepToF(&this->actor.scale.y, ((0.07f * cos_rad(this->idleTimer * (M_PI / 10))) + 0.75f) * 0.1f, 0.010000001f);
+ Math_StepToF(&this->actor.scale.y, ((0.07f * Math_CosF(this->idleTimer * (M_PI / 10))) + 0.75f) * 0.1f,
+ 0.010000001f);
Math_StepToF(&this->actor.scale.z, 0.3f - this->actor.scale.x, 0.010000001f);
if (this->idleTimer == 0) {
this->idleTimer = 20;
@@ -670,9 +672,9 @@ void EnMinislime_GekkoThrow(EnMinislime* this, PlayState* play) {
f32 xzScale;
this->throwTimer--;
- xzScale = sin_rad(this->throwTimer * (M_PI / 5));
+ xzScale = Math_SinF(this->throwTimer * (M_PI / 5));
this->actor.scale.x = ((0.3f * xzScale) + 1.5f) * 0.1f;
- this->actor.scale.y = ((cos_rad(this->throwTimer * (M_PI / 5)) * 0.2f) + 0.75f) * 0.1f;
+ this->actor.scale.y = ((Math_CosF(this->throwTimer * (M_PI / 5)) * 0.2f) + 0.75f) * 0.1f;
this->actor.scale.z = 0.3f - this->actor.scale.x;
if (this->throwTimer == 0) {
this->throwTimer = 10;
diff --git a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
index 77cabe9b6..8d29f2b8a 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.h
@@ -21,13 +21,13 @@ typedef enum {
/* 0x8 */ MINISLIME_DEFEAT_MELT,
/* 0x9 */ MINISLIME_DESPAWN,
/* 0xA */ MINISLIME_SETUP_GEKKO_THROW,
- /* 0xB */ MINISLIME_GEKKO_THROW,
+ /* 0xB */ MINISLIME_GEKKO_THROW
} EnMinislimeState;
typedef enum {
- /* 0x0 */ MINISLIME_INACTIVE_STATE,
- /* 0x1 */ MINISLIME_ACTIVE_CONTINUE_STATE,
- /* 0x2 */ MINISLIME_ACTIVE_INIT_STATE,
+ /* 0 */ MINISLIME_INACTIVE_STATE,
+ /* 1 */ MINISLIME_ACTIVE_CONTINUE_STATE,
+ /* 2 */ MINISLIME_ACTIVE_INIT_STATE
} EnMinislimeActiveState;
typedef struct EnMinislime {
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..4e9af5578 100644
--- a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
+++ b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c
@@ -274,7 +274,7 @@ void func_80A4E2E8(EnMkk* this, PlayState* play) {
Math_ScaledStepToS(&this->unk_150, this->actor.yawTowardsPlayer, 0x400);
}
this->actor.shape.rot.y =
- (s32)(sin_rad(this->unk_14E * ((2 * M_PI) / 15)) * (614.4f * this->actor.speed)) + this->unk_150;
+ (s32)(Math_SinF(this->unk_14E * ((2 * M_PI) / 15)) * (614.4f * this->actor.speed)) + this->unk_150;
func_800B9010(&this->actor, NA_SE_EN_KUROSUKE_MOVE - SFX_FLAG);
if (sp20) {
this->unk_14B &= ~2;
@@ -379,16 +379,16 @@ void func_80A4E84C(EnMkk* this) {
this->unk_154.y = this->actor.world.pos.y;
this->unk_154.x = this->actor.world.pos.x -
10.0f * Math_SinS(this->actor.shape.rot.y +
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_154.z = this->actor.world.pos.z -
10.0f * Math_CosS(this->actor.shape.rot.y +
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_160.x = this->unk_154.x -
12.0f * Math_SinS(this->actor.shape.rot.y -
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
this->unk_160.z = this->unk_154.z -
12.0f * Math_CosS(this->actor.shape.rot.y -
- (s32)(1228.8f * this->actor.speed * sin_rad(this->unk_14E * (M_PI / 5))));
+ (s32)(1228.8f * this->actor.speed * Math_SinF(this->unk_14E * (M_PI / 5))));
}
}
@@ -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..ab387771c 100644
--- a/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
+++ b/src/overlays/actors/ovl_En_Mm3/z_en_mm3.c
@@ -157,7 +157,7 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
} else {
func_8019F208();
@@ -168,7 +168,7 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
func_8019F230();
Message_StartTextbox(play, 0x278F, &this->actor);
this->unk_2B4 = 0x278F;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
break;
@@ -183,13 +183,13 @@ void func_80A6F3B4(EnMm3* this, PlayState* play) {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(play, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
} else {
func_8019F230();
Message_StartTextbox(play, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
}
break;
}
@@ -282,7 +282,7 @@ void func_80A6F5E4(EnMm3* this, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) {
Message_StartTextbox(play, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
- func_80151BB4(play, 0xB);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
} else {
Message_StartTextbox(play, 0x2798, &this->actor);
this->unk_2B4 = 0x2798;
@@ -448,8 +448,8 @@ void func_80A6FEEC(EnMm3* this, PlayState* play) {
player->stateFlags1 &= ~PLAYER_STATE1_20;
Message_StartTextbox(play, 0x2794, &this->actor);
this->unk_2B4 = 0x2794;
- func_80151BB4(play, 0xB);
- func_80151BB4(play, 0x2B);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP);
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80A6F9C8(this);
} else {
@@ -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_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
index c94a94b12..db05f0d61 100644
--- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
+++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c
@@ -23,9 +23,9 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play);
void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play);
typedef enum {
- GORON_RACE_CHEAT_NO_CHEATING,
- GORON_RACE_CHEAT_FALSE_START,
- GORON_RACE_CHEAT_TRYING_TO_REACH_GOAL_FROM_BEHIND,
+ /* 0 */ GORON_RACE_CHEAT_NO_CHEATING,
+ /* 1 */ GORON_RACE_CHEAT_FALSE_START,
+ /* 2 */ GORON_RACE_CHEAT_TRYING_TO_REACH_GOAL_FROM_BEHIND
} PlayerCheatStatus;
ActorInit En_Mt_tag_InitVars = {
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..98b01d728 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
@@ -851,14 +851,14 @@ void func_80A6A508(Actor* thisx) {
}
void func_80A6A5C0(EnMushi2* this, PlayState* play) {
- EnMushi2* this2 = this;
+ Actor* thisx = &this->actor;
func_80A69D3C(this);
- Math_SmoothStepToF(&this->actor.speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
if (this->unk_354 < SQ(40.0f)) {
f32 temp = 1.0f - ((SQ(40.0f) - this->unk_354) * (1.0f / (10.0f * SQ(40.0f))));
- this->actor.speed *= temp;
+ thisx->speed *= temp;
}
func_80A68ED8(this);
@@ -867,8 +867,8 @@ void func_80A6A5C0(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = this->actor.speed * 1.6f;
- this2->skelAnime.playSpeed = CLAMP(this2->skelAnime.playSpeed, 0.1f, 1.9f);
+ this->skelAnime.playSpeed = thisx->speed * 1.6f;
+ this->skelAnime.playSpeed = CLAMP(this->skelAnime.playSpeed, 0.1f, 1.9f);
if ((this->unk_36A <= 0) || func_80A68BA0(this)) {
func_80A6B078(this);
@@ -895,9 +895,9 @@ void func_80A6A794(EnMushi2* this) {
}
void func_80A6A824(EnMushi2* this, PlayState* play) {
- EnMushi2* this2 = this;
+ Actor* thisx = &this->actor;
- Math_SmoothStepToF(&this->actor.speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
+ Math_SmoothStepToF(&thisx->speed, this->unk_35C, 0.1f, 0.5f, 0.0f);
func_80A68ED8(this);
func_80A697C4(this, play);
@@ -905,8 +905,8 @@ void func_80A6A824(EnMushi2* this, PlayState* play) {
func_80A69388(this);
}
- this->skelAnime.playSpeed = (Rand_ZeroOne() * 0.8f) + (this->actor.speed * 1.2f);
- this2->skelAnime.playSpeed = CLAMP(this2->skelAnime.playSpeed, 0.0f, 1.9f);
+ this->skelAnime.playSpeed = (Rand_ZeroOne() * 0.8f) + (thisx->speed * 1.2f);
+ this->skelAnime.playSpeed = CLAMP(this->skelAnime.playSpeed, 0.0f, 1.9f);
if ((this->unk_36A <= 0) || func_80A68BA0(this)) {
func_80A6B078(this);
@@ -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..6eceb89d6 100644
--- a/src/overlays/actors/ovl_En_Muto/z_en_muto.c
+++ b/src/overlays/actors/ovl_En_Muto/z_en_muto.c
@@ -74,7 +74,7 @@ void EnMuto_Init(Actor* thisx, PlayState* play) {
this->textIdIndex = 3;
}
- if (gSaveContext.save.day != 3 || !gSaveContext.save.isNight) {
+ if ((gSaveContext.save.day != 3) || !gSaveContext.save.isNight) {
Actor_Kill(&this->actor);
}
} else {
@@ -113,7 +113,7 @@ void EnMuto_SetHeadRotation(EnMuto* this) {
s32 yawRotToTarget = ABS_ALT(BINANG_SUB(this->yawTowardsTarget, this->actor.world.rot.y));
this->headRotTarget.y = 0;
- if (this->actor.xzDistToPlayer < 200.0f && yawRotToTarget < 0x4E20) {
+ if ((this->actor.xzDistToPlayer < 200.0f) && (yawRotToTarget < 0x4E20)) {
this->headRotTarget.y = BINANG_SUB(this->yawTowardsTarget, this->actor.world.rot.y);
if (this->headRotTarget.y > 0x2710) {
this->headRotTarget.y = 0x2710;
@@ -146,7 +146,7 @@ void EnMuto_Idle(EnMuto* this, PlayState* play) {
if (1) {} // Needed to match
- if (!this->isInMayorsRoom && Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) {
+ if (!this->isInMayorsRoom && (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK)) {
this->actor.textId = 0x2363;
}
@@ -229,8 +229,8 @@ void EnMuto_InDialogue(EnMuto* this, PlayState* play) {
}
}
- if (play->msgCtx.currentTextId == 0x2AC6 || play->msgCtx.currentTextId == 0x2AC7 ||
- play->msgCtx.currentTextId == 0x2AC8) {
+ if ((play->msgCtx.currentTextId == 0x2AC6) || (play->msgCtx.currentTextId == 0x2AC7) ||
+ (play->msgCtx.currentTextId == 0x2AC8)) {
this->skelAnime.playSpeed = 0.0f;
this->yawTowardsTarget = this->actor.yawTowardsPlayer;
this->skelAnime.curFrame = 30.0f;
@@ -254,7 +254,7 @@ void EnMuto_Update(Actor* thisx, PlayState* play2) {
EnMuto_SetHeadRotation(this);
}
- if (this->isInMayorsRoom && gSaveContext.save.day == 3 && gSaveContext.save.isNight) {
+ if (this->isInMayorsRoom && (gSaveContext.save.day == 3) && gSaveContext.save.isNight) {
Actor_Kill(&this->actor);
return;
}
@@ -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..79c2e5cba 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.c
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.c
@@ -43,7 +43,7 @@ typedef enum EnNbScheduleResult {
/* 1 */ EN_NB_SCH_1,
/* 2 */ EN_NB_SCH_2,
/* 3 */ EN_NB_SCH_3,
- /* 4 */ EN_NB_SCH_4,
+ /* 4 */ EN_NB_SCH_4
} EnNbScheduleResult;
static u8 sScheduleScript[] = {
@@ -66,7 +66,7 @@ static u8 sScheduleScript[] = {
/* 0x3E */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
/* 0x41 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_2),
/* 0x44 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
- /* 0x47 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_50_20, 0x57 - 0x4B),
+ /* 0x47 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x57 - 0x4B),
/* 0x4B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(8, 0, 18, 0, 0x54 - 0x51),
/* 0x51 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_3),
/* 0x54 */ SCHEDULE_CMD_RET_VAL_L(EN_NB_SCH_1),
@@ -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_Nb/z_en_nb.h b/src/overlays/actors/ovl_En_Nb/z_en_nb.h
index f11464c79..2a784e096 100644
--- a/src/overlays/actors/ovl_En_Nb/z_en_nb.h
+++ b/src/overlays/actors/ovl_En_Nb/z_en_nb.h
@@ -17,7 +17,7 @@ typedef enum EnNbAnimation {
/* 2 */ EN_NB_ANIM_TALK_ONCE,
/* 3 */ EN_NB_ANIM_TALK_LOOP,
/* 4 */ EN_NB_ANIM_ANGRY,
- /* 5 */ EN_NB_ANIM_RELIEVED,
+ /* 5 */ EN_NB_ANIM_RELIEVED
} EnNbAnimation;
typedef struct EnNb {
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..755385d00 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
@@ -57,7 +57,7 @@ typedef enum {
/* 0xC */ EN_NEO_REEBA_DMGEFF_HOOKSHOT = 0xC, // No damage, used only for hookshot
/* 0xD */ EN_NEO_REEBA_DMGEFF_ELECTRIC_STUN, // Electric effects, frozen in place
/* 0xE */ EN_NEO_REEBA_DMGEFF_NONE, // Normal hit
- /* 0xF */ EN_NEO_REEBA_DMGEFF_SHATTER, // Normal hit that can break ice if leever is frozen
+ /* 0xF */ EN_NEO_REEBA_DMGEFF_SHATTER // Normal hit that can break ice if leever is frozen
} EnNeoReebaDamageEffect;
static DamageTable sDamageTable = {
@@ -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..472196ae9 100644
--- a/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
+++ b/src/overlays/actors/ovl_En_Nimotsu/z_en_nimotsu.c
@@ -87,9 +87,9 @@ void EnNimotsu_Update(Actor* thisx, PlayState* play) {
}
if ((play->state.frames % 3) == 0) {
- dustPosition.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(15.0f);
+ dustPosition.x = this->actor.world.pos.x + Rand_CenteredFloat(15.0f);
dustPosition.y = this->actor.world.pos.y;
- dustPosition.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(15.0f);
+ dustPosition.z = this->actor.world.pos.z + Rand_CenteredFloat(15.0f);
Actor_SpawnFloorDustRing(play, &this->actor, &dustPosition, 20.0f, 0, 2.0f, 0, 0, 0);
}
}
@@ -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..0e96590d5 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.c
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.c
@@ -36,7 +36,7 @@ void EnNiw_SpawnFeather(EnNiw* this, Vec3f* pos, Vec3f* vel, Vec3f* accel, f32 s
s16 sCuccoStormActive = false;
// why wouldnt they just use actionFunc?
-enum EnNiwState {
+typedef enum EnNiwState {
/* 0 */ NIW_STATE_IDLE,
/* 1 */ NIW_STATE_ANGRY1, // 1/2/3 are stages of summoning cucco storm
/* 2 */ NIW_STATE_ANGRY2,
@@ -45,8 +45,8 @@ enum EnNiwState {
/* 5 */ NIW_STATE_FALLING,
/* 6 */ NIW_STATE_SWIMMING,
/* 7 */ NIW_STATE_RUNNING,
- /* 8 */ NIW_STATE_HOPPING,
-};
+ /* 8 */ NIW_STATE_HOPPING
+} EnNiwState;
ActorInit En_Niw_InitVars = {
ACTOR_EN_NIW,
@@ -188,6 +188,7 @@ void EnNiw_AnimateWingHead(EnNiw* this, PlayState* play, s16 animationState) {
this->targetLimbRots[2] = 0.0f; // both wingRotZ
this->targetLimbRots[1] = 0.0f;
break;
+
case NIW_ANIM_HEAD_PECKING:
this->unkTimer24E = 3;
this->targetLimbRots[2] = 7000.0f * tempOne; // both wingRotZ
@@ -235,6 +236,9 @@ void EnNiw_AnimateWingHead(EnNiw* this, PlayState* play, s16 animationState) {
this->targetLimbRots[7] = 10000.0f;
}
break;
+
+ default:
+ break;
}
}
@@ -271,12 +275,12 @@ void EnNiw_SpawnAttackNiw(EnNiw* this, PlayState* play) {
Vec3f newNiwPos;
Actor* attackNiw;
- if (this->attackNiwSpawnTimer == 0 && this->attackNiwCount < 7) {
+ if ((this->attackNiwSpawnTimer == 0) && (this->attackNiwCount < 7)) {
xView = play->view.at.x - play->view.eye.x;
yView = play->view.at.y - play->view.eye.y;
zView = play->view.at.z - play->view.eye.z;
newNiwPos.x = ((Rand_ZeroOne() - 0.5f) * xView) + play->view.eye.x;
- newNiwPos.y = randPlusMinusPoint5Scaled(0.3f) + (play->view.eye.y + 50.0f + (yView * 0.5f));
+ newNiwPos.y = Rand_CenteredFloat(0.3f) + (play->view.eye.y + 50.0f + (yView * 0.5f));
newNiwPos.z = ((Rand_ZeroOne() - 0.5f) * zView) + play->view.eye.z;
attackNiw = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ATTACK_NIW, newNiwPos.x,
newNiwPos.y, newNiwPos.z, 0, 0, 0, ATTACK_NIW_REGULAR);
@@ -312,7 +316,7 @@ void EnNiw_UpdateRunning(EnNiw* this, PlayState* play, s32 isStormCucco) {
runningDirection = -runningAngles[isStormCucco];
}
- if (isStormCucco == true && (this->runAwayTimer == 0 || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
+ if ((isStormCucco == true) && ((this->runAwayTimer == 0) || (this->actor.bgCheckFlags & BGCHECKFLAG_WALL))) {
this->runAwayTimer = 150;
if (this->yawTimer == 0) {
this->yawTimer = 70;
@@ -336,8 +340,8 @@ void EnNiw_SetupIdle(EnNiw* this) {
void EnNiw_Idle(EnNiw* this, PlayState* play) {
f32 posX2;
f32 posZ2;
- f32 posX1 = randPlusMinusPoint5Scaled(100.0f);
- f32 posZ1 = randPlusMinusPoint5Scaled(100.0f);
+ f32 posX1 = Rand_CenteredFloat(100.0f);
+ f32 posZ1 = Rand_CenteredFloat(100.0f);
s16 nextAnimIndex;
if (this->niwType == NIW_TYPE_REGULAR) {
@@ -367,7 +371,7 @@ void EnNiw_Idle(EnNiw* this, PlayState* play) {
Math_ApproachF(&this->targetLimbRots[9], sHeadRotations[this->headRotationToggle], 0.5f, 4000.0f); // head rot
}
- if (this->unkIdleTimer2 == 0 && this->unkIdleTimer == 0) {
+ if ((this->unkIdleTimer2 == 0) && (this->unkIdleTimer == 0)) {
this->unk298++;
if (this->unk298 > 7) {
this->unkIdleTimer2 = Rand_ZeroFloat(30.0f);
@@ -434,9 +438,9 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
this->heldTimer = (s32)(Rand_ZeroFloat(1.0f) * 10.0f) + 10;
}
- this->actor.shape.rot.x = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.x;
- this->actor.shape.rot.y = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.y;
- this->actor.shape.rot.z = (s16)randPlusMinusPoint5Scaled(5000.0f) + this->actor.world.rot.z;
+ this->actor.shape.rot.x = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.x;
+ this->actor.shape.rot.y = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.y;
+ this->actor.shape.rot.z = (s16)(s32)Rand_CenteredFloat(0x1388) + this->actor.world.rot.z;
if (this->niwType == NIW_TYPE_REGULAR) {
if (Actor_HasNoParent(&this->actor, play)) {
this->actor.shape.rot.z = 0;
@@ -469,14 +473,14 @@ void EnNiw_Held(EnNiw* this, PlayState* play) {
void EnNiw_Thrown(EnNiw* this, PlayState* play) {
if (this->unk2EC == 0) {
- if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
- this->unk2EC = 1;
- this->hoppingTimer = 80; // hop timer
- this->actor.speed = 0.0f;
- this->actor.velocity.y = 4.0f;
- } else {
- return; // wait until back on floor
+ if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) {
+ // wait until back on floor
+ return;
}
+ this->unk2EC = 1;
+ this->hoppingTimer = 80;
+ this->actor.speed = 0.0f;
+ this->actor.velocity.y = 4.0f;
} else {
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
this->sfxTimer1 = 0;
@@ -683,10 +687,10 @@ void EnNiw_LandBeforeIdle(EnNiw* this, PlayState* play) {
}
void EnNiw_CheckRage(EnNiw* this, PlayState* play) {
- if (!this->isStormActive && this->iframeTimer == 0 && this->niwType == NIW_TYPE_REGULAR) {
+ if (!this->isStormActive && (this->iframeTimer == 0) && (this->niwType == NIW_TYPE_REGULAR)) {
// is this used? this is before we even know if we've been hit
- if (this->niwState != NIW_STATE_RUNNING && this->unk2BC.x != 90000.0f) {
+ if ((this->niwState != NIW_STATE_RUNNING) && (this->unk2BC.x != 90000.0f)) {
this->iframeTimer = 10;
this->sfxTimer1 = 30;
this->unk29E = 1;
@@ -703,7 +707,7 @@ void EnNiw_CheckRage(EnNiw* this, PlayState* play) {
this->actor.colChkInfo.health--;
}
- if (!sCuccoStormActive && this->actor.colChkInfo.health == 0) {
+ if (!sCuccoStormActive && (this->actor.colChkInfo.health == 0)) {
this->runAwayTimer = 100; // main cucco will run away after storm starts
sCuccoStormActive = true;
this->unk298 = 0;
@@ -769,21 +773,21 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
featherCount = 4;
}
for (i = 0; i < featherCount; i++) {
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.x;
- pos.y = randPlusMinusPoint5Scaled(10.0f) + (this->actor.world.pos.y + this->unk308);
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->actor.world.pos.x;
+ pos.y = Rand_CenteredFloat(10.0f) + (this->actor.world.pos.y + this->unk308);
+ pos.z = Rand_CenteredFloat(10.0f) + this->actor.world.pos.z;
featherScale = Rand_ZeroFloat(6.0f) + 6.0f;
- if (this->unk29E == 2 && this->unk308 != 0) {
+ if ((this->unk29E == 2) && (this->unk308 != 0)) {
pos.y += 10.0f;
}
if (this->unk308 == 0) {
featherScale = Rand_ZeroFloat(2.0f) + 2.0f;
}
- vel.x = randPlusMinusPoint5Scaled(3.0f);
+ vel.x = Rand_CenteredFloat(3.0f);
vel.y = Rand_ZeroFloat(2.0f) * 0.5f + 2.0f;
- vel.z = randPlusMinusPoint5Scaled(3.0f);
+ vel.z = Rand_CenteredFloat(3.0f);
accel.z = accel.x = 0.0f;
accel.y = -0.15f;
@@ -817,7 +821,7 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
UPDBGCHECKINFO_FLAG_8 | UPDBGCHECKINFO_FLAG_10);
// if cucco is off the map
- if (this->actor.floorHeight <= BGCHECK_Y_MIN || this->actor.floorHeight >= BGCHECK_Y_MAX) {
+ if ((this->actor.floorHeight <= BGCHECK_Y_MIN) || (this->actor.floorHeight >= BGCHECK_Y_MAX)) {
Vec3f viewAtToEye;
// Direction vector for the direction the camera is facing
@@ -881,12 +885,12 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
return;
}
- if (this->isStormActive && (this->actor.xyzDistToPlayerSq < SQ(dist)) && player->invincibilityTimer == 0) {
+ if (this->isStormActive && (this->actor.xyzDistToPlayerSq < SQ(dist)) && (player->invincibilityTimer == 0)) {
func_800B8D50(play, &this->actor, 2.0f, this->actor.world.rot.y, 0.0f, 0x10);
}
EnNiw_CheckRage(this, play);
- if (this->flutterSfxTimer == 0 && this->niwState == NIW_STATE_HELD) {
+ if ((this->flutterSfxTimer == 0) && (this->niwState == NIW_STATE_HELD)) {
this->flutterSfxTimer = 7;
Actor_PlaySfx(&this->actor, NA_SE_EN_CHICKEN_FLUTTER);
}
@@ -901,13 +905,13 @@ void EnNiw_Update(Actor* thisx, PlayState* play) {
}
}
- if (!this->isStormActive && this->niwType == NIW_TYPE_REGULAR) {
+ if (!this->isStormActive && (this->niwType == NIW_TYPE_REGULAR)) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
if (play) {}
- if (this->niwState != NIW_STATE_HELD && this->niwState != NIW_STATE_FALLING) {
+ if ((this->niwState != NIW_STATE_HELD) && (this->niwState != NIW_STATE_FALLING)) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -938,7 +942,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 +1006,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_Niw/z_en_niw.h b/src/overlays/actors/ovl_En_Niw/z_en_niw.h
index c60397535..06f487800 100644
--- a/src/overlays/actors/ovl_En_Niw/z_en_niw.h
+++ b/src/overlays/actors/ovl_En_Niw/z_en_niw.h
@@ -106,7 +106,7 @@ typedef enum {
/* 2 */ NIW_ANIM_PECKING_AND_WAVING, // wings move along their axis, like human hand waving
/* 3 */ NIW_ANIM_PECKING_AND_FORFLAPPING, // (unused) low (yaw based) flapping, forward and back
/* 4 */ NIW_ANIM_FREEZE, // used during Cucco Storm
- /* 5 */ NIW_ANIM_PECKING_SLOW_FORFLAPPING, // wing speed half that of 3
+ /* 5 */ NIW_ANIM_PECKING_SLOW_FORFLAPPING // wing speed half that of 3
} EnNiwHeadAndWingAnimationState;
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..2f8914edc 100644
--- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
+++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c
@@ -32,14 +32,14 @@ void EnNwc_DrawAdultBody(Actor* thisx, PlayState* play);
s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx);
EnHs* EnNwc_FindGrog(PlayState* play);
-enum EnNiwState {
- /* -1 */ NWC_STATE_NIW_LOADED = -1, // set after loading object_niw
- /* 0 */ NWC_STATE_CHECK_BREMAN = 0, // checking for breman mask
- /* 1 */ NWC_STATE_TURNING, // turning to face a new direction to explore
- /* 2 */ NWC_STATE_HOPPING_FORWARD, // hopping to go explore
- /* 3 */ NWC_STATE_FOLLOWING, // following the player
- /* 4 */ NWC_STATE_RUNNING, // running from the player after failed breman march
-};
+typedef enum EnNwcState {
+ /* -1 */ NWC_STATE_NIW_LOADED = -1, // set after loading object_niw
+ /* 0 */ NWC_STATE_CHECK_BREMAN, // checking for breman mask
+ /* 1 */ NWC_STATE_TURNING, // turning to face a new direction to explore
+ /* 2 */ NWC_STATE_HOPPING_FORWARD, // hopping to go explore
+ /* 3 */ NWC_STATE_FOLLOWING, // following the player
+ /* 4 */ NWC_STATE_RUNNING // running from the player after failed breman march
+} EnNwcState;
ActorInit En_Nwc_InitVars = {
ACTOR_EN_NWC,
@@ -110,9 +110,9 @@ void EnNwc_SpawnDust(EnNwc* this, PlayState* play) {
vec5.z = this->actor.world.pos.z - 5.0f * Math_CosS(yaw) * Math_CosS(pitch);
for (i = 0; i < 5; i++) {
- vel.x = randPlusMinusPoint5Scaled(4.0f);
- vel.y = randPlusMinusPoint5Scaled(4.0f);
- vel.z = randPlusMinusPoint5Scaled(4.0f);
+ vel.x = Rand_CenteredFloat(4.0f);
+ vel.y = Rand_CenteredFloat(4.0f);
+ vel.z = Rand_CenteredFloat(4.0f);
accel.x = -vel.x * 0.1f;
accel.y = -vel.y * 0.1f;
accel.z = -vel.z * 0.1f;
@@ -164,7 +164,7 @@ s32 EnNwc_IsFound(EnNwc* this, PlayState* play) {
return false;
}
- if ((player->stateFlags3 & PLAYER_STATE3_20000000) && this->actor.xzDistToPlayer < 100.0f) {
+ if ((player->stateFlags3 & PLAYER_STATE3_20000000) && (this->actor.xzDistToPlayer < 100.0f)) {
return true;
}
@@ -178,26 +178,34 @@ void EnNwc_ChangeState(EnNwc* this, s16 newState) {
this->stateTimer = 10;
this->actionFunc = EnNwc_CheckForBreman;
break;
+
case NWC_STATE_TURNING:
this->stateTimer = Rand_ZeroFloat(20.0f) + 15.0f;
this->actionFunc = EnNwc_Turn;
- this->fallingRotY = (s16)(s32)randPlusMinusPoint5Scaled(65536.0f);
+ this->fallingRotY = (s16)(s32)Rand_CenteredFloat(0x10000);
break;
+
case NWC_STATE_HOPPING_FORWARD:
this->stateTimer = Rand_ZeroFloat(20.0f) + 15.0f;
this->actionFunc = EnNwc_HopForward;
break;
+
case NWC_STATE_FOLLOWING:
this->actionFunc = EnNwc_Follow;
this->transformTimer = 0;
- this->randomRot = (s16)(s32)randPlusMinusPoint5Scaled(10000.0f);
+ this->randomRot = (s16)(s32)Rand_CenteredFloat(0x2710);
break;
+
case NWC_STATE_RUNNING:
- this->actor.world.rot.y = this->actor.home.rot.z * 0x3000 & 0xFFFF; // Fake Match?: & 0xFFFF
+ //! FAKE: & 0xFFFF
+ this->actor.world.rot.y = this->actor.home.rot.z * 0x3000 & 0xFFFF;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->stateTimer = Rand_ZeroFloat(40.0f) + 120.0f;
this->actionFunc = EnNwc_RunAway;
break;
+
+ default:
+ break;
}
this->state = newState;
@@ -289,7 +297,7 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
Math_SmoothStepToS(&this->upperBodyRotY, targetUpperBodyRot, 2, 0x1B58, 0x3E8);
} else { // NOT grown up
- if ((this->stateTimer & 3) == 3 && this->stateTimer & 20) {
+ if (((this->stateTimer & 3) == 3) && ((this->stateTimer & 0x14) != 0)) {
this->actor.velocity.y = 2.0f; // hop up and down
}
if ((this->stateTimer & 0x1B) == 24) {
@@ -323,7 +331,7 @@ void EnNwc_Follow(EnNwc* this, PlayState* play) {
}
} else { // not too close: keep moving
- this->randomRot += (s16)randPlusMinusPoint5Scaled(1500.0f);
+ this->randomRot += (s16)(s32)Rand_CenteredFloat(0x5DC);
if (this->randomRot > 0x1388) {
this->randomRot = 0x1388;
} else if (this->randomRot < -0x1388) {
@@ -473,7 +481,7 @@ void EnNwc_Update(Actor* thisx, PlayState* play) {
this->blinkTimer = Rand_S16Offset(0x3C, 0x3C);
}
- if (this->blinkTimer == 1 || this->blinkTimer == 3) {
+ if ((this->blinkTimer == 1) || (this->blinkTimer == 3)) {
this->blinkState = true;
} else {
this->blinkState = false;
@@ -487,7 +495,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;
@@ -508,7 +516,7 @@ s32 EnNwc_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
if (limbIndex == NIW_LIMB_UPPER_BODY) {
rot->y += this->upperBodyRotY;
}
- if (limbIndex == NIW_LIMB_RIGHT_WING_ROOT || limbIndex == NIW_LIMB_LEFT_WING_ROOT) {
+ if ((limbIndex == NIW_LIMB_RIGHT_WING_ROOT) || (limbIndex == NIW_LIMB_LEFT_WING_ROOT)) {
rot->y += this->footRotY;
rot->z += this->footRotZ;
}
@@ -519,7 +527,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..c1ce34949 100644
--- a/src/overlays/actors/ovl_En_Osk/z_en_osk.c
+++ b/src/overlays/actors/ovl_En_Osk/z_en_osk.c
@@ -118,9 +118,9 @@ void func_80BF5E68(EnOsk* this, AnimationHeader** animations, s16 index, f32 pla
void func_80BF5EBC(EnOsk* this, PlayState* play) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.x;
- sp2C.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.z;
- sp2C.y = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.y;
+ sp2C.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x;
+ sp2C.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z;
+ sp2C.y = Rand_CenteredFloat(30.0f) + this->actor.world.pos.y;
func_800B3030(play, &sp2C, &D_80BF7018, &D_80BF7018, 100, 0, 2);
}
@@ -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 2444acca5..7ada3a223 100644
--- a/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -198,7 +198,7 @@ void EnOssan_SetupAction(EnOssan* this, EnOssanActionFunc action) {
s32 EnOssan_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -210,7 +210,7 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
switch (gSaveContext.save.day) {
case 1:
case 2:
- if (gSaveContext.save.time <= CLOCK_TIME(21, 30) && gSaveContext.save.time > CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.time <= CLOCK_TIME(21, 30)) && (gSaveContext.save.time > CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
@@ -218,16 +218,20 @@ void EnOssan_CheckValidSpawn(EnOssan* this) {
Actor_Kill(&this->actor);
}
break;
+
case 3:
if (this->actor.params == ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
- if (!(gSaveContext.save.time <= CLOCK_TIME(22, 00) && gSaveContext.save.time >= CLOCK_TIME(6, 00))) {
+ if ((gSaveContext.save.time > CLOCK_TIME(22, 00)) || (gSaveContext.save.time < CLOCK_TIME(6, 00))) {
if (this->actor.params != ENOSSAN_CURIOSITY_SHOP_MAN) {
Actor_Kill(&this->actor);
}
}
break;
+
+ default:
+ break;
}
}
@@ -377,9 +381,9 @@ void EnOssan_Idle(EnOssan* this, PlayState* play) {
this->cutsceneState = ENOSSAN_CUTSCENESTATE_WAITING;
}
} else {
- if (this->actor.xzDistToPlayer < 100.0f &&
- (player->actor.world.pos.x >= -40.0f && player->actor.world.pos.x <= 40.0f) &&
- (player->actor.world.pos.z >= -91.0f && player->actor.world.pos.z <= -60.0f)) {
+ if ((this->actor.xzDistToPlayer < 100.0f) && (player->actor.world.pos.x >= -40.0f) &&
+ (player->actor.world.pos.x <= 40.0f) && (player->actor.world.pos.z >= -91.0f) &&
+ (player->actor.world.pos.z <= -60.0f)) {
func_800B8614(&this->actor, play, 100.0f);
}
if (this->actor.params == ENOSSAN_PART_TIME_WORKER) {
@@ -411,11 +415,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_FORWARD;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_FORWARD);
break;
+
case FSN_ANIM_TURN_AROUND_FORWARD:
EnOssan_SetHaveMet(this);
this->textId = EnOssan_CuriosityShopMan_GetWelcome(this, play);
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, this->animIndex);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_START:
case FSN_ANIM_HAND_ON_FACE_START:
case FSN_ANIM_LEAN_FORWARD_START:
@@ -425,6 +431,7 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
Message_StartTextbox(play, this->textId, &this->actor);
EnOssan_SetupStartShopping(play, this, false);
break;
+
case FSN_ANIM_HANDS_ON_COUNTER_LOOP:
case FSN_ANIM_HAND_ON_FACE_LOOP:
case FSN_ANIM_LEAN_FORWARD_LOOP:
@@ -432,11 +439,13 @@ void EnOssan_BeginInteraction(EnOssan* this, PlayState* play) {
this->animIndex = FSN_ANIM_TURN_AROUND_REVERSE;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_TURN_AROUND_REVERSE);
break;
+
case FSN_ANIM_TURN_AROUND_REVERSE:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
EnOssan_SetupAction(this, EnOssan_Idle);
break;
+
default:
this->animIndex = FSN_ANIM_SCRATCH_BACK;
SubS_ChangeAnimationByInfoS(&this->skelAnime, animationInfo, FSN_ANIM_SCRATCH_BACK);
@@ -459,11 +468,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
this->moveHorizontal = this->moveVertical = false;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
this->moveHorizontal = true;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -477,11 +486,11 @@ void EnOssan_UpdateJoystickInputState(PlayState* play, EnOssan* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
this->moveVertical = true;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -533,9 +542,9 @@ u8 EnOssan_SetCursorIndexFromNeutral(EnOssan* this, u8 shelfOffset) {
u8 EnOssan_CursorRight(EnOssan* this, u8 cursorIndex, u8 shelfSlotMin) {
u8 end = shelfSlotMin + 4;
- while (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ while ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
cursorIndex -= 2;
- if (cursorIndex >= shelfSlotMin && cursorIndex < end) {
+ if ((cursorIndex >= shelfSlotMin) && (cursorIndex < end)) {
if (this->items[cursorIndex] != NULL) {
return cursorIndex;
}
@@ -607,12 +616,15 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, PlayState* play) {
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = false;
return true;
+
case 1:
func_8019F230();
EnOssan_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
@@ -656,7 +668,7 @@ void EnOssan_FaceShopkeeper(EnOssan* this, PlayState* play) {
return;
}
}
- if (this->actor.params == ENOSSAN_PART_TIME_WORKER && player->transformation != PLAYER_FORM_ZORA) {
+ if ((this->actor.params == ENOSSAN_PART_TIME_WORKER) && (player->transformation != PLAYER_FORM_ZORA)) {
Math_SmoothStepToS(&this->partTimerHeadRot.y, 8000, 3, 2000, 0);
}
}
@@ -871,7 +883,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -879,7 +891,7 @@ void EnOssan_BrowseLeftShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ } else if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 8);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -929,7 +941,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
}
}
} else {
- if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ if ((this->stickAccumX < 0) && (this->stickAccumX < -500)) {
cursorIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -937,7 +949,7 @@ void EnOssan_BrowseRightShelf(EnOssan* this, PlayState* play) {
EnOssan_SetupLookToShopkeeperFromShelf(play, this);
return;
}
- } else if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ } else if ((this->stickAccumX > 0) && (this->stickAccumX > 500)) {
cursorIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
if (cursorIndex != CURSOR_INVALID) {
this->cursorIndex = cursorIndex;
@@ -1016,6 +1028,7 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -1024,27 +1037,35 @@ void EnOssan_HandleCanBuyItem(PlayState* play, EnOssan* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
case CANBUY_RESULT_NO_ROOM_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW_2:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sCannotGetNowTextIds[this->actor.params]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnOssan_SetupCannotBuy(play, this, sNoRoomTextIds[this->actor.params]);
break;
+
+ default:
+ break;
}
}
@@ -1058,11 +1079,15 @@ void EnOssan_SelectItem(EnOssan* this, PlayState* play) {
case 0:
EnOssan_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, this->items[this->cursorIndex]->actor.textId);
break;
+
+ default:
+ break;
}
}
}
@@ -1134,6 +1159,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
EnOssan_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 100.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
@@ -1142,7 +1168,7 @@ void EnOssan_ContinueShopping(EnOssan* this, PlayState* play) {
}
}
}
- } else if (talkState == TEXT_STATE_5 && Message_ShouldAdvance(play)) {
+ } else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
EnOssan_ResetItemPosition(this);
item = this->items[this->cursorIndex];
item->restockFunc(play, item);
@@ -1241,11 +1267,11 @@ void EnOssan_UpdateItemSelectedProperty(EnOssan* this) {
for (i = 0; i < ARRAY_COUNT(this->items); i++, items++) {
item = *items;
if (item != NULL) {
- if (this->actionFunc != EnOssan_SelectItem && this->actionFunc != EnOssan_CannotBuy &&
- this->drawCursor == 0) {
+ if ((this->actionFunc != EnOssan_SelectItem) && (this->actionFunc != EnOssan_CannotBuy) &&
+ (this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIndex == i ? true : false;
+ item->isSelected = (this->cursorIndex == i) ? true : false;
}
}
}
@@ -1383,6 +1409,7 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
this->animIndex = FSN_ANIM_SLAM_COUNTER_START;
@@ -1390,21 +1417,25 @@ u16 EnOssan_CuriosityShopMan_GetWelcome(EnOssan* this, PlayState* play) {
return sWelcomeDekuTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_ZORA:
this->animIndex = FSN_ANIM_LEAN_FORWARD_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_08)) {
return sWelcomeZoraTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
case PLAYER_FORM_GORON:
this->animIndex = FSN_ANIM_HAND_ON_FACE_START;
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_18_04)) {
return sWelcomeGoronTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
+
+ default:
+ this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
+ return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
- this->animIndex = FSN_ANIM_HANDS_ON_COUNTER_START;
- return sWelcomeHumanTextIds[ENOSSAN_CURIOSITY_SHOP_MAN];
}
u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
@@ -1415,24 +1446,29 @@ u16 EnOssan_PartTimer_GetWelcome(EnOssan* this, PlayState* play) {
this->flags |= END_INTERACTION;
return textId;
}
+
switch (player->transformation) {
case PLAYER_FORM_DEKU:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_10)) {
return sWelcomeDekuTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeDekuFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_ZORA:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_08)) {
return sWelcomeZoraTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeZoraFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
case PLAYER_FORM_GORON:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_55_04)) {
return sWelcomeGoronTextIds[ENOSSAN_PART_TIME_WORKER];
}
return sWelcomeGoronFirstTimeTextIds[ENOSSAN_PART_TIME_WORKER];
+
+ default:
+ return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
- return sWelcomeHumanTextIds[ENOSSAN_PART_TIME_WORKER];
}
void EnOssan_SetHaveMet(EnOssan* this) {
@@ -1440,21 +1476,29 @@ void EnOssan_SetHaveMet(EnOssan* this) {
case 0x06A9:
SET_WEEKEVENTREG(WEEKEVENTREG_18_10);
break;
+
case 0x06C6:
SET_WEEKEVENTREG(WEEKEVENTREG_55_10);
break;
+
case 0x06A7:
SET_WEEKEVENTREG(WEEKEVENTREG_18_08);
break;
+
case 0x06C4:
SET_WEEKEVENTREG(WEEKEVENTREG_55_08);
break;
+
case 0x06A5:
SET_WEEKEVENTREG(WEEKEVENTREG_18_04);
break;
+
case 0x06C2:
SET_WEEKEVENTREG(WEEKEVENTREG_55_04);
break;
+
+ default:
+ break;
}
}
@@ -1575,7 +1619,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 +1681,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,
@@ -1698,7 +1742,8 @@ s32 EnOssan_PartTimer_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dLi
void EnOssan_CuriosityShopMan_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnOssan* this = THIS;
- if (limbIndex == FSN_LIMB_PELVIS || limbIndex == FSN_LIMB_LEFT_UPPER_ARM || limbIndex == FSN_LIMB_RIGHT_UPPER_ARM) {
+ if ((limbIndex == FSN_LIMB_PELVIS) || (limbIndex == FSN_LIMB_LEFT_UPPER_ARM) ||
+ (limbIndex == FSN_LIMB_RIGHT_UPPER_ARM)) {
rot->y += (s16)Math_SinS(this->limbRotTableY[limbIndex]) * 200;
rot->z += (s16)Math_CosS(this->limbRotTableZ[limbIndex]) * 200;
}
@@ -1720,7 +1765,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 +1783,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..df6d3708f 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"
@@ -670,6 +671,9 @@ void func_80B5CD40(EnOt* this, PlayState* play) {
func_80B5CE6C(this, play);
}
break;
+
+ default:
+ break;
}
}
@@ -1031,8 +1035,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 +1048,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 +1143,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..e5b4cabe3 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.c
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
@@ -44,8 +44,8 @@ void EnOwl_ChangeMode(EnOwl* this, EnOwlActionFunc actionFunc, EnOwlFunc unkFunc
AnimationHeader* animation, f32 morphFrames);
typedef enum {
- /* 0x00 */ OWL_REPEAT,
- /* 0x01 */ OWL_OK
+ /* 0 */ OWL_REPEAT,
+ /* 1 */ OWL_OK
} EnOwlMessageChoice;
ActorInit En_Owl_InitVars = {
@@ -271,7 +271,7 @@ void func_8095AB1C(EnOwl* this, PlayState* play) {
}
void func_8095AB4C(EnOwl* this) {
- if (randPlusMinusPoint5Scaled(1.0f) < 0.0f) {
+ if (Rand_CenteredFloat(1.0f) < 0.0f) {
this->actionFlags |= 0x20;
} else {
this->actionFlags &= ~0x20;
@@ -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_Owl/z_en_owl.h b/src/overlays/actors/ovl_En_Owl/z_en_owl.h
index 5e02aba94..095434fa0 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.h
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.h
@@ -17,7 +17,7 @@ typedef enum {
/* 0x002 */ ENOWL_GET_TYPE_2,
/* 0x003 */ ENOWL_GET_TYPE_3,
/* 0x01E */ ENOWL_GET_TYPE_30 = 30,
- /* 0x3E8 */ ENOWL_GET_TYPE_1000 = 1000,
+ /* 0x3E8 */ ENOWL_GET_TYPE_1000 = 1000
} EnOwlType;
typedef struct EnOwl {
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..e47515c5d 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c
@@ -154,8 +154,6 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
func_80BD8588(this, play);
func_80BD8658(this);
- if (1) {}
-
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_75_20) || (gSaveContext.save.entrance == ENTRANCE(IKANA_CANYON, 9))) {
Actor_Kill(&this->actor);
@@ -169,9 +167,9 @@ void EnPamera_Init(Actor* thisx, PlayState* play) {
}
func_80BD8700(this);
} else {
- this->pathIndex = this->pathPointsCount - 1;
- Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathIndex]);
- Math_Vec3s_ToVec3f(&sp44, &this->pathPoints[this->pathIndex - 1]);
+ this->waypointIndex = this->pathCount - 1;
+ Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->waypointIndex]);
+ Math_Vec3s_ToVec3f(&sp44, &this->pathPoints[this->waypointIndex - 1]);
this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&sp44, &this->actor.world.pos);
func_80BD8CCC(this);
}
@@ -197,19 +195,19 @@ s32 func_80BD84F0(EnPamera* this, PlayState* play) {
}
void func_80BD8588(EnPamera* this, PlayState* play) {
- Path* path = &play->setupPathList[((this->actor.params & 0xFF0) >> 4)];
+ Path* path = &play->setupPathList[ENPAMERA_GET_PATH_INDEX(&this->actor)];
Vec3f sp28;
if (path == NULL) {
Actor_Kill(&this->actor);
}
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_61_04)) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
- this->pathPointsCount = path->count;
- this->pathId = path->unk1;
+ this->waypointIndex = 0;
+ this->pathCount = path->count;
+ this->additionalPathIndex = path->additionalPathIndex;
Math_Vec3s_ToVec3f(&sp28, this->pathPoints);
this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &sp28);
}
@@ -244,8 +242,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;
@@ -325,15 +323,15 @@ void func_80BD8B70(EnPamera* this, PlayState* play) {
Vec3f vec;
s16 sp32;
- vec.x = this->pathPoints[this->pathIndex].x;
- vec.y = this->pathPoints[this->pathIndex].y;
- vec.z = this->pathPoints[this->pathIndex].z;
+ vec.x = this->pathPoints[this->waypointIndex].x;
+ vec.y = this->pathPoints[this->waypointIndex].y;
+ vec.z = this->pathPoints[this->waypointIndex].z;
sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &vec);
if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &vec, this->actor.speed) > 10.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp32, 0xA, 0x3000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (this->pathIndex < (this->pathPointsCount - 1)) {
- this->pathIndex++;
+ } else if (this->waypointIndex < (this->pathCount - 1)) {
+ this->waypointIndex++;
} else {
func_80BD8CCC(this);
}
@@ -358,8 +356,8 @@ void func_80BD8D1C(EnPamera* this, PlayState* play) {
}
void func_80BD8D80(EnPamera* this) {
- if (this->pathIndex > 0) {
- this->pathIndex--;
+ if (this->waypointIndex > 0) {
+ this->waypointIndex--;
}
this->actor.gravity = -2.0f;
this->actionFunc = func_80BD8DB0;
@@ -369,15 +367,15 @@ void func_80BD8DB0(EnPamera* this, PlayState* play) {
Vec3f vec;
s16 sp32;
- vec.x = this->pathPoints[this->pathIndex].x;
- vec.y = this->pathPoints[this->pathIndex].y;
- vec.z = this->pathPoints[this->pathIndex].z;
+ vec.x = this->pathPoints[this->waypointIndex].x;
+ vec.y = this->pathPoints[this->waypointIndex].y;
+ vec.z = this->pathPoints[this->waypointIndex].z;
sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &vec);
if (Math_Vec3f_StepToXZ(&this->actor.world.pos, &vec, this->actor.speed) > 10.0f) {
Math_SmoothStepToS(&this->actor.shape.rot.y, sp32, 0xA, 0x3000, 0x100);
this->actor.world.rot.y = this->actor.shape.rot.y;
- } else if (this->pathIndex > 0) {
- this->pathIndex--;
+ } else if (this->waypointIndex > 0) {
+ this->waypointIndex--;
} else {
func_80BD9338(this, play);
func_80BD8A38(this);
@@ -406,9 +404,9 @@ void func_80BD8FF0(EnPamera* this) {
Vec3f pameraPos;
s16 pameraYaw;
- this->pathIndex = this->pathPointsCount - 1;
- Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathPointsCount - 1]);
- Math_Vec3s_ToVec3f(&pameraPos, &this->pathPoints[this->pathPointsCount - 2]);
+ this->waypointIndex = this->pathCount - 1;
+ Math_Vec3s_ToVec3f(&this->actor.world.pos, &this->pathPoints[this->pathCount - 1]);
+ Math_Vec3s_ToVec3f(&pameraPos, &this->pathPoints[this->pathCount - 2]);
pameraYaw = Math_Vec3f_Yaw(&pameraPos, &this->actor.world.pos);
this->actor.shape.rot.y = pameraYaw;
this->actor.world.rot.y = pameraYaw;
@@ -424,15 +422,15 @@ void func_80BD90AC(EnPamera* this, PlayState* play) {
if (Player_GetMask(play) != PLAYER_MASK_STONE && (this->actionFunc != func_80BD8758) &&
(this->actionFunc != func_80BD8964) && (this->actionFunc != func_80BD8A7C) &&
- (this->actionFunc != func_80BD8F60) && ((this->actionFunc != func_80BD8B70) || (this->pathIndex != 0)) &&
+ (this->actionFunc != func_80BD8F60) && ((this->actionFunc != func_80BD8B70) || (this->waypointIndex != 0)) &&
((this->actionFunc != func_80BD8DB0) || (this->actor.speed != 3.0f)) &&
((this->actor.xzDistToPlayer < 150.0f) ||
((this->actionFunc == func_80BD909C) &&
(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]);
@@ -458,14 +456,14 @@ s32 func_80BD9234(EnPamera* this, PlayState* play) {
void func_80BD92D0(EnPamera* this, PlayState* play) {
Path* path;
- s32 pathId = this->pathId;
+ s32 pathIndex = this->additionalPathIndex;
- path = &play->setupPathList[pathId];
- if (pathId >= 0) {
+ path = &play->setupPathList[pathIndex];
+ if (pathIndex >= 0) {
this->pathPoints = Lib_SegmentedToVirtual(path->points);
- this->pathIndex = 0;
- this->pathPointsCount = path->count;
- this->pathId = path->unk1;
+ this->waypointIndex = 0;
+ this->pathCount = path->count;
+ this->additionalPathIndex = path->additionalPathIndex;
}
}
@@ -556,12 +554,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);
}
@@ -599,7 +599,6 @@ void func_80BD9938(EnPamera* this) {
void func_80BD994C(EnPamera* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
if (Player_GetMask(play) == PLAYER_MASK_GIBDO) {
- if (1) {}
func_80BD93CC(this, 0, 1);
Message_StartTextbox(play, 0x15A8, &this->actor);
diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
index 59bf40e09..4fa3e4f5f 100644
--- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
+++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.h
@@ -9,6 +9,8 @@ struct EnPamera;
typedef void (*EnPameraActionFunc)(struct EnPamera*, PlayState*);
typedef void (*EnPameraSetupFunc)(struct EnPamera*, PlayState*);
+#define ENPAMERA_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF0) >> 4)
+
typedef struct EnPamera {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
@@ -16,9 +18,9 @@ typedef struct EnPamera {
/* 0x1D4 */ EnPameraActionFunc actionFunc;
/* 0x1D8 */ EnPameraSetupFunc setupFunc;
/* 0x1DC */ Vec3s* pathPoints;
- /* 0x1E0 */ s32 pathIndex;
- /* 0x1E4 */ s32 pathPointsCount;
- /* 0x1E8 */ s32 pathId;
+ /* 0x1E0 */ s32 waypointIndex;
+ /* 0x1E4 */ s32 pathCount;
+ /* 0x1E8 */ s32 additionalPathIndex;
/* 0x1EC */ s32 unk_1EC;
/* 0x1F0 */ Vec3s jointTable[PAMELA_LIMB_MAX];
/* 0x27A */ Vec3s morphTable[PAMELA_LIMB_MAX];
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..4c75fac65 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -80,12 +80,12 @@ ActorInit En_Pametfrog_InitVars = {
};
typedef enum {
- /* 0x0 */ GEKKO_DMGEFF_NONE,
- /* 0x1 */ GEKKO_DMGEFF_STUN,
- /* 0x2 */ GEKKO_DMGEFF_FIRE,
- /* 0x3 */ GEKKO_DMGEFF_ICE,
- /* 0x4 */ GEKKO_DMGEFF_LIGHT,
- /* 0x5 */ GEKKO_DMGEFF_ZORA_BARRIER,
+ /* 0 */ GEKKO_DMGEFF_NONE,
+ /* 1 */ GEKKO_DMGEFF_STUN,
+ /* 2 */ GEKKO_DMGEFF_FIRE,
+ /* 3 */ GEKKO_DMGEFF_ICE,
+ /* 4 */ GEKKO_DMGEFF_LIGHT,
+ /* 5 */ GEKKO_DMGEFF_ZORA_BARRIER
} EnPametfrogDamageEffect;
static DamageTable sDamageTable = {
@@ -306,7 +306,7 @@ s32 func_8086A2CC(EnPametfrog* this, CollisionPoly* floorPoly) {
return false;
}
- rotation = func_80086C48(arg0);
+ rotation = Math_FAcosF(arg0);
if (rotation < 0.0001f) {
return false;
}
@@ -523,7 +523,7 @@ void EnPametfrog_FallOffSnapper(EnPametfrog* this, PlayState* play) {
this->timer--;
}
- sin = sin_rad(this->timer * (M_PI / 3)) * ((0.02f * (this->timer * (1.0f / 6.0f))) + 0.005f) + 1.0f;
+ sin = Math_SinF(this->timer * (M_PI / 3)) * ((0.02f * (this->timer * (1.0f / 6.0f))) + 0.005f) + 1.0f;
EnPametfrog_ShakeCamera(this, play, 300.0f * sin, 100.0f * sin);
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
EnPametfrog_StopCutscene(this, play);
@@ -966,9 +966,9 @@ void EnPametfrog_SetupSpawnFrog(EnPametfrog* this, PlayState* play) {
Flags_SetClearTemp(play, play->roomCtx.curRoom.num);
for (i = 0; i < 25; i++) {
- vel.x = randPlusMinusPoint5Scaled(5.0f);
+ vel.x = Rand_CenteredFloat(5.0f);
vel.y = Rand_ZeroFloat(3.0f) + 4.0f;
- vel.z = randPlusMinusPoint5Scaled(5.0f);
+ vel.z = Rand_CenteredFloat(5.0f);
EffectSsHahen_Spawn(play, &this->actor.world.pos, &vel, &sAccel, 0, Rand_S16Offset(12, 3), HAHEN_OBJECT_DEFAULT,
10, 0);
}
@@ -981,7 +981,7 @@ void EnPametfrog_SpawnFrog(EnPametfrog* this, PlayState* play) {
f32 magShake;
this->timer--;
- magShake = (sin_rad(this->timer * (M_PI / 5)) * ((0.04f * (this->timer * 0.1f)) + 0.02f)) + 1.0f;
+ magShake = (Math_SinF(this->timer * (M_PI / 5)) * ((0.04f * (this->timer * 0.1f)) + 0.02f)) + 1.0f;
EnPametfrog_ShakeCamera(this, play, 75.0f * magShake, 10.0f * magShake);
if (this->timer == 0) {
EnPametfrog_StopCutscene(this, play);
@@ -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_Pametfrog/z_en_pametfrog.h b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
index 90bc0cb1b..31a3be14b 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
@@ -9,16 +9,16 @@ struct EnPametfrog;
typedef void (*EnPametfrogActionFunc)(struct EnPametfrog*, PlayState*);
typedef enum {
- /* 0x0 */ GEKKO_PRE_SNAPPER,
- /* 0x1 */ GEKKO_GET_SNAPPER,
- /* 0x2 */ GEKKO_INIT_SNAPPER,
- /* 0x3 */ GEKKO_ON_SNAPPER,
- /* 0x4 */ GEKKO_REAR_ON_SNAPPER,
- /* 0x5 */ GEKKO_CUTSCENE,
- /* 0x6 */ GEKKO_FALL_OFF_SNAPPER,
- /* 0x7 */ GEKKO_RETURN_TO_SNAPPER,
- /* 0x8 */ GEKKO_JUMP_ON_SNAPPER,
- /* 0x9 */ GEKKO_DEFEAT,
+ /* 0 */ GEKKO_PRE_SNAPPER,
+ /* 1 */ GEKKO_GET_SNAPPER,
+ /* 2 */ GEKKO_INIT_SNAPPER,
+ /* 3 */ GEKKO_ON_SNAPPER,
+ /* 4 */ GEKKO_REAR_ON_SNAPPER,
+ /* 5 */ GEKKO_CUTSCENE,
+ /* 6 */ GEKKO_FALL_OFF_SNAPPER,
+ /* 7 */ GEKKO_RETURN_TO_SNAPPER,
+ /* 8 */ GEKKO_JUMP_ON_SNAPPER,
+ /* 9 */ GEKKO_DEFEAT
} EnPametfrogState;
typedef struct EnPametfrog {
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..e56970e10 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -90,10 +90,10 @@ void func_808654C4(EnPart* this, PlayState* play) {
break;
case ENPART_TYPE_4:
for (i = 7; i >= 0; i--) {
- effectPos.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- effectPos.y = randPlusMinusPoint5Scaled(50.0f) +
+ effectPos.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ effectPos.y = Rand_CenteredFloat(50.0f) +
(this->actor.world.pos.y + (this->actor.shape.yOffset * this->actor.scale.y));
- effectPos.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
effectVelocity.y = Rand_ZeroOne() + 1.0f;
effectScale = Rand_S16Offset(80, 100);
EffectSsDtBubble_SpawnColorProfile(play, &effectPos, &effectVelocity, &gZeroVec3f, effectScale, 25,
@@ -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_Part/z_en_part.h b/src/overlays/actors/ovl_En_Part/z_en_part.h
index 662e8574e..5bd4de503 100644
--- a/src/overlays/actors/ovl_En_Part/z_en_part.h
+++ b/src/overlays/actors/ovl_En_Part/z_en_part.h
@@ -8,11 +8,11 @@ struct EnPart;
typedef void (*EnPartActionFunc)(struct EnPart*, PlayState*);
typedef enum {
- ENPART_TYPE_0 = 0,
- ENPART_TYPE_1 = 1,
- ENPART_TYPE_4 = 4,
- ENPART_TYPE_15 = 15
-} EnPartParams;
+ /* 0x0 */ ENPART_TYPE_0,
+ /* 0x1 */ ENPART_TYPE_1,
+ /* 0x4 */ ENPART_TYPE_4 = 4,
+ /* 0xF */ ENPART_TYPE_15 = 15
+} EnPartParam;
typedef struct EnPart {
/* 0x000 */ Actor actor;
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..645b7edf5 100644
--- a/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
+++ b/src/overlays/actors/ovl_En_Peehat/z_en_peehat.c
@@ -257,9 +257,9 @@ void func_80897258(PlayState* play, EnPeehat* this, Vec3f* arg2, f32 arg3, f32 a
sp44.x = (Math_SinS(sp42) * arg3) + arg2->x;
sp44.z = (Math_CosS(sp42) * arg3) + arg2->z;
- D_80899564.x = randPlusMinusPoint5Scaled(1.05f);
- D_80899564.z = randPlusMinusPoint5Scaled(1.05f);
- D_80899558.y = randPlusMinusPoint5Scaled(4.0f) + 8.0f;
+ D_80899564.x = Rand_CenteredFloat(1.05f);
+ D_80899564.z = Rand_CenteredFloat(1.05f);
+ D_80899558.y = Rand_CenteredFloat(4.0f) + 8.0f;
EffectSsHahen_Spawn(play, &sp44, &D_80899558, &D_80899564, 0, (Rand_ZeroFloat(5.0f) + 12.0f) * arg4,
HAHEN_OBJECT_DEFAULT, 10, NULL);
@@ -506,7 +506,7 @@ void func_80897F44(EnPeehat* this, PlayState* play) {
this->actor.world.pos.y -= 1.0f;
}
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->actor.world.pos.y += cos * 1.4f;
this->unk_2B8 += fabsf(cos * 0.18f) + 0.07f;
this->unk_2B0--;
@@ -514,7 +514,7 @@ void func_80897F44(EnPeehat* this, PlayState* play) {
if (this->unk_2B0 <= 0) {
this->actor.speed = Rand_ZeroFloat(0.5f) + 2.5f;
this->unk_2B0 = Rand_ZeroFloat(10.0f) + 10.0f;
- this->unk_2B6 = randPlusMinusPoint5Scaled(1000.0f);
+ this->unk_2B6 = Rand_CenteredFloat(1000.0f);
}
SkelAnime_Update(&this->skelAnime);
@@ -549,10 +549,10 @@ void func_80898144(EnPeehat* this, PlayState* play) {
} else {
this->actor.world.pos.y += 1.0f;
}
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->actor.world.pos.y += cos * 1.4f;
- cos = cos_rad(this->unk_2B8);
+ cos = Math_CosF(this->unk_2B8);
this->unk_2B8 += fabsf(cos * 0.18f) + 0.07f;
step = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos);
@@ -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;
@@ -900,6 +901,7 @@ void EnPeehat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultVecX(-400.0f, vec2);
OPEN_DISPS(play->state.gfxCtx);
+
gfx = POLY_OPA_DISP;
Matrix_Translate(-1000.0f, 0.0f, 0.0f, MTXMODE_APPLY);
@@ -925,7 +927,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..072f6d6ac 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -1105,7 +1105,11 @@ void func_80AF8AC8(EnPm* this) {
void func_80AF8BA8(s32 arg0) {
static u16 D_80AFB8D4[] = {
- WEEKEVENTREG_27_02, WEEKEVENTREG_27_04, WEEKEVENTREG_27_08, WEEKEVENTREG_27_10, WEEKEVENTREG_27_20,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN,
+ WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN,
};
static u16 D_80AFB8E0[] = {
WEEKEVENTREG_27_40, WEEKEVENTREG_27_80, WEEKEVENTREG_28_01, WEEKEVENTREG_28_02, WEEKEVENTREG_28_04,
@@ -1197,7 +1201,7 @@ s32 func_80AF8DD4(EnPm* this, PlayState* play) {
}
s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 actorCat, s16 actorId) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3s* sp48;
Vec3f sp3C;
Vec3f sp30;
@@ -1208,7 +1212,7 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
this->timePath = NULL;
sp2C = func_80AF7CB0(this, play, actorCat, actorId);
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((sp2C != NULL) && (sp2C->update != NULL)) {
@@ -1228,7 +1232,7 @@ s32 func_80AF8ED4(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput, u
s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp56 = SCHEDULE_TIME_NOW;
- u8 sp55 = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
EnDoor* door;
Vec3s* sp4C;
Vec3f sp40;
@@ -1239,10 +1243,10 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
door = func_80AF7D60(play, scheduleOutput->result);
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp55, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, 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 +1255,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 {
@@ -1277,7 +1281,7 @@ s32 func_80AF9008(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp2E = SCHEDULE_TIME_NOW;
u16 phi_v1;
- u8 sp2B = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
u16 tmp;
s16 pad;
s32 ret = false;
@@ -1285,7 +1289,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp2B, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((this->timePath != NULL) && (this->timePath->count < 3)) {
@@ -1357,7 +1361,7 @@ s32 func_80AF91E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -1366,7 +1370,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
if (D_80AFB430[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, D_80AFB430[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AFB430[scheduleOutput->result]);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -1390,7 +1394,7 @@ s32 func_80AF94AC(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
}
s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
- u8 sp4F = this->actor.params & 0xFF;
+ u8 pathIndex = ENPM_GET_PATH_INDEX(&this->actor);
Vec3f sp40;
Vec3f sp34;
Vec3s* sp30;
@@ -1419,7 +1423,7 @@ s32 func_80AF95E8(EnPm* this, PlayState* play, ScheduleOutput* scheduleOutput) {
this->timePath = NULL;
phi_a3 = D_80AFB430[scheduleOutput->result];
if (phi_a3 >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp4F, phi_a3);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, phi_a3);
}
if ((this->timePath != 0) && (this->timePath->count >= 2)) {
@@ -1704,7 +1708,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 +2185,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_Pm/z_en_pm.h b/src/overlays/actors/ovl_En_Pm/z_en_pm.h
index c7bf76e37..bf7bbe859 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.h
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.h
@@ -9,6 +9,8 @@ typedef void (*EnPmActionFunc)(struct EnPm*, PlayState*);
typedef s32 (*EnPmFunc)(struct EnPm*, PlayState*);
typedef s32 (*EnPmFunc2)(struct EnPm*, PlayState*);
+#define ENPM_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
+
typedef struct EnPm {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
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..24517f8aa 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
@@ -58,7 +58,7 @@ static ColliderSphereInit sSphereInit = {
typedef enum {
/* 0x0 */ POE_BALLOON_DMGEFF_NONE,
- /* 0xF */ POE_BALLOON_DMGEFF_POP = 0xF,
+ /* 0xF */ POE_BALLOON_DMGEFF_POP = 0xF
} PoeBalloonDamageEffect;
static DamageTable sDamageTable = {
@@ -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..357b08bdd 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)
@@ -101,7 +101,7 @@ typedef enum {
/* 0x1 */ POE_SISTERS_DMGEFF_UNKDMG12, // set in DamageTable, but unused
/* 0x4 */ POE_SISTERS_DMGEFF_LIGHTARROWS = 0x4,
/* 0xE */ POE_SISTERS_DMGEFF_SPINATTACK = 0xE,
- /* 0xF */ POE_SISTERS_DMGEFF_DEKUNUT = 0xF,
+ /* 0xF */ POE_SISTERS_DMGEFF_DEKUNUT
} PoeSisterDamageEffect;
static DamageTable sDamageTable = {
@@ -242,8 +242,9 @@ void EnPoSisters_MatchPlayerXZ(EnPoSisters* this, PlayState* play) {
Player* player = GET_PLAYER(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 ((this->megCloneId == POE_SISTERS_MEG_REAL) || (this->actionFunc != EnPoSisters_DamageFlinch)) {
+ 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 {
@@ -276,7 +277,8 @@ void EnPoSisters_MatchPlayerY(EnPoSisters* this, PlayState* play) {
this->actor.world.pos.y += (2.0f + (0.5f * Rand_ZeroOne())) * Math_SinS(this->floatingBobbingTimer * 0x800);
// fully opaque
- if (this->color.a == 255 && this->actionFunc != EnPoSisters_SpinAttack && this->actionFunc != EnPoSisters_SpinUp) {
+ if ((this->color.a == 255) && (this->actionFunc != EnPoSisters_SpinAttack) &&
+ (this->actionFunc != EnPoSisters_SpinUp)) {
if (this->actionFunc == EnPoSisters_Flee) {
func_800B9010(&this->actor, NA_SE_EN_PO_AWAY - SFX_FLAG);
} else {
@@ -578,7 +580,7 @@ void EnPoSisters_Flee(EnPoSisters* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
this->poSisterFlags |= POE_SISTERS_FLAG_UPDATE_SHAPE_ROT;
EnPoSisters_SetupSpinToInvis(this);
- } else if (this->fleeTimer == 0 && this->actor.xzDistToPlayer > 480.0f) {
+ } else if ((this->fleeTimer == 0) && (this->actor.xzDistToPlayer > 480.0f)) {
this->actor.world.rot.y = this->actor.shape.rot.y;
EnPoSisters_SetupAimlessIdleFlying(this);
}
@@ -817,7 +819,7 @@ void EnPoSisters_MegSurroundPlayer(EnPoSisters* this, PlayState* play) {
DECR(this->megSurroundTimer);
- if (this->megClonesRemaining > 0 && this->megSurroundTimer >= 16) {
+ if ((this->megClonesRemaining > 0) && (this->megSurroundTimer >= 16)) {
SkelAnime_Update(&this->skelAnime);
if (this->megCloneId == POE_SISTERS_MEG_REAL) {
if (ABS_ALT(16 - this->floatingBobbingTimer) < 14) {
@@ -1091,7 +1093,7 @@ s32 EnPoSisters_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
};
EnPoSisters* this = THIS;
- if (limbIndex == POE_SISTERS_LIMB_ROOT && (this->poSisterFlags & POE_SISTERS_FLAG_REAL_MEG_ROTATION)) {
+ if ((limbIndex == POE_SISTERS_LIMB_ROOT) && (this->poSisterFlags & POE_SISTERS_FLAG_REAL_MEG_ROTATION)) {
if (this->megSurroundTimer >= 284) {
rot->x += (this->megSurroundTimer - 284) * 0x1000;
} else {
@@ -1152,8 +1154,8 @@ void EnPoSisters_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s
Matrix_MultVecX(3000.0f, &this->limbPos[7]);
}
- if (this->actionFunc == EnPoSisters_DeathStage1 && this->deathTimer >= 8 &&
- limbIndex == POE_SISTERS_LIMB_MAIN_BODY) {
+ if ((this->actionFunc == EnPoSisters_DeathStage1) && (this->deathTimer >= 8) &&
+ (limbIndex == POE_SISTERS_LIMB_MAIN_BODY)) {
gSPMatrix((*gfx)++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList((*gfx)++, gPoeSistersBurnBodyDL);
}
@@ -1204,8 +1206,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_Po_Sisters/z_en_po_sisters.h b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
index cfb8a1697..f800788c7 100644
--- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
+++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.h
@@ -15,17 +15,17 @@ typedef void (*EnPoSistersActionFunc)(struct EnPoSisters*, PlayState*);
#define POE_SISTERS_PARAMS(observerFlag, megClone, type) (((observerFlag) << 0xC) | ((megClone & 3) << 0xA) | ((type & 3) << 8))
typedef enum {
- /* 0 */ POE_SISTERS_TYPE_MEG, // purple
- /* 1 */ POE_SISTERS_TYPE_JO, // red
- /* 2 */ POE_SISTERS_TYPE_BETH, // blue
- /* 3 */ POE_SISTERS_TYPE_AMY, // green
+ /* 0 */ POE_SISTERS_TYPE_MEG, // purple
+ /* 1 */ POE_SISTERS_TYPE_JO, // red
+ /* 2 */ POE_SISTERS_TYPE_BETH, // blue
+ /* 3 */ POE_SISTERS_TYPE_AMY // green
} EnPoSisterType;
typedef enum {
/* 0 */ POE_SISTERS_MEG_REAL,
/* 1 */ POE_SISTERS_MEG_CLONE1,
/* 2 */ POE_SISTERS_MEG_CLONE2,
- /* 3 */ POE_SISTERS_MEG_CLONE3,
+ /* 3 */ POE_SISTERS_MEG_CLONE3
} EnPoSisterMegCloneID;
typedef struct EnPoSisters {
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..48c8cd5ab 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.c
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.c
@@ -39,7 +39,7 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play);
typedef enum {
/* 0 */ EN_PP_COLLISION_RESULT_OK,
/* 1 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_INTO_WALL,
- /* 2 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE,
+ /* 2 */ EN_PP_COLLISION_RESULT_ABOUT_TO_RUN_OFF_LEDGE
} EnPpCollisionResult;
typedef enum {
@@ -56,13 +56,13 @@ typedef enum {
/* 10 */ EN_PP_ACTION_MASK_DEAD,
/* 11 */ EN_PP_ACTION_SPAWN_BODY_PARTS,
/* 12 */ EN_PP_ACTION_DONE_SPAWNING_BODY_PARTS,
- /* 13 */ EN_PP_ACTION_BODY_PART_MOVE,
+ /* 13 */ EN_PP_ACTION_BODY_PART_MOVE
} EnPpAction;
typedef enum {
/* 0 */ EN_PP_MASK_DETACH_STATE_START,
/* 1 */ EN_PP_MASK_DETACH_STATE_FALL,
- /* 2 */ EN_PP_MASK_DETACH_STATE_DIE,
+ /* 2 */ EN_PP_MASK_DETACH_STATE_DIE
} EnPpMaskDetachState;
static s32 sCurrentDeadBodyPartIndex = 0;
@@ -77,7 +77,7 @@ typedef enum {
/* 0xC */ EN_PP_DMGEFF_KNOCK_OFF_MASK = 0xC, // Knocks off the Hiploop's mask or deals regular damage
/* 0xD */ EN_PP_DMGEFF_HOOKSHOT, // Pulls the Hiploop's mask to the player or deals regular damage
/* 0xE */ EN_PP_DMGEFF_GORON_POUND, // Knocks off the Hiploop's mask or forces it to jump
- /* 0xF */ EN_PP_DMGEFF_DAMAGE, // Deals regular damage
+ /* 0xF */ EN_PP_DMGEFF_DAMAGE // Deals regular damage
} EnPpDamageEffect;
static DamageTable sDamageTable = {
@@ -397,17 +397,17 @@ void EnPp_SpawnDust(EnPp* this, PlayState* play) {
Vec3f accel;
for (i = 0; i < ARRAY_COUNT(this->backFootPos); i++) {
- velocity.x = randPlusMinusPoint5Scaled(2.0f);
+ velocity.x = Rand_CenteredFloat(2.0f);
velocity.y = Rand_ZeroFloat(2.0f) + 1.0f;
- velocity.z = randPlusMinusPoint5Scaled(2.0f);
+ velocity.z = Rand_CenteredFloat(2.0f);
accel.y = -0.1f;
accel.z = 0.0f;
accel.x = 0.0f;
- pos.x = this->backFootPos[i].x + randPlusMinusPoint5Scaled(10.0f);
+ pos.x = this->backFootPos[i].x + Rand_CenteredFloat(10.0f);
pos.y = Rand_ZeroFloat(3.0f) + this->actor.floorHeight + 1.0f;
- pos.z = this->backFootPos[i].z + randPlusMinusPoint5Scaled(10.0f);
+ pos.z = this->backFootPos[i].z + Rand_CenteredFloat(10.0f);
func_800B0EB0(play, &pos, &velocity, &accel, &sDustPrimColor, &sDustEnvColor, (Rand_ZeroFloat(50.0f) + 60.0f),
30, (Rand_ZeroFloat(5.0f) + 20.0f));
@@ -534,8 +534,8 @@ void EnPp_Idle(EnPp* this, PlayState* play) {
if ((this->timer == 0) && (this->secondaryTimer == 0)) {
this->secondaryTimer = Rand_ZeroFloat(20.0f) + 20.0f;
Math_Vec3f_Copy(&posToLookAt, &this->actor.home.pos);
- posToLookAt.x += randPlusMinusPoint5Scaled(50.0f);
- posToLookAt.z += randPlusMinusPoint5Scaled(50.0f);
+ posToLookAt.x += Rand_CenteredFloat(50.0f);
+ posToLookAt.z += Rand_CenteredFloat(50.0f);
this->targetRotY = Math_Vec3f_Yaw(&this->actor.world.pos, &posToLookAt);
this->actor.speed = 0.0f;
if (this->animIndex != EN_PP_ANIM_IDLE) {
@@ -1046,8 +1046,8 @@ void EnPp_Dead(EnPp* this, PlayState* play) {
if (this->actor.world.pos.y < waterSurface) {
for (i = 0; i < 5; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled(10 + (5 * i));
- splashPos.z += randPlusMinusPoint5Scaled(40 + (5 * i));
+ splashPos.x += Rand_CenteredFloat(10 + (5 * i));
+ splashPos.z += Rand_CenteredFloat(40 + (5 * i));
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (Rand_ZeroOne() * 100.0f) + 400.0f);
}
@@ -1143,9 +1143,9 @@ void EnPp_Mask_Detach(EnPp* this, PlayState* play) {
for (i = 0; i < ARRAY_COUNT(sMaskFireVelocityAndAccel); i++) {
Math_Vec3f_Copy(&maskFirePos, &this->maskFlamesBasePos);
- maskFirePos.x += randPlusMinusPoint5Scaled(20.0f);
+ maskFirePos.x += Rand_CenteredFloat(20.0f);
maskFirePos.y = this->actor.floorHeight;
- maskFirePos.z += randPlusMinusPoint5Scaled(20.0f);
+ maskFirePos.z += Rand_CenteredFloat(20.0f);
func_800B3030(play, &maskFirePos, &sMaskFireVelocityAndAccel[i],
&sMaskFireVelocityAndAccel[i], 70, 0, 2);
}
@@ -1173,7 +1173,7 @@ void EnPp_BodyPart_SetupMove(EnPp* this) {
this->deadBodyPartRotationalVelocity.z = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_BODY_PART_BODY) {
this->actor.speed = Rand_ZeroFloat(4.0f) + 4.0f;
- this->actor.world.rot.y = ((s32)randPlusMinusPoint5Scaled(223.0f) + 0x1999) * this->deadBodyPartIndex;
+ this->actor.world.rot.y = ((s32)Rand_CenteredFloat(223.0f) + 0x1999) * this->deadBodyPartIndex;
}
this->action = EN_PP_ACTION_BODY_PART_MOVE;
@@ -1213,8 +1213,8 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
for (i = 0; i < 6; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
- splashPos.x += randPlusMinusPoint5Scaled(10 + (5 * i));
- splashPos.z += randPlusMinusPoint5Scaled(40 + (5 * i));
+ splashPos.x += Rand_CenteredFloat(10 + (5 * i));
+ splashPos.z += Rand_CenteredFloat(40 + (5 * i));
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, 0, (Rand_ZeroOne() * 100.0f) + 400.0f);
}
} else {
@@ -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_Pp/z_en_pp.h b/src/overlays/actors/ovl_En_Pp/z_en_pp.h
index aabbd9e2e..2409487be 100644
--- a/src/overlays/actors/ovl_En_Pp/z_en_pp.h
+++ b/src/overlays/actors/ovl_En_Pp/z_en_pp.h
@@ -22,7 +22,7 @@ typedef enum {
/* 13 */ EN_PP_TYPE_BODY_PART_FRONT_RIGHT_LOWER_LEG = 13,
/* 17 */ EN_PP_TYPE_BODY_PART_LEFT_WING_MIDDLE = 17,
/* 23 */ EN_PP_TYPE_BODY_PART_RIGHT_WING_MIDDLE = 23,
- /* 26 */ EN_PP_TYPE_BODY_PART_CENTER_WING_MIDDLE = 26,
+ /* 26 */ EN_PP_TYPE_BODY_PART_CENTER_WING_MIDDLE = 26
} EnPpType;
typedef struct EnPp {
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..98762c907 100644
--- a/src/overlays/actors/ovl_En_Pr/z_en_pr.c
+++ b/src/overlays/actors/ovl_En_Pr/z_en_pr.c
@@ -319,7 +319,7 @@ void func_80A32A40(EnPr* this, PlayState* play) {
WaterBox* sp30;
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
- sp34.y = randPlusMinusPoint5Scaled(50.0f) + this->actor.home.pos.y;
+ sp34.y = Rand_CenteredFloat(50.0f) + this->actor.home.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &this->unk_2B4,
&sp30)) {
@@ -551,9 +551,9 @@ void EnPr_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp40, &this->unk_2D4);
this->unk_204 = 0;
- sp40.x += randPlusMinusPoint5Scaled(20.0f);
- sp40.y += randPlusMinusPoint5Scaled(5.0f);
- sp40.z += randPlusMinusPoint5Scaled(20.0f);
+ sp40.x += Rand_CenteredFloat(20.0f);
+ sp40.y += Rand_CenteredFloat(5.0f);
+ sp40.z += Rand_CenteredFloat(20.0f);
for (i = 0; i < (s32)Rand_ZeroFloat(5.0f) + 5; i++) {
EffectSsBubble_Spawn(play, &sp40, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
@@ -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..a4dd96d4b 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c
@@ -151,8 +151,8 @@ void EnPr2_Init(Actor* thisx, PlayState* play) {
Actor* parent = this->actor.parent;
if (parent->update != NULL) {
- this->unk_1C8 = ((EnEncount1*)parent)->unk_15A;
- this->path = SubS_GetPathByIndex(play, this->unk_1C8, 0x3F);
+ this->pathIndex = ((EnEncount1*)parent)->pathIndex;
+ this->path = SubS_GetPathByIndex(play, this->pathIndex, ENPR2_PATH_INDEX_NONE);
this->unk_208 = parent->world.rot.z * 20.0f;
if (this->unk_208 < 20.0f) {
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--;
}
}
}
@@ -272,7 +272,7 @@ void func_80A745FC(EnPr2* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_EXIST - SFX_FLAG);
Math_ApproachF(&this->unk_204, 0.02f, 0.1f, 0.005f);
- if (this->path->unk2 < this->unk_1D0) {
+ if (this->path->customValue < this->unk_1D0) {
Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 1.0f);
} else {
Math_ApproachF(&this->actor.speed, 10.0f, 0.3f, 1.0f);
@@ -390,8 +390,8 @@ void func_80A748E8(EnPr2* this, PlayState* play) {
if (this->unk_1DA == 1) {
this->unk_1D8 = Rand_S16Offset(100, 100);
Math_Vec3f_Copy(&sp3C, &this->unk_228);
- sp3C.x += randPlusMinusPoint5Scaled(300.0f);
- sp3C.z += randPlusMinusPoint5Scaled(300.0f);
+ sp3C.x += Rand_CenteredFloat(300.0f);
+ sp3C.z += Rand_CenteredFloat(300.0f);
Math_Vec3f_Copy(&this->unk_21C, &sp3C);
}
} else {
@@ -536,7 +536,7 @@ void func_80A751B4(EnPr2* this) {
this->actor.shape.rot.z = this->actor.world.rot.z;
this->unk_1D8 = 30;
this->actor.speed = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
}
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 10);
this->unk_1D4 = 3;
@@ -596,9 +596,9 @@ void func_80A75310(EnPr2* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp64, &this->actor.world.pos);
- sp64.x += randPlusMinusPoint5Scaled(20.0f);
- sp64.y += randPlusMinusPoint5Scaled(5.0f);
- sp64.z += randPlusMinusPoint5Scaled(20.0f);
+ sp64.x += Rand_CenteredFloat(20.0f);
+ sp64.y += Rand_CenteredFloat(5.0f);
+ sp64.z += Rand_CenteredFloat(20.0f);
frame = Rand_ZeroFloat(0.03f) + 0.07f;
EffectSsBubble_Spawn(play, &sp64, 0.0f, 5.0f, 5.0f, frame);
@@ -675,9 +675,9 @@ void EnPr2_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp58, &this->unk_270);
this->unk_1D6 = false;
- sp58.x += randPlusMinusPoint5Scaled(20.0f);
- sp58.y += randPlusMinusPoint5Scaled(5.0f);
- sp58.z += randPlusMinusPoint5Scaled(20.0f);
+ sp58.x += Rand_CenteredFloat(20.0f);
+ sp58.y += Rand_CenteredFloat(5.0f);
+ sp58.z += Rand_CenteredFloat(20.0f);
for (i = 0; i < 2; i++) {
rand = Rand_ZeroFloat(0.03f) + 0.07f;
@@ -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..94fb7e033 100644
--- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
+++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.h
@@ -10,13 +10,16 @@ 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_PATH_INDEX_NONE 0x3F
+#define ENPR2_PARAMS(paramF, paramFF0) (((paramF) & 0xF) | (((paramFF0) << 4) & 0xFF0))
+
typedef struct EnPr2 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[5];
/* 0x1A6 */ Vec3s morphtable[5];
/* 0x1C4 */ EnPr2ActionFunc actionFunc;
- /* 0x1C8 */ s16 unk_1C8;
+ /* 0x1C8 */ s16 pathIndex;
/* 0x1CC */ Path* path;
/* 0x1D0 */ s32 unk_1D0;
/* 0x1D4 */ s16 unk_1D4;
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..ef37cf9f0 100644
--- a/src/overlays/actors/ovl_En_Prz/z_en_prz.c
+++ b/src/overlays/actors/ovl_En_Prz/z_en_prz.c
@@ -127,7 +127,7 @@ void EnPrz_Init(Actor* thisx, PlayState* play) {
this->unk_220 = &this->actor;
this->unk_1EC = 255;
- this->unk_202 = randPlusMinusPoint5Scaled((this->unk_1E6 * 100.0f) + 1000.0f);
+ this->unk_202 = Rand_CenteredFloat((this->unk_1E6 * 100.0f) + 1000.0f);
func_80A76388(this);
}
@@ -176,7 +176,7 @@ void func_80A76070(EnPrz* this, s16 arg1, PlayState* play) {
temp_s0 = -100;
}
- if (fabsf(this->actor.world.rot.y - (f32)arg1) < (randPlusMinusPoint5Scaled(20.0f) + 100.0f)) {
+ if (fabsf(this->actor.world.rot.y - (f32)arg1) < (Rand_CenteredFloat(20.0f) + 100.0f)) {
Math_ApproachZeroF(&this->unk_218, 0.5f, 20.0f);
} else {
Math_ApproachF(&this->unk_218, temp_s0, 0.5f, 5.0f);
@@ -218,7 +218,7 @@ s32 func_80A762C0(EnPrz* this, PlayState* play) {
}
void func_80A76388(EnPrz* this) {
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 4.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 4.0f;
func_80A75F18(this, 0);
this->unk_1EA = 1;
this->actionFunc = func_80A763E8;
@@ -251,11 +251,11 @@ void func_80A763E8(EnPrz* this, PlayState* play) {
if ((this->unk_1EE == 0) && (this->unk_1F2 == 0)) {
s16 rot;
- this->unk_214 = randPlusMinusPoint5Scaled(40.0f);
+ this->unk_214 = Rand_CenteredFloat(40.0f);
rot = BINANG_ROT180(this->unk_220->world.rot.y);
this->unk_1D8.x += Math_SinS(rot) * this->unk_214;
- this->unk_1D8.y = randPlusMinusPoint5Scaled(40.0f) + (this->unk_220->world.pos.y + 40.0f);
+ this->unk_1D8.y = Rand_CenteredFloat(40.0f) + (this->unk_220->world.pos.y + 40.0f);
rot = BINANG_ROT180(this->unk_220->world.rot.y);
this->unk_1D8.z += Math_CosS(rot) * this->unk_214;
@@ -302,7 +302,7 @@ void func_80A76634(EnPrz* this, PlayState* play) {
}
void func_80A76748(EnPrz* this) {
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 3.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 3.0f;
this->unk_1EE = 0;
this->unk_1EA = 3;
this->skelAnime.playSpeed = 2.0f;
@@ -317,7 +317,7 @@ void func_80A767A8(EnPrz* this, PlayState* play) {
if (func_80A762C0(this, play)) {
func_80A75F18(this, 0);
- this->actor.speed = randPlusMinusPoint5Scaled(1.0f) + 4.0f;
+ this->actor.speed = Rand_CenteredFloat(1.0f) + 4.0f;
func_80A76604(this, play);
return;
}
@@ -353,8 +353,8 @@ void func_80A767A8(EnPrz* this, PlayState* play) {
this->unk_1C8 = 1;
}
- this->unk_1D8.y = (player->actor.world.pos.y + D_80A771E0[GET_PLAYER_FORM]) +
- randPlusMinusPoint5Scaled((2.0f * this->unk_1E6) + 1.0f);
+ this->unk_1D8.y =
+ (player->actor.world.pos.y + D_80A771E0[GET_PLAYER_FORM]) + Rand_CenteredFloat((2.0f * this->unk_1E6) + 1.0f);
func_80A76070(this, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_1D8), play);
}
@@ -374,7 +374,7 @@ void func_80A76A1C(EnPrz* this) {
this->unk_1FE = this->actor.world.rot.y;
this->actor.speed = Rand_ZeroFloat(0.5f);
- this->actor.world.rot.y = randPlusMinusPoint5Scaled(0x8000);
+ this->actor.world.rot.y = Rand_CenteredFloat(0x8000);
Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 30);
this->unk_1EE = 50;
@@ -409,9 +409,9 @@ void func_80A76B14(EnPrz* this, PlayState* play) {
for (i = 0; i < 10; i++) {
Math_Vec3f_Copy(&sp6C, &this->actor.world.pos);
- sp6C.x += randPlusMinusPoint5Scaled(20.0f);
- sp6C.y += randPlusMinusPoint5Scaled(5.0f);
- sp6C.z += randPlusMinusPoint5Scaled(20.0f);
+ sp6C.x += Rand_CenteredFloat(20.0f);
+ sp6C.y += Rand_CenteredFloat(5.0f);
+ sp6C.z += Rand_CenteredFloat(20.0f);
EffectSsBubble_Spawn(play, &sp6C, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
}
@@ -473,9 +473,9 @@ void EnPrz_Update(Actor* thisx, PlayState* play) {
Math_Vec3f_Copy(&sp38, &this->unk_1CC);
this->unk_1C8 = 0;
- sp38.x += randPlusMinusPoint5Scaled(20.0f);
- sp38.y += randPlusMinusPoint5Scaled(5.0f);
- sp38.z += randPlusMinusPoint5Scaled(20.0f);
+ sp38.x += Rand_CenteredFloat(20.0f);
+ sp38.y += Rand_CenteredFloat(5.0f);
+ sp38.z += Rand_CenteredFloat(20.0f);
EffectSsBubble_Spawn(play, &sp38, 0.0f, 5.0f, 5.0f, Rand_ZeroFloat(0.03f) + 0.07f);
}
@@ -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..7a507e0ef 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.c
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.c
@@ -26,7 +26,7 @@ typedef enum {
typedef enum {
/* 0 */ POSTBOX_BEHAVIOUR_WAIT_FOR_ITEM,
- /* 1 */ POSTBOX_BEHAVIOUR_TAKE_ITEM,
+ /* 1 */ POSTBOX_BEHAVIOUR_TAKE_ITEM
} PostboxBehaviour;
static u8 D_80B2C200[] = {
@@ -162,15 +162,15 @@ void EnPst_UpdateCollision(EnPst* this, PlayState* play) {
s32 EnPst_HandleLetterDay1(EnPst* this) {
switch (this->actor.params) {
case POSTBOX_SOUTH_UPPER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_02);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN);
case POSTBOX_NORTH_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_04);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN);
case POSTBOX_EAST_UPPER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_08);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN);
case POSTBOX_EAST_LOWER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_10);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN);
case POSTBOX_SOUTH_LOWER_CLOCKTOWN:
- return CHECK_WEEKEVENTREG(WEEKEVENTREG_27_20);
+ return CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN);
default:
return false;
}
@@ -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_Pst/z_en_pst.h b/src/overlays/actors/ovl_En_Pst/z_en_pst.h
index 6051924da..c3ebd58a8 100644
--- a/src/overlays/actors/ovl_En_Pst/z_en_pst.h
+++ b/src/overlays/actors/ovl_En_Pst/z_en_pst.h
@@ -9,7 +9,7 @@ typedef enum {
/* 1 */ POSTBOX_NORTH_CLOCKTOWN,
/* 2 */ POSTBOX_EAST_UPPER_CLOCKTOWN,
/* 3 */ POSTBOX_EAST_LOWER_CLOCKTOWN,
- /* 4 */ POSTBOX_SOUTH_LOWER_CLOCKTOWN,
+ /* 4 */ POSTBOX_SOUTH_LOWER_CLOCKTOWN
} PostboxType;
struct EnPst;
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..d4e83a388 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);
@@ -63,13 +62,13 @@ void EnRacedog_PlaySfxWalk(EnRacedog* this);
* Stores various information for each dog in the race, mostly related to speed.
*/
typedef struct {
- f32 sprintSpeedMultiplier; // Target speed is multiplied by this when the dog is in the last 1/4 of the race
- f32 goodConditionSpeedMultiplier; // Target speed is multiplied by this if the dog is in good condition
- s16 color; // The dog's color, which is used as an index into sBaseSpeeds
- s16 index; // The dog's index within sDogInfo
- s16 pointToUseSecondBaseSpeed; // When the dog is at or after this point, the second value in sBaseSpeeds is used
- s16 textId; // Used to determine the dog's condition
-} RaceDogInfo;
+ /* 0x0 */ f32 sprintSpeedMultiplier; // Multiplies target speed when the dog is in the last 1/4 of the race
+ /* 0x4 */ f32 goodConditionSpeedMultiplier; // Multiplies target speed if the dog is in good condition
+ /* 0x8 */ s16 color; // The dog's color, which is used as an index into sBaseSpeeds
+ /* 0xA */ s16 index; // The dog's index within sDogInfo
+ /* 0xC */ s16 pointToUseSecondBaseSpeed; // When the dog is at or after this point, use the second sBaseSpeeds value
+ /* 0xE */ s16 textId; // Used to determine the dog's condition
+} RaceDogInfo; // size = 0x10
ActorInit En_Racedog_InitVars = {
ACTOR_EN_RACEDOG,
@@ -276,8 +275,8 @@ s16 EnRacedog_GetYRotation(Path* path, s32 pointIndex, Vec3f* pos, f32* distSQ)
if (path != NULL) {
point = Lib_SegmentedToVirtual(path->points);
point = &point[pointIndex];
- diffXRand = (randPlusMinusPoint5Scaled(100.0f) + point->x) - pos->x;
- diffZRand = (randPlusMinusPoint5Scaled(100.0f) + point->z) - pos->z;
+ diffXRand = (Rand_CenteredFloat(100.0f) + point->x) - pos->x;
+ diffZRand = (Rand_CenteredFloat(100.0f) + point->z) - pos->z;
diffX = point->x - pos->x;
diffZ = point->z - pos->z;
} else {
@@ -314,10 +313,10 @@ void EnRacedog_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
- this->path = SubS_GetPathByIndex(play, ENRACEDOG_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENRACEDOG_GET_PATH_INDEX(&this->actor), ENRACEDOG_PATH_INDEX_NONE);
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)) {
@@ -482,9 +474,9 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
// The dog is past the very start, but is still less than 1/4th of the way through the race track.
// This code will give the blue dog a higher base speed than any other dog (6.0 instead of 5.0).
if (sDogInfo[this->index].color == DOG_COLOR_BLUE) {
- this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][0] + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][0] + Rand_CenteredFloat(1.0f);
} else {
- this->targetSpeed = 5.0f + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = 5.0f + Rand_CenteredFloat(1.0f);
}
if (DOG_IS_IN_GOOD_CONDITION(this) && (this->index != sFirstPlaceIndex)) {
@@ -493,9 +485,9 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
} else if (this->currentPoint < (quarterPathCount * 3)) {
// The dog is between 1/4th and 3/4ths of the way through the race track.
if (this->currentPoint < sDogInfo[this->index].pointToUseSecondBaseSpeed) {
- this->targetSpeed = 5.0f + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = 5.0f + Rand_CenteredFloat(1.0f);
} else {
- this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][1] + randPlusMinusPoint5Scaled(1.0f);
+ this->targetSpeed = sBaseSpeeds[sDogInfo[this->index].color][1] + Rand_CenteredFloat(1.0f);
if (DOG_IS_IN_GOOD_CONDITION(this) && (this->index != sFirstPlaceIndex)) {
this->targetSpeed *= sDogInfo[this->index].goodConditionSpeedMultiplier;
@@ -505,7 +497,7 @@ void EnRacedog_UpdateSpeed(EnRacedog* this) {
// The dog is more than 3/4ths of the way through the race track.
EnRacedog_CalculateFinalStretchTargetSpeed(this);
} else {
- this->targetSpeed = randPlusMinusPoint5Scaled(1.0f) + 5.0f;
+ this->targetSpeed = Rand_CenteredFloat(1.0f) + 5.0f;
}
}
}
@@ -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);
}
}
}
@@ -665,9 +657,9 @@ void EnRacedog_SpawnFloorDustRing(EnRacedog* this, PlayState* play) {
Vec3f pos;
if (((this->index + curFrame) % mod) == 0) {
- pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(15.0f);
+ pos.x = this->actor.world.pos.x + Rand_CenteredFloat(15.0f);
pos.y = this->actor.world.pos.y;
- pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(15.0f);
+ pos.z = this->actor.world.pos.z + Rand_CenteredFloat(15.0f);
Actor_SpawnFloorDustRing(play, &this->actor, &pos, 10.0f, 0, 2.0f, 300, 0, true);
}
}
@@ -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..a3d9afee5 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
@@ -5,7 +5,11 @@
#include "objects/object_dog/object_dog.h"
#define ENRACEDOG_GET_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENRACEDOG_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 10)
+#define ENRACEDOG_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 10)
+
+#define ENRACEDOG_PATH_INDEX_NONE 0x3F
+
+#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..1a4024f51 100644
--- a/src/overlays/actors/ovl_En_Raf/z_en_raf.c
+++ b/src/overlays/actors/ovl_En_Raf/z_en_raf.c
@@ -40,7 +40,7 @@ typedef enum {
/* 2 */ EN_RAF_ANIM_CHEW,
/* 3 */ EN_RAF_ANIM_SPIT,
/* 4 */ EN_RAF_ANIM_CONVULSE,
- /* 5 */ EN_RAF_ANIM_DEATH,
+ /* 5 */ EN_RAF_ANIM_DEATH
} EnRafAnimation;
typedef enum {
@@ -51,7 +51,7 @@ typedef enum {
/* 4 */ EN_RAF_ACTION_EXPLODE,
/* 5 */ EN_RAF_ACTION_CONVULSE,
/* 6 */ EN_RAF_ACTION_DISSOLVE,
- /* 7 */ EN_RAF_ACTION_DORMANT,
+ /* 7 */ EN_RAF_ACTION_DORMANT
} EnRafAction;
typedef enum {
@@ -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);
@@ -895,9 +895,9 @@ void EnRaf_InitializeEffect(EnRaf* this, Vec3f* pos, Vec3f* velocity, Vec3f* acc
effect->accel = *accel;
effect->scale = scale;
effect->timer = timer;
- effect->rotation.x = randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.y = randPlusMinusPoint5Scaled(30000.0f);
- effect->rotation.z = randPlusMinusPoint5Scaled(30000.0f);
+ effect->rotation.x = Rand_CenteredFloat(30000.0f);
+ effect->rotation.y = Rand_CenteredFloat(30000.0f);
+ effect->rotation.z = Rand_CenteredFloat(30000.0f);
return;
}
}
@@ -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..9a0e1864e 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -70,18 +70,18 @@ typedef enum {
/* 16 */ EN_RAILGIBUD_ANIM_SLUMP_LOOP,
/* 17 */ EN_RAILGIBUD_ANIM_CONVULSION,
/* 18 */ EN_RAILGIBUD_ANIM_ARMS_UP_START,
- /* 19 */ EN_RAILGIBUD_ANIM_ARMS_UP_LOOP,
+ /* 19 */ EN_RAILGIBUD_ANIM_ARMS_UP_LOOP
} EnRailgibudAnimation;
typedef enum {
/* 0 */ EN_RAILGIBUD_TYPE_GIBDO,
- /* 1 */ EN_RAILGIBUD_TYPE_REDEAD,
+ /* 1 */ EN_RAILGIBUD_TYPE_REDEAD
} EnRailgibudType;
typedef enum {
/* 0 */ EN_RAILGIBUD_GRAB_START,
/* 1 */ EN_RAILGIBUD_GRAB_ATTACK,
- /* 2 */ EN_RAILGIBUD_GRAB_RELEASE,
+ /* 2 */ EN_RAILGIBUD_GRAB_RELEASE
} EnRailgibudGrabState;
ActorInit En_Railgibud_InitVars = {
@@ -147,7 +147,7 @@ typedef enum {
/* 0xC */ EN_RAILGIBUD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_RAILGIBUD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_RAILGIBUD_DMGEFF_LIGHT_RAY, // Instantly kills a Redead on contact
- /* 0xF */ EN_RAILGIBUD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_RAILGIBUD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnRailgibudDamageEffect;
static DamageTable sDamageTable = {
@@ -196,7 +196,7 @@ void EnRailgibud_SpawnOtherGibdosAndSetPositionAndRotation(EnRailgibud* this, Pl
static s32 currentGibdoIndex = 0;
s32 nextPoint;
Vec3f targetPos;
- Path* path = &play->setupPathList[ENRAILGIBUD_GET_PATH(&this->actor)];
+ Path* path = &play->setupPathList[ENRAILGIBUD_GET_PATH_INDEX(&this->actor)];
this->points = Lib_SegmentedToVirtual(path->points);
this->currentPoint = currentGibdoIndex;
@@ -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_Railgibud/z_en_railgibud.h b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
index 95a2bbd7b..f9d3922c8 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.h
@@ -10,7 +10,7 @@ typedef void (*EnRailgibudActionFunc)(struct EnRailgibud*, PlayState*);
#define ENRAILGIBUD_GET_CUTSCENE_TYPE(thisx) ((thisx)->params & 0x7F)
#define ENRAILGIBUD_IS_CUTSCENE_TYPE(thisx) ((thisx)->params & 0x80)
-#define ENRAILGIBUD_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define ENRAILGIBUD_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef struct EnRailgibud {
/* 0x000 */ Actor actor;
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..e08cb5574 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.c
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.c
@@ -32,7 +32,7 @@ void EnRat_PostDetonation(EnRat* this, PlayState* play);
typedef enum {
/* -2 */ EN_RAT_HOOK_STARTED = -2,
- /* -1 */ EN_RAT_HOOKED,
+ /* -1 */ EN_RAT_HOOKED
} EnRatHookedState;
ActorInit En_Rat_InitVars = {
@@ -70,7 +70,7 @@ static ColliderSphereInit sSphereInit = {
typedef enum {
/* 0x0 */ EN_RAT_DMGEFF_NONE,
/* 0x1 */ EN_RAT_DMGEFF_STUN,
- /* 0xF */ EN_RAT_DMGEFF_HOOKSHOT = 0xF, // Pulls the Real Bombchu towards the player
+ /* 0xF */ EN_RAT_DMGEFF_HOOKSHOT = 0xF // Pulls the Real Bombchu towards the player
} EnRatDamageEffect;
static DamageTable sDamageTable = {
@@ -230,7 +230,7 @@ s32 EnRat_UpdateFloorPoly(EnRat* this, CollisionPoly* floorPoly, PlayState* play
return false;
}
- angle = func_80086C48(normDotUp);
+ angle = Math_FAcosF(normDotUp);
if (angle < 0.001f) {
return false;
}
@@ -324,9 +324,9 @@ void EnRat_ChooseDirection(EnRat* this) {
angle -= 0x8000;
}
- angle += (s16)randPlusMinusPoint5Scaled(0x800);
+ angle += (s16)(s32)Rand_CenteredFloat(0x800);
} else {
- angle = (Rand_ZeroOne() < 0.1f) ? (s16)randPlusMinusPoint5Scaled(0x800) : 0;
+ angle = (Rand_ZeroOne() < 0.1f) ? (s16)(s32)Rand_CenteredFloat(0x800) : 0;
}
}
@@ -633,9 +633,9 @@ void EnRat_UpdateSparkOffsets(EnRat* this) {
for (i = 0; i < ARRAY_COUNT(this->sparkOffsets); i++) {
ptr = &this->sparkOffsets[i];
- ptr->x = randPlusMinusPoint5Scaled(6.0f);
- ptr->y = randPlusMinusPoint5Scaled(6.0f);
- ptr->z = randPlusMinusPoint5Scaled(6.0f);
+ ptr->x = Rand_CenteredFloat(6.0f);
+ ptr->y = Rand_CenteredFloat(6.0f);
+ ptr->z = Rand_CenteredFloat(6.0f);
}
}
@@ -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;
@@ -936,14 +937,14 @@ void EnRat_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gBombCapDL);
if (EN_RAT_GET_TYPE(&this->actor) == EN_RAT_TYPE_DUNGEON) {
- redModifier = fabsf(cos_rad(this->timer * (M_PI / 30.f)));
+ redModifier = fabsf(Math_CosF(this->timer * (M_PI / 30.f)));
} else {
if (this->timer >= 120) {
- redModifier = fabsf(cos_rad((this->timer % 30) * (M_PI / 30.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 30) * (M_PI / 30.0f)));
} else if (this->timer >= 30) {
- redModifier = fabsf(cos_rad((this->timer % 6) * (M_PI / 6.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 6) * (M_PI / 6.0f)));
} else {
- redModifier = fabsf(cos_rad((this->timer % 3) * (M_PI / 3.0f)));
+ redModifier = fabsf(Math_CosF((this->timer % 3) * (M_PI / 3.0f)));
}
}
@@ -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_Rat/z_en_rat.h b/src/overlays/actors/ovl_En_Rat/z_en_rat.h
index 9472e8c31..28c880a92 100644
--- a/src/overlays/actors/ovl_En_Rat/z_en_rat.h
+++ b/src/overlays/actors/ovl_En_Rat/z_en_rat.h
@@ -21,7 +21,7 @@
*/
typedef enum {
/* 0 */ EN_RAT_TYPE_DUNGEON,
- /* 1 */ EN_RAT_TYPE_OVERWORLD,
+ /* 1 */ EN_RAT_TYPE_OVERWORLD
} EnRatType;
struct EnRat;
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..34fc41192 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.c
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.c
@@ -94,7 +94,7 @@ typedef enum {
/* 1 */ EN_RD_GRAB_INITIAL_DAMAGE,
/* 2 */ EN_RD_GRAB_ATTACK,
/* 3 */ EN_RD_GRAB_RELEASE,
- /* 4 */ EN_RD_GRAB_END,
+ /* 4 */ EN_RD_GRAB_END
} EnRdGrabState;
ActorInit En_Rd_InitVars = {
@@ -139,7 +139,7 @@ typedef enum {
/* 0xC */ EN_RD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_RD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_RD_DMGEFF_LIGHT_RAY, // Instantly kills on contact
- /* 0xF */ EN_RD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_RD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnRdDamageEffect;
static DamageTable sDamageTable = {
@@ -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_Rd/z_en_rd.h b/src/overlays/actors/ovl_En_Rd/z_en_rd.h
index f5fbf82cb..fced38e75 100644
--- a/src/overlays/actors/ovl_En_Rd/z_en_rd.h
+++ b/src/overlays/actors/ovl_En_Rd/z_en_rd.h
@@ -27,7 +27,7 @@ typedef enum {
/* 4 */ EN_RD_TYPE_FROZEN, // Unused in the final game
/* 5 */ EN_RD_TYPE_SQUATTING_DANCE,
/* 6 */ EN_RD_TYPE_CLAPPING_DANCE,
- /* 7 */ EN_RD_TYPE_PIROUETTE,
+ /* 7 */ EN_RD_TYPE_PIROUETTE
} EnRdType;
typedef struct EnRd {
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..b6407d24b 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;
}
@@ -373,11 +373,11 @@ s32 func_80BF43FC(EnRg* this) {
f32 sp88;
f32 sp84;
f32 phi_f20 = 0.0f;
- s32 temp_s7 = ENRG_GET_7F80(&this->actor);
+ s32 pathIndex = ENRG_GET_PATH_INDEX(&this->actor);
s32 phi_s4 = -1;
s32 temp_s5 = this->unk_344;
s16 phi_s6 = 0;
- s32 phi_s0 = D_80BF57E4[this->unk_344][temp_s7];
+ s32 phi_s0 = D_80BF57E4[this->unk_344][pathIndex];
do {
SubS_CopyPointFromPathCheckBounds(this->path, phi_s0 - 1, &sp9C);
@@ -390,7 +390,7 @@ s32 func_80BF43FC(EnRg* this) {
phi_s4 = phi_s0;
}
phi_s0++;
- } while ((temp_s5 != 18) && (phi_s0 < D_80BF57E4[temp_s5 + 1][temp_s7]));
+ } while ((temp_s5 != 18) && (phi_s0 < D_80BF57E4[temp_s5 + 1][pathIndex]));
return phi_s4;
}
@@ -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 {
@@ -741,7 +741,8 @@ void EnRg_Init(Actor* thisx, PlayState* play) {
Effect_Add(play, &this->unk_340, EFFECT_TIRE_MARK, 0, 0, &D_80BF59F0);
- this->path = SubS_GetDayDependentPath(play, ENRG_GET_7F80(&this->actor), 255, &this->unk_33C);
+ this->path =
+ SubS_GetDayDependentPath(play, ENRG_GET_PATH_INDEX(&this->actor), ENRG_PATH_INDEX_NONE, &this->unk_33C);
if (this->path != NULL) {
this->unk_33C = 1;
}
@@ -804,7 +805,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 +857,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_Rg/z_en_rg.h b/src/overlays/actors/ovl_En_Rg/z_en_rg.h
index 4db0b58e0..14f8e3882 100644
--- a/src/overlays/actors/ovl_En_Rg/z_en_rg.h
+++ b/src/overlays/actors/ovl_En_Rg/z_en_rg.h
@@ -7,7 +7,9 @@ struct EnRg;
typedef void (*EnRgActionFunc)(struct EnRg*, PlayState*);
-#define ENRG_GET_7F80(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+#define ENRG_GET_PATH_INDEX(thisx) ((((thisx)->params & 0x7F80) >> 7) & 0xFF)
+
+#define ENRG_PATH_INDEX_NONE 0xFF
typedef struct {
/* 0x00 */ u8 unk_00;
diff --git a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
index ae7da7d1b..6ea51586a 100644
--- a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
+++ b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c
@@ -35,7 +35,7 @@ void EnRiverSound_Init(Actor* thisx, PlayState* play) {
this->playSound = false;
pathIndex = RS_GET_PATH_INDEX(&this->actor);
this->actor.params = RS_GET_TYPE(&this->actor);
- if (pathIndex == 0xFF) {
+ if (pathIndex == RS_PATH_INDEX_NONE) {
Actor_Kill(&this->actor);
return;
}
diff --git a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
index eff4fbb47..ceef56fbe 100644
--- a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
+++ b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.h
@@ -8,6 +8,8 @@ struct EnRiverSound;
#define RS_GET_TYPE(thisx) ((thisx)->params & 0xFF);
#define RS_GET_PATH_INDEX(thisx) (((thisx)->params >> 8) & 0xFF);
+#define RS_PATH_INDEX_NONE 0xFF
+
// Any param not as one of these values will result in UB
typedef enum {
/* 0x00 */ RS_RIVER_STREAM,
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_Rr/z_en_rr.h b/src/overlays/actors/ovl_En_Rr/z_en_rr.h
index e996cfb12..6f4178dd9 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.h
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.h
@@ -7,12 +7,12 @@ struct EnRr;
typedef void (*EnRrActionFunc)(struct EnRr*, PlayState*);
-enum {
+typedef enum {
/* 0 */ ENRR_0,
/* 1 */ ENRR_1,
/* 2 */ ENRR_2,
- /* 3 */ ENRR_3,
-};
+ /* 3 */ ENRR_3
+} EnRrParam;
typedef struct {
/* 0x00 */ f32 unk_00;
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..3a4d30516 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.c
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.c
@@ -235,7 +235,7 @@ void EnRu_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, RU_GET_PATH(thisx), 0x3F);
+ this->path = SubS_GetPathByIndex(play, RU_GET_PATH_INDEX(thisx), RU_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = EnRu_DoNothing;
this->actor.gravity = -4.0f;
@@ -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_Ru/z_en_ru.h b/src/overlays/actors/ovl_En_Ru/z_en_ru.h
index 081f3bbd8..7aeaea044 100644
--- a/src/overlays/actors/ovl_En_Ru/z_en_ru.h
+++ b/src/overlays/actors/ovl_En_Ru/z_en_ru.h
@@ -4,7 +4,9 @@
#include "global.h"
#include "objects/object_ru2/object_ru2.h"
-#define RU_GET_PATH(thisx) ((thisx->params & 0x7E00) >> 9)
+#define RU_GET_PATH_INDEX(thisx) ((thisx->params & 0x7E00) >> 9)
+
+#define RU_PATH_INDEX_NONE 0x3F
struct EnRu;
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..dfff2735c 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.c
@@ -11,11 +11,11 @@
#define THIS ((EnRuppecrow*)thisx)
-enum {
- ENRUPPECROW_EFFECT_NONE = 0,
- ENRUPPECROW_EFFECT_ICE = 10,
- ENRUPPECROW_EFFECT_LIGHT = 20,
-};
+typedef enum {
+ /* 0x00 */ ENRUPPECROW_EFFECT_NONE = 0,
+ /* 0x0A */ ENRUPPECROW_EFFECT_ICE = 10,
+ /* 0x14 */ ENRUPPECROW_EFFECT_LIGHT = 20
+} EnRuppecrowEffect;
void EnRuppecrow_Init(Actor* thisx, PlayState* play2);
void EnRuppecrow_Destroy(Actor* thisx, PlayState* play);
@@ -153,17 +153,15 @@ s32 EnRuppecrow_ReachedPointClockwise(EnRuppecrow* this, Path* path, s32 pointIn
if (currentPoint == 0) {
diffX = points[1].x - points[0].x;
diffZ = points[1].z - points[0].z;
+ } else if (currentPoint == (pathCount - 1)) {
+ diffX = points[pathCount - 1].x - points[pathCount - 2].x;
+ diffZ = points[pathCount - 1].z - points[pathCount - 2].z;
} else {
- if (currentPoint == (pathCount - 1)) {
- diffX = points[pathCount - 1].x - points[pathCount - 2].x;
- diffZ = points[pathCount - 1].z - points[pathCount - 2].z;
- } else {
- diffX = points[currentPoint + 1].x - points[currentPoint - 1].x;
- diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
- }
+ diffX = points[currentPoint + 1].x - points[currentPoint - 1].x;
+ diffZ = points[currentPoint + 1].z - points[currentPoint - 1].z;
}
- func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -188,17 +186,15 @@ s32 EnRuppecrow_ReachedPointCounterClockwise(EnRuppecrow* this, Path* path, s32
if (currentPoint == 0) {
diffX = points[0].x - points[1].x;
diffZ = points[0].z - points[1].z;
+ } else if (currentPoint == (pathCount - 1)) {
+ diffX = points[pathCount - 2].x - points[pathCount - 1].x;
+ diffZ = points[pathCount - 2].z - points[pathCount - 1].z;
} else {
- if (currentPoint == (pathCount - 1)) {
- diffX = points[pathCount - 2].x - points[pathCount - 1].x;
- diffZ = points[pathCount - 2].z - points[pathCount - 1].z;
- } else {
- diffX = points[currentPoint - 1].x - points[currentPoint + 1].x;
- diffZ = points[currentPoint - 1].z - points[currentPoint + 1].z;
- }
+ diffX = points[currentPoint - 1].x - points[currentPoint + 1].x;
+ diffZ = points[currentPoint - 1].z - points[currentPoint + 1].z;
}
- func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d);
+ func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d);
if (((this->actor.world.pos.x * px) + (pz * this->actor.world.pos.z) + d) > 0.0f) {
reached = true;
}
@@ -236,19 +232,23 @@ s32 EnRuppecrow_CanSpawnBlueRupees(PlayState* play) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
return false;
+
case PLAYER_FORM_GORON:
return true;
+
case PLAYER_FORM_ZORA:
return false;
+
case PLAYER_FORM_HUMAN:
if (player->stateFlags1 & PLAYER_STATE1_800000) {
return true;
} else {
return false;
}
- }
- return false;
+ default:
+ return false;
+ }
}
void EnRuppecrow_UpdateRupees(EnRuppecrow* this) {
@@ -257,7 +257,7 @@ void EnRuppecrow_UpdateRupees(EnRuppecrow* this) {
for (rupeeIndex = 0; rupeeIndex < ENRUPPECROW_RUPEE_COUNT; rupeeIndex++) {
rupee = this->rupees[rupeeIndex];
- if (rupee != NULL && rupee->unk152 == 0) {
+ if ((rupee != NULL) && (rupee->unk152 == 0)) {
Actor_Kill(&rupee->actor);
}
}
@@ -375,16 +375,19 @@ s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
return true;
}
break;
+
case PLAYER_FORM_GORON:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_GORON_LULLABY) {
return true;
}
break;
+
case PLAYER_FORM_ZORA:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_NEW_WAVE) {
return true;
}
break;
+
case PLAYER_FORM_HUMAN:
if (play->msgCtx.lastPlayedSong == OCARINA_SONG_SONATA) {
return true;
@@ -394,6 +397,9 @@ s32 EnRuppecrow_CheckPlayedMatchingSong(PlayState* play) {
return true;
}
break;
+
+ default:
+ break;
}
}
@@ -407,6 +413,7 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
case PLAYER_FORM_DEKU:
this->speedModifier = 7.0f;
break;
+
case PLAYER_FORM_GORON:
if (player->stateFlags3 & PLAYER_STATE3_1000) { // Goron Link is curled
this->speedModifier = 19.0f;
@@ -414,9 +421,11 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
this->speedModifier = 7.0f;
}
break;
+
case PLAYER_FORM_ZORA:
this->speedModifier = 7.0f;
break;
+
case PLAYER_FORM_HUMAN:
if (player->stateFlags1 & PLAYER_STATE1_800000) {
this->speedModifier = 16.0f;
@@ -424,6 +433,9 @@ void EnRuppecrow_UpdateSpeed(EnRuppecrow* this, PlayState* play) {
this->speedModifier = 7.0f;
}
break;
+
+ default:
+ break;
}
this->skelAnime.playSpeed = this->speedModifier / 6.0f;
@@ -640,7 +652,7 @@ void EnRuppecrow_Init(Actor* thisx, PlayState* play2) {
Actor_SetScale(&this->actor, 0.01f);
this->actor.flags |= ACTOR_FLAG_2000000;
- this->path = SubS_GetPathByIndex(play, ENRUPPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENRUPPECROW_GET_PATH_INDEX(&this->actor), ENRUPPECROW_PATH_INDEX_NONE);
if (this->path != NULL) {
this->actionFunc = EnRuppecrow_HandleSong;
} else {
@@ -668,7 +680,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_Ruppecrow/z_en_ruppecrow.h b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
index 887cd8c6b..5d591258b 100644
--- a/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
+++ b/src/overlays/actors/ovl_En_Ruppecrow/z_en_ruppecrow.h
@@ -4,7 +4,9 @@
#include "global.h"
#include "objects/object_crow/object_crow.h"
-#define ENRUPPECROW_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENRUPPECROW_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENRUPPECROW_PATH_INDEX_NONE 0x3F
#define ENRUPPECROW_RUPEE_COUNT 20
#define ENRUPPECROW_LIMB_POS_COUNT 4
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..e980d1cb5 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.c
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.c
@@ -247,8 +247,8 @@ void func_80BFBA1C(PlayState* play, EnRz* this, s16 animIndex) {
}
s32 EnRz_SetupPath(EnRz* this, PlayState* play) {
- if (EN_RZ_GET_PATH(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[EN_RZ_GET_PATH(&this->actor)];
+ if (EN_RZ_GET_PATH_INDEX(&this->actor) != EN_RZ_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[EN_RZ_GET_PATH_INDEX(&this->actor)];
if (this->path != NULL) {
Path* path = this->path;
Vec3s* points = (Vec3s*)Lib_SegmentedToVirtual(path->points);
@@ -347,9 +347,9 @@ EnRz* EnRz_FindSister(EnRz* this, PlayState* play) {
void func_80BFBDFC(PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_75_80)) {
- func_80151BB4(play, 0x27);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP);
}
- func_80151BB4(play, 0xC);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS);
}
void EnRz_Destroy(Actor* thisx, PlayState* play) {
@@ -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_Rz/z_en_rz.h b/src/overlays/actors/ovl_En_Rz/z_en_rz.h
index c6d8fe3c8..a29f6d5c2 100644
--- a/src/overlays/actors/ovl_En_Rz/z_en_rz.h
+++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.h
@@ -6,7 +6,9 @@
#define EN_RZ_GET_SISTER(thisx) ((thisx)->params & 0x8000)
#define EN_RZ_GET_TYPE(thisx) ((thisx)->params & 0xF)
-#define EN_RZ_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define EN_RZ_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define EN_RZ_PATH_INDEX_NONE 0x3F
typedef enum {
/* 0 */ EN_RZ_JUDO, // in red
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..54fe2698d 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
@@ -171,12 +171,12 @@ static AnimationInfoS sAnimationInfo[] = {
{ &gGoronUnrollAnim, -2.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronShiverAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
- { &object_taisou_Anim_004DD4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_00283C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_007764, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_005790, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsDoubleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsShakeLimbsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsSingleArmSideBendAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
+ { &gGoronAthleticsHamstringStretchStandingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gGoronCoverEarsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
- { &object_taisou_Anim_002C48, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
+ { &gGoronAthleticsCheerAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronStandingHandTappingAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gGoronSleepyAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gGoronStandingIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
@@ -235,7 +235,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
switch (EN_S_GORO_GET_MAIN_TYPE(&this->actor)) {
case EN_S_GORO_TYPE_SHRINE_WINTER_A:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_02)) {
switch (this->textId) {
@@ -302,7 +302,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_B:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_36_40)) {
switch (this->textId) {
@@ -367,7 +367,7 @@ u16 EnSGoro_ShrineGoron_NextTextId(EnSGoro* this, PlayState* play) {
break;
case EN_S_GORO_TYPE_SHRINE_WINTER_C:
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
if (player->transformation == PLAYER_FORM_GORON) {
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_37_02)) {
switch (this->textId) {
@@ -771,7 +771,7 @@ void EnSGoro_UpdateSleeping(EnSGoro* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_GOLON_SNORE1);
}
}
- } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags &= ~EN_S_GORO_ACTIONFLAG_SUPPRESS_SNORE;
}
@@ -842,7 +842,7 @@ s32 EnSGoro_CheckGKBehavior(EnSGoro* this, PlayState* play) {
return false;
}
if ((!(this->actionFlags & EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED)) &&
- ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04))) {
+ ((((EnGk*)this->otherGoron)->unk_1E4 & 0x80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON))) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->animInfoIndex = EN_S_GORO_ANIM_ROLLUP;
@@ -1026,7 +1026,7 @@ void EnSGoro_SetupAction(EnSGoro* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->loadedObjIndex)) {
this->actionFlags = 0;
if (EN_S_GORO_OFTYPE_WSHRINE) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_04)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CALMED_GORON_ELDERS_SON)) {
this->actionFlags |= EN_S_GORO_ACTIONFLAG_GKQUIET_ACKNOWLEDGED;
this->actionFlags |= EN_S_GORO_ACTIONFLAG_EYESOPEN;
this->animInfoIndex = EN_S_GORO_ANIM_SHIVER_A;
@@ -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_Sb/z_en_sb.c b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
index b34ee8c64..17ad656a4 100644
--- a/src/overlays/actors/ovl_En_Sb/z_en_sb.c
+++ b/src/overlays/actors/ovl_En_Sb/z_en_sb.c
@@ -417,9 +417,9 @@ void EnSb_Draw(Actor* thisx, PlayState* play) {
fireDecr = this->fireCount - 1;
if (!(fireDecr & 1)) {
offset = &sFlamePosOffsets[fireDecr & 3];
- flamePos.x = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.x + offset->x);
- flamePos.y = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.y + offset->y);
- flamePos.z = randPlusMinusPoint5Scaled(5.0f) + (this->actor.world.pos.z + offset->z);
+ flamePos.x = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.x + offset->x);
+ flamePos.y = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.y + offset->y);
+ flamePos.z = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.z + offset->z);
EffectSsEnFire_SpawnVec3f(play, &this->actor, &flamePos, 100, 0, 0, -1);
}
}
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..5a3dc440a 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
@@ -21,7 +21,7 @@ void func_80BD6B18(EnScRuppe* this, PlayState* play);
typedef struct {
/* 0x0 */ TexturePtr tex;
/* 0x4 */ s16 amount;
-} RuppeInfo;
+} RuppeInfo; // size = 0x8
ActorInit En_Sc_Ruppe_InitVars = {
ACTOR_EN_SC_RUPPE,
@@ -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_Sc_Ruppe/z_en_sc_ruppe.h b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
index 8ef0f4c56..afc955985 100644
--- a/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
+++ b/src/overlays/actors/ovl_En_Sc_Ruppe/z_en_sc_ruppe.h
@@ -23,7 +23,7 @@ typedef enum {
/* 2 */ RUPEE_RED,
/* 3 */ RUPEE_ORANGE,
/* 4 */ RUPEE_PURPLE,
- /* 5 */ RUPEE_UNUSED,
+ /* 5 */ RUPEE_UNUSED
} RupeeType;
#endif // Z_EN_SC_RUPPE_H
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..448683376 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.c
@@ -192,7 +192,7 @@ s32 func_80BCD334(EnScopecrow* this, Path* path, s32 pointIndex) {
phi_fa1 = points[index + 1].z - points[index - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_fa0, phi_fa1)), &sp3C.z, &sp3C.y, &sp3C.x);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_fa0, phi_fa1)), &sp3C.z, &sp3C.y, &sp3C.x);
if (((this->actor.world.pos.x * sp3C.z) + (sp3C.y * this->actor.world.pos.z) + sp3C.x) > 0.0f) {
ret = true;
@@ -276,7 +276,7 @@ void EnScopecrow_Init(Actor* thisx, PlayState* play) {
}
if (func_80BCD09C(this->unk_260)) {
- this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH_INDEX(&this->actor), ENSCOPECROW_PATH_INDEX_NONE);
this->unk_262 = ENSCOPECROW_GET_3E0(&this->actor);
if (this->path != NULL) {
@@ -316,7 +316,7 @@ void EnScopecrow_Init(Actor* thisx, PlayState* play) {
this->collider.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
Actor_SetScale(&this->actor, 0.03f);
- this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENSCOPECROW_GET_PATH_INDEX(&this->actor), ENSCOPECROW_PATH_INDEX_NONE);
this->unk_262 = ENSCOPECROW_GET_3E0(&this->actor);
if (this->path != NULL) {
@@ -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_Scopecrow/z_en_scopecrow.h b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
index 30f002fb5..523d28804 100644
--- a/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
+++ b/src/overlays/actors/ovl_En_Scopecrow/z_en_scopecrow.h
@@ -10,7 +10,9 @@ typedef void (*EnScopecrowActionFunc)(struct EnScopecrow*, PlayState*);
#define ENSCOPECROW_GET_1F(thisx) ((thisx)->params & 0x1F)
#define ENSCOPECROW_GET_3E0(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENSCOPECROW_GET_PATH(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSCOPECROW_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSCOPECROW_PATH_INDEX_NONE 0x3F
typedef struct EnScopecrow {
/* 0x000 */ Actor 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..cf634321e 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.c
@@ -654,7 +654,7 @@ s32 func_80BCC2AC(EnScopenuts* this, Path* path, s32 arg2_) {
phi_f14 = sp5C[arg2 + 1].z - sp5C[arg2 - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
@@ -708,7 +708,8 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_40)) {
Actor_Kill(&this->actor);
} else if (play->actorCtx.flags & ACTORCTX_FLAG_1) {
- this->path = SubS_GetPathByIndex(play, ENSCOPENUTS_GET_FC00(&this->actor), 0x3F);
+ this->path =
+ SubS_GetPathByIndex(play, ENSCOPENUTS_GET_PATH_INDEX(&this->actor), ENSCOPENUTS_PATH_INDEX_NONE);
this->actor.draw = NULL;
this->actionFunc = func_80BCAFA8;
this->actor.gravity = 0.0f;
@@ -717,7 +718,8 @@ void EnScopenuts_Init(Actor* thisx, PlayState* play) {
}
} else if (ENSCOPENUTS_GET_3E0(&this->actor) == ENSCOPENUTS_3E0_1) {
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_40)) {
- this->path = SubS_GetPathByIndex(play, ENSCOPENUTS_GET_FC00(&this->actor), 0x3F);
+ this->path =
+ SubS_GetPathByIndex(play, ENSCOPENUTS_GET_PATH_INDEX(&this->actor), ENSCOPENUTS_PATH_INDEX_NONE);
if (this->path == NULL) {
Actor_Kill(&this->actor);
} else {
@@ -823,7 +825,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_Scopenuts/z_en_scopenuts.h b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
index ef2ea74d8..3f1b8b84e 100644
--- a/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
+++ b/src/overlays/actors/ovl_En_Scopenuts/z_en_scopenuts.h
@@ -8,7 +8,9 @@ struct EnScopenuts;
typedef void (*EnScopenutsActionFunc)(struct EnScopenuts*, PlayState*);
#define ENSCOPENUTS_GET_3E0(thisx) (((thisx)->params & 0x3E0) >> 5)
-#define ENSCOPENUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSCOPENUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSCOPENUTS_PATH_INDEX_NONE 0x3F
#define ENSCOPENUTS_3E0_0 0
#define ENSCOPENUTS_3E0_1 1
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..909510329 100644
--- a/src/overlays/actors/ovl_En_Sda/z_en_sda.c
+++ b/src/overlays/actors/ovl_En_Sda/z_en_sda.c
@@ -228,7 +228,8 @@ void func_8094702C(EnSda* this, u8* shadowTexture, Player* player, PlayState* pl
if (BREG(57) != 0) {
for (shadowTextureTemp = shadowTexture, i = 0; i < 0x1000; i++, shadowTextureTemp++) {
- if ((i >= 0 && i < 0x40) || (i >= 0xFC0 && i < 0x1000) || ((i & 0x3F) == 0) || ((i & 0x3F) == 0x3F)) {
+ if (((i >= 0) && (i < 0x40)) || ((i >= 0xFC0) && (i < 0x1000)) || ((i & 0x3F) == 0) ||
+ ((i & 0x3F) == 0x3F)) {
*shadowTextureTemp = 255;
} else {
*shadowTextureTemp = 0;
@@ -323,7 +324,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);
@@ -352,6 +353,4 @@ void func_80947668(u8* shadowTexture, Player* player, PlayState* play) {
}
CLOSE_DISPS(gfxCtx);
-
- if (1) {}
}
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..73edc4267 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c
@@ -916,7 +916,7 @@ s32 func_80ADCE4C(EnSellnuts* this, Path* path, s32 arg2) {
pointY = points[var + 1].z - points[var - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(pointX, pointY)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(pointX, pointY)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -958,7 +958,7 @@ void EnSellnuts_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
Collider_SetCylinderType1(play, &this->collider, &this->actor, &sCylinderInit);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 35.0f);
- this->path = SubS_GetPathByIndex(play, ENSELLNUTS_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENSELLNUTS_GET_PATH_INDEX(&this->actor), ENSELLNUTS_PATH_INDEX_NONE);
this->csId = this->actor.csId;
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.cylRadius = 0;
@@ -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_Sellnuts/z_en_sellnuts.h b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
index 3acf7a3e0..d56c04f9e 100644
--- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
+++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.h
@@ -8,7 +8,9 @@ struct EnSellnuts;
typedef void (*EnSellnutsActionFunc)(struct EnSellnuts*, PlayState*);
#define ENSELLNUTS_GET_1(thisx) ((thisx)->params & 1)
-#define ENSELLNUTS_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENSELLNUTS_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENSELLNUTS_PATH_INDEX_NONE 0x3F
typedef struct EnSellnuts {
/* 0x000 */ Actor 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..a8167009c 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -165,10 +165,10 @@ void func_809947B0(PlayState* play, EnSkb* this, Vec3f* inPos) {
s32 pad;
pos.y = this->actor.floorHeight;
- pos.x = (sin_rad(sp40) * 15.0f) + inPos->x;
- pos.z = (cos_rad(sp40) * 15.0f) + inPos->z;
- accel.x = randPlusMinusPoint5Scaled(1.0f);
- accel.z = randPlusMinusPoint5Scaled(1.0f);
+ pos.x = (Math_SinF(sp40) * 15.0f) + inPos->x;
+ pos.z = (Math_CosF(sp40) * 15.0f) + inPos->z;
+ accel.x = Rand_CenteredFloat(1.0f);
+ accel.z = Rand_CenteredFloat(1.0f);
velocity.y += (Rand_ZeroOne() - 0.5f) * 4.0f;
EffectSsHahen_Spawn(play, &pos, &velocity, &accel, 0, ((Rand_ZeroOne() * 5.0f) + 12.0f) * 0.8f,
HAHEN_OBJECT_DEFAULT, 10, NULL);
@@ -579,7 +579,7 @@ void func_80995A8C(EnSkb* this, PlayState* play) {
}
if ((this->unk_3D8 != 0) && ((play->gameplayFrames % 16) == 0)) {
- this->unk_3DA = randPlusMinusPoint5Scaled(50000.0f);
+ this->unk_3DA = Rand_CenteredFloat(50000.0f);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer + this->unk_3DA, 1, 0x2EE, 0);
@@ -742,11 +742,11 @@ void func_809961E4(EnSkb* this, PlayState* play) {
}
void func_80996284(EnSkb* this, PlayState* play) {
- if (this->unk_3D8 & 0x80) {
- if (1) {}
- Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
- func_80996474(this);
+ if (!(this->unk_3D8 & 0x80)) {
+ return;
}
+ Item_DropCollectibleRandom(play, &this->actor, &this->actor.world.pos, 0x10);
+ func_80996474(this);
}
void func_809962D4(EnSkb* this) {
@@ -982,22 +982,22 @@ void func_8099672C(EnSkb* this, PlayState* play) {
}
void func_80996AD0(EnSkb* this, PlayState* play) {
- if (1) {}
+ if ((this->actionFunc == func_80996284) || (this->unk_3E2 == 1)) {
+ return;
+ }
- if ((this->actionFunc != func_80996284) && (this->unk_3E2 != 1)) {
- if (this->unk_3E4 != 0) {
- CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
- }
+ if (this->unk_3E4 != 0) {
+ CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
+ }
- if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
- (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
- ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if (((this->unk_3DE != 0) || (this->unk_3D0 >= 11)) && (this->unk_3DE != 1) && (this->unk_3DE != 4) &&
+ (this->unk_3DE != 6) && (this->unk_3DE != 7) &&
+ ((this->actor.colorFilterTimer == 0) || !(this->actor.colorFilterParams & 0x4000))) {
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
+ }
- if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
- CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actionFunc != func_80996284) && (this->actionFunc != func_809964A0)) {
+ CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
}
@@ -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_Skb/z_en_skb.h b/src/overlays/actors/ovl_En_Skb/z_en_skb.h
index 1fbf441ea..1970ebf8c 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.h
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.h
@@ -10,8 +10,8 @@ typedef void (*EnSkbActionFunc)(struct EnSkb*, PlayState*);
#define ENSKB_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
typedef enum {
- /* 0 */ ENSKB_PARAMS_0,
-} EnSkbParams;
+ /* 0 */ ENSKB_PARAM_0
+} EnSkbParam;
typedef struct EnSkb {
/* 0x000 */ Actor actor;
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..5e71d1a54 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.c
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.c
@@ -28,7 +28,7 @@ typedef enum EnSlimeDamageEffect {
/* 0x4 */ EN_SLIME_DMGEFF_LIGHT,
/* 0x5 */ EN_SLIME_DMGEFF_ELECTRIC,
/* 0xE */ EN_SLIME_DMGEFF_HOOKSHOT = 0xE,
- /* 0xF */ EN_SLIME_DMGEFF_BLUNT,
+ /* 0xF */ EN_SLIME_DMGEFF_BLUNT
} EnSlimeDamageEffect;
void EnSlime_Init(Actor* thisx, PlayState* play);
@@ -328,15 +328,15 @@ void EnSlime_Idle(EnSlime* this, PlayState* play) {
timerFactor = sqrtf(this->timer) * 0.2f;
EnSlime_Blink(this);
- scale = ((sin_rad(this->timer * (2.0f * M_PI / 5.0f)) * (0.13f * timerFactor)) + 1.0f) * 0.01f;
+ scale = ((Math_SinF(this->timer * (2.0f * M_PI / 5.0f)) * (0.13f * timerFactor)) + 1.0f) * 0.01f;
this->actor.scale.x = scale;
this->actor.scale.z = scale;
if (this->timer < 24) {
- this->actor.scale.y = ((cos_rad(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * timerFactor)) + 1.0f) * 0.01f;
+ this->actor.scale.y = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * timerFactor)) + 1.0f) * 0.01f;
}
- this->actor.shape.rot.x = randPlusMinusPoint5Scaled(0x200) * timerFactor;
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled(0x200) * timerFactor;
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * timerFactor;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * timerFactor;
// If player is not wearing the stone mask, is within 280 units of the chuchu,
// and the chuchu is facing the player, initialize chase/attack cycle.
@@ -361,7 +361,7 @@ void EnSlime_SetupMoveInDirection(EnSlime* this) {
if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > 120.0f) {
this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
} else if (Rand_ZeroOne() < 0.7f) {
- this->idleRotY = (s32)randPlusMinusPoint5Scaled(0x4000) + this->actor.shape.rot.y;
+ this->idleRotY = (s32)Rand_CenteredFloat(0x4000) + this->actor.shape.rot.y;
}
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnSlime_MoveInDirection;
@@ -390,7 +390,7 @@ void EnSlime_MoveInDirection(EnSlime* this, PlayState* play) {
}
// Update actor scale, xz speed, and rotation to provide amorphous effect
- sinFactor = fabsf(sin_rad(this->timer * (M_PI / 24)));
+ sinFactor = fabsf(Math_SinF(this->timer * (M_PI / 24)));
Math_StepToF(&this->actor.scale.z, ((0.15f * sinFactor) + 1.0f) * 0.01f, 0.0002f);
Math_StepToF(&this->actor.scale.x, (1.0f - (0.2f * sinFactor)) * 0.01f, 0.0002f);
Math_StepToF(&this->actor.scale.y, (1.0f - (0.1f * sinFactor)) * 0.01f, 0.0002f);
@@ -443,7 +443,7 @@ void EnSlime_MoveToHome(EnSlime* this, PlayState* play) {
this->idleRotY = Actor_WorldYawTowardPoint(&this->actor, &this->actor.home.pos);
}
- timerFactor = fabsf(sin_rad(this->timer * (M_PI / 24)));
+ timerFactor = fabsf(Math_SinF(this->timer * (M_PI / 24)));
Math_StepToF(&this->actor.scale.z, ((0.15f * timerFactor) + 1.0f) * 0.01f, 0.0002f);
Math_StepToF(&this->actor.scale.x, (1.0f - (0.2f * timerFactor)) * 0.01f, 0.0002f);
Math_StepToF(&this->actor.scale.y, (1.0f - (0.1f * timerFactor)) * 0.01f, 0.0002f);
@@ -567,14 +567,14 @@ void EnSlime_Land(EnSlime* this, PlayState* play) {
this->timer--;
scaleY = ((this->timer / 5) + 1) * 1.6f;
rotXZ = sqrtf(this->timer) * 0.2f;
- scaleXZ = ((cos_rad(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * scaleY)) + 1.0f) * 0.01f;
+ scaleXZ = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.05f * scaleY)) + 1.0f) * 0.01f;
this->actor.scale.x = scaleXZ;
this->actor.scale.z = scaleXZ;
if (this->timer < 15) {
- this->actor.scale.y = (1.0f - (sin_rad(this->timer * (2.0f * M_PI / 5.0f)) * (0.04f * scaleY))) * 0.01f;
+ this->actor.scale.y = (1.0f - (Math_SinF(this->timer * (2.0f * M_PI / 5.0f)) * (0.04f * scaleY))) * 0.01f;
}
- this->actor.shape.rot.x = randPlusMinusPoint5Scaled(0x200) * rotXZ;
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled(0x200) * rotXZ;
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * rotXZ;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * rotXZ;
if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > this->distLimit) {
EnSlime_SetupMoveToHome(this);
@@ -623,16 +623,16 @@ void EnSlime_ReactToBluntHit(EnSlime* this, PlayState* play) {
Math_StepToF(&this->actor.speed, 0.0f, 1.0f);
timerFactor = sqrtf(this->timer);
if (this->timer < 30) {
- scale = ((cos_rad(this->timer * (2.0f * M_PI / 5.0f)) * (0.08f * timerFactor)) + 1.0f) * 0.01f;
+ scale = ((Math_CosF(this->timer * (2.0f * M_PI / 5.0f)) * (0.08f * timerFactor)) + 1.0f) * 0.01f;
this->actor.scale.x = scale;
this->actor.scale.z = scale;
}
if (this->timer == 15) {
this->collider.base.acFlags |= AC_ON;
}
- this->actor.scale.y = ((sin_rad((f32)this->timer * (2.0f * M_PI / 5.0f)) * (0.07f * timerFactor)) + 1.0f) * 0.01f;
- this->actor.shape.rot.x = randPlusMinusPoint5Scaled(0x200) * timerFactor;
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled(0x200) * timerFactor;
+ this->actor.scale.y = ((Math_SinF((f32)this->timer * (2.0f * M_PI / 5.0f)) * (0.07f * timerFactor)) + 1.0f) * 0.01f;
+ this->actor.shape.rot.x = Rand_CenteredFloat(0x200) * timerFactor;
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x200) * timerFactor;
if (this->timer == 0) {
if (Actor_WorldDistXZToPoint(&this->actor, &this->actor.home.pos) > this->distLimit) {
@@ -680,9 +680,9 @@ void EnSlime_SetupDamaged(EnSlime* this, PlayState* play, s32 arg2) {
EffectSsGSplash_Spawn(play, &effectPos, NULL, NULL, 1, 550);
for (i = 0; i < 10; i++) {
- effectPos.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x + ySin;
- effectPos.y = randPlusMinusPoint5Scaled(10.0f) + this->actor.world.pos.y + 40.0f;
- effectPos.z = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.z + yCos;
+ effectPos.x = Rand_CenteredFloat(40.0f) + this->actor.world.pos.x + ySin;
+ effectPos.y = Rand_CenteredFloat(10.0f) + this->actor.world.pos.y + 40.0f;
+ effectPos.z = Rand_CenteredFloat(40.0f) + this->actor.world.pos.z + yCos;
effectVelocity.x = ((Rand_ZeroOne() * 3.5f) + 1.0f) * -Math_SinS(this->actor.world.rot.y);
effectVelocity.z = ((Rand_ZeroOne() * 3.5f) + 1.0f) * -Math_CosS(this->actor.world.rot.y);
@@ -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);
@@ -1184,9 +1184,9 @@ void EnSlime_Draw(Actor* thisx, PlayState* play) {
}
if (this->actionFunc == EnSlime_Damaged) {
- wobbleScale.x = 1.0f - (sin_rad((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
- wobbleScale.y = (sin_rad((f32)this->timer * (M_PI / 2.0f)) * 0.3f) + 1.0f;
- wobbleScale.z = 1.0f - (cos_rad((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
+ wobbleScale.x = 1.0f - (Math_SinF((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
+ wobbleScale.y = (Math_SinF((f32)this->timer * (M_PI / 2.0f)) * 0.3f) + 1.0f;
+ wobbleScale.z = 1.0f - (Math_CosF((f32)this->timer * (M_PI / 2.0f)) * 0.3f);
Matrix_RotateXFApply(this->wobbleRot.x);
Matrix_RotateZF(this->wobbleRot.z, MTXMODE_APPLY);
@@ -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_Slime/z_en_slime.h b/src/overlays/actors/ovl_En_Slime/z_en_slime.h
index 0a40a117e..130c442de 100644
--- a/src/overlays/actors/ovl_En_Slime/z_en_slime.h
+++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.h
@@ -42,7 +42,7 @@ typedef enum EnSlimeType {
/* 0 */ EN_SLIME_TYPE_BLUE,
/* 1 */ EN_SLIME_TYPE_GREEN,
/* 2 */ EN_SLIME_TYPE_YELLOW,
- /* 3 */ EN_SLIME_TYPE_RED,
+ /* 3 */ EN_SLIME_TYPE_RED
} EnSlimeType;
#endif // Z_EN_SLIME_H
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..e22a5a73b 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.c
@@ -58,7 +58,7 @@ typedef enum {
// Indicates that either this Eeno is shrinking having been absorbed by another Eeno, or that
// this Eeno is a fully-combined large Eeno and is done trying to combine with other split
// Eenos. In both cases, this Eeno cannot be absorbed by any other Eeno.
- /* 3 */ EN_SNOWMAN_COMBINE_STATE_BEING_ABSORBED_OR_DONE,
+ /* 3 */ EN_SNOWMAN_COMBINE_STATE_BEING_ABSORBED_OR_DONE
} EnSnowmanCombineState;
ActorInit En_Snowman_InitVars = {
@@ -119,7 +119,7 @@ typedef enum {
/* 0x2 */ EN_SNOWMAN_DMGEFF_MELT,
/* 0x4 */ EN_SNOWMAN_DMGEFF_LIGHT_ORB = 0x4,
/* 0x5 */ EN_SNOWMAN_DMGEFF_ELECTRIC_STUN,
- /* 0xF */ EN_SNOWMAN_DMGEFF_HOOKSHOT = 0xF, // Damages small Eenos, pulls the player towards large Eenos
+ /* 0xF */ EN_SNOWMAN_DMGEFF_HOOKSHOT = 0xF // Damages small Eenos, pulls the player towards large Eenos
} EnTalkGibudDamageEffect;
static DamageTable sDamageTable = {
@@ -475,18 +475,18 @@ void EnSnowman_ReadySnowball(EnSnowman* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0x1000);
if ((EN_SNOWMAN_GET_TYPE(&this->actor) != EN_SNOWMAN_TYPE_LARGE) && this->isHoldingSnowball &&
((play->gameplayFrames % 2) != 0)) {
- pos.x = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.x;
- pos.y = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.y;
- pos.z = randPlusMinusPoint5Scaled(10.0f) + this->snowballPos.z;
+ pos.x = Rand_CenteredFloat(10.0f) + this->snowballPos.x;
+ pos.y = Rand_CenteredFloat(10.0f) + this->snowballPos.y;
+ pos.z = Rand_CenteredFloat(10.0f) + this->snowballPos.z;
func_800B0DE0(play, &pos, &sDustVelocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 500, 30);
} else if (EN_SNOWMAN_GET_TYPE(&this->actor) == EN_SNOWMAN_TYPE_LARGE) {
if ((this->skelAnime.curFrame > 3.0f) && (this->skelAnime.curFrame < 14.0f) &&
((play->gameplayFrames % 2) != 0)) {
- pos.x = (this->actor.world.pos.x + (70.0f * Math_SinS(this->actor.shape.rot.y))) +
- randPlusMinusPoint5Scaled(40.0f);
- pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(20.0f);
- pos.z = (this->actor.world.pos.z + (70.0f * Math_CosS(this->actor.shape.rot.y))) +
- randPlusMinusPoint5Scaled(40.0f);
+ pos.x =
+ (this->actor.world.pos.x + (70.0f * Math_SinS(this->actor.shape.rot.y))) + Rand_CenteredFloat(40.0f);
+ pos.y = this->actor.world.pos.y + Rand_CenteredFloat(20.0f);
+ pos.z =
+ (this->actor.world.pos.z + (70.0f * Math_CosS(this->actor.shape.rot.y))) + Rand_CenteredFloat(40.0f);
func_800B0DE0(play, &pos, &sDustVelocity, &gZeroVec3f, &sDustPrimColor, &sDustEnvColor, 1000, 150);
}
}
@@ -619,8 +619,8 @@ void EnSnowman_Melt(EnSnowman* this, PlayState* play) {
this->work.timer--;
if ((this->work.timer >= 38) && (!(this->work.timer & 1))) {
smokeVelocity.y = (this->work.timer - 38) * (1.0f / 12.0f);
- smokeVelocity.x = randPlusMinusPoint5Scaled(1.5f) * smokeVelocity.y;
- smokeVelocity.z = randPlusMinusPoint5Scaled(1.5f) * smokeVelocity.y;
+ smokeVelocity.x = Rand_CenteredFloat(1.5f) * smokeVelocity.y;
+ smokeVelocity.z = Rand_CenteredFloat(1.5f) * smokeVelocity.y;
smokeVelocity.y += 0.8f;
smokePos.x = ((smokeVelocity.x >= 0.0f ? 1.0f : -1.0f) * Rand_ZeroFloat(20.0f) * this->eenoScale) +
this->actor.world.pos.x;
@@ -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_Snowman/z_en_snowman.h b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
index da0c0a30a..55285fec8 100644
--- a/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
+++ b/src/overlays/actors/ovl_En_Snowman/z_en_snowman.h
@@ -12,7 +12,7 @@ typedef enum {
/* 1 */ EN_SNOWMAN_TYPE_LARGE,
/* 2 */ EN_SNOWMAN_TYPE_SPLIT,
/* 3 */ EN_SNOWMAN_TYPE_SMALL_SNOWBALL,
- /* 4 */ EN_SNOWMAN_TYPE_LARGE_SNOWBALL,
+ /* 4 */ EN_SNOWMAN_TYPE_LARGE_SNOWBALL
} EnSnowmanType;
struct EnSnowman;
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 a23600fb9..3cd33653b 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.c
@@ -176,7 +176,7 @@ void EnSob1_SetupAction(EnSob1* this, EnSob1ActionFunc action) {
s32 EnSob1_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -188,7 +188,7 @@ u16 EnSob1_GetTalkOption(EnSob1* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if (this->shopType == BOMB_SHOP) {
- if (gSaveContext.save.day == 1 && gSaveContext.save.time >= CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.day == 1) && (gSaveContext.save.time >= CLOCK_TIME(6, 00))) {
return 0x648;
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
return 0x649;
@@ -199,10 +199,13 @@ u16 EnSob1_GetTalkOption(EnSob1* this, PlayState* play) {
switch (player->transformation) {
case PLAYER_FORM_DEKU:
return 0x12D8;
+
case PLAYER_FORM_GORON:
return 0x12D9;
+
case PLAYER_FORM_ZORA:
return 0x12DA;
+
default:
return 0x12D7;
}
@@ -405,6 +408,7 @@ void EnSob1_Init(Actor* thisx, PlayState* play) {
case ZORA_SHOP:
this->shopType = ZORA_SHOP;
break;
+
case GORON_SHOP:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE)) {
this->shopType = GORON_SHOP_SPRING;
@@ -412,9 +416,11 @@ void EnSob1_Init(Actor* thisx, PlayState* play) {
this->shopType = GORON_SHOP;
}
break;
+
case BOMB_SHOP:
this->shopType = BOMB_SHOP;
break;
+
default:
Actor_Kill(&this->actor);
return;
@@ -579,10 +585,10 @@ void EnSob1_UpdateJoystickInputState(PlayState* play, EnSob1* this) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -595,10 +601,10 @@ void EnSob1_UpdateJoystickInputState(PlayState* play, EnSob1* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -646,6 +652,7 @@ s32 EnSob1_FacingShopkeeperDialogResult(EnSob1* this, PlayState* play) {
func_8019F208();
EnSob1_TalkToShopkeeper(play, this);
return true;
+
case 1:
func_8019F230();
if (this->shopType == BOMB_SHOP) {
@@ -986,6 +993,7 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_SUCCESS_2:
func_8019F208();
item->buyFunc(play, item);
@@ -1002,38 +1010,49 @@ void EnSob1_HandleCanBuyItem(PlayState* play, EnSob1* this) {
this->shopItemSelectedTween = 0.0f;
item->boughtFunc(play, item);
break;
+
case CANBUY_RESULT_NO_ROOM:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoomTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_EMPTY_BOTTLE:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedEmptyBottleTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NEED_RUPEES:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNeedRupeesTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sCannotGetNowTextIds[this->shopType]);
break;
+
case CANBUY_RESULT_CANNOT_GET_NOW_2:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sCannotGetNow2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_NO_ROOM_2:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, sNoRoom2TextIds[this->shopType]);
break;
+
case CANBUY_RESULT_ALREADY_HAVE:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x658);
break;
+
case CANBUY_RESULT_HAVE_BETTER:
play_sound(NA_SE_SY_ERROR);
EnSob1_SetupCannotBuy(play, this, 0x659);
break;
+
+ default:
+ break;
}
}
@@ -1047,6 +1066,7 @@ void EnSob1_SelectItem(EnSob1* this, PlayState* play) {
case 0:
EnSob1_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
@@ -1179,11 +1199,11 @@ void EnSob1_UpdateItemSelectedProperty(EnSob1* this) {
for (i = 0; i < ARRAY_COUNT(this->items); i++, items++) {
item = *items;
if (item != NULL) {
- if (this->actionFunc != EnSob1_SelectItem && this->actionFunc != EnSob1_CannotBuy &&
- this->drawCursor == 0) {
+ if ((this->actionFunc != EnSob1_SelectItem) && (this->actionFunc != EnSob1_CannotBuy) &&
+ (this->drawCursor == 0)) {
item->isSelected = false;
} else {
- item->isSelected = this->cursorIndex == i ? true : false;
+ item->isSelected = (this->cursorIndex == i) ? true : false;
}
}
}
@@ -1330,10 +1350,10 @@ void EnSob1_ChangeObject(EnSob1* this, PlayState* play) {
s32 EnSob1_AreObjectsLoaded(EnSob1* this, PlayState* play) {
if (Object_IsLoaded(&play->objectCtx, this->mainObjIndex)) {
- if (this->unusedObjIndex >= 0 && !Object_IsLoaded(&play->objectCtx, this->unusedObjIndex)) {
+ if ((this->unusedObjIndex >= 0) && !Object_IsLoaded(&play->objectCtx, this->unusedObjIndex)) {
return false;
}
- if (this->shopkeeperAnimObjIndex >= 0 && !Object_IsLoaded(&play->objectCtx, this->shopkeeperAnimObjIndex)) {
+ if ((this->shopkeeperAnimObjIndex >= 0) && !Object_IsLoaded(&play->objectCtx, this->shopkeeperAnimObjIndex)) {
return false;
}
return true;
@@ -1396,7 +1416,7 @@ void EnSob1_InitShop(EnSob1* this, PlayState* play) {
this->waypoint = 0;
if (this->shopType == BOMB_SHOP) {
- this->path = SubS_GetPathByIndex(play, ENSOB1_GET_PATH(&this->actor), 0x1F);
+ this->path = SubS_GetPathByIndex(play, ENSOB1_GET_PATH_INDEX(&this->actor), ENSOB1_PATH_INDEX_NONE);
}
if (this->shopType == BOMB_SHOP) {
EnSob1_SetupAction(this, EnSob1_SetupWalk);
@@ -1501,7 +1521,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 +1583,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 +1667,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 +1692,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 +1715,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 +1727,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_Sob1/z_en_sob1.h b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
index 1509868ee..12c14301b 100644
--- a/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
+++ b/src/overlays/actors/ovl_En_Sob1/z_en_sob1.h
@@ -15,7 +15,9 @@ typedef void (*EnSob1ActionFunc)(struct EnSob1*, PlayState*);
typedef void (*EnSob1BlinkFunc)(struct EnSob1*);
#define ENSOB1_GET_SHOPTYPE(thisx) ((thisx)->params & 0x1F)
-#define ENSOB1_GET_PATH(thisx) (((thisx)->params & 0x3E0) >> 5)
+#define ENSOB1_GET_PATH_INDEX(thisx) (((thisx)->params & 0x3E0) >> 5)
+
+#define ENSOB1_PATH_INDEX_NONE 0x1F
typedef struct EnSob1XZRange {
/* 0x0 */ f32 xMin;
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..f4cc458cb 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);
@@ -546,7 +546,7 @@ void func_808A650C(EnSt* this) {
}
s32 func_808A6580(EnSt* this, PlayState* play) {
- Player* sp3C = GET_PLAYER(play);
+ Player* player = GET_PLAYER(play);
s32 ret = false;
s32 i;
@@ -666,7 +666,7 @@ s32 func_808A6580(EnSt* this, PlayState* play) {
if ((this->unk_316 == 0) && (this->unk_314 == 0) && (this->unk_312 == 0) &&
!(this->collider1.base.atFlags & AT_BOUNCED) && (this->actor.colChkInfo.health != 0)) {
play->damagePlayer(play, -8);
- Actor_PlaySfx(&sp3C->actor, NA_SE_PL_BODY_HIT);
+ Actor_PlaySfx(&player->actor, NA_SE_PL_BODY_HIT);
func_800B8D98(play, &this->actor, 4.0f, this->actor.yawTowardsPlayer, 6.0f);
this->unk_316 = 10;
this->unk_18C |= 1;
@@ -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..7e3b9ead6 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.c
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.c
@@ -70,7 +70,7 @@ typedef enum {
/* 5 */ STH_ANIM_LOOK_AROUND, // checking out Oceanside Spider House
/* 6 */ STH_ANIM_PLEAD, // wants to buy Oceanside Spider House
/* 7 */ STH_ANIM_PANIC, // after buying Oceanside Spider House, can be found at bottom of slide,
- /* 8 */ STH_ANIM_START, // set in init, not an actual index to the array
+ /* 8 */ STH_ANIM_START // set in init, not an actual index to the array
} EnSthAnimation;
static AnimationHeader* sAnimationInfo[] = {
@@ -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_Sth/z_en_sth.h b/src/overlays/actors/ovl_En_Sth/z_en_sth.h
index 1c8c92852..dbc459ce1 100644
--- a/src/overlays/actors/ovl_En_Sth/z_en_sth.h
+++ b/src/overlays/actors/ovl_En_Sth/z_en_sth.h
@@ -16,9 +16,9 @@ typedef enum {
/* 2 */ STH_TYPE_SWAMP_SPIDER_HOUSE_CURED, // cursed is EnSsh
/* 3 */ STH_TYPE_MOON_LOOKING, // South Clock Town, looking up at the moon
/* 4 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_GREET, // looking for shelter
- /* 5 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC, // shelter was not enough
+ /* 5 */ STH_TYPE_OCEANSIDE_SPIDER_HOUSE_PANIC // shelter was not enough
// Other values: Actor will spawn and animate with arm waving, no further interaction.
-} EnSthTypes;
+} EnSthType;
// Note: Vanilla types usually have 0xFEXX typing, but this upper section is unused by the code, reason unknown
#define STH_GET_TYPE(thisx) ((thisx)->params & 0xF)
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..3a32031d3 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
@@ -90,7 +90,7 @@ typedef enum {
/* 0 */ EN_STONE_BOTTLE_NONE,
/* 1 */ EN_STONE_BOTTLE_RED_POTION,
/* 2 */ EN_STONE_BOTTLE_EMPTY,
- /* 3 */ EN_STONE_BOTTLE_BLUE_POTION,
+ /* 3 */ EN_STONE_BOTTLE_BLUE_POTION
} EnStoneHeishiBottle;
typedef enum {
@@ -100,8 +100,8 @@ typedef enum {
/* 3 */ EN_STONE_HEISHI_ANIM_WAVE,
/* 4 */ EN_STONE_HEISHI_ANIM_SIT_AND_REACH,
/* 5 */ EN_STONE_HEISHI_ANIM_DRINK_2,
- /* 6 */ EN_STONE_HEISHI_ANIM_STAND_UP,
-} EnStoneHeishiAnimations;
+ /* 6 */ EN_STONE_HEISHI_ANIM_STAND_UP
+} EnStoneHeishiAnimation;
void EnStoneheishi_Init(Actor* thisx, PlayState* play) {
EnStoneheishi* this = THIS;
@@ -230,7 +230,7 @@ void func_80BC9680(EnStoneheishi* this, PlayState* play) {
player->actor.textId = sEnStoneHeishiTextIds[this->textIdIndex];
Message_ContinueTextbox(play, sEnStoneHeishiTextIds[this->textIdIndex]);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
}
}
@@ -250,7 +250,7 @@ void func_80BC9680(EnStoneheishi* this, PlayState* play) {
if (this->textIdIndex < 7) {
this->textIdIndex++;
} else {
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
func_80BC94B0(this);
return;
}
@@ -293,7 +293,7 @@ void EnStoneheishi_CheckGivenItem(EnStoneheishi* this, PlayState* play) {
}
} else if (itemAction <= PLAYER_IA_MINUS1) {
Message_CloseTextbox(play);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
func_80BC94B0(this);
}
}
@@ -411,8 +411,8 @@ void func_80BC9E50(EnStoneheishi* this, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- func_80151BB4(play, 0x35);
- func_80151BB4(play, 0x12);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_SHIRO);
this->action = EN_STONE_ACTION_1;
this->actionFunc = func_80BC9680;
} else {
@@ -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..43ddae02a 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
@@ -31,7 +31,7 @@ typedef enum {
/* 5 */ SOLDIER_ANIM_5,
/* 6 */ SOLDIER_ANIM_6,
/* 7 */ SOLDIER_ANIM_STAND_HAND_ON_CHEST,
- /* 8 */ SOLDIER_ANIM_MAX,
+ /* 8 */ SOLDIER_ANIM_MAX
} SoldierAnimation;
ActorInit En_Stop_heishi_InitVars = {
@@ -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_Stream/z_en_stream.h b/src/overlays/actors/ovl_En_Stream/z_en_stream.h
index 88856c3dd..c5aa3c9e2 100644
--- a/src/overlays/actors/ovl_En_Stream/z_en_stream.h
+++ b/src/overlays/actors/ovl_En_Stream/z_en_stream.h
@@ -12,13 +12,13 @@
typedef enum {
/* 0 */ EN_STREAM_SIZE_NORMAL,
- /* 1 */ EN_STREAM_SIZE_SMALL,
+ /* 1 */ EN_STREAM_SIZE_SMALL
} EnStreamSize;
typedef enum {
/* 0 */ EN_STREAM_PLAYER_OUTSIDE_RANGE,
/* 1 */ EN_STREAM_PLAYER_WITHIN_RANGE_INSIDE_VORTEX,
- /* 2 */ EN_STREAM_PLAYER_WITHIN_RANGE_BELOW_VORTEX,
+ /* 2 */ EN_STREAM_PLAYER_WITHIN_RANGE_BELOW_VORTEX
} EnStreamPlayerLocation;
struct EnStream;
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..12d8d22a8 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);
}
@@ -267,6 +267,7 @@ void func_80BAA9B4(EnSuttari* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
break;
+
default:
if ((this->animIndex != 1) && (curFrame == frameCount)) {
this->animIndex = 1;
@@ -281,23 +282,31 @@ void func_80BAAA94(EnSuttari* this) {
this->animIndex = 1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
case 0x29E9:
this->enFsn->flags |= ENFSN_ANGRY;
break;
+
case 0x29EA:
this->enFsn->flags |= ENFSN_CALM_DOWN;
break;
+
case 0x29EB:
this->enFsn->flags |= ENFSN_OFFER_FINAL_PRICE;
break;
+
case 0x29EC:
this->animIndex = 7;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
case 0x29ED:
this->animIndex = 1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
break;
+
+ default:
+ break;
}
}
@@ -309,52 +318,64 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
this->csIdIndex = 0;
this->textId = 0x29E5;
break;
+
case 0x29E5:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 1;
this->textId = 0x29E6;
break;
+
case 0x29E6:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 0;
this->textId = 0x29E7;
break;
+
case 0x29E7:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 1;
this->textId = 0x29E8;
break;
+
case 0x29E8:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 0;
this->textId = 0x29E9;
break;
+
case 0x29E9:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 1;
this->textId = 0x29EA;
break;
+
case 0x29EA:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 0;
this->textId = 0x29EB;
break;
+
case 0x29EB:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 1;
this->textId = 0x29EC;
break;
+
case 0x29EC:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->csIdIndex = 0;
this->textId = 0x29ED;
break;
+
case 0x29ED:
CutsceneManager_Stop(this->csIdList[this->csIdIndex]);
this->flags1 |= 0x400;
this->csIdIndex = 1;
this->textId = 0x29EE;
break;
+
+ default:
+ break;
}
if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) {
CutsceneManager_Stop(CS_ID_GLOBAL_TALK);
@@ -372,9 +393,11 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
this->textId = 0x1450;
}
break;
+
case 0x1450:
this->textId = 0x1451;
break;
+
case 0x1451:
if (this->flags1 & 0x800) {
this->flags1 &= ~0x800;
@@ -385,6 +408,7 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_81_01);
}
break;
+
case 0x1453:
this->flags1 |= 0x400;
SET_WEEKEVENTREG(WEEKEVENTREG_81_01);
@@ -392,25 +416,34 @@ void func_80BAAB78(EnSuttari* this, PlayState* play) {
this->flags2 |= 1;
this->textId = 0x1454;
break;
+
case 0x1455:
this->textId = 0x1456;
break;
+
case 0x1456:
this->textId = 0x1457;
break;
+
case 0x1457:
this->textId = 0x1458;
break;
+
case 0x1458:
this->textId = 0x1459;
break;
+
case 0x1459:
this->textId = 0x145A;
break;
+
case 0x145A:
this->flags1 |= 0x400;
this->textId = 0x145B;
break;
+
+ default:
+ break;
}
}
Message_StartTextbox(play, this->textId, &this->actor);
@@ -503,9 +536,9 @@ void func_80BAB374(EnSuttari* this, PlayState* play) {
Vec3f sp38;
if ((curFrame % 3) == 0) {
- sp38.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ sp38.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
sp38.y = this->actor.world.pos.y;
- sp38.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ sp38.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &sp38, 10.0f, 0, 2.0f, 0, 0, 0);
}
}
@@ -516,8 +549,9 @@ void func_80BAB434(EnSuttari* this) {
}
void EnSuttari_GetPaths(EnSuttari* this, PlayState* play) {
- this->paths[0] = SubS_GetPathByIndex(play, ENSUTTARI_GET_PATH(&this->actor), 0x3F);
- this->paths[1] = SubS_GetPathByIndex(play, this->paths[0]->unk1, 0x3F);
+ this->paths[0] = SubS_GetPathByIndex(play, ENSUTTARI_GET_PATH_INDEX(&this->actor), ENSUTTARI_PATH_INDEX_NONE);
+ //! @bug: the additional path shouldn't use `ENSUTTARI_PATH_INDEX_NONE`, but `ADDITIONAL_PATH_INDEX_NONE`
+ this->paths[1] = SubS_GetPathByIndex(play, this->paths[0]->additionalPathIndex, ENSUTTARI_PATH_INDEX_NONE);
}
void func_80BAB4F0(EnSuttari* this, PlayState* play) {
@@ -589,7 +623,7 @@ s32 func_80BAB758(EnSuttari* this, Path* path, s32 arg2) {
sp54 = sp5C[index + 1].x - sp5C[index - 1].x;
sp48 = sp5C[index + 1].z - sp5C[index - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(sp54, sp48)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(sp54, sp48)), &sp44, &sp40, &sp3C);
if (((sp44 * this->actor.world.pos.x) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -619,7 +653,7 @@ s32 func_80BAB8F4(EnSuttari* this, Path* path, s32 arg2) {
sp54 = sp5C[index - 1].x - sp5C[index + 1].x;
sp48 = sp5C[index - 1].z - sp5C[index + 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(sp54, sp48)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(sp54, sp48)), &sp44, &sp40, &sp3C);
if (((sp44 * this->actor.world.pos.x) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
}
@@ -679,16 +713,16 @@ void func_80BABB90(EnSuttari* this, s32 arg1) {
s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp26 = SCHEDULE_TIME_NOW;
u16 phi_a0;
- u8 sp23 = ENSUTTARI_GET_PATH(&this->actor);
+ u8 pathIndex = ENSUTTARI_GET_PATH_INDEX(&this->actor);
u16 tmp;
if (D_80BAE8F8[scheduleOutput->result] >= 0) {
- this->timePath = SubS_GetAdditionalPath(play, sp23, D_80BAE8F8[scheduleOutput->result]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80BAE8F8[scheduleOutput->result]);
}
if (this->timePath == NULL) {
return 0;
}
- if ((this->unk428 != 0 && this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) {
+ if ((this->unk428 != 0) && (this->unk428 < 0xC) && (this->timePathTimeSpeed >= 0)) {
phi_a0 = sp26;
} else {
phi_a0 = scheduleOutput->time0;
@@ -710,37 +744,37 @@ s32 func_80BABC48(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 pad;
EnDoor* sp48;
- u8 sp47 = ENSUTTARI_GET_PATH(&this->actor);
+ u8 pathIndex = ENSUTTARI_GET_PATH_INDEX(&this->actor);
u16 sp44 = SCHEDULE_TIME_NOW;
Vec3f sp38;
Vec3f sp2C;
Vec3s* sp28;
s32 sp24;
- if (this->unk428 == 10 || this->unk428 == 11 || this->unk428 == 2) {
- return 0;
+ if ((this->unk428 == 10) || (this->unk428 == 11) || (this->unk428 == 2)) {
+ return false;
}
sp48 = (EnDoor*)SubS_FindNearestActor(&this->actor, play, ACTORCAT_DOOR, ACTOR_EN_DOOR);
sp24 = D_80BAE8F8[scheduleOutput->result];
if ((sp48 != NULL) && (sp24 >= 0)) {
- this->timePath = SubS_GetAdditionalPath(play, sp47, sp24);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, sp24);
}
if ((sp48 == NULL) || (this->timePath == NULL)) {
- return 0;
+ return false;
}
sp28 = Lib_SegmentedToVirtual(this->timePath->points);
Math_Vec3s_ToVec3f(&sp38, &sp28[0]);
Math_Vec3s_ToVec3f(&sp2C, &sp28[1]);
this->unk434 = sp44 - scheduleOutput->time0;
this->unk436 = scheduleOutput->time1 - scheduleOutput->time0;
- if (scheduleOutput->result != 10 && scheduleOutput->result != 11) {
+ if ((scheduleOutput->result != 10) && (scheduleOutput->result != 11)) {
sp48->unk_1A7 = 0x4B;
}
Math_Vec3f_Copy(&this->unk438, &sp38);
Math_Vec3f_Copy(&this->unk444, &sp2C);
this->actor.world.rot.y = Math_Vec3f_Yaw(&sp38, &sp2C);
this->actor.world.pos = sp38;
- return 1;
+ return true;
}
s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutput) {
@@ -753,6 +787,7 @@ s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
case 12:
ret = func_80BABC48(this, play, scheduleOutput);
break;
+
case 11:
case 10:
case 9:
@@ -761,15 +796,17 @@ s32 func_80BABF64(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp
case 6:
ret = func_80BABDD8(this, play, scheduleOutput);
break;
+
case 5:
case 4:
case 3:
case 2:
case 1:
- ret = 1;
+ ret = true;
break;
+
default:
- ret = 0;
+ ret = false;
break;
}
return ret;
@@ -853,6 +890,7 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->flags1 |= 0x80;
func_80BABFD4(this, play);
break;
+
case 15:
if ((this->animIndex == 1) && (curFrame == frameCount)) {
this->animIndex = 2;
@@ -873,15 +911,18 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
}
func_80BABFD4(this, play);
break;
+
case 6:
case 8:
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 10:
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 9:
case 11:
this->flags1 |= 0x80;
@@ -893,19 +934,23 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
}
func_80BAC220(this, play);
break;
+
case 7:
this->flags1 |= 0x20;
this->flags1 |= 0x80;
func_80BAC220(this, play);
break;
+
case 14:
this->flags1 |= 0x20;
this->flags1 |= 0x80;
func_80BABFD4(this, play);
break;
+
case 1:
Actor_Kill(&this->actor);
break;
+
case 2:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_81_04)) {
this->flags1 |= 0x80;
@@ -916,9 +961,10 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BADA08;
}
break;
+
case 4:
if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_33_08)) {
- if (this->animIndex == 2 || this->animIndex == 1) {
+ if ((this->animIndex == 2) || (this->animIndex == 1)) {
this->animIndex = 5;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
@@ -935,6 +981,9 @@ void func_80BAC2FC(EnSuttari* this, PlayState* play) {
this->actionFunc = func_80BAD2B4;
}
break;
+
+ default:
+ break;
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 4, 0x1554);
}
@@ -947,7 +996,7 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
if (play->sceneId == SCENE_IKANA) {
this->flags1 |= 1;
- if (gSaveContext.save.day == 1 || gSaveContext.save.day == 2) {
+ if ((gSaveContext.save.day == 1) || (gSaveContext.save.day == 2)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
this->flags1 |= 0x80;
@@ -962,7 +1011,7 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
return;
}
} else if (play->sceneId == SCENE_BACKTOWN) {
- if (gSaveContext.save.time >= CLOCK_TIME(0, 20) && gSaveContext.save.time < CLOCK_TIME(6, 00)) {
+ if ((gSaveContext.save.time >= CLOCK_TIME(0, 20)) && (gSaveContext.save.time < CLOCK_TIME(6, 00))) {
Actor_Kill(&this->actor);
}
@@ -1011,14 +1060,14 @@ void func_80BAC6E8(EnSuttari* this, PlayState* play) {
void func_80BACA14(EnSuttari* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (this->animIndex == 1 || this->animIndex == 8) {
+ if ((this->animIndex == 1) || (this->animIndex == 8)) {
this->animIndex = 2;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
func_80BABA90(this, 0, 0);
func_80BAB434(this);
- if (player->transformation == PLAYER_FORM_GORON || player->transformation == PLAYER_FORM_ZORA) {
- if (this->actor.playerHeightRel < 60.0f && this->actor.xzDistToPlayer < 500.0f) {
+ if ((player->transformation == PLAYER_FORM_GORON) || (player->transformation == PLAYER_FORM_ZORA)) {
+ if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
this->unk3F2 = this->headRot.y;
this->actionFunc = func_80BACBB0;
}
@@ -1041,7 +1090,7 @@ void func_80BACBB0(EnSuttari* this, PlayState* play) {
s16 target;
this->unk3F2 = this->headRot.y;
- if (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU) {
+ if ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU)) {
this->actionFunc = func_80BACA14;
}
if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
@@ -1071,7 +1120,7 @@ void func_80BACD2C(EnSuttari* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->unk3F2 = this->headRot.y;
- if (player->transformation == PLAYER_FORM_HUMAN || player->transformation == PLAYER_FORM_DEKU) {
+ if ((player->transformation == PLAYER_FORM_HUMAN) || (player->transformation == PLAYER_FORM_DEKU)) {
this->actionFunc = func_80BACA14;
}
if ((this->actor.playerHeightRel < 60.0f) && (this->actor.xzDistToPlayer < 500.0f)) {
@@ -1265,7 +1314,7 @@ void func_80BAD5F8(EnSuttari* this, PlayState* play) {
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
- if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
+ if ((this->unk430 == 1) && (this->timePath->additionalPathIndex == ADDITIONAL_PATH_INDEX_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -1303,7 +1352,7 @@ void func_80BAD7F8(EnSuttari* this, PlayState* play) {
}
this->unk428 = scheduleOutput.result;
func_80BAC2FC(this, play);
- if ((this->unk430 == 1) && (this->timePath->unk1 == 0xFF)) {
+ if ((this->unk430 == 1) && (this->timePath->additionalPathIndex == ADDITIONAL_PATH_INDEX_NONE)) {
Actor_Kill(&this->actor);
return;
}
@@ -1372,10 +1421,14 @@ void func_80BADA9C(EnSuttari* this, PlayState* play) {
this->flags1 |= 0x800;
func_80BAAB78(this, play);
break;
+
case 1:
func_8019F230();
func_80BAAB78(this, play);
break;
+
+ default:
+ break;
}
}
if (!(this->flags1 & 4)) {
@@ -1483,14 +1536,14 @@ 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) {
+ if ((this->animIndex == 2) || (this->animIndex == 6)) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 16.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
- } else if (this->animIndex == 0 || this->animIndex == 5) {
+ } else if ((this->animIndex == 0) || (this->animIndex == 5)) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 17.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_PAMERA_WALK);
}
@@ -1514,7 +1567,7 @@ s32 EnSuttari_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3
Matrix_RotateXS(-this->torsoRot.y, MTXMODE_APPLY);
Matrix_RotateZS(-this->torsoRot.x, MTXMODE_APPLY);
}
- if (limbIndex == 8 || limbIndex == 9 || limbIndex == 0xC) {
+ if ((limbIndex == 8) || (limbIndex == 9) || (limbIndex == 0xC)) {
rot->y += (s16)(Math_SinS(this->unk2FA[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->unk31A[limbIndex]) * 200.0f);
}
@@ -1543,9 +1596,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 +1624,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 +1632,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_Suttari/z_en_suttari.h b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
index 071000763..8da01b67e 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
@@ -8,7 +8,9 @@ struct EnSuttari;
typedef void (*EnSuttariActionFunc)(struct EnSuttari*, PlayState*);
-#define ENSUTTARI_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENSUTTARI_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENSUTTARI_PATH_INDEX_NONE 0x3F
typedef struct EnSuttari {
/* 0x000 */ Actor actor;
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..4937125dc 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -304,7 +304,7 @@ s32 func_808D91C4(EnSw* this, CollisionPoly* arg1) {
return false;
}
- sp4C = func_80086C48(temp_f12);
+ sp4C = Math_FAcosF(temp_f12);
if (sp4C < 0.001f) {
return false;
}
@@ -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;
}
@@ -901,13 +901,13 @@ void func_808DA89C(EnSw* this, PlayState* play) {
}
void func_808DAA60(EnSw* this, PlayState* play) {
- Vec3s* sp44;
+ Vec3s* points;
s16 temp_v0;
s16 sp40;
Vec3f sp34;
f32 temp_f16;
- sp44 = Lib_SegmentedToVirtual(this->unk_1E4->points);
+ points = Lib_SegmentedToVirtual(this->path->points);
sp40 = 0;
if (DECR(this->unk_454) == 0) {
@@ -915,13 +915,13 @@ void func_808DAA60(EnSw* this, PlayState* play) {
temp_f16 = this->skelAnime.endFrame - this->skelAnime.curFrame;
sp40 = 80.0f * temp_f16;
if (this->unk_45E == 0) {
- Math_Vec3s_ToVec3f(&sp34, &sp44[this->unk_4A0]);
+ Math_Vec3s_ToVec3f(&sp34, &points[this->unk_4A0]);
func_808D9894(this, &sp34);
temp_v0 = Math_Atan2S_XY(sp34.z, sp34.x);
if (ABS_ALT(temp_v0) < sp40) {
this->skelAnime.curFrame = 0.0f;
Actor_PlaySfx(&this->actor, NA_SE_EN_STALWALL_DASH);
- Math_Vec3s_ToVec3f(&this->unk_374, &sp44[this->unk_4A0]);
+ Math_Vec3s_ToVec3f(&this->unk_374, &points[this->unk_4A0]);
this->actionFunc = func_808DACF4;
this->unk_414 = 0.0f;
sp40 = ABS_ALT(temp_v0);
@@ -981,7 +981,7 @@ void func_808DACF4(EnSw* this, PlayState* play) {
if (((s32)this->unk_414 != 0) && ((s32)this->unk_414 < (s32)sp4C)) {
Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_374);
this->unk_4A0 += this->unk_49C;
- if ((this->unk_4A0 >= this->unk_1E4->count) || (this->unk_4A0 < 0)) {
+ if ((this->unk_4A0 >= this->path->count) || (this->unk_4A0 < 0)) {
this->unk_49C = -this->unk_49C;
this->unk_4A0 += this->unk_49C * 2;
}
@@ -1154,8 +1154,9 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
this->collider.info.toucher.damage = 16;
}
- this->unk_1E4 = SubS_GetDayDependentPath(play, ENSW_GET_FF00(&this->actor), 255, &this->unk_4A0);
- if (this->unk_1E4 != NULL) {
+ this->path =
+ SubS_GetDayDependentPath(play, ENSW_GET_PATH_INDEX(&this->actor), ENSW_PATH_INDEX_NONE, &this->unk_4A0);
+ if (this->path != NULL) {
this->unk_4A0 = 1;
}
@@ -1201,7 +1202,7 @@ void EnSw_Init(Actor* thisx, PlayState* play) {
}
func_808D9F78(this, play, 1);
- if (this->unk_1E4 != NULL) {
+ if (this->path != NULL) {
this->unk_49C = 1;
func_808D9F08(this);
this->actionFunc = func_808DAA60;
@@ -1296,7 +1297,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_Sw/z_en_sw.h b/src/overlays/actors/ovl_En_Sw/z_en_sw.h
index 4544346a0..f77d12267 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.h
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.h
@@ -11,14 +11,16 @@ typedef void (*EnSwActionFunc)(struct EnSw*, PlayState*);
#define ENSW_GET_3(thisx) (ENSW_GETS_3((thisx)->params))
#define ENSW_GETS_3FC(params) (((params & 0x3FC) >> 2) & 0xFF)
#define ENSW_GET_3FC(thisx) (ENSW_GETS_3FC((thisx)->params))
-#define ENSW_GET_FF00(thisx) ((((thisx)->params & 0xFF00) >> 8) & 0xFF)
+#define ENSW_GET_PATH_INDEX(thisx) ((((thisx)->params & 0xFF00) >> 8) & 0xFF)
+
+#define ENSW_PATH_INDEX_NONE 0xFF
typedef struct EnSw {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnSwActionFunc actionFunc;
/* 0x18C */ ColliderSphere collider;
- /* 0x1E4 */ Path* unk_1E4;
+ /* 0x1E4 */ Path* path;
/* 0x1E8 */ Vec3s jointTable[30];
/* 0x29C */ Vec3s morphTable[30];
/* 0x350 */ Vec3f unk_350;
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..af419ba23 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
@@ -79,12 +79,12 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
s32 i;
path = syatekiMan->path;
- while (path->unk2 != 0) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != SG_PATH_TYPE_CROW) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_CROW_GET_INDEX(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
Actor_ProcessInitChain(&this->actor, sInitChain);
@@ -292,9 +292,9 @@ s32 EnSyatekiCrow_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
EnSyatekiCrow* this = THIS;
if (limbIndex == OBJECT_CROW_LIMB_UPPER_TAIL) {
- rot->y += (s16)(0xC00 * sin_rad(this->skelAnime.curFrame * (M_PI / 4)));
+ rot->y += (s16)(0xC00 * Math_SinF(this->skelAnime.curFrame * (M_PI / 4)));
} else if (limbIndex == OBJECT_CROW_LIMB_TAIL) {
- rot->y += (s16)(0x1400 * sin_rad((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
+ rot->y += (s16)(0x1400 * Math_SinF((this->skelAnime.curFrame + 2.5f) * (M_PI / 4)));
}
return false;
@@ -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..ee9c63536 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
@@ -36,7 +36,7 @@ void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play);
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL,
- /* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP,
+ /* 1 */ EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_FLIPPED_UP
} EnSyatekiDekunutsHeaddressType;
ActorInit En_Syateki_Dekunuts_InitVars = {
@@ -80,7 +80,7 @@ typedef enum {
/* 3 */ EN_SYATEKI_DEKUNUTS_ANIM_LOOK_AROUND,
/* 4 */ EN_SYATEKI_DEKUNUTS_ANIM_DAMAGE,
/* 5 */ EN_SYATEKI_DEKUNUTS_ANIM_DIE,
- /* 6 */ EN_SYATEKI_DEKUNUTS_ANIM_UNBURROW, // unused
+ /* 6 */ EN_SYATEKI_DEKUNUTS_ANIM_UNBURROW // unused
} EnSyatekiDekunutsAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -103,7 +103,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
static s32 sDrawFlowers = true; // This makes it so only one EnSyatekiDekunuts draws all the flowers.
EnSyatekiDekunuts* this = THIS;
PlayState* play = play2;
- s32 unkPathComparison;
+ s32 pathType;
Path* path;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
s32 i;
@@ -115,18 +115,18 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
Actor_SetScale(&this->actor, 0.01f);
this->collider.dim = sBonusDekuScrubColliderDimensions[0];
- unkPathComparison = 3;
+ pathType = SG_PATH_TYPE_SCRUB_BONUS;
} else {
Actor_SetScale(&this->actor, 0.02f);
- unkPathComparison = 1;
+ pathType = SG_PATH_TYPE_SCRUB_NORMAL;
}
- while (path->unk2 != unkPathComparison) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != pathType) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_DEKUNUTS_GET_PARAM_FF00(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (sDrawFlowers == true) {
@@ -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_Dekunuts/z_en_syateki_dekunuts.h b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
index 2ceb0b32d..ce3e9ba90 100644
--- a/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
+++ b/src/overlays/actors/ovl_En_Syateki_Dekunuts/z_en_syateki_dekunuts.h
@@ -11,7 +11,7 @@
typedef enum {
/* 0 */ EN_SYATEKI_DEKUNUTS_TYPE_NORMAL, // Worth 30 points
- /* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS, // Worth 100 points
+ /* 1 */ EN_SYATEKI_DEKUNUTS_TYPE_BONUS // Worth 100 points
} EnSyatekiDekunutsType;
struct EnSyatekiDekunuts;
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 01c8e96a5..f5910a06d 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
@@ -74,7 +74,7 @@ ActorInit En_Syateki_Man_InitVars = {
typedef enum {
/* 0 */ EN_SYATEKI_MAN_ANIM_HANDS_ON_TABLE,
/* 1 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_LOOP,
- /* 2 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_END,
+ /* 2 */ EN_SYATEKI_MAN_ANIM_SWAMP_HEAD_SCRATCH_END
} EnSyatekiManAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -183,7 +183,7 @@ void EnSyatekiMan_Swamp_SpawnTargetActors(EnSyatekiMan* this, PlayState* play2,
void EnSyatekiMan_Init(Actor* thisx, PlayState* play) {
EnSyatekiMan* this = THIS;
s32 pad;
- Path* path = &play->setupPathList[EN_SYATEKI_MAN_GET_PATH(&this->actor)];
+ Path* path = &play->setupPathList[EN_SYATEKI_MAN_GET_PATH_INDEX(&this->actor)];
s32 actorListLength = sSwampTargetActorListLengths[this->swampTargetActorListIndex];
this->actor.targetMode = 1;
@@ -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_Man/z_en_syateki_man.h b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
index 0b637fecf..468cb981c 100644
--- a/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
+++ b/src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h
@@ -8,7 +8,7 @@ struct EnSyatekiMan;
typedef void (*EnSyatekiManActionFunc)(struct EnSyatekiMan*, PlayState*);
-#define EN_SYATEKI_MAN_GET_PATH(thisx) (((thisx)->params & 0xFF00) >> 8)
+#define EN_SYATEKI_MAN_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
typedef enum {
/* 0 */ SG_GAME_STATE_NONE, // None of the states below apply.
@@ -18,22 +18,29 @@ typedef enum {
/* 4 */ SG_GAME_STATE_ONE_MORE_GAME, // The player failed to get a new high score (Town) and/or perfect score (Swamp and Town).
/* 5 */ SG_GAME_STATE_GIVING_BONUS, // The player gets bonus points at the end of the Swamp game if they get a perfect score.
/* 6 */ SG_GAME_STATE_ENDED, // The player got a new high score and/or perfect score (Town), or the game is over (Swamp).
- /* 7 */ SG_GAME_STATE_MOVING_PLAYER, // The player is automatically moving towards the spot to play the game.
+ /* 7 */ SG_GAME_STATE_MOVING_PLAYER // The player is automatically moving towards the spot to play the game.
} ShootingGalleryGameState;
typedef enum {
/* 0 */ SG_OCTO_STATE_SPAWNING,
/* 1 */ SG_OCTO_STATE_SPAWNED,
/* 70 */ SG_OCTO_STATE_INITIAL = 70,
- /* 80 */ SG_OCTO_STATE_HIDING = 80,
+ /* 80 */ SG_OCTO_STATE_HIDING = 80
} ShootingGalleryOctorokState;
typedef enum {
/* 0 */ SG_OCTO_HIT_TYPE_NONE,
/* 1 */ SG_OCTO_HIT_TYPE_RED,
- /* 2 */ SG_OCTO_HIT_TYPE_BLUE,
+ /* 2 */ SG_OCTO_HIT_TYPE_BLUE
} ShootingGalleryoctorokHitType;
+typedef enum {
+ /* 0 */ SG_PATH_TYPE_CROW,
+ /* 1 */ SG_PATH_TYPE_SCRUB_NORMAL,
+ /* 2 */ SG_PATH_TYPE_WOLFOS,
+ /* 3 */ SG_PATH_TYPE_SCRUB_BONUS
+} ShootingGalleryPathType;
+
typedef struct EnSyatekiMan {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
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..91ed08140 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
@@ -404,7 +404,7 @@ void func_80A36CB0(EnSyatekiOkuta* this) {
}
} else if (this->actionFunc == func_80A36488) {
this->unk_1D8.x = this->unk_1D8.z = 1.0f;
- this->unk_1D8.y = (sin_rad((M_PI / 16) * curFrame) * 0.2f) + 1.0f;
+ this->unk_1D8.y = (Math_SinF((M_PI / 16) * curFrame) * 0.2f) + 1.0f;
} else if (this->actionFunc == func_80A36504) {
if (curFrame < 3.0f) {
this->unk_1D8.y = 1.0f;
@@ -440,7 +440,7 @@ s32 func_80A370EC(EnSyatekiOkuta* this, f32 arg1, Vec3f* arg2) {
if (this->actionFunc == func_80A363B4) {
arg2->y = 1.0f;
arg2->z = 1.0f;
- arg2->x = (sin_rad((M_PI / 16) * arg1) * 0.4f) + 1.0f;
+ arg2->x = (Math_SinF((M_PI / 16) * arg1) * 0.4f) + 1.0f;
} else if (this->actionFunc == func_80A365EC) {
if ((arg1 >= 35.0f) || (arg1 < 25.0f)) {
return false;
@@ -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..347d78088 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
@@ -120,7 +120,7 @@ typedef enum {
/* 3 */ EN_SYATEKI_WF_ANIM_LAND,
/* 4 */ EN_SYATEKI_WF_ANIM_BACKFLIP, // unused
/* 5 */ EN_SYATEKI_WF_ANIM_DAMAGED,
- /* 6 */ EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER,
+ /* 6 */ EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER
} EnSyatekiWfAnimation;
static AnimationInfo sAnimationInfo[] = {
@@ -146,12 +146,12 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
s32 i;
path = syatekiMan->path;
- while (path->unk2 != 2) {
- path = &play->setupPathList[path->unk1];
+ while (path->customValue != SG_PATH_TYPE_WOLFOS) {
+ path = &play->setupPathList[path->additionalPathIndex];
}
for (i = 0; i < EN_SYATEKI_WF_GET_INDEX(&this->actor); i++) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
if (path == NULL) {
@@ -408,9 +408,9 @@ void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play) {
s32 i;
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i--) {
- firePos.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- firePos.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- firePos.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ firePos.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ firePos.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ firePos.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &firePos, &sFireVelocityAndAccel, &sFireVelocityAndAccel, 100, 0, 2);
}
}
@@ -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/z_en_talk.c b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
index 4f9b2a53d..7c639c44a 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.c
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
@@ -32,7 +32,7 @@ void EnTalk_Init(Actor* thisx, PlayState* play) {
EnTalk* this = THIS;
s8 targetMode = this->actor.home.rot.x - 0x1;
- if (targetMode >= 0 && targetMode < 7) {
+ if ((targetMode >= 0) && (targetMode < 7)) {
this->actor.targetMode = targetMode;
}
@@ -56,7 +56,7 @@ void func_80BDE090(EnTalk* this, PlayState* play) {
return;
}
- if ((this->actor.xzDistToPlayer < 40.0f && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
+ if (((this->actor.xzDistToPlayer < 40.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) ||
this->actor.isTargeted) {
func_800B8614(&this->actor, play, 120.0f);
}
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..84d0b7dd1 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
@@ -53,12 +53,12 @@ typedef struct {
/* 0x4 */ ItemId item;
/* 0x8 */ s32 amount;
/* 0xC */ s16 isBottledItem;
-} EnTalkGibudRequestedItem;
+} EnTalkGibudRequestedItem; // size = 0x10
typedef enum {
/* 0 */ EN_TALK_GIBUD_REQUESTED_ITEM_MET,
/* 1 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_ENOUGH_AMMO,
- /* 2 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_MET,
+ /* 2 */ EN_TALK_GIBUD_REQUESTED_ITEM_NOT_MET
} EnTalkGibudRequestedItemState;
typedef enum {
@@ -71,7 +71,7 @@ typedef enum {
/* 6 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_BOMBS,
/* 7 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_HOT_SPRING_WATER,
/* 8 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_BIG_POE,
- /* 9 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_MILK,
+ /* 9 */ EN_TALK_GIBUD_REQUESTED_ITEM_INDEX_MILK
} EnTalkGibudRequestedItemIndex;
typedef enum {
@@ -88,18 +88,18 @@ typedef enum {
/* 10 */ EN_TALK_GIBUD_ANIM_WALK,
/* 11 */ EN_TALK_GIBUD_ANIM_DANCE_SQUAT,
/* 12 */ EN_TALK_GIBUD_ANIM_DANCE_PIROUETTE,
- /* 13 */ EN_TALK_GIBUD_ANIM_DANCE_CLAP,
+ /* 13 */ EN_TALK_GIBUD_ANIM_DANCE_CLAP
} EnTalkGibudAnimation;
typedef enum {
/* 0 */ EN_TALK_GIBUD_TYPE_GIBDO,
- /* 1 */ EN_TALK_GIBUD_TYPE_REDEAD,
+ /* 1 */ EN_TALK_GIBUD_TYPE_REDEAD
} EnTalkGibudType;
typedef enum {
/* 0 */ EN_TALK_GIBUD_GRAB_START,
/* 1 */ EN_TALK_GIBUD_GRAB_ATTACK,
- /* 2 */ EN_TALK_GIBUD_GRAB_RELEASE,
+ /* 2 */ EN_TALK_GIBUD_GRAB_RELEASE
} EnTalkGibudGrabState;
ActorInit En_Talk_Gibud_InitVars = {
@@ -159,7 +159,7 @@ typedef enum {
/* 0xC */ EN_TALK_GIBUD_DMGEFF_ZORA_MAGIC = 0xC, // Stuns and applies an electric effect
/* 0xD */ EN_TALK_GIBUD_DMGEFF_RECOIL, // Deals no damage, but displays hit mark and recoil animation
/* 0xE */ EN_TALK_GIBUD_DMGEFF_LIGHT_RAY, // Instantly kills a Redead on contact
- /* 0xF */ EN_TALK_GIBUD_DMGEFF_DAMAGE, // Deals damage and plays the damage animation
+ /* 0xF */ EN_TALK_GIBUD_DMGEFF_DAMAGE // Deals damage and plays the damage animation
} EnTalkGibudDamageEffect;
static DamageTable sDamageTable = {
@@ -268,7 +268,7 @@ void EnTalkGibud_Init(Actor* thisx, PlayState* play) {
this->switchFlag = -1;
}
- if (this->switchFlag != -1 && Flags_GetSwitch(play, this->switchFlag)) {
+ if ((this->switchFlag != -1) && Flags_GetSwitch(play, this->switchFlag)) {
Actor_Kill(&this->actor);
}
@@ -291,7 +291,7 @@ void EnTalkGibud_SetupIdle(EnTalkGibud* this) {
* Gibdo will attack the player if they get too close.
*/
void EnTalkGibud_Idle(EnTalkGibud* this, PlayState* play) {
- if (this->actor.xzDistToPlayer <= 150.0f && func_800B715C(play)) {
+ if ((this->actor.xzDistToPlayer <= 150.0f) && func_800B715C(play)) {
EnTalkGibud_SetupAttemptPlayerFreeze(this);
}
@@ -345,7 +345,8 @@ void EnTalkGibud_WalkToPlayer(EnTalkGibud* this, PlayState* play) {
if (EnTalkGibud_PlayerInRangeWithCorrectState(this, play) && Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
if ((this->grabWaitTimer == 0) && (this->actor.xzDistToPlayer <= 45.0f)) {
player->actor.freezeTimer = 0;
- if (gSaveContext.save.playerForm == PLAYER_FORM_GORON || gSaveContext.save.playerForm == PLAYER_FORM_DEKU) {
+ if ((gSaveContext.save.playerForm == PLAYER_FORM_GORON) ||
+ (gSaveContext.save.playerForm == PLAYER_FORM_DEKU)) {
// If the Gibdo/Redead tries to grab Goron or Deku Link, it will fail to
// do so. It will appear to take damage and shake its head side-to-side.
EnTalkGibud_SetupGrabFail(this);
@@ -442,6 +443,9 @@ void EnTalkGibud_Grab(EnTalkGibud* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 1.0f, 400.0f, 0.0f);
}
break;
+
+ default:
+ break;
}
}
@@ -512,7 +516,7 @@ void EnTalkGibud_WalkToHome(EnTalkGibud* this, PlayState* play) {
this->actor.world.rot = this->actor.shape.rot;
}
if (EnTalkGibud_PlayerInRangeWithCorrectState(this, play)) {
- if (gSaveContext.save.playerForm != PLAYER_FORM_GORON && gSaveContext.save.playerForm != PLAYER_FORM_DEKU &&
+ if ((gSaveContext.save.playerForm != PLAYER_FORM_GORON) && (gSaveContext.save.playerForm != PLAYER_FORM_DEKU) &&
Actor_IsFacingPlayer(&this->actor, 0x38E3)) {
EnTalkGibud_SetupWalkToPlayer(this);
}
@@ -676,6 +680,9 @@ void EnTalkGibud_GetTextIdForRequestedItem(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0x1395, &this->actor);
this->textId = 0x1395;
break;
+
+ default:
+ break;
}
}
@@ -700,6 +707,9 @@ void EnTalkGibud_GetNextTextBoxId(EnTalkGibud* this, PlayState* play) {
Message_StartTextbox(play, 0xFF, &this->actor);
this->textId = 0xFF;
break;
+
+ default:
+ break;
}
}
}
@@ -1063,8 +1073,8 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_ZORA_MAGIC:
- if (this->actionFunc != EnTalkGibud_Grab &&
- (this->actionFunc != EnTalkGibud_Stunned || this->stunTimer == 0)) {
+ if ((this->actionFunc != EnTalkGibud_Grab) &&
+ ((this->actionFunc != EnTalkGibud_Stunned) || (this->stunTimer == 0))) {
this->drawDmgEffAlpha = 1.0f;
this->drawDmgEffTimer = 40;
this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_SMALL;
@@ -1073,10 +1083,13 @@ void EnTalkGibud_UpdateDamage(EnTalkGibud* this, PlayState* play) {
break;
case EN_TALK_GIBUD_DMGEFF_STUN:
- if ((this->actionFunc != EnTalkGibud_Stunned) || this->stunTimer == 0) {
+ if ((this->actionFunc != EnTalkGibud_Stunned) || (this->stunTimer == 0)) {
EnTalkGibud_SetupStunned(this);
}
break;
+
+ default:
+ break;
}
}
}
@@ -1114,7 +1127,7 @@ void EnTalkGibud_MoveGrabbedPlayerAwayFromWall(EnTalkGibud* this, PlayState* pla
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 20.0f, 35.0f,
UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 |
UPDBGCHECKINFO_FLAG_10);
- if (this->actionFunc == EnTalkGibud_Grab && this->grabState == EN_TALK_GIBUD_GRAB_START &&
+ if ((this->actionFunc == EnTalkGibud_Grab) && (this->grabState == EN_TALK_GIBUD_GRAB_START) &&
(this->actor.bgCheckFlags & BGCHECKFLAG_WALL)) {
targetPos = player->actor.world.pos;
targetPos.x += 10.0f * Math_SinS(this->actor.wallYaw);
@@ -1190,7 +1203,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 +1212,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..c71676061 100644
--- a/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
+++ b/src/overlays/actors/ovl_En_Tanron1/z_en_tanron1.c
@@ -248,9 +248,9 @@ void func_80BB5318(EnTanron1* this, PlayState* play) {
ptr->unk_20 = Math_Atan2S(temp.x, temp.z);
ptr->unk_1E = Math_Atan2S(temp.y, sqrtf(SQXZ(temp)));
if ((ptr->unk_26 & 0xF) == 0) {
- ptr->unk_30 = randPlusMinusPoint5Scaled(temp_f30);
- ptr->unk_34 = randPlusMinusPoint5Scaled(temp_f30 * 0.5f);
- ptr->unk_38 = randPlusMinusPoint5Scaled(temp_f30);
+ ptr->unk_30 = Rand_CenteredFloat(temp_f30);
+ ptr->unk_34 = Rand_CenteredFloat(temp_f30 * 0.5f);
+ ptr->unk_38 = Rand_CenteredFloat(temp_f30);
}
temp.x = player->actor.world.pos.x - ptr->unk_00.x;
@@ -336,7 +336,7 @@ void func_80BB5318(EnTanron1* this, PlayState* play) {
Math_ApproachF(&ptr->unk_30, ptr->unk_34, 1.0f, 0.5f);
if ((ptr->unk_26 & 0xF) == 0) {
if (Rand_ZeroOne() < 0.5f) {
- ptr->unk_34 = randPlusMinusPoint5Scaled(12.0f);
+ ptr->unk_34 = Rand_CenteredFloat(12.0f);
}
ptr->unk_3C = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp98, &ptr->unk_00);
sp9C = ptr->unk_00.y;
@@ -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) {
@@ -390,26 +390,23 @@ void func_80BB5AAC(EnTanron1* this, PlayState* play) {
flag = 0;
ptr = ptrBase;
for (i = 0; i < this->actor.params; i++, ptr++) {
- if (ptr->unk_24 != 2) {
- continue;
+ if (ptr->unk_24 == 2) {
+ if (!flag) {
+ gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD,
+ G_TX_NOLOD);
+ flag++;
+ }
+
+ Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
+ Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
+ Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, ptr->unk_2C, 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++, ovl_En_Tanron1_DL_001900);
}
-
- if (!flag) {
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001888);
- gDPLoadTextureBlock(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001428, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 32, 0,
- G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 4, 5, G_TX_NOLOD, G_TX_NOLOD);
- flag++;
- }
-
- Matrix_Translate(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, MTXMODE_NEW);
- Matrix_RotateYS(ptr->unk_1A, MTXMODE_APPLY);
- Matrix_RotateXS(ptr->unk_18 * -1, MTXMODE_APPLY);
- Matrix_Scale(1.0f, ptr->unk_2C, 1.0f, MTXMODE_APPLY);
-
- if (1) {}
-
- gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_OPA_DISP++, ovl_En_Tanron1_DL_001900);
}
CLOSE_DISPS(play->state.gfxCtx);
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..785308dad 100644
--- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
+++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c
@@ -236,7 +236,7 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) {
switch (this->unk_158) {
case 0:
if (Rand_ZeroOne() > 0.2f) {
- sp32 = Rand_ZeroFloat(65536.0f);
+ sp32 = Rand_ZeroFloat(0x10000);
} else {
sp32 = Math_Atan2S(sp2C, sp28);
}
@@ -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..81a4ac2af 100644
--- a/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
+++ b/src/overlays/actors/ovl_En_Tanron3/z_en_tanron3.c
@@ -100,8 +100,8 @@ void EnTanron3_CreateEffect(PlayState* play, Vec3f* effectPos) {
effectPtr->unk_34.y = 0.0f;
effectPtr->unk_34.z = Rand_ZeroFloat(2 * M_PI);
effectPtr->unk_02 = Rand_ZeroFloat(100.0f);
- effectPtr->velocity.x = randPlusMinusPoint5Scaled(25.0f);
- effectPtr->velocity.z = randPlusMinusPoint5Scaled(25.0f);
+ effectPtr->velocity.x = Rand_CenteredFloat(25.0f);
+ effectPtr->velocity.z = Rand_CenteredFloat(25.0f);
break;
}
}
@@ -155,9 +155,9 @@ void EnTanron3_SetupLive(EnTanron3* this, PlayState* play) {
this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] = 50;
this->actor.speed = 5.0f;
this->speedMaxStep = 0.5f;
- this->deviation.x = randPlusMinusPoint5Scaled(500.0f);
- this->deviation.y = randPlusMinusPoint5Scaled(100.0f);
- this->deviation.z = randPlusMinusPoint5Scaled(500.0f);
+ this->deviation.x = Rand_CenteredFloat(500.0f);
+ this->deviation.y = Rand_CenteredFloat(100.0f);
+ this->deviation.z = Rand_CenteredFloat(500.0f);
Math_Vec3f_Copy(&this->targetPos, &this->actor.world.pos);
this->timer = Rand_ZeroFloat(100.0f);
}
@@ -180,10 +180,10 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->skelAnime.curFrame = 4.0f;
- if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && player->actor.shape.feetPos[0].y >= 438.0f) {
+ if ((player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (player->actor.shape.feetPos[0].y >= 438.0f)) {
// Player is standing on the central platform, so stop chasing them
this->isNonHostile = true;
- } else if (this->isNonHostile && this->workTimer[WORK_TIMER_WAIT] == 0 && !(this->timer & 0x1F)) {
+ } else if (this->isNonHostile && (this->workTimer[WORK_TIMER_WAIT] == 0) && !(this->timer & 0x1F)) {
xDistance = this->targetPos.x - player->actor.world.pos.x;
zDistance = this->targetPos.z - player->actor.world.pos.z;
if (sqrtf(SQ(xDistance) + SQ(zDistance)) < 500.0f) {
@@ -204,20 +204,21 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
Math_Vec3f_Copy(&this->targetPos, &player->actor.world.pos);
if (!(this->timer & 0xF)) {
- if (Rand_ZeroOne() < 0.5f && this->actor.xzDistToPlayer <= 200.0f) {
+ if ((Rand_ZeroOne() < 0.5f) && (this->actor.xzDistToPlayer <= 200.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EN_PIRANHA_ATTACK);
}
}
// If the player gets eaten by Gyorg, or if the attack timer ran out,
// stop chasing the player for a little bit.
- if (this->workTimer[WORK_TIMER_ATTACK] == 0 || (player->stateFlags2 & PLAYER_STATE2_80)) {
+ if ((this->workTimer[WORK_TIMER_ATTACK] == 0) || (player->stateFlags2 & PLAYER_STATE2_80)) {
this->workTimer[WORK_TIMER_WAIT] = 150;
this->isNonHostile = true;
}
break;
+
case true:
- if (sGyorg->unk_324 != 0 && !(this->timer & 0x7)) {
+ if ((sGyorg->unk_324 != 0) && !(this->timer & 0x7)) {
this->nextRotationAngle = 0x4E20;
this->actor.speed = 6.0f;
} else {
@@ -242,11 +243,11 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
}
if (this->workTimer[WORK_TIMER_OUT_OF_WATER] == 0) {
- if (this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] == 0 && this->actor.speed > 1.0f) {
+ if ((this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] == 0) && (this->actor.speed > 1.0f)) {
this->workTimer[WORK_TIMER_PICK_NEW_DEVIATION] = Rand_ZeroFloat(20.0f);
- this->deviation.x = randPlusMinusPoint5Scaled(100.0f);
- this->deviation.y = randPlusMinusPoint5Scaled(50.0f + extraScaleY);
- this->deviation.z = randPlusMinusPoint5Scaled(100.0f);
+ this->deviation.x = Rand_CenteredFloat(100.0f);
+ this->deviation.y = Rand_CenteredFloat(50.0f + extraScaleY);
+ this->deviation.z = Rand_CenteredFloat(100.0f);
}
this->targetPosWithDeviation.y = this->targetPos.y + this->deviation.y + 50.0f;
}
@@ -286,6 +287,7 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
this->isBeached = true;
}
break;
+
case true:
this->nextRotationAngle = 0x3A98;
this->actor.gravity = -1.5f;
@@ -295,17 +297,17 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
this->actor.speed = Rand_ZeroFloat(2.0f) + 2.0f;
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.x =
- (s16)randPlusMinusPoint5Scaled(500.0f) + this->targetShapeRotation.x + 0x8000;
+ (s16)(s32)Rand_CenteredFloat(0x1F4) + this->targetShapeRotation.x + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.z =
- (s16)randPlusMinusPoint5Scaled(500.0f) + this->targetShapeRotation.z + 0x8000;
+ (s16)(s32)Rand_CenteredFloat(0x1F4) + this->targetShapeRotation.z + 0x8000;
}
if (Rand_ZeroOne() < 0.5f) {
this->targetShapeRotation.y = (s16)Rand_ZeroFloat(0x10000);
}
this->actor.world.rot.y = Math_Atan2S_XY(this->actor.world.pos.z, this->actor.world.pos.x) +
- (s16)randPlusMinusPoint5Scaled(0xCE20);
+ (s16)(s32)Rand_CenteredFloat(0xCE20);
}
Math_ApproachS(&this->actor.shape.rot.y, this->targetShapeRotation.y, 3, 0x500);
@@ -314,9 +316,9 @@ void EnTanron3_Live(EnTanron3* this, PlayState* play) {
if ((Rand_ZeroOne() < 0.5f) & !(this->timer & 0x3)) {
Vec3f effectPos;
- effectPos.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.x;
+ effectPos.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x;
effectPos.y = this->actor.world.pos.y;
- effectPos.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.world.pos.z;
+ effectPos.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z;
EnTanron3_CreateEffect(play, &effectPos);
}
break;
@@ -423,7 +425,7 @@ void EnTanron3_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->atCollider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->acCollider.base);
- if ((s8)sGyorg->actor.colChkInfo.health <= 0 && this->actionFunc != EnTanron3_Die) {
+ if (((s8)sGyorg->actor.colChkInfo.health <= 0) && (this->actionFunc != EnTanron3_Die)) {
EnTanron3_SetupDie(this, play);
this->workTimer[WORK_TIMER_DIE] = 0;
}
@@ -452,7 +454,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_Tanron4/z_en_tanron4.c b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
index 1eaf1d128..074eaec79 100644
--- a/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
+++ b/src/overlays/actors/ovl_En_Tanron4/z_en_tanron4.c
@@ -23,13 +23,13 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play);
typedef enum {
/* 0 */ SEAGULL_FLY_FLAP,
- /* 1 */ SEAGULL_FLY_GLIDE,
+ /* 1 */ SEAGULL_FLY_GLIDE
} SeagullFlyState;
typedef enum {
/* 0 */ SEAGULL_TIMER_FLY_STATE,
- /* 1 */ SEAGULL_TIMER_CHOOSE_TARGET,
-} SeagullTimers;
+ /* 1 */ SEAGULL_TIMER_CHOOSE_TARGET
+} SeagullTimer;
ActorInit En_Tanron4_InitVars = {
ACTOR_EN_TANRON4,
@@ -65,10 +65,9 @@ void EnTanron4_Init(Actor* thisx, PlayState* play2) {
s32 i;
for (i = 0; i < thisx->params; i++) {
- Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON4,
- thisx->world.pos.x + randPlusMinusPoint5Scaled(500.0f),
- thisx->world.pos.y + randPlusMinusPoint5Scaled(100.0f),
- thisx->world.pos.z + randPlusMinusPoint5Scaled(500.0f), 0, Rand_ZeroFloat(65536.0f), 0,
+ Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON4, thisx->world.pos.x + Rand_CenteredFloat(500.0f),
+ thisx->world.pos.y + Rand_CenteredFloat(100.0f),
+ thisx->world.pos.z + Rand_CenteredFloat(500.0f), 0, Rand_ZeroFloat(0x10000), 0,
SEAGULL_CLONE);
}
}
@@ -112,9 +111,9 @@ void EnTanron4_FlyNearHome(EnTanron4* this, PlayState* play) {
distToTarget = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timers[SEAGULL_TIMER_CHOOSE_TARGET] == 0) || (distToTarget < 100.0f)) {
- this->targetPos.x = this->actor.home.pos.x + randPlusMinusPoint5Scaled(500.0f);
- this->targetPos.y = this->actor.home.pos.y + randPlusMinusPoint5Scaled(100.0f);
- this->targetPos.z = this->actor.home.pos.z + randPlusMinusPoint5Scaled(500.0f);
+ this->targetPos.x = this->actor.home.pos.x + Rand_CenteredFloat(500.0f);
+ this->targetPos.y = this->actor.home.pos.y + Rand_CenteredFloat(100.0f);
+ this->targetPos.z = this->actor.home.pos.z + Rand_CenteredFloat(500.0f);
this->timers[SEAGULL_TIMER_CHOOSE_TARGET] = Rand_ZeroFloat(100.0f) + 60.0f;
this->step = 0;
@@ -151,7 +150,7 @@ void EnTanron4_FlyNearHome(EnTanron4* this, PlayState* play) {
case SEAGULL_FLY_GLIDE:
if (((this->randRollTimer % 8) == 0) && (Rand_ZeroOne() < 0.5f)) {
- this->rollTarget = randPlusMinusPoint5Scaled(3000.0f + KREG(44));
+ this->rollTarget = Rand_CenteredFloat(3000.0f + KREG(44));
}
if (this->timers[SEAGULL_TIMER_FLY_STATE] == 0) {
@@ -192,9 +191,9 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play) {
distToTarget = sqrtf(SQ(xDiff) + SQ(zDiff));
if ((this->timers[SEAGULL_TIMER_CHOOSE_TARGET] == 0) || (distToTarget < 100.0f)) {
- this->targetPos.x = targetActor->world.pos.x + randPlusMinusPoint5Scaled(200.0f + KREG(82));
- this->targetPos.y = targetActor->world.pos.y + KREG(80) + 100.0f + randPlusMinusPoint5Scaled(100.0f + KREG(81));
- this->targetPos.z = targetActor->world.pos.z + randPlusMinusPoint5Scaled(200.0f + KREG(82));
+ this->targetPos.x = targetActor->world.pos.x + Rand_CenteredFloat(200.0f + KREG(82));
+ this->targetPos.y = targetActor->world.pos.y + KREG(80) + 100.0f + Rand_CenteredFloat(100.0f + KREG(81));
+ this->targetPos.z = targetActor->world.pos.z + Rand_CenteredFloat(200.0f + KREG(82));
this->timers[SEAGULL_TIMER_CHOOSE_TARGET] = Rand_ZeroFloat(100.0f) + 60.0f;
this->step = 0;
@@ -230,7 +229,7 @@ void EnTanron4_FlyNearActor(EnTanron4* this, PlayState* play) {
case SEAGULL_FLY_GLIDE:
if (((this->randRollTimer % 8) == 0) && (Rand_ZeroOne() < 0.5f)) {
- this->rollTarget = randPlusMinusPoint5Scaled(3000.0f + KREG(44));
+ this->rollTarget = Rand_CenteredFloat(3000.0f + KREG(44));
}
if (this->timers[SEAGULL_TIMER_FLY_STATE] == 0) {
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..a56b01c3b 100644
--- a/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
+++ b/src/overlays/actors/ovl_En_Tanron5/z_en_tanron5.c
@@ -101,9 +101,9 @@ void func_80BE4930(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
effect->unk_00 = *arg1;
- effect->unk_0C = randPlusMinusPoint5Scaled(10.0f);
+ effect->unk_0C = Rand_CenteredFloat(10.0f);
effect->unk_10 = Rand_ZeroFloat(2.0f) + 3.0f;
- effect->unk_14 = randPlusMinusPoint5Scaled(10.0f);
+ effect->unk_14 = Rand_CenteredFloat(10.0f);
effect->unk_18.y = -0.15f;
effect->unk_18.x = 0.0f;
@@ -127,9 +127,9 @@ void func_80BE4A2C(EnTanron5Effect* effect, Vec3f* arg1, f32 arg2) {
effect->unk_00 = *arg1;
- effect->unk_0C = randPlusMinusPoint5Scaled(30.0f);
+ effect->unk_0C = Rand_CenteredFloat(30.0f);
effect->unk_10 = Rand_ZeroFloat(7.0f);
- effect->unk_14 = randPlusMinusPoint5Scaled(30.0f);
+ effect->unk_14 = Rand_CenteredFloat(30.0f);
effect->unk_18.y = -0.3f;
effect->unk_18.x = 0.0f;
@@ -154,8 +154,8 @@ void EnTanron5_Init(Actor* thisx, PlayState* play) {
return;
}
- this->unk_198 = randPlusMinusPoint5Scaled(0x2000);
- this->unk_19A = randPlusMinusPoint5Scaled(0x2000);
+ this->unk_198 = Rand_CenteredFloat(0x2000);
+ this->unk_19A = Rand_CenteredFloat(0x2000);
if (ENTANRON5_GET(&this->actor) < ENTANRON5_107) {
Actor_SetScale(&this->actor, (Rand_ZeroFloat(0.025f) + 0.085f) * D_80BE5DD0);
@@ -327,8 +327,8 @@ void EnTanron5_Update(Actor* thisx, PlayState* play2) {
spAC = 50.0f;
}
- sp9C.x = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.x;
- sp9C.z = (randPlusMinusPoint5Scaled(spA8) * D_80BE5DD0) + spB8.z;
+ sp9C.x = (Rand_CenteredFloat(spA8) * D_80BE5DD0) + spB8.x;
+ sp9C.z = (Rand_CenteredFloat(spA8) * D_80BE5DD0) + spB8.z;
sp9C.y = this->actor.floorHeight + (spAC * D_80BE5DD0);
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_TANRON5, sp9C.x, sp9C.y, sp9C.z,
@@ -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..e853570f4 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c
@@ -72,7 +72,7 @@ void EnTest2_Init(Actor* thisx, PlayState* play) {
EnTest2* this = THIS;
Actor_ProcessInitChain(&this->actor, sInitChain);
- if ((this->actor.params == EN_TEST2_PARAMS_B) || (this->actor.params == EN_TEST2_PARAMS_C)) {
+ if ((this->actor.params == EN_TEST2_PARAM_B) || (this->actor.params == EN_TEST2_PARAM_C)) {
this->actor.flags |= ACTOR_FLAG_20;
}
}
@@ -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_Test2/z_en_test2.h b/src/overlays/actors/ovl_En_Test2/z_en_test2.h
index 3b03e0cc1..d54dbb265 100644
--- a/src/overlays/actors/ovl_En_Test2/z_en_test2.h
+++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.h
@@ -11,8 +11,8 @@ typedef struct EnTest2 {
} EnTest2; // size = 0x148
typedef enum {
- /* 0xB */ EN_TEST2_PARAMS_B = 0xB,
- /* 0xC */ EN_TEST2_PARAMS_C
-} EnTest2_Params;
+ /* 0xB */ EN_TEST2_PARAM_B = 0xB,
+ /* 0xC */ EN_TEST2_PARAM_C
+} EnTest2_Param;
#endif // Z_EN_TEST2_H
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..2000e0e53 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c
@@ -4,6 +4,7 @@
* Description: Kafei
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test3.h"
#include "objects/object_test3/object_test3.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
@@ -125,7 +126,7 @@ static u8 sScheduleScript[] = {
/* 0x0A5 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_79_40, 0x12C - 0x0AA),
/* 0x0AA */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_SECOM, 0x0B0 - 0x0AE),
/* 0x0AE */ SCHEDULE_CMD_RET_VAL_S(7),
- /* 0x0B0 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_20, 0x0DD - 0x0B4),
+ /* 0x0B0 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT, 0x0DD - 0x0B4),
/* 0x0B4 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_IKANA, 0x0DC - 0x0B8),
/* 0x0B8 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_08, 0x0BE - 0x0BC),
/* 0x0BC */ SCHEDULE_CMD_RET_VAL_S(5),
@@ -149,7 +150,7 @@ static u8 sScheduleScript[] = {
/* 0x0F3 */ SCHEDULE_CMD_RET_TIME(4, 0, 4, 10, 11),
/* 0x0F9 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_YADOYA, 0x12B - 0x0FD),
/* 0x0FD */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 10, 4, 30, 0x125 - 0x103),
- /* 0x103 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_51_01, 0x11C - 0x107),
+ /* 0x103 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES, 0x11C - 0x107),
/* 0x107 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 30, 4, 45, 0x116 - 0x10D),
/* 0x10D */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(4, 45, 6, 0, 0x114 - 0x113),
/* 0x113 */ SCHEDULE_CMD_RET_NONE(),
@@ -312,7 +313,7 @@ s32 func_80A3E898(EnTest3* this, PlayState* play) {
u16 textId = this->unk_D78->textId;
if ((this->unk_D78->unk_0 == 4) && CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
}
if (textId == 0xFFFF) {
Message_CloseTextbox(play);
@@ -478,8 +479,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);
}
@@ -532,17 +533,17 @@ void func_80A3F114(EnTest3* this, PlayState* play) {
}
s32 func_80A3F15C(EnTest3* this, PlayState* play, struct_80A41828* arg2) {
- s32 pathIndex;
+ s32 limit;
Path* path;
Vec3s* curPathPoint;
Vec3s* nextPathPoint;
Vec3f curPathPos;
Vec3f nextPathPos;
- pathIndex = ABS_ALT(arg2->unk_1_0) - 1;
+ limit = ABS_ALT(arg2->unk_1_0) - 1;
- if (pathIndex >= 0) {
- path = SubS_GetAdditionalPath(play, KAFEI_GET_PARAM_1F(&this->player.actor), pathIndex);
+ if (limit >= 0) {
+ path = SubS_GetAdditionalPath(play, KAFEI_GET_PATH_INDEX(&this->player.actor), limit);
curPathPoint = Lib_SegmentedToVirtual(path->points);
if (arg2->unk_1_0 > 0) {
@@ -589,13 +590,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;
}
@@ -657,7 +658,7 @@ s32 func_80A3F73C(EnTest3* this, PlayState* play) {
this->player.stateFlags2 &= ~PLAYER_STATE2_40000;
D_80A41D5C = true;
if ((this->unk_D78->unk_0 == 4) && CHECK_WEEKEVENTREG(WEEKEVENTREG_51_08)) {
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
}
} else {
if (play->actorCtx.flags & ACTORCTX_FLAG_4) {
@@ -784,7 +785,7 @@ s32 func_80A3FBE8(EnTest3* this, PlayState* play) {
func_800FE658(TIME_TO_MINUTES_ALT_F(fabsf((s16) - ((void)0, gSaveContext.save.time))));
}
if (play->actorCtx.flags & ACTORCTX_FLAG_6) {
- SET_WEEKEVENTREG(WEEKEVENTREG_51_20);
+ SET_WEEKEVENTREG(WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_02);
}
D_80A41D20 = 3;
@@ -867,7 +868,7 @@ s32 func_80A40098(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul
u16 numWaypoints;
func_80A3F15C(this, play, arg2);
- this->unk_D7C = SubS_GetAdditionalPath(play, KAFEI_GET_PARAM_1F(&this->player.actor), ABS_ALT(arg2->unk_1_0) - 1);
+ this->unk_D7C = SubS_GetAdditionalPath(play, KAFEI_GET_PATH_INDEX(&this->player.actor), ABS_ALT(arg2->unk_1_0) - 1);
if ((this->unk_D88 < 7) && (this->unk_D88 != 0) && (this->unk_D80 >= 0)) {
startTime = now;
} else {
@@ -1018,8 +1019,8 @@ void func_80A40908(EnTest3* this, PlayState* play) {
func_80A3E7E0(this, func_80A4084C);
this->player.targetedActor = &GET_PLAYER(play)->actor;
SET_WEEKEVENTREG(WEEKEVENTREG_51_08);
- func_80151BB4(play, 0x19);
- func_80151BB4(play, 2);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAFEI);
} else {
func_800B8500(&this->player.actor, play, 9999.9f, 9999.9f, PLAYER_IA_MINUS1);
this->unk_D78 = &D_80A41854[6];
@@ -1103,7 +1104,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;
@@ -1163,7 +1164,9 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
func_80128640(play, &this->player, *dList1);
if (this->player.stateFlags3 & PLAYER_STATE3_20000000) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_test3_DL_00EDD0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1176,8 +1179,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);
}
@@ -1199,7 +1202,9 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
(this->player.skelAnime.curFrame >= 12.0f))) {
if (func_80127438(play, &this->player, this->player.currentMask)) {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_mask_ki_tan_DL_0004A0);
+
CLOSE_DISPS(play->state.gfxCtx);
}
}
@@ -1212,13 +1217,15 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL
Matrix_MultVec3f(&D_80A418CC, &this->player.actor.focus.pos);
}
} else if (limbIndex == OBJECT_TEST3_LIMB_15) {
- if (D_80A41D60 || CHECK_WEEKEVENTREG(WEEKEVENTREG_50_80) ||
+ if (D_80A41D60 || CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES) ||
(INV_CONTENT(ITEM_PENDANT_OF_MEMORIES) == ITEM_PENDANT_OF_MEMORIES) ||
(this->player.getItemDrawIdPlusOne - 1 == GID_PENDANT_OF_MEMORIES)) {
D_80A41D60 = true;
} else {
OPEN_DISPS(play->state.gfxCtx);
+
gSPDisplayList(POLY_OPA_DISP++, object_test3_DL_00CB60);
+
CLOSE_DISPS(play->state.gfxCtx);
}
} else {
@@ -1257,7 +1264,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_Test3/z_en_test3.h b/src/overlays/actors/ovl_En_Test3/z_en_test3.h
index 36cd15c27..17c704129 100644
--- a/src/overlays/actors/ovl_En_Test3/z_en_test3.h
+++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.h
@@ -7,7 +7,7 @@ struct EnTest3;
typedef void (*EnTest3ActionFunc)(struct EnTest3*, PlayState*);
-#define KAFEI_GET_PARAM_1F(thisx) ((thisx)->params & 0x1F)
+#define KAFEI_GET_PATH_INDEX(thisx) ((thisx)->params & 0x1F)
#define KAFEI_GET_PARAM_1E0(thisx) (((thisx)->params >> 5) & 0xF)
typedef struct {
diff --git a/src/overlays/actors/ovl_En_Test4/z_en_test4.c b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
index 24d8b4137..fb18d4a39 100644
--- a/src/overlays/actors/ovl_En_Test4/z_en_test4.c
+++ b/src/overlays/actors/ovl_En_Test4/z_en_test4.c
@@ -4,8 +4,8 @@
* Description: Three-Day Events
*/
-#include "prevent_bss_reordering.h"
#include "z_en_test4.h"
+#include "z64horse.h"
#include "overlays/gamestates/ovl_daytelop/z_daytelop.h"
#include "overlays/actors/ovl_En_Horse/z_en_horse.h"
@@ -405,9 +405,9 @@ void func_80A42AB8(EnTest4* this, PlayState* play) {
if ((rideActor->type == HORSE_TYPE_EPONA) || (rideActor->type == HORSE_TYPE_2)) {
if (CURRENT_DAY < 3) {
- D_801BDA9C = 1;
+ gHorseIsMounted = true;
} else {
- D_801BDA9C = 0;
+ gHorseIsMounted = false;
}
}
}
diff --git a/src/overlays/actors/ovl_En_Test5/z_en_test5.c b/src/overlays/actors/ovl_En_Test5/z_en_test5.c
index a041a1aaf..f7a9b431b 100644
--- a/src/overlays/actors/ovl_En_Test5/z_en_test5.c
+++ b/src/overlays/actors/ovl_En_Test5/z_en_test5.c
@@ -66,13 +66,13 @@ void EnTest5_HandleBottleAction(EnTest5* this, PlayState* play) {
player = GET_PLAYER(play);
- if (player->interactRangeActor == NULL || player->getItemId != GI_MAX) {
+ if ((player->interactRangeActor == NULL) || (player->getItemId != GI_MAX)) {
Math_Vec3f_DistXYZAndStoreDiff(&this->minPos, &player->actor.world.pos, &playerPosRelativeToWater);
// Make sure that the player is within the bounds of the water and deep enough to grab some
- if (playerPosRelativeToWater.x >= 0.0f && playerPosRelativeToWater.x <= this->xLength &&
- playerPosRelativeToWater.z >= 0.0f && playerPosRelativeToWater.z <= this->zLength &&
- fabsf(playerPosRelativeToWater.y) < 100.0f && player->actor.depthInWater > 12.0f) {
+ if ((playerPosRelativeToWater.x >= 0.0f) && (playerPosRelativeToWater.x <= this->xLength) &&
+ (playerPosRelativeToWater.z >= 0.0f) && (playerPosRelativeToWater.z <= this->zLength) &&
+ (fabsf(playerPosRelativeToWater.y) < 100.0f) && (player->actor.depthInWater > 12.0f)) {
Actor_OfferGetItem(&this->actor, play, GI_MAX, this->actor.xzDistToPlayer,
fabsf(this->actor.playerHeightRel));
}
@@ -89,10 +89,10 @@ void EnTest5_Update(Actor* thisx, PlayState* play2) {
this->actionFunc(this, play);
// If it's the hot spring variant, generate steam clouds
- if (ENTEST5_IS_HOT_SPRING(&this->actor) && (play->state.frames % 4) == 0) {
- steamPos.x = (Rand_ZeroOne() * this->xLength) + this->minPos.x;
+ if (ENTEST5_IS_HOT_SPRING(&this->actor) && ((play->state.frames % 4) == 0)) {
+ steamPos.x = this->minPos.x + (Rand_ZeroOne() * this->xLength);
steamPos.y = this->minPos.y + 100.0f;
- steamPos.z = (Rand_ZeroOne() * this->zLength) + this->minPos.z;
+ steamPos.z = this->minPos.z + (Rand_ZeroOne() * this->zLength);
if ((BgCheck_EntityRaycastFloor2(play, &play->colCtx, &poly, &steamPos) + 10.0f) < this->minPos.y) {
Vec3f steamVel;
@@ -102,8 +102,7 @@ void EnTest5_Update(Actor* thisx, PlayState* play2) {
steamVel.x = 0.0f;
steamVel.z = 0.0f;
- EffectSsIceSmoke_Spawn(play, &steamPos, &steamVel, &gZeroVec3f,
- (s16)((-200) - (s32)(Rand_ZeroOne() * 50.0f)));
+ EffectSsIceSmoke_Spawn(play, &steamPos, &steamVel, &gZeroVec3f, -200 - (s32)(Rand_ZeroOne() * 50.0f));
}
}
}
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..846d728dc 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;
@@ -1194,6 +1194,7 @@ void func_80A9369C(Actor* thisx, PlayState* play2) {
s32 pad;
if (this) {}
+
OPEN_DISPS(play->state.gfxCtx);
this->unk_148 = POLY_OPA_DISP;
@@ -1295,7 +1296,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_Test6/z_en_test6.h b/src/overlays/actors/ovl_En_Test6/z_en_test6.h
index d7e40a983..2fe138ddb 100644
--- a/src/overlays/actors/ovl_En_Test6/z_en_test6.h
+++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.h
@@ -9,11 +9,11 @@ typedef void (*EnTest6ActionFunc)(struct EnTest6*, PlayState*);
#define ENTEST6_GET(thisx) ((thisx)->params)
-enum {
+typedef enum {
/* 24 */ ENTEST6_24 = 24,
/* 25 */ ENTEST6_25,
- /* 26 */ ENTEST6_26,
-};
+ /* 26 */ ENTEST6_26
+} EnTest6Param;
typedef struct {
/* 0x00 */ LightNode* node;
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..2606331e2 100644
--- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c
+++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c
@@ -4,6 +4,7 @@
* Description: Soaring effects (wings, sphere, etc)
*/
+#include "prevent_bss_reordering.h"
#include "z_en_test7.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -330,7 +331,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..87589ae8c 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)
@@ -193,12 +193,12 @@ void func_80C10984(EnThiefbird* this, s32 arg1) {
for (i = 0; i < ARRAY_COUNT(this->unk_3F0); i++, ptr++) {
if (ptr->unk_22 == 0) {
ptr->unk_22 = (s32)Rand_ZeroFloat(20.0f) + 40;
- ptr->unk_00.x = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.x;
- ptr->unk_00.y = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.y;
- ptr->unk_00.z = randPlusMinusPoint5Scaled(30.0f) + this->actor.focus.pos.z;
- ptr->unk_0C.x = randPlusMinusPoint5Scaled(5.0f);
+ ptr->unk_00.x = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.x;
+ ptr->unk_00.y = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.y;
+ ptr->unk_00.z = Rand_CenteredFloat(30.0f) + this->actor.focus.pos.z;
+ ptr->unk_0C.x = Rand_CenteredFloat(5.0f);
ptr->unk_0C.y = Rand_ZeroOne() + 2.0f;
- ptr->unk_0C.z = randPlusMinusPoint5Scaled(5.0f);
+ ptr->unk_0C.z = Rand_CenteredFloat(5.0f);
ptr->unk_1C = Rand_ZeroFloat(1000.0f);
ptr->unk_18 = (Rand_ZeroFloat(20.0f) + 40.0f) * 0.0001f;
ptr->unk_1E = (s32)Rand_Next() >> 0x10;
@@ -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_Time_Tag/z_en_time_tag.c b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
index 10f3ea529..dfcd1bad0 100644
--- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
+++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c
@@ -114,12 +114,12 @@ void EnTimeTag_RooftopOath_Cutscene(EnTimeTag* this, PlayState* play) {
}
void EnTimeTag_RooftopOath_Wait(EnTimeTag* this, PlayState* play) {
- EnTimeTag* this2 = this;
+ Actor* thisx = &this->actor;
if ((play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_OATH)) {
- if (this->actor.csId != CS_ID_NONE) {
+ if (thisx->csId != CS_ID_NONE) {
this->actionFunc = EnTimeTag_RooftopOath_Cutscene;
- CutsceneManager_Queue(this2->actor.csId);
+ CutsceneManager_Queue(thisx->csId);
gSaveContext.timerStates[TIMER_ID_MOON_CRASH] = TIMER_STATE_OFF;
}
play->msgCtx.ocarinaMode = 4;
diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
index 128e01973..c022ca122 100644
--- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
+++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.h
@@ -56,7 +56,7 @@ typedef enum {
/* 13 */ TIMETAG_KICKOUT_TEXT_TOWN_SHOOTING_GALLERY_2, // quick, it's closing time
/* 14 */ TIMETAG_KICKOUT_TEXT_SWORDSMANS_SCHOOL, // need to cut the moon, must leave
/* 15 */ TIMETAG_KICKOUT_TEXT_TREASURE_CHEST_SHOP, // already time to close shop
- /* 16 */ TIMETAG_KICKOUT_TEXT_DOGGY_RACETRACK, // no more for today
+ /* 16 */ TIMETAG_KICKOUT_TEXT_DOGGY_RACETRACK // no more for today
} TimeTagKickOutText;
typedef struct EnTimeTag {
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..1ae0e073b 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -253,9 +253,9 @@ void func_80893BCC(EnTite* this, PlayState* play) {
for (i = 5; i < ARRAY_COUNT(this->limbPos); i++) {
for (j = 0; j < 2; j++) {
ptr = &this->limbPos[i];
- sp7C.x = ptr->x + randPlusMinusPoint5Scaled(1.0f);
- sp7C.y = ptr->y + randPlusMinusPoint5Scaled(1.0f);
- sp7C.z = ptr->z + randPlusMinusPoint5Scaled(1.0f);
+ sp7C.x = ptr->x + Rand_CenteredFloat(1.0f);
+ sp7C.y = ptr->y + Rand_CenteredFloat(1.0f);
+ sp7C.z = ptr->z + Rand_CenteredFloat(1.0f);
func_800B0DE0(play, &sp7C, &gZeroVec3f, &D_80896B64, &D_80896B3C, &D_80896B40,
(s32)Rand_ZeroFloat(16.0f) + 80, 15);
}
@@ -808,9 +808,9 @@ void func_80895738(EnTite* this, PlayState* play) {
void func_8089595C(EnTite* this, PlayState* play) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(20.0f) + this->actor.world.pos.x;
+ sp2C.x = Rand_CenteredFloat(20.0f) + this->actor.world.pos.x;
sp2C.y = this->actor.world.pos.y + 15.0f;
- sp2C.z = randPlusMinusPoint5Scaled(20.0f) + this->actor.world.pos.z;
+ sp2C.z = Rand_CenteredFloat(20.0f) + this->actor.world.pos.z;
func_800B0DE0(play, &sp2C, &gZeroVec3f, &D_80896B44, &D_80896B3C, &D_80896B40, 500, 50);
}
@@ -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_Tite/z_en_tite.h b/src/overlays/actors/ovl_En_Tite/z_en_tite.h
index 57d8ef3e3..af77f4a8d 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.h
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.h
@@ -7,13 +7,13 @@ struct EnTite;
typedef void (*EnTiteActionFunc)(struct EnTite*, PlayState*);
-enum {
+typedef enum {
/* -4 */ ENTITE_MINUS_4 = -4,
/* -3 */ ENTITE_MINUS_3,
/* -2 */ ENTITE_MINUS_2,
/* -1 */ ENTITE_MINUS_1,
- /* 0 */ ENTITE_MINUS_0,
-};
+ /* 0 */ ENTITE_MINUS_0
+} EnTiteParam;
typedef struct EnTite {
/* 0x000 */ Actor actor;
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..469e07e6d 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -130,9 +130,9 @@ static f32 D_80AEF8F0[] = {
};
typedef struct {
- /* 0x00 */ Actor* unk_00;
- /* 0x04 */ f32 unk_04;
-} EnTkStruct; // size = 0x8?
+ /* 0x0 */ Actor* unk_00;
+ /* 0x4 */ f32 unk_04;
+} EnTkStruct; // size = 0x8
void func_80AEC460(EnTk* this) {
if (DECR(this->unk_2C4) == 0) {
@@ -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;
@@ -503,12 +503,12 @@ s32 func_80AED354(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
s32 func_80AED38C(EnTk* this, PlayState* play, ScheduleOutput* scheduleOutput) {
u16 sp1E = SCHEDULE_TIME_NOW;
- u8 params = ENTK_GET_F800(&this->actor);
+ u8 pathIndex = ENTK_GET_PATH_INDEX(&this->actor);
u16 phi_a1;
s32 index = scheduleOutput->result - 1;
u16 tmp;
- this->timePath = SubS_GetAdditionalPath(play, params, D_80AEF8E8[index + 1]);
+ this->timePath = SubS_GetAdditionalPath(play, pathIndex, D_80AEF8E8[index + 1]);
if (this->timePath == NULL) {
return false;
}
@@ -1366,6 +1366,7 @@ void EnTk_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
gSPDisplayList(POLY_OPA_DISP++, object_tk_DL_00B530);
CLOSE_DISPS(play->state.gfxCtx);
+
break;
}
}
@@ -1382,7 +1383,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_Tk/z_en_tk.h b/src/overlays/actors/ovl_En_Tk/z_en_tk.h
index 9604133e7..aa15c6fc6 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.h
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.h
@@ -10,7 +10,7 @@ typedef void (*EnTkUnkFunc)(struct EnTk*, PlayState*);
#define ENTK_GET_F(thisx) ((thisx)->params & 0xF)
#define ENTK_GET_7F0(thisx) (((thisx)->params >> 4) & 0x7F)
-#define ENTK_GET_F800(thisx) ((((thisx)->params >> 0xB) & 0x1F) & 0xFF)
+#define ENTK_GET_PATH_INDEX(thisx) (((thisx)->params >> 0xB) & 0x1F)
typedef struct EnTk {
/* 0x000 */ Actor actor;
diff --git a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
index c6681b4be..204fa8714 100644
--- a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
+++ b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c
@@ -160,7 +160,8 @@ void EnTorch2_Draw(Actor* thisx, PlayState* play2) {
Gfx* gfx = sShellDLists[this->actor.params];
OPEN_DISPS(play->state.gfxCtx);
- if (this->alpha == 0xFF) {
+
+ if (this->alpha == 255) {
Scene_SetRenderModeXlu(play, 0, 0x01);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
Gfx_DrawDListOpa(play, gfx);
@@ -169,5 +170,6 @@ void EnTorch2_Draw(Actor* thisx, PlayState* play2) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->alpha);
Gfx_DrawDListXlu(play, gfx);
}
+
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
index 9033b9923..edc488d1e 100644
--- a/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
+++ b/src/overlays/actors/ovl_En_Torch2/z_en_torch2.h
@@ -18,7 +18,7 @@ typedef enum {
/* 1 */ TORCH2_PARAM_GORON,
/* 2 */ TORCH2_PARAM_ZORA,
/* 3 */ TORCH2_PARAM_DEKU,
- /* 4 */ TORCH2_PARAM_FIERCE_DEITY,
+ /* 4 */ TORCH2_PARAM_FIERCE_DEITY
} EnTorch2Param;
typedef enum {
@@ -26,7 +26,7 @@ typedef enum {
/* 1 */ TORCH2_STATE_FADING_IN,
/* 2 */ TORCH2_STATE_SOLID,
/* 3 */ TORCH2_STATE_IDLE,
- /* 4 */ TORCH2_STATE_DYING,
+ /* 4 */ TORCH2_STATE_DYING
} EnTorch2State;
#endif // Z_EN_TORCH2_H
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..2177742dc 100644
--- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c
+++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c
@@ -205,16 +205,16 @@ void EnToto_Destroy(Actor* thisx, PlayState* play) {
}
void func_80BA383C(EnToto* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) && this->actionFuncIndex == 1 &&
- this->skelAnime.animation != &object_zm_Anim_000C80) {
- if (play->msgCtx.currentTextId != 0x2A98 && play->msgCtx.currentTextId != 0x2A99) {
- if (this->unk2B4 & 1 || Rand_ZeroOne() > 0.5f) {
+ if (SkelAnime_Update(&this->skelAnime) && (this->actionFuncIndex == 1) &&
+ (this->skelAnime.animation != &object_zm_Anim_000C80)) {
+ if ((play->msgCtx.currentTextId != 0x2A98) && (play->msgCtx.currentTextId != 0x2A99)) {
+ if ((this->unk2B4 & 1) || (Rand_ZeroOne() > 0.5f)) {
this->unk2B4 = (this->unk2B4 + 1) & 3;
}
}
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) {
@@ -251,9 +251,8 @@ void func_80BA39C8(EnToto* this, PlayState* play) {
return;
}
- //! TODO: Neither 0xED02 nor 0xED01 match CLOCK_TIME macro
if (((play->sceneId == SCENE_MILK_BAR) &&
- !((gSaveContext.save.time >= CLOCK_TIME(6, 0)) && (gSaveContext.save.time < 0xED02))) ||
+ !((gSaveContext.save.time >= CLOCK_TIME(6, 0)) && (gSaveContext.save.time <= (CLOCK_TIME(22, 13) + 7)))) ||
((play->sceneId != SCENE_MILK_BAR) && func_80BA397C(this, 0x2000))) {
if (this->unk2B6 != 0) {
this->text = D_80BA5044;
@@ -291,7 +290,7 @@ void func_80BA3BFC(EnToto* this, PlayState* play) {
this->unk2B4 = 0;
} else {
if (this->text->unk0 == 4) {
- func_80151BB4(play, 9);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
}
Animation_MorphToLoop(&this->skelAnime, &object_zm_Anim_00B3E0, -4.0f);
}
@@ -316,7 +315,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) {
@@ -327,16 +326,16 @@ void func_80BA3DBC(EnToto* this, PlayState* play) {
if (!func_80BA4C44(this, play)) {
return;
}
- if (this->text->unk1 != 0 && ENTOTO_WEEK_EVENT_FLAGS) {
+ if ((this->text->unk1 != 0) && ENTOTO_WEEK_EVENT_FLAGS) {
this->unk2B7 = 1;
return;
}
} else {
player = GET_PLAYER(play);
if ((player->stateFlags1 & PLAYER_STATE1_400) && player->unk_AE7 != 0) {
- func_80151BB4(play, 48);
- func_80151BB4(play, 9);
- func_80151BB4(play, 10);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN);
} else {
return;
}
@@ -370,7 +369,7 @@ s32 func_80BA3F2C(EnToto* this, PlayState* play) {
func_80BA3EE8(this, play);
}
if (this->text->unk0 == 4) {
- func_80151BB4(play, 9);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
}
return 0;
}
@@ -428,7 +427,7 @@ s32 func_80BA415C(EnToto* this, PlayState* play) {
} else {
func_8019F208();
}
- return (play->msgCtx.choiceIndex != 0 ? 0 : this->text->unk1) + 1; // Possible msg MACRO
+ return ((play->msgCtx.choiceIndex != 0) ? 0 : this->text->unk1) + 1;
}
return 0;
}
@@ -584,8 +583,9 @@ s32 func_80BA47E0(EnToto* this, PlayState* play) {
this->unk2B3 += 8;
}
for (i = 0; i < ARRAY_COUNT(D_80BA50DC); i++) {
- if (gSaveContext.save.playerForm != (i + 1) && (D_80BA5128[i] & this->unk2B3)) {
+ 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);
}
@@ -686,8 +686,8 @@ void func_80BA4CB4(EnToto* this, PlayState* play) {
Animation_PlayOnce(&this->skelAnime,
(this->cueId == 1) ? &object_zm_Anim_0016A4 : &object_zm_Anim_0022C8);
if ((this->cueId == 2) && (this->unk2B3 != 0xF)) {
- func_80151BB4(play, 9);
- func_80151BB4(play, 10);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_TOTO);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_GORMAN);
}
}
}
@@ -727,8 +727,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 e4a4a4ab8..ee9c5aaae 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -126,7 +126,7 @@ void EnTrt_ChangeAnim(SkelAnime* skelAnime, AnimationInfoS* animationInfo, s32 a
s32 EnTrt_TestItemSelected(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx;
- if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) {
+ if ((msgCtx->unk12020 == 0x10) || (msgCtx->unk12020 == 0x11)) {
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A);
}
return CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_A) ||
@@ -274,10 +274,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
s8 stickY = CONTROLLER1(&play->state)->rel.stick_y;
if (this->stickAccumX == 0) {
- if (stickX > 30 || stickX < -30) {
+ if ((stickX > 30) || (stickX < -30)) {
this->stickAccumX = stickX;
}
- } else if (stickX <= 30 && stickX >= -30) {
+ } else if ((stickX <= 30) && (stickX >= -30)) {
this->stickAccumX = 0;
} else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions
this->stickAccumX = stickX;
@@ -290,10 +290,10 @@ void EnTrt_UpdateJoystickInputState(PlayState* play, EnTrt* this) {
}
}
if (this->stickAccumY == 0) {
- if (stickY > 30 || stickY < -30) {
+ if ((stickY > 30) || (stickY < -30)) {
this->stickAccumY = stickY;
}
- } else if (stickY <= 30 && stickY >= -30) {
+ } else if ((stickY <= 30) && (stickY >= -30)) {
this->stickAccumY = 0;
} else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions
this->stickAccumY = stickY;
@@ -351,10 +351,12 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_53_08);
Player_UpdateBottleHeld(play, GET_PLAYER(play), ITEM_BOTTLE, PLAYER_IA_BOTTLE_EMPTY);
break;
+
case 0x888:
this->textId = 0x889;
Message_StartTextbox(play, this->textId, &this->actor);
break;
+
case 0x889:
if (this->cutsceneState == ENTRT_CUTSCENESTATE_PLAYING_SPECIAL) {
CutsceneManager_Stop(this->csId);
@@ -364,6 +366,7 @@ void EnTrt_GetMushroom(EnTrt* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
this->actionFunc = EnTrt_PayForMushroom;
break;
+
default:
this->cutsceneState = ENTRT_CUTSCENESTATE_PLAYING;
EnTrt_EndInteraction(play, this);
@@ -389,10 +392,14 @@ void EnTrt_Goodbye(EnTrt* this, PlayState* play) {
this->textId = 0x887;
Message_ContinueTextbox(play, this->textId);
break;
+
case 0x887:
case 0x88B:
EnTrt_EndInteraction(play, this);
break;
+
+ default:
+ break;
}
}
}
@@ -504,12 +511,15 @@ s32 EnTrt_FacingShopkeeperDialogResult(EnTrt* this, PlayState* play) {
func_8019F208();
EnTrt_SetupTalkToShopkeeper(play, this);
return true;
+
case 1:
func_8019F230();
EnTrt_EndInteraction(play, this);
return true;
+
+ default:
+ return false;
}
- return false;
}
void EnTrt_FaceShopkeeper(EnTrt* this, PlayState* play) {
@@ -603,7 +613,7 @@ s32 EnTrt_HasPlayerSelectedItem(PlayState* play, EnTrt* this, Input* input) {
return true;
}
if (EnTrt_TestItemSelected(play)) {
- if (item->actor.params != SI_POTION_BLUE || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
+ if ((item->actor.params != SI_POTION_BLUE) || (this->flags & ENTRT_GIVEN_MUSHROOM)) {
this->prevActionFunc = this->actionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemChoiceTextId(this));
play_sound(NA_SE_SY_DECIDE);
@@ -733,11 +743,15 @@ void EnTrt_SelectItem(EnTrt* this, PlayState* play) {
case 0:
EnTrt_HandleCanBuyItem(play, this);
break;
+
case 1:
func_8019F230();
this->actionFunc = this->prevActionFunc;
Message_ContinueTextbox(play, EnTrt_GetItemTextId(this));
break;
+
+ default:
+ break;
}
}
} else if ((talkState == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
@@ -904,19 +918,25 @@ void EnTrt_BeginInteraction(EnTrt* this, PlayState* play) {
this->actionFunc = EnTrt_StartRedPotionConversation;
}
break;
+
case 0x83E:
func_8011552C(play, DO_ACTION_DECIDE);
this->stickLeftPrompt.isEnabled = false;
this->stickRightPrompt.isEnabled = true;
this->actionFunc = EnTrt_FaceShopkeeper;
break;
+
case 0x850:
case 0x890:
this->actionFunc = EnTrt_SetupEndInteraction;
break;
+
case 0x88F:
this->actionFunc = EnTrt_StartRedPotionConversation;
break;
+
+ default:
+ break;
}
}
}
@@ -1015,16 +1035,20 @@ void EnTrt_ItemGiven(EnTrt* this, PlayState* play) {
case 0x889:
this->textId = 0x88A;
break;
+
case 0x881:
this->textId = 0x88C;
break;
+
case 0x838:
case 0x83C:
case 0x88E:
case 0x88F:
this->textId = 0x83A;
break;
+
default:
+ //! FAKE:
if (1) {}
this->textId = 0x849;
break;
@@ -1048,8 +1072,8 @@ void EnTrt_ShopkeeperGone(EnTrt* this, PlayState* play) {
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
Message_StartTextbox(play, this->textId, &this->actor);
} else {
- if ((player->actor.world.pos.x >= -50.0f && player->actor.world.pos.x <= 50.0f) &&
- (player->actor.world.pos.z >= -19.0f && player->actor.world.pos.z <= 30.0f)) {
+ if ((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= 50.0f) &&
+ (player->actor.world.pos.z >= -19.0f) && (player->actor.world.pos.z <= 30.0f)) {
func_800B8614(&this->actor, play, 200.0f);
}
}
@@ -1129,6 +1153,7 @@ void EnTrt_ContinueShopping(EnTrt* this, PlayState* play) {
EnTrt_SetupStartShopping(play, this, true);
func_800B85E0(&this->actor, play, 400.0f, PLAYER_IA_MINUS1);
break;
+
case 1:
default:
func_8019F230();
@@ -1571,7 +1596,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 +1657,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 +1818,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..29560fdce 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.c
@@ -216,7 +216,7 @@ void func_80AD36EC(EnTrt2* this, PlayState* play) {
this->unk_1E4 = 0;
this->unk_3D9 = 1;
this->actor.velocity.y = 0.0f;
- this->path = SubS_GetPathByIndex(play, this->path->unk1, -1);
+ this->path = SubS_GetPathByIndex(play, this->path->additionalPathIndex, PATH_INDEX_NONE);
CutsceneManager_Stop(this->csId);
this->csId = CutsceneManager_GetAdditionalCsId(this->csId);
CutsceneManager_Queue(this->csId);
@@ -450,7 +450,7 @@ void func_80AD417C(EnTrt2* this, PlayState* play) {
play->msgCtx.stateTimer = 4;
if (this->unk_3A8 == 0x84C) {
EnTrt2_ChangeAnim(&this->skelAnime, sAnimationInfo, TRT2_ANIM_HOVER);
- this->path = SubS_GetPathByIndex(play, ENTRT2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRT2_GET_PATH_INDEX(&this->actor), ENTRT2_PATH_INDEX_NONE);
this->unk_3B2 = 18;
} else if (this->unk_3A8 == 0x88F) {
this->unk_3A8 = 0x88E;
@@ -499,9 +499,9 @@ void func_80AD434C(EnTrt2* this, PlayState* play) {
Vec3f sp5C = { 0.0f, 0.5f, 0.0f };
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i -= 2) {
- sp68.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp68.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp68.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp68.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp68.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp68.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp68, &sp5C, &sp5C, 100, 0, 3);
}
@@ -592,7 +592,7 @@ s32 func_80AD475C(EnTrt2* this, Path* path, s32 arg2) {
phi_f14 = points[arg + 1].z - points[arg - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
ret = true;
@@ -639,9 +639,9 @@ f32 func_80AD49B8(Path* path, s32 arg1, Vec3f* arg2, Vec3s* arg3) {
void func_80AD4A78(EnTrt2* this, PlayState* play) {
Vec3f sp34;
- sp34.x = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.x;
+ sp34.x = Rand_CenteredFloat(15.0f) + this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y;
- sp34.z = randPlusMinusPoint5Scaled(15.0f) + this->actor.world.pos.z;
+ sp34.z = Rand_CenteredFloat(15.0f) + this->actor.world.pos.z;
Actor_SpawnFloorDustRing(play, &this->actor, &sp34, 50.0f, 0, 2.0f, 0, 0, 0);
}
@@ -722,7 +722,7 @@ void func_80AD4DB4(EnTrt2* this, PlayState* play) {
this->actor.flags &= ~ACTOR_FLAG_10;
Actor_SetObjectDependency(play, &this->actor);
Actor_SetScale(&this->actor, 0.008f);
- this->path = SubS_GetPathByIndex(play, ENTRT2_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRT2_GET_PATH_INDEX(&this->actor), ENTRT2_PATH_INDEX_NONE);
this->unk_3AE = Rand_S16Offset(100, 50);
this->unk_3B0 = 10;
this->unk_3A8 = 0;
@@ -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_Trt2/z_en_trt2.h b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
index f30f41d80..f9e2b4fc8 100644
--- a/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
+++ b/src/overlays/actors/ovl_En_Trt2/z_en_trt2.h
@@ -9,7 +9,9 @@ typedef void (*EnTrt2ActionFunc)(struct EnTrt2*, PlayState*);
typedef void (*EnTrt2UnkFunc)(struct EnTrt2*);
typedef void (*EnTrt2UnkFunc2)(struct EnTrt2*, PlayState*);
-#define ENTRT2_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENTRT2_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENTRT2_PATH_INDEX_NONE 0x3F
typedef struct EnTrt2 {
/* 0x000 */ Actor actor;
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 bb146784d..895d1d406 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -93,8 +93,14 @@ ActorInit En_Tru_InitVars = {
static Vec3f D_80A8B250 = { 0.0f, 0.02f, 0.0f };
static Color_RGBA8 D_80A8B25C[] = {
- { 255, 20, 60, 0 }, { 255, 235, 160, 0 }, { 20, 60, 255, 0 },
- { 100, 100, 100, 0 }, { 255, 255, 200, 0 }, { 100, 100, 100, 0 },
+ { 255, 20, 60, 0 },
+ { 255, 235, 160, 0 },
+ { 20, 60, 255, 0 },
+};
+static Color_RGBA8 D_80A8B268[] = {
+ { 100, 100, 100, 0 },
+ { 255, 255, 200, 0 },
+ { 100, 100, 100, 0 },
};
static f32 D_80A8B274[] = { 60.0f, 255.0f, 60.0f };
@@ -173,36 +179,36 @@ 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++) {
- if (arg0->unk_00 == 1) {
- f32 alpha;
+ f32 alpha;
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, D_80A89000);
- flag = true;
- }
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= 255.0f;
- } while (0);
-
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)alpha);
- gSPSegment(POLY_XLU_DISP++, 0x08,
- Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -arg0->unk_02 * 5, 32, 64, 1, 0, 0, 32, 32));
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
- Matrix_Translate(0.0f, 14.0f, 0.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_80A890A8);
+ if (arg0->unk_00 != 1) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, D_80A89000);
+ flag = true;
+ }
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= 255.0f;
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)alpha);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, -arg0->unk_02 * 5, 32, 64, 1, 0, 0, 32, 32));
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+ Matrix_Translate(0.0f, 14.0f, 0.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_80A890A8);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -227,38 +233,38 @@ void func_80A85AA4(EnTruUnkStruct* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 ar
}
void func_80A85BCC(EnTruUnkStruct* arg0, PlayState* play) {
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 i;
s32 flag = false;
OPEN_DISPS(play->state.gfxCtx);
- if (play) {}
- func_8012C2DC(play->state.gfxCtx);
+ Gfx_SetupDL25_Xlu(play->state.gfxCtx);
for (i = 0; i < 30; i++, arg0++) {
- if (arg0->unk_00 == 2) {
- f32 alpha;
+ f32 alpha;
- if (!flag) {
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 200, 0);
- flag = true;
- }
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= 255.0f;
- } while (0);
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 200, (u8)alpha);
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_80A8A108);
+ if (arg0->unk_00 != 2) {
+ continue;
}
+
+ if (!flag) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 200, 0);
+ flag = true;
+ }
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= 255.0f;
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 200, (u8)alpha);
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, D_80A8A108);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -282,63 +288,56 @@ void func_80A85E2C(EnTruUnkStruct* arg0, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3,
}
}
-#ifdef NON_MATCHING
-// s8/s6 flipped, same deal as above functions but the same fixes don't work
void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play) {
- u8 flag = false;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 i;
+ s32 flag = false;
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;
s32 index;
-
- if ((arg0->unk_00 == 3) || (arg0->unk_00 == 4) || (arg0->unk_00 == 5)) {
- if (!flag) {
- POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0);
- gSPDisplayList(POLY_XLU_DISP++, gKoumeDustMaterialDL);
- flag = true;
- }
-
- Matrix_Push();
-
- do {
- alpha = (f32)arg0->unk_02 / arg0->unk_01;
- alpha *= D_80A8B274[arg0->unk_00 - 3];
- } while (0);
-
- gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0,
- COMBINED, 0, SHADE, 0, 0, 0, 0, COMBINED);
- gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
- gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
- D_80A8B25C[arg0->unk_00 - 3].b, (u8)alpha);
- gDPSetEnvColor(POLY_XLU_DISP++, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
- D_80A8B25C[arg0->unk_00 - 3].b, 0);
-
- Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
- Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
- Matrix_ReplaceRotation(&play->billboardMtxF);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- index = ((f32)arg0->unk_02 / arg0->unk_01) * 8.0f;
- gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
- gSPDisplayList(POLY_XLU_DISP++, gKoumeDustModelDL);
-
- Matrix_Pop();
+ if ((arg0->unk_00 != 3) && (arg0->unk_00 != 4) && (arg0->unk_00 != 5)) {
+ continue;
}
+
+ if (!flag) {
+ POLY_XLU_DISP = Gfx_SetupDL(POLY_XLU_DISP, SETUPDL_0);
+ gSPDisplayList(POLY_XLU_DISP++, gKoumeDustMaterialDL);
+ flag = true;
+ }
+
+ Matrix_Push();
+
+ alpha = (f32)arg0->unk_02 / arg0->unk_01;
+ alpha *= D_80A8B274[arg0->unk_00 - 3];
+
+ gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0,
+ COMBINED, 0, SHADE, 0, 0, 0, 0, COMBINED);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80A8B25C[arg0->unk_00 - 3].r, D_80A8B25C[arg0->unk_00 - 3].g,
+ D_80A8B25C[arg0->unk_00 - 3].b, (u8)alpha);
+ gDPSetEnvColor(POLY_XLU_DISP++, D_80A8B268[arg0->unk_00 - 3].r, D_80A8B268[arg0->unk_00 - 3].g,
+ D_80A8B268[arg0->unk_00 - 3].b, 0);
+
+ Matrix_Translate(arg0->unk_04.x, arg0->unk_04.y, arg0->unk_04.z, MTXMODE_NEW);
+ Matrix_Scale(arg0->unk_28, arg0->unk_28, 1.0f, MTXMODE_APPLY);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ index = ((f32)arg0->unk_02 / arg0->unk_01) * 8.0f;
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(sDustTextures[index]));
+ gSPDisplayList(POLY_XLU_DISP++, gKoumeDustModelDL);
+ Matrix_Pop();
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-void func_80A85F84(EnTruUnkStruct* arg0, PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tru/func_80A85F84.s")
-#endif
s32 func_80A86384(EnTruUnkStruct* arg0, Vec3f* arg1) {
s32 i;
@@ -495,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);
@@ -525,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);
@@ -693,10 +692,11 @@ s32 func_80A872AC(EnTru* this, PlayState* play) {
}
this->unk_34E &= ~(0x4000 | 0x2000);
- if ((player->exchangeItemId == 35) || (player->exchangeItemId == 36)) {
+ if ((player->exchangeItemId == PLAYER_IA_BOTTLE_POTION_RED) ||
+ (player->exchangeItemId == PLAYER_IA_BOTTLE_POTION_BLUE)) {
this->unk_34E |= 0x2000;
this->unk_38C = player->exchangeItemId;
- } else if (player->exchangeItemId != 0) {
+ } else if (player->exchangeItemId != PLAYER_IA_NONE) {
this->unk_34E |= 0x4000;
}
@@ -973,8 +973,8 @@ s32 func_80A87B48(Actor* thisx, PlayState* play) {
this->actor.shape.shadowDraw = NULL;
this->unk_34E |= (0x200 | 0x8);
this->unk_34E &= ~0x800;
- if (player->exchangeItemId != 0) {
- player->exchangeItemId = 0;
+ if (player->exchangeItemId != PLAYER_IA_NONE) {
+ player->exchangeItemId = PLAYER_IA_NONE;
}
EnTru_ChangeAnim(this, KOUME_ANIM_HOVER1);
}
@@ -1139,7 +1139,8 @@ void EnTru_Init(Actor* thisx, PlayState* play) {
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
this->animIndex = -1;
EnTru_ChangeAnim(this, KOUME_ANIM_INJURED_LYING_DOWN);
- this->path = SubS_GetDayDependentPath(play, ENTRU_GET_PATH(&this->actor), 255, &this->unk_384);
+ this->path =
+ SubS_GetDayDependentPath(play, ENTRU_GET_PATH_INDEX(&this->actor), ENTRU_PATH_INDEX_NONE, &this->unk_384);
if (this->path != NULL) {
this->unk_384 = 1;
}
@@ -1266,7 +1267,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/z_en_tru.h b/src/overlays/actors/ovl_En_Tru/z_en_tru.h
index c6d2af00c..e7c06e127 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.h
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.h
@@ -9,7 +9,9 @@ struct EnTru;
typedef void (*EnTruActionFunc)(struct EnTru*, PlayState*);
typedef s32 (*EnTruUnkFunc)(Actor*, PlayState*);
-#define ENTRU_GET_PATH(thisx) ((thisx)->params & 0xFF)
+#define ENTRU_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
+
+#define ENTRU_PATH_INDEX_NONE 0xFF
typedef struct {
/* 0x00 */ u8 unk_00;
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..f877a26a8 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
@@ -301,7 +301,7 @@ s32 func_80B76600(EnTruMt* this, Path* path, s32 arg2) {
phi_f14 = sp5C[idx + 1].z - sp5C[idx - 1].z;
}
- func_8017B7F8(&sp30, RAD_TO_BINANG(func_80086B30(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
+ func_8017B7F8(&sp30, RAD_TO_BINANG(Math_FAtan2F(phi_f12, phi_f14)), &sp44, &sp40, &sp3C);
if (((this->actor.world.pos.x * sp44) + (sp40 * this->actor.world.pos.z) + sp3C) > 0.0f) {
sp50 = true;
}
@@ -431,7 +431,7 @@ void EnTruMt_Init(Actor* thisx, PlayState* play) {
this->collider.dim.worldSphere.radius = 22;
this->actor.colChkInfo.damageTable = &sDamageTable;
- this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FF(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FF(&this->actor), ENTRUMT_PATH_INDEX_NONE);
this->actor.targetMode = 0;
Actor_SetScale(&this->actor, 0.008f);
@@ -439,7 +439,7 @@ void EnTruMt_Init(Actor* thisx, PlayState* play) {
this->unk_328 = 0;
this->actor.room = -1;
- this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FC00(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENTRUMT_GET_FC00(&this->actor), ENTRUMT_PATH_INDEX_NONE);
EnTruMt_ChangeAnim(&this->skelAnime, KOUME_MT_ANIM_FLY);
this->actionFunc = func_80B76A64;
}
@@ -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_Tru_Mt/z_en_tru_mt.h b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
index b114804d7..d25d54a24 100644
--- a/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
+++ b/src/overlays/actors/ovl_En_Tru_Mt/z_en_tru_mt.h
@@ -11,6 +11,8 @@ typedef void (*EnTruMtActionFunc)(struct EnTruMt*, PlayState*);
#define ENTRUMT_GET_FF(thisx) ((thisx)->params & 0xFF)
#define ENTRUMT_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENTRUMT_PATH_INDEX_NONE 0x3F
+
typedef struct EnTruMt {
/* 0x000 */ Actor actor;
/* 0x144 */ EnTruMtActionFunc actionFunc;
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..a404ac817 100644
--- a/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
+++ b/src/overlays/actors/ovl_En_Tsn/z_en_tsn.c
@@ -420,7 +420,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
case 0x1075:
case 0x1078:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
@@ -448,7 +448,7 @@ void func_80AE0704(EnTsn* this, PlayState* play) {
break;
case 0x107B:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
Animation_MorphToLoop(&this->unk_1D8->skelAnime, &object_tsn_Anim_0092FC, -10.0f);
break;
@@ -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_Viewer/z_en_viewer.c b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
index 34551dac9..551d7d774 100644
--- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
+++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c
@@ -47,18 +47,18 @@ void EnViewer_Init(Actor* thisx, PlayState* play) {
this->unk_154 = D_8089F3E0;
D_8089F3E0++;
switch (ENVIEWER_GET_3(&this->actor)) {
- case ENVIEWER_PARAMS_0:
+ case ENVIEWER_PARAM_0:
this->unk_148 = ENVIEWER_GET_8000(&this->actor) * 40.0f;
this->unk_150 = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
EnViewer_SetupAction(this, func_8089F17C);
break;
- case ENVIEWER_PARAMS_1:
+ case ENVIEWER_PARAM_1:
this->unk_148 = (u16)ENVIEWER_GET_FE00(&this->actor) * 40.0f;
this->unk_150 = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
this->unk_14C = (u16)(this->actor.world.rot.y) * 40.0f;
EnViewer_SetupAction(this, func_8089F218);
break;
- case ENVIEWER_PARAMS_2:
+ case ENVIEWER_PARAM_2:
this->unk_148 = (u16)ENVIEWER_GET_FE00(&this->actor) * 40.0f;
this->unk_14C = (u8)ENVIEWER_GET_1FC(&this->actor) * 40.0f;
EnViewer_SetupAction(this, func_8089F2C4);
@@ -78,8 +78,8 @@ void func_8089F014(EnViewer* this, PlayState* play, f32 arg2) {
}
play->envCtx.lightSettingOverride = 0;
play->envCtx.unk_E0 = 2;
- play->envCtx.unk_C1 = this->actor.world.rot.x;
- play->envCtx.unk_C2 = this->actor.world.rot.z;
+ play->envCtx.lightSetting = this->actor.world.rot.x;
+ play->envCtx.prevLightSetting = this->actor.world.rot.z;
play->envCtx.lightBlend = arg2;
}
@@ -94,7 +94,7 @@ void func_8089F0A0(EnViewer* this, PlayState* play) {
func_800FAAB4(
play, SurfaceType_GetLightSettingIndex(&play->colCtx, player->actor.floorPoly, player->actor.floorBgId));
play->envCtx.lightBlend = 1.0f;
- play->envCtx.unk_C2 = play->envCtx.unk_C1;
+ play->envCtx.prevLightSetting = play->envCtx.lightSetting;
}
}
diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
index 1532e7c70..c4d2114bf 100644
--- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
+++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h
@@ -22,9 +22,9 @@ typedef struct EnViewer {
} EnViewer; // size = 0x158
typedef enum {
- /* 0x0 */ ENVIEWER_PARAMS_0,
- /* 0x1 */ ENVIEWER_PARAMS_1,
- /* 0x2 */ ENVIEWER_PARAMS_2
-} EnViewerParams;
+ /* 0x0 */ ENVIEWER_PARAM_0,
+ /* 0x1 */ ENVIEWER_PARAM_1,
+ /* 0x2 */ ENVIEWER_PARAM_2
+} EnViewerParam;
#endif // Z_EN_VIEWER_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..4d1466b95 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
@@ -25,9 +27,9 @@
* the timer to 130 frames if the player strays too far from the Wallmaster's current position.
*/
typedef enum {
- /* 0x0 */ WALLMASTER_TYPE_TIMER_ONLY,
- /* 0x1 */ WALLMASTER_TYPE_PROXIMITY,
- /* 0x2 */ WALLMASTER_TYPE_FLAG
+ /* 0 */ WALLMASTER_TYPE_TIMER_ONLY,
+ /* 1 */ WALLMASTER_TYPE_PROXIMITY,
+ /* 2 */ WALLMASTER_TYPE_FLAG
} WallmasterType;
struct EnWallmas;
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..06893449e 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
@@ -149,8 +149,8 @@ void EnWarpTag_RespawnPlayer(EnWarptag* this, PlayState* play) {
u8 playerForm;
s16 playerParams;
- if (play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON] >= 0 &&
- CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]) {
+ if ((play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON] >= 0) &&
+ (CutsceneManager_GetCurrentCsId() != play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
if (!CutsceneManager_IsNext(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON])) {
CutsceneManager_Queue(play->playerCsIds[PLAYER_CS_ID_WARP_PAD_MOON]);
@@ -245,7 +245,6 @@ void EnWarpTag_GrottoReturn(EnWarptag* this, PlayState* play) {
play->transitionTrigger = TRANS_TRIGGER_START;
func_8019F128(NA_SE_OC_SECRET_HOLE_OUT);
func_801A4058(5);
- if (1) {}
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
}
@@ -262,7 +261,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..c8ec8f8c4 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
@@ -159,9 +159,9 @@ void EnWaterEffect_Update(Actor* thisx, PlayState* play2) {
if ((this->unk_DC4 % 32) == 0) {
if (Rand_ZeroOne() < 0.5f) {
Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, UPDBGCHECKINFO_FLAG_4);
- sp88.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ sp88.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp88.y = this->actor.world.pos.y;
- sp88.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp88.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
if ((this->actor.world.pos.y + this->actor.depthInWater) <= this->actor.floorHeight) {
phi_v1 = 0;
} else {
@@ -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);
@@ -367,9 +367,9 @@ void func_80A599E8(EnWaterEffect* this, Vec3f* arg1, u8 arg2) {
if (arg2 >= 2) {
if (arg2 == 2) {
- ptr->unk_10.x = randPlusMinusPoint5Scaled(10.0f);
+ ptr->unk_10.x = Rand_CenteredFloat(10.0f);
ptr->unk_10.y = Rand_ZeroFloat(3.0f) + 5.0f;
- ptr->unk_10.z = randPlusMinusPoint5Scaled(10.0f);
+ ptr->unk_10.z = Rand_CenteredFloat(10.0f);
}
ptr->unk_2C.z = 0.0017f;
ptr->unk_2C.x = 0.003f;
@@ -421,9 +421,9 @@ void func_80A59C04(Actor* thisx, PlayState* play2) {
if (this->unk_DC6 == 0) {
this->unk_DC6 = Rand_ZeroFloat(150.0f) + 100.0f;
Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 10.0f, 40.0f, UPDBGCHECKINFO_FLAG_4);
- sp74.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ sp74.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp74.y = this->actor.world.pos.y;
- sp74.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp74.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
func_80A599E8(this, &sp74, 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_Water_Effect/z_en_water_effect.h b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
index 433ebac62..f4b9d7284 100644
--- a/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
+++ b/src/overlays/actors/ovl_En_Water_Effect/z_en_water_effect.h
@@ -24,7 +24,7 @@ typedef enum {
/* 0x309 */ ENWATEREFFECT_TYPE_GYORG_RIPPLES = 0x309, // Ripples on the surface when Gyrog enters/leaves the water
/* 0x30A */ ENWATEREFFECT_TYPE_GYORG_PRIMARY_SPRAY, // Large "funnel" of water that forms when Gyorg enters/leaves the water
/* 0x30B */ ENWATEREFFECT_TYPE_GYORG_SECONDARY_SPRAY, // Secondary "funnel" in the middle of the larger "funnel"
- /* 0x30C */ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE, // Shockwave on the surface when Gyorg rams into the central platform
+ /* 0x30C */ ENWATEREFFECT_TYPE_GYORG_SHOCKWAVE // Shockwave on the surface when Gyorg rams into the central platform
} EnWaterEffectType;
typedef struct EnWaterEffect {
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
index fb00fdae3..84f621915 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.c
@@ -76,32 +76,35 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->unk158 = this->actor.world.rot.y;
EnWeatherTag_SetupAction(this, func_80966A08);
break;
+
case WEATHERTAG_TYPE_UNK1:
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) {
Actor_Kill(&this->actor);
}
EnWeatherTag_SetupAction(this, func_80966B08);
break;
+
case WEATHERTAG_TYPE_WINTERFOG:
EnWeatherTag_SetupAction(this, func_80966E0C);
break;
- case WEATHERTAG_TYPE_UNK3:
- //! FAKE: this can move to different locations and still match
- if (1) {}
+ case WEATHERTAG_TYPE_UNK3:
EnWeatherTag_SetupAction(this, func_80966EF0);
break;
+
case WEATHERTAG_TYPE_UNK4:
EnWeatherTag_SetupAction(this, func_80966FEC);
break;
+
case WEATHERTAG_TYPE_UNK5:
func_800BC154(play, &play->actorCtx, &this->actor, 7);
play->skyboxId = SKYBOX_3;
- play->envCtx.unk_1F = 5;
- play->envCtx.unk_20 = 5;
+ play->envCtx.lightConfig = 5;
+ play->envCtx.changeLightNextConfig = 5;
D_801F4E74 = 1.0f;
EnWeatherTag_SetupAction(this, func_80966BF4);
break;
+
case WEATHERTAG_TYPE_WATERMURK:
pathID = WEATHER_TAG_PATHID(&this->actor);
path = &play->setupPathList[pathID];
@@ -109,32 +112,38 @@ void EnWeatherTag_Init(Actor* thisx, PlayState* play) {
this->pathCount = path->count;
EnWeatherTag_SetupAction(this, func_809672DC);
break;
+
case WEATHERTAG_TYPE_LOCALDAY2RAIN:
EnWeatherTag_SetupAction(this, func_809674C8);
+ break;
+
+ default:
+ break;
}
}
// matches but unused params is suspicious
// called WeatherTag_CheckEnableWeatherEffect in OOT, that's where "weatherMode" came from
-u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 new1F, u8 new20, u16 new24,
- u8 weatherMode) {
+u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 lightConfig,
+ u8 changeLightNextConfig, u16 changeDuration, u8 weatherMode) {
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
if (WEATHER_TAG_RANGE100(&this->actor) > Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (!(play->envCtx.lightMode == 0) ||
+ ((play->envCtx.lightConfig != 1) && !play->envCtx.changeLightEnabled)) {
D_801BDBB8 = 0;
if (gWeatherMode != weatherMode) {
gWeatherMode = weatherMode;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = new1F;
- play->envCtx.unk_20 = new20;
- D_801BDBB4 = new20;
- play->envCtx.unk_24 = new24;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = lightConfig;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ D_801BDBB4 = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
returnVal = 1;
}
@@ -145,23 +154,25 @@ u8 func_80966608(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4,
// again with the unused parameters
// called WeatherTag_CheckRestoreWeather in OOT
-u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 new1F, u8 new20, u16 new24) {
+u8 func_80966758(EnWeatherTag* this, PlayState* play, UNK_TYPE a3, UNK_TYPE a4, u8 lightConfig,
+ u8 changeLightNextConfig, u16 changeDuration) {
Player* player = GET_PLAYER(play);
u8 returnVal = 0;
if (WEATHER_TAG_RANGE100(&this->actor) < Actor_WorldDistXZToActor(&player->actor, &this->actor)) {
- if (play->envCtx.unk_1F == play->envCtx.unk_20) {
+ if (play->envCtx.lightConfig == play->envCtx.changeLightNextConfig) {
D_801BDBB8 = 1;
- if (!(play->envCtx.unk_1E == 0) || ((play->envCtx.unk_1F != 1) && (play->envCtx.unk_21 == 0))) {
+ if (!(play->envCtx.lightMode == 0) ||
+ ((play->envCtx.lightConfig != 1) && !play->envCtx.changeLightEnabled)) {
D_801BDBB8 = 0;
gWeatherMode = 0;
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_1F = new1F;
- play->envCtx.unk_20 = new20;
- D_801BDBB4 = new20;
- play->envCtx.unk_24 = new24;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.lightConfig = lightConfig;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ D_801BDBB4 = changeLightNextConfig;
+ play->envCtx.changeDuration = changeDuration;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
returnVal = 1;
}
}
@@ -232,7 +243,7 @@ void EnWeatherTag_Die(EnWeatherTag* this, PlayState* play) {
// poisoned swamp: placed behind the water fall from ikana
// this tag stops spawning after STT cleared?
void func_80966B08(EnWeatherTag* this, PlayState* play) {
- if (func_80966608(this, play, 0, 0, play->envCtx.unk_1F, 5, 100, 2) || (gWeatherMode == 2)) {
+ if (func_80966608(this, play, 0, 0, play->envCtx.lightConfig, 5, 100, 2) || (gWeatherMode == 2)) {
play->skyboxId = SKYBOX_3;
EnWeatherTag_SetupAction(this, func_80966D20);
} else if (D_801F4E74 <= 0.01f) {
@@ -245,7 +256,7 @@ void func_80966B08(EnWeatherTag* this, PlayState* play) {
// WEATHERTAG_TYPE_UNK5: only one in ikana canyon, corner of cliff right outside of stone tower entrance
// because it uses cutsecnes.. is this the clear ikana cutcsene?
void func_80966BF4(EnWeatherTag* this, PlayState* play) {
- u8 newUnk20;
+ u8 changeLightNextConfig;
CsCmdActorCue* cue;
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_567)) {
@@ -255,23 +266,25 @@ void func_80966BF4(EnWeatherTag* this, PlayState* play) {
case 0:
case 1:
default:
- newUnk20 = 0;
+ changeLightNextConfig = 0;
break;
+
case 2:
- newUnk20 = 3;
+ changeLightNextConfig = 3;
break;
+
case 3:
- newUnk20 = 4;
+ changeLightNextConfig = 4;
break;
}
Math_SmoothStepToF(&D_801F4E74, 0.0f, 0.2f, 0.02f, 0.001f);
- if (play->envCtx.unk_20 != newUnk20) {
- play->envCtx.unk_21 = 1;
- play->envCtx.unk_20 = newUnk20;
- play->envCtx.unk_24 = 100;
- play->envCtx.unk_22 = play->envCtx.unk_24;
+ if (play->envCtx.changeLightNextConfig != changeLightNextConfig) {
+ play->envCtx.changeLightEnabled = true;
+ play->envCtx.changeLightNextConfig = changeLightNextConfig;
+ play->envCtx.changeDuration = 100;
+ play->envCtx.changeLightTimer = play->envCtx.changeDuration;
}
}
}
@@ -287,9 +300,11 @@ void func_80966D20(EnWeatherTag* this, PlayState* play) {
default:
newUnk20 = 0;
break;
+
case 2:
newUnk20 = 3;
break;
+
case 3:
newUnk20 = 4;
break;
diff --git a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
index b1e7f8f86..5313aacfd 100644
--- a/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
+++ b/src/overlays/actors/ovl_En_Weather_Tag/z_en_weather_tag.h
@@ -32,7 +32,7 @@ typedef enum {
/* 4 */ WEATHERTAG_TYPE_UNK4,
/* 5 */ WEATHERTAG_TYPE_UNK5,
/* 6 */ WEATHERTAG_TYPE_WATERMURK,
- /* 7 */ WEATHERTAG_TYPE_LOCALDAY2RAIN,
+ /* 7 */ WEATHERTAG_TYPE_LOCALDAY2RAIN
} WeatherTagType;
#endif // Z_EN_WEATHER_TAG_H
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..26301730f 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -489,9 +489,9 @@ void func_80990C6C(EnWf* this, PlayState* play, s32 arg2) {
}
for (i = 0; i < arg2; i++) {
- sp88.x = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.x;
+ sp88.x = Rand_CenteredFloat(50.0f) + this->actor.world.pos.x;
sp88.y = Rand_ZeroFloat(5.0f) + this->actor.world.pos.y;
- sp88.z = randPlusMinusPoint5Scaled(50.0f) + this->actor.world.pos.z;
+ sp88.z = Rand_CenteredFloat(50.0f) + this->actor.world.pos.z;
func_800B0F18(play, &sp88, &gZeroVec3f, &D_809942DC, phi_s1, phi_s1, phi_s6, 5,
Rand_ZeroFloat(5.0f) + 14.0f);
}
@@ -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) {
@@ -1197,9 +1199,9 @@ void func_80992E0C(EnWf* this, PlayState* play) {
this->unk_2A0--;
for (i = (25 - this->unk_2A0) >> 1; i >= 0; i--) {
- sp60.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp60.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp60.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp60.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp60.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp60.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp60, &D_809942F0, &D_809942F0, 100, 0, 2);
}
@@ -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 125be5056..6ce68a0e3 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)
@@ -37,8 +37,8 @@ void EnWiz_SetupDead(EnWiz* this);
void EnWiz_Dead(EnWiz* this, PlayState* play);
// This number is almost-entirely arbirary, with the only requirement being
-// that cannot be a valid curPlatformIndex. Any negative number, or any number
-// larger than 10, would work just as well.
+// that it cannot be a valid curPlatformIndex. Any negative number, or any
+// number larger than 10, would work just as well.
#define INITIAL_PLATFORM_INDEX 777
typedef enum {
@@ -50,7 +50,7 @@ typedef enum {
/* 6 */ EN_WIZ_ACTION_BURST_INTO_FLAMES,
/* 7 */ EN_WIZ_ACTION_RUN_IN_CIRCLES,
/* 8 */ EN_WIZ_ACTION_ATTACK,
- /* 9 */ EN_WIZ_ACTION_DANCE,
+ /* 9 */ EN_WIZ_ACTION_DANCE
} EnWizAction;
typedef enum {
@@ -68,7 +68,7 @@ typedef enum {
/* 0 */ EN_WIZ_FIGHT_STATE_FIRST_PHASE,
/* 1 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE,
/* 2 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_COPY_WIZROBE,
- /* 3 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_RUN_AROUND,
+ /* 3 */ EN_WIZ_FIGHT_STATE_SECOND_PHASE_GHOSTS_RUN_AROUND
} EnWizFightState;
typedef enum {
@@ -77,7 +77,7 @@ typedef enum {
/* 2 */ EN_WIZ_ANIM_DANCE,
/* 3 */ EN_WIZ_ANIM_WIND_UP,
/* 4 */ EN_WIZ_ANIM_ATTACK,
- /* 5 */ EN_WIZ_ANIM_DAMAGE,
+ /* 5 */ EN_WIZ_ANIM_DAMAGE
} EnWizAnimation;
ActorInit En_Wiz_InitVars = {
@@ -239,12 +239,12 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef enum {
- /* 0x0 */ EN_WIZ_DMGEFF_IMMUNE, // Deals no damage
- /* 0x1 */ EN_WIZ_DMGEFF_UNK1, // Deals no damage. Was probably originally intended for destroying ghosts.
- /* 0x2 */ EN_WIZ_DMGEFF_FIRE, // Damages and sets Ice Wizrobes on fire
- /* 0x3 */ EN_WIZ_DMGEFF_FREEZE, // Damages and surrounds Fire Wizrobes with ice
- /* 0x4 */ EN_WIZ_DMGEFF_LIGHT_ORB, // Damages and surrounds the Wizrobe with light orbs
- /* 0xF */ EN_WIZ_DMGEFF_NONE = 0xF, // Deals regular damage and has no special effect
+ /* 0x0 */ EN_WIZ_DMGEFF_IMMUNE, // Deals no damage
+ /* 0x1 */ EN_WIZ_DMGEFF_UNK1, // Deals no damage. Was probably originally intended for destroying ghosts.
+ /* 0x2 */ EN_WIZ_DMGEFF_FIRE, // Damages and sets Ice Wizrobes on fire
+ /* 0x3 */ EN_WIZ_DMGEFF_FREEZE, // Damages and surrounds Fire Wizrobes with ice
+ /* 0x4 */ EN_WIZ_DMGEFF_LIGHT_ORB, // Damages and surrounds the Wizrobe with light orbs
+ /* 0xF */ EN_WIZ_DMGEFF_NONE = 0xF // Deals regular damage and has no special effect
} EnWizDamageEffect;
static DamageTable sFireWizrobeDamageTable = {
@@ -601,6 +601,9 @@ void EnWiz_SelectPlatform(EnWiz* this, PlayState* play) {
break;
case EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE:
+ //! @bug: Setting the Wizrobe's position to the first platform *without* updating
+ //! this->curPlatformIndex can cause a bug later in EnWiz_Damaged. One way to fix
+ //! this is to set this->curPlatformIndex to 0 here.
Math_Vec3f_Copy(&this->actor.world.pos, &this->platforms[0]->world.pos);
for (i = 0, ghostAlpha = 128; i < this->platformCount; i++, ghostAlpha -= 10) {
Math_Vec3f_Copy(&this->ghostPos[i], &this->actor.world.pos);
@@ -1120,6 +1123,17 @@ void EnWiz_Damaged(EnWiz* this, PlayState* play) {
this->ghostRot[i].y += this->rotationalVelocity;
}
+ //! @bug: When the Wizrobe is defeated, it is launched into the air by the code above, and the
+ //! last check in this conditional is intended to check that the Wizrobe is standing on its
+ //! platform before transitioning to a different state. However, when the fight is in the
+ //! EN_WIZ_FIGHT_STATE_SECOND_PHASE_CUTSCENE state, the Wizrobe will always appear on top of
+ //! the first platform, while its curPlatformIndex is allowed to randomly choose any other
+ //! platform in the room. If the Wizrobe is defeated in this state (which is possible with a
+ //! well-timed attack before the cutscene starts), and if the first platform is elevated above
+ //! other platforms in the room (as it is in the Secret Shrine), then it is possible for
+ //! this->platforms[this->curPlatformIndex]->world.pos.y to be under the floor compared to the
+ //! Wizrobe's current position, causing it to get stuck here and never actually die. This can
+ //! be fixed by addressing the bug in EnWiz_SelectPlatform.
if ((this->timer == 1) ||
((this->actor.velocity.y < 0.0f) &&
(this->actor.world.pos.y < (this->platforms[this->curPlatformIndex]->world.pos.y + 11.0f)))) {
@@ -1283,7 +1297,7 @@ void EnWiz_UpdateDamage(EnWiz* this, PlayState* play) {
scaleStep = Rand_S16Offset(20, 10);
Math_Vec3f_Copy(&pos, &this->ghostPos[i]);
pos.x += (f32)Rand_S16Offset(20, 20) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1);
- pos.y += 70.0f + randPlusMinusPoint5Scaled(30.0f);
+ pos.y += 70.0f + Rand_CenteredFloat(30.0f);
pos.z += (f32)Rand_S16Offset(20, 20) * ((Rand_ZeroOne() < 0.5f) ? -1 : 1);
func_800B0DE0(play, &pos, &velocity, &accel, &sDustPrimColor, &sDustEnvTimer,
Rand_S16Offset(350, 100), scaleStep);
@@ -1405,9 +1419,9 @@ void EnWiz_PostLimbDrawXlu(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* r
Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_MultVec3f(&staffFlamePos, &flamePos);
- flamePos.x += randPlusMinusPoint5Scaled(4.0f);
- flamePos.y += randPlusMinusPoint5Scaled(7.0f);
- flamePos.z += randPlusMinusPoint5Scaled(5.0f);
+ flamePos.x += Rand_CenteredFloat(4.0f);
+ flamePos.y += Rand_CenteredFloat(7.0f);
+ flamePos.z += Rand_CenteredFloat(5.0f);
func_800B3030(play, &flamePos, &gZeroVec3f, &gZeroVec3f, ((Rand_ZeroFloat(1.0f) * 50.0f) + 70.0f), 10, 1);
SoundSource_PlaySfxAtFixedWorldPos(play, &flamePos, 10, NA_SE_EN_EXTINCT);
}
@@ -1437,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);
@@ -1488,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);
@@ -1515,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/z_en_wiz.h b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
index 4d35a0f68..70f7a6c64 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
@@ -10,7 +10,7 @@
typedef enum {
/* 0 */ EN_WIZ_TYPE_FIRE,
/* 1 */ EN_WIZ_TYPE_ICE,
- /* 2 */ EN_WIZ_TYPE_FIRE_NO_BGM, // does not request the mini-boss BGM
+ /* 2 */ EN_WIZ_TYPE_FIRE_NO_BGM // does not request the mini-boss BGM
} EnWizType;
struct EnWiz;
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..ac6ae3152 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);
@@ -121,6 +121,7 @@ void EnWizBrock_Draw(Actor* thisx, PlayState* play) {
if (this->platformType != EN_WIZ_BROCK_PLATFORM_TYPE_INACTIVE) {
OPEN_DISPS(play->state.gfxCtx);
+
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(gWizrobePlatformCenterTexAnim));
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255);
diff --git a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
index 3df0362ed..651aac8ea 100644
--- a/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
+++ b/src/overlays/actors/ovl_En_Wiz_Brock/z_en_wiz_brock.h
@@ -7,7 +7,7 @@ typedef enum {
/* 0 */ EN_WIZ_BROCK_PLATFORM_TYPE_INACTIVE,
/* 1 */ EN_WIZ_BROCK_PLATFORM_TYPE_FIRE,
/* 2 */ EN_WIZ_BROCK_PLATFORM_TYPE_ICE,
- /* 3 */ EN_WIZ_BROCK_PLATFORM_TYPE_MAX,
+ /* 3 */ EN_WIZ_BROCK_PLATFORM_TYPE_MAX
} EnWizBrockPlatformType;
struct EnWizBrock;
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..e6fc7e776 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
@@ -32,7 +32,7 @@ typedef enum {
/* 0 */ EN_WIZ_FIRE_ACTION_MOVE_MAGIC_PROJECTILE,
/* 1 */ EN_WIZ_FIRE_ACTION_SMALL_FLAME,
/* 2 */ EN_WIZ_FIRE_ACTION_POOL,
- /* 3 */ EN_WIZ_FIRE_ACTION_KILL_MAGIC_PROJECTILE,
+ /* 3 */ EN_WIZ_FIRE_ACTION_KILL_MAGIC_PROJECTILE
} EnWizFireAction;
static s32 sPoolHitByIceArrow = false;
@@ -152,7 +152,7 @@ void EnWiz_SetupMoveMagicProjectile(EnWizFire* this, PlayState* play) {
Matrix_RotateXS(this->actor.world.rot.x, MTXMODE_APPLY);
if (this->type != EN_WIZ_FIRE_TYPE_MAGIC_PROJECTILE) {
- velocity.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
+ velocity.z = Rand_CenteredFloat(2.0f) + 8.0f;
} else {
velocity.z = 12.0f;
}
@@ -223,8 +223,8 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
this->increaseLowestUsedIndexTimer = 10;
Matrix_Push();
- Matrix_RotateYS((s16)randPlusMinusPoint5Scaled(0x100) + this->actor.world.rot.y, MTXMODE_NEW);
- velocity.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
+ Matrix_RotateYS((s16)(s32)Rand_CenteredFloat(0x100) + this->actor.world.rot.y, MTXMODE_NEW);
+ velocity.z = Rand_CenteredFloat(2.0f) + 8.0f;
Matrix_MultVec3f(&velocity, &this->actor.velocity);
Matrix_Pop();
@@ -257,7 +257,7 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WIZ_FIRE, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, arcingProjectileRotY, 0,
EN_WIZ_FIRE_TYPE_ARCING_MAGIC_PROJECTILE);
- arcingProjectileRotY += BINANG_ADD((s32)randPlusMinusPoint5Scaled(0x1000), 0x3333);
+ arcingProjectileRotY += BINANG_ADD((s32)Rand_CenteredFloat(0x1000), 0x10000 / 5);
}
Actor_PlaySfx(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
@@ -313,9 +313,9 @@ void EnWiz_MoveMagicProjectile(EnWizFire* this, PlayState* play) {
void EnWiz_SetupSmallFlame(EnWizFire* this, PlayState* play) {
this->targetScale = 0.02f;
this->timer = Rand_S16Offset(50, 50);
- this->scaleMod.x = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
- this->scaleMod.y = randPlusMinusPoint5Scaled(1.0f) * 0.005f;
- this->scaleMod.z = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
+ this->scaleMod.x = Rand_CenteredFloat(1.0f) * 0.007f;
+ this->scaleMod.y = Rand_CenteredFloat(1.0f) * 0.005f;
+ this->scaleMod.z = Rand_CenteredFloat(1.0f) * 0.007f;
this->actionFunc = EnWiz_SmallFlame;
}
@@ -379,13 +379,13 @@ void EnWiz_Pool(EnWizFire* this, PlayState* play) {
Vec3f accel = { 0.0f, 0.0f, 0.0f };
Vec3f pos;
- accel.x = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
+ accel.x = Rand_CenteredFloat(3.0f) / 10.0f;
accel.y = 0.23f;
- accel.z = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
+ accel.z = Rand_CenteredFloat(3.0f) / 10.0f;
Math_Vec3f_Copy(&pos, &this->actor.world.pos);
- pos.x += randPlusMinusPoint5Scaled(150.0f);
- pos.z += randPlusMinusPoint5Scaled(150.0f);
+ pos.x += Rand_CenteredFloat(150.0f);
+ pos.z += Rand_CenteredFloat(150.0f);
Math_ApproachF(&this->poolScale, 0.022f, 0.3f, 0.01f);
this->collider.dim.radius = this->poolScale * 4300.0f;
@@ -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..cf4331ffa 100644
--- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -264,8 +264,8 @@ void EnWood02_Init(Actor* thisx, PlayState* play) {
case WOOD_LEAF_YELLOW:
this->unk_14A[0] = 75;
actorScale = 0.02f;
- this->actor.velocity.x = randPlusMinusPoint5Scaled(6.0f);
- this->actor.velocity.z = randPlusMinusPoint5Scaled(6.0f);
+ this->actor.velocity.x = Rand_CenteredFloat(6.0f);
+ this->actor.velocity.z = Rand_CenteredFloat(6.0f);
this->actor.velocity.y = (Rand_ZeroOne() * 1.25f) + -3.1f;
break;
}
@@ -409,7 +409,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) {
for (i = 3; i >= 0; i--) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_WOOD02, dropsSpawnPt.x, dropsSpawnPt.y, dropsSpawnPt.z,
- 0, randPlusMinusPoint5Scaled(0xFFFF), 0, leavesParams);
+ 0, Rand_CenteredFloat(0xFFFF), 0, leavesParams);
}
}
@@ -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..9238a166b 100644
--- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c
+++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c
@@ -136,9 +136,9 @@ void EnYb_Destroy(Actor* thisx, PlayState* play) {
void func_80BFA2FC(PlayState* play) {
if (INV_CONTENT(ITEM_MASK_KAMARO) == ITEM_MASK_KAMARO) {
- func_80151BB4(play, 0x34);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK);
}
- func_80151BB4(play, 0xF);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_KAMARO);
}
/**
@@ -170,7 +170,7 @@ void EnYb_ActorShadowFunc(Actor* thisx, Lights* mapper, PlayState* play) {
}
void EnYb_ChangeAnim(PlayState* play, EnYb* this, s16 animIndex, u8 animMode, f32 morphFrames) {
- if (animIndex >= 0 && animIndex < 3) {
+ if ((animIndex >= 0) && (animIndex < 3)) {
if ((animIndex != this->animIndex) || (animMode != ANIMMODE_LOOP)) {
if (animIndex > 0) {
if (animMode == ANIMMODE_LOOP) {
@@ -198,7 +198,7 @@ void EnYb_ChangeAnim(PlayState* play, EnYb* this, s16 animIndex, u8 animMode, f3
}
s32 EnYb_CanTalk(EnYb* this, PlayState* play) {
- if (this->actor.xzDistToPlayer < 100.0f && Player_IsFacingActor(&this->actor, 0x3000, play) &&
+ if ((this->actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->actor, 0x3000, play) &&
Actor_IsFacingPlayer(&this->actor, 0x3000)) {
return true;
} else {
@@ -242,9 +242,9 @@ void EnYb_Disappear(EnYb* this, PlayState* play) {
EnYb_UpdateAnimation(this, play);
for (i = 3; i >= 0; i--) {
- sp60.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
- sp60.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
- sp60.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
+ sp60.x = Rand_CenteredFloat(60.0f) + this->actor.world.pos.x;
+ sp60.z = Rand_CenteredFloat(60.0f) + this->actor.world.pos.z;
+ sp60.y = Rand_CenteredFloat(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp60, &D_80BFB2E8, &D_80BFB2E8, 100, 0, 2);
}
@@ -296,6 +296,7 @@ void EnYb_Talk(EnYb* this, PlayState* play) {
this->actionFunc = EnYb_Disappear;
SET_WEEKEVENTREG(WEEKEVENTREG_82_04);
break;
+
case 0x147C: // Spread my dance across the world
if (Player_GetMask(play) == PLAYER_MASK_KAMARO) {
Message_CloseTextbox(play);
@@ -311,6 +312,7 @@ void EnYb_Talk(EnYb* this, PlayState* play) {
EnYb_ReceiveMask(this, play);
}
break;
+
default:
Message_CloseTextbox(play);
this->actionFunc = EnYb_Idle;
@@ -353,9 +355,9 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
Player* player = GET_PLAYER(play);
EnYb_UpdateAnimation(this, play);
- if (this->actor.xzDistToPlayer < 180.0f && fabsf(this->actor.playerHeightRel) < 50.0f &&
- play->msgCtx.ocarinaMode == 3 && play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING &&
- gSaveContext.save.playerForm == PLAYER_FORM_HUMAN) {
+ if ((this->actor.xzDistToPlayer < 180.0f) && (fabsf(this->actor.playerHeightRel) < 50.0f) &&
+ (play->msgCtx.ocarinaMode == 3) && (play->msgCtx.lastPlayedSong == OCARINA_SONG_HEALING) &&
+ (gSaveContext.save.playerForm == PLAYER_FORM_HUMAN)) {
this->actionFunc = EnYb_TeachingDance;
this->teachingCutsceneTimer = 200;
EnYb_ChangeCutscene(this, 0);
@@ -377,8 +379,8 @@ void EnYb_Idle(EnYb* this, PlayState* play) {
if (!(player->stateFlags2 & PLAYER_STATE2_8000000)) {
this->playerOcarinaOut &= ~1;
}
- } else if ((player->stateFlags2 & PLAYER_STATE2_8000000) && this->actor.xzDistToPlayer < 180.0f &&
- fabsf(this->actor.playerHeightRel) < 50.0f) {
+ } else if ((player->stateFlags2 & PLAYER_STATE2_8000000) && (this->actor.xzDistToPlayer < 180.0f) &&
+ (fabsf(this->actor.playerHeightRel) < 50.0f)) {
this->playerOcarinaOut |= 1;
Actor_PlaySfx(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
}
@@ -458,22 +460,20 @@ 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);
- if (1) {}
-
POLY_XLU_DISP =
SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
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..ba71bbd7f 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.c
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.c
@@ -206,11 +206,11 @@ void EnZo_LookAtPlayer(EnZo* this, PlayState* play) {
}
void EnZo_Walk(EnZo* this, PlayState* play) {
- if (ENZO_GET_PATH(&this->actor) != 0x3F) {
+ if (ENZO_GET_PATH_INDEX(&this->actor) != ENZO_PATH_INDEX_NONE) {
EnZo_ChangeAnim(&this->skelAnime, 6);
}
- if (ENZO_GET_PATH(&this->actor) != 0x3F) {
+ if (ENZO_GET_PATH_INDEX(&this->actor) != ENZO_PATH_INDEX_NONE) {
this->actionFunc = EnZo_FollowPath;
} else {
this->actionFunc = EnZo_DoNothing;
@@ -264,7 +264,7 @@ void EnZo_Init(Actor* thisx, PlayState* play) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
- this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH(&this->actor), 0x3F);
+ this->path = SubS_GetPathByIndex(play, ENZO_GET_PATH_INDEX(&this->actor), ENZO_PATH_INDEX_NONE);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = EnZo_Walk;
@@ -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_Zo/z_en_zo.h b/src/overlays/actors/ovl_En_Zo/z_en_zo.h
index bfd0c79dd..9d32f63e5 100644
--- a/src/overlays/actors/ovl_En_Zo/z_en_zo.h
+++ b/src/overlays/actors/ovl_En_Zo/z_en_zo.h
@@ -8,7 +8,9 @@ struct EnZo;
typedef void (*EnZoActionFunc)(struct EnZo*, PlayState*);
-#define ENZO_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
+#define ENZO_GET_PATH_INDEX(thisx) (((thisx)->params & 0x7E00) >> 9)
+
+#define ENZO_PATH_INDEX_NONE 0x3F
typedef struct EnZo {
/* 0x000 */ Actor actor;
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_Zob/z_en_zob.h b/src/overlays/actors/ovl_En_Zob/z_en_zob.h
index e0bd7bf79..6e6c8e7a8 100644
--- a/src/overlays/actors/ovl_En_Zob/z_en_zob.h
+++ b/src/overlays/actors/ovl_En_Zob/z_en_zob.h
@@ -9,10 +9,10 @@ typedef void (*EnZobActionFunc)(struct EnZob*, PlayState*);
#define ENZOB_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 1 */ ENZOB_F_1 = 1,
- /* 2 */ ENZOB_F_2,
-};
+ /* 2 */ ENZOB_F_2
+} EnZobParam;
typedef struct EnZob {
/* 0x000 */ Actor actor;
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..d032b6579 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.c
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.c
@@ -30,7 +30,7 @@ typedef enum {
/* 2 */ ENZOD_ANIM_ARMS_FOLDED,
/* 3 */ ENZOD_ANIM_PLAYING_LENTO,
/* 4 */ ENZOD_ANIM_PLAYING_ANDANTINO,
- /* 5 */ ENZOD_ANIM_MAX,
+ /* 5 */ ENZOD_ANIM_MAX
} EnZodAnimation;
typedef enum {
@@ -42,7 +42,7 @@ typedef enum {
/* 6 */ ENZOD_INSTRUMENT_DRUM_3,
/* 7 */ ENZOD_INSTRUMENT_DRUM_4,
/* 8 */ ENZOD_INSTRUMENT_DRUM_5,
- /* 9 */ ENZOD_INSTRUMENT_BASS_DRUM,
+ /* 9 */ ENZOD_INSTRUMENT_BASS_DRUM
} EnZodInstrument;
const ActorInit En_Zod_InitVars = {
@@ -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_Zod/z_en_zod.h b/src/overlays/actors/ovl_En_Zod/z_en_zod.h
index 9e6f3f4da..12278bb97 100644
--- a/src/overlays/actors/ovl_En_Zod/z_en_zod.h
+++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.h
@@ -33,9 +33,9 @@ typedef struct EnZod {
} EnZod; // size = 0x2A0
typedef enum {
- /* 1 */ ENZOD_TYPE_1 = 1,
- /* 2 */ ENZOD_TYPE_2,
- /* 0xF */ ENZOD_TYPE_0xF = 0xF,
-} EnZodTypes;
+ /* 0x1 */ ENZOD_TYPE_1 = 1,
+ /* 0x2 */ ENZOD_TYPE_2,
+ /* 0xF */ ENZOD_TYPE_0xF = 0xF
+} EnZodType;
#endif // Z_EN_ZOD_H
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..96de52b88 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -394,9 +394,9 @@ void func_80B93D2C(EnZog* this, PlayState* play) {
void func_80B93DE8(Vec3f* arg0, PlayState* play, s32 arg2) {
Vec3f sp2C;
- sp2C.x = randPlusMinusPoint5Scaled(30.0f) + arg0->x;
+ sp2C.x = Rand_CenteredFloat(30.0f) + arg0->x;
sp2C.y = arg0->y + 3.0f;
- sp2C.z = randPlusMinusPoint5Scaled(30.0f) + arg0->z;
+ sp2C.z = Rand_CenteredFloat(30.0f) + arg0->z;
EffectSsKirakira_SpawnDispersed(play, &sp2C, &D_80B9598C, &D_80B95998, &D_80B959A4, &D_80B959A8, 1000, arg2);
}
@@ -865,9 +865,9 @@ void func_80B94E34(EnZog* this, PlayState* play) {
Vec3f sp38;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80B959AC, &sp38);
- sp38.x += randPlusMinusPoint5Scaled(30.0f);
+ sp38.x += Rand_CenteredFloat(30.0f);
sp38.y += 20.0f;
- sp38.z += randPlusMinusPoint5Scaled(30.0f);
+ sp38.z += Rand_CenteredFloat(30.0f);
if (WaterBox_GetSurface1(play, &play->colCtx, sp38.x, sp38.z, &sp38.y, &sp44) &&
(this->actor.world.pos.y < sp38.y)) {
EffectSsGSplash_Spawn(play, &sp38, NULL, NULL, 1,
@@ -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_Zoraegg/z_en_zoraegg.h b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
index 18a421272..f8895af3f 100644
--- a/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
+++ b/src/overlays/actors/ovl_En_Zoraegg/z_en_zoraegg.h
@@ -10,7 +10,7 @@ typedef void (*EnZoraeggActionFunc)(struct EnZoraegg*, PlayState*);
#define ENZORAEGG_GET_1F(thisx) ((thisx)->params & 0x1F)
#define ENZORAEGG_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
-enum {
+typedef enum {
/* 0x00 */ ENZORAEGG_1F_00,
/* 0x01 */ ENZORAEGG_1F_01,
/* 0x02 */ ENZORAEGG_1F_02,
@@ -36,8 +36,8 @@ enum {
/* 0x16 */ ENZORAEGG_1F_16,
/* 0x17 */ ENZORAEGG_1F_17,
/* 0x18 */ ENZORAEGG_1F_18,
- /* 0x19 */ ENZORAEGG_1F_19,
-};
+ /* 0x19 */ ENZORAEGG_1F_19
+} EnZoraeggParam;
typedef struct EnZoraegg {
/* 0x000 */ Actor actor;
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..c3192cec1 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.c
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.c
@@ -417,7 +417,7 @@ void func_80BBB8AC(EnZos* this, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.currentTextId) {
case 0x1237:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
case 0x1238:
case 0x123A:
@@ -436,7 +436,7 @@ void func_80BBB8AC(EnZos* this, PlayState* play) {
case 0x1232:
case 0x1241:
- player->exchangeItemId = 0;
+ player->exchangeItemId = PLAYER_IA_NONE;
case 0x1239:
case 0x1246:
@@ -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_Zos/z_en_zos.h b/src/overlays/actors/ovl_En_Zos/z_en_zos.h
index 669430a0c..f761a9bc5 100644
--- a/src/overlays/actors/ovl_En_Zos/z_en_zos.h
+++ b/src/overlays/actors/ovl_En_Zos/z_en_zos.h
@@ -10,10 +10,10 @@ typedef void (*EnZosActionFunc)(struct EnZos*, PlayState*);
#define ENZOS_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 1 */ ENZOS_F_1 = 1,
- /* 2 */ ENZOS_F_2,
-};
+ /* 2 */ ENZOS_F_2
+} EnZosParam;
typedef struct EnZos {
/* 0x000 */ Actor actor;
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..1493759a5 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.c
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.c
@@ -111,8 +111,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
for (i = 0; i < ARRAY_COUNT(this->unk_2D8); i++) {
this->unk_2D8[i] = NULL;
}
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
this->unk_2D4 = 0;
func_80B965D0(this, play);
} else {
@@ -124,8 +124,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 3:
case 4:
this->actionFunc = func_80B97B5C;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -134,8 +134,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 5:
this->unk_2F2 |= 4;
this->actionFunc = func_80B97FD0;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -167,8 +167,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 10:
this->actionFunc = func_80B992C0;
func_80B96BEC(this, 1, ANIMMODE_LOOP);
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -211,8 +211,8 @@ void EnZot_Init(Actor* thisx, PlayState* play2) {
case 22:
this->actionFunc = func_80B980FC;
- if (ENZOT_GET_FC00(&this->actor) != 0x3F) {
- this->path = &play->setupPathList[ENZOT_GET_FC00(&this->actor)];
+ if (ENZOT_GET_PATH_INDEX(&this->actor) != ENZOT_PATH_INDEX_NONE) {
+ this->path = &play->setupPathList[ENZOT_GET_PATH_INDEX(&this->actor)];
} else {
this->path = NULL;
}
@@ -757,8 +757,6 @@ void func_80B97E0C(EnZot* this, PlayState* play) {
}
void func_80B97E4C(EnZot* this, PlayState* play) {
- if (1) {}
-
if (this->unk_2F2 & 0x40) {
func_80B96BEC(this, 0, ANIMMODE_LOOP);
}
@@ -768,33 +766,38 @@ void func_80B97E4C(EnZot* this, PlayState* play) {
this->actor.world.rot.y = this->actor.shape.rot.y;
}
- if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) {
- switch (play->msgCtx.currentTextId) {
- case 0x128C:
- this->unk_2F2 &= ~4;
- func_80B96BEC(this, 6, ANIMMODE_ONCE);
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ if ((Message_GetState(&play->msgCtx) != TEXT_STATE_5) || !Message_ShouldAdvance(play)) {
+ return;
+ }
- case 0x128D:
- case 0x128E:
- case 0x128F:
- Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
- break;
+ switch (play->msgCtx.currentTextId) {
+ case 0x128C:
+ this->unk_2F2 &= ~4;
+ func_80B96BEC(this, 6, ANIMMODE_ONCE);
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x1290:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97D6C;
- this->unk_2F2 |= 4;
- func_80B96BEC(this, 3, ANIMMODE_LOOP);
- SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
- break;
+ case 0x128D:
+ case 0x128E:
+ case 0x128F:
+ Message_ContinueTextbox(play, play->msgCtx.currentTextId + 1);
+ break;
- case 0x128B:
- Message_CloseTextbox(play);
- this->actionFunc = func_80B97FD0;
- break;
- }
+ case 0x1290:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97D6C;
+ this->unk_2F2 |= 4;
+ func_80B96BEC(this, 3, ANIMMODE_LOOP);
+ SET_WEEKEVENTREG(WEEKEVENTREG_38_08);
+ break;
+
+ case 0x128B:
+ Message_CloseTextbox(play);
+ this->actionFunc = func_80B97FD0;
+ break;
+
+ default:
+ break;
}
}
@@ -1398,7 +1401,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_Zot/z_en_zot.h b/src/overlays/actors/ovl_En_Zot/z_en_zot.h
index 1bab43ae3..e2c43baa3 100644
--- a/src/overlays/actors/ovl_En_Zot/z_en_zot.h
+++ b/src/overlays/actors/ovl_En_Zot/z_en_zot.h
@@ -8,7 +8,9 @@ struct EnZot;
typedef void (*EnZotActionFunc)(struct EnZot*, PlayState*);
#define ENZOT_GET_1F(thisx) ((thisx)->params & 0x1F)
-#define ENZOT_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+#define ENZOT_GET_PATH_INDEX(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENZOT_PATH_INDEX_NONE 0x3F
typedef struct EnZot {
/* 0x000 */ Actor actor;
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..334b8fc05 100644
--- a/src/overlays/actors/ovl_En_Zow/z_en_zow.c
+++ b/src/overlays/actors/ovl_En_Zow/z_en_zow.c
@@ -182,26 +182,27 @@ 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) {
- if (!flag) {
- gDPPipeSync(POLY_XLU_DISP++);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
- gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
+ if (ptr->unk_00 != 1) {
+ continue;
}
+
+ if (!flag) {
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleMaterialDL);
+ gDPSetEnvColor(POLY_XLU_DISP++, 155, 155, 155, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_Scale(ptr->unk_04, 1.0f, ptr->unk_04, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraRippleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -213,26 +214,27 @@ 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) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
- if (1) {}
- flag = true;
- }
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
+ if (ptr->unk_00 != 3) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 150, 150, 150, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
+ flag = true;
+ }
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraBubbleModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -244,27 +246,28 @@ 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) {
- if (!flag) {
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
- gDPPipeSync(POLY_XLU_DISP++);
- gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
- if (1) {}
- flag = true;
- }
-
- gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
-
- Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
- Matrix_ReplaceRotation(&play->billboardMtxF);
- Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
+ if (ptr->unk_00 != 2) {
+ continue;
}
+
+ if (!flag) {
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, 0);
+ flag = true;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 180, 180, 180, ptr->unk_0F);
+
+ Matrix_Translate(ptr->unk_14.x, ptr->unk_14.y, ptr->unk_14.z, MTXMODE_NEW);
+ Matrix_ReplaceRotation(&play->billboardMtxF);
+ Matrix_Scale(ptr->unk_04, ptr->unk_04, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gZoraSplashModelDL);
}
CLOSE_DISPS(play->state.gfxCtx);
@@ -629,7 +632,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..90577dcfd 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.
+} ItemBHeartParam;
+
+#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_Ray/z_mir_ray.h b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
index cd48cfed1..f27254cec 100644
--- a/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
+++ b/src/overlays/actors/ovl_Mir_Ray/z_mir_ray.h
@@ -19,8 +19,8 @@ typedef enum {
/* 0x7 */ MIRRAY_SPIRIT_TOPROOM_COBRA1,
/* 0x8 */ MIRRAY_SPIRIT_TOPROOM_COBRA2,
/* 0x9 */ MIRRAY_GANONSCASTLE_SPIRITTRIAL_DOWNLIGHT,
- /* 0xA */ MIRRAY_MAX,
-} MirRayBeamLocations;
+ /* 0xA */ MIRRAY_MAX
+} MirRayBeamLocation;
typedef struct MirRay {
/* 0x000 */ Actor actor;
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..f41b8057c 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.c
@@ -95,20 +95,20 @@ s32 func_809A4F00(ObjArmos* this, s32 arg1) {
}
if (temp_v0 == OBJARMOS_ROT_7_4) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (temp_v0 == OBJARMOS_ROT_7_5) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
if (temp_v0 == OBJARMOS_ROT_7_6) {
if (this->unk_26E != 0) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (this->unk_270 != 0) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
return true;
@@ -141,22 +141,22 @@ s32 func_809A500C(ObjArmos* this, s32 arg1) {
if (temp_v0 == OBJARMOS_ROT_7_4) {
temp = D_809A5BB0[arg1] + this->unk_26E;
- return temp <= temp_v1 && -temp_v1 <= temp;
+ return (temp <= temp_v1) && (-temp_v1 <= temp);
}
if (temp_v0 == OBJARMOS_ROT_7_5) {
temp2 = D_809A5BB8[arg1] + this->unk_270;
- return temp2 <= temp_v1 && -temp_v1 <= temp2;
+ return (temp2 <= temp_v1) && (-temp_v1 <= temp2);
}
if (temp_v0 == OBJARMOS_ROT_7_6) {
if ((arg1 == 0) || (arg1 == 1)) {
temp = D_809A5BB0[arg1] + this->unk_26E;
- return temp <= temp_v1 && -temp_v1 <= temp;
+ return (temp <= temp_v1) && (-temp_v1 <= temp);
}
temp2 = D_809A5BB8[arg1] + this->unk_270;
- return temp2 <= temp_v1 && -temp_v1 <= temp2;
+ return (temp2 <= temp_v1) && (-temp_v1 <= temp2);
}
return false;
@@ -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_Armos/z_obj_armos.h b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
index 177cc8e66..4ac83cc9d 100644
--- a/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
+++ b/src/overlays/actors/ovl_Obj_Armos/z_obj_armos.h
@@ -12,15 +12,15 @@ typedef void (*ObjArmosActionFunc)(struct ObjArmos*, PlayState*);
#define OBJARMOS_GET_ROTZ_7(thisx) ((thisx)->home.rot.z & 7)
#define OBJARMOS_GET_ROTX_F(thisx) ((thisx)->home.rot.x & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJARMOS_ROT_7_0,
/* 1 */ OBJARMOS_ROT_7_1,
/* 2 */ OBJARMOS_ROT_7_2,
/* 3 */ OBJARMOS_ROT_7_3,
/* 4 */ OBJARMOS_ROT_7_4,
/* 5 */ OBJARMOS_ROT_7_5,
- /* 6 */ OBJARMOS_ROT_7_6,
-};
+ /* 6 */ OBJARMOS_ROT_7_6
+} ObjArmosParam;
typedef struct ObjArmos {
/* 0x000 */ DynaPolyActor dyna;
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_Bean/z_obj_bean.h b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
index 7699b3427..1a22de390 100644
--- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
+++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h
@@ -16,11 +16,11 @@ typedef void (*ObjBeanUnkFunc)(struct ObjBean*);
#define OBJBEAN_GET_3(thisx) ((thisx)->home.rot.z & 3)
-enum {
- /* 0x0 */ ENOBJBEAN_GET_C000_0,
- /* 0x1 */ ENOBJBEAN_GET_C000_1,
- /* 0x2 */ ENOBJBEAN_GET_C000_2,
-};
+typedef enum {
+ /* 0 */ ENOBJBEAN_GET_C000_0,
+ /* 1 */ ENOBJBEAN_GET_C000_1,
+ /* 2 */ ENOBJBEAN_GET_C000_2
+} ObjBeanParam;
typedef struct ObjBean {
/* 0x000 */ DynaPolyActor dyna;
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_Bigicicle/z_obj_bigicicle.c b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
index 85468c59c..61805fd49 100644
--- a/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
+++ b/src/overlays/actors/ovl_Obj_Bigicicle/z_obj_bigicicle.c
@@ -159,13 +159,13 @@ void func_80AE8DE4(ObjBigicicle* this, PlayState* play) {
f32 temp_f20 = this->actor.scale.x * (50.0f / 3.0f);
for (i = 0; i < 10; i++) {
- sp98.x = (randPlusMinusPoint5Scaled(4.0f) * temp_f20) + this->actor.world.pos.x;
+ sp98.x = (Rand_CenteredFloat(4.0f) * temp_f20) + this->actor.world.pos.x;
sp98.y = ((Rand_ZeroFloat(20.0f) - 35.0f) * temp_f20) + this->actor.world.pos.y;
- sp98.z = (randPlusMinusPoint5Scaled(4.0f) * temp_f20) + this->actor.world.pos.z;
+ sp98.z = (Rand_CenteredFloat(4.0f) * temp_f20) + this->actor.world.pos.z;
- sp8C.x = randPlusMinusPoint5Scaled(13.0f);
+ sp8C.x = Rand_CenteredFloat(13.0f);
sp8C.y = Rand_ZeroFloat(2.0f);
- sp8C.z = randPlusMinusPoint5Scaled(13.0f);
+ sp8C.z = Rand_CenteredFloat(13.0f);
EffectSsHahen_Spawn(play, &sp98, &sp8C, &D_80AE987C, HAHEN_XLU, (Rand_ZeroFloat(20.0f) + 30.0f) * temp_f20,
OBJECT_BIGICICLE, 40, object_bigicicle_DL_0009B0);
@@ -222,8 +222,8 @@ void func_80AE9180(ObjBigicicle* this, PlayState* play) {
if (this->unk_14A > 0) {
this->unk_14A--;
- this->actor.shape.rot.x = BINANG_ADD((s32)(randPlusMinusPoint5Scaled(1408.0f) * 0.02f * this->unk_14A), 0x4000);
- this->actor.shape.rot.z = randPlusMinusPoint5Scaled(1408.0f) * 0.02f * this->unk_14A;
+ this->actor.shape.rot.x = BINANG_ADD((s32)(Rand_CenteredFloat(0x580) * 0.02f * this->unk_14A), 0x4000);
+ this->actor.shape.rot.z = Rand_CenteredFloat(0x580) * 0.02f * this->unk_14A;
} else {
this->actor.shape.rot.x = 0x4000;
this->actor.shape.rot.z = 0;
@@ -271,9 +271,9 @@ void func_80AE939C(ObjBigicicle* this, PlayState* play) {
f32 temp_f20 = this->actor.scale.x * (50.0f / 3.0f);
for (i = 0; i < 20; i++) {
- sp8C.x = randPlusMinusPoint5Scaled(15.0f);
+ sp8C.x = Rand_CenteredFloat(15.0f);
sp8C.y = Rand_ZeroFloat(7.0f) + 3.0f;
- sp8C.z = randPlusMinusPoint5Scaled(15.0f);
+ sp8C.z = Rand_CenteredFloat(15.0f);
sp98.x = this->actor.world.pos.x + (sp8C.x * 5.0f * temp_f20);
sp98.y = this->actor.world.pos.y + (sp8C.y * 7.0f * temp_f20);
diff --git a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
index 43f137326..6c81e8de6 100644
--- a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
+++ b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.c
@@ -66,7 +66,7 @@ void ObjBoat_Init(Actor* thisx, PlayState* play) {
if (thisx->params < 0) {
this->dyna.actor.update = ObjBoat_UpdateCutscene;
} else {
- path = &play->setupPathList[OBJBOAT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJBOAT_GET_PATH_INDEX(thisx)];
this->maxPointIndex = path->count - 1;
this->points = Lib_SegmentedToVirtual(path->points);
this->direction = 1;
@@ -157,10 +157,10 @@ void ObjBoat_UpdateCutscene(Actor* thisx, PlayState* play2) {
if (this->cueId != cue->id) {
this->dyna.actor.shape.rot.x = cue->rot.x;
if (cue->id != 1) {
- Path* path = &play->setupPathList[OBJBOAT_GET_PATH(&this->dyna.actor)];
+ Path* path = &play->setupPathList[OBJBOAT_GET_PATH_INDEX(&this->dyna.actor)];
if (cue->id == 3) {
- path = &play->setupPathList[path->unk1];
+ path = &play->setupPathList[path->additionalPathIndex];
}
this->maxPointIndex = path->count;
diff --git a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
index bfc7c7c2b..00cb936d7 100644
--- a/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
+++ b/src/overlays/actors/ovl_Obj_Boat/z_obj_boat.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define OBJBOAT_GET_PATH(thisx) (((thisx)->params >> 7) & 0x1F)
+#define OBJBOAT_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJBOAT_GET_4000(thisx) ((thisx)->params & 0x4000)
struct ObjBoat;
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..c8eed614b 100644
--- a/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
+++ b/src/overlays/actors/ovl_Obj_Bombiwa/z_obj_bombiwa.c
@@ -77,11 +77,11 @@ static ColliderCylinderInit sCylinderInit2 = {
};
typedef struct {
- /* 0x00 */ ColliderCylinderInit* collider;
- /* 0x04 */ ActorShadowFunc unk_04;
- /* 0x08 */ ActorFunc unk_08;
- /* 0x0C */ s32 (*unk_0C)(Actor*);
-} ObjBombiwaStruct2;
+ /* 0x0 */ ColliderCylinderInit* collider;
+ /* 0x4 */ ActorShadowFunc unk_04;
+ /* 0x8 */ ActorFunc unk_08;
+ /* 0xC */ s32 (*unk_0C)(Actor*);
+} ObjBombiwaStruct2; // size = 0x10
static ObjBombiwaStruct2 D_8093A998[] = {
{ &sCylinderInit1, ActorShadow_DrawCircle, func_8093A418, func_809393B0 },
@@ -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..d1f19032f 100644
--- a/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
+++ b/src/overlays/actors/ovl_Obj_Chan/z_obj_chan.c
@@ -25,7 +25,7 @@ void ObjChan_Destroy(Actor* thisx, PlayState* play);
void ObjChan_Update(Actor* thisx, PlayState* play);
void ObjChan_Draw(Actor* thisx, PlayState* play);
-void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play);
+void ObjChan_ChandelierAction(ObjChan* this, PlayState* play);
void ObjChan_PotAction(ObjChan* this, PlayState* play);
ActorInit Obj_Chan_InitVars = {
@@ -64,7 +64,7 @@ static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-void ObjChan_InitChandelier(ObjChan* this2, PlayState* play);
+void ObjChan_InitChandelier(ObjChan* this, PlayState* play);
void ObjChan_InitPot(ObjChan* this, PlayState* play);
void ObjChan_CreateSmashEffects(ObjChan* this, PlayState* play);
void ObjChan_DrawPot(Actor* thisx, PlayState* play);
@@ -99,10 +99,14 @@ void ObjChan_Init(Actor* thisx, PlayState* play) {
this->actor.shape.rot.y = 0;
ObjChan_InitChandelier(this, play);
break;
+
case OBJCHAN_SUBTYPE_POT:
this->actor.draw = ObjChan_DrawPot;
ObjChan_InitPot(this, play);
break;
+
+ default:
+ break;
}
}
@@ -117,16 +121,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(Math_FAtan2F(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;
}
@@ -150,46 +154,44 @@ void ObjChan_CalculatePotPosition(Vec3f* childPosOut, Vec3s* childRotOut, Vec3f*
childRotOut->y += childAngle;
}
-//! TODO: Possibly takes actor and recasts
-void ObjChan_InitChandelier(ObjChan* this2, PlayState* play) {
- ObjChan* this = this2;
+void ObjChan_InitChandelier(ObjChan* this, PlayState* play) {
+ Actor* thisx = &this->actor;
s32 i;
- ObjChan* temp_v0;
+ ObjChan* pot;
Vec3f childPos;
Vec3s childRot;
CollisionPoly* sp94;
s32 sp90;
Vec3f sp84;
- Math_Vec3f_Copy(&this->unk1C0, &this->actor.world.pos);
+ Math_Vec3f_Copy(&this->unk1C0, &thisx->world.pos);
- Math_Vec3f_Copy(&sp84, &this->actor.world.pos);
+ Math_Vec3f_Copy(&sp84, &thisx->world.pos);
sp84.y += 1600.0f;
- if (BgCheck_EntityLineTest1(&play->colCtx, &this->actor.world.pos, &sp84, &this->unk1C0, &sp94, false, false, true,
- true, &sp90)) {
- this->unk1CC = this->actor.world.pos.y - this->unk1C0.y;
+ if (BgCheck_EntityLineTest1(&play->colCtx, &thisx->world.pos, &sp84, &this->unk1C0, &sp94, false, false, true, true,
+ &sp90)) {
+ this->unk1CC = thisx->world.pos.y - this->unk1C0.y;
} else {
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
return;
}
for (i = 0; i < 5; i++) {
- ObjChan_CalculatePotPosition(&childPos, &childRot, &this->actor.world.pos, &this->actor.shape.rot,
+ ObjChan_CalculatePotPosition(&childPos, &childRot, &thisx->world.pos, &thisx->shape.rot,
(s32)DEG_TO_BINANG_ALT3(i * 360.0f / 5.0f) + this->rotation);
- temp_v0 = (ObjChan*)Actor_SpawnAsChildAndCutscene(&play->actorCtx, play, ACTOR_OBJ_CHAN, childPos.x, childPos.y,
- childPos.z, childRot.x, childRot.y, childRot.z,
- (this->actor.params & 0xFFF) | 0x1000, this->actor.csId,
- this->actor.halfDaysBits, &this->actor);
- if (temp_v0 != NULL) {
- this->pots[i] = temp_v0;
- temp_v0->myPotIndex = i;
- temp_v0->actor.csId = this->actor.csId;
+ pot = (ObjChan*)Actor_SpawnAsChildAndCutscene(
+ &play->actorCtx, play, ACTOR_OBJ_CHAN, childPos.x, childPos.y, childPos.z, childRot.x, childRot.y,
+ childRot.z, (thisx->params & 0xFFF) | 0x1000, thisx->csId, thisx->halfDaysBits, thisx);
+ if (pot != NULL) {
+ this->pots[i] = pot;
+ pot->myPotIndex = i;
+ pot->actor.csId = thisx->csId;
} else {
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
}
}
- if (Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, thisx->params & 0x7F)) {
this->stateFlags |= OBJCHAN_STATE_FIRE_DELAY;
this->stateFlags |= OBJCHAN_STATE_ON_FIRE;
@@ -211,9 +213,9 @@ void ObjChan_InitChandelier(ObjChan* this2, PlayState* play) {
}
//! TODO: More descriptive name than Action?
-void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
- ObjChan* this = this2;
- ObjChan* temp;
+void ObjChan_ChandelierAction(ObjChan* this, PlayState* play) {
+ Actor* thisx = &this->actor;
+ ObjChan* pot;
s32 i;
Vec3f sp60;
Vec3s sp58;
@@ -230,7 +232,7 @@ void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
this->unk1D0 = 0.0f;
}
}
- this->actor.shape.rot.z = (Math_SinS(this->unk1D4) * this->unk1D0);
+ thisx->shape.rot.z = (Math_SinS(this->unk1D4) * this->unk1D0);
if ((this->stateFlags & OBJCHAN_STATE_START_CUTSCENE) &&
SubS_StartCutscene(&this->actor, this->csIdList[0], CS_ID_NONE, SUBS_CUTSCENE_WITH_PLAYER)) {
this->stateFlags |= OBJCHAN_STATE_CUTSCENE;
@@ -240,34 +242,34 @@ void ObjChan_ChandelierAction(ObjChan* this2, PlayState* play) {
this->stateFlags &= ~OBJCHAN_STATE_CUTSCENE;
CutsceneManager_Stop(this->csIdList[0]);
}
- Matrix_RotateYS(this->actor.shape.rot.y, MTXMODE_NEW);
- Matrix_RotateXS(this->actor.shape.rot.x, MTXMODE_APPLY);
- Matrix_RotateZS(this->actor.shape.rot.z, MTXMODE_APPLY);
+ Matrix_RotateYS(thisx->shape.rot.y, MTXMODE_NEW);
+ Matrix_RotateXS(thisx->shape.rot.x, MTXMODE_APPLY);
+ Matrix_RotateZS(thisx->shape.rot.z, MTXMODE_APPLY);
Matrix_RotateYS(this->rotation, MTXMODE_APPLY);
- Matrix_MultVecY(this->unk1CC, &this->actor.world.pos);
- Math_Vec3f_Sum(&this->actor.world.pos, &this->unk1C0, &this->actor.world.pos);
+ Matrix_MultVecY(this->unk1CC, &thisx->world.pos);
+ Math_Vec3f_Sum(&thisx->world.pos, &this->unk1C0, &thisx->world.pos);
Collider_UpdateCylinder(&this->actor, &this->collider);
for (i = 0; i < 5; i++) {
- temp = this->pots[i];
- if (temp != NULL) {
- ObjChan_CalculatePotPosition(&sp60, &sp58, &this->actor.world.pos, &this->actor.shape.rot,
+ pot = this->pots[i];
+ if (pot != NULL) {
+ ObjChan_CalculatePotPosition(&sp60, &sp58, &thisx->world.pos, &thisx->shape.rot,
(s32)DEG_TO_BINANG_ALT3(i * 360.0f / 5.0f) + this->rotation);
- Math_Vec3f_Copy(&temp->actor.world.pos, &sp60);
- Math_Vec3s_Copy(&temp->actor.shape.rot, &this->actor.shape.rot);
- temp->actor.shape.rot.y = this->rotation;
- Math_Vec3f_ToVec3s(&temp->collider.dim.pos, &temp->actor.world.pos);
+ Math_Vec3f_Copy(&pot->actor.world.pos, &sp60);
+ Math_Vec3s_Copy(&pot->actor.shape.rot, &thisx->shape.rot);
+ pot->actor.shape.rot.y = this->rotation;
+ Math_Vec3f_ToVec3s(&pot->collider.dim.pos, &pot->actor.world.pos);
}
}
if ((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x800)) {
- Flags_SetSwitch(play, this->actor.params & 0x7F);
+ Flags_SetSwitch(play, thisx->params & 0x7F);
}
- if (Flags_GetSwitch(play, this->actor.params & 0x7F)) {
+ if (Flags_GetSwitch(play, thisx->params & 0x7F)) {
if (!(this->stateFlags & OBJCHAN_STATE_FIRE_DELAY)) {
this->rotationSpeed = 0;
this->flameSize = 0.0f;
for (i = 0; i < 5; i++) {
- temp = this->pots[i];
- if (temp != NULL) {
+ pot = this->pots[i];
+ if (pot != NULL) {
this->pots[i]->stateFlags |= OBJCHAN_STATE_FIRE_DELAY;
this->pots[i]->fireDelayFrames = 20 + i * 5;
this->pots[i]->flameSize = 0.0f;
@@ -338,6 +340,7 @@ void ObjChan_CreateSmashEffects(ObjChan* this, PlayState* play) {
for (temp_s2 = 0, temp_s1 = 0; temp_s2 != 18; temp_s2++, temp_s1 += 0x4E20) {
f32 sin = Math_SinS(temp_s1);
f32 cos = Math_CosS(temp_s1);
+
spDC.x = sin * 8.0f;
spDC.y = Rand_ZeroOne() * 12.0f + 2.0f;
spDC.z = cos * 8.0f;
@@ -374,14 +377,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 +405,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) {
@@ -415,6 +421,7 @@ void ObjChan_DrawPot(Actor* thisx, PlayState* play) {
void ObjChan_DrawFire(ObjChan* this, PlayState* play) {
u32 sp4C;
Gfx* dl;
+
OPEN_DISPS(play->state.gfxCtx);
sp4C = play->gameplayFrames;
@@ -425,7 +432,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_Danpeilift/z_obj_danpeilift.c b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
index a33bf2a43..9d468d834 100644
--- a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
+++ b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.c
@@ -68,7 +68,7 @@ void ObjDanpeilift_Init(Actor* thisx, PlayState* play) {
if (this->speed < 0.01f) {
this->actionFunc = ObjDanpeilift_DoNothing;
} else {
- path = &play->setupPathList[OBJDANPEILIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJDANPEILIFT_GET_PATH_INDEX(thisx)];
this->curPoint = OBJDANPEILIFT_GET_STARTING_POINT(thisx);
this->endPoint = path->count - 1;
this->direction = 1;
diff --git a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
index 9c0d023c7..8ad582dd4 100644
--- a/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
+++ b/src/overlays/actors/ovl_Obj_Danpeilift/z_obj_danpeilift.h
@@ -10,7 +10,7 @@ typedef void (*ObjDanpeiliftActionFunc)(struct ObjDanpeilift*, PlayState*);
#define OBJDANPEILIFT_GET_TYPE(thisx) (((thisx)->params >> 0xF) & 1)
#define OBJDANPEILIFT_GET_STARTING_POINT(thisx) (((thisx)->params >> 7) & 0x1F)
-#define OBJDANPEILIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJDANPEILIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJDANPEILIFT_SHOULD_TELEPORT(thisx) (((thisx)->params >> 0xC) & 1)
#define OBJDANPEILIFT_GET_SPEED(thisx) ((thisx)->home.rot.z * 0.1f)
#define OBJDANPEILIFT_REACT_TO_PLAYER_ON_TOP(thisx) (((thisx)->params >> 0xE) & 1)
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..c1b46fce7 100644
--- a/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
+++ b/src/overlays/actors/ovl_Obj_Dhouse/z_obj_dhouse.c
@@ -167,8 +167,8 @@ void func_80B12A88(Actor* thisx) {
}
}
-void func_80B12B38(ObjDhouse* this2, PlayState* play) {
- ObjDhouse* this = this2;
+void func_80B12B38(ObjDhouse* this, PlayState* play) {
+ Actor* thisx = &this->dyna.actor;
s32 i;
f32 temp_f0;
CollisionPoly* sp90;
@@ -201,7 +201,7 @@ void func_80B12B38(ObjDhouse* this2, PlayState* play) {
phi_s3 = false;
if (ptr->unk_0C.y < 0.0f) {
func_80B12A50(ptr, ptr3, &sp80);
- temp_f0 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp7C, &this->dyna.actor, &sp80);
+ temp_f0 = BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp7C, thisx, &sp80);
if (((sp80.y - 35.0f) < temp_f0) && (temp_f0 > (BGCHECK_Y_MIN + 1.0f))) {
phi_s3 = true;
}
@@ -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..774632cb4 100644
--- a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
+++ b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c
@@ -31,7 +31,8 @@ ActorInit Obj_Dinner_InitVars = {
void ObjDinner_Init(Actor* thisx, PlayState* play) {
ObjDinner* this = THIS;
- if ((gSaveContext.save.isNight != true) || ((CURRENT_DAY == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01))) {
+ if ((gSaveContext.save.isNight != true) ||
+ ((CURRENT_DAY == 3) && CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM))) {
Actor_Kill(&this->actor);
}
Actor_SetScale(&this->actor, 0.1f);
@@ -45,7 +46,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..c7fbab2d6 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.c
@@ -284,6 +284,9 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
this->jointTable, this->morphTable, GOLD_DEKU_FLOWER_LIMB_MAX);
this->collider.dim.height = 20;
break;
+
+ default:
+ break;
}
type = DEKU_FLOWER_TYPE(&this->dyna.actor);
@@ -310,6 +313,9 @@ void ObjEtcetera_Setup(ObjEtcetera* this, PlayState* play) {
this->dyna.actor.focus.pos.y = this->dyna.actor.home.pos.y + 10.0f;
this->dyna.actor.targetMode = 3;
break;
+
+ default:
+ break;
}
}
}
@@ -321,7 +327,7 @@ void ObjEtcetera_Update(Actor* thisx, PlayState* play) {
if (floorBgId == BGCHECK_SCENE) {
floorPoly = this->dyna.actor.floorPoly;
- if (floorPoly != NULL && this->burrowFlag & 1) {
+ if ((floorPoly != NULL) && (this->burrowFlag & 1)) {
func_800FAAB4(play, SurfaceType_GetLightSettingIndex(&play->colCtx, floorPoly, floorBgId));
}
}
@@ -341,7 +347,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 +361,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_Etcetera/z_obj_etcetera.h b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
index 1805e151a..454e3f674 100644
--- a/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
+++ b/src/overlays/actors/ovl_Obj_Etcetera/z_obj_etcetera.h
@@ -12,7 +12,7 @@ typedef enum {
/* 1 */ DEKU_FLOWER_TYPE_PINK_WITH_INITIAL_BOUNCE,
/* 2 */ DEKU_FLOWER_TYPE_GOLD,
/* 3 */ DEKU_FLOWER_TYPE_GOLD_WITH_INITIAL_BOUNCE,
- /* 4 */ DEKU_FLOWER_TYPE_MAX,
+ /* 4 */ DEKU_FLOWER_TYPE_MAX
} DekuFlowerType;
struct ObjEtcetera;
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..e672780de 100644
--- a/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
+++ b/src/overlays/actors/ovl_Obj_Fireshield/z_obj_fireshield.c
@@ -55,8 +55,8 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- /* 0x00 */ f32 unk_00;
- /* 0x04 */ f32 unk_04;
+ /* 0x0 */ f32 unk_00;
+ /* 0x4 */ f32 unk_04;
} ObjFireshieldStruct; // size = 0x8
ObjFireshieldStruct D_80A4D84C[] = {
@@ -315,8 +315,8 @@ void ObjFireshield_Destroy(Actor* thisx, PlayState* play) {
}
void ObjFireshield_Update(Actor* thisx, PlayState* play) {
+ s32 pad;
ObjFireshield* this = THIS;
- ObjFireshield* this2 = THIS;
s32 sp44 = OBJFIRESHIELD_GET_ROTX(&this->actor);
s32 sp40 = OBJFIRESHIELD_GET_7F(&this->actor);
s32 temp_a0;
@@ -342,12 +342,12 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.base.atFlags &= ~AT_HIT;
} else if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
- func_800B8D98(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 1.0f);
+ func_800B8D98(play, thisx, 5.0f, thisx->yawTowardsPlayer, 1.0f);
}
func_80A4CE28(this, play);
- this->actor.world.pos.y = ((sp44 ? 144.0f : -144.0f) * (1.0f - this2->unk_198)) + this->actor.home.pos.y;
+ thisx->world.pos.y = ((sp44 ? 144.0f : -144.0f) * (1.0f - this->unk_198)) + thisx->home.pos.y;
this->unk_1A6 = this->unk_198 * 255.0f;
@@ -357,13 +357,12 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.dim.height = this->unk_198 * 80.0f;
if (sp44) {
- this->collider.dim.yShift =
- (s32)(this->actor.home.pos.y - this->actor.world.pos.y) - this->collider.dim.height;
+ this->collider.dim.yShift = (s32)(thisx->home.pos.y - thisx->world.pos.y) - this->collider.dim.height;
} else {
- this->collider.dim.yShift = this->actor.home.pos.y - this->actor.world.pos.y;
+ this->collider.dim.yShift = thisx->home.pos.y - thisx->world.pos.y;
}
- func_800B9010(&this->actor, NA_SE_EV_BURNING - SFX_FLAG);
+ func_800B9010(thisx, NA_SE_EV_BURNING - SFX_FLAG);
if (player->transformation == PLAYER_FORM_GORON) {
this->collider.info.toucher.damage = 0;
@@ -373,7 +372,7 @@ void ObjFireshield_Update(Actor* thisx, PlayState* play) {
this->collider.info.toucher.effect = 1;
}
- Collider_UpdateCylinder(&this->actor, &this->collider);
+ Collider_UpdateCylinder(thisx, &this->collider);
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
}
@@ -384,7 +383,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..aca30fe92 100644
--- a/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
+++ b/src/overlays/actors/ovl_Obj_Flowerpot/z_obj_flowerpot.c
@@ -22,7 +22,7 @@ void func_80A1C838(ObjFlowerpot* this, PlayState* play);
void func_80A1CBF8(ObjFlowerpot* this);
void func_80A1CC0C(ObjFlowerpot* this, PlayState* play);
void func_80A1CD10(ObjFlowerpot* this);
-void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play);
+void func_80A1CEF4(ObjFlowerpot* this, PlayState* play);
u32 D_80A1D830;
MtxF D_80A1D838[8];
@@ -589,8 +589,8 @@ void func_80A1CD10(ObjFlowerpot* this) {
}
}
-void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
- ObjFlowerpot* this = this2;
+void func_80A1CEF4(ObjFlowerpot* this, PlayState* play) {
+ Actor* thisx = &this->actor;
s32 sp28 = this->collider.elements[0].info.toucherFlags & TOUCH_HIT;
if (sp28) {
@@ -603,7 +603,7 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
func_80A1C62C(this, play);
- if ((this->actor.bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || sp28 ||
+ if ((thisx->bgCheckFlags & (BGCHECKFLAG_GROUND | BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_WALL)) || sp28 ||
(this->unk_1E8 <= 0)) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
@@ -613,11 +613,11 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
}
func_80A1BA44(this, play);
func_80A1B994(this, play);
- Actor_Kill(&this->actor);
+ Actor_Kill(thisx);
return;
}
- if (this->actor.bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
+ if (thisx->bgCheckFlags & BGCHECKFLAG_WATER_TOUCH) {
if (!(this->unk_1EA & 2)) {
func_80A1B914(this, play);
func_80A1C328(this, play);
@@ -626,22 +626,22 @@ void func_80A1CEF4(ObjFlowerpot* this2, PlayState* play) {
}
func_80A1BD80(this, play);
func_80A1B994(this, play);
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
- Actor_Kill(&this->actor);
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 40, NA_SE_EV_DIVE_INTO_WATER_L);
+ Actor_Kill(thisx);
return;
}
- Actor_MoveWithGravity(&this->actor);
+ Actor_MoveWithGravity(thisx);
if (!(this->unk_1EA & 2)) {
- D_80A1D3F8 += (s16)(this->actor.shape.rot.x * -0.06f);
+ D_80A1D3F8 += (s16)(thisx->shape.rot.x * -0.06f);
} else {
Math_StepToS(&D_80A1D3F8, 0, 80);
Math_StepToS(&D_80A1D3FC, 0, 20);
}
- this->actor.shape.rot.x += D_80A1D3F8;
- this->actor.shape.rot.y += D_80A1D3FC;
+ thisx->shape.rot.x += D_80A1D3F8;
+ thisx->shape.rot.y += D_80A1D3FC;
func_80A1C5E8(this, play);
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
@@ -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..a17f853df 100644
--- a/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
+++ b/src/overlays/actors/ovl_Obj_Grass/z_obj_grass.c
@@ -4,6 +4,7 @@
* Description: "Master" instance of grass for unit spawned by Obj_Grass_Unit
*/
+#include "prevent_bss_reordering.h"
#include "z_obj_grass.h"
#include "overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -439,7 +440,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 +485,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_Grass_Carry/z_obj_grass_carry.c b/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
index e46c5da44..795d740f1 100644
--- a/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
+++ b/src/overlays/actors/ovl_Obj_Grass_Carry/z_obj_grass_carry.c
@@ -208,31 +208,31 @@ void func_809AB474(ObjGrassCarry* this) {
}
void func_809AB4A8(ObjGrassCarry* this, PlayState* play) {
- ObjGrassCarry* this2 = this;
+ Actor* thisx = &this->actor;
- if (Actor_HasParent(&this->actor, play)) {
+ if (Actor_HasParent(thisx, play)) {
func_809AB5FC(this);
if (this->unk_194 != NULL) {
this->unk_194->unk_0F |= 4;
}
- this->actor.draw = func_809ABB7C;
- this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
- this->actor.shape.shadowAlpha = 60;
- this->actor.shape.shadowScale = 1.0f;
+ thisx->draw = func_809ABB7C;
+ thisx->shape.shadowDraw = ActorShadow_DrawCircle;
+ thisx->shape.shadowAlpha = 60;
+ thisx->shape.shadowScale = 1.0f;
this->unk_190->unk_3292 ^= 1;
- this->actor.room = -1;
- SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
+ thisx->room = -1;
+ SoundSource_PlaySfxAtFixedWorldPos(play, &thisx->world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
} else if (this->unk_190->unk_3294 != NULL) {
Player* player = GET_PLAYER(play);
this->unk_194 = this->unk_190->unk_3294;
- Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_194->unk_00);
- this->actor.shape.rot.y = this->actor.world.rot.y = this->unk_194->unk_0C;
- this->unk_198 = this2->unk_194->unk_0E;
- this->actor.xzDistToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
- this->actor.playerHeightRel = Actor_HeightDiff(&this->actor, &player->actor);
- this->actor.xyzDistToPlayerSq = SQ(this->actor.xzDistToPlayer) + SQ(this->actor.playerHeightRel);
- this->actor.yawTowardsPlayer = Actor_WorldYawTowardActor(&this->actor, &player->actor);
+ Math_Vec3f_Copy(&thisx->world.pos, &this->unk_194->unk_00);
+ thisx->shape.rot.y = thisx->world.rot.y = this->unk_194->unk_0C;
+ this->unk_198 = this->unk_194->unk_0E;
+ thisx->xzDistToPlayer = Actor_WorldDistXZToActor(&this->actor, &player->actor);
+ thisx->playerHeightRel = Actor_HeightDiff(&this->actor, &player->actor);
+ thisx->xyzDistToPlayerSq = SQ(thisx->xzDistToPlayer) + SQ(thisx->playerHeightRel);
+ thisx->yawTowardsPlayer = Actor_WorldYawTowardActor(&this->actor, &player->actor);
Actor_OfferCarry(&this->actor, play);
}
}
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..7559c4db7 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c
@@ -29,16 +29,16 @@ AnimatedMaterial* D_80B9DED0;
AnimatedMaterial* D_80B9DED4;
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
- /* 0x02 */ u8 unk_02;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
+ /* 0x2 */ u8 unk_02;
} ObjHansuiBssStruct; // size = 0x3
ObjHansuiBssStruct D_80B9DED8;
typedef struct {
- /* 0x00 */ u8 unk_00;
- /* 0x01 */ u8 unk_01;
+ /* 0x0 */ u8 unk_00;
+ /* 0x1 */ u8 unk_01;
} ObjHansuiStruct; // size = 0x2
ObjHansuiStruct D_80B9DC70[] = {
@@ -130,8 +130,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
this->unk_18C = 0;
Math_Vec3f_Copy(&sp40, &player->actor.world.pos);
- sp40.x += randPlusMinusPoint5Scaled(10.0f);
- sp40.z += randPlusMinusPoint5Scaled(10.0f);
+ sp40.x += Rand_CenteredFloat(10.0f);
+ sp40.z += Rand_CenteredFloat(10.0f);
sp40.y += Rand_ZeroFloat(2.0f);
EffectSsGSplash_Spawn(play, &sp40, NULL, NULL, 2.0f * Rand_ZeroOne(), 1);
@@ -144,8 +144,8 @@ void func_80B9C5E8(ObjHunsui* this, PlayState* play) {
Math_Vec3f_Copy(&sp40, &player->actor.world.pos);
this->unk_18C = 0;
- sp40.x += randPlusMinusPoint5Scaled(10.0f);
- sp40.z += randPlusMinusPoint5Scaled(10.0f);
+ sp40.x += Rand_CenteredFloat(10.0f);
+ sp40.z += Rand_CenteredFloat(10.0f);
sp40.y += Rand_ZeroFloat(45.0f);
EffectSsGSplash_Spawn(play, &sp40, NULL, NULL, 1, 1);
@@ -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_Hunsui/z_obj_hunsui.h b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
index c06abbe7d..1f0450b28 100644
--- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
+++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h
@@ -12,15 +12,15 @@ typedef void (*ObjHunsuiActionFunc)(struct ObjHunsui*, PlayState*);
#define OBJHUNSUI_GET_F80(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJHUNSUI_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJHUNSUI_F000_0,
/* 1 */ OBJHUNSUI_F000_1,
/* 2 */ OBJHUNSUI_F000_2,
/* 3 */ OBJHUNSUI_F000_3,
/* 4 */ OBJHUNSUI_F000_4,
/* 5 */ OBJHUNSUI_F000_5,
- /* 6 */ OBJHUNSUI_F000_6,
-};
+ /* 6 */ OBJHUNSUI_F000_6
+} ObjHunsuiParam;
typedef struct ObjHunsui {
/* 0x000 */ DynaPolyActor dyna;
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..d1601e69d 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
@@ -156,9 +156,9 @@ void func_80931828(ObjIcePoly* this, PlayState* play) {
temp = spA0.y - sp90;
for (i = 0; i < 30; i++) {
- sp94.x = randPlusMinusPoint5Scaled(12.0f);
+ sp94.x = Rand_CenteredFloat(12.0f);
sp94.y = Rand_ZeroFloat(15.0f);
- sp94.z = randPlusMinusPoint5Scaled(12.0f);
+ sp94.z = Rand_CenteredFloat(12.0f);
spA0.x = (this->colliders1[0].dim.radius * (sp94.x * (1.0f / 12))) + this->actor.world.pos.x;
spA0.z = (this->colliders1[0].dim.radius * (sp94.z * (1.0f / 12))) + this->actor.world.pos.z;
@@ -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..0ae8abe18 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -239,12 +239,12 @@ void func_80A237A4(ObjIceblock* this) {
((this->unk_244 - ((600.0f * this->dyna.actor.scale.y) - 90.0f)) + (sp20 * ptr->unk_08)) + ptr->unk_00;
}
-void func_80A23938(ObjIceblock* this2) {
- ObjIceblock* this = this2;
+void func_80A23938(ObjIceblock* this) {
+ Actor* thisx = &this->dyna.actor;
if (this->unk_1B0 & 0x80) {
- Math_ScaledStepToS(&this->dyna.actor.shape.rot.x, 0, 400);
- Math_ScaledStepToS(&this->dyna.actor.shape.rot.z, 0, 400);
+ Math_ScaledStepToS(&thisx->shape.rot.x, 0, 400);
+ Math_ScaledStepToS(&thisx->shape.rot.z, 0, 400);
} else {
ObjIceBlockUnkStruct4* ptr = &this->unk_27C;
f32 phi_f0;
@@ -252,7 +252,7 @@ void func_80A23938(ObjIceblock* this2) {
if (this->unk_1B0 & 0x20) {
phi_f0 = 0.3f;
- ptr->unk_14 = this->dyna.actor.yawTowardsPlayer;
+ ptr->unk_14 = thisx->yawTowardsPlayer;
} else {
phi_f0 = 0.08f;
}
@@ -264,16 +264,15 @@ void func_80A23938(ObjIceblock* this2) {
temp = ptr->unk_16 - ptr->unk_14;
- ptr->unk_18 +=
- (s16)(temp * -0.04f * this->dyna.actor.xzDistToPlayer * this->dyna.actor.scale.x * (1.0f / 600.0f));
+ ptr->unk_18 += (s16)(temp * -0.04f * thisx->xzDistToPlayer * thisx->scale.x * (1.0f / 600.0f));
ptr->unk_18 = func_80A23090(ptr->unk_18, 50, 800);
ptr->unk_16 += ptr->unk_18;
- this->dyna.actor.shape.rot.x = Math_CosS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
- this->dyna.actor.shape.rot.x = CLAMP(this->dyna.actor.shape.rot.x, -2000, 2000);
+ thisx->shape.rot.x = Math_CosS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
+ thisx->shape.rot.x = CLAMP(thisx->shape.rot.x, -2000, 2000);
- this->dyna.actor.shape.rot.z = -Math_SinS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
- this->dyna.actor.shape.rot.z = CLAMP(this->dyna.actor.shape.rot.z, -2000, 2000);
+ thisx->shape.rot.z = -Math_SinS(ptr->unk_16) * ptr->unk_20 * ptr->unk_1C;
+ thisx->shape.rot.z = CLAMP(thisx->shape.rot.z, -2000, 2000);
}
}
@@ -671,13 +670,14 @@ void func_80A24B74(ObjIceblock* this, PlayState* play) {
s32 pad;
Vec3f sp20;
- if (this->dyna.actor.flags & ACTOR_FLAG_40) {
- if (1) {}
- sp20.x = this->dyna.actor.world.pos.x;
- sp20.y = this->unk_244;
- sp20.z = this->dyna.actor.world.pos.z;
- EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
+ if (!(this->dyna.actor.flags & ACTOR_FLAG_40)) {
+ return;
}
+
+ sp20.x = this->dyna.actor.world.pos.x;
+ sp20.y = this->unk_244;
+ sp20.z = this->dyna.actor.world.pos.z;
+ EffectSsGRipple_Spawn(play, &sp20, 480, 880, 0);
}
void func_80A24BDC(ObjIceblock* this, PlayState* play, f32 arg2, f32 arg3, s32 arg4) {
@@ -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..529d7ec95 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
@@ -13,9 +13,9 @@
#define THIS ((ObjJgameLight*)thisx)
typedef enum {
- /* 0x0 */ OBJJGAMELIGHT_NONE,
- /* 0x1 */ OBJJGAMELIGHT_CORRECT,
- /* 0x2 */ OBJJGAMELIGHT_INCORRECT,
+ /* 0 */ OBJJGAMELIGHT_NONE,
+ /* 1 */ OBJJGAMELIGHT_CORRECT,
+ /* 2 */ OBJJGAMELIGHT_INCORRECT
} ObjJgameLightSignal;
void ObjJgameLight_Init(Actor* thisx, PlayState* play);
@@ -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..048aa9bcc 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
@@ -28,7 +28,7 @@
typedef enum {
/* -1 */ OBJKENDOKANBAN_DIR_DOWN = -1,
/* 0 */ OBJKENDOKANBAN_DIR_UNDETERMINED,
- /* 1 */ OBJKENDOKANBAN_DIR_UP,
+ /* 1 */ OBJKENDOKANBAN_DIR_UP
} ObjKendoKanbanDirection;
void ObjKendoKanban_Init(Actor* thisx, PlayState* play);
@@ -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_Kibako2/z_obj_kibako2.c b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
index eb14dff6a..4d3bdc348 100644
--- a/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
+++ b/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.c
@@ -65,7 +65,7 @@ s32 ObjKibako2_ContainsSkulltula(ObjKibako2* this, PlayState* play) {
if ((u16)actorSpawnParam & 3) {
flag = ((actorSpawnParam & 0x3FC) >> 2) & 0xFF;
}
- return !(flag >= 0 && Flags_GetTreasure(play, flag));
+ return !((flag >= 0) && Flags_GetTreasure(play, flag));
}
void ObjKibako2_Break(ObjKibako2* this, PlayState* play) {
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..6a6937e7e 100644
--- a/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
+++ b/src/overlays/actors/ovl_Obj_Lightblock/z_obj_lightblock.c
@@ -55,11 +55,11 @@ static ColliderCylinderInit sCylinderInit = {
};
typedef struct {
- /* 0x00 */ f32 scale;
- /* 0x04 */ s16 radius;
- /* 0x06 */ s16 height;
- /* 0x08 */ s16 yShift;
- /* 0x0C */ s32 params;
+ /* 0x0 */ f32 scale;
+ /* 0x4 */ s16 radius;
+ /* 0x6 */ s16 height;
+ /* 0x8 */ s16 yShift;
+ /* 0xC */ s32 params;
} LightblockTypeVars; // size = 0x10
static LightblockTypeVars sLightblockTypeVars[] = {
@@ -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_Lupygamelift/z_obj_lupygamelift.c b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
index cb957b839..7cace2621 100644
--- a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
+++ b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.c
@@ -65,7 +65,7 @@ void ObjLupygamelift_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.home.rot.y = 0;
this->dyna.actor.home.rot.z = 0;
- path = &play->setupPathList[OBJLUPYGAMELIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJLUPYGAMELIFT_GET_PATH_INDEX(thisx)];
this->pointIndex = OBJLUPYGAMELIFT_GET_7(thisx);
this->count = path->count;
if (this->pointIndex >= this->count) {
diff --git a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
index e25f9cd6d..a1928c473 100644
--- a/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
+++ b/src/overlays/actors/ovl_Obj_Lupygamelift/z_obj_lupygamelift.h
@@ -3,7 +3,7 @@
#include "global.h"
-#define OBJLUPYGAMELIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJLUPYGAMELIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJLUPYGAMELIFT_GET_7(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJLUPYGAMELIFT_GET_C(thisx) (((thisx)->params >> 0xC) & 1)
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
index bb7d30f69..bcef92843 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.c
@@ -61,7 +61,7 @@ void ObjMakeoshihiki_Init(Actor* thisx, PlayState* play) {
Path* path;
s32 childPointIndex;
- path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(&this->actor)];
+ path = &play->setupPathList[OBJMAKEOSHIHIKI_GET_PATH_INDEX(&this->actor)];
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->pathCount = path->count;
childPointIndex = ObjMakeoshihiki_GetChildSpawnPointIndex(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
index 47fbe831b..fbe8c1283 100644
--- a/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
+++ b/src/overlays/actors/ovl_Obj_Makeoshihiki/z_obj_makeoshihiki.h
@@ -5,7 +5,7 @@
struct ObjMakeoshihiki;
-#define OBJMAKEOSHIHIKI_GET_PATHLISTINDEX(thisx) (((thisx)->params >> 7) & 0x7F)
+#define OBJMAKEOSHIHIKI_GET_PATH_INDEX(thisx) (((thisx)->params >> 7) & 0x7F)
#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_1(thisx) ((thisx)->home.rot.z & 0x7F)
#define OBJMAKEOSHIHIKI_GET_SWITCHFLAG_2(thisx) ((thisx)->params & 0x7F)
diff --git a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
index 8ff6e8455..75ff18b6b 100644
--- a/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
+++ b/src/overlays/actors/ovl_Obj_Milk_Bin/z_obj_milk_bin.c
@@ -58,7 +58,7 @@ void ObjMilkBin_Init(Actor* thisx, PlayState* play) {
this->disableDraw = 0;
this->type = thisx->params;
- if ((this->type == OBJ_MILK_BIN_TYPE_2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if ((this->type == OBJ_MILK_BIN_TYPE_2) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
this->disableDraw |= 1;
}
}
@@ -74,14 +74,14 @@ void ObjMilkBin_Update(Actor* thisx, PlayState* play2) {
ObjMilkBin* this = THIS;
if (this->type == OBJ_MILK_BIN_TYPE_1) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
if (((gSaveContext.save.day == 2) && (gSaveContext.save.isNight == 1)) || (gSaveContext.save.day >= 3)) {
Actor_Kill(&this->actor);
return;
}
}
} else if (this->type == OBJ_MILK_BIN_TYPE_2) {
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
this->disableDraw &= ~1;
} else {
this->disableDraw |= 1;
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_Mu_Pict/z_obj_mu_pict.c b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
index b0ac87b4e..d08f2d638 100644
--- a/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
+++ b/src/overlays/actors/ovl_Obj_Mu_Pict/z_obj_mu_pict.c
@@ -64,7 +64,7 @@ void func_80C06B70(ObjMuPict* this, PlayState* play) {
s16 yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
if (Actor_ProcessTalkRequest(&this->actor, &play->state)) {
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80C06DC8(this, play);
func_80C06CC4(this);
} else {
diff --git a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
index 95c43a4bf..f63201966 100644
--- a/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
+++ b/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
@@ -73,7 +73,8 @@ typedef enum {
} ObjMureChildState;
s32 func_808D78D0(ObjMure* this, PlayState* play) {
- if (this->type == OBJMURE_TYPE_FISH || this->type == OBJMURE_TYPE_BUGS || this->type == OBJMURE_TYPE_BUTTERFLY) {
+ if ((this->type == OBJMURE_TYPE_FISH) || (this->type == OBJMURE_TYPE_BUGS) ||
+ (this->type == OBJMURE_TYPE_BUTTERFLY)) {
Actor_ProcessInitChain(&this->actor, sInitChain);
} else {
return false;
@@ -135,6 +136,7 @@ void ObjMure_SpawnActors0(Actor* thisx, PlayState* play) {
switch (this->childrenStates[i]) {
case OBJMURE_CHILD_STATE_DEAD:
break;
+
case OBJMURE_CHILD_STATE_2:
ObjMure_GetSpawnPos(&pos, &this->actor.world.pos, this->ptn, i);
this->children[i] = Actor_SpawnAsChildAndCutscene(
@@ -148,6 +150,7 @@ void ObjMure_SpawnActors0(Actor* thisx, PlayState* play) {
this->children[i]->room = this->actor.room;
}
break;
+
default:
ObjMure_GetSpawnPos(&pos, &this->actor.world.pos, this->ptn, i);
this->children[i] = Actor_SpawnAsChildAndCutscene(
@@ -190,9 +193,13 @@ void ObjMure_SpawnActors(ObjMure* this, PlayState* play) {
case 0:
ObjMure_SpawnActors0(&this->actor, play);
break;
+
case 1:
ObjMure_SpawnActors1(this, play);
break;
+
+ default:
+ break;
}
}
@@ -205,12 +212,14 @@ void ObjMure_KillActorsImpl(ObjMure* this, PlayState* play) {
case OBJMURE_CHILD_STATE_DEAD:
this->children[i] = NULL;
break;
+
case OBJMURE_CHILD_STATE_2:
if (this->children[i] != NULL) {
Actor_Kill(this->children[i]);
this->children[i] = NULL;
}
break;
+
default:
if (this->children[i] != NULL) {
if (Actor_HasParent(this->children[i], play)) {
@@ -244,7 +253,7 @@ void ObjMure_CheckChildren(ObjMure* this, PlayState* play) {
this->childrenStates[i] = OBJMURE_CHILD_STATE_DEAD;
this->children[i] = NULL;
}
- } else if (this->childrenStates[i] == OBJMURE_CHILD_STATE_2 && this->children[i]->update == NULL) {
+ } else if ((this->childrenStates[i] == OBJMURE_CHILD_STATE_2) && (this->children[i]->update == NULL)) {
this->childrenStates[i] = OBJMURE_CHILD_STATE_DEAD;
this->children[i] = NULL;
}
@@ -367,7 +376,7 @@ void ObjMure_GroupBehavior1(ObjMure* this, PlayState* play) {
maxChildren = ObjMure_GetMaxChildSpawns(this);
for (i = 0; i < maxChildren; i++) {
if (this->children[i] != NULL) {
- if (this->children[i]->child != NULL && this->children[i]->child->update == NULL) {
+ if ((this->children[i]->child != NULL) && (this->children[i]->child->update == NULL)) {
this->children[i]->child = NULL;
}
}
@@ -380,7 +389,7 @@ static ObjMureActionFunc sTypeGroupBehaviorFunc[] = {
void ObjMure_ActiveState(ObjMure* this, PlayState* play) {
ObjMure_CheckChildren(this, play);
- if (sZClip[this->type] + 40.0f <= fabsf(this->actor.projectedPos.z)) {
+ if ((sZClip[this->type] + 40.0f) <= fabsf(this->actor.projectedPos.z)) {
this->actionFunc = ObjMure_CulledState;
this->actor.flags &= ~ACTOR_FLAG_10;
ObjMure_KillActors(this, play);
diff --git a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
index c8f657c13..10f12c64a 100644
--- a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
+++ b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.c
@@ -108,7 +108,7 @@ void func_8098F220(ObjMure3* this, PlayState* play) {
}
void func_8098F364(ObjMure3* this, PlayState* play) {
- s16 count = sRupeeCounts[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)];
+ s16 count = sRupeeCounts[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)];
s32 i;
EnItem00** collectible;
@@ -126,7 +126,7 @@ void func_8098F364(ObjMure3* this, PlayState* play) {
}
void func_8098F438(ObjMure3* this, PlayState* play) {
- s16 count = sRupeeCounts[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)];
+ s16 count = sRupeeCounts[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)];
s32 i;
for (i = 0; i < count; i++) {
@@ -134,7 +134,7 @@ void func_8098F438(ObjMure3* this, PlayState* play) {
if ((*collectible != NULL) && !((this->unk164 >> i) & 1)) {
if ((*collectible)->unk1A4 != 0) {
- Flags_SetSwitch(play, OBJMURE3_PARAMS_7F(&this->actor));
+ Flags_SetSwitch(play, OBJMURE3_PARAM_7F(&this->actor));
}
if ((*collectible)->actor.update == NULL) {
this->unk164 |= (1 << i);
@@ -147,7 +147,7 @@ void func_8098F438(ObjMure3* this, PlayState* play) {
void ObjMure3_Init(Actor* thisx, PlayState* play) {
ObjMure3* this = THIS;
- if (Flags_GetSwitch(play, OBJMURE3_PARAMS_7F(&this->actor))) {
+ if (Flags_GetSwitch(play, OBJMURE3_PARAM_7F(&this->actor))) {
Actor_Kill(&this->actor);
return;
}
@@ -175,7 +175,7 @@ void func_8098F5E4(ObjMure3* this, PlayState* play) {
if (Math3D_XZLengthSquared(this->actor.projectedPos.x, this->actor.projectedPos.z) < SQ(1150.0f)) {
this->actor.flags |= ACTOR_FLAG_10;
- sSpawnFuncs[OBJMURE3_PARAMS_RUPEEINDEX(&this->actor)](this, play);
+ sSpawnFuncs[OBJMURE3_PARAM_RUPEEINDEX(&this->actor)](this, play);
func_8098F66C(this);
}
}
diff --git a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
index 8715e4308..336a092b4 100644
--- a/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
+++ b/src/overlays/actors/ovl_Obj_Mure3/z_obj_mure3.h
@@ -3,8 +3,8 @@
#include "global.h"
-#define OBJMURE3_PARAMS_7F(thisx) ((thisx)->params & 0x7F)
-#define OBJMURE3_PARAMS_RUPEEINDEX(thisx) (((thisx)->params >> 13) & 7)
+#define OBJMURE3_PARAM_7F(thisx) ((thisx)->params & 0x7F)
+#define OBJMURE3_PARAM_RUPEEINDEX(thisx) (((thisx)->params >> 13) & 7)
struct ObjMure3;
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..4710b8908 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"
@@ -129,7 +130,7 @@ void func_80BA2514(ObjNozoki* this, PlayState* play) {
}
s32 func_80BA26A8(ObjNozoki* this) {
- if (this->csId < 0) {
+ if (this->csId <= CS_ID_NONE) {
return true;
}
diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
index eab144cbd..168168f41 100644
--- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
+++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.c
@@ -74,7 +74,7 @@ void ObjOcarinalift_Init(Actor* thisx, PlayState* play) {
this->unk16C = 1;
this->unk170 = Lib_SegmentedToVirtual(path->points);
func_80AC94C0(this, this->unk168);
- if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAMSC_1) &&
+ if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAM_1) &&
(Flags_GetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor)))) {
func_80AC96B4(this);
} else {
@@ -137,7 +137,7 @@ void func_80AC96D0(ObjOcarinalift* this, PlayState* play) {
this->unk168 += this->unk16C;
thisx->speed *= 0.4f;
if (((this->unk168 >= this->unk164) && (this->unk16C > 0)) || ((this->unk168 <= 0) && (this->unk16C < 0))) {
- if (paramsC == OBJOCARINALIFT_PARAMSC_0) {
+ if (paramsC == OBJOCARINALIFT_PARAM_0) {
this->unk16C = -this->unk16C;
this->timer = 10;
func_80AC9A68(this);
@@ -155,11 +155,11 @@ void func_80AC96D0(ObjOcarinalift* this, PlayState* play) {
func_80AC99C0(this);
DynaPoly_DisableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
sp34 = false;
- } else if ((paramsC == OBJOCARINALIFT_PARAMSC_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
+ } else if ((paramsC == OBJOCARINALIFT_PARAM_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
func_80AC9AB8(this);
}
}
- } else if ((paramsC == OBJOCARINALIFT_PARAMSC_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
+ } else if ((paramsC == OBJOCARINALIFT_PARAM_1) && (this->unk168 == OBJOCARINALIFT_GET_1F(thisx))) {
func_80AC9AB8(this);
}
if (sp34) {
@@ -176,7 +176,7 @@ void func_80AC99D4(ObjOcarinalift* this, PlayState* play) {
if (!DynaPolyActor_IsPlayerOnTop(&this->dyna)) {
func_80AC94C0(this, this->unk168);
DynaPoly_EnableCollision(play, &play->colCtx.dyna, this->dyna.bgId);
- if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) == OBJOCARINALIFT_PARAMSC_1) &&
+ if ((OBJOCARINALIFT_GET_C(&this->dyna.actor) == OBJOCARINALIFT_PARAM_1) &&
(this->unk168 == OBJOCARINALIFT_GET_1F(&this->dyna.actor))) {
func_80AC9AB8(this);
} else {
@@ -218,7 +218,7 @@ void func_80AC9B5C(ObjOcarinalift* this, PlayState* play) {
if (func_800B886C(&this->dyna.actor, play)) {
if (play->msgCtx.ocarinaMode == 4) {
if (play->msgCtx.lastPlayedSong == 0) {
- if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAMSC_1) {
+ if (OBJOCARINALIFT_GET_C(&this->dyna.actor) != OBJOCARINALIFT_PARAM_1) {
Flags_SetSwitch(play, OBJOCARINALIFT_GET_SWITCH_FLAG(&this->dyna.actor));
}
CutsceneManager_Queue(this->dyna.actor.csId);
diff --git a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
index 3789383c2..abb1e440b 100644
--- a/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
+++ b/src/overlays/actors/ovl_Obj_Ocarinalift/z_obj_ocarinalift.h
@@ -24,9 +24,9 @@ typedef struct ObjOcarinalift {
/* 0x176 */ s16 cutsceneTimer;
} ObjOcarinalift; // size = 0x178
-typedef enum ObjOcarinaliftParams {
- /* 0x0 */ OBJOCARINALIFT_PARAMSC_0,
- /* 0x1 */ OBJOCARINALIFT_PARAMSC_1
-} ObjOcarinaliftParams;
+typedef enum ObjOcarinaliftParam {
+ /* 0 */ OBJOCARINALIFT_PARAM_0,
+ /* 1 */ OBJOCARINALIFT_PARAM_1
+} ObjOcarinaliftParam;
#endif // Z_OBJ_OCARINALIFT_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_Oshihiki/z_obj_oshihiki.h b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
index d2f61e2cf..4740b907a 100644
--- a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
+++ b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.h
@@ -12,7 +12,7 @@ typedef void (*ObjOshihikiActionFunc)(struct ObjOshihiki*, PlayState*);
#define OBJOSHIHIKI_GET_7F00(thisx) (((thisx)->params >> 8) & 0x7F)
#define OBJOSHIHIKI_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
-enum {
+typedef enum {
/* 0 */ OBJOSHIHIKI_F_0,
/* 1 */ OBJOSHIHIKI_F_1,
/* 2 */ OBJOSHIHIKI_F_2,
@@ -21,8 +21,8 @@ enum {
/* 5 */ OBJOSHIHIKI_F_5,
/* 6 */ OBJOSHIHIKI_F_6,
/* 7 */ OBJOSHIHIKI_F_7,
- /* 8 */ OBJOSHIHIKI_F_8,
-};
+ /* 8 */ OBJOSHIHIKI_F_8
+} ObjOshihikiParam;
#define OBJOSHIHIKI_FF00_0 0
#define OBJOSHIHIKI_FF00_80 0x80
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..8a124b0ab 100644
--- a/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
+++ b/src/overlays/actors/ovl_Obj_Pzlblock/z_obj_pzlblock.c
@@ -44,7 +44,7 @@ typedef struct {
/* 0x0 */ s16 unk_00;
/* 0x4 */ CollisionHeader* unk_04;
/* 0x8 */ Gfx* unk_08;
-} ObjPzlblockStruct;
+} ObjPzlblockStruct; // size = 0xC
ObjPzlblockStruct D_809A4060[] = {
{ GAMEPLAY_DANGEON_KEEP, &gameplay_dangeon_keep_Colheader_01D488, gameplay_dangeon_keep_DL_01C228 },
@@ -114,20 +114,20 @@ s32 func_809A34E0(ObjPzlblock* this, s32 arg1) {
}
if (temp_v0 == 4) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (temp_v0 == 5) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
if (temp_v0 == 6) {
if (this->unk_176 != 0) {
- return arg1 == 0 || arg1 == 1;
+ return (arg1 == 0) || (arg1 == 1);
}
if (this->unk_178 != 0) {
- return arg1 == 2 || arg1 == 3;
+ return (arg1 == 2) || (arg1 == 3);
}
return true;
}
@@ -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..1a63e89cb 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.c
@@ -86,7 +86,7 @@ void ObjRaillift_Init(Actor* thisx, PlayState* play) {
if (this->speed < 0.01f) {
this->actionFunc = ObjRaillift_DoNothing;
} else {
- path = &play->setupPathList[OBJRAILLIFT_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJRAILLIFT_GET_PATH_INDEX(thisx)];
this->curPoint = OBJRAILLIFT_GET_STARTING_POINT(thisx);
this->endPoint = path->count - 1;
this->direction = 1;
@@ -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_Raillift/z_obj_raillift.h b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
index b921b0e5a..dc197432f 100644
--- a/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
+++ b/src/overlays/actors/ovl_Obj_Raillift/z_obj_raillift.h
@@ -10,7 +10,7 @@ typedef void (*ObjRailliftActionFunc)(struct ObjRaillift*, PlayState*);
#define OBJRAILLIFT_GET_TYPE(thisx) (((thisx)->params >> 0xF) & 1)
#define OBJRAILLIFT_HAS_FLAG(thisx) (((thisx)->params >> 0xD) & 1)
#define OBJRAILLIFT_GET_FLAG(thisx) ((thisx)->home.rot.x & 0x7F)
-#define OBJRAILLIFT_GET_PATH(thisx) ((thisx)->params & 0x7F)
+#define OBJRAILLIFT_GET_PATH_INDEX(thisx) ((thisx)->params & 0x7F)
#define OBJRAILLIFT_GET_STARTING_POINT(thisx) (((thisx)->params >> 7) & 0x1F)
#define OBJRAILLIFT_GET_SPEED(thisx) ((thisx)->home.rot.z * 0.1f)
#define OBJRAILLIFT_SHOULD_TELEPORT(thisx) (((thisx)->params >> 0xC) & 1)
diff --git a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
index df3fe1dee..e059b6baa 100644
--- a/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
+++ b/src/overlays/actors/ovl_Obj_Rotlift/z_obj_rotlift.h
@@ -10,7 +10,7 @@
typedef enum {
/* 0 */ OBJROTLIFT_TYPE_PLATFORMS,
- /* 1 */ OBJROTLIFT_TYPE_SPIKES,
+ /* 1 */ OBJROTLIFT_TYPE_SPIKES
} ObjRotliftType;
struct ObjRotlift;
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..92ac9ad85 100644
--- a/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
+++ b/src/overlays/actors/ovl_Obj_Snowball/z_obj_snowball.c
@@ -73,10 +73,10 @@ static ColliderJntSphInit sJntSphInit = {
};
typedef struct {
- /* 0x00 */ s16 unk_00;
- /* 0x02 */ s16 unk_02;
- /* 0x04 */ ObjSnowballActionFunc unk_04;
-} ObjSnowballStruct2;
+ /* 0x0 */ s16 unk_00;
+ /* 0x2 */ s16 unk_02;
+ /* 0x4 */ ObjSnowballActionFunc unk_04;
+} ObjSnowballStruct2; // size = 0x8
static ObjSnowballStruct2 D_80B04F84[] = {
{ -1, 0, func_80B02D58 },
@@ -549,7 +549,7 @@ void func_80B04350(ObjSnowball* this, PlayState* play) {
this->unk_20A = 0;
}
- if (this->actor.csId < 0) {
+ if (this->actor.csId <= CS_ID_NONE) {
func_80B03FF8(this, play);
if (this->unk_20A == 0) {
func_80B04608(this, play);
@@ -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..c366a6982 100644
--- a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
+++ b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c
@@ -234,7 +234,7 @@ typedef struct {
/* 0x1C */ f32 unk_1C;
/* 0x20 */ f32 unk_20;
/* 0x24 */ f32 unk_24;
-} ObjSpidertentStruct;
+} ObjSpidertentStruct; // size = 0x28
ObjSpidertentStruct D_80B31350[] = {
{
@@ -272,7 +272,7 @@ typedef struct {
/* 0x0F */ s8 unk_0F;
/* 0x10 */ Color_RGBA8 unk_10;
/* 0x14 */ Color_RGBA8 unk_14;
-} ObjSpidertentStruct2;
+} ObjSpidertentStruct2; // size = 0x18
ObjSpidertentStruct2 D_80B313A0[] = {
{
@@ -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_Taru/z_obj_taru.c b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
index aeaddd2ee..6eac0ddbc 100644
--- a/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
+++ b/src/overlays/actors/ovl_Obj_Taru/z_obj_taru.c
@@ -141,10 +141,10 @@ void func_80B9B9C8(ObjTaru* this, PlayState* play) {
for (i = 0; i < 4; i++) {
for (j = phi_fp; j < phi_s5; j++) {
- temp_fs0 = randPlusMinusPoint5Scaled(10.0f) + -105.0f + (j * 30.0f);
- temp_fs1 = randPlusMinusPoint5Scaled(4.0f);
+ temp_fs0 = Rand_CenteredFloat(10.0f) + -105.0f + (j * 30.0f);
+ temp_fs1 = Rand_CenteredFloat(4.0f);
spD8.x = temp_fs0 * cos;
- spD8.y = randPlusMinusPoint5Scaled(10.0f) + 15.0f + (i * 30.0f);
+ spD8.y = Rand_CenteredFloat(10.0f) + 15.0f + (i * 30.0f);
spD8.z = temp_fs0 * sin;
spCC.x = (spD8.x * 0.05f) + (temp_fs1 * sin);
spCC.y = Rand_ZeroFloat(5.0f) + 2.0f;
diff --git a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
index c6ed2cc2c..cecb80832 100644
--- a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
+++ b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.c
@@ -131,12 +131,12 @@ void ObjToge_Init(Actor* thisx, PlayState* play) {
Collider_InitCylinder(play, &this->collider);
- if (OBJTOGE_GET_PATH(thisx) == 0xFF) {
+ if (OBJTOGE_GET_PATH_INDEX(thisx) == OBJTOGE_PATH_INDEX_NONE) {
Actor_Kill(thisx);
return;
}
- path = &play->setupPathList[OBJTOGE_GET_PATH(thisx)];
+ path = &play->setupPathList[OBJTOGE_GET_PATH_INDEX(thisx)];
if (path->count != 2) {
Actor_Kill(thisx);
return;
diff --git a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
index 8259e62c8..54cf02bf4 100644
--- a/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
+++ b/src/overlays/actors/ovl_Obj_Toge/z_obj_toge.h
@@ -7,11 +7,13 @@ struct ObjToge;
typedef void (*ObjTogeActionFunc)(struct ObjToge*, PlayState*);
-#define OBJTOGE_GET_PATH(thisx) ((thisx)->params & 0xFF)
+#define OBJTOGE_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF)
#define OBJTOGE_GET_700(thisx) (((thisx)->params >> 8) & 7)
#define OBJTOGE_GET_3800(thisx) (((thisx)->params >> 0xB) & 7)
#define OBJTOGE_GET_4000(thisx) (((thisx)->params >> 0xE) & 1)
+#define OBJTOGE_PATH_INDEX_NONE 0xFF
+
typedef struct ObjToge {
/* 0x000 */ Actor actor;
/* 0x144 */ ColliderCylinder collider;
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..a198f4a0f 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);
}
@@ -140,7 +140,7 @@ void ObjTokeiStep_InitTimers(ObjTokeiStep* this) {
}
s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, PlayState* play) {
- ObjTokeiStep* this2 = this;
+ Actor* thisx = &this->dyna.actor;
s32 i;
ObjTokeiStepPanel* panel;
f32 finalPosY;
@@ -179,8 +179,8 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, PlayState* play) {
panel->pos.y += finalPosY;
}
if (panel->numBounces == 1) {
- ObjTokeiStep_SpawnDust(this2, panel, play);
- ObjTokeiStep_AddQuake(this2, play);
+ ObjTokeiStep_SpawnDust(this, panel, play);
+ ObjTokeiStep_RequestQuakeAndRumble(this, 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_Tokei_Turret/z_obj_tokei_turret.h b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
index 620228f53..4ebde38ad 100644
--- a/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
+++ b/src/overlays/actors/ovl_Obj_Tokei_Turret/z_obj_tokei_turret.h
@@ -7,7 +7,7 @@
typedef enum {
/* 0 */ TURRET_TIER_BASE,
- /* 1 */ TURRET_TIER_TOP,
+ /* 1 */ TURRET_TIER_TOP
} TurretTierType;
struct ObjTokeiTurret;
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..61fa2376f 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.c
@@ -124,7 +124,7 @@ void ObjTokeidai_ExteriorGear_Init(ObjTokeidai* this, PlayState* play) {
if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
ObjTokeidai_SetupTowerOpening(this);
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->actionFunc = ObjTokeidai_ExteriorGear_OpenedIdle;
this->actor.world.pos.y += this->actor.scale.y * 1900.0f;
this->actor.shape.yOffset = 1500.0f;
@@ -141,7 +141,7 @@ void ObjTokeidai_TowerClock_Init(ObjTokeidai* this, PlayState* play) {
if (((play->sceneId == SCENE_CLOCKTOWER) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0)) ||
((play->sceneId == SCENE_00KEIKOKU) && (gSaveContext.sceneLayer == 2) && (play->csCtx.scriptIndex == 0))) {
ObjTokeidai_SetupTowerOpening(this);
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->actor.world.pos.y += (this->actor.scale.y * 5191.0f) - 50.0f;
this->actor.world.pos.x += Math_SinS(this->actor.world.rot.y) * this->actor.scale.z * 1791.0f;
this->actor.world.pos.z += -Math_CosS(this->actor.world.rot.y) * this->actor.scale.z * 1791.0f;
@@ -178,8 +178,8 @@ void ObjTokeidai_Counterweight_Init(ObjTokeidai* this, PlayState* play) {
if (this->actor.child == NULL) {
type = OBJ_TOKEIDAI_TYPE(&this->actor);
- if (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN ||
- type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD) {
+ if ((type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN) ||
+ (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD)) {
this->actor.child = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HANABI, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
@@ -192,7 +192,7 @@ void ObjTokeidai_Counterweight_Init(ObjTokeidai* this, PlayState* play) {
this->actor.child->home.rot.x = 0x12C;
}
}
- } else if ((CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) || CURRENT_DAY >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) {
this->spotlightIntensity = 0;
this->actor.world.pos.y += this->actor.scale.y * -2160.0f;
this->actor.world.pos.x += Math_SinS(this->actor.world.rot.y) * this->actor.scale.z * 5400.0f;
@@ -274,6 +274,9 @@ void ObjTokeidai_Init(Actor* thisx, PlayState* play) {
this->xluDList = gClockTowerEmptyDL;
this->actionFunc = ObjTokeidai_StaircaseToRooftop_Idle;
break;
+
+ default:
+ break;
}
}
@@ -284,7 +287,7 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
s32 currentClockMinute = GET_CURRENT_CLOCK_MINUTE(this);
if (currentClockMinute != this->clockMinute) {
- if (this->minuteRingOrExteriorGearRotationTimer == 8 && playSfx) {
+ if ((this->minuteRingOrExteriorGearRotationTimer == 8) && playSfx) {
Actor_PlaySfx(&this->actor, NA_SE_EV_CLOCK_TOWER_SECOND_HAND);
}
@@ -306,8 +309,8 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
this->minuteRingOrExteriorGearRotationTimer++;
- if ((currentClockMinute == 15 && this->minuteRingOrExteriorGearRotation < 0) ||
- (currentClockMinute != 15 &&
+ if (((currentClockMinute == 15) && (this->minuteRingOrExteriorGearRotation < 0)) ||
+ ((currentClockMinute != 15) &&
this->minuteRingOrExteriorGearRotation > GET_MINUTE_RING_OR_EXTERIOR_GEAR_ROTATION(currentClockMinute))) {
this->minuteRingOrExteriorGearRotation = GET_MINUTE_RING_OR_EXTERIOR_GEAR_ROTATION(currentClockMinute);
this->clockMinute = currentClockMinute;
@@ -318,7 +321,7 @@ void ObjTokeidai_RotateOnMinuteChange(ObjTokeidai* this, s32 playSfx) {
}
void ObjTokeidai_ExteriorGear_Collapse(ObjTokeidai* this, PlayState* play) {
- if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || this->actor.world.pos.y < 0.0f) {
+ if ((this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (this->actor.world.pos.y < 0.0f)) {
this->actionFunc = ObjTokeidai_DoNothing;
} else {
this->actor.shape.rot.x += 0x50;
@@ -513,6 +516,9 @@ void ObjTokeidai_TowerOpening_DropCounterweight(ObjTokeidai* this, PlayState* pl
case 2:
Actor_PlaySfx(&this->actor, NA_SE_EV_CLOCK_TOWER_BOUND_2);
break;
+
+ default:
+ break;
}
this->boundCount++;
@@ -609,7 +615,7 @@ void ObjTokeidai_DoNothing(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_StaircaseToRooftop_Idle(ObjTokeidai* this, PlayState* play) {
- if ((((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || CURRENT_DAY >= 4) ||
+ if ((((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) || (CURRENT_DAY >= 4)) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_08_40)) {
this->actor.draw = ObjTokeidai_Draw;
} else {
@@ -621,7 +627,7 @@ s32 ObjTokeidai_IsPostFirstCycleFinalHours(ObjTokeidai* this, PlayState* play) {
if (gSaveContext.save.saveInfo.inventory.items[SLOT_OCARINA] == ITEM_NONE) {
return false;
}
- if (CURRENT_DAY == 3 && gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY == 3) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
ObjTokeidai_SetupTowerOpening(this);
return true;
}
@@ -650,8 +656,8 @@ void ObjTokeidai_RotateOnHourChange(ObjTokeidai* this, PlayState* play) {
this->clockFaceRotationTimer++;
- if ((currentClockHour == 12 && this->clockFaceRotation < 0) ||
- (currentClockHour != 12 && this->clockFaceRotation > GET_CLOCK_FACE_ROTATION(currentClockHour))) {
+ if (((currentClockHour == 12) && (this->clockFaceRotation < 0)) ||
+ ((currentClockHour != 12) && (this->clockFaceRotation > GET_CLOCK_FACE_ROTATION(currentClockHour)))) {
this->clockFaceRotation = GET_CLOCK_FACE_ROTATION(currentClockHour);
this->clockHour = currentClockHour;
this->clockFaceRotationalVelocity = 0;
@@ -682,7 +688,7 @@ void ObjTokeidai_RotateOnHourChange(ObjTokeidai* this, PlayState* play) {
}
void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
- if (CURRENT_DAY == 3 && this->clockHour < 6 && gSaveContext.save.time < CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY == 3) && (this->clockHour < 6) && (gSaveContext.save.time < CLOCK_TIME(6, 0))) {
this->actor.draw = ObjTokeidai_Clock_Draw;
ObjTokeidai_SetupTowerOpening(this);
SET_WEEKEVENTREG(WEEKEVENTREG_08_40);
@@ -695,8 +701,8 @@ void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
this->actor.draw = ObjTokeidai_Clock_Draw;
} else {
if (!(play->actorCtx.flags & ACTORCTX_FLAG_1) &&
- OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_TOWER_CLOCK_TERMINA_FIELD &&
- CutsceneManager_GetCurrentCsId() == CS_ID_NONE) {
+ (OBJ_TOKEIDAI_TYPE(&this->actor) == OBJ_TOKEIDAI_TYPE_TOWER_CLOCK_TERMINA_FIELD) &&
+ (CutsceneManager_GetCurrentCsId() == CS_ID_NONE)) {
this->actor.draw = NULL;
}
this->clockTime = gSaveContext.save.time;
@@ -706,7 +712,7 @@ void ObjTokeidai_TowerClock_Idle(ObjTokeidai* this, PlayState* play) {
}
}
- if (CURRENT_DAY != 3 || gSaveContext.save.time >= CLOCK_TIME(6, 0)) {
+ if ((CURRENT_DAY != 3) || (gSaveContext.save.time >= CLOCK_TIME(6, 0))) {
ObjTokeidai_RotateOnMinuteChange(this, true);
}
ObjTokeidai_RotateOnHourChange(this, play);
@@ -750,8 +756,8 @@ void ObjTokeidai_Counterweight_Idle(ObjTokeidai* this, PlayState* play) {
if (this->actor.child == NULL) {
type = OBJ_TOKEIDAI_TYPE(&this->actor);
- if (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN ||
- type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD) {
+ if ((type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_CLOCK_TOWN) ||
+ (type == OBJ_TOKEIDAI_TYPE_COUNTERWEIGHT_TERMINA_FIELD)) {
this->actor.child = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_HANABI, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, 0);
}
@@ -791,13 +797,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 +815,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 +868,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 +893,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_Tokeidai/z_obj_tokeidai.h b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
index e670d19e0..43f424ceb 100644
--- a/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
+++ b/src/overlays/actors/ovl_Obj_Tokeidai/z_obj_tokeidai.h
@@ -16,7 +16,7 @@ typedef enum {
/* 8 */ OBJ_TOKEIDAI_TYPE_TOWER_WALLS_TERMINA_FIELD = 8,
/* 9 */ OBJ_TOKEIDAI_TYPE_WALL_CLOCK,
/* 10 */ OBJ_TOKEIDAI_TYPE_SMALL_WALL_CLOCK,
- /* 11 */ OBJ_TOKEIDAI_TYPE_STAIRCASE_TO_ROOFTOP,
+ /* 11 */ OBJ_TOKEIDAI_TYPE_STAIRCASE_TO_ROOFTOP
} ObjTokeidaiType;
struct ObjTokeidai;
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_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
index 5f0e6c411..9b8baa861 100644
--- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
+++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c
@@ -63,8 +63,7 @@ typedef struct {
/* 0x14 */ ObjTsuboUnkFunc breakPot1;
/* 0x18 */ ObjTsuboUnkFunc breakPot2;
/* 0x1C */ ObjTsuboUnkFunc breakPot3;
-
-} ObjTsuboData;
+} ObjTsuboData; // size = 0x20
ObjTsuboData sPotTypeData[4] = {
{ GAMEPLAY_DANGEON_KEEP, 0.197f, gameplay_dangeon_keep_DL_017EA0, gameplay_dangeon_keep_DL_018090, 12, 32,
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 a924c9e06..a6085ef51 100644
--- a/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
+++ b/src/overlays/actors/ovl_Obj_Um/z_obj_um.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_um.h"
+#include "z64horse.h"
#include "overlays/actors/ovl_En_In/z_en_in.h"
#include "objects/gameplay_keep/gameplay_keep.h"
@@ -14,7 +15,7 @@
/**
* weekEventReg flags checked by this actor:
- * - WEEKEVENTREG_22_01: Aliens defeated
+ * - WEEKEVENTREG_DEFENDED_AGAINST_THEM: Aliens defeated
* If false: The actor doesn't spawn
* - WEEKEVENTREG_31_40
* If true: Cremia doesn't explain again she'll deliever milk to town
@@ -22,7 +23,7 @@
* If true: Triggers cutscene on Romani's Ranch
* - WEEKEVENTREG_34_80
* If true: Doesn't spawn on Romani's Ranch
- * - WEEKEVENTREG_52_01
+ * - WEEKEVENTREG_ESCORTED_CREMIA
* If true: Doesn't spawn on Romani's Ranch or Milk Road
* - WEEKEVENTREG_52_02
* If true: Doesn't spawn on Romani's Ranch or Milk Road
@@ -36,7 +37,7 @@
* Player accepts the ride and is with Cremia during the Milk Run
* - WEEKEVENTREG_34_80: Cremia does Milk Run alone
* Player didn't interact or didn't accept the ride
- * - WEEKEVENTREG_52_01: Won Milk Run minigame
+ * - WEEKEVENTREG_ESCORTED_CREMIA: Won Milk Run minigame
* At least one pot is safe. Turns off the "Lose Milk Run minigame"
* - WEEKEVENTREG_52_02: Lose Milk Run minigame
* Every pot was broken by bandits. Turns off the "Win Milk Run minigame"
@@ -46,7 +47,7 @@
* weekEventReg flags unset by this actor:
* - WEEKEVENTREG_31_80
* Turned off when the Milk Run finishes
- * - WEEKEVENTREG_52_01
+ * - WEEKEVENTREG_ESCORTED_CREMIA
* Turned off if Player lose the Milk Run
* - WEEKEVENTREG_52_02
* Turned off if Player wins the Milk Run
@@ -303,7 +304,7 @@ s32 func_80B781DC(ObjUm* this, EnHorse* bandit1, EnHorse* bandit2, PlayState* pl
if (bandit1->unk_550 == D_80B7C164[i].unk_00) {
if (bandit2->unk_550 != D_80B7C164[i].unk_04) {
if (D_80B7C164[i].unk_00 != 3) {
- if (D_80B7C164[i].unk_04 != 3 ||
+ if ((D_80B7C164[i].unk_04 != 3) ||
((mask = Player_GetMask(play)), PLAYER_MASK_CIRCUS_LEADER != mask)) {
phi_s3 = D_80B7C164[i].unk_04;
phi_s4 = D_80B7C164[i].unk_08;
@@ -454,13 +455,13 @@ s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandi
}
if (this->potsLife[1] != 1) {
- if ((potIndex == -1) || (potIndex == 0 && Rand_ZeroOne() < 0.3f)) {
+ if ((potIndex == -1) || ((potIndex == 0) && (Rand_ZeroOne() < 0.3f))) {
potIndex = 1;
}
}
if (this->potsLife[2] != 1) {
- if ((potIndex == -1) || (potIndex != -1 && Rand_ZeroOne() < 0.3f)) {
+ if ((potIndex == -1) || ((potIndex != -1) && (Rand_ZeroOne() < 0.3f))) {
potIndex = 2;
}
}
@@ -496,8 +497,6 @@ s32 func_80B78764(ObjUm* this, PlayState* play, EnHorse* bandit1, EnHorse* bandi
phi_v1_5 = Math_Vec3f_Yaw(&bandit1->actor.prevPos, &bandit1->actor.world.pos);
}
- if (1) {}
-
phi_v1_5 -= bandit1->actor.shape.rot.y;
if (phi_v1_5 > 0x190) {
bandit1->actor.shape.rot.y += 0x190;
@@ -683,7 +682,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->initialPathIndex = OBJ_UM_GET_PATH_INDEX(thisx);
// if (!AliensDefeated)
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -703,7 +702,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
// Waiting for player
if (CHECK_WEEKEVENTREG(WEEKEVENTREG_34_80) || (gSaveContext.save.time >= CLOCK_TIME(19, 0)) ||
- (gSaveContext.save.time <= CLOCK_TIME(6, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) ||
+ (gSaveContext.save.time <= CLOCK_TIME(6, 0)) || CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) ||
CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
Actor_Kill(&this->dyna.actor);
return;
@@ -714,7 +713,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
ObjUm_SetupAction(this, ObjUm_RanchWait);
}
} else if (this->type == OBJ_UM_TYPE_PRE_MILK_RUN) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_31_80) || CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -740,7 +739,7 @@ void ObjUm_Init(Actor* thisx, PlayState* play) {
this->unk_354 = 0;
ObjUm_RotatePlayer(this, play, 0);
} else if (this->type == OBJ_UM_TYPE_POST_MILK_RUN) {
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) || CHECK_WEEKEVENTREG(WEEKEVENTREG_59_02)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) || CHECK_WEEKEVENTREG(WEEKEVENTREG_59_02)) {
Actor_Kill(&this->dyna.actor);
return;
}
@@ -835,7 +834,7 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
SET_WEEKEVENTREG(WEEKEVENTREG_31_80);
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 11);
if (player->stateFlags1 & PLAYER_STATE1_800000) {
- D_801BDAA0 = 1;
+ D_801BDAA0 = true;
}
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
@@ -844,7 +843,7 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
} else {
Actor_ContinueText(play, &this->dyna.actor, 0x33B5);
func_8019F230();
- func_80151BB4(play, 6);
+ Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA);
phi_v1 = false;
}
break;
@@ -878,6 +877,9 @@ s32 func_80B795A0(PlayState* play, ObjUm* this, s32 arg2) {
Actor_ContinueText(play, &this->dyna.actor, 0x33BC);
phi_v1 = false;
break;
+
+ default:
+ break;
}
return phi_v1;
@@ -899,6 +901,9 @@ s32 func_80B79734(PlayState* play, ObjUm* this, s32 arg2) {
ret = true;
}
break;
+
+ default:
+ break;
}
return ret;
}
@@ -1030,7 +1035,7 @@ typedef enum ObjUmPathState {
/* 1 */ OBJUM_PATH_STATE_1,
/* 2 */ OBJUM_PATH_STATE_FINISH,
/* 3 */ OBJUM_PATH_STATE_3,
- /* 4 */ OBJUM_PATH_STATE_4,
+ /* 4 */ OBJUM_PATH_STATE_4
} ObjUmPathState;
ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
@@ -1093,9 +1098,7 @@ ObjUmPathState ObjUm_UpdatePath(ObjUm* this, PlayState* play) {
if (this->donkey != NULL) {
this->dyna.actor.world.rot.y = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp50);
- func_800F415C(&this->donkey->actor, &sp50, 0x190);
-
- if (1) {}
+ Horse_RotateToPoint(&this->donkey->actor, &sp50, 0x190);
yawDiff = this->donkey->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
if (fabsf(yawDiff) < 2730.0f) {
@@ -1299,13 +1302,13 @@ void ObjUm_RunMinigame(ObjUm* this, PlayState* play) {
CLEAR_WEEKEVENTREG(WEEKEVENTREG_31_80);
gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
- if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_52_01) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
+ if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_52_02)) {
if (!this->areAllPotsBroken) {
play->nextEntrance = ENTRANCE(MILK_ROAD, 6);
play->transitionType = TRANS_TYPE_64;
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
- SET_WEEKEVENTREG(WEEKEVENTREG_52_01);
+ SET_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA);
CLEAR_WEEKEVENTREG(WEEKEVENTREG_52_02);
} else {
play->nextEntrance = ENTRANCE(ROMANI_RANCH, 8);
@@ -1313,7 +1316,7 @@ void ObjUm_RunMinigame(ObjUm* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE;
play->transitionTrigger = TRANS_TRIGGER_START;
SET_WEEKEVENTREG(WEEKEVENTREG_52_02);
- CLEAR_WEEKEVENTREG(WEEKEVENTREG_52_01);
+ CLEAR_WEEKEVENTREG(WEEKEVENTREG_ESCORTED_CREMIA);
}
}
break;
@@ -1335,7 +1338,7 @@ void func_80B7A614(ObjUm* this, PlayState* play) {
this->flags |= OBJ_UM_FLAG_PLAYING_MINIGAME;
ObjUm_ChangeAnim(this, play, OBJ_UM_ANIM_GALLOP);
- if (ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_3 && this->unk_4DC == 0) {
+ if ((ObjUm_UpdatePath(this, play) == OBJUM_PATH_STATE_3) && (this->unk_4DC == 0)) {
this->unk_4DC = 1;
} else if (this->unk_4DC > 0) {
if (this->unk_4DC == 1) {
@@ -1470,7 +1473,7 @@ void func_80B7A860(ObjUm* this, PlayState* play) {
case 0x33BF:
this->unk_4D8++;
- if ((fabsf(this->skelAnime.morphWeight) < 0.008f) && this->unk_4D8 >= 6) {
+ if ((fabsf(this->skelAnime.morphWeight) < 0.008f) && (this->unk_4D8 >= 6)) {
this->unk_4CC = 0;
this->mouthTexIndex = 0;
} else {
@@ -1631,9 +1634,9 @@ void ObjUm_DefaultAnim(ObjUm* this, PlayState* play) {
}
typedef struct {
- /* 0x00 */ AnimationHeader* anim;
- /* 0x04 */ s32 doesMove; // `true` if the animation is intended to be used while the actor is moving
-} struct_80B7C25C; // size = 0x08
+ /* 0x0 */ AnimationHeader* anim;
+ /* 0x4 */ s32 doesMove; // `true` if the animation is intended to be used while the actor is moving
+} struct_80B7C25C; // size = 0x8
struct_80B7C25C sUmAnims[] = {
{ &gUmTrotAnim, true }, // OBJ_UM_ANIM_TROT
@@ -1700,7 +1703,7 @@ void ObjUm_ChangeAnim(ObjUm* this, PlayState* play, ObjUmAnimation animIndex) {
}
}
- if (this->wheelRot / 0x199A != this->unk_420) {
+ if ((this->wheelRot / 0x199A) != this->unk_420) {
this->unk_420 = this->wheelRot / 0x199A;
//! FAKE
if (sUmAnims[0].doesMove) {}
@@ -1767,18 +1770,23 @@ void ObjUm_Update(Actor* thisx, PlayState* play) {
case 1:
this->eyeTexIndex = 3;
break;
+
case 2:
this->eyeTexIndex = 4;
break;
+
case 3:
this->eyeTexIndex = 5;
break;
+
case 4:
this->eyeTexIndex = 2;
break;
+
case 5:
this->eyeTexIndex = 0;
break;
+
default:
this->unk_4CC = 0;
this->eyeTexIndex = 0;
@@ -1912,6 +1920,7 @@ void ObjUm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
sp80.x = 0;
sp80.z = 0;
sp88.x = 6800.0f;
+
OPEN_DISPS(gfxCtx);
for (i = 0; i < ARRAY_COUNT(this->potsLife); i++) {
@@ -1997,7 +2006,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_Usiyane/z_obj_usiyane.c b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
index 46a6b994d..23e6eb0ac 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.c
@@ -80,7 +80,7 @@ s32 func_80C07CD0(void) {
}
}
- if (CHECK_WEEKEVENTREG(WEEKEVENTREG_22_01)) {
+ if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) {
return false;
}
return true;
diff --git a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
index 92bd96549..b6ed8d0df 100644
--- a/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
+++ b/src/overlays/actors/ovl_Obj_Usiyane/z_obj_usiyane.h
@@ -9,10 +9,10 @@ typedef void (*ObjUsiyaneActionFunc)(struct ObjUsiyane*, PlayState*);
#define OBJUSIYANE_GET_F(thisx) ((thisx)->params & 0xF)
-enum {
+typedef enum {
/* 0 */ OBJUSIYANE_F_0,
- /* 1 */ OBJUSIYANE_F_1,
-};
+ /* 1 */ OBJUSIYANE_F_1
+} ObjUsiyaneParam;
typedef struct {
/* 0x00 */ Vec3f unk_00;
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..cc47113a5 100644
--- a/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
+++ b/src/overlays/actors/ovl_Obj_Warpstone/z_obj_warpstone.c
@@ -97,7 +97,7 @@ s32 ObjWarpstone_ClosedIdle(ObjWarpstone* this, PlayState* play) {
}
s32 ObjWarpstone_BeginOpeningCutscene(ObjWarpstone* this, PlayState* play) {
- if ((this->dyna.actor.csId < 0) || CutsceneManager_IsNext(this->dyna.actor.csId)) {
+ if ((this->dyna.actor.csId <= CS_ID_NONE) || CutsceneManager_IsNext(this->dyna.actor.csId)) {
CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor);
ObjWarpstone_SetupAction(this, ObjWarpstone_PlayOpeningCutscene);
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_OWL_WARP_SWITCH_ON);
@@ -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_Obj_Y2shutter/z_obj_y2shutter.h b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
index bccdce645..a1b32bbe9 100644
--- a/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
+++ b/src/overlays/actors/ovl_Obj_Y2shutter/z_obj_y2shutter.h
@@ -13,8 +13,8 @@ typedef struct ObjY2shutter {
} ObjY2shutter; // size = 0x160
typedef enum {
- /* 0x0 */ SHUTTER_BARRED,
- /* 0x1 */ SHUTTER_GRATED,
+ /* 0 */ SHUTTER_BARRED,
+ /* 1 */ SHUTTER_GRATED
} ShutterType;
#define OBJY2SHUTTER_GET_TYPE(thisx) (((thisx)->params >> 7) & 1)
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..2661b9cc5 100644
--- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
+++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c
@@ -517,6 +517,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
}
OPEN_DISPS(play->state.gfxCtx);
+
spB4 = false;
if (this->actor.params == 3) {
@@ -550,7 +551,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 +633,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);
@@ -647,8 +648,6 @@ f32 func_808DDE74(void) {
return Rand_ZeroOne() - 0.5f;
}
-#ifdef NON_MATCHING
-// s2/s3 swapped
void func_808DDE9C(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
ObjectKankyo* this = THIS;
@@ -666,7 +665,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++) {
@@ -674,32 +673,30 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = this->unk_14C[0].unk_04 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
temp_f2 = this->unk_14C[0].unk_08 + ((Rand_ZeroOne() - 0.7f) * this->unk_144);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+
+ gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
+
+ Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
+ Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
+
+ if (this->unk_114C == 0) {
+ Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
+ } else {
+ Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
-
- gSPMatrix(POLY_XLU_DISP++, &D_01000000, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
-
- Matrix_RotateYS((s16)this->unk_14C[2].unk_04 + (s16)(i << 5), MTXMODE_APPLY);
- Matrix_RotateXS((s16)this->unk_14C[2].unk_00 + (s16)(i << 5), MTXMODE_APPLY);
-
- if (this->unk_114C == 0) {
- Matrix_Scale(0.5f, 1.0f, 0.5f, MTXMODE_APPLY);
- } else {
- Matrix_Scale(2.0f, 4.0f, 2.0f, MTXMODE_APPLY);
- }
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_0706E0);
}
phi_s5 = false;
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);
@@ -710,21 +707,17 @@ void func_808DDE9C(Actor* thisx, PlayState* play2) {
temp_f22 = player->actor.floorHeight + 2.0f;
temp_f2 = this->unk_14C[1].unk_08 + (func_808DDE74() * 220.0f);
- if ((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f)) {
- continue;
+ if (!((temp_f20 < -252.0f) && (temp_f20 > -500.0f) && (temp_f2 > 3820.0f) && (temp_f2 < 4150.0f))) {
+ Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
+ temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
+ Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
-
- Matrix_Translate(temp_f20, temp_f22, temp_f2, MTXMODE_NEW);
- temp_f12 = (Rand_ZeroOne() * 0.05f) + 0.05f;
- Matrix_Scale(temp_f12, temp_f12, temp_f12, MTXMODE_APPLY);
-
- gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gEffShockwaveDL);
}
}
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Object_Kankyo/func_808DDE9C.s")
-#endif
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_Storm/z_oceff_storm.h b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
index 87a67191c..8bd3ecd65 100644
--- a/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
+++ b/src/overlays/actors/ovl_Oceff_Storm/z_oceff_storm.h
@@ -19,6 +19,6 @@ typedef struct OceffStorm {
typedef enum {
/* 1 */ OCEFF_STORM_ACTION_PARAM_1 = 1
-} OceffStormActionParams;
+} OceffStormActionParam;
#endif // Z_OCEFF_STORM_H
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_Shot_Sun/z_shot_sun.c b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
index f237bed47..69f56ef2d 100644
--- a/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
+++ b/src/overlays/actors/ovl_Shot_Sun/z_shot_sun.c
@@ -145,13 +145,14 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
s32 pad;
Vec3f spawnPos;
+ //! FAKE:
+ if (1) {}
+
if (this->collider.base.acFlags & AC_HIT) {
play_sound(NA_SE_SY_CORRECT_CHIME);
- if (1) {}
if (INV_CONTENT(ITEM_ARROW_FIRE) == ITEM_NONE) {
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_ETCETERA, 700.0f, -800.0f, 7261.0f, 0, 0, 0,
ITEM_ETC_ARROW_FIRE);
- if (1) {}
gSaveContext.cutsceneTrigger = 1;
} else {
spawnPos.x = 700.0f;
@@ -168,19 +169,19 @@ void ShotSun_UpdateHyliaSun(ShotSun* this, PlayState* play) {
return;
}
- if (!(this->actor.xzDistToPlayer > 120.0f)) {
- if ((gSaveContext.save.time >= CLOCK_TIME(6, 30)) && (gSaveContext.save.time < CLOCK_TIME(7, 30))) {
- cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
- cylinderPos.y =
- (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
- cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
-
- this->hitboxPos = cylinderPos;
-
- Collider_SetCylinderPosition(&this->collider, &cylinderPos);
- CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
- }
+ if ((this->actor.xzDistToPlayer > 120.0f) || (gSaveContext.save.time < CLOCK_TIME(6, 30)) ||
+ (gSaveContext.save.time >= CLOCK_TIME(7, 30))) {
+ return;
}
+
+ cylinderPos.x = player->bodyPartsPos[PLAYER_BODYPART_HEAD].x + (play->envCtx.sunPos.x * (1.0f / 6.0f));
+ cylinderPos.y = (player->bodyPartsPos[PLAYER_BODYPART_HEAD].y - 30.0f) + (play->envCtx.sunPos.y * (1.0f / 6.0f));
+ cylinderPos.z = player->bodyPartsPos[PLAYER_BODYPART_HEAD].z + (play->envCtx.sunPos.z * (1.0f / 6.0f));
+
+ this->hitboxPos = cylinderPos;
+
+ Collider_SetCylinderPosition(&this->collider, &cylinderPos);
+ CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
}
void ShotSun_Update(Actor* thisx, PlayState* play) {
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..01c732aa2 100644
--- a/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/src/overlays/actors/ovl_player_actor/z_player.c
@@ -3,1303 +3,20205 @@
* Overlay: ovl_player_actor
* Description: Player
*/
-
+#include "prevent_bss_reordering.h"
#include "global.h"
+#include "z64horse.h"
#include "z64quake.h"
#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->unk_1887C == 0) && (play->activeCamId == CAM_ID_MAIN)) {
+ if (!func_8082DA90(play) && (gSaveContext.timerStates[TIMER_ID_MINIGAME_2] != TIMER_STATE_STOP)) {
+ func_8082FE0C(this, play);
+ }
+ }
+ }
+ }
+ }
+
+ 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->unk_1887C != 0) {
+ return play->unk_1887C;
+ }
+
+ 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->unk_1887C == 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->unk_1887C > 0) && CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B);
+}
+
+s32 func_80830FD4(PlayState* play) {
+ return (play->unk_1887C != 0) &&
+ ((play->unk_1887C < 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->unk_1887C != 0) {
+ play->unk_1887C--;
+ } else {
+ Inventory_ChangeAmmo(item, -1);
+ }
+ }
+
+ if (play->unk_1887C == 1) {
+ play->unk_1887C = -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.retainWeatherMode = 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 {
+ gHorseIsMounted = 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 = Rand_CenteredFloat(4.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = Rand_CenteredFloat(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->unk_1887C == 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 = Rand_CenteredFloat(arg3) + arg0->x;
+ arg1->y = Rand_CenteredFloat(arg4) + (arg0->y + arg2);
+ arg1->z = Rand_CenteredFloat(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 = Rand_CenteredFloat(3.0f);
+ D_8085D27C.z = Rand_CenteredFloat(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 = Rand_CenteredFloat(3.0f);
+ velocity.y = Rand_ZeroFloat(2.0f);
+ velocity.z = Rand_CenteredFloat(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->unk_1887C = 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) {
+ func_801155B4(play, doActionB);
+ } else if (play->interfaceCtx.unk_21C != 0) {
+ play->interfaceCtx.unk_21C = 0;
+ 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--;
+ }
+
+ func_8011552C(play, doActionA);
+
+ // Set Tatl state
+ if (!Play_InCsMode(play) && (this->stateFlags2 & PLAYER_STATE2_200000) &&
+ !(this->stateFlags3 & PLAYER_STATE3_100)) {
+ if (this->targetedActor != NULL) {
+ func_80115764(play, 0x2B);
+ } else {
+ func_80115764(play, 0x2A);
+ }
+ CutsceneManager_Queue(CS_ID_GLOBAL_TALK);
+ } else {
+ func_80115764(play, 0x2C);
+ }
+ }
+}
+
+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 || (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 = (Rand_CenteredFloat(5.0f) + bodyPartsPos->x) - this->actor.world.pos.x;
+ pos.y = (Rand_CenteredFloat(5.0f) + bodyPartsPos->y) - this->actor.world.pos.y;
+ pos.z = (Rand_CenteredFloat(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) {
+ 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->unk_1887C != 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->unk_1887C != 0) {
+ if (play->sceneId == SCENE_20SICHITAI) {
+ Player_SetAction(play, this, func_80854430, 0);
+ play->unk_1887C = 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->unk_1887C == 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->unk_1887C != 0) {
+ play->func_18780(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ if (play->sceneId == 0x45) {
+ play->unk_1887C = 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;
+ gHorseIsMounted = 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.threeDayResetCount == 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->unk_1887C < 0) {
+ play->unk_1887C = 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->unk_1887C = 10;
+ func_80847880(play, this);
+ Player_SetAction(play, this, func_80854430, 1);
+ this->unk_AE7 = 1;
+ } else {
+ play->unk_1887C = 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->unk_1887C = -1;
+ func_80854614(this, play);
+ Player_SetAction(play, this, func_80854430, 0);
+ this->unk_AE7 = 0;
+ } else {
+ play->unk_1887C = 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->unk_1887C < 0) {
+ play->unk_1887C++;
+ if (play->unk_1887C == 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;
+ Message_BombersNotebookQueueEvent(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 = Rand_CenteredFloat(posInfo->range.x) + posInfo->base.x;
+ randPos.y = Rand_CenteredFloat(posInfo->range.y) + posInfo->base.y;
+ randPos.z = Rand_CenteredFloat(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_RECEIVED_PENDANT_OF_MEMORIES);
+ }
+}
+
+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..a786327fa 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
@@ -52,7 +52,7 @@ u32 EffectSsEnFire_Init(PlayState* play, u32 index, EffectSs* this, void* initPa
this->rScaleMax = initParams->scale;
- if (initParams->params & ENFIRE_PARAMS_USE_SCALE) {
+ if (initParams->params & ENFIRE_PARAM_USE_SCALE) {
this->rScale = initParams->scale;
} else {
this->rScale = 0;
@@ -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_Fire/z_eff_ss_en_fire.h b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
index 0f17477b8..491df81a5 100644
--- a/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
+++ b/src/overlays/effects/ovl_Effect_Ss_En_Fire/z_eff_ss_en_fire.h
@@ -4,7 +4,7 @@
#include "global.h"
#define ENFIRE_FLAGS_BODYPART_POS_VEC3S (1 << 15)
-#define ENFIRE_PARAMS_USE_SCALE (1 << 15)
+#define ENFIRE_PARAM_USE_SCALE (1 << 15)
typedef struct {
/* 0x00 */ Actor* actor;
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..cf019c6cf 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
@@ -60,7 +60,7 @@ u32 EffectSsEnIce_Init(PlayState* play, u32 index, EffectSs* this, void* initPar
this->rEnvColorG = initParams->envColor.g;
this->rEnvColorB = initParams->envColor.b;
this->rAlphaMode = 1;
- this->rPitch = randPlusMinusPoint5Scaled(0x10000);
+ this->rPitch = Rand_CenteredFloat(0x10000);
} else if (initParams->type == ENICE_TYPE_NORMAL) {
Math_Vec3f_Copy(&this->pos, &initParams->pos);
Math_Vec3f_Copy(&this->vec, &initParams->pos);
@@ -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,
@@ -142,7 +142,7 @@ void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) {
} else {
this->actor = NULL;
if (this->life >= 9) {
- rand = randPlusMinusPoint5Scaled(0xFFFF);
+ rand = Rand_CenteredFloat(0xFFFF);
this->accel.x = Math_SinS(rand) * (Rand_ZeroOne() + 1.0f);
this->accel.z = Math_CosS(rand) * (Rand_ZeroOne() + 1.0f);
this->life = 8;
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..4edc1e3b1 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);
}
@@ -90,9 +90,9 @@ void EffectSsFhgFlash_Update(PlayState* play, u32 index, EffectSs* this) {
Player* player = GET_PLAYER(play);
randBodyPart = Rand_ZeroFloat(PLAYER_BODYPART_MAX - 0.1f);
- this->pos.x = player->bodyPartsPos[randBodyPart].x + randPlusMinusPoint5Scaled(10.0f);
- this->pos.y = player->bodyPartsPos[randBodyPart].y + randPlusMinusPoint5Scaled(15.0f);
- this->pos.z = player->bodyPartsPos[randBodyPart].z + randPlusMinusPoint5Scaled(10.0f);
+ this->pos.x = player->bodyPartsPos[randBodyPart].x + Rand_CenteredFloat(10.0f);
+ this->pos.y = player->bodyPartsPos[randBodyPart].y + Rand_CenteredFloat(15.0f);
+ this->pos.z = player->bodyPartsPos[randBodyPart].z + Rand_CenteredFloat(10.0f);
} else if ((this->rParams >= FHGFLASH_SHOCK_GOHT_2) && (this->rParams <= FHGFLASH_SHOCK_GOHT_6)) {
s32 pad;
Vec3f* bodyPartPos;
@@ -105,9 +105,9 @@ void EffectSsFhgFlash_Update(PlayState* play, u32 index, EffectSs* this) {
bodyPartPos = &goht->unk_2F00[this->rParams][index].unk_00;
}
- this->pos.x = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->x;
- this->pos.y = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->y;
- this->pos.z = randPlusMinusPoint5Scaled(70.0f) + bodyPartPos->z;
+ this->pos.x = Rand_CenteredFloat(70.0f) + bodyPartPos->x;
+ this->pos.y = Rand_CenteredFloat(70.0f) + bodyPartPos->y;
+ this->pos.z = Rand_CenteredFloat(70.0f) + bodyPartPos->z;
}
if (this->life < 100) {
this->rAlpha -= 50;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
index c2f231269..4f8cd94fe 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h
@@ -4,30 +4,30 @@
#include "global.h"
typedef enum {
- /* 0x00 */ FHGFLASH_LIGHTBALL,
- /* 0x01 */ FHGFLASH_SHOCK
+ /* 0 */ FHGFLASH_LIGHTBALL,
+ /* 1 */ FHGFLASH_SHOCK
} FhgFlashType;
typedef enum {
- /* 0x00 */ FHGFLASH_LIGHTBALL_GREEN,
- /* 0x01 */ FHGFLASH_LIGHTBALL_LIGHTBLUE,
- /* 0x02 */ FHGFLASH_LIGHTBALL_RED,
- /* 0x03 */ FHGFLASH_LIGHTBALL_YELLOW,
- /* 0x04 */ FHGFLASH_LIGHTBALL_BLUE,
- /* 0x05 */ FHGFLASH_LIGHTBALL_PURPLE,
- /* 0x06 */ FHGFLASH_LIGHTBALL_ORANGE,
- /* 0x07 */ FHGFLASH_LIGHTBALL_WHITE1,
- /* 0x08 */ FHGFLASH_LIGHTBALL_WHITE2
+ /* 0 */ FHGFLASH_LIGHTBALL_GREEN,
+ /* 1 */ FHGFLASH_LIGHTBALL_LIGHTBLUE,
+ /* 2 */ FHGFLASH_LIGHTBALL_RED,
+ /* 3 */ FHGFLASH_LIGHTBALL_YELLOW,
+ /* 4 */ FHGFLASH_LIGHTBALL_BLUE,
+ /* 5 */ FHGFLASH_LIGHTBALL_PURPLE,
+ /* 6 */ FHGFLASH_LIGHTBALL_ORANGE,
+ /* 7 */ FHGFLASH_LIGHTBALL_WHITE1,
+ /* 8 */ FHGFLASH_LIGHTBALL_WHITE2
} FhgFlashLightBallParam;
typedef enum {
- /* 0x00 */ FHGFLASH_SHOCK_NO_ACTOR,
- /* 0x01 */ FHGFLASH_SHOCK_PLAYER,
- /* 0x02 */ FHGFLASH_SHOCK_GOHT_2,
- /* 0x03 */ FHGFLASH_SHOCK_GOHT_3,
- /* 0x04 */ FHGFLASH_SHOCK_GOHT_4,
- /* 0x05 */ FHGFLASH_SHOCK_GOHT_5,
- /* 0x06 */ FHGFLASH_SHOCK_GOHT_6
+ /* 0 */ FHGFLASH_SHOCK_NO_ACTOR,
+ /* 1 */ FHGFLASH_SHOCK_PLAYER,
+ /* 2 */ FHGFLASH_SHOCK_GOHT_2,
+ /* 3 */ FHGFLASH_SHOCK_GOHT_3,
+ /* 4 */ FHGFLASH_SHOCK_GOHT_4,
+ /* 5 */ FHGFLASH_SHOCK_GOHT_5,
+ /* 6 */ FHGFLASH_SHOCK_GOHT_6
} FhgFlashLightningParam;
typedef struct {
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..4e8f11f5c 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);
@@ -139,8 +139,8 @@ void func_80977DB4(PlayState* play, u32 index, EffectSs* this) {
void func_80977E6C(PlayState* play, u32 index, EffectSs* this) {
this->velocity.x *= 0.95f;
this->velocity.z *= 0.95f;
- this->accel.x = randPlusMinusPoint5Scaled(0.2f);
- this->accel.z = randPlusMinusPoint5Scaled(0.2f);
+ this->accel.x = Rand_CenteredFloat(0.2f);
+ this->accel.z = Rand_CenteredFloat(0.2f);
this->rEnvColorA += this->rAlphaStep;
if (this->rEnvColorA < 0) {
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..69b24c029 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
@@ -68,7 +68,7 @@ u32 EffectSsSbn_Init(PlayState* play, u32 index, EffectSs* this, void* initParam
this->rReg4 = 250;
this->rReg4Step = 30;
- this->rScale = randPlusMinusPoint5Scaled(100.0f) + (initParams->scale * 120.0f);
+ this->rScale = Rand_CenteredFloat(100.0f) + (initParams->scale * 120.0f);
if (this->rScale < 600) {
this->rScale = 600;
} else if (this->rScale > 1500) {
@@ -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..1856ba6ac 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
@@ -21,10 +21,10 @@ EffectSsInit Effect_Ss_Stone1_InitVars = {
};
typedef struct {
- /* 0x00 */ TexturePtr texture;
- /* 0x04 */ Color_RGBA8 primColor;
- /* 0x08 */ Color_RGBA8 envColor;
-} EffStoneDrawInfo;
+ /* 0x0 */ TexturePtr texture;
+ /* 0x4 */ Color_RGBA8 primColor;
+ /* 0x8 */ Color_RGBA8 envColor;
+} EffStoneDrawInfo; // size = 0xC
static EffStoneDrawInfo sDrawInfo[] = {
{ gEffStone8Tex, { 200, 0, 0, 255 }, { 0, 0, 0, 255 } },
@@ -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/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
index b50868b81..627bbd4f2 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
@@ -4,8 +4,8 @@
#include "global.h"
typedef struct {
- /* 0x00 */ Vec3f pos;
- /* 0x0C */ s32 reg0;
+ /* 0x0 */ Vec3f pos;
+ /* 0xC */ s32 reg0;
} EffectSsStone1InitParams; // size = 0x10
#endif
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/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
index 759e1511c..03bc1e81d 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.c
@@ -7,6 +7,8 @@
#include "global.h"
#include "z_fbdemo_wipe3.h"
+#define THIS ((TransitionWipe3*)thisx)
+
void* TransitionWipe3_Init(void* thisx);
void TransitionWipe3_Destroy(void* thisx);
void TransitionWipe3_Update(void* thisx, s32 updateRate);
@@ -17,37 +19,159 @@ void TransitionWipe3_SetColor(void* thisx, u32 color);
void TransitionWipe3_SetEnvColor(void* thisx, u32 color);
s32 TransitionWipe3_IsDone(void* thisx);
-#if 0
-TransitionInit TransitionWipe3_InitVars = {
- TransitionWipe3_Init,
- TransitionWipe3_Destroy,
- TransitionWipe3_Update,
- TransitionWipe3_Draw,
- TransitionWipe3_Start,
- TransitionWipe3_SetType,
- TransitionWipe3_SetColor,
- TransitionWipe3_SetEnvColor,
- TransitionWipe3_IsDone,
+#include "assets/overlays/ovl_fbdemo_wipe3/ovl_fbdemo_wipe3.c"
+
+TexturePtr sTransWipe3Textures[] = {
+ fbdemo_tex_000520, fbdemo_tex_000920, fbdemo_tex_000D20, fbdemo_tex_001120,
+ fbdemo_tex_001520, fbdemo_tex_000520, fbdemo_tex_000520, fbdemo_tex_000520,
};
-#endif
+TransitionInit TransitionWipe3_InitVars = {
+ TransitionWipe3_Init, TransitionWipe3_Destroy, TransitionWipe3_Update,
+ TransitionWipe3_Draw, TransitionWipe3_Start, TransitionWipe3_SetType,
+ TransitionWipe3_SetColor, TransitionWipe3_SetEnvColor, TransitionWipe3_IsDone,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Start.s")
+#define TRANS3_GET_SPEED(type) (type & 1)
+#define TRANS3_GET_TEX_INDEX(type) ((type >> 1) & 7)
+#define TRANS3_GET_COLOR(type) ((type >> 4) & 3)
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Init.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_DIR_IN,
+ /* 1 */ TRANS_WIPE3_DIR_OUT
+} TransitionWipe3Direction;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Destroy.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_SPEED_SLOW,
+ /* 1 */ TRANS_WIPE3_SPEED_FAST
+} TransitionWipe3Speed;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/func_80AC68B4.s")
+typedef enum {
+ /* 0 */ TRANS_WIPE3_COLOR_BLACK,
+ /* 1 */ TRANS_WIPE3_COLOR_WHITE,
+ /* 2 */ TRANS_WIPE3_COLOR_GRAY
+} TransitionWipe3Color;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Update.s")
+void TransitionWipe3_Start(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_Draw.s")
+ this->isDone = false;
+ this->curTexture = sTransWipe3Textures[this->texIndex % ARRAY_COUNTU(sTransWipe3Textures)];
+ if (this->speedType == TRANS_WIPE3_SPEED_SLOW) {
+ this->wipeSpeed = 20;
+ } else {
+ this->wipeSpeed = 10;
+ }
+ if (this->colorType == TRANS_WIPE3_COLOR_BLACK) {
+ this->color.rgba = RGBA8(0, 0, 0, 255);
+ } else if (this->colorType == TRANS_WIPE3_COLOR_WHITE) {
+ this->color.rgba = RGBA8(255, 255, 255, 255);
+ } else {
+ this->color.rgba = RGBA8(160, 160, 160, 255);
+ }
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ this->scrollY = 0;
+ } else {
+ this->scrollY = 500;
+ if (this->texIndex == 2) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_OUT);
+ }
+ }
+ 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_wipe3/TransitionWipe3_IsDone.s")
+void* TransitionWipe3_Init(void* thisx) {
+ TransitionWipe3* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetType.s")
+ bzero(this, sizeof(TransitionWipe3));
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetColor.s")
+void TransitionWipe3_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_fbdemo_wipe3/TransitionWipe3_SetEnvColor.s")
+void TransitionWipe3_UpdateScrollY(void* thisx, f32 scroll) {
+ TransitionWipe3* this = THIS;
+
+ this->scrollY = (s32)(500.0f * scroll);
+}
+
+void TransitionWipe3_Update(void* thisx, s32 updateRate) {
+ TransitionWipe3* this = THIS;
+
+ if (this->dir != TRANS_WIPE3_DIR_IN) {
+ if ((this->scrollY == 0) && (this->texIndex == 2)) {
+ func_8019F128(NA_SE_OC_SECRET_WARP_IN);
+ }
+ this->scrollY += (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY >= 500) {
+ this->scrollY = 500;
+ this->isDone = true;
+ }
+ } else {
+ this->scrollY -= (this->wipeSpeed * 3) / updateRate;
+ if (this->scrollY <= 0) {
+ this->scrollY = 0;
+ this->isDone = true;
+ }
+ }
+}
+
+void TransitionWipe3_Draw(void* thisx, Gfx** gfxP) {
+ Gfx* gfx = *gfxP;
+ Mtx* modelView = &THIS->modelView[THIS->frame];
+ f32 scale = 14.8f;
+ Gfx* texScroll;
+
+ THIS->frame ^= 1;
+ gDPPipeSync(gfx++);
+ texScroll = Gfx_BranchTexScroll(&gfx, THIS->scrollX, THIS->scrollY, 16, 64);
+ gSPSegment(gfx++, 0x09, texScroll);
+ gSPSegment(gfx++, 0x08, THIS->curTexture);
+ gDPSetColor(gfx++, G_SETPRIMCOLOR, THIS->color.rgba);
+ gDPSetColor(gfx++, G_SETENVCOLOR, THIS->color.rgba);
+ gSPMatrix(gfx++, &THIS->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
+ gSPPerspNormalize(gfx++, THIS->normal);
+ gSPMatrix(gfx++, &THIS->lookAt, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
+
+ if (scale != 1.0f) {
+ guScale(modelView, scale, scale, 1.0f);
+ gSPMatrix(gfx++, modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+ gSPDisplayList(gfx++, sTransWipe3DL);
+ gDPPipeSync(gfx++);
+ *gfxP = gfx;
+}
+
+s32 TransitionWipe3_IsDone(void* thisx) {
+ TransitionWipe3* this = THIS;
+
+ return this->isDone;
+}
+
+void TransitionWipe3_SetType(void* thisx, s32 type) {
+ TransitionWipe3* this = THIS;
+
+ if (type & TRANS_TYPE_SET_PARAMS) {
+ this->speedType = TRANS3_GET_SPEED(type);
+ this->texIndex = TRANS3_GET_TEX_INDEX(type);
+ this->colorType = TRANS3_GET_COLOR(type);
+ } else if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
+ this->dir = TRANS_WIPE3_DIR_OUT;
+ } else {
+ this->dir = TRANS_WIPE3_DIR_IN;
+ }
+}
+
+void TransitionWipe3_SetColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->color.rgba = color;
+}
+
+void TransitionWipe3_SetEnvColor(void* thisx, u32 color) {
+ TransitionWipe3* this = THIS;
+
+ this->envColor.rgba = color;
+}
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
index b023ecb8b..711f97952 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h
@@ -5,7 +5,22 @@
#include "color.h"
typedef struct {
- /* 0x000 */ char unk_0[0x120];
+ /* 0x000 */ Color_RGBA8_u32 color;
+ /* 0x008 */ Color_RGBA8_u32 envColor;
+ /* 0x004 */ u32 scrollX;
+ /* 0x00C */ s32 scrollY;
+ /* 0x010 */ s32 wipeSpeed;
+ /* 0x014 */ u8 dir;
+ /* 0x015 */ u8 colorType;
+ /* 0x016 */ u8 speedType;
+ /* 0x017 */ u8 texIndex;
+ /* 0x018 */ u8 isDone;
+ /* 0x019 */ u8 frame;
+ /* 0x01A */ u16 normal;
+ /* 0x01C */ TexturePtr curTexture;
+ /* 0x020 */ Mtx projection;
+ /* 0x060 */ Mtx lookAt;
+ /* 0x0A0 */ Mtx modelView[2];
} TransitionWipe3; // size = 0x120
#endif
diff --git a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
index 48c8bdf58..9e11df190 100644
--- a/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
+++ b/src/overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.c
@@ -81,7 +81,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
Gfx* gfx = *gfxP;
s32 width = gScreenWidth;
s32 height = gScreenHeight;
- void* sp50 = D_801FBB90;
+ void* workBuffer = gWorkBuffer;
TransitionWipe5* this = THIS;
s32 alpha = (1.0f - this->unk_0C) * 255.0f;
@@ -92,7 +92,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
- func_8014116C(&gfx, D_0F000000, sp50, width, height, 1);
+ func_8014116C(&gfx, D_0F000000, workBuffer, width, height, 1);
} else {
if (alpha == 255) {
gDPSetOtherMode(gfx++,
@@ -108,7 +108,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
ENVIRONMENT);
- func_8014116C(&gfx, sp50, D_0F000000, width, height, 0);
+ func_8014116C(&gfx, workBuffer, D_0F000000, width, height, 0);
}
gDPPipeSync(gfx++);
gSPLoadUcode(gfx++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
diff --git a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
index 845baa3cb..134c6457b 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.c
@@ -4,9 +4,10 @@
* Description: "Dawn of ... day" screen
*/
+#include "global.h"
#include "z_daytelop.h"
+#include "z64save.h"
#include "z64shrink_window.h"
-#include "z64view.h"
#include "misc/daytelop_static/daytelop_static.h"
#include "interface/icon_item_gameover_static/icon_item_gameover_static.h"
@@ -129,7 +130,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 +141,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_daytelop/z_daytelop.h b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
index a7350e898..da49827c3 100644
--- a/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
+++ b/src/overlays/gamestates/ovl_daytelop/z_daytelop.h
@@ -1,16 +1,13 @@
#ifndef Z64_DAYTELOP_H
#define Z64_DAYTELOP_H
-#include "global.h"
-
-void DayTelop_Init(GameState* thisx);
-void DayTelop_Destroy(GameState* thisx);
+#include "z64game.h"
+#include "z64view.h"
typedef struct {
/* 0x000 */ GameState state;
/* 0x0A4 */ void* daytelopStaticFile;
/* 0x0A8 */ void* gameoverStaticFile;
- /* 0x0AC */ UNK_TYPE1 unk_AC[0x4];
/* 0x0B0 */ View view;
/* 0x218 */ UNK_TYPE1 unk_218[0x28];
/* 0x240 */ s16 transitionCountdown;
@@ -24,4 +21,7 @@ typedef enum {
/* 2 */ DAYTELOP_HOURSTEXT_ON
} DaytelopFadeState;
+void DayTelop_Init(GameState* thisx);
+void DayTelop_Destroy(GameState* thisx);
+
#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h b/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
deleted file mode 100644
index f3231ec56..000000000
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.h
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef Z64_FILE_CHOOSE_H
-#define Z64_FILE_CHOOSE_H
-
-#include "global.h"
-
-void FileSelect_Init(GameState* thisx);
-void FileSelect_Destroy(GameState* thisx);
-
-typedef struct FileSelectState {
- /* 0x00000 */ GameState state;
- /* 0x000A4 */ Vtx* unk_A4;
- /* 0x000A8 */ u8* staticSegment;
- /* 0x000AC */ u8* parameterSegment;
- /* 0x000B0 */ u8* titleSegment;
- /* 0x000B8 */ View view;
- /* 0x00220 */ SramContext sramCtx;
- /* 0x00248 */ SkyboxContext skyboxCtx;
- /* 0x00470 */ MessageContext msgCtx;
- /* 0x12550 */ Font font;
- /* 0x242E0 */ EnvironmentContext envCtx;
- /* 0x243E0 */ Vtx* unk_243E0;
- /* 0x243E4 */ Vtx* unk_243E4;
- /* 0x243E8 */ u8 newf2[2][6];
- /* 0x243F4 */ u8 newf[2][6];
- /* 0x24400 */ UNK_TYPE1 unk_24400[0xC];
- /* 0x2440C */ u16 unk_2440C[2];
- /* 0x24410 */ u16 unk_24410[2];
- /* 0x24414 */ u8 unk_24414[2][8]; // playername
- /* 0x24424 */ u8 unk_24424[2][8]; // playername
- /* 0x24434 */ s16 healthCapacity[2];
- /* 0x24438 */ u16 unk_24438[2];
- /* 0x2443C */ s16 health[2];
- /* 0x24440 */ u16 unk_24440[2];
- /* 0x24444 */ u32 unk_24444[2];
- /* 0x2444C */ u32 unk_2444C[2];
- /* 0x24454 */ s8 unk_24454[2];
- /* 0x24456 */ u8 unk_24456[2];
- /* 0x24458 */ u16 unk_24458[2];
- /* 0x2445C */ u16 unk_2445C[2];
- /* 0x24460 */ s16 unk_24460[2];
- /* 0x24464 */ s16 unk_24464[2];
- /* 0x24468 */ u8 unk_24468[2];
- /* 0x2446A */ u8 unk_2446A[2];
- /* 0x2446C */ s16 rupees[2];
- /* 0x24470 */ s16 unk_24470[2];
- /* 0x24474 */ s8 unk_24474[2];
- /* 0x24476 */ s8 unk_24476[2];
- /* 0x24478 */ s8 maskCount[2];
- /* 0x2447A */ s8 unk_2447A[2];
- /* 0x2447C */ s8 heartPieceCount[2];
- /* 0x2447E */ s8 unk_2447E[2];
- /* 0x24480 */ s16 unk_24480;
- /* 0x24482 */ s16 unk_24482;
- /* 0x24484 */ s16 unk_24484;
- /* 0x24486 */ s16 unk_24486;
- /* 0x24488 */ s16 unk_24488;
- /* 0x2448A */ s16 unk_2448A;
- /* 0x2448C */ s16 unk_2448C;
- /* 0x2448E */ s16 unk_2448E;
- /* 0x24490 */ s16 unk_24490;
- /* 0x24492 */ s16 unk_24492[3];
- /* 0x24498 */ s16 unk_24498;
- /* 0x2449A */ s16 unk_2449A[6];
- /* 0x244A6 */ s16 fileNum;
- /* 0x244A8 */ s16 unk_244A8;
- /* 0x244AA */ s16 unk_244AA;
- /* 0x244AC */ s16 unk_244AC;
- /* 0x244AE */ s16 unk_244AE;
- /* 0x244B0 */ s16 unk_244B0[3];
- /* 0x244B6 */ s16 unk_244B6[2];
- /* 0x244BA */ s16 unk_244BA;
- /* 0x244BC */ s16 unk_244BC[3];
- /* 0x244C2 */ s16 unk_244C2[3];
- /* 0x244C8 */ s16 unk_244C8[3];
- /* 0x244CE */ s16 unk_244CE[3];
- /* 0x244D4 */ s16 unk_244D4[3];
- /* 0x244DA */ s16 unk_244DA[4];
- /* 0x244E2 */ s16 unk_244E2;
- /* 0x244E4 */ s16 unk_244E4;
- /* 0x244E6 */ s16 unk_244E6;
- /* 0x244E8 */ s16 unk_244E8;
- /* 0x244EA */ s16 unk_244EA[4];
- /* 0x244F2 */ s16 unk_244F2;
- /* 0x244F4 */ s16 unk_244F4;
- /* 0x244F6 */ s16 unk_244F6[2];
- /* 0x244FA */ s16 unk_244FA;
- /* 0x244FC */ s16 unk_244FC;
- /* 0x244FE */ s16 unk_244FE;
- /* 0x24500 */ s16 unk_24500;
- /* 0x24502 */ s16 unk_24502;
- /* 0x24504 */ s16 unk_24504;
- /* 0x24506 */ s16 unk_24506;
- /* 0x24508 */ s16 unk_24508;
- /* 0x2450A */ s16 unk_2450A;
- /* 0x2450C */ f32 unk_2450C;
- /* 0x24510 */ s16 unk_24510;
- /* 0x24512 */ s16 unk_24512;
- /* 0x24514 */ s16 unk_24514;
- /* 0x24516 */ s16 unk_24516;
- /* 0x24518 */ s16 unk_24518;
- /* 0x2451A */ s16 unk_2451A;
- /* 0x2451C */ s16 unk_2451C;
- /* 0x2451E */ s16 unk_2451E[5];
- /* 0x24528 */ s16 unk_24528;
- /* 0x2452A */ s16 unk_2452A;
- /* 0x2452C */ s16 unk_2452C[4];
- /* 0x24534 */ s16 unk_24534[4];
- /* 0x2453C */ s16 unk_2453C[4];
- /* 0x24544 */ s16 unk_24544[4];
- /* 0x2454C */ s16 unk_2454C;
- /* 0x2454E */ s16 unk_2454E;
- /* 0x24550 */ s16 unk_24550;
-} FileSelectState; // size = 0x24558
-
-#endif
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c
deleted file mode 100644
index 2e0e9a0d4..000000000
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_80807940.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * File: z_file_choose_80807940.c
- * Overlay: ovl_file_choose
- * Description:
- */
-
-#include "z_file_choose.h"
-#include "z64rumble.h"
-
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
-
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807940.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807A78.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807C58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808214.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808D30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80808F1C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80809DF0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80809EA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A3CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A418.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A4A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A6BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080A708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BBFC.s")
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
index da9144e7c..0cc43ad50 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c
@@ -4,96 +4,2545 @@
* Description:
*/
-#include "z_file_choose.h"
+#include "z_file_select.h"
+#include "overlays/gamestates/ovl_opening/z_opening.h"
#include "z64rumble.h"
+#include "z64save.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "interface/parameter_static/parameter_static.h"
+#include "misc/title_static/title_static.h"
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
+s32 D_808144F10 = 100;
+f32 D_808144F14 = 8.0f;
+f32 D_808144F18 = 100.0f;
+s32 D_808144F1C = 0;
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
+static Gfx sScreenFillSetupDL[] = {
+ gsDPPipeSync(),
+ gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN |
+ G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
+ 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_1PRIMITIVE,
+ G_AC_NONE | G_ZS_PIXEL | G_RM_CLD_SURF | G_RM_CLD_SURF2),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsSPEndDisplayList(),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC20.s")
+s16 sFileInfoBoxPartWidths[] = {
+ 36, 36, 36, 36, 24, 28, 28,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080bc44.s")
+s16 sWindowContentColors[] = { 100, 150, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_nop8080BC4C.s")
+s16 sFileSelectSkyboxRotation = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BC58.s")
+s16 sWalletFirstDigit[] = {
+ 1, // tens (Default Wallet)
+ 0, // hundreds (Adult Wallet)
+ 0, // hundreds (Giant Wallet)
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BDAC.s")
+void FileSelect_IncrementConfigMode(FileSelectState* this) {
+ this->configMode++;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_RenderView.s")
+void FileSelect_Noop1(void) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080BE60.s")
+void FileSelect_Noop2(FileSelectState* this) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C040.s")
+void FileSelect_InitModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C228.s")
+ if (this->configMode == CM_FADE_IN_START) {
+ if (gSaveContext.options.optionId != 0xA51D) { // Magic number?
+ this->configMode++;
+ } else {
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_FADE_IN_START;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C29C.s")
+ if (this->configMode == CM_FADE_IN_END) {
+ this->screenFillAlpha -= 40;
+ if (this->screenFillAlpha <= 0) {
+ this->screenFillAlpha = 0;
+ this->configMode++; // CM_MAIN_MENU
+ }
+ } else if (this->configMode == CM_MAIN_MENU) {
+ FileSelect_IncrementConfigMode(this); // CM_SETUP_COPY_SOURCE
+ } else {
+ this->screenFillAlpha += 40;
+ if (this->screenFillAlpha >= 255) {
+ this->screenFillAlpha = 255;
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_FADE_IN_START;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C324.s")
+void FileSelect_InitModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080C3A8.s")
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
+ FileSelect_Noop2(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D164.s")
+void FileSelect_SetView(FileSelectState* this, f32 eyeX, f32 eyeY, f32 eyeZ) {
+ Vec3f eye;
+ Vec3f lookAt;
+ Vec3f up;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D170.s")
+ eye.x = eyeX;
+ eye.y = eyeY;
+ eye.z = eyeZ;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D1BC.s")
+ lookAt.x = lookAt.y = lookAt.z = 0.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D220.s")
+ up.x = up.z = 0.0f;
+ up.y = 1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D284.s")
+ View_LookAt(&this->view, &eye, &lookAt, &up);
+ View_Apply(&this->view, VIEW_ALL | VIEW_FORCE_VIEWING | VIEW_FORCE_VIEWPORT | VIEW_FORCE_PROJECTION_PERSPECTIVE);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D2EC.s")
+Gfx* FileSelect_DrawTexQuadIA8(Gfx* gfx, TexturePtr texture, s16 width, s16 height, s16 point) {
+ gDPLoadTextureBlock(gfx++, texture, G_IM_FMT_IA, G_IM_SIZ_8b, 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);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D3D0.s")
+ gSP1Quadrangle(gfx++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D40C.s")
+ return gfx;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080D6D4.s")
+/**
+ * Fade in the menu window and title label.
+ * If a file is occupied fade in the name, name box, and connector.
+ * Fade in the copy erase and options button according to the window alpha.
+ */
+void FileSelect_FadeInMenuElements(FileSelectState* this) {
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080F25C.s")
+ this->titleAlpha[FS_TITLE_CUR] += 20;
+ this->windowAlpha += 16;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808108DC.s")
+ for (i = 0; i < 3; i++) {
+ this->fileButtonAlpha[i] = this->windowAlpha;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80811CB8.s")
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->windowAlpha;
+ this->connectorAlpha[i] += 20;
+ if (this->connectorAlpha[i] >= 255) {
+ this->connectorAlpha[i] = 255;
+ }
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->windowAlpha;
+ this->connectorAlpha[i] += 20;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812460.s")
+ if (this->connectorAlpha[i] >= 255) {
+ this->connectorAlpha[i] = 255;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812668.s")
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->windowAlpha;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812760.s")
+/**
+ * Converts a numerical value to hundreds-tens-ones digits
+ */
+void FileSelect_SplitNumber(u16 value, u16* hundreds, u16* tens, u16* ones) {
+ *hundreds = 0;
+ *tens = 0;
+ *ones = value;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812840.s")
+ do {
+ if ((*ones - 100) < 0) {
+ break;
+ }
+ (*hundreds)++;
+ *ones -= 100;
+ } while (true);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812980.s")
+ do {
+ if ((*ones - 10) < 0) {
+ break;
+ }
+ (*tens)++;
+ *ones -= 10;
+ } while (true);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812A6C.s")
+// Start of Config Mode Update Functions
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812D44.s")
+/**
+ * Reduce the alpha of the black screen fill to create a fade in effect.
+ * Additionally, slide the window from the right to the center of the screen.
+ * Update function for `CM_FADE_IN_START`
+ */
+void FileSelect_StartFadeIn(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812D94.s")
+ FileSelect_FadeInMenuElements(this);
+ this->screenFillAlpha -= 40;
+ this->windowPosX -= 20;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812E94.s")
+ if (this->windowPosX <= -94) {
+ this->windowPosX = -94;
+ this->configMode = CM_FADE_IN_END;
+ this->screenFillAlpha = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80812ED0.s")
+/**
+ * Finish fading in the remaining menu elements.
+ * Fade in the controls text at the bottom of the screen.
+ * Update function for `CM_FADE_IN_END`
+ */
+void FileSelect_FinishFadeIn(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_UpdateAndDrawSkybox.s")
+ this->controlsAlpha += 20;
+ FileSelect_FadeInMenuElements(this);
-void FileSelect_Main(GameState* thisx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Main.s")
+ if (this->titleAlpha[FS_TITLE_CUR] >= 255) {
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->controlsAlpha = 255;
+ this->windowAlpha = 200;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80813908.s")
+u8 sEmptyName[] = { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Destroy.s")
+/**
+ * Update the cursor and wait for the player to select a button to change menus accordingly.
+ * If an empty file is selected, enter the name entry config mode.
+ * If an occupied file is selected, enter the `Select` menu mode.
+ * If copy, erase, or options is selected, set config mode accordingly.
+ * Lastly, set any warning labels if appropriate.
+ * Update function for `CM_MAIN_MENU`
+ */
+void FileSelect_UpdateMainMenu(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_Init.s")
+ if (CHECK_BTN_ALL(input->press.button, BTN_START) || CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ if (this->buttonIndex <= FS_BTN_MAIN_FILE_3) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_ROTATE_TO_NAME_ENTRY;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->charPage = FS_CHAR_PAGE_HIRA;
+ if (gSaveContext.options.language != 0) {
+ this->charPage = FS_CHAR_PAGE_ENG;
+ }
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charIndex = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ this->nameEntryBoxAlpha = 0;
+ Lib_MemCpy(&this->fileNames[this->buttonIndex], &sEmptyName, ARRAY_COUNT(sEmptyName));
+ } else {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->actionTimer = 4;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ this->selectedFileIndex = this->buttonIndex;
+ this->menuMode = FS_MENU_MODE_SELECT;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_ROTATE_TO_NAME_ENTRY;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->charPage = FS_CHAR_PAGE_HIRA;
+ if (gSaveContext.options.language != 0) {
+ this->charPage = FS_CHAR_PAGE_ENG;
+ }
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charIndex = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ this->nameEntryBoxAlpha = 0;
+ Lib_MemCpy(&this->fileNames[this->buttonIndex], &sEmptyName, ARRAY_COUNT(sEmptyName));
+ } else {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->actionTimer = 4;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ this->selectedFileIndex = this->buttonIndex;
+ this->menuMode = FS_MENU_MODE_SELECT;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+ }
+ } else if (this->warningLabel == FS_WARNING_NONE) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->prevConfigMode = this->configMode;
+
+ if (this->buttonIndex == FS_BTN_MAIN_COPY) {
+ this->configMode = CM_SETUP_COPY_SOURCE;
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ } else if (this->buttonIndex == FS_BTN_MAIN_ERASE) {
+ this->configMode = CM_SETUP_ERASE_SELECT;
+ this->nextTitleLabel = FS_TITLE_ERASE_FILE;
+ } else {
+ this->configMode = CM_MAIN_TO_OPTIONS;
+ this->kbdButton = FS_KBD_BTN_HIRA;
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->charBgAlpha = 0;
+ this->newFileNameCharCount = 0;
+ this->nameEntryBoxPosX = 120;
+ }
+ this->actionTimer = 4;
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ gSaveContext.gameMode = GAMEMODE_TITLE_SCREEN;
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, sizeof(TitleSetupState));
+ } else {
+ if (ABS_ALT(this->stickAdjY) > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY > 30) {
+ this->buttonIndex--;
+ if (this->buttonIndex == FS_BTN_MAIN_FILE_3) {
+ this->buttonIndex = FS_BTN_MAIN_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_MAIN_FILE_1) {
+ this->buttonIndex = FS_BTN_MAIN_OPTIONS;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex == FS_BTN_MAIN_FILE_3) {
+ this->buttonIndex = FS_BTN_MAIN_COPY;
+ }
+ if (this->buttonIndex > FS_BTN_MAIN_OPTIONS) {
+ this->buttonIndex = FS_BTN_MAIN_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex == FS_BTN_MAIN_COPY) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && !NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ !NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_COPY;
+ this->emptyFileTextAlpha = 255;
+ } else if (NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_EMPTY_FILES;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ if (!SLOT_OCCUPIED(this, 0) && !SLOT_OCCUPIED(this, 1) && !SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_COPY;
+ this->emptyFileTextAlpha = 255;
+ } else if (SLOT_OCCUPIED(this, 0) && SLOT_OCCUPIED(this, 1) && SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_EMPTY_FILES;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ } else if (this->buttonIndex == FS_BTN_MAIN_ERASE) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, 0) && !NO_FLASH_SLOT_OCCUPIED(sramCtx, 1) &&
+ !NO_FLASH_SLOT_OCCUPIED(sramCtx, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_ERASE;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ if (!SLOT_OCCUPIED(this, 0) && !SLOT_OCCUPIED(this, 1) && !SLOT_OCCUPIED(this, 2)) {
+ this->warningButtonIndex = this->buttonIndex;
+ this->warningLabel = FS_WARNING_NO_FILE_ERASE;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+}
+
+/**
+ * Update function for `CM_UNUSED_31`
+ */
+void FileSelect_UnusedCM31(GameState* thisx) {
+}
+
+/**
+ * Delay the next config mode from running until `D_80814564` reaches 254.
+ * Because the timer increments by 2, the delay is 127 frames (assuming the value was not changed by reg editor).
+ * Unused in the final game, was possibly used for debugging.
+ * Update function for `CM_UNUSED_DELAY`
+ */
+void FileSelect_UnusedCMDelay(GameState* thisx) {
+ static s16 D_80814564 = 0;
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ D_80814564 += 2;
+
+ if (D_80814564 == 254) {
+ this->configMode = this->nextConfigMode;
+ D_80814564 = 0;
+ }
+}
+
+/**
+ * Rotate the window from the main menu to the name entry menu.
+ * Update function for `CM_ROTATE_TO_NAME_ENTRY`
+ */
+void FileSelect_RotateToNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 314.0f) {
+ this->windowRot = 314.0f;
+ this->configMode = CM_START_NAME_ENTRY;
+ }
+}
+
+/**
+ * Rotate the window from the main menu to the options menu.
+ * Update function for `CM_MAIN_TO_OPTIONS`
+ */
+void FileSelect_RotateToOptions(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 314.0f) {
+ this->windowRot = 314.0f;
+ this->configMode = CM_START_OPTIONS;
+ }
+}
+
+/**
+ * Rotate the window from the options menu to the main menu.
+ * Update function for `CM_NAME_ENTRY_TO_MAIN` and `CM_OPTIONS_TO_MAIN`
+ */
+void FileSelect_RotateToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->windowRot += 50.0f;
+
+ if (this->windowRot >= 628.0f) {
+ this->windowRot = 0.0f;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
+
+void (*sConfigModeUpdateFuncs[])(GameState*) = {
+ // Main Menu
+ FileSelect_StartFadeIn, // CM_FADE_IN_START
+ FileSelect_FinishFadeIn, // CM_FADE_IN_END
+ FileSelect_UpdateMainMenu, // CM_MAIN_MENU
+ // Copy File
+ FileSelect_SetupCopySource, // CM_SETUP_COPY_SOURCE
+ FileSelect_SelectCopySource, // CM_SELECT_COPY_SOURCE
+ FileSelect_SetupCopyDest1, // CM_SETUP_COPY_DEST_1
+ FileSelect_SetupCopyDest2, // CM_SETUP_COPY_DEST_2
+ FileSelect_SelectCopyDest, // CM_SELECT_COPY_DEST
+ FileSelect_ExitToCopySource1, // CM_EXIT_TO_COPY_SOURCE_1
+ FileSelect_ExitToCopySource2, // CM_EXIT_TO_COPY_SOURCE_2
+ FileSelect_SetupCopyConfirm1, // CM_SETUP_COPY_CONFIRM_1
+ FileSelect_SetupCopyConfirm2, // CM_SETUP_COPY_CONFIRM_2
+ FileSelect_CopyConfirm, // CM_COPY_CONFIRM
+ FileSelect_CopyWaitForFlashSave, // CM_COPY_WAIT_FOR_FLASH_SAVE
+ FileSelect_ReturnToCopyDest, // CM_RETURN_TO_COPY_DEST
+ FileSelect_CopyAnim1, // CM_COPY_ANIM_1
+ FileSelect_CopyAnim2, // CM_COPY_ANIM_2
+ FileSelect_CopyAnim3, // CM_COPY_ANIM_3
+ FileSelect_CopyAnim4, // CM_COPY_ANIM_4
+ FileSelect_CopyAnim5, // CM_COPY_ANIM_5
+ FileSelect_ExitCopyToMain, // CM_COPY_RETURN_MAIN
+ // Erase File
+ FileSelect_SetupEraseSelect, // CM_SETUP_ERASE_SELECT
+ FileSelect_EraseSelect, // CM_ERASE_SELECT
+ FileSelect_SetupEraseConfirm1, // CM_SETUP_ERASE_CONFIRM_1
+ FileSelect_SetupEraseConfirm2, // CM_SETUP_ERASE_CONFIRM_2
+ FileSelect_EraseConfirm, // CM_ERASE_CONFIRM
+ FileSelect_ExitToEraseSelect1, // CM_EXIT_TO_ERASE_SELECT_1
+ FileSelect_ExitToEraseSelect2, // CM_EXIT_TO_ERASE_SELECT_2
+ FileSelect_EraseAnim1, // CM_ERASE_ANIM_1
+ FileSelect_EraseWaitForFlashSave, // CM_ERASE_WAIT_FOR_FLASH_SAVE
+ FileSelect_EraseAnim2, // CM_ERASE_ANIM_2
+ FileSelect_EraseAnim3, // CM_ERASE_ANIM_3
+ FileSelect_ExitEraseToMain, // CM_EXIT_ERASE_TO_MAIN
+ FileSelect_UnusedCM31, // CM_UNUSED_31
+ // New File Name Entry
+ FileSelect_RotateToNameEntry, // CM_ROTATE_TO_NAME_ENTRY
+ FileSelect_StartNameEntry, // CM_START_NAME_ENTRY
+ FileSelect_UpdateKeyboardCursor, // CM_NAME_ENTRY
+ FileSelect_NameEntryWaitForFlashSave, // CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE
+ FileSelect_RotateToMain, // CM_NAME_ENTRY_TO_MAIN
+ // Options
+ FileSelect_RotateToOptions, // CM_MAIN_TO_OPTIONS
+ FileSelect_StartOptions, // CM_START_OPTIONS
+ FileSelect_UpdateOptionsMenu, // CM_OPTIONS_MENU
+ FileSelect_OptionsWaitForFlashSave, // CM_OPTIONS_WAIT_FOR_FLASH_SAVE
+ FileSelect_RotateToMain, // CM_OPTIONS_TO_MAIN
+ // Possible Debug
+ FileSelect_UnusedCMDelay, // CM_UNUSED_DELAY
+};
+
+s16 sCursorAlphaTargets[] = { 70, 200 };
+
+/**
+ * Updates the alpha of the cursor to make it pulsate.
+ */
+void FileSelect_PulsateCursor(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 alphaStep =
+ ABS_ALT(this->highlightColor[3] - sCursorAlphaTargets[this->highlightPulseDir]) / this->highlightTimer;
+
+ if (this->highlightColor[3] >= sCursorAlphaTargets[this->highlightPulseDir]) {
+ this->highlightColor[3] -= alphaStep;
+ } else {
+ this->highlightColor[3] += alphaStep;
+ }
+
+ this->highlightTimer--;
+
+ if (this->highlightTimer == 0) {
+ this->highlightColor[3] = sCursorAlphaTargets[this->highlightPulseDir];
+ this->highlightTimer = 20;
+ this->highlightPulseDir ^= 1;
+ }
+}
+
+void FileSelect_ConfigModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ sConfigModeUpdateFuncs[this->configMode](&this->state);
+}
+
+void FileSelect_SetWindowVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s16 j;
+ s16 x;
+ s32 tmp;
+ s32 tmp2;
+ s32 tmp3;
+
+ this->windowVtx = GRAPH_ALLOC(this->state.gfxCtx, 80 * sizeof(Vtx));
+ tmp = this->windowPosX - 90;
+
+ for (x = 0, i = 0; i < 4; i++) {
+ tmp += 0x40;
+ tmp2 = (i == 3) ? 0x30 : 0x40;
+
+ for (j = 0, tmp3 = 0x50; j < 5; j++, x += 4, tmp3 -= 0x20) {
+ this->windowVtx[x].v.ob[0] = this->windowVtx[x + 2].v.ob[0] = tmp;
+
+ this->windowVtx[x + 1].v.ob[0] = this->windowVtx[x + 3].v.ob[0] = tmp2 + tmp;
+
+ this->windowVtx[x].v.ob[1] = this->windowVtx[x + 1].v.ob[1] = tmp3;
+
+ this->windowVtx[x + 2].v.ob[1] = this->windowVtx[x + 3].v.ob[1] = tmp3 - 0x20;
+
+ this->windowVtx[x].v.ob[2] = this->windowVtx[x + 1].v.ob[2] = this->windowVtx[x + 2].v.ob[2] =
+ this->windowVtx[x + 3].v.ob[2] = 0;
+
+ this->windowVtx[x].v.flag = this->windowVtx[x + 1].v.flag = this->windowVtx[x + 2].v.flag =
+ this->windowVtx[x + 3].v.flag = 0;
+
+ this->windowVtx[x].v.tc[0] = this->windowVtx[x].v.tc[1] = this->windowVtx[x + 1].v.tc[1] =
+ this->windowVtx[x + 2].v.tc[0] = 0;
+
+ this->windowVtx[x + 1].v.tc[0] = this->windowVtx[x + 3].v.tc[0] = tmp2 << 5;
+
+ this->windowVtx[x + 2].v.tc[1] = this->windowVtx[x + 3].v.tc[1] = 32 << 5;
+
+ this->windowVtx[x].v.cn[0] = this->windowVtx[x + 2].v.cn[0] = this->windowVtx[x].v.cn[1] =
+ this->windowVtx[x + 2].v.cn[1] = this->windowVtx[x].v.cn[2] = this->windowVtx[x + 2].v.cn[2] =
+ this->windowVtx[x + 1].v.cn[0] = this->windowVtx[x + 3].v.cn[0] = this->windowVtx[x + 1].v.cn[1] =
+ this->windowVtx[x + 3].v.cn[1] = this->windowVtx[x + 1].v.cn[2] =
+ this->windowVtx[x + 3].v.cn[2] = this->windowVtx[x].v.cn[3] =
+ this->windowVtx[x + 2].v.cn[3] = this->windowVtx[x + 1].v.cn[3] =
+ this->windowVtx[x + 3].v.cn[3] = 255;
+ }
+ }
+}
+
+s16 D_80814620[] = { 8, 8, 8, 0 };
+s16 D_80814628[] = { 12, 12, 12, 0 };
+s16 D_80814630[] = { 12, 12, 12, 0 };
+s16 D_80814638[] = {
+ 88, 104, 120, 940, 944, 948,
+};
+s16 D_80814644[] = { 88, 104, 120, 944 };
+s16 D_8081464C[] = { 940, 944 };
+s16 D_80814650[] = { 940, 944 };
+
+/*
+ * fileSelect->windowContentVtx[0] -> Title Label (4)
+ *
+ * fileSelect->windowContentVtx[4] -> File 1 InfoBox (28)
+ * fileSelect->windowContentVtx[32] -> File 2 InfoBox (28)
+ * fileSelect->windowContentVtx[60] -> File 3 InfoBox (28)
+ *
+ * ** FILE 1 **
+ *
+ * fileSelect->windowContentVtx[88] -> File Button
+ * fileSelect->windowContentVtx[92] -> File Name Box
+ * fileSelect->windowContentVtx[96] -> Connectors
+ * fileSelect->windowContentVtx[100] -> Blank Button (Owl Save)
+ *
+ * ** FILE 2 **
+ *
+ * fileSelect->windowContentVtx[104] -> Repeat of File 1 above
+ *
+ * ** FILE 3 **
+ *
+ * fileSelect->windowContentVtx[120] -> Repeat of File 1 above
+ *
+ * ** FILE 1 Info **
+ *
+ * fileSelect->windowContentVtx[136] -> File Name (32)
+ * fileSelect->windowContentVtx[168] -> File Name Shadow (32)
+ * fileSelect->windowContentVtx[200] -> Rupee Digits (12)
+ * fileSelect->windowContentVtx[212] -> Rupee Digits Shadow (12)
+ * fileSelect->windowContentVtx[224] -> Mask Count (8)
+ * fileSelect->windowContentVtx[232] -> Mask Count Shadow (8)
+ * fileSelect->windowContentVtx[240] -> Hearts (80)
+ * fileSelect->windowContentVtx[320] -> Remains (16)
+ * fileSelect->windowContentVtx[336] -> Rupee Icon (4)
+ * fileSelect->windowContentVtx[340] -> Heart Piece Count (4)
+ * fileSelect->windowContentVtx[344] -> Mask Text (8)
+ * fileSelect->windowContentVtx[352] -> Owl Save Icon (4)
+ * fileSelect->windowContentVtx[356] -> Day Text (8)
+ * fileSelect->windowContentVtx[364] -> Time Digits (20)
+ * fileSelect->windowContentVtx[384] -> Time Digits Shadow (20)
+ *
+ * ** FILE 2 Info **
+ *
+ * fileSelect->windowContentVtx[404] -> Repeat of File 1 above
+ *
+ * ** FILE 3 Info **
+ *
+ * fileSelect->windowContentVtx[672] -> Repeat of File 1 above
+ *
+ * fileSelect->windowContentVtx[940] -> Action buttons (copy/erase/yes/quit)
+ * fileSelect->windowContentVtx[944] -> Action buttons (copy/erase/yes/quit)
+ * fileSelect->windowContentVtx[948] -> Option Button
+ * fileSelect->windowContentVtx[952] -> Highlight over currently selected button
+ * fileSelect->windowContentVtx[956] -> Warning labels
+ */
+
+#ifdef NON_MATCHING
+// regalloc at the beginning is fixed by removing FAKE: labelled code
+void FileSelect_SetWindowContentVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ u16 vtxId;
+ s16 j;
+ s16 index;
+ s16 spAC;
+ s16 i; // a3
+ u16 spA4[3];
+ u16* ptr;
+ s32 posY; // sp9C
+ s32 relPosY; // sp98
+ s32 tempPosY;
+ s32 posX; // s1
+ s32 temp_t5;
+
+ this->windowContentVtx = GRAPH_ALLOC(this->state.gfxCtx, 960 * sizeof(Vtx));
+
+ // Initialize all windowContentVtx
+ for (vtxId = 0; vtxId < 960; vtxId += 4) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = 0x12C;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 16;
+
+ // y-coord (top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = 0;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 16;
+
+ // z-coordinate
+ this->windowContentVtx[vtxId + 0].v.ob[2] = this->windowContentVtx[vtxId + 1].v.ob[2] =
+ this->windowContentVtx[vtxId + 2].v.ob[2] = this->windowContentVtx[vtxId + 3].v.ob[2] = 0;
+
+ //! FAKE:
+ if (index && index && index) {}
+
+ // flag
+ this->windowContentVtx[vtxId + 0].v.flag = this->windowContentVtx[vtxId + 1].v.flag =
+ this->windowContentVtx[vtxId + 2].v.flag = this->windowContentVtx[vtxId + 3].v.flag = 0;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 0].v.tc[0] = this->windowContentVtx[vtxId + 0].v.tc[1] =
+ this->windowContentVtx[vtxId + 1].v.tc[1] = this->windowContentVtx[vtxId + 2].v.tc[0] = 0;
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 2].v.tc[1] =
+ this->windowContentVtx[vtxId + 3].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ // alpha
+ this->windowContentVtx[vtxId + 0].v.cn[0] = this->windowContentVtx[vtxId + 1].v.cn[0] =
+ this->windowContentVtx[vtxId + 2].v.cn[0] = this->windowContentVtx[vtxId + 3].v.cn[0] =
+ this->windowContentVtx[vtxId + 0].v.cn[1] = this->windowContentVtx[vtxId + 1].v.cn[1] =
+ this->windowContentVtx[vtxId + 2].v.cn[1] = this->windowContentVtx[vtxId + 3].v.cn[1] =
+ this->windowContentVtx[vtxId + 0].v.cn[2] = this->windowContentVtx[vtxId + 1].v.cn[2] =
+ this->windowContentVtx[vtxId + 2].v.cn[2] = this->windowContentVtx[vtxId + 3].v.cn[2] =
+ this->windowContentVtx[vtxId + 0].v.cn[3] = this->windowContentVtx[vtxId + 1].v.cn[3] =
+ this->windowContentVtx[vtxId + 2].v.cn[3] =
+ this->windowContentVtx[vtxId + 3].v.cn[3] = 255;
+ }
+
+ /** Title Label **/
+
+ // x-coord (left)
+ this->windowContentVtx[0].v.ob[0] = this->windowContentVtx[2].v.ob[0] = this->windowPosX;
+ // x-coord (right)
+ this->windowContentVtx[1].v.ob[0] = this->windowContentVtx[3].v.ob[0] = this->windowContentVtx[0].v.ob[0] + 0x80;
+ // y-coord (top)
+ this->windowContentVtx[0].v.ob[1] = this->windowContentVtx[1].v.ob[1] = 0x48;
+ // y-coord (bottom)
+ this->windowContentVtx[2].v.ob[1] = this->windowContentVtx[3].v.ob[1] = this->windowContentVtx[0].v.ob[1] - 0x10;
+ // texture coordinates
+ this->windowContentVtx[1].v.tc[0] = this->windowContentVtx[3].v.tc[0] = 0x1000;
+
+ /** File InfoBox **/
+
+ // Loop through 3 files
+ for (vtxId = 4, i = 0; i < 3; i++) {
+ posX = this->windowPosX - 6;
+
+ // Loop through 7 textures
+ for (j = 0; j < 7; j++, vtxId += 4) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + sFileInfoBoxPartWidths[j];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->fileNamesY[i] + 0x2C;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x38;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] =
+ sFileInfoBoxPartWidths[j] << 5;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x700;
+
+ // Update X position
+ posX += sFileInfoBoxPartWidths[j];
+ }
+ }
+
+ // File Buttons
+
+ posX = this->windowPosX - 6;
+ posY = 44;
+
+ // Loop through 3 files
+ for (j = 0; j < 3; j++, vtxId += 16, posY -= 0x10) {
+
+ /* File Button */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+
+ /* File Name Box */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] = posX + 0x40;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x6C;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0xD80;
+
+ /* Connectors */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 8].v.ob[0] = this->windowContentVtx[vtxId + 10].v.ob[0] = posX + 0x34;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 9].v.ob[0] = this->windowContentVtx[vtxId + 11].v.ob[0] =
+ this->windowContentVtx[vtxId + 8].v.ob[0] + 0x18;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 8].v.ob[1] = this->windowContentVtx[vtxId + 9].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 10].v.ob[1] = this->windowContentVtx[vtxId + 11].v.ob[1] =
+ this->windowContentVtx[vtxId + 8].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 9].v.tc[0] = this->windowContentVtx[vtxId + 11].v.tc[0] = 0x300;
+
+ /* Blank Button (Owl Save) */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 12].v.ob[0] = this->windowContentVtx[vtxId + 14].v.ob[0] = posX + 0xA9;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 13].v.ob[0] = this->windowContentVtx[vtxId + 15].v.ob[0] =
+ this->windowContentVtx[vtxId + 12].v.ob[0] + 0x34;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 12].v.ob[1] = this->windowContentVtx[vtxId + 13].v.ob[1] =
+ this->buttonYOffsets[j] + posY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 14].v.ob[1] = this->windowContentVtx[vtxId + 15].v.ob[1] =
+ this->windowContentVtx[vtxId + 12].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 13].v.tc[0] = this->windowContentVtx[vtxId + 15].v.tc[0] = 0x680;
+ }
+
+ posY = 44;
+
+ // Loop through 3 files
+ for (j = 0; j < 3; j++, posY -= 16) {
+ if (!gSaveContext.flashSaveAvailable) {
+ // Should skip vtxId
+ // vtxId += 268;
+ continue;
+ }
+
+ // Account for owl-save offset
+
+ spAC = j;
+ if (this->isOwlSave[j + 2]) {
+ spAC = j + 2;
+ }
+
+ /* File name */
+
+ posX = this->windowPosX - 6;
+
+ if ((this->configMode == 0x10) && (j == this->copyDestFileIndex)) {
+ relPosY = this->fileNamesY[j] + 0x2C;
+ } else if (((this->configMode == 0x11) || (this->configMode == 0x12)) && (j == this->copyDestFileIndex)) {
+ relPosY = this->buttonYOffsets[j] + posY;
+ } else {
+ relPosY = posY + this->buttonYOffsets[j] + this->fileNamesY[j];
+ }
+
+ tempPosY = relPosY - 2;
+
+ // Loop through 8 characters of file name
+ for (i = 0; i < 8; i++, vtxId += 4) {
+
+ index = this->fileNames[j][i];
+
+ /* File Name */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[index] + posX + 0x4E;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xB;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ /* File Name Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 32].v.ob[0] = this->windowContentVtx[vtxId + 34].v.ob[0] =
+ D_80814280[index] + posX + 0x4F;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 33].v.ob[0] = this->windowContentVtx[vtxId + 35].v.ob[0] =
+ this->windowContentVtx[vtxId + 32].v.ob[0] + 0xB;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 32].v.ob[1] = this->windowContentVtx[vtxId + 33].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 34].v.ob[1] = this->windowContentVtx[vtxId + 35].v.ob[1] =
+ this->windowContentVtx[vtxId + 32].v.ob[1] - 0xC;
+
+ // Update X position
+ posX += 10;
+ }
+ // Account for the shadow
+ vtxId += 32;
+
+ /* Rupee Digits */
+
+ posX = this->windowPosX + 14;
+ tempPosY = relPosY - 0x18;
+
+ FileSelect_SplitNumber(this->rupees[spAC], &spA4[0], &spA4[1], &spA4[2]);
+
+ index = sWalletFirstDigit[this->walletUpgrades[spAC]];
+
+ ptr = &spA4[index];
+
+ for (i = 0; i < 3; i++, vtxId += 4, ptr++) {
+
+ /* Rupee Digits */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[*ptr] + posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - D_80814630[i];
+
+ /* Rupee Digits Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 12].v.ob[0] = this->windowContentVtx[vtxId + 14].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 13].v.ob[0] = this->windowContentVtx[vtxId + 15].v.ob[0] =
+ this->windowContentVtx[vtxId + 12].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 12].v.ob[1] = this->windowContentVtx[vtxId + 13].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 14].v.ob[1] = this->windowContentVtx[vtxId + 15].v.ob[1] =
+ this->windowContentVtx[vtxId + 12].v.ob[1] - D_80814630[i];
+
+ // Update X position
+ posX += D_80814620[i];
+ }
+
+ // Account for the shadow
+ vtxId += 12;
+
+ /* Mask Count */
+
+ posX = this->windowPosX + 42;
+ tempPosY = relPosY - 0x2A;
+
+ FileSelect_SplitNumber(this->maskCount[spAC], &spA4[0], &spA4[1], &spA4[2]);
+
+ for (i = 1; i < 3; i++, vtxId += 4) {
+
+ /* Mask Count */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] =
+ D_80814280[spA4[i]] + posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - D_80814630[i];
+
+ /* Mask Count Shadow */
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 8].v.ob[0] = this->windowContentVtx[vtxId + 10].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 9].v.ob[0] = this->windowContentVtx[vtxId + 11].v.ob[0] =
+ this->windowContentVtx[vtxId + 8].v.ob[0] + D_80814628[i];
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 8].v.ob[1] = this->windowContentVtx[vtxId + 9].v.ob[1] = tempPosY - 1;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 10].v.ob[1] = this->windowContentVtx[vtxId + 11].v.ob[1] =
+ this->windowContentVtx[vtxId + 8].v.ob[1] - D_80814630[i];
+
+ // Update X position
+ posX += D_80814620[i];
+ }
+
+ // Account for the shadow
+ vtxId += 8;
+
+ /* Hearts */
+
+ posX = this->windowPosX + 63;
+ tempPosY = relPosY - 0x10;
+
+ // Loop through 20 hearts
+ for (i = 0; i < 20; i++, vtxId += 4, posX += 9) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xA;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xA;
+
+ // New row of hearts next iteration
+ if (i == 9) {
+ posX = this->windowPosX + (63 - 9);
+ tempPosY -= 8;
+ }
+ }
+
+ /* Quest Remains */
+
+ posX = this->windowPosX + 64;
+ tempPosY = relPosY - 0x20;
+
+ // Loop through 4 Remains
+ for (i = 0; i < 4; i++, vtxId += 4, posX += 0x18) {
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x14;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x14;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 2].v.tc[1] =
+ this->windowContentVtx[vtxId + 3].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x400;
+ }
+
+ /* Rupee Icon */
+
+ // posX = this->windowPosX - 1;
+ tempPosY = relPosY - 0x15;
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 1;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x10;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x200;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ vtxId += 4;
+
+ /* Heart Piece Count */
+
+ // posX = this->windowPosX + 0x27;
+ tempPosY = relPosY - 0x15;
+
+ // x-coord (left)
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX + 0x27;
+ // x-coord (right)
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x18;
+
+ // y-coord(top)
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+ // y-coord (bottom)
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ // texture coordinates
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x300;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ vtxId += 4;
+
+ /* Mask Text */
+
+ // posX = this->windowPosX - 10;
+ tempPosY = relPosY - 0x27;
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 10;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x200;
+
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 1;
+
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] = tempPosY - 1;
+
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0x800;
+ this->windowContentVtx[vtxId + 6].v.tc[1] = this->windowContentVtx[vtxId + 7].v.tc[1] = 0x200;
+
+ vtxId += 8;
+
+ /* Owl Save Icon */
+
+ posX = this->windowPosX + 0xA3;
+
+ if ((this->configMode == 0x10) && (j == this->copyDestFileIndex)) {
+ tempPosY = this->fileNamesY[j] + 0x2C;
+ } else if (((this->configMode == 0x11) || (this->configMode == 0x12)) && (j == this->copyDestFileIndex)) {
+ tempPosY = this->buttonYOffsets[j] + posY;
+ } else {
+ tempPosY = posY + this->buttonYOffsets[j] + this->fileNamesY[j];
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX + 0xE;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x18;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - 2;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x300;
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x180;
+
+ vtxId += 4;
+
+ /* Day Text */
+
+ for (i = 0; i < 2; i++, vtxId += 4) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = 2 + posX + i;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x30;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - i - 0x12;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x18;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x600;
+
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x300;
+ }
+
+ /* Time Digits */
+
+ posX += 6;
+ temp_t5 = vtxId;
+
+ for (i = 0; i < 5; i++, vtxId += 4, posX += 8) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0xC;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] = tempPosY - 0x2A;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0xC;
+
+ this->windowContentVtx[vtxId + 0x14].v.ob[0] = this->windowContentVtx[vtxId + 0x16].v.ob[0] = posX + 1;
+
+ this->windowContentVtx[vtxId + 0x15].v.ob[0] = this->windowContentVtx[vtxId + 0x17].v.ob[0] =
+ this->windowContentVtx[vtxId + 0x14].v.ob[0] + 0xC;
+
+ this->windowContentVtx[vtxId + 0x14].v.ob[1] = this->windowContentVtx[vtxId + 0x15].v.ob[1] =
+ tempPosY - 0x2B;
+
+ this->windowContentVtx[vtxId + 0x16].v.ob[1] = this->windowContentVtx[vtxId + 0x17].v.ob[1] =
+ this->windowContentVtx[vtxId + 0x14].v.ob[1] - 0xC;
+ }
+
+ // Adjust the colon to the right
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] = this->windowContentVtx[temp_t5 + 10].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 3;
+
+ this->windowContentVtx[temp_t5 + 9].v.ob[0] = this->windowContentVtx[temp_t5 + 11].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 0xC;
+
+ this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1E].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 8].v.ob[0] + 1;
+
+ this->windowContentVtx[temp_t5 + 0x1D].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1F].v.ob[0] =
+ this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] + 0xC;
+
+ vtxId += 20;
+ }
+
+ posX = this->windowPosX - 6;
+ posY = -0xC;
+
+ for (j = 0; j < 2; j++, vtxId += 4, posY -= 0x10) {
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[j + 3] + posY;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = posX;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x40;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->buttonYOffsets[5] - 0x34;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x800;
+
+ vtxId += 4;
+
+ if (((this->menuMode == FS_MENU_MODE_CONFIG) && (this->configMode >= 2)) ||
+ ((this->menuMode == FS_MENU_MODE_SELECT) && (this->selectMode == 3))) {
+ if (this->menuMode == FS_MENU_MODE_CONFIG) {
+ if ((this->configMode == 4) || (this->configMode == 7) || (this->configMode == 0x16)) {
+ j = D_80814644[this->buttonIndex];
+ } else if ((this->configMode == 0x19) || (this->configMode == 0xC)) {
+ j = D_8081464C[this->buttonIndex];
+ } else {
+ j = D_80814638[this->buttonIndex];
+ }
+ } else {
+ j = D_80814650[this->confirmButtonIndex];
+ }
+
+ this->windowContentVtx[vtxId + 0].v.ob[0] = this->windowContentVtx[vtxId + 2].v.ob[0] = this->windowPosX - 0xA;
+
+ this->windowContentVtx[vtxId + 1].v.ob[0] = this->windowContentVtx[vtxId + 3].v.ob[0] =
+ this->windowContentVtx[vtxId + 0].v.ob[0] + 0x48;
+
+ this->windowContentVtx[vtxId + 0].v.ob[1] = this->windowContentVtx[vtxId + 1].v.ob[1] =
+ this->windowContentVtx[j].v.ob[1] + 4;
+
+ this->windowContentVtx[vtxId + 2].v.ob[1] = this->windowContentVtx[vtxId + 3].v.ob[1] =
+ this->windowContentVtx[vtxId + 0].v.ob[1] - 0x18;
+
+ this->windowContentVtx[vtxId + 1].v.tc[0] = this->windowContentVtx[vtxId + 3].v.tc[0] = 0x900;
+
+ this->windowContentVtx[vtxId + 2].v.tc[1] = this->windowContentVtx[vtxId + 3].v.tc[1] = 0x300;
+ }
+
+ this->windowContentVtx[vtxId + 4].v.ob[0] = this->windowContentVtx[vtxId + 6].v.ob[0] = this->windowPosX + 0x3A;
+
+ this->windowContentVtx[vtxId + 5].v.ob[0] = this->windowContentVtx[vtxId + 7].v.ob[0] =
+ this->windowContentVtx[vtxId + 4].v.ob[0] + 0x80;
+
+ this->windowContentVtx[vtxId + 4].v.ob[1] = this->windowContentVtx[vtxId + 5].v.ob[1] =
+ this->windowContentVtx[D_80814638[this->warningButtonIndex]].v.ob[1];
+
+ this->windowContentVtx[vtxId + 6].v.ob[1] = this->windowContentVtx[vtxId + 7].v.ob[1] =
+ this->windowContentVtx[vtxId + 4].v.ob[1] - 0x10;
+
+ this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0x1000;
+}
+#else
+void FileSelect_SetWindowContentVtx(GameState* thisx);
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_SetWindowContentVtx.s")
+#endif
+
+u16 D_80814654[] = {
+ 0x88,
+ 0x194,
+ 0x2A0,
+};
+TexturePtr sFileSelRemainsTextures[] = {
+ gFileSelOdolwasRemainsTex,
+ gFileSelGohtsRemainsTex,
+ gFileSelGyorgsRemainsTex,
+ gFileSelTwinmoldsRemainsTex,
+};
+TexturePtr sFileSelDayENGTextures[] = {
+ gFileSelFirstDayENGTex,
+ gFileSelFirstDayENGTex,
+ gFileSelSecondDayENGTex,
+ gFileSelFinalDayENGTex,
+};
+TexturePtr sFileSelHeartPieceTextures[] = {
+ gFileSel0QuarterHeartENGTex,
+ gFileSel1QuarterHeartENGTex,
+ gFileSel2QuarterHeartENGTex,
+ gFileSel3QuarterHeartENGTex,
+};
+static TexturePtr sHeartTextures[2][5] = {
+ {
+ gHeartEmptyTex,
+ gHeartQuarterTex,
+ gHeartHalfTex,
+ gHeartThreeQuarterTex,
+ gHeartFullTex,
+ },
+ {
+ gDefenseHeartEmptyTex,
+ gDefenseHeartQuarterTex,
+ gDefenseHeartHalfTex,
+ gDefenseHeartThreeQuarterTex,
+ gDefenseHeartFullTex,
+ },
+};
+u8 sHealthToQuarterHeartCount[] = {
+ 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+};
+s16 sFileSelRupeePrimColors[3][3] = {
+ { 200, 255, 100 }, // Default Wallet
+ { 170, 170, 255 }, // Adult Wallet
+ { 255, 105, 105 }, // Giant Wallet
+};
+s16 sFileSelRupeeEnvColors[3][3] = {
+ { 0, 80, 0 }, // Default Wallet
+ { 10, 10, 80 }, // Adult Wallet
+ { 40, 10, 0 }, // Giant Wallet
+};
+static s16 sHeartPrimColors[2][3] = {
+ { 255, 70, 50 },
+ { 200, 0, 0 },
+};
+static s16 sHeartEnvColors[2][3] = {
+ { 50, 40, 60 },
+ { 255, 255, 255 },
+};
+
+void FileSelect_DrawFileInfo(GameState* thisx, s16 fileIndex) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ s16 j;
+ s16 vtxOffset;
+ s32 heartType;
+ s16 i;
+ s16 sp20C;
+ s16 health;
+ s16 timeDigits[5];
+ u16 digits[3]; // rupees and mask count
+ u8 quarterHeartCount;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ sp20C = fileIndex;
+
+ // draw file name
+ if (this->nameAlpha[fileIndex] != 0) {
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + (4 * 8)], 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->nameAlpha[fileIndex]);
+
+ for (vtxOffset = 0, i = 0; vtxOffset < (4 * 8); i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + this->fileNames[fileIndex][i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex]], 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->nameAlpha[fileIndex]);
+
+ for (vtxOffset = 0, i = 0; vtxOffset < (4 * 8); i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + this->fileNames[fileIndex][i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ if ((fileIndex == this->selectedFileIndex) || (fileIndex == this->copyDestFileIndex)) {
+ if (this->isOwlSave[fileIndex + 2]) {
+ sp20C = fileIndex + 2;
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][0],
+ sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][1],
+ sFileSelRupeePrimColors[this->walletUpgrades[sp20C]][2], this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][0],
+ sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][1],
+ sFileSelRupeeEnvColors[this->walletUpgrades[sp20C]][2], 255);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xC8], 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelRupeeTex, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x4C], 12, 0);
+
+ FileSelect_SplitNumber((u16)this->rupees[sp20C], &digits[0], &digits[1], &digits[2]);
+
+ for (vtxOffset = 0, i = sWalletFirstDigit[this->walletUpgrades[sp20C]]; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ if (this->rupees[sp20C] == gUpgradeCapacities[4][this->walletUpgrades[sp20C]]) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 120, 255, 0, this->fileInfoAlpha[fileIndex]);
+ } else if (this->rupees[sp20C] != 0) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 100, 100, 100, this->fileInfoAlpha[fileIndex]);
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x40], 12, 0);
+
+ for (vtxOffset = 0, i = sWalletFirstDigit[this->walletUpgrades[sp20C]]; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xCC], 4, 0);
+
+ POLY_OPA_DISP = FileSelect_DrawTexQuadIA8(
+ POLY_OPA_DISP, sFileSelHeartPieceTextures[this->heartPieceCount[sp20C]], 0x18, 0x10, (s16)0);
+
+ if (this->defenseHearts[sp20C] == 0) {
+ heartType = 0;
+ } else {
+ heartType = 1;
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, sHeartPrimColors[heartType][0], sHeartPrimColors[heartType][1],
+ sHeartPrimColors[heartType][2], this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sHeartEnvColors[heartType][0], sHeartEnvColors[heartType][1],
+ sHeartEnvColors[heartType][2], 255);
+
+ i = this->healthCapacity[sp20C] / 0x10;
+
+ health = this->health[sp20C];
+ if (health <= 0x30) {
+ health = 0x30;
+ }
+
+ quarterHeartCount = 4;
+ for (vtxOffset = 0, j = 0; j < i; j++, vtxOffset += 4) {
+ if (health < 0x10) {
+ if (health != 0) {
+ quarterHeartCount = sHealthToQuarterHeartCount[health];
+ health = 0;
+ } else {
+ quarterHeartCount = 0;
+ }
+ } else {
+ health -= 0x10;
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x68 + vtxOffset], 4, 0);
+ POLY_OPA_DISP =
+ FileSelect_DrawTexQuadIA8(POLY_OPA_DISP, sHeartTextures[heartType][quarterHeartCount], 0x10, 0x10, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ for (vtxOffset = 0, j = 0; j < 4; j++, vtxOffset += 4) {
+ if (this->questItems[sp20C] & gBitFlags[j]) {
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xB8 + vtxOffset], 4, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileSelRemainsTextures[j], G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xD0], 8, 0);
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelMASKSENGTex, G_IM_FMT_I, 64, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x60], 8, 0);
+
+ FileSelect_SplitNumber(this->maskCount[sp20C], &digits[0], &digits[1], &digits[2]);
+
+ for (vtxOffset = 0, i = 1; i < 3; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0x58], 8, 0);
+
+ for (vtxOffset = 0, i = 1; i < 3; i++, vtxOffset += 4) {
+
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + digits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ if (this->isOwlSave[fileIndex + 2]) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->nameAlpha[fileIndex]);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xD8], 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelOwlSaveIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 12, 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++, 0, 2, 3, 1, 0);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xDC], 8, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, sFileSelDayENGTextures[this->day[sp20C]], G_IM_FMT_I, 48, 24, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ timeDigits[0] = 0;
+ timeDigits[1] = TIME_TO_MINUTES_F(this->time[sp20C]) / 60.0f;
+
+ while (timeDigits[1] >= 10) {
+ timeDigits[0]++;
+ timeDigits[1] -= 10;
+ }
+
+ timeDigits[3] = 0;
+ timeDigits[4] = (s32)TIME_TO_MINUTES_F(this->time[sp20C]) % 60;
+
+ while (timeDigits[4] >= 10) {
+ timeDigits[3]++;
+ timeDigits[4] -= 10;
+ }
+ timeDigits[2] = 0x41;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xF8], 20, 0);
+
+ for (i = 0, vtxOffset = 0; i < 5; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + timeDigits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 255, 255, 255, this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[D_80814654[fileIndex] + 0xE4], 20, 0);
+
+ for (i = 0, vtxOffset = 0; i < 5; i++, vtxOffset += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + timeDigits[i] * FONT_CHAR_TEX_SIZE, vtxOffset);
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+TexturePtr sFileInfoBoxTextures[] = {
+ gFileSelFileInfoBox0Tex, gFileSelFileInfoBox1Tex, gFileSelFileInfoBox2Tex, gFileSelFileInfoBox3Tex,
+ gFileSelFileInfoBox4Tex, gFileSelFileExtraInfoBox0Tex, gFileSelFileExtraInfoBox1Tex,
+};
+
+TexturePtr sTitleLabels[] = {
+ gFileSelPleaseSelectAFileENGTex, gFileSelOpenThisFileENGTex, gFileSelCopyWhichFileENGTex,
+ gFileSelCopyToWhichFileENGTex, gFileSelAreYouSureCopyENGTex, gFileSelFileCopiedENGTex,
+ gFileSelEraseWhichFileENGTex, gFileSelAreYouSureEraseENGTex, gFileSelFileErasedENGTex,
+};
+
+TexturePtr sWarningLabels[] = {
+ gFileSelNoFileToCopyENGTex, gFileSelNoFileToEraseENGTex, gFileSelNoEmptyFileENGTex,
+ gFileSelFileEmptyENGTex, gFileSelFileInUseENGTex,
+};
+
+TexturePtr sFileButtonTextures[] = {
+ gFileSelFile1ButtonENGTex,
+ gFileSelFile2ButtonENGTex,
+ gFileSelFile3ButtonENGTex,
+};
+
+TexturePtr sActionButtonTextures[] = {
+ gFileSelCopyButtonENGTex,
+ gFileSelEraseButtonENGTex,
+ gFileSelYesButtonENGTex,
+ gFileSelQuitButtonENGTex,
+};
+
+/**
+ * Draw most window contents including buttons, labels, and icons.
+ * Does not include anything from the keyboard and settings windows.
+ */
+void FileSelect_DrawWindowContents(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 fileIndex;
+ s16 temp;
+ s16 i;
+ s16 quadVtxIndex;
+
+ if (1) {}
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ // draw title label
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[0], 4, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sTitleLabels[this->titleLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ // draw next title label
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_NEXT]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sTitleLabels[this->nextTitleLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ temp = 4;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // draw file info box (large box when a file is selected)
+ for (fileIndex = 0; fileIndex < 3; fileIndex++, temp += 28) {
+ if (fileIndex < 2) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->fileInfoAlpha[fileIndex]);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[temp], 28, 0);
+
+ for (quadVtxIndex = 0, i = 0; i < 7; i++, quadVtxIndex += 4) {
+ if ((i < 5) || (this->isOwlSave[fileIndex + 2] && (i >= 5))) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileInfoBoxTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b,
+ sFileInfoBoxPartWidths[i], 56, 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++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1,
+ 0);
+ }
+ }
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ for (i = 0; i < 3; i++, temp += 16) {
+ if (i < 2) {
+ // draw file button
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[temp], 16, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->fileButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sFileButtonTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ // draw file name box
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->nameBoxAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelFileNameBoxTex, G_IM_FMT_IA, G_IM_SIZ_16b, 108, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->connectorAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);
+
+ if (this->isOwlSave[i + 2]) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sWindowContentColors[0], sWindowContentColors[1],
+ sWindowContentColors[2], this->nameBoxAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelBlankButtonTex, G_IM_FMT_IA, G_IM_SIZ_16b, 52, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 12, 14, 15, 13, 0);
+ }
+ }
+ }
+
+ // draw file info
+ for (fileIndex = 0; fileIndex < 2; fileIndex++) {
+ FileSelect_DrawFileInfo(&this->state, fileIndex);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gSPVertex(POLY_OPA_DISP++, &this->windowContentVtx[0x3AC], 20, 0);
+
+ // draw primary action buttons (copy/erase)
+ for (quadVtxIndex = 0, i = 0; i < 2; i++, quadVtxIndex += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->actionButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sActionButtonTextures[i], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // draw confirm buttons (yes/quit)
+ for (quadVtxIndex = 0, i = FS_BTN_CONFIRM_YES; i <= FS_BTN_CONFIRM_QUIT; i++, quadVtxIndex += 4) {
+ temp = this->confirmButtonTexIndices[i];
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->confirmButtonAlpha[i]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sActionButtonTextures[temp], G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, quadVtxIndex, quadVtxIndex + 2, quadVtxIndex + 3, quadVtxIndex + 1, 0);
+ }
+
+ // draw options button
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->optionButtonAlpha);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelOptionsButtonENGTex, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);
+
+ // draw highlight over currently selected button
+ if (((this->menuMode == FS_MENU_MODE_CONFIG) &&
+ ((this->configMode == CM_MAIN_MENU) || (this->configMode == CM_SELECT_COPY_SOURCE) ||
+ (this->configMode == CM_SELECT_COPY_DEST) || (this->configMode == CM_COPY_CONFIRM) ||
+ (this->configMode == CM_ERASE_SELECT) || (this->configMode == CM_ERASE_CONFIRM))) ||
+ ((this->menuMode == FS_MENU_MODE_SELECT) && (this->selectMode == SM_CONFIRM_FILE))) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1],
+ this->highlightColor[2], this->highlightColor[3]);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelBigButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 72, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 12, 14, 15, 13, 0);
+ }
+
+ // draw warning labels
+ if (this->warningLabel > FS_WARNING_NONE) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->emptyFileTextAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sWarningLabels[this->warningLabel], G_IM_FMT_IA, G_IM_SIZ_8b, 128, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 16, 18, 19, 17, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_ConfigModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+ FileSelect_SetWindowVtx(&this->state);
+ FileSelect_SetWindowContentVtx(&this->state);
+
+ if ((this->configMode != CM_NAME_ENTRY) && (this->configMode != CM_START_NAME_ENTRY)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+
+ if (this->windowRot != 0) {
+ Matrix_RotateXFApply(this->windowRot / 100.0f);
+ }
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawWindowContents(&this->state);
+ }
+
+ // draw name entry menu
+ if ((this->configMode >= CM_ROTATE_TO_NAME_ENTRY) && (this->configMode <= CM_NAME_ENTRY_TO_MAIN)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply((this->windowRot - 314.0f) / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawNameEntry(&this->state);
+ }
+
+ // draw options menu
+ if ((this->configMode >= CM_MAIN_TO_OPTIONS) && (this->configMode <= CM_OPTIONS_TO_MAIN)) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply((this->windowRot - 314.0f) / 100.0f);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_DrawOptions(&this->state);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+/**
+ * Fade out the main menu elements to transition to select mode.
+ * Update function for `SM_FADE_MAIN_TO_SELECT`
+ */
+void FileSelect_FadeMainToSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] -= 50;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->fileButtonAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameAlpha[i] = this->nameBoxAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] -= 255 / 4;
+ }
+ } else {
+ if (SLOT_OCCUPIED(this, i)) {
+ this->nameAlpha[i] = this->nameBoxAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] -= 255 / 4;
+ }
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->selectMode++; // SM_MOVE_FILE_TO_TOP
+ this->confirmButtonIndex = FS_BTN_CONFIRM_YES;
+ }
+}
+
+// Amount to move by to reach the top of the screen
+s16 sFileYOffsets[] = { 0, 16, 32 };
+
+/**
+ * Moves the selected file to the top of the window.
+ * Update function for `SM_MOVE_FILE_TO_TOP`
+ */
+void FileSelect_MoveSelectedFileToTop(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex] - sFileYOffsets[this->buttonIndex]) / this->actionTimer;
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ this->actionTimer--;
+
+ if ((this->actionTimer == 0) || (this->buttonYOffsets[this->buttonIndex] == sFileYOffsets[this->buttonIndex])) {
+ this->buttonYOffsets[FS_BTN_SELECT_YES] = this->buttonYOffsets[FS_BTN_SELECT_QUIT] = -24;
+ this->actionTimer = 4;
+ this->selectMode++; // SM_FADE_IN_FILE_INFO
+ }
+}
+
+/**
+ * Fade in the file info for the selected file.
+ * Update function for `SM_FADE_IN_FILE_INFO`
+ */
+void FileSelect_FadeInFileInfo(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] += 50;
+ this->nameBoxAlpha[this->buttonIndex] -= 100;
+
+ if (this->nameBoxAlpha[this->buttonIndex] <= 0) {
+ this->nameBoxAlpha[this->buttonIndex] = 0;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileInfoAlpha[this->buttonIndex] = 200;
+ this->actionTimer = 4;
+ this->selectMode++; // SM_CONFIRM_FILE
+ }
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] =
+ this->fileInfoAlpha[this->buttonIndex];
+}
+
+/**
+ * Update the cursor and handle the option that the player picks for confirming the selected file.
+ * Update function for `SM_CONFIRM_FILE`
+ */
+void FileSelect_ConfirmFile(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_START) || (CHECK_BTN_ALL(input->press.button, BTN_A))) {
+ if (this->confirmButtonIndex == FS_BTN_CONFIRM_YES) {
+ Rumble_Request(300.0f, 180, 20, 100);
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->selectMode = SM_FADE_OUT;
+ func_801A4058(0xF);
+ } else { // FS_BTN_CONFIRM_QUIT
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ this->selectMode++; // SM_FADE_OUT_FILE_INFO
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ this->selectMode++; // SM_FADE_OUT_FILE_INFO
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->confirmButtonIndex ^= 1;
+ }
+}
+
+/**
+ * Fade out the file info for the selected file before returning to the main menu.
+ * Update function for `SM_FADE_OUT_FILE_INFO`
+ */
+void FileSelect_FadeOutFileInfo(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[FS_BTN_SELECT_YES] = this->buttonYOffsets[FS_BTN_SELECT_QUIT] = 0;
+ this->nameBoxAlpha[this->buttonIndex] = 200;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->actionTimer = 4;
+ this->selectMode++;
+ }
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] =
+ this->fileInfoAlpha[this->buttonIndex];
+}
+
+/**
+ * Move the selected file back to the slot position then go to config mode for the main menu.
+ * Update function for `SM_MOVE_FILE_TO_SLOT`
+ */
+void FileSelect_MoveSelectedFileToSlot(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s32 yStep;
+ s16 i;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex]) / this->actionTimer;
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+
+ if (this->buttonYOffsets[this->buttonIndex] <= 0) {
+ this->buttonYOffsets[this->buttonIndex] = 0;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (this->fileButtonAlpha[i] >= 200) {
+ this->fileButtonAlpha[i] = 200;
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = this->fileButtonAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else {
+ if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->actionTimer = 4;
+ this->menuMode = FS_MENU_MODE_CONFIG;
+ this->configMode = CM_MAIN_MENU;
+ this->nextConfigMode = CM_MAIN_MENU;
+ this->selectMode = SM_FADE_MAIN_TO_SELECT;
+ }
+}
+
+/**
+ * Fill the screen with black to fade out.
+ * Update function for `SM_FADE_OUT`
+ */
+void FileSelect_FadeOut(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->screenFillAlpha += 40;
+
+ if (this->screenFillAlpha >= 255) {
+ this->screenFillAlpha = 255;
+ this->selectMode++; // SM_LOAD_GAME
+ }
+}
+
+/**
+ * Load the save for the appropriate file and start the game.
+ * Update function for `SM_LOAD_GAME`
+ */
+void FileSelect_LoadGame(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ u16 i;
+
+ gSaveContext.fileNum = this->buttonIndex;
+ Sram_OpenSave(this, &this->sramCtx);
+
+ gSaveContext.gameMode = GAMEMODE_NORMAL;
+
+ STOP_GAMESTATE(&this->state);
+ SET_NEXT_GAMESTATE(&this->state, Play_Init, sizeof(PlayState));
+
+ gSaveContext.respawnFlag = 0;
+ gSaveContext.respawn[RESPAWN_MODE_DOWN].entrance = ENTR_LOAD_OPENING;
+ gSaveContext.seqId = (u8)NA_BGM_DISABLED;
+ gSaveContext.ambienceId = AMBIENCE_ID_DISABLED;
+ gSaveContext.showTitleCard = true;
+ gSaveContext.dogParams = 0;
+
+ for (i = 0; i < TIMER_ID_MAX; i++) {
+ gSaveContext.timerStates[i] = TIMER_STATE_OFF;
+ }
+
+ gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
+ gSaveContext.nayrusLoveTimer = 0;
+ gSaveContext.healthAccumulator = 0;
+ gSaveContext.magicFlag = 0;
+ gSaveContext.forcedSeqId = 0;
+ gSaveContext.skyboxTime = CLOCK_TIME(0, 0);
+ gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
+ gSaveContext.cutsceneTrigger = 0;
+ gSaveContext.chamberCutsceneNum = 0;
+ gSaveContext.nextDayTime = 0xFFFF;
+ gSaveContext.retainWeatherMode = false;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+
+ gSaveContext.hudVisibilityForceButtonAlphasByStatus = false;
+ gSaveContext.nextHudVisibility = HUD_VISIBILITY_IDLE;
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ gSaveContext.hudVisibilityTimer = 0;
+
+ gSaveContext.save.saveInfo.playerData.tatlTimer = 0;
+}
+
+void (*sSelectModeUpdateFuncs[])(GameState*) = {
+ FileSelect_FadeMainToSelect, // SM_FADE_MAIN_TO_SELECT
+ FileSelect_MoveSelectedFileToTop, // SM_MOVE_FILE_TO_TOP
+ FileSelect_FadeInFileInfo, // SM_FADE_IN_FILE_INFO
+ FileSelect_ConfirmFile, // SM_CONFIRM_FILE
+ FileSelect_FadeOutFileInfo, // SM_FADE_OUT_FILE_INFO
+ FileSelect_MoveSelectedFileToSlot, // SM_MOVE_FILE_TO_SLOT
+ FileSelect_FadeOut, // SM_FADE_OUT
+ FileSelect_LoadGame, // SM_LOAD_GAME
+};
+
+void FileSelect_SelectModeUpdate(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ sSelectModeUpdateFuncs[this->selectMode](&this->state);
+}
+
+void FileSelect_SelectModeDraw(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+ FileSelect_SetWindowVtx(&this->state);
+ FileSelect_SetWindowContentVtx(&this->state);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->windowAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ Matrix_Translate(0.0f, 0.0f, -93.6f, MTXMODE_NEW);
+ Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
+ Matrix_RotateXFApply(this->windowRot / 100.0f);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[0], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow1DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[32], 32, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow2DL);
+
+ gSPVertex(POLY_OPA_DISP++, &this->windowVtx[64], 16, 0);
+ gSPDisplayList(POLY_OPA_DISP++, gFileSelWindow3DL);
+
+ FileSelect_DrawWindowContents(&this->state);
+ gDPPipeSync(POLY_OPA_DISP++);
+ FileSelect_SetView(this, 0.0f, 0.0f, 64.0f);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_UpdateAndDrawSkybox(FileSelectState* this) {
+ s32 pad;
+ f32 eyeX;
+ f32 eyeY;
+ f32 eyeZ;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ eyeX = 1000.0f * Math_CosS(sFileSelectSkyboxRotation) - 1000.0f * Math_SinS(sFileSelectSkyboxRotation);
+ eyeY = -700.0f;
+ eyeZ = 1000.0f * Math_SinS(sFileSelectSkyboxRotation) + 1000.0f * Math_CosS(sFileSelectSkyboxRotation);
+
+ FileSelect_SetView(this, eyeX, eyeY, eyeZ);
+ Skybox_Draw(&this->skyboxCtx, this->state.gfxCtx, SKYBOX_NORMAL_SKY, this->envCtx.skyboxBlend, eyeX, eyeY, eyeZ);
+
+ gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_NONE);
+
+ sFileSelectSkyboxRotation += -0xA;
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void (*gFileSelectDrawFuncs[])(GameState*) = {
+ FileSelect_InitModeDraw, // FS_MENU_MODE_INIT
+ FileSelect_ConfigModeDraw, // FS_MENU_MODE_CONFIG
+ FileSelect_SelectModeDraw, // FS_MENU_MODE_SELECT
+};
+void (*gFileSelectUpdateFuncs[])(GameState*) = {
+ FileSelect_InitModeUpdate, // FS_MENU_MODE_INIT
+ FileSelect_ConfigModeUpdate, // FS_MENU_MODE_CONFIG
+ FileSelect_SelectModeUpdate, // FS_MENU_MODE_SELECT
+};
+
+TexturePtr D_808147B4[] = { gFileSelPleaseWaitENGTex, gFileSelDecideCancelENGTex, gFileSelDecideSaveENGTex };
+s16 D_808147C0[] = { 144, 144, 152 };
+s16 D_808147C8[] = { 90, 90, 86 };
+
+void FileSelect_Main(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+ s32 texIndex;
+ s32 pad;
+
+ func_8012CF0C(this->state.gfxCtx, 0, 1, 0, 0, 0);
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x01, this->staticSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x02, this->parameterSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x06, this->titleSegment);
+
+ this->stickAdjX = input->rel.stick_x;
+ this->stickAdjY = input->rel.stick_y;
+
+ if (this->stickAdjX < -30) {
+ if (this->stickXDir == -1) {
+ this->inputTimerX--;
+ if (this->inputTimerX < 0) {
+ this->inputTimerX = 2;
+ } else {
+ this->stickAdjX = 0;
+ }
+ } else {
+ this->inputTimerX = 10;
+ this->stickXDir = -1;
+ }
+ } else if (this->stickAdjX > 30) {
+ if (this->stickXDir == 1) {
+ this->inputTimerX--;
+ if (this->inputTimerX < 0) {
+ this->inputTimerX = 2;
+ } else {
+ this->stickAdjX = 0;
+ }
+ } else {
+ this->inputTimerX = 10;
+ this->stickXDir = 1;
+ }
+ } else {
+ this->stickXDir = 0;
+ }
+
+ if (this->stickAdjY < -30) {
+ if (this->stickYDir == -1) {
+ this->inputTimerY--;
+ if (this->inputTimerY < 0) {
+ this->inputTimerY = 2;
+ } else {
+ this->stickAdjY = 0;
+ }
+ } else {
+ this->inputTimerY = 10;
+ this->stickYDir = -1;
+ }
+ } else if (this->stickAdjY > 30) {
+ if (this->stickYDir == 1) {
+ this->inputTimerY--;
+ if (this->inputTimerY < 0) {
+ this->inputTimerY = 2;
+ } else {
+ this->stickAdjY = 0;
+ }
+ } else {
+ this->inputTimerY = 10;
+ this->stickYDir = 1;
+ }
+ } else {
+ this->stickYDir = 0;
+ }
+
+ this->emptyFileTextAlpha = 0;
+
+ FileSelect_PulsateCursor(&this->state);
+ gFileSelectUpdateFuncs[this->menuMode](&this->state);
+ FileSelect_UpdateAndDrawSkybox(this);
+ gFileSelectDrawFuncs[this->menuMode](&this->state);
+
+ Gfx_SetupDL39_Opa(this->state.gfxCtx);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 100, 255, 255, this->controlsAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ if (this->sramCtx.status > 0) {
+ texIndex = 0;
+ } else if ((this->configMode >= CM_MAIN_TO_OPTIONS) && (this->configMode <= CM_OPTIONS_TO_MAIN)) {
+ texIndex = 2;
+ } else {
+ texIndex = 1;
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, D_808147B4[texIndex], G_IM_FMT_IA, G_IM_SIZ_8b, D_808147C0[texIndex], 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
+ G_TX_NOLOD);
+
+ gSPTextureRectangle(POLY_OPA_DISP++, D_808147C8[texIndex] << 2, 204 << 2,
+ (D_808147C8[texIndex] + D_808147C0[texIndex]) << 2, (204 + 16) << 2, G_TX_RENDERTILE, 0, 0,
+ 1 << 10, 1 << 10);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gSPDisplayList(POLY_OPA_DISP++, sScreenFillSetupDL);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, this->screenFillAlpha);
+ gSPDisplayList(POLY_OPA_DISP++, D_0E000000.fillRect);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_InitContext(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ EnvironmentContext* envCtx = &this->envCtx;
+
+ Sram_Alloc(&this->state, &this->sramCtx);
+ func_801457CC(&this->state, &this->sramCtx);
+
+ this->menuMode = FS_MENU_MODE_INIT;
+
+ this->buttonIndex = this->selectMode = this->selectedFileIndex = this->copyDestFileIndex =
+ this->confirmButtonIndex = 0;
+
+ this->confirmButtonTexIndices[0] = 2;
+ this->confirmButtonTexIndices[1] = 3;
+ this->titleLabel = FS_TITLE_SELECT_FILE;
+ this->nextTitleLabel = FS_TITLE_OPEN_FILE;
+
+ this->screenFillAlpha = 255;
+ this->highlightPulseDir = 1;
+ this->unk_244F4 = 0xC;
+ this->highlightColor[0] = 155;
+ this->highlightColor[1] = 255;
+ this->highlightColor[2] = 255;
+ this->highlightColor[3] = 70;
+ this->configMode = CM_FADE_IN_START;
+ this->windowRot = 0.0f;
+
+ this->stickXDir = this->inputTimerX = 0;
+ this->stickYDir = this->inputTimerY = 0;
+
+ this->kbdX = this->kbdY = this->charIndex = 0;
+
+ this->kbdButton = FS_KBD_BTN_NONE;
+
+ this->windowColor[0] = 100;
+ this->windowColor[1] = 150;
+ this->windowColor[2] = 255;
+
+ this->windowAlpha = this->titleAlpha[FS_TITLE_CUR] = this->titleAlpha[FS_TITLE_NEXT] = this->fileButtonAlpha[0] =
+ this->fileButtonAlpha[1] = this->fileButtonAlpha[2] = this->nameBoxAlpha[0] = this->nameBoxAlpha[1] =
+ this->nameBoxAlpha[2] = this->nameAlpha[0] = this->nameAlpha[1] = this->nameAlpha[2] =
+ this->connectorAlpha[0] = this->connectorAlpha[1] = this->connectorAlpha[2] = this->fileInfoAlpha[0] =
+ this->fileInfoAlpha[1] = this->fileInfoAlpha[2] = this->actionButtonAlpha[FS_BTN_ACTION_COPY] =
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] = this->actionButtonAlpha[2] =
+ this->actionButtonAlpha[3] = this->optionButtonAlpha = this->nameEntryBoxAlpha =
+ this->controlsAlpha = this->emptyFileTextAlpha = 0;
+
+ this->windowPosX = 6;
+ this->actionTimer = 4;
+ this->warningLabel = FS_WARNING_NONE;
+
+ this->warningButtonIndex = this->buttonYOffsets[0] = this->buttonYOffsets[1] = this->buttonYOffsets[2] =
+ this->buttonYOffsets[3] = this->buttonYOffsets[4] = this->buttonYOffsets[5] = this->fileNamesY[0] =
+ this->fileNamesY[1] = this->fileNamesY[2] = 0;
+
+ this->unk_2451E[0] = 0;
+ this->unk_2451E[1] = 3;
+ this->unk_2451E[2] = 6;
+ this->unk_2451E[3] = 8;
+ this->unk_2451E[4] = 10;
+ this->highlightTimer = 20;
+
+ ShrinkWindow_Letterbox_SetSizeTarget(0);
+
+ gSaveContext.skyboxTime = 0;
+ gSaveContext.save.time = 0;
+
+ Skybox_Init(&this->state, &this->skyboxCtx, 1);
+ R_TIME_SPEED = 10;
+
+ envCtx->changeSkyboxState = 0;
+ envCtx->changeSkyboxTimer = 0;
+ envCtx->changeLightEnabled = false;
+ envCtx->changeLightTimer = 0;
+ envCtx->skyboxDmaState = 0;
+ envCtx->skybox1Index = 99;
+ envCtx->skybox2Index = 99;
+ envCtx->lightConfig = 0;
+ envCtx->changeLightNextConfig = 0;
+ envCtx->lightSetting = 0;
+ envCtx->skyboxConfig = 2;
+ envCtx->skyboxDisabled = 0;
+ envCtx->skyboxBlend = 0;
+ envCtx->glareAlpha = 0.0f;
+ envCtx->lensFlareAlphaScale = 0.0f;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+}
+
+void FileSelect_Destroy(GameState* this) {
+ ShrinkWindow_Destroy();
+}
+
+void FileSelect_Init(GameState* thisx) {
+ s32 pad;
+ FileSelectState* this = (FileSelectState*)thisx;
+ size_t size;
+
+ Game_SetFramerateDivisor(&this->state, 1);
+ Matrix_Init(&this->state);
+ ShrinkWindow_Init();
+ View_Init(&this->view, this->state.gfxCtx);
+ this->state.main = FileSelect_Main;
+ this->state.destroy = FileSelect_Destroy;
+ FileSelect_InitContext(&this->state);
+ Font_LoadOrderedFont(&this->font);
+
+ size = SEGMENT_ROM_SIZE(title_static);
+ this->staticSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->staticSegment, SEGMENT_ROM_START(title_static), size);
+
+ size = SEGMENT_ROM_SIZE(parameter_static);
+ this->parameterSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->parameterSegment, SEGMENT_ROM_START(parameter_static), size);
+
+ size = gObjectTable[OBJECT_MAG].vromEnd - gObjectTable[OBJECT_MAG].vromStart;
+ this->titleSegment = THA_AllocTailAlign16(&this->state.heap, size);
+ DmaMgr_SendRequest0(this->titleSegment, gObjectTable[OBJECT_MAG].vromStart, size);
+
+ Audio_SetSpec(0xA);
+ // Setting ioData to 1 and writing it to ioPort 7 will skip the harp intro
+ Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, NA_BGM_FILE_SELECT, 0, 7, 1);
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
new file mode 100644
index 000000000..7f8e5789c
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
@@ -0,0 +1,1253 @@
+/*
+ * File: z_file_copy_erase.c
+ * Overlay: ovl_file_choose
+ * Description: Copying and Erasing Files
+ */
+
+#include "z_file_select.h"
+#include "z64rumble.h"
+
+// When choosing a file to copy or erase, the 6 main menu buttons are placed at these offsets
+s16 sChooseFileYOffsets[] = { -48, -48, -48, -24, -24, 0 };
+
+s16 D_8081424C[3][3] = {
+ { 0, -48, -48 },
+ { -64, 16, -48 },
+ { -64, -64, 32 },
+};
+
+s16 sEraseDelayTimer = 15;
+
+/**
+ * Move buttons into place for the select source screen and fade in the proper labels.
+ * Update function for `CM_SETUP_COPY_SOURCE`
+ */
+void FileSelect_SetupCopySource(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+ s16 i;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] -= 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] -= 200 / 4;
+ this->optionButtonAlpha -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 200;
+ this->titleLabel = this->nextTitleLabel;
+
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode++; // CM_SELECT_COPY_SOURCE
+ }
+}
+
+/**
+ * Allow the player to select a file to copy or exit back to the main menu.
+ * Update function for `CM_SELECT_COPY_SOURCE`
+ */
+void FileSelect_SelectCopySource(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_MAIN_COPY;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode = CM_COPY_RETURN_MAIN;
+ this->warningLabel = FS_WARNING_NONE;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_COPY_DEST_1;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_COPY_DEST_1;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ if (this->buttonIndex > FS_BTN_COPY_QUIT) {
+ this->buttonIndex = FS_BTN_COPY_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex != FS_BTN_COPY_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ }
+}
+
+/**
+ * Move the menu buttons into place for the copy destination selection and switch titles.
+ * Update function for `CM_SETUP_COPY_DEST_1`
+ */
+void FileSelect_SetupCopyDest1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+ s16 i;
+
+ for (i = 0; i < 3; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_8081424C[this->buttonIndex][i]) / this->actionTimer;
+
+ if (D_8081424C[this->buttonIndex][i] >= this->buttonYOffsets[i]) {
+ this->buttonYOffsets[i] += yStep;
+ } else {
+ this->buttonYOffsets[i] -= yStep;
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->nameBoxAlpha[this->buttonIndex] -= 200 / 4;
+
+ this->actionTimer--;
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[this->buttonIndex] = D_8081424C[this->buttonIndex][this->buttonIndex];
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_SETUP_COPY_DEST_2
+ }
+}
+
+/**
+ * Show the file info of the file selected to copy from.
+ * Update function for `CM_SETUP_COPY_DEST_2`
+ */
+void FileSelect_SetupCopyDest2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameBoxAlpha[this->buttonIndex] -= 200 / 4;
+ this->fileInfoAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->nameBoxAlpha[this->buttonIndex] = 0;
+ this->fileInfoAlpha[this->buttonIndex] = 200;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->actionTimer = 4;
+ this->configMode = CM_SELECT_COPY_DEST;
+ }
+}
+
+/**
+ * Allow the player to select a slot to copy to or exit to the copy select screen.
+ * Update function for `CM_SELECT_COPY_DEST`
+ */
+void FileSelect_SelectCopyDest(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = this->selectedFileIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ this->actionTimer = 4;
+ this->configMode = CM_EXIT_TO_COPY_SOURCE_1;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->copyDestFileIndex = this->buttonIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_CONFIRM;
+ this->actionTimer = 4;
+ this->configMode = CM_SETUP_COPY_CONFIRM_1;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->copyDestFileIndex = this->buttonIndex;
+ this->nextTitleLabel = FS_TITLE_COPY_CONFIRM;
+ this->actionTimer = 4;
+ this->configMode = CM_SETUP_COPY_CONFIRM_1;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ if (this->buttonIndex == this->selectedFileIndex) {
+ this->buttonIndex--;
+ if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_FILE_2;
+ }
+ } else if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex > FS_BTN_COPY_QUIT) {
+ this->buttonIndex = FS_BTN_COPY_FILE_1;
+ }
+ if (this->buttonIndex == this->selectedFileIndex) {
+ this->buttonIndex++;
+ }
+ // Instead of removing File 3 entirely, the index is manually adjusted to skip it
+ if (this->buttonIndex == FS_BTN_COPY_FILE_3) {
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ }
+ }
+ }
+ if (this->buttonIndex != FS_BTN_COPY_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_IN_USE;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_IN_USE;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+ }
+}
+
+/**
+ * Fade out file info, bring back the name box, and get ready to return to copy source screen.
+ * Update function for `CM_EXIT_TO_COPY_SOURCE_1`
+ */
+void FileSelect_ExitToCopySource1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->nextTitleLabel = FS_TITLE_COPY_FROM;
+ this->nameBoxAlpha[this->buttonIndex] = 200;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_EXIT_TO_COPY_SOURCE_2
+ }
+}
+
+/**
+ * Move the buttons back into place and return to copy source select.
+ * Update function for `CM_EXIT_TO_COPY_SOURCE_2`
+ */
+void FileSelect_ExitToCopySource2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 3; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode = CM_SELECT_COPY_SOURCE;
+ }
+}
+
+s16 D_80814264[] = { -56, -40, -24, 0 };
+
+/**
+ * Rearrange buttons on the screen to prepare for copy confirmation.
+ * Update function for `CM_SETUP_COPY_CONFIRM_1`
+ */
+void FileSelect_SetupCopyConfirm1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+
+ for (i = 0; i < 3; i++) {
+ if ((i != this->copyDestFileIndex) && (i != this->selectedFileIndex)) {
+ this->fileButtonAlpha[i] -= 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (i == this->copyDestFileIndex) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_80814264[i]) / this->actionTimer;
+ this->buttonYOffsets[i] += yStep;
+
+ if (this->buttonYOffsets[i] >= D_80814264[i]) {
+ this->buttonYOffsets[i] = D_80814264[i];
+ }
+ }
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->configMode++;
+ }
+}
+
+/**
+ * Fade in the 'Yes' button before allowing the player to decide.
+ * Update function for `CM_SETUP_COPY_CONFIRM_2`
+ */
+void FileSelect_SetupCopyConfirm2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->configMode = CM_COPY_CONFIRM;
+ this->buttonIndex = FS_BTN_CONFIRM_QUIT;
+ }
+}
+
+/**
+ * Allow the player to confirm the copy, or quit back to the destination select.
+ * If yes is selected, the actual copy occurs in this function before moving on to the animation.
+ * Update function for `CM_COPY_CONFIRM`
+ */
+void FileSelect_CopyConfirm(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+ u16 dayTime;
+
+ if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_COPY_TO;
+ this->configMode = CM_RETURN_TO_COPY_DEST;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ dayTime = gSaveContext.save.time;
+ gSaveContext.save.time = dayTime;
+ this->nameAlpha[this->copyDestFileIndex] = 0;
+ this->fileInfoAlpha[this->copyDestFileIndex] = this->nameAlpha[this->copyDestFileIndex];
+ this->nextTitleLabel = FS_TITLE_COPY_COMPLETE;
+ this->actionTimer = 4;
+ Sram_CopySave(this, sramCtx);
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_COPY_ANIM_1;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->copyDestFileIndex * 2],
+ gFlashSpecialSaveNumPages[this->copyDestFileIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_COPY_WAIT_FOR_FLASH_SAVE;
+ }
+ Rumble_Request(300.0f, 180, 20, 100);
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->buttonIndex ^= 1;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_COPY_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_CopyWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ u16 i;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_COPY_ANIM_1;
+
+ for (i = 0; i < 6; i++) {
+ this->newf[this->copyDestFileIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
+ }
+
+ this->threeDayResetCount[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.threeDayResetCount;
+
+ for (i = 0; i < 8; i++) {
+ this->fileNames[this->copyDestFileIndex][i] = gSaveContext.save.saveInfo.playerData.playerName[i];
+ }
+
+ this->healthCapacity[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.healthCapacity;
+ this->health[this->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.health;
+ this->defenseHearts[this->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts;
+ }
+}
+
+/**
+ * Move buttons back in place and return to copy destination select.
+ * Update function for `CM_RETURN_TO_COPY_DEST`
+ */
+void FileSelect_ReturnToCopyDest(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+
+ for (i = 0; i < 3; i++) {
+ if ((i != this->copyDestFileIndex) && (i != this->selectedFileIndex)) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+
+ yStep = ABS_ALT(this->buttonYOffsets[i] - D_8081424C[this->selectedFileIndex][i]) / this->actionTimer;
+
+ if (D_8081424C[this->selectedFileIndex][i] >= this->buttonYOffsets[i]) {
+ this->buttonYOffsets[i] += yStep;
+ } else {
+ this->buttonYOffsets[i] -= yStep;
+ }
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_COPY_QUIT;
+ this->configMode = CM_SELECT_COPY_DEST;
+ }
+}
+
+/**
+ * Hide title
+ * Update function for `CM_COPY_ANIM_1`
+ */
+void FileSelect_CopyAnim1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->titleAlpha[FS_TITLE_CUR] = 0;
+ this->actionTimer = 4;
+ this->configMode++; // CM_COPY_ANIM_2
+ }
+}
+
+/**
+ * Move a copy of the file window down and fade in the file info.
+ * Update function for `CM_COPY_ANIM_2`
+ */
+void FileSelect_CopyAnim2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s32 yStep;
+
+ this->fileInfoAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->nameAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ yStep = ABS_ALT(this->fileNamesY[this->copyDestFileIndex] + 56) / this->actionTimer;
+ this->fileNamesY[this->copyDestFileIndex] -= yStep;
+
+ if (this->fileNamesY[this->copyDestFileIndex] <= -56) {
+ this->fileNamesY[this->copyDestFileIndex] = -56;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 45;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode++; // CM_COPY_ANIM_3
+ }
+}
+
+/**
+ * Play a sound effect to indicate that the copy has completed. Wait for a timer or for
+ * the player to press a button before moving on.
+ * Update function for `CM_COPY_ANIM_3`
+ */
+void FileSelect_CopyAnim3(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (this->actionTimer == 38) {
+ this->connectorAlpha[this->copyDestFileIndex] = 255;
+ play_sound(NA_SE_EV_DIAMOND_SWITCH);
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer < 37) {
+ if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_B | BTN_START) || (this->actionTimer == 0)) {
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ this->configMode = CM_COPY_ANIM_4;
+ }
+ }
+}
+
+/**
+ * Fade out the info boxes for both files and bring in their name boxes. Fade out title.
+ * Update function for `CM_COPY_ANIM_4`
+ */
+void FileSelect_CopyAnim4(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->selectedFileIndex] -= 200 / 4;
+ this->fileInfoAlpha[this->copyDestFileIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->selectedFileIndex] += 200 / 4;
+ this->nameBoxAlpha[this->copyDestFileIndex] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileNamesY[this->copyDestFileIndex] = this->buttonYOffsets[3] = 0;
+ this->actionTimer = 4;
+ this->titleAlpha[FS_TITLE_CUR] = 0;
+ this->configMode++;
+ }
+}
+
+/**
+ * Restore all buttons and labels back to their original place and go back to the main menu.
+ * Update function for `CM_COPY_ANIM_5`
+ */
+void FileSelect_CopyAnim5(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] += 200 / 4;
+ this->optionButtonAlpha += 200 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ for (i = 0; i < 3; i++) {
+ this->connectorAlpha[i] = 0;
+ this->fileButtonAlpha[i] = 200;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->connectorAlpha[i];
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] = 255;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] = 255;
+ }
+ }
+
+ this->fileNamesY[this->selectedFileIndex] = 0;
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+}
+
+/**
+ * Exit from the copy source screen to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_COPY_RETURN_MAIN`
+ */
+void FileSelect_ExitCopyToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
+
+/**
+ * Move buttons into place for the erase select screen and fade in the proper labels.
+ * Update function for `CM_SETUP_ERASE_SELECT`
+ */
+void FileSelect_SetupEraseSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i] - sChooseFileYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= sChooseFileYOffsets[i]) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] -= 100;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] -= 100;
+ this->optionButtonAlpha -= 100;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] += 200 / 4;
+
+ if (this->actionButtonAlpha[FS_BTN_ACTION_COPY] <= 0) {
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->optionButtonAlpha = 0;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 200;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ this->configMode++; // CM_ERASE_SELECT
+ }
+}
+
+/**
+ * Allow the player to select a file to erase or exit back to the main menu.
+ * Update function for `CM_ERASE_SELECT`
+ */
+void FileSelect_EraseSelect(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = FS_BTN_MAIN_ERASE;
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode = CM_EXIT_ERASE_TO_MAIN;
+ this->warningLabel = FS_WARNING_NONE;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_ERASE_CONFIRM_1;
+ this->nextTitleLabel = FS_TITLE_ERASE_CONFIRM;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else if (SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->actionTimer = 4;
+ this->selectedFileIndex = this->buttonIndex;
+ this->configMode = CM_SETUP_ERASE_CONFIRM_1;
+ this->nextTitleLabel = FS_TITLE_ERASE_CONFIRM;
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ } else {
+ if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (this->stickAdjY >= 30) {
+ this->buttonIndex--;
+ if (this->buttonIndex == FS_BTN_ERASE_FILE_3) {
+ this->buttonIndex = FS_BTN_ERASE_FILE_2;
+ }
+ if (this->buttonIndex < FS_BTN_ERASE_FILE_1) {
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ }
+ } else {
+ this->buttonIndex++;
+ if (this->buttonIndex == FS_BTN_ERASE_FILE_3) {
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ }
+ if (this->buttonIndex > FS_BTN_ERASE_QUIT) {
+ this->buttonIndex = FS_BTN_ERASE_FILE_1;
+ }
+ }
+ }
+
+ if (this->buttonIndex != FS_BTN_ERASE_QUIT) {
+ if (!gSaveContext.flashSaveAvailable) {
+ if (!NO_FLASH_SLOT_OCCUPIED(sramCtx, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else if (!SLOT_OCCUPIED(this, this->buttonIndex)) {
+ this->warningLabel = FS_WARNING_FILE_EMPTY;
+ this->warningButtonIndex = this->buttonIndex;
+ this->emptyFileTextAlpha = 255;
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ } else {
+ this->warningLabel = FS_WARNING_NONE;
+ }
+ }
+}
+
+s16 D_8081426C[] = { 0, 16, 32 };
+
+/**
+ * Update function for `CM_SETUP_ERASE_CONFIRM_1`
+ */
+void FileSelect_SetupEraseConfirm1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] -= 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] -= 255 / 4;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ }
+ } else {
+ this->nameBoxAlpha[i] -= 200 / 4;
+ }
+ }
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 8;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 8;
+
+ yStep = ABS_ALT(this->buttonYOffsets[this->buttonIndex] - D_8081426C[this->buttonIndex]) / this->actionTimer;
+
+ if (this->buttonYOffsets[this->buttonIndex] >= D_8081426C[this->buttonIndex]) {
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+ } else {
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ }
+
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] = 0;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->connectorAlpha[i] = 0;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i] = 0;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->connectorAlpha[i] = 0;
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i] = 0;
+ }
+ } else {
+ this->nameBoxAlpha[i] = 0;
+ }
+ }
+
+ this->buttonYOffsets[this->buttonIndex] = D_8081426C[this->buttonIndex];
+ this->actionTimer = 4;
+ this->configMode++;
+ }
+}
+
+/**
+ * Show the file info of the file selected to erase.
+ * Update function for `CM_SETUP_ERASE_CONFIRM_2`
+ */
+void FileSelect_SetupEraseConfirm2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] += 200 / 4;
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 8;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 8;
+ this->fileInfoAlpha[this->buttonIndex] += 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->titleLabel = this->nextTitleLabel;
+ this->fileInfoAlpha[this->buttonIndex] = this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = 200;
+ this->buttonIndex = FS_BTN_CONFIRM_QUIT;
+ this->configMode = CM_ERASE_CONFIRM;
+ }
+}
+
+/**
+ * Allow the player to confirm their choice to erase or return back to erase select.
+ * Update function for `CM_ERASE_CONFIRM`
+ */
+void FileSelect_EraseConfirm(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
+ CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ this->buttonIndex = this->selectedFileIndex;
+ this->nextTitleLabel = FS_TITLE_ERASE_FILE;
+ this->configMode = CM_EXIT_TO_ERASE_SELECT_1;
+ this->actionTimer = 4;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) {
+ Sram_EraseSave(this, sramCtx, this->selectedFileIndex);
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_ERASE_ANIM_1;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->selectedFileIndex * 2],
+ gFlashSpecialSaveNumPages[this->selectedFileIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_ERASE_WAIT_FOR_FLASH_SAVE;
+ }
+ this->connectorAlpha[this->selectedFileIndex] = 0;
+ play_sound(NA_SE_EV_DIAMOND_SWITCH);
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_ERASE_COMPLETE;
+ Rumble_Request(200.0f, 255, 20, 150);
+ sEraseDelayTimer = 15;
+ } else if (ABS_ALT(this->stickAdjY) >= 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->buttonIndex ^= 1;
+ }
+}
+
+/**
+ * Fade out file info, bring back the name box, and get ready to return to erase select screen.
+ * Update function for `CM_EXIT_TO_ERASE_SELECT_1`
+ */
+void FileSelect_ExitToEraseSelect1(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->fileInfoAlpha[this->buttonIndex] -= 200 / 4;
+ this->nameBoxAlpha[this->buttonIndex] += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->actionTimer = 4;
+ this->fileInfoAlpha[this->buttonIndex] = 0;
+ this->configMode++; // CM_EXIT_TO_ERASE_SELECT_2
+ }
+}
+
+/**
+ * Move the buttons back into place and return to erase select.
+ * Update function for `CM_EXIT_TO_ERASE_SELECT_2`
+ */
+void FileSelect_ExitToEraseSelect2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ yStep =
+ ABS_ALT(this->buttonYOffsets[this->buttonIndex] - sChooseFileYOffsets[this->buttonIndex]) / this->actionTimer;
+
+ if (this->buttonYOffsets[this->buttonIndex] >= sChooseFileYOffsets[this->buttonIndex]) {
+ this->buttonYOffsets[this->buttonIndex] -= yStep;
+ } else {
+ this->buttonYOffsets[this->buttonIndex] += yStep;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (i != this->buttonIndex) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->buttonYOffsets[this->buttonIndex] = sChooseFileYOffsets[this->buttonIndex];
+ this->actionTimer = 4;
+ this->buttonIndex = FS_BTN_ERASE_QUIT;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_ERASE_SELECT;
+ }
+}
+
+/**
+ * Wait for an initial delay, then start fading out the selected file.
+ * The actual file deletion occurs in this function.
+ * Update function for `CM_ERASE_ANIM_1`
+ */
+void FileSelect_EraseAnim1(GameState* thisx) {
+ static s16 D_80814E80;
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ if (sEraseDelayTimer == 0) {
+ if (this->actionTimer == 4) {
+ D_80814E80 = 1;
+ }
+
+ if (this->actionTimer != 0) {
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->fileInfoAlpha[this->selectedFileIndex] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] -= 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 4;
+ }
+
+ this->fileNamesY[this->selectedFileIndex] -= D_80814E80;
+ D_80814E80 += 2;
+
+ this->actionTimer--;
+ if (this->actionTimer == 0) {
+ this->configMode = CM_ERASE_ANIM_2;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = this->connectorAlpha[this->selectedFileIndex] = 0;
+
+ //! FAKE: there should be a better chained assignment
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ if (1) {}
+ if (0) {}
+ this->fileInfoAlpha[this->selectedFileIndex] = this->nameAlpha[this->selectedFileIndex] =
+ this->nameBoxAlpha[this->selectedFileIndex] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT];
+
+ this->actionTimer = 45;
+ }
+ } else {
+ sEraseDelayTimer--;
+
+ if (sEraseDelayTimer == 0) {
+ play_sound(NA_SE_OC_ABYSS);
+ }
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_ERASE_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_EraseWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ u16 i;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_ERASE_ANIM_1;
+ for (i = 0; i < 6; i++) {
+ this->newf[this->selectedFileIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i];
+ }
+ }
+}
+
+/**
+ * Wait for a delay timer or for the palyer to press a button before returning to the main menu.
+ * Update function for `CM_ERASE_ANIM_2`
+ */
+void FileSelect_EraseAnim2(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ANY(input->press.button, BTN_A | BTN_B | BTN_START) || (--this->actionTimer == 0)) {
+ this->buttonYOffsets[3] = 0;
+ this->actionTimer = 4;
+ this->nextTitleLabel = FS_TITLE_SELECT_FILE;
+ this->configMode++; // CM_ERASE_ANIM_3
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+}
+
+/**
+ * Exit from the erase animation to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_ERASE_ANIM_3`
+ */
+void FileSelect_EraseAnim3(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ for (i = 0; i < 3; i++) {
+ this->fileButtonAlpha[i] += 200 / 4;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ if (NO_FLASH_SLOT_OCCUPIED(sramCtx, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ } else if (SLOT_OCCUPIED(this, i)) {
+ this->nameBoxAlpha[i] = this->nameAlpha[i] = this->fileButtonAlpha[i];
+ this->connectorAlpha[i] += 255 / 4;
+ }
+ }
+
+ if (this->fileButtonAlpha[this->selectedFileIndex] >= 200) {
+ this->fileButtonAlpha[this->selectedFileIndex] = 200;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->fileNamesY[this->selectedFileIndex] = 0;
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
+
+/**
+ * Exit from the erase select screen to the main menu. Return all buttons and labels to their original place.
+ * Update function for `CM_EXIT_ERASE_TO_MAIN`
+ */
+void FileSelect_ExitEraseToMain(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 i;
+ s32 yStep;
+
+ for (i = 0; i < 5; i++) {
+ yStep = ABS_ALT(this->buttonYOffsets[i]) / this->actionTimer;
+
+ if (this->buttonYOffsets[i] >= 0) {
+ this->buttonYOffsets[i] -= yStep;
+ } else {
+ this->buttonYOffsets[i] += yStep;
+ }
+ }
+
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] += 200 / 4;
+ this->actionButtonAlpha[FS_BTN_ACTION_ERASE] += 200 / 4;
+ this->optionButtonAlpha += 200 / 4;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] -= 200 / 2;
+
+ if (this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] <= 0) {
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ }
+
+ this->titleAlpha[FS_TITLE_CUR] -= 255 / 4;
+ this->titleAlpha[FS_TITLE_NEXT] += 255 / 4;
+ this->actionTimer--;
+
+ if (this->actionTimer == 0) {
+ this->highlightColor[3] = 70;
+ this->highlightPulseDir = 1;
+ this->highlightTimer = 20;
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY] = 200;
+ this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = 0;
+ this->titleLabel = this->nextTitleLabel;
+ this->titleAlpha[FS_TITLE_CUR] = 255;
+ this->titleAlpha[FS_TITLE_NEXT] = 0;
+ this->configMode = CM_MAIN_MENU;
+ }
+
+ this->optionButtonAlpha = this->actionButtonAlpha[FS_BTN_ACTION_ERASE] =
+ this->actionButtonAlpha[FS_BTN_ACTION_COPY];
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
index c6e3983d8..02236002a 100644
--- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c
@@ -1,78 +1,1059 @@
/*
* File: z_file_nameset_NES.c
* Overlay: ovl_file_choose
- * Description:
+ * Description: Entering name on a new file, selecting options from the options menu
*/
-#include "z_file_choose.h"
+#include "prevent_bss_reordering.h"
+#include "z_file_select.h"
#include "z64rumble.h"
+#include "misc/title_static/title_static.h"
+#include "overlays/ovl_file_choose/ovl_file_choose.h"
-extern UNK_TYPE D_01002800;
-extern UNK_TYPE D_01007980;
-extern UNK_TYPE D_0102A6B0;
-extern UNK_TYPE D_0102B170;
-extern UNK_TYPE D_010310F0;
-extern UNK_TYPE D_010311F0;
+void FileSelect_DrawTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture, s16 point) {
+ OPEN_DISPS(gfxCtx);
-// there are uses of D_0E000000.fillRect (appearing as D_0E0002E0) in this file
-extern GfxMasterList D_0E000000;
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_CLAMP,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804010.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808041A0.s")
+void FileSelect_DrawMultiTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture1, TexturePtr texture2, s16 point) {
+ OPEN_DISPS(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804654.s")
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, texture1, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gDPLoadMultiBlock_4b(POLY_OPA_DISP++, texture2, 0x0080, 1, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, point, point + 2, point + 3, point + 1, 0);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808047D8.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080489C.s")
+s16 D_80814280[] = {
+ 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 0, 3, 1, 0,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804DAC.s")
+s16 D_80814304[] = {
+ 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3,
+ 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804E74.s")
+s16 D_80814384[] = {
+ 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80804F98.s")
+s16 D_80814404[] = {
+ -94, -96, -48, 0, 32, 64,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080525C.s")
+s16 D_80814410[] = {
+ 56, 44, 44, 28, 28, 44,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808052B0.s")
+s16 D_8081441C[] = {
+ 72, -48, -48, -48, -48, -48,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808054A4.s")
+void FileSelect_SetKeyboardVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 phi_t2;
+ s16 phi_t0;
+ s16 phi_t3;
+ s16 phi_s1;
+ s16 phi_t1;
+ s16 phi_s2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808055D0.s")
+ this->keyboardVtx = GRAPH_ALLOC(this->state.gfxCtx, sizeof(Vtx) * 4 * 5 * 13);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808058A4.s")
+ phi_s1 = 0x26;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805918.s")
+ for (phi_t2 = 0, phi_s2 = 0, phi_t3 = 0; phi_s2 < 5; phi_s2++) {
+ phi_t0 = -0x60;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805A58.s")
+ for (phi_t1 = 0; phi_t1 < 13; phi_t1++, phi_t3 += 4, phi_t2++) {
+ //! @bug D_80814304 is accessed out of bounds when drawing the empty space character (value of 64). Under
+ //! normal circumstances it reads a halfword from D_80814384.
+ this->keyboardVtx[phi_t3].v.ob[0] = this->keyboardVtx[phi_t3 + 2].v.ob[0] = D_80814304[phi_t2] + phi_t0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805B30.s")
+ this->keyboardVtx[phi_t3 + 1].v.ob[0] = this->keyboardVtx[phi_t3 + 3].v.ob[0] =
+ D_80814304[phi_t2] + phi_t0 + 12;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80805C1C.s")
+ this->keyboardVtx[phi_t3].v.ob[1] = this->keyboardVtx[phi_t3 + 1].v.ob[1] = phi_s1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806014.s")
+ this->keyboardVtx[phi_t3 + 2].v.ob[1] = this->keyboardVtx[phi_t3 + 3].v.ob[1] = phi_s1 - 12;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806148.s")
+ this->keyboardVtx[phi_t3].v.ob[2] = this->keyboardVtx[phi_t3 + 1].v.ob[2] =
+ this->keyboardVtx[phi_t3 + 2].v.ob[2] = this->keyboardVtx[phi_t3 + 3].v.ob[2] = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806310.s")
+ this->keyboardVtx[phi_t3].v.flag = this->keyboardVtx[phi_t3 + 1].v.flag =
+ this->keyboardVtx[phi_t3 + 2].v.flag = this->keyboardVtx[phi_t3 + 3].v.flag = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808067E0.s")
+ this->keyboardVtx[phi_t3].v.tc[0] = this->keyboardVtx[phi_t3].v.tc[1] =
+ this->keyboardVtx[phi_t3 + 1].v.tc[1] = this->keyboardVtx[phi_t3 + 2].v.tc[0] = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806BC8.s")
+ this->keyboardVtx[phi_t3 + 1].v.tc[0] = this->keyboardVtx[phi_t3 + 2].v.tc[1] =
+ this->keyboardVtx[phi_t3 + 3].v.tc[0] = this->keyboardVtx[phi_t3 + 3].v.tc[1] = 16 << 5;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806CA0.s")
+ this->keyboardVtx[phi_t3].v.cn[0] = this->keyboardVtx[phi_t3 + 1].v.cn[0] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[0] = this->keyboardVtx[phi_t3 + 3].v.cn[0] =
+ this->keyboardVtx[phi_t3].v.cn[1] = this->keyboardVtx[phi_t3 + 1].v.cn[1] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[1] = this->keyboardVtx[phi_t3 + 3].v.cn[1] =
+ this->keyboardVtx[phi_t3].v.cn[2] = this->keyboardVtx[phi_t3 + 1].v.cn[2] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[2] = this->keyboardVtx[phi_t3 + 3].v.cn[2] =
+ this->keyboardVtx[phi_t3].v.cn[3] = this->keyboardVtx[phi_t3 + 1].v.cn[3] =
+ this->keyboardVtx[phi_t3 + 2].v.cn[3] = this->keyboardVtx[phi_t3 + 3].v.cn[3] =
+ 255;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806E84.s")
+ phi_t0 += 0x10;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80806F30.s")
+ phi_s1 -= 0x10;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808071E4.s")
+ this->keyboard2Vtx = GRAPH_ALLOC(this->state.gfxCtx, sizeof(Vtx) * 24);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_80807390.s")
+ for (phi_t1 = 0, phi_t3 = 0; phi_t3 < 6; phi_t3++, phi_t1 += 4) {
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_8080742C.s")
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[0] = this->keyboard2Vtx[phi_t1 + 2].v.ob[0] = D_80814404[phi_t3] + 1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808074B4.s")
+ this->keyboard2Vtx[phi_t1 + 1].v.ob[0] = this->keyboard2Vtx[phi_t1 + 3].v.ob[0] =
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[0] + D_80814410[phi_t3] - 2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/func_808077AC.s")
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[1] = this->keyboard2Vtx[phi_t1 + 1].v.ob[1] = D_8081441C[phi_t3] - 1;
+
+ this->keyboard2Vtx[phi_t1 + 2].v.ob[1] = this->keyboard2Vtx[phi_t1 + 3].v.ob[1] =
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[1] - 0xE;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.ob[2] = this->keyboard2Vtx[phi_t1 + 1].v.ob[2] =
+ this->keyboard2Vtx[phi_t1 + 2].v.ob[2] = this->keyboard2Vtx[phi_t1 + 3].v.ob[2] = 0;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.flag = this->keyboard2Vtx[phi_t1 + 1].v.flag =
+ this->keyboard2Vtx[phi_t1 + 2].v.flag = this->keyboard2Vtx[phi_t1 + 3].v.flag = 0;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.tc[0] = this->keyboard2Vtx[phi_t1 + 0].v.tc[1] =
+ this->keyboard2Vtx[phi_t1 + 1].v.tc[1] = this->keyboard2Vtx[phi_t1 + 2].v.tc[0] = 0;
+
+ this->keyboard2Vtx[phi_t1 + 1].v.tc[0] = this->keyboard2Vtx[phi_t1 + 3].v.tc[0] = D_80814410[phi_t3] << 5;
+
+ this->keyboard2Vtx[phi_t1 + 2].v.tc[1] = this->keyboard2Vtx[phi_t1 + 3].v.tc[1] = 16 << 5;
+
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[0] = this->keyboard2Vtx[phi_t1 + 1].v.cn[0] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[0] = this->keyboard2Vtx[phi_t1 + 3].v.cn[0] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[1] = this->keyboard2Vtx[phi_t1 + 1].v.cn[1] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[1] = this->keyboard2Vtx[phi_t1 + 3].v.cn[1] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[2] = this->keyboard2Vtx[phi_t1 + 1].v.cn[2] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[2] = this->keyboard2Vtx[phi_t1 + 3].v.cn[2] =
+ this->keyboard2Vtx[phi_t1 + 0].v.cn[3] = this->keyboard2Vtx[phi_t1 + 1].v.cn[3] =
+ this->keyboard2Vtx[phi_t1 + 2].v.cn[3] = this->keyboard2Vtx[phi_t1 + 3].v.cn[3] =
+ 255;
+ }
+}
+
+TexturePtr sBackspaceEndTextures[] = {
+ gFileSelBackspaceButtonTex,
+ gFileSelENDButtonENGTex,
+};
+
+u16 sBackspaceEndWidths[] = { 28, 44 };
+
+s16 D_80814434[] = {
+ -30, -16, -6, 4, 14, 24, 34, 44, 54, -16, -16, 0,
+};
+
+s16 D_8081444C[] = {
+ 72, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0,
+};
+
+/**
+ * Set vertices used by all elements of the name entry screen that are NOT the keyboard.
+ * This includes the cursor highlight, the name entry plate and characters, and the buttons.
+ */
+void FileSelect_SetNameEntryVtx(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ u8 temp;
+ s16 var_s0;
+ s16 var_t1;
+ s16 sp108;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gSPVertex(POLY_OPA_DISP++, this->keyboard2Vtx, 24, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelNameENGTex, G_IM_FMT_IA, G_IM_SIZ_8b, 56, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ for (var_t1 = 0, var_s0 = 0x10; var_t1 < 2; var_t1++, var_s0 += 4) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2], 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, sBackspaceEndTextures[var_t1], G_IM_FMT_IA, G_IM_SIZ_16b,
+ sBackspaceEndWidths[var_t1], 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
+ G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, var_s0, var_s0 + 2, var_s0 + 3, var_s0 + 1, 0);
+ }
+
+ this->nameEntryVtx = GRAPH_ALLOC(this->state.gfxCtx, 44 * sizeof(Vtx));
+
+ for (var_s0 = 0, var_t1 = 0; var_t1 < 44; var_t1 += 4, var_s0++) {
+ if ((var_s0 > 0) && (var_s0 < 9)) {
+ temp = this->fileNames[this->buttonIndex][var_s0 - 1];
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] = this->nameEntryVtx[var_t1 + 2].v.ob[0] =
+ D_80814434[var_s0] + this->nameEntryBoxPosX + D_80814280[temp];
+
+ this->nameEntryVtx[var_t1 + 1].v.ob[0] = this->nameEntryVtx[var_t1 + 3].v.ob[0] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] + 10;
+ } else {
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] = this->nameEntryVtx[var_t1 + 2].v.ob[0] =
+ D_80814434[var_s0] + this->nameEntryBoxPosX;
+
+ this->nameEntryVtx[var_t1 + 1].v.ob[0] = this->nameEntryVtx[var_t1 + 3].v.ob[0] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[0] + 10;
+ }
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[1] = this->nameEntryVtx[var_t1 + 1].v.ob[1] = D_8081444C[var_s0];
+
+ this->nameEntryVtx[var_t1 + 2].v.ob[1] = this->nameEntryVtx[var_t1 + 3].v.ob[1] =
+ this->nameEntryVtx[var_t1 + 0].v.ob[1] - 10;
+
+ this->nameEntryVtx[var_t1 + 0].v.ob[2] = this->nameEntryVtx[var_t1 + 1].v.ob[2] =
+ this->nameEntryVtx[var_t1 + 2].v.ob[2] = this->nameEntryVtx[var_t1 + 3].v.ob[2] = 0;
+
+ this->nameEntryVtx[var_t1 + 0].v.flag = this->nameEntryVtx[var_t1 + 1].v.flag =
+ this->nameEntryVtx[var_t1 + 2].v.flag = this->nameEntryVtx[var_t1 + 3].v.flag = 0;
+
+ this->nameEntryVtx[var_t1 + 0].v.tc[0] = this->nameEntryVtx[var_t1 + 0].v.tc[1] =
+ this->nameEntryVtx[var_t1 + 1].v.tc[1] = this->nameEntryVtx[var_t1 + 2].v.tc[0] = 0;
+
+ this->nameEntryVtx[var_t1 + 1].v.tc[0] = this->nameEntryVtx[var_t1 + 2].v.tc[1] =
+ this->nameEntryVtx[var_t1 + 3].v.tc[0] = this->nameEntryVtx[var_t1 + 3].v.tc[1] = 16 << 5;
+
+ this->nameEntryVtx[var_t1 + 0].v.cn[0] = this->nameEntryVtx[var_t1 + 1].v.cn[0] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[0] = this->nameEntryVtx[var_t1 + 3].v.cn[0] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[1] = this->nameEntryVtx[var_t1 + 1].v.cn[1] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[1] = this->nameEntryVtx[var_t1 + 3].v.cn[1] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[2] = this->nameEntryVtx[var_t1 + 1].v.cn[2] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[2] = this->nameEntryVtx[var_t1 + 3].v.cn[2] =
+ this->nameEntryVtx[var_t1 + 0].v.cn[3] = this->nameEntryVtx[var_t1 + 1].v.cn[3] =
+ this->nameEntryVtx[var_t1 + 2].v.cn[3] = this->nameEntryVtx[var_t1 + 3].v.cn[3] =
+ 255;
+ }
+
+ this->nameEntryVtx[1].v.ob[0] = this->nameEntryVtx[3].v.ob[0] = this->nameEntryVtx[0].v.ob[0] + 0x6C;
+ this->nameEntryVtx[2].v.ob[1] = this->nameEntryVtx[3].v.ob[1] = this->nameEntryVtx[0].v.ob[1] - 0x10;
+ this->nameEntryVtx[1].v.tc[0] = this->nameEntryVtx[3].v.tc[0] = 108 << 5;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->windowColor[0], this->windowColor[1], this->windowColor[2],
+ this->nameEntryBoxAlpha);
+ gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx, 4, 0);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelFileNameBoxTex, G_IM_FMT_IA, G_IM_SIZ_16b, 108, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gSPVertex(POLY_OPA_DISP++, this->nameEntryVtx + 4, 32, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->nameEntryBoxAlpha);
+
+ for (sp108 = 0, var_s0 = 0; var_s0 < 0x20; var_s0 += 4, sp108++) {
+ FileSelect_DrawTexQuadI4(
+ this->state.gfxCtx, font->fontBuf + this->fileNames[this->buttonIndex][sp108] * FONT_CHAR_TEX_SIZE, var_s0);
+ }
+
+ this->nameEntryVtx[37].v.tc[0] = this->nameEntryVtx[38].v.tc[1] = this->nameEntryVtx[39].v.tc[0] =
+ this->nameEntryVtx[39].v.tc[1] = this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[42].v.tc[1] =
+ this->nameEntryVtx[43].v.tc[0] = this->nameEntryVtx[43].v.tc[1] = 24 << 5;
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 56 << 5;
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ this->nameEntryVtx[41].v.tc[0] = this->nameEntryVtx[43].v.tc[0] = 40 << 5;
+ }
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawKeyboard(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ Font* font = &this->font;
+ s16 i;
+ s16 tmp;
+ s16 vtx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, COMBINED, 0,
+ 0, 0, COMBINED);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, this->charBgAlpha, 255, 255, 255, 255);
+
+ for (i = 0, vtx = 0; vtx < 0x100; vtx += 32) {
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[vtx], 32, 0);
+
+ for (tmp = 0; tmp < 32; i++, tmp += 4) {
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + D_808141F0[i] * FONT_CHAR_TEX_SIZE, tmp);
+ }
+ }
+
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[0x100], 4, 0);
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx, font->fontBuf + D_808141F0[i] * FONT_CHAR_TEX_SIZE, 0);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Font* font = &this->font;
+ Input* input = CONTROLLER1(&this->state);
+ s16 i;
+ s16 tmp;
+ u16 time;
+ s16 validName;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ FileSelect_SetKeyboardVtx(&this->state);
+ FileSelect_SetNameEntryVtx(&this->state);
+ FileSelect_PulsateCursor(&this->state);
+
+ tmp = (this->newFileNameCharCount * 4) + 4;
+ this->nameEntryVtx[36].v.ob[0] = this->nameEntryVtx[38].v.ob[0] = this->nameEntryVtx[tmp].v.ob[0] - 6;
+ this->nameEntryVtx[37].v.ob[0] = this->nameEntryVtx[39].v.ob[0] = this->nameEntryVtx[36].v.ob[0] + 24;
+ this->nameEntryVtx[36].v.ob[1] = this->nameEntryVtx[37].v.ob[1] = this->nameEntryVtx[tmp].v.ob[1] + 7;
+ this->nameEntryVtx[38].v.ob[1] = this->nameEntryVtx[39].v.ob[1] = this->nameEntryVtx[36].v.ob[1] - 24;
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[0] - 4;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 52;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[1] + 4;
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[0] - 4;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 40;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboard2Vtx[(this->kbdX + 1) * 4].v.ob[1] + 4;
+ } else {
+ this->nameEntryVtx[40].v.ob[0] = this->nameEntryVtx[42].v.ob[0] =
+ this->keyboardVtx[this->charIndex * 4].v.ob[0] - D_80814304[this->charIndex] - 6;
+ this->nameEntryVtx[41].v.ob[0] = this->nameEntryVtx[43].v.ob[0] = this->nameEntryVtx[40].v.ob[0] + 24;
+ this->nameEntryVtx[40].v.ob[1] = this->nameEntryVtx[41].v.ob[1] =
+ this->keyboardVtx[this->charIndex * 4].v.ob[1] + 6;
+ }
+
+ this->nameEntryVtx[42].v.ob[1] = this->nameEntryVtx[43].v.ob[1] = this->nameEntryVtx[40].v.ob[1] - 24;
+
+ gSPVertex(POLY_OPA_DISP++, &this->nameEntryVtx[36], 8, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, 1, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0, 1, 0, PRIMITIVE, 0, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->highlightColor[0], this->highlightColor[1], this->highlightColor[2],
+ this->highlightColor[3]);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelCharHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 24, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+
+ if ((this->kbdButton == FS_KBD_BTN_HIRA) || (this->kbdButton == FS_KBD_BTN_KATA) ||
+ (this->kbdButton == FS_KBD_BTN_END)) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelMediumButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 56, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ } else if ((this->kbdButton == FS_KBD_BTN_ENG) || (this->kbdButton == FS_KBD_BTN_BACKSPACE)) {
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gFileSelSmallButtonHighlightTex, G_IM_FMT_I, G_IM_SIZ_8b, 40, 24, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ }
+
+ gSP1Quadrangle(POLY_OPA_DISP++, 4, 6, 7, 5, 0);
+
+ FileSelect_DrawKeyboard(&this->state);
+ gDPPipeSync(POLY_OPA_DISP++);
+ Gfx_SetupDL42_Opa(this->state.gfxCtx);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ if (this->configMode == CM_NAME_ENTRY) {
+ if (CHECK_BTN_ALL(input->press.button, BTN_START)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ // place cursor on END button
+ this->kbdY = 5;
+ this->kbdX = 4;
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+ }
+ } else {
+ if (this->charPage <= FS_CHAR_PAGE_ENG) {
+ if (this->kbdY != 5) {
+ // draw the character the cursor is hovering over in yellow
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 0, 255);
+
+ //! @bug D_80814384 is accessed out of bounds when drawing the empty space character (value of 64).
+ //! Under normal circumstances it reads a halfword from D_80814404.
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 2].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] + D_80814384[this->charIndex] - 2;
+
+ this->keyboardVtx[(this->charIndex * 4) + 1].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 3].v.ob[0] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[0] + 0x10;
+
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 1].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] + 2;
+
+ this->keyboardVtx[(this->charIndex * 4) + 2].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 3].v.ob[1] =
+ this->keyboardVtx[(this->charIndex * 4) + 0].v.ob[1] - 0x10;
+
+ gSPVertex(POLY_OPA_DISP++, &this->keyboardVtx[this->charIndex * 4], 4, 0);
+
+ FileSelect_DrawTexQuadI4(this->state.gfxCtx,
+ font->fontBuf + D_808141F0[this->charIndex] * FONT_CHAR_TEX_SIZE, 0);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_S);
+ this->fileNames[this->buttonIndex][this->newFileNameCharCount] = D_808141F0[this->charIndex];
+
+ this->newFileNameCharCount++;
+
+ if (this->newFileNameCharCount > 7) {
+ this->newFileNameCharCount = 7;
+ }
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ if (this->charPage != this->kbdButton) {
+ if (this->kbdButton == FS_KBD_BTN_BACKSPACE) {
+ if ((this->newFileNameCharCount == 7) && (this->fileNames[this->buttonIndex][7] != 0x3E)) {
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ } else {
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ }
+
+ for (i = this->newFileNameCharCount; i < 7; i++) {
+ this->fileNames[this->buttonIndex][i] = this->fileNames[this->buttonIndex][i + 1];
+ }
+
+ this->fileNames[this->buttonIndex][i] = 0x3E;
+ play_sound(NA_SE_SY_FSEL_CLOSE);
+ }
+ } else if (this->kbdButton == FS_KBD_BTN_END) {
+ validName = false;
+
+ for (i = 0; i < 8; i++) {
+ if (this->fileNames[this->buttonIndex][i] != 0x3E) {
+ validName = true;
+ break;
+ }
+ }
+
+ if (validName) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ gSaveContext.fileNum = this->buttonIndex;
+ time = ((void)0, gSaveContext.save.time);
+ Sram_InitSave(this, sramCtx);
+ gSaveContext.save.time = time;
+
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[this->buttonIndex * 2],
+ gFlashSpecialSaveNumPages[this->buttonIndex * 2]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE;
+ }
+
+ this->nameBoxAlpha[this->buttonIndex] = this->nameAlpha[this->buttonIndex] = 200;
+ this->connectorAlpha[this->buttonIndex] = 255;
+ Rumble_Request(300.0f, 180, 20, 100);
+ } else {
+ play_sound(NA_SE_SY_FSEL_ERROR);
+ }
+ }
+ }
+ }
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->newFileNameCharCount++;
+
+ if (this->newFileNameCharCount > 7) {
+ this->newFileNameCharCount = 7;
+ }
+ } else if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->newFileNameCharCount--;
+
+ if (this->newFileNameCharCount < 0) {
+ this->newFileNameCharCount = 0;
+ }
+ }
+ }
+ }
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+/**
+ * Fade in the name entry box and slide it to the center of the screen from the right side.
+ * After the name entry box is in place, init the keyboard/cursor and change modes.
+ * Update function for `CM_START_NAME_ENTRY`
+ */
+void FileSelect_StartNameEntry(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameEntryBoxAlpha += 25;
+
+ if (this->nameEntryBoxAlpha >= 255) {
+ this->nameEntryBoxAlpha = 255;
+ }
+
+ this->nameEntryBoxPosX -= 30;
+
+ if (this->nameEntryBoxPosX <= 0) {
+ this->nameEntryBoxPosX = 0;
+ this->nameEntryBoxAlpha = 255;
+ this->kbdX = 0;
+ this->kbdY = 0;
+ this->kbdButton = FS_KBD_BTN_NONE;
+ this->configMode = CM_NAME_ENTRY;
+ }
+}
+
+/**
+ * Update the keyboard cursor and play sound effects at the appropriate times.
+ * There are many special cases for warping the cursor depending on where
+ * the cursor currently is.
+ * Update function for `CM_NAME_ENTRY`
+ */
+void FileSelect_UpdateKeyboardCursor(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 prevKbdX;
+
+ this->kbdButton = FS_KBD_BTN_NONE;
+
+ if (this->kbdY != 5) {
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->charIndex--;
+ this->kbdX--;
+ if (this->kbdX < 0) {
+ this->kbdX = 12;
+ this->charIndex = (this->kbdY * 13) + this->kbdX;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->charIndex++;
+ this->kbdX++;
+ if (this->kbdX > 12) {
+ this->kbdX = 0;
+ this->charIndex = (this->kbdY * 13) + this->kbdX;
+ }
+ }
+ } else {
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdX--;
+ if (this->kbdX < 3) {
+ this->kbdX = 4;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdX++;
+ if (this->kbdX > 4) {
+ this->kbdX = 3;
+ }
+ }
+ }
+
+ if (this->stickAdjY > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ this->kbdY--;
+
+ if (this->kbdY < 0) {
+ // Don't go to bottom row
+ if (this->kbdX < 8) {
+ this->kbdY = 4;
+ this->charIndex = (s32)(this->kbdX + 52);
+ } else {
+ this->kbdY = 5;
+ this->charIndex += 52;
+ prevKbdX = this->kbdX;
+
+ if (this->kbdX < 10) {
+ this->kbdX = 3;
+ } else if (this->kbdX < 13) {
+ this->kbdX = 4;
+ }
+ this->unk_2451E[this->kbdX] = prevKbdX;
+ }
+ } else {
+ this->charIndex -= 13;
+
+ if (this->kbdY == 4) {
+ this->charIndex = 52;
+ this->kbdX = this->unk_2451E[this->kbdX];
+ this->charIndex += this->kbdX;
+ }
+ }
+ } else if (this->stickAdjY < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ this->kbdY++;
+
+ if (this->kbdY > 5) {
+ this->kbdY = 0;
+ this->kbdX = this->unk_2451E[this->kbdX];
+ this->charIndex = this->kbdX;
+ } else {
+ this->charIndex += 13;
+
+ if (this->kbdY == 5) {
+ if (this->kbdX < 8) {
+ this->kbdY = 0;
+ this->charIndex = this->kbdX;
+ } else {
+ prevKbdX = this->kbdX;
+
+ if (this->kbdX < 3) {
+ this->kbdX = 0;
+ } else if (this->kbdX < 6) {
+ this->kbdX = 1;
+ } else if (this->kbdX < 8) {
+ this->kbdX = 2;
+ } else if (this->kbdX < 10) {
+ this->kbdX = 3;
+ } else if (this->kbdX < 13) {
+ this->kbdX = 4;
+ }
+ this->unk_2451E[this->kbdX] = prevKbdX;
+ }
+ }
+ }
+ }
+ if (this->kbdY == 5) {
+ this->kbdButton = this->kbdX;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_NameEntryWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_NAME_ENTRY_TO_MAIN;
+ }
+}
+
+/**
+ * This function is mostly a copy paste of `FileSelect_StartNameEntry`.
+ * The name entry box fades and slides in even though it is not visible.
+ * After this is complete, change to the options config mode.
+ * Update function for `CM_START_OPTIONS`
+ */
+void FileSelect_StartOptions(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+
+ this->nameEntryBoxAlpha += 25;
+
+ if (this->nameEntryBoxAlpha >= 255) {
+ this->nameEntryBoxAlpha = 255;
+ }
+
+ this->nameEntryBoxPosX -= 30;
+
+ if (this->nameEntryBoxPosX <= 0) {
+ this->nameEntryBoxPosX = 0;
+ this->nameEntryBoxAlpha = 255;
+ this->configMode = CM_OPTIONS_MENU;
+ }
+}
+
+u8 sSelectedSetting;
+// bss padding
+s32 D_80814E94;
+s32 D_80814E98;
+s32 D_80814E9C;
+s32 D_80814EA0;
+
+/**
+ * Update the cursor and appropriate settings for the options menu.
+ * If the player presses B, write the selected options to the SRAM header
+ * and set config mode to rotate back to the main menu.
+ * Update function for `CM_OPTIONS_MENU`
+ */
+void FileSelect_UpdateOptionsMenu(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+ Input* input = CONTROLLER1(&this->state);
+
+ if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ Sram_WriteSaveOptionsToBuffer(sramCtx);
+
+ if (!gSaveContext.flashSaveAvailable) {
+ this->configMode = CM_OPTIONS_TO_MAIN;
+ } else {
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[8], gFlashSpecialSaveNumPages[8]);
+ Sram_StartWriteToFlashDefault(sramCtx);
+ this->configMode = CM_OPTIONS_WAIT_FOR_FLASH_SAVE;
+ }
+ func_801A3D98(gSaveContext.options.audioSetting);
+ return;
+ }
+
+ if (this->stickAdjX < -30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gSaveContext.options.audioSetting--;
+
+ // because audio setting is unsigned, can't check for < 0
+ if (gSaveContext.options.audioSetting > 0xF0) {
+ gSaveContext.options.audioSetting = SAVE_AUDIO_SURROUND;
+ }
+ } else {
+ gSaveContext.options.zTargetSetting ^= 1;
+ }
+ } else if (this->stickAdjX > 30) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gSaveContext.options.audioSetting++;
+ if (gSaveContext.options.audioSetting > SAVE_AUDIO_SURROUND) {
+ gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO;
+ }
+ } else {
+ gSaveContext.options.zTargetSetting ^= 1;
+ }
+ }
+
+ if ((this->stickAdjY < -30) || (this->stickAdjY > 30)) {
+ play_sound(NA_SE_SY_FSEL_CURSOR);
+ sSelectedSetting ^= 1;
+ return;
+ }
+ if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
+ play_sound(NA_SE_SY_FSEL_DECIDE_L);
+ sSelectedSetting ^= 1;
+ }
+}
+
+/**
+ * Update and wait for the save to flash to complete.
+ * Update function for `CM_OPTIONS_WAIT_FOR_FLASH_SAVE`
+ */
+void FileSelect_OptionsWaitForFlashSave(GameState* thisx) {
+ FileSelectState* this = (FileSelectState*)thisx;
+ SramContext* sramCtx = &this->sramCtx;
+
+ Sram_UpdateWriteToFlashDefault(sramCtx);
+
+ if (sramCtx->status == 0) {
+ this->configMode = CM_OPTIONS_TO_MAIN;
+ }
+}
+
+typedef struct {
+ /* 0x0 */ TexturePtr texture;
+ /* 0x4 */ u16 width;
+ /* 0x6 */ u16 height;
+} OptionsMenuTextureInfo; // size = 0x8
+
+OptionsMenuTextureInfo gOptionsMenuHeaders[] = {
+ { gFileSelOptionsENGTex, 128, 16 }, { gFileSelSoundENGTex, 64, 16 },
+ { gFileSelTargetingENGTex, 64, 16 }, { gFileSelCheckBrightnessENGTex, 96, 16 },
+ { gFileSelDolbySurroundLogoENGTex, 48, 17 },
+};
+
+OptionsMenuTextureInfo gOptionsMenuSettings[] = {
+ { gFileSelStereoENGTex, 48, 16 }, { gFileSelMonoENGTex, 48, 16 }, { gFileSelHeadsetENGTex, 48, 16 },
+ { gFileSelSurroundENGTex, 48, 16 }, { gFileSelSwitchENGTex, 48, 16 }, { gFileSelHoldENGTex, 48, 16 },
+};
+
+void FileSelect_DrawOptionsImpl(GameState* thisx) {
+ static s16 sCursorPrimRed = 255;
+ static s16 sCursorPrimGreen = 255;
+ static s16 sCursorPrimBlue = 255;
+ static s16 sCursorEnvRed = 0;
+ static s16 sCursorEnvGreen = 0;
+ static s16 sCursorEnvBlue = 0;
+ static s16 sCursorPulseDir = 1;
+ static s16 sCursorFlashTimer = 20;
+ static s16 sCursorPrimColors[][3] = {
+ { 255, 255, 255 },
+ { 0, 255, 255 },
+ };
+ static s16 sCursorEnvColors[][3] = {
+ { 0, 0, 0 },
+ { 0, 150, 150 },
+ };
+ FileSelectState* this = (FileSelectState*)thisx;
+ s16 cursorRedStep;
+ s16 cursorGreenStep;
+ s16 cursorBlueStep;
+ s16 i;
+ s16 j;
+ s16 vtx;
+
+ OPEN_DISPS(this->state.gfxCtx);
+
+ cursorRedStep = ABS_ALT(sCursorPrimRed - sCursorPrimColors[sCursorPulseDir][0]) / sCursorFlashTimer;
+ cursorGreenStep = ABS_ALT(sCursorPrimGreen - sCursorPrimColors[sCursorPulseDir][1]) / sCursorFlashTimer;
+ cursorBlueStep = ABS_ALT(sCursorPrimBlue - sCursorPrimColors[sCursorPulseDir][2]) / sCursorFlashTimer;
+
+ if (sCursorPrimRed >= sCursorPrimColors[sCursorPulseDir][0]) {
+ sCursorPrimRed -= cursorRedStep;
+ } else {
+ sCursorPrimRed += cursorRedStep;
+ }
+
+ if (sCursorPrimGreen >= sCursorPrimColors[sCursorPulseDir][1]) {
+ sCursorPrimGreen -= cursorGreenStep;
+ } else {
+ sCursorPrimGreen += cursorGreenStep;
+ }
+
+ if (sCursorPrimBlue >= sCursorPrimColors[sCursorPulseDir][2]) {
+ sCursorPrimBlue -= cursorBlueStep;
+ } else {
+ sCursorPrimBlue += cursorBlueStep;
+ }
+
+ cursorRedStep = ABS_ALT(sCursorEnvRed - sCursorEnvColors[sCursorPulseDir][0]) / sCursorFlashTimer;
+ cursorGreenStep = ABS_ALT(sCursorEnvGreen - sCursorEnvColors[sCursorPulseDir][1]) / sCursorFlashTimer;
+ cursorBlueStep = ABS_ALT(sCursorEnvBlue - sCursorEnvColors[sCursorPulseDir][2]) / sCursorFlashTimer;
+
+ if (sCursorEnvRed >= sCursorEnvColors[sCursorPulseDir][0]) {
+ sCursorEnvRed -= cursorRedStep;
+ } else {
+ sCursorEnvRed += cursorRedStep;
+ }
+
+ if (sCursorEnvGreen >= sCursorEnvColors[sCursorPulseDir][1]) {
+ sCursorEnvGreen -= cursorGreenStep;
+ } else {
+ sCursorEnvGreen += cursorGreenStep;
+ }
+
+ if (sCursorEnvBlue >= sCursorEnvColors[sCursorPulseDir][2]) {
+ sCursorEnvBlue -= cursorBlueStep;
+ } else {
+ sCursorEnvBlue += cursorBlueStep;
+ }
+
+ if (--sCursorFlashTimer == 0) {
+ sCursorPrimRed = sCursorPrimColors[sCursorPulseDir][0];
+ sCursorPrimGreen = sCursorPrimColors[sCursorPulseDir][1];
+ sCursorPrimBlue = sCursorPrimColors[sCursorPulseDir][2];
+
+ sCursorEnvRed = sCursorEnvColors[sCursorPulseDir][0];
+ sCursorEnvGreen = sCursorEnvColors[sCursorPulseDir][1];
+ sCursorEnvBlue = sCursorEnvColors[sCursorPulseDir][2];
+
+ sCursorFlashTimer = 20;
+
+ if (++sCursorPulseDir > 1) {
+ sCursorPulseDir = 0;
+ }
+ }
+
+ // blue divider lines
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 0);
+
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelOptionsDividerTex, G_IM_FMT_IA, 256, 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);
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.1f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerTopVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.2f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerMiddleVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.4f, 0.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(this->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_OPA_DISP++, gOptionsDividerBottomVtx, 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+
+ gSPVertex(POLY_OPA_DISP++, D_80813DF0, 32, 0);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+
+ for (i = 0, vtx = 0; i < 5; i++, vtx += 4) {
+ if (i == 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ if (gSaveContext.options.audioSetting == SAVE_AUDIO_SURROUND) {
+ gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuHeaders[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuHeaders[i].width, gOptionsMenuHeaders[i].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++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ gSPVertex(POLY_OPA_DISP++, D_80813F30, 32, 0);
+
+ for (i = 0, vtx = 0; i < 4; i++, vtx += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ if (i == gSaveContext.options.audioSetting) {
+ if (sSelectedSetting == FS_SETTING_AUDIO) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimRed, sCursorPrimGreen, sCursorPrimBlue,
+ this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvRed, sCursorEnvGreen, sCursorEnvBlue, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuSettings[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuSettings[i].width, gOptionsMenuHeaders[i].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++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ for (; i < 6; i++, vtx += 4) {
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ if (i == (gSaveContext.options.zTargetSetting + 4)) {
+ if (sSelectedSetting == FS_SETTING_ZTARGET) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimRed, sCursorPrimGreen, sCursorPrimBlue,
+ this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvRed, sCursorEnvGreen, sCursorEnvBlue, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 120, 120, 120, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuSettings[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b,
+ gOptionsMenuSettings[i].width, gOptionsMenuHeaders[i].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++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ // check brightness bars
+ gDPLoadTextureBlock_4b(POLY_OPA_DISP++, gFileSelBrightnessCheckTex, G_IM_FMT_IA, 96, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 55, 55, 55, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 40, 40, 40, 255);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+
+ vtx += 4;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 30, 30, 30, this->titleAlpha[FS_TITLE_CUR]);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ gSP1Quadrangle(POLY_OPA_DISP++, vtx, vtx + 2, vtx + 3, vtx + 1, 0);
+
+ CLOSE_DISPS(this->state.gfxCtx);
+}
+
+void FileSelect_DrawOptions(GameState* thisx) {
+ FileSelect_DrawOptionsImpl(thisx);
+}
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
new file mode 100644
index 000000000..47619b66d
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_data.c
@@ -0,0 +1,17 @@
+#include "z_file_select.h"
+
+// Vtx Data
+#include "overlays/ovl_file_choose/ovl_file_choose.c"
+
+u8 D_808141F0[] = {
+ // 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M'
+ /* Row 0 */ 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
+ // 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z'
+ /* Row 1 */ 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23,
+ // 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm'
+ /* Row 2 */ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
+ // 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z'
+ /* Row 3 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
+ // '1' '2' '3' '4' '5' '6' '7' '8' '9' '0' '.' '-' ' '
+ /* Row 4 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x40, 0x3F, 0x3E
+};
diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_select.h b/src/overlays/gamestates/ovl_file_choose/z_file_select.h
new file mode 100644
index 000000000..88236e63e
--- /dev/null
+++ b/src/overlays/gamestates/ovl_file_choose/z_file_select.h
@@ -0,0 +1,332 @@
+#ifndef FILE_SELECT_H
+#define FILE_SELECT_H
+
+#include "global.h"
+#include "z64game.h"
+#include "z64message.h"
+#include "z64skybox.h"
+#include "z64view.h"
+
+
+// `sramCtx->noFlashSaveBuf` is never allocated space, so should never be used
+// Slot offsets are also based on OoT SaveContext sizes, and contains incorrect sizes from MM
+// Macros appear to be remnant from OoT
+#define NO_FLASH_GET_NEWF(sramCtx, slotNum, index) \
+ (sramCtx->noFlashSaveBuf[gSramSlotOffsets[slotNum] + offsetof(SaveContext, save.saveInfo.playerData.newf[index])])
+#define NO_FLASH_SLOT_OCCUPIED(sramCtx, slotNum) \
+ ((NO_FLASH_GET_NEWF(sramCtx, slotNum, 0) == 'Z') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 1) == 'E') || \
+ (NO_FLASH_GET_NEWF(sramCtx, slotNum, 2) == 'L') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 3) == 'D') || \
+ (NO_FLASH_GET_NEWF(sramCtx, slotNum, 4) == 'A') || (NO_FLASH_GET_NEWF(sramCtx, slotNum, 5) == '3'))
+
+#define GET_NEWF(fileSelect, slotNum, index) (fileSelect->newf[slotNum][index])
+#define SLOT_OCCUPIED(fileSelect, slotNum) \
+ ((GET_NEWF(fileSelect, slotNum, 0) == 'Z') && (GET_NEWF(fileSelect, slotNum, 1) == 'E') && \
+ (GET_NEWF(fileSelect, slotNum, 2) == 'L') && (GET_NEWF(fileSelect, slotNum, 3) == 'D') && \
+ (GET_NEWF(fileSelect, slotNum, 4) == 'A') && (GET_NEWF(fileSelect, slotNum, 5) == '3'))
+
+// Init mode: Initial setup as the file select is starting up, fades and slides in various menu elements
+// Config mode: Handles the bulk of the file select, various configuration tasks like picking a file, copy/erase, and the options menu
+// Select mode: Displays the selected file with various details about it, and allows the player to confirm and open it
+typedef enum {
+ /* 0 */ FS_MENU_MODE_INIT,
+ /* 1 */ FS_MENU_MODE_CONFIG,
+ /* 2 */ FS_MENU_MODE_SELECT
+} MenuMode;
+
+typedef enum {
+ /* 0x00 */ CM_FADE_IN_START,
+ /* 0x01 */ CM_FADE_IN_END,
+ /* 0x02 */ CM_MAIN_MENU,
+ /* 0x03 */ CM_SETUP_COPY_SOURCE,
+ /* 0x04 */ CM_SELECT_COPY_SOURCE,
+ /* 0x05 */ CM_SETUP_COPY_DEST_1,
+ /* 0x06 */ CM_SETUP_COPY_DEST_2,
+ /* 0x07 */ CM_SELECT_COPY_DEST,
+ /* 0x08 */ CM_EXIT_TO_COPY_SOURCE_1,
+ /* 0x09 */ CM_EXIT_TO_COPY_SOURCE_2,
+ /* 0x0A */ CM_SETUP_COPY_CONFIRM_1,
+ /* 0x0B */ CM_SETUP_COPY_CONFIRM_2,
+ /* 0x0C */ CM_COPY_CONFIRM,
+ /* 0x0D */ CM_COPY_WAIT_FOR_FLASH_SAVE,
+ /* 0x0E */ CM_RETURN_TO_COPY_DEST,
+ /* 0x0F */ CM_COPY_ANIM_1,
+ /* 0x10 */ CM_COPY_ANIM_2,
+ /* 0x11 */ CM_COPY_ANIM_3,
+ /* 0x12 */ CM_COPY_ANIM_4,
+ /* 0x13 */ CM_COPY_ANIM_5,
+ /* 0x14 */ CM_COPY_RETURN_MAIN,
+ /* 0x15 */ CM_SETUP_ERASE_SELECT,
+ /* 0x16 */ CM_ERASE_SELECT,
+ /* 0x17 */ CM_SETUP_ERASE_CONFIRM_1,
+ /* 0x18 */ CM_SETUP_ERASE_CONFIRM_2,
+ /* 0x19 */ CM_ERASE_CONFIRM,
+ /* 0x1A */ CM_EXIT_TO_ERASE_SELECT_1,
+ /* 0x1B */ CM_EXIT_TO_ERASE_SELECT_2,
+ /* 0x1C */ CM_ERASE_ANIM_1,
+ /* 0x1D */ CM_ERASE_WAIT_FOR_FLASH_SAVE,
+ /* 0x1E */ CM_ERASE_ANIM_2,
+ /* 0x1F */ CM_ERASE_ANIM_3,
+ /* 0x20 */ CM_EXIT_ERASE_TO_MAIN,
+ /* 0x21 */ CM_UNUSED_31,
+ /* 0x22 */ CM_ROTATE_TO_NAME_ENTRY,
+ /* 0x23 */ CM_START_NAME_ENTRY,
+ /* 0x24 */ CM_NAME_ENTRY,
+ /* 0x25 */ CM_NAME_ENTRY_WAIT_FOR_FLASH_SAVE,
+ /* 0x26 */ CM_NAME_ENTRY_TO_MAIN,
+ /* 0x27 */ CM_MAIN_TO_OPTIONS,
+ /* 0x28 */ CM_START_OPTIONS,
+ /* 0x29 */ CM_OPTIONS_MENU,
+ /* 0x2A */ CM_OPTIONS_WAIT_FOR_FLASH_SAVE,
+ /* 0x2B */ CM_OPTIONS_TO_MAIN,
+ /* 0x2C */ CM_UNUSED_DELAY
+} ConfigMode;
+
+typedef enum {
+ /* 0 */ SM_FADE_MAIN_TO_SELECT,
+ /* 1 */ SM_MOVE_FILE_TO_TOP,
+ /* 2 */ SM_FADE_IN_FILE_INFO,
+ /* 3 */ SM_CONFIRM_FILE,
+ /* 4 */ SM_FADE_OUT_FILE_INFO,
+ /* 5 */ SM_MOVE_FILE_TO_SLOT,
+ /* 6 */ SM_FADE_OUT,
+ /* 7 */ SM_LOAD_GAME
+} SelectMode;
+
+typedef enum {
+ /* 0 */ FS_TITLE_SELECT_FILE, // "Please select a file."
+ /* 1 */ FS_TITLE_OPEN_FILE, // "Open this file?"
+ /* 2 */ FS_TITLE_COPY_FROM, // "Copy which file?"
+ /* 3 */ FS_TITLE_COPY_TO, // "Copy to which file?"
+ /* 4 */ FS_TITLE_COPY_CONFIRM, // "Are you sure?"
+ /* 5 */ FS_TITLE_COPY_COMPLETE, // "File copied."
+ /* 6 */ FS_TITLE_ERASE_FILE, // "Erase which file?"
+ /* 7 */ FS_TITLE_ERASE_CONFIRM, // "Are you sure?"
+ /* 8 */ FS_TITLE_ERASE_COMPLETE // "File erased."
+} TitleLabel;
+
+typedef enum {
+ /* 0 */ FS_TITLE_CUR,
+ /* 1 */ FS_TITLE_NEXT
+} TitleIndex;
+
+typedef enum {
+ /* -1 */ FS_WARNING_NONE = -1,
+ /* 0 */ FS_WARNING_NO_FILE_COPY, // "No file to copy."
+ /* 1 */ FS_WARNING_NO_FILE_ERASE, // "No file to erase."
+ /* 2 */ FS_WARNING_NO_EMPTY_FILES, // "There is no empty file."
+ /* 3 */ FS_WARNING_FILE_EMPTY, // "This is an empty file."
+ /* 4 */ FS_WARNING_FILE_IN_USE // "This file is in use."
+} WarningLabel;
+
+typedef enum {
+ /* 0 */ FS_BTN_MAIN_FILE_1,
+ /* 1 */ FS_BTN_MAIN_FILE_2,
+ /* 2 */ FS_BTN_MAIN_FILE_3,
+ /* 3 */ FS_BTN_MAIN_COPY,
+ /* 4 */ FS_BTN_MAIN_ERASE,
+ /* 5 */ FS_BTN_MAIN_OPTIONS
+} MainMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_COPY_FILE_1,
+ /* 1 */ FS_BTN_COPY_FILE_2,
+ /* 2 */ FS_BTN_COPY_FILE_3,
+ /* 3 */ FS_BTN_COPY_QUIT
+} CopyMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_ERASE_FILE_1,
+ /* 1 */ FS_BTN_ERASE_FILE_2,
+ /* 2 */ FS_BTN_ERASE_FILE_3,
+ /* 3 */ FS_BTN_ERASE_QUIT
+} EraseMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_SELECT_FILE_1,
+ /* 1 */ FS_BTN_SELECT_FILE_2,
+ /* 2 */ FS_BTN_SELECT_FILE_3,
+ /* 3 */ FS_BTN_SELECT_YES,
+ /* 4 */ FS_BTN_SELECT_QUIT
+} SelectMenuButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_CONFIRM_YES,
+ /* 1 */ FS_BTN_CONFIRM_QUIT
+} ConfirmButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_BTN_ACTION_COPY,
+ /* 1 */ FS_BTN_ACTION_ERASE
+} ActionButtonIndex;
+
+typedef enum {
+ /* 0 */ FS_SETTING_AUDIO,
+ /* 1 */ FS_SETTING_ZTARGET
+} SettingIndex;
+
+typedef enum {
+ /* 0 */ FS_CHAR_PAGE_HIRA,
+ /* 1 */ FS_CHAR_PAGE_KATA,
+ /* 2 */ FS_CHAR_PAGE_ENG
+} CharPage;
+
+typedef enum {
+ /* 0 */ FS_KBD_BTN_HIRA,
+ /* 1 */ FS_KBD_BTN_KATA,
+ /* 2 */ FS_KBD_BTN_ENG,
+ /* 3 */ FS_KBD_BTN_BACKSPACE,
+ /* 4 */ FS_KBD_BTN_END,
+ /* 99 */ FS_KBD_BTN_NONE = 99
+} KeyboardButton;
+
+typedef struct FileSelectState {
+ /* 0x00000 */ GameState state;
+ /* 0x000A4 */ Vtx* windowVtx;
+ /* 0x000A8 */ u8* staticSegment;
+ /* 0x000AC */ u8* parameterSegment;
+ /* 0x000B0 */ u8* titleSegment;
+ /* 0x000B8 */ View view;
+ /* 0x00220 */ SramContext sramCtx;
+ /* 0x00248 */ SkyboxContext skyboxCtx;
+ /* 0x00470 */ MessageContext msgCtx;
+ /* 0x12550 */ Font font;
+ /* 0x242E0 */ EnvironmentContext envCtx;
+ /* 0x243E0 */ UNK_TYPE1 pad243E0[0x4];
+ /* 0x243E4 */ Vtx* windowContentVtx;
+ /* 0x243E8 */ Vtx* keyboardVtx;
+ /* 0x243EC */ Vtx* nameEntryVtx;
+ /* 0x243F0 */ Vtx* keyboard2Vtx;
+ /* 0x243F4 */ u8 newf[4][6];
+ /* 0x2440C */ u16 threeDayResetCount[4];
+ /* 0x24414 */ char fileNames[4][8];
+ /* 0x24434 */ s16 healthCapacity[4];
+ /* 0x2443C */ s16 health[4];
+ /* 0x24444 */ u32 questItems[4];
+ /* 0x24454 */ s8 defenseHearts[4];
+ /* 0x24458 */ u16 time[4];
+ /* 0x24460 */ s16 day[4];
+ /* 0x24468 */ u8 isOwlSave[4];
+ /* 0x2446C */ s16 rupees[4];
+ /* 0x24474 */ u8 walletUpgrades[4];
+ /* 0x24478 */ u8 maskCount[4];
+ /* 0x2447C */ u8 heartPieceCount[4];
+ /* 0x24480 */ s16 buttonIndex; // enum will depend on `ConfigMode`
+ /* 0x24482 */ s16 confirmButtonIndex; // see `ConfirmButtonIndex` enum
+ /* 0x24484 */ s16 menuMode; // see `MenuMode` enum
+ /* 0x24486 */ s16 configMode; // see `ConfigMode` enum
+ /* 0x24488 */ s16 prevConfigMode; // see `ConfigMode` enum
+ /* 0x2448A */ s16 nextConfigMode; // see `ConfigMode` enum
+ /* 0x2448C */ s16 selectMode; // see `SelectMode` enum
+ /* 0x2448E */ s16 selectedFileIndex;
+ /* 0x24490 */ UNK_TYPE1 pad24490[0x2];
+ /* 0x24492 */ s16 fileNamesY[3];
+ /* 0x24498 */ s16 actionTimer;
+ /* 0x2449A */ s16 buttonYOffsets[6];
+ /* 0x244A6 */ s16 copyDestFileIndex;
+ /* 0x244A8 */ s16 warningLabel;
+ /* 0x244AA */ s16 warningButtonIndex;
+ /* 0x244AC */ s16 titleLabel; // see `TitleLabel` enum
+ /* 0x244AE */ s16 nextTitleLabel; // see `TitleLabel` enum
+ /* 0x244B0 */ s16 windowColor[3];
+ /* 0x244B6 */ s16 titleAlpha[2]; // see `TitleIndex` enum
+ /* 0x244BA */ s16 windowAlpha;
+ /* 0x244BC */ s16 fileButtonAlpha[3];
+ /* 0x244C2 */ s16 nameBoxAlpha[3];
+ /* 0x244C8 */ s16 nameAlpha[3];
+ /* 0x244CE */ s16 connectorAlpha[3];
+ /* 0x244D4 */ s16 fileInfoAlpha[3];
+ /* 0x244DA */ s16 actionButtonAlpha[2];
+ /* 0x244DA */ s16 confirmButtonAlpha[2];
+ /* 0x244E2 */ s16 optionButtonAlpha;
+ /* 0x244E4 */ s16 nameEntryBoxAlpha;
+ /* 0x244E6 */ s16 controlsAlpha;
+ /* 0x244E8 */ s16 emptyFileTextAlpha;
+ /* 0x244EA */ s16 highlightColor[4];
+ /* 0x244F2 */ s16 highlightPulseDir;
+ /* 0x244F4 */ s16 unk_244F4;
+ /* 0x244F6 */ s16 confirmButtonTexIndices[2];
+ /* 0x244FA */ s16 inputTimerX;
+ /* 0x244FC */ s16 inputTimerY;
+ /* 0x244FE */ s16 stickXDir;
+ /* 0x24500 */ s16 stickYDir;
+ /* 0x24502 */ s16 stickAdjX;
+ /* 0x24504 */ s16 stickAdjY;
+ /* 0x24506 */ s16 nameEntryBoxPosX;
+ /* 0x24508 */ s16 windowPosX;
+ /* 0x2450A */ s16 screenFillAlpha;
+ /* 0x2450C */ f32 windowRot;
+ /* 0x24510 */ s16 kbdButton;
+ /* 0x24512 */ s16 charPage;
+ /* 0x24514 */ s16 charBgAlpha;
+ /* 0x24516 */ s16 charIndex;
+ /* 0x24518 */ s16 kbdX;
+ /* 0x2451A */ s16 kbdY;
+ /* 0x2451C */ s16 newFileNameCharCount;
+ /* 0x2451E */ s16 unk_2451E[5];
+ /* 0x24528 */ s16 highlightTimer;
+ /* 0x2452A */ s16 unk_2452A;
+ /* 0x2452C */ s16 unk_2452C[4];
+ /* 0x24534 */ s16 unk_24534[4];
+ /* 0x2453C */ s16 unk_2453C[4];
+ /* 0x24544 */ s16 unk_24544[4];
+ /* 0x2454C */ s16 unk_2454C;
+ /* 0x2454E */ s16 unk_2454E;
+ /* 0x24550 */ s16 unk_24550;
+} FileSelectState; // size = 0x24558
+
+void FileSelect_Init(GameState* thisx);
+void FileSelect_Destroy(GameState* thisx);
+
+void FileSelect_PulsateCursor(GameState* thisx);
+void FileSelect_DrawNameEntry(GameState* thisx);
+void FileSelect_DrawOptions(GameState* thisx);
+void FileSelect_DrawTexQuadI4(GraphicsContext* gfxCtx, TexturePtr texture, s16 point);
+
+// Copying Files
+void FileSelect_SetupCopySource(GameState* thisx);
+void FileSelect_SelectCopySource(GameState* thisx);
+void FileSelect_SetupCopyDest1(GameState* thisx);
+void FileSelect_SetupCopyDest2(GameState* thisx);
+void FileSelect_SelectCopyDest(GameState* thisx);
+void FileSelect_ExitToCopySource1(GameState* thisx);
+void FileSelect_ExitToCopySource2(GameState* thisx);
+void FileSelect_SetupCopyConfirm1(GameState* thisx);
+void FileSelect_SetupCopyConfirm2(GameState* thisx);
+void FileSelect_CopyConfirm(GameState* thisx);
+void FileSelect_CopyWaitForFlashSave(GameState* thisx);
+void FileSelect_ReturnToCopyDest(GameState* thisx);
+void FileSelect_CopyAnim1(GameState* thisx);
+void FileSelect_CopyAnim2(GameState* thisx);
+void FileSelect_CopyAnim3(GameState* thisx);
+void FileSelect_CopyAnim4(GameState* thisx);
+void FileSelect_CopyAnim5(GameState* thisx);
+void FileSelect_ExitCopyToMain(GameState* thisx);
+
+// Erasing Files
+void FileSelect_SetupEraseSelect(GameState* thisx);
+void FileSelect_EraseSelect(GameState* thisx);
+void FileSelect_SetupEraseConfirm1(GameState* thisx);
+void FileSelect_SetupEraseConfirm2(GameState* thisx);
+void FileSelect_EraseConfirm(GameState* thisx);
+void FileSelect_ExitToEraseSelect1(GameState* thisx);
+void FileSelect_ExitToEraseSelect2(GameState* thisx);
+void FileSelect_EraseAnim1(GameState* thisx);
+void FileSelect_EraseWaitForFlashSave(GameState* thisx);
+void FileSelect_EraseAnim2(GameState* thisx);
+void FileSelect_EraseAnim3(GameState* thisx);
+void FileSelect_ExitEraseToMain(GameState* thisx);
+
+// Entering Name
+void FileSelect_StartNameEntry(GameState* thisx);
+void FileSelect_UpdateKeyboardCursor(GameState* thisx);
+void FileSelect_NameEntryWaitForFlashSave(GameState* thisx);
+
+// Selecting Options
+void FileSelect_StartOptions(GameState* thisx);
+void FileSelect_UpdateOptionsMenu(GameState* thisx);
+void FileSelect_OptionsWaitForFlashSave(GameState* thisx);
+
+extern u8 D_808141F0[];
+extern s16 D_80814280[];
+
+#endif
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.c b/src/overlays/gamestates/ovl_opening/z_opening.c
index 9697b111f..84425cc73 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.c
+++ b/src/overlays/gamestates/ovl_opening/z_opening.c
@@ -4,9 +4,12 @@
* Description: Initializes the game into the title screen
*/
+#include "global.h"
#include "z_opening.h"
+#include "z64save.h"
#include "z64shrink_window.h"
#include "z64view.h"
+#include "regs.h"
void TitleSetup_SetupTitleScreen(TitleSetupState* this) {
static s32 sOpeningEntrances[] = { ENTRANCE(CUTSCENE, 0), ENTRANCE(CUTSCENE, 1) };
diff --git a/src/overlays/gamestates/ovl_opening/z_opening.h b/src/overlays/gamestates/ovl_opening/z_opening.h
index 36a01ffe9..530b069e1 100644
--- a/src/overlays/gamestates/ovl_opening/z_opening.h
+++ b/src/overlays/gamestates/ovl_opening/z_opening.h
@@ -1,15 +1,15 @@
-#ifndef _Z64_OPENING_H_
-#define _Z64_OPENING_H_
+#ifndef Z64_OPENING_H
+#define Z64_OPENING_H
-#include "global.h"
+#include "z64game.h"
+#include "z64view.h"
+
+typedef struct {
+ /* 0x000 */ GameState state;
+ /* 0x0A8 */ View view;
+} TitleSetupState; // size = 0x210
void TitleSetup_Init(GameState* thisx);
void TitleSetup_Destroy(GameState* thisx);
-typedef struct {
- /* 0x000 */ GameState state;
- /* 0x0A4 */ UNK_TYPE1 unk_A4[0x4];
- /* 0x0A8 */ View view;
-} TitleSetupState; // size = 0x210
-
#endif
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_select/z_select.h b/src/overlays/gamestates/ovl_select/z_select.h
index 69312e986..876c9e3ff 100644
--- a/src/overlays/gamestates/ovl_select/z_select.h
+++ b/src/overlays/gamestates/ovl_select/z_select.h
@@ -1,16 +1,17 @@
-#ifndef _Z64_SELECT_H_
-#define _Z64_SELECT_H_
+#ifndef Z64_SELECT_H
+#define Z64_SELECT_H
-#include "global.h"
+#include "z64game.h"
+#include "z64view.h"
struct MapSelectState;
typedef void (*SelectLoadFunc)(struct MapSelectState*, u32, s32);
typedef struct {
- /* 0x00 */ char* name;
- /* 0x04 */ SelectLoadFunc loadFunc;
- /* 0x08 */ s32 entrance;
+ /* 0x0 */ char* name;
+ /* 0x4 */ SelectLoadFunc loadFunc;
+ /* 0x8 */ s32 entrance;
} SceneSelectEntry; // size = 0xC
typedef struct MapSelectState {
diff --git a/src/overlays/gamestates/ovl_title/z_title.c b/src/overlays/gamestates/ovl_title/z_title.c
index 01e29668e..abde294e5 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,13 +165,13 @@ 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;
}
- gSaveContext.unk_3F3F = true;
+ gSaveContext.flashSaveAvailable = true;
Sram_Alloc(thisx, &this->sramCtx);
this->ult = 0;
this->timer = 20;
diff --git a/src/overlays/gamestates/ovl_title/z_title.h b/src/overlays/gamestates/ovl_title/z_title.h
index 0cb19da1a..ee5d5c841 100644
--- a/src/overlays/gamestates/ovl_title/z_title.h
+++ b/src/overlays/gamestates/ovl_title/z_title.h
@@ -2,9 +2,8 @@
#define Z64_TITLE_H
#include "global.h"
-
-void ConsoleLogo_Init(GameState* thisx);
-void ConsoleLogo_Destroy(GameState* thisx);
+#include "z64game.h"
+#include "z64view.h"
typedef struct {
/* 0x000 */ GameState state;
@@ -20,4 +19,7 @@ typedef struct {
/* 0x244 */ u8 exit;
} ConsoleLogoState; // size = 0x248
+void ConsoleLogo_Init(GameState* thisx);
+void ConsoleLogo_Destroy(GameState* thisx);
+
#endif
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 fe72ee840..1b18adcd1 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
@@ -13,7 +13,7 @@ extern TexturePtr D_08061000; // gBombersNotebookIconTex
extern TexturePtr D_08062000; // gSongNoteIconTex
s16 sQuestRemainsColorTimerInit[] = { 120, 60, 2, 80 };
-s16 sQuestHpColorTimerInit[] = { 20, 4, 20, 10 };
+s16 sQuestHpColorTimerInits[] = { 20, 4, 20, 10 };
s16 sQuestSongPlayedOcarinaButtonsNum = 0;
u8 sQuestSongPlayedOcarinaButtons[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
s16 sQuestSongPlayedOcarinaButtonsAlpha[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
@@ -62,9 +62,6 @@ s16 sQuestRemainsEnvBlue[] = {
150, // Unused
};
-#ifdef NON_EQUIVALENT
-// TODO: is actually NON_MATCHING, update once `z_kaleido_scope_NES.c` is decompiled
-// A single small regalloc at the first `Gfx_DrawTexQuadIA8` for the heart piece count (see `gItemIcons`)
void KaleidoScope_DrawQuestStatus(PlayState* play) {
static s16 sQuestRemainsColorTimer = 20;
static s16 sQuestRemainsColorTimerIndex = 0;
@@ -135,10 +132,11 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
s16 k;
s16 skullTokenDigits[3];
u16 isDigitDrawn;
+ u32* questItemsPtr;
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);
@@ -315,13 +313,18 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
sQuestHpPrimGreen = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][1];
sQuestHpPrimBlue = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][2];
sQuestHpPrimAlpha = sQuestHpPrimColorTargets[sQuestHpPrimColorTargetIndex][3];
- sQuestHpColorTimer = sQuestHpColorTimerInit[sQuestHpPrimColorTargetIndex];
+ sQuestHpColorTimer = sQuestHpColorTimerInits[sQuestHpPrimColorTargetIndex];
if (++sQuestHpPrimColorTargetIndex > 3) {
sQuestHpPrimColorTargetIndex = 0;
}
}
- if ((GET_SAVE_INVENTORY_QUEST_ITEMS >> QUEST_HEART_PIECE_COUNT) != 0) {
+ //! FAKE: Used to load `0xF0000000` early
+ if ((GET_SAVE_INVENTORY_QUEST_ITEMS & 0xF0000000) != 0) {}
+ questItemsPtr = &gSaveContext.save.saveInfo.inventory.questItems;
+ if (1) {}
+
+ if ((*questItemsPtr >> QUEST_HEART_PIECE_COUNT) != 0) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
@@ -391,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;
@@ -548,34 +551,6 @@ void KaleidoScope_DrawQuestStatus(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-#else
-s16 sQuestRemainsColorTimer = 20;
-s16 sQuestRemainsColorTimerIndex = 0;
-s16 sQuestHpPrimRed = 0;
-s16 sQuestHpPrimGreen = 0;
-s16 sQuestHpPrimBlue = 0;
-s16 sQuestHpPrimAlpha = 0;
-s16 sQuestHpColorTimer = 20;
-s16 sQuestHpPrimColorTargetIndex = 0;
-TexturePtr sOcarinaButtonTextures[] = {
- gOcarinaATex, gOcarinaCDownTex, gOcarinaCRightTex, gOcarinaCLeftTex, gOcarinaCUpTex,
-};
-s16 sQuestSongsPrimRed[] = {
- 150, 255, 100, 255, 255, 255, 255, 255, 255, 255, 255, 255,
-};
-s16 sQuestSongsPrimGreen[] = {
- 255, 80, 150, 160, 100, 240, 255, 255, 255, 255, 255, 255,
-};
-s16 sQuestSongsPrimBlue[] = {
- 100, 40, 255, 0, 255, 100, 255, 255, 255, 255, 255, 255,
-};
-TexturePtr sQuestUpgradeTextures[][3] = {
- { 0x08053000, 0x08054000, 0x08055000 },
- { 0x08056000, 0x08057000, 0x08058000 },
-};
-u8 sQuestUpgrades[] = { UPG_QUIVER, UPG_BOMB_BAG };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_DrawQuestStatus.s")
-#endif
typedef enum {
/* -3 */ CURSOR_TO_LEFT = -3, // Cursor on the "scroll to left page" position
@@ -588,7 +563,7 @@ typedef struct {
/* 0x2 */ s16 down;
/* 0x4 */ s16 left;
/* 0x6 */ s16 right;
-} CursorPointDirection;
+} CursorPointDirection; // size = 0x8
void KaleidoScope_UpdateQuestCursor(PlayState* play) {
static s16 sQuestSongPlaybackDelayTimer = 0;
@@ -643,7 +618,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].left;
if (nextCursorPoint == CURSOR_TO_LEFT) {
@@ -666,7 +641,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
if (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
nextCursorPoint = sCursorPointLinks[oldCursorPoint].right;
if (nextCursorPoint == CURSOR_TO_RIGHT) {
@@ -691,7 +666,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
nextCursorPoint = sCursorPointLinks[oldCursorPoint].down;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -704,7 +679,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
}
nextCursorPoint = sCursorPointLinks[oldCursorPoint].up;
while (nextCursorPoint > CURSOR_NONE) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (KaleidoScope_UpdateQuestStatusPoint(pauseCtx, nextCursorPoint)) {
break;
}
@@ -932,7 +907,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_BOMBERS_NOTEBOOK;
if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) {
@@ -950,7 +925,7 @@ void KaleidoScope_UpdateQuestCursor(PlayState* play) {
AudioOcarina_SetInstrument(OCARINA_INSTRUMENT_OFF);
}
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorPoint[PAUSE_QUEST] = QUEST_REMAINS_GOHT;
if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
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..f643d8d40 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
@@ -37,7 +37,7 @@ typedef struct {
/* 0x0 */ s16 screenX;
/* 0x2 */ s16 screenY;
/* 0x4 */ s16 width;
-} SectionPosition; // size = 0x6;
+} SectionPosition; // size = 0x6
// clang-format off
SectionPosition sSectionPositions[] = {
@@ -285,7 +285,7 @@ void KaleidoScope_DrawInventoryEditorText(Gfx** gfxp) {
GfxPrint_SetPos(&printer, 23, 22);
GfxPrint_Printf(&printer, "%s", "セイ");
- // Life (double defence)
+ // Life (double defense)
GfxPrint_SetPos(&printer, 4, 25);
GfxPrint_Printf(&printer, "%s", "イ");
GfxPrint_SetPos(&printer, 4, 26);
@@ -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);
@@ -601,11 +601,11 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) {
counterDigits[1] += 21;
}
- // Double Defence
+ // Double Defense
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
@@ -1048,16 +1048,13 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
// Dungeon Items
slot = sCurSection - INV_EDITOR_SECTION_DUNGEON_ITEMS;
if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) {
- // Map
- gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= 4;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_MAP);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CDOWN)) {
- // Compass
- gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= 2;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_COMPASS);
}
if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
- // Boss Key
- gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= 1;
+ gSaveContext.save.saveInfo.inventory.dungeonItems[slot] ^= (1 << DUNGEON_BOSS_KEY);
}
} else if (sCurSection < INV_EDITOR_SECTION_DOUBLE_DEFENSE) {
@@ -1077,7 +1074,7 @@ void KaleidoScope_UpdateInventoryEditor(PlayState* play) {
}
} else {
- // Double Defence
+ // Double Defense
if (CHECK_BTN_ALL(input->press.button, BTN_CUP) || CHECK_BTN_ALL(input->press.button, BTN_CLEFT) ||
CHECK_BTN_ALL(input->press.button, BTN_CDOWN) || CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) {
gSaveContext.save.saveInfo.playerData.doubleDefense ^= 1;
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..f46db573c 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);
}
}
@@ -382,7 +382,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorXIndex[PAUSE_ITEM]--;
pauseCtx->cursorPoint[PAUSE_ITEM]--;
@@ -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];
}
@@ -413,7 +413,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_ITEM] <= 4) {
pauseCtx->cursorXIndex[PAUSE_ITEM]++;
pauseCtx->cursorPoint[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];
}
@@ -451,7 +451,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_OCARINA)
@@ -489,7 +489,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
}
} else { // PAUSE_CURSOR_PAGE_RIGHT
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right columne (SLOT_TRADE_DEED)
cursorYIndex = 0;
@@ -541,7 +541,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] != 0) {
pauseCtx->cursorYIndex[PAUSE_ITEM]--;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
@@ -553,7 +553,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) {
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_ITEM] < 3) {
pauseCtx->cursorYIndex[PAUSE_ITEM]++;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorPoint[PAUSE_ITEM] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
} else {
@@ -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..a4df2c889 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];
}
- gSPVertex(POLY_OPA_DISP++, &pauseCtx->mapPageVtx[60], 16, 0);
+ // 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[QUAD_MAP_PAGE_DUNGEON_TITLE * 4], 4 * 4, 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);
}
}
@@ -310,9 +317,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
pauseCtx->cursorColorSet = PAUSE_CURSOR_COLOR_SET_WHITE;
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 0;
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->unk_256;
pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->unk_256;
@@ -338,9 +345,9 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
pauseCtx->cursorXIndex[PAUSE_MAP] = 1;
pauseCtx->cursorPoint[PAUSE_MAP] = DUNGEON_MAP;
if (!CHECK_DUNGEON_ITEM(DUNGEON_MAP, gSaveContext.dungeonIndex)) {
@@ -383,7 +390,7 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -404,7 +411,7 @@ void KaleidoScope_UpdateDungeonCursor(PlayState* play) {
gBitFlags[i]) ||
func_801090B0(FLOOR_INDEX_MAX - i)) {
pauseCtx->cursorPoint[PAUSE_MAP] = i + DUNGEON_FLOOR_INDEX_4;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
break;
}
}
@@ -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);
@@ -840,7 +854,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->cursorSpecialPos == 0) {
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -855,7 +869,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
}
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
while (true) {
@@ -884,7 +898,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
if (pauseCtx->stickAdjX > 30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = -1;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -909,7 +923,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
} else if (pauseCtx->stickAdjX < -30) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 11;
pauseCtx->cursorSpecialPos = 0;
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
while (true) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
@@ -944,7 +958,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
if (pauseCtx->stickAdjX > 30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]++;
@@ -953,7 +967,7 @@ void KaleidoScope_UpdateWorldMapCursor(PlayState* play) {
}
} while (!pauseCtx->worldMapPoints[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]]);
} else if (pauseCtx->stickAdjX < -30) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
sStickAdjTimer = 0;
do {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP]--;
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..228f0d16a 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);
}
}
}
@@ -309,7 +309,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
while (moveCursorResult == PAUSE_CURSOR_RESULT_NONE) {
if (pauseCtx->stickAdjX < -30) {
// move cursor left
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] != 0) {
pauseCtx->cursorXIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK]--;
@@ -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];
}
@@ -339,7 +339,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->stickAdjX > 30) {
// move cursor right
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
if (pauseCtx->cursorXIndex[PAUSE_MASK] <= 4) {
pauseCtx->cursorXIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[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;
}
@@ -380,7 +380,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
if (pauseCtx->stickAdjX > 30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorYIndex = 0;
cursorXIndex = 0;
cursorPoint = 0; // top row, left column (SLOT_MASK_POSTMAN)
@@ -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;
@@ -421,7 +421,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
//! FAKE:
if (1) {}
if (pauseCtx->stickAdjX < -30) {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
cursorXIndex = 5;
cursorPoint = 5; // top row, right column (SLOT_MASK_DEKU)
cursorYIndex = 0;
@@ -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;
@@ -473,7 +473,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor up
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] != 0) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]--;
pauseCtx->cursorPoint[PAUSE_MASK] -= 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
@@ -485,7 +485,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) {
// move cursor down
moveCursorResult = PAUSE_CURSOR_RESULT_SPECIAL_POS;
if (pauseCtx->cursorYIndex[PAUSE_MASK] < 3) {
- pauseCtx->unk_298 = 4.0f;
+ pauseCtx->cursorShrinkRate = 4.0f;
pauseCtx->cursorYIndex[PAUSE_MASK]++;
pauseCtx->cursorPoint[PAUSE_MASK] += 6;
moveCursorResult = PAUSE_CURSOR_RESULT_SLOT;
@@ -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..c82a40e67 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
@@ -76,9 +76,9 @@ typedef enum {
} PauseMainState;
typedef enum {
- /* 0x00 */ PAUSE_SAVEPROMPT_STATE_0,
+ /* 0x00 */ PAUSE_SAVEPROMPT_STATE_APPEARING,
/* 0x01 */ PAUSE_SAVEPROMPT_STATE_1,
- /* 0x02 */ PAUSE_SAVEPROMPT_STATE_2,
+ /* 0x02 */ PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU,
/* 0x03 */ PAUSE_SAVEPROMPT_STATE_3,
/* 0x04 */ PAUSE_SAVEPROMPT_STATE_4,
/* 0x05 */ PAUSE_SAVEPROMPT_STATE_5,
@@ -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,9 +125,213 @@ 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;
+
+// === INFO PANEL === //
+
+/**
+ * infoPanelVtx
+ *
+ * infoPanelVtx[0] name panel left texture
+ * infoPanelVtx[4] name panel right texture
+ * infoPanelVtx[8] Z Button icon
+ * infoPanelVtx[12] R Button icon
+ * infoPanelVtx[16] A button icon (or name segment)
+ * infoPanelVtx[20] pause-to-decide texture
+ * infoPanelVtx[24] (unused) oot remnant of Gold Skulltula Icon Texture
+ */
+
#define PAUSE_NAME_COLOR_SET_WHITE 0
#define PAUSE_NAME_COLOR_SET_GREY 1
+// === CURSOR === //
+
+/**
+ * cursorVtx
+ *
+ * cursorVtx[0] cursor circle
+ * cursorVtx[4] (unused) oot remnant of top-right corner of cursor
+ * cursorVtx[8] (unused) oot remnant of bottom-left corner of cursor
+ * cursorVtx[12] (unused) oot remnant of bottom-right corner of cursor
+ * cursorVtx[16] equipping item icon (while moving)
+ */
+
#define PAUSE_CURSOR_COLOR_SET_WHITE 0
#define PAUSE_CURSOR_COLOR_SET_YELLOW 2
#define PAUSE_CURSOR_COLOR_SET_BLUE 4
@@ -139,17 +343,62 @@ 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;
+
+// === PROMPT === //
+
+/**
+ * promptPageVtx (unused in MM, inferred from OoT)
+ *
+ * // PAGE_BG_QUADS
+ * promptPageVtx[0] prompt page background texture: row 0, column 0
+ * promptPageVtx[4] prompt page background texture: row 1, column 0
+ * promptPageVtx[8] prompt page background texture: row 2, column 0
+ * promptPageVtx[12] prompt page background texture: row 3, column 0
+ * promptPageVtx[16] prompt page background texture: row 4, column 0
+ * promptPageVtx[20] prompt page background texture: row 0, column 1
+ * promptPageVtx[24] prompt page background texture: row 1, column 1
+ * promptPageVtx[28] prompt page background texture: row 2, column 1
+ * promptPageVtx[32] prompt page background texture: row 3, column 1
+ * promptPageVtx[36] prompt page background texture: row 4, column 1
+ * promptPageVtx[40] prompt page background texture: row 0, column 2
+ * promptPageVtx[44] prompt page background texture: row 1, column 2
+ * promptPageVtx[48] prompt page background texture: row 2, column 2
+ * promptPageVtx[52] prompt page background texture: row 3, column 2
+ * promptPageVtx[56] prompt page background texture: row 4, column 2
+ *
+ * // QUAD_PROMPT_MAX
+ * promptPageVtx[60] message
+ * promptPageVtx[64] cursor left
+ * promptPageVtx[68] cursor right
+ * promptPageVtx[72] choice (yes)
+ * promptPageVtx[76] choice (no)
+ */
#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);
void KaleidoScope_SetView(PauseContext* pauseCtx, f32 eyeX, f32 eyeY, f32 eyeZ);
-void func_80821A04(PlayState* play);
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play);
// Map
void KaleidoScope_DrawDungeonMap(PlayState* play);
@@ -162,7 +411,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 +428,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 1377f287f..b60a00f9e 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
@@ -1,51 +1,181 @@
/*
* File: z_kaleido_scope_NES.c
* Overlay: ovl_kaleido_scope
- * Description:
+ * Description: Pause Menu
*/
-
+#include "prevent_bss_reordering.h"
#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"
+#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 "interface/icon_item_vtx_static/icon_item_vtx_static.h"
-extern UNK_TYPE D_02001360;
-extern UNK_TYPE D_020044A0;
-extern UNK_TYPE D_02004AA0;
-extern UNK_TYPE D_0200B998;
-extern UNK_TYPE D_08062000;
-extern UNK_TYPE D_08064340;
-extern UNK_TYPE D_0B000000;
-extern UNK_TYPE D_0C000000;
-extern UNK_TYPE D_0C006C00;
+// iconItemSegment
+extern TexturePtr D_08064340; // gPauseMenuCursorTex
-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;
@@ -107,144 +237,1543 @@ s16 sPauseCursorRightX = 0;
s16 D_8082B920 = 10;
-u8 D_8082B924[] = {
- 0x00, 0x14, 0x00, 0x04, 0x00, 0x14, 0x00, 0x0A, 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
- 0x07, 0x07, 0x03, 0x0F, 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
+s16 sPauseZRCursorColorTimerInits[] = { 20, 4, 20, 10 };
+
+// Unused remnant of OoT
+u8 gAreaGsFlags[] = {
+ 0x0F, 0x1F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x07, 0x07, 0x03, 0x0F,
+ 0x07, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, 0x1F, 0x0F, 0x03, 0x0F, 0x00, 0x00,
};
// 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 Kaleido_LoadMapNameStatic(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
+}
+
+void Kaleido_LoadMapNameStaticLarge(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
+}
+
+void Kaleido_LoadItemNameStatic(void* segment, u32 texIndex) {
+ CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
+}
+
+void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->cursorSpecialPos = cursorSpecialPos;
+ pauseCtx->pageSwitchInputTimer = 0;
+
+ play_sound(NA_SE_SY_DECIDE);
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ pauseCtx->nameDisplayTimer = 0;
+ pauseCtx->cursorSpecialPos = 0;
+
+ play_sound(NA_SE_SY_CURSOR);
+
+ pauseCtx->cursorShrinkRate = 4.0f;
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+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);
+}
+
+#define SWITCH_PAGE_LEFT 0
+#define SWITCH_PAGE_RIGHT 2
+
+void KaleidoScope_SwitchPage(PauseContext* pauseCtx, u8 direction) {
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = 0;
+ pauseCtx->mainState = PAUSE_MAIN_STATE_SWITCHING_PAGE;
+ pauseCtx->switchPageTimer = 0;
+
+ if (direction == SWITCH_PAGE_LEFT) {
+ pauseCtx->nextPageMode = (pauseCtx->pageIndex * 2) + 1;
+ play_sound(NA_SE_SY_WIN_SCROLL_LEFT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
+ } else { // SWITCH_PAGE_RIGHT
+ pauseCtx->nextPageMode = pauseCtx->pageIndex * 2;
+ play_sound(NA_SE_SY_WIN_SCROLL_RIGHT);
+ pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_LEFT;
+ }
+
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
+ gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED;
+
+ gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;
+ Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
+}
+
+/**
+ * Process inputs to decide whether to switch pages
+ */
+void KaleidoScope_HandlePageToggles(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
+
+ //! FAKE
+ if (1) {}
+
+ if ((pauseCtx->debugEditor != DEBUG_EDITOR_NONE) || pauseCtx->itemDescriptionOn) {
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DRIGHT) || CHECK_BTN_ALL(input->press.button, BTN_R)) {
+ // Switch the page to the right regardless of where the cursor is
+ if (interfaceCtx->unk_212 == 6) {
+ func_8011552C(play, 0x15);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ return;
+ }
+
+ if (CHECK_BTN_ALL(input->cur.button, BTN_DLEFT) || CHECK_BTN_ALL(input->press.button, BTN_Z)) {
+ // Switch the page to the left regardless of where the cursor is
+ if (interfaceCtx->unk_212 == 6) {
+ func_8011552C(play, 0x15);
+ }
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ return;
+ }
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ if (pauseCtx->stickAdjX < -30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the left after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_LEFT);
+ }
+ } else {
+ // stickAdjX is no longer held, so that the next input to the left will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ } else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
+ if (pauseCtx->stickAdjX > 30) {
+ pauseCtx->pageSwitchInputTimer++;
+ // Switch the page to the right after a certain number of frames with held input or after a second press
+ if ((pauseCtx->pageSwitchInputTimer >= 10) || (pauseCtx->pageSwitchInputTimer == 0)) {
+ KaleidoScope_SwitchPage(pauseCtx, SWITCH_PAGE_RIGHT);
+ }
+ } else {
+ // stickAdjY is no longer held, so that the next input to the right will immediately switch pages
+ pauseCtx->pageSwitchInputTimer = -1;
+ }
+ }
+}
+
+// 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,
+};
+void KaleidoScope_DrawInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
+
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
+
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gZButtonIconDL);
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK))) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, sPauseZRCursorAlpha);
+ }
+
+ gSPDisplayList(POLY_OPA_DISP++, gRButtonIconDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if (pauseCtx->itemDescriptionOn ||
+ ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40) &&
+ (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) &&
+ (pauseCtx->cursorSpecialPos == 0))) {
+ if (!pauseCtx->mainState || (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK) ||
+ ((pauseCtx->mainState >= PAUSE_MAIN_STATE_SONG_PROMPT_INIT) &&
+ (pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED)) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+ } else if ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT_UNUSED) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_UNK)) {
+ pauseCtx->infoPanelVtx[20].v.ob[1] = pauseCtx->infoPanelVtx[21].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[22].v.ob[1] = pauseCtx->infoPanelVtx[23].v.ob[1] =
+ pauseCtx->infoPanelVtx[20].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[22].v.tc[1] = pauseCtx->infoPanelVtx[23].v.tc[1] = 16 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 8, 0);
+
+ if (pauseCtx->state == PAUSE_STATE_SAVEPROMPT) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -33;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x10;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x30;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 48 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ //! @bug: Incorrect dimensions. Should be 64x16
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToDecideENGTex, G_IM_FMT_IA, 48, 16, 4);
+
+ } else if (pauseCtx->cursorSpecialPos != 0) {
+ if ((pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 200, 0, 255);
+
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ } else {
+ POLY_OPA_DISP =
+ Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
+ }
+ }
+ } else if ((!pauseCtx->pageIndex || (pauseCtx->pageIndex == PAUSE_MASK)) &&
+ (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -49;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 48;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 47;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 64;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 48 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 64 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gCButtonIconsDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToEquipENGTex, G_IM_FMT_IA, 64, 16, 4);
+ } else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) {
+ // No code in this case
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) {
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ // The cursor is on the bombers notebook
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -58;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 0x14;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 0x60;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToViewNotebookENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ } else if ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) && (pauseCtx->namedItem != PAUSE_ITEM_NONE)) {
+ // The cursor is on a learned song
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -55;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[20].v.ob[0] = pauseCtx->infoPanelVtx[22].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 20;
+
+ pauseCtx->infoPanelVtx[21].v.ob[0] = pauseCtx->infoPanelVtx[23].v.ob[0] =
+ pauseCtx->infoPanelVtx[20].v.ob[0] + 96;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[21].v.tc[0] = pauseCtx->infoPanelVtx[23].v.tc[0] = 96 * (1 << 5);
+
+ gSPDisplayList(POLY_OPA_DISP++, gAButtonIconDL);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToPlayMelodyENGTex, G_IM_FMT_IA, 96, 16, 4);
+ }
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+u8 sUnpausedButtonStatus[5];
+f32 sCursorCirclesX[4];
+f32 sCursorCirclesY[4];
+
+void KaleidoScope_UpdateNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 namedItem;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ namedItem = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, namedItem);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, namedItem);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM) || (pauseCtx->pageIndex == PAUSE_MASK)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
+
+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);
+}
+
+void KaleidoScope_DrawOwlWarpInfoPanel(PlayState* play) {
+ static s16 sPauseZRCursorColorTargets[][4] = {
+ { 180, 210, 255, 220 },
+ { 100, 100, 150, 220 },
+ };
+ static s16 sPauseZRCursorColorTimer = 20;
+ static s16 sPauseZRCursorColorIndex = 0;
+ static s16 sPauseZRCursorRed;
+ static s16 sPauseZRCursorGreen;
+ static s16 sPauseZRCursorBlue;
+ static s16 sPauseZRCursorAlpha;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 stepR;
+ s16 stepG;
+ s16 stepB;
+ s16 stepA;
+ s16 y;
+ s16 i;
+ s16 j;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ stepR =
+ ABS_ALT(sPauseZRCursorRed - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) / sPauseZRCursorColorTimer;
+ stepG = ABS_ALT(sPauseZRCursorGreen - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) /
+ sPauseZRCursorColorTimer;
+ stepB = ABS_ALT(sPauseZRCursorBlue - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) /
+ sPauseZRCursorColorTimer;
+ stepA = ABS_ALT(sPauseZRCursorAlpha - sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) /
+ sPauseZRCursorColorTimer;
+
+ if (sPauseZRCursorRed >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0]) {
+ sPauseZRCursorRed -= stepR;
+ } else {
+ sPauseZRCursorRed += stepR;
+ }
+
+ if (sPauseZRCursorGreen >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1]) {
+ sPauseZRCursorGreen -= stepG;
+ } else {
+ sPauseZRCursorGreen += stepG;
+ }
+
+ if (sPauseZRCursorBlue >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2]) {
+ sPauseZRCursorBlue -= stepB;
+ } else {
+ sPauseZRCursorBlue += stepB;
+ }
+
+ if (sPauseZRCursorAlpha >= sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3]) {
+ sPauseZRCursorAlpha -= stepA;
+ } else {
+ sPauseZRCursorAlpha += stepA;
+ }
+
+ sPauseZRCursorColorTimer--;
+ if (sPauseZRCursorColorTimer == 0) {
+ sPauseZRCursorRed = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][0];
+ sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
+ sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
+ sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
+ sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
+ sPauseZRCursorColorIndex ^= 1;
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 76;
+ for (j = 0, i = 0; i < 7; i++, j += 4) {
+ pauseCtx->infoPanelVtx[j + 0].v.ob[0] = pauseCtx->infoPanelVtx[j + 2].v.ob[0] = -72;
+
+ pauseCtx->infoPanelVtx[j + 1].v.ob[0] = pauseCtx->infoPanelVtx[j + 3].v.ob[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[1] = pauseCtx->infoPanelVtx[j + 1].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[j + 2].v.ob[1] = pauseCtx->infoPanelVtx[j + 3].v.ob[1] = y - 24;
+
+ pauseCtx->infoPanelVtx[j + 0].v.ob[2] = pauseCtx->infoPanelVtx[j + 1].v.ob[2] =
+ pauseCtx->infoPanelVtx[j + 2].v.ob[2] = pauseCtx->infoPanelVtx[j + 3].v.ob[2] = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.flag = pauseCtx->infoPanelVtx[j + 1].v.flag =
+ pauseCtx->infoPanelVtx[j + 2].v.flag = pauseCtx->infoPanelVtx[j + 3].v.flag = 0;
+
+ pauseCtx->infoPanelVtx[j + 0].v.tc[0] = pauseCtx->infoPanelVtx[j + 0].v.tc[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.tc[1] = pauseCtx->infoPanelVtx[j + 2].v.tc[0] = 0;
+
+ pauseCtx->infoPanelVtx[j + 1].v.tc[0] = pauseCtx->infoPanelVtx[j + 3].v.tc[0] = 72 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 2].v.tc[1] = pauseCtx->infoPanelVtx[j + 3].v.tc[1] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[0] = pauseCtx->infoPanelVtx[j + 2].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[1] = pauseCtx->infoPanelVtx[j + 2].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 0].v.cn[2] = pauseCtx->infoPanelVtx[j + 2].v.cn[2] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[0] = pauseCtx->infoPanelVtx[j + 3].v.cn[0] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[1] = pauseCtx->infoPanelVtx[j + 3].v.cn[1] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[2] = pauseCtx->infoPanelVtx[j + 3].v.cn[2] = 200;
+
+ pauseCtx->infoPanelVtx[j + 0].v.cn[3] = pauseCtx->infoPanelVtx[j + 2].v.cn[3] =
+ pauseCtx->infoPanelVtx[j + 1].v.cn[3] = pauseCtx->infoPanelVtx[j + 3].v.cn[3] = pauseCtx->alpha;
+ }
+
+ pauseCtx->infoPanelVtx[4].v.ob[0] = pauseCtx->infoPanelVtx[6].v.ob[0] = pauseCtx->infoPanelVtx[0].v.ob[0] + 72;
+
+ pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
+
+ pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
+ pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
+ }
+
+ if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
+ } else {
+ pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
+
+ pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
+ pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
+
+ pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
+
+ pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
+ pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
+ }
+
+ pauseCtx->infoPanelVtx[9].v.tc[0] = pauseCtx->infoPanelVtx[11].v.tc[0] = pauseCtx->infoPanelVtx[13].v.tc[0] =
+ pauseCtx->infoPanelVtx[15].v.tc[0] = 24 * (1 << 5);
+
+ pauseCtx->infoPanelVtx[10].v.tc[1] = pauseCtx->infoPanelVtx[11].v.tc[1] = pauseCtx->infoPanelVtx[14].v.tc[1] =
+ pauseCtx->infoPanelVtx[15].v.tc[1] = 32 * (1 << 5);
+
+ gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
+
+ Matrix_Translate(0.0f, 0.0f, -144.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 150, 140, 90, 255);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[0], 16, 0);
+
+ gSPDisplayList(POLY_OPA_DISP++, gItemNamePanelDL);
+
+ if (pauseCtx->cursorSpecialPos != 0) {
+ j = (pauseCtx->cursorSpecialPos * 4) - 32;
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->infoPanelVtx[j].v.ob[0];
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->infoPanelVtx[j].v.ob[1];
+ }
+
+ y = pauseCtx->infoPanelOffsetY - 80;
+ pauseCtx->infoPanelVtx[16].v.ob[1] = pauseCtx->infoPanelVtx[17].v.ob[1] = y;
+
+ pauseCtx->infoPanelVtx[18].v.ob[1] = pauseCtx->infoPanelVtx[19].v.ob[1] = pauseCtx->infoPanelVtx[16].v.ob[1] - 16;
+
+ pauseCtx->infoPanelVtx[18].v.tc[1] = pauseCtx->infoPanelVtx[19].v.tc[1] = 16 * (1 << 5);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetEnvColor(POLY_OPA_DISP++, 20, 30, 40, 0);
+
+ if ((pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) && (pauseCtx->namedItem != PAUSE_ITEM_NONE) &&
+ (pauseCtx->nameDisplayTimer < 40)) {
+ pauseCtx->infoPanelVtx[16].v.ob[0] = pauseCtx->infoPanelVtx[18].v.ob[0] = -63;
+
+ pauseCtx->infoPanelVtx[17].v.ob[0] = pauseCtx->infoPanelVtx[19].v.ob[0] =
+ pauseCtx->infoPanelVtx[16].v.ob[0] + 128;
+
+ pauseCtx->infoPanelVtx[17].v.tc[0] = pauseCtx->infoPanelVtx[19].v.tc[0] = 128 * (1 << 5);
+
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->infoPanelVtx[16], 4, 0);
+
+ if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_GREY) {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 70, 70, 70, 255);
+ } else {
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
+ }
+
+ POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, pauseCtx->nameSegment, G_IM_FMT_IA, 128, 16, 0);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ u16 texIndex;
+
+ if ((pauseCtx->namedItem != pauseCtx->cursorItem[pauseCtx->pageIndex]) ||
+ ((pauseCtx->pageIndex == PAUSE_MAP) && (pauseCtx->cursorSpecialPos != 0))) {
+
+ pauseCtx->namedItem = pauseCtx->cursorItem[pauseCtx->pageIndex];
+ texIndex = pauseCtx->namedItem;
+
+ osCreateMesgQueue(&pauseCtx->loadQueue, &pauseCtx->loadMsg, 1);
+
+ if (pauseCtx->namedItem != PAUSE_ITEM_NONE) {
+ if ((pauseCtx->pageIndex == PAUSE_MAP) && !sInDungeonScene) {
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, texIndex);
+ } else {
+ Kaleido_LoadItemNameStatic(pauseCtx->nameSegment, texIndex);
+ }
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else if (pauseCtx->nameColorSet == PAUSE_NAME_COLOR_SET_WHITE) {
+ if (((pauseCtx->pageIndex == PAUSE_QUEST) && (pauseCtx->cursorSlot[PAUSE_QUEST] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[PAUSE_QUEST] <= QUEST_SONG_SUN) &&
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)) ||
+ (pauseCtx->pageIndex == PAUSE_ITEM)) {
+
+ pauseCtx->nameDisplayTimer++;
+ if (pauseCtx->nameDisplayTimer > 70) {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+ } else {
+ pauseCtx->nameDisplayTimer = 0;
+ }
+}
+
+void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+
+ //! FAKE
+ if (1) {
+ pauseCtx->eye.x += sPageSwitchEyeDx[pauseCtx->nextPageMode] * 2.0f;
+ pauseCtx->eye.z += sPageSwitchEyeDz[pauseCtx->nextPageMode] * 2.0f;
+
+ if (pauseCtx->switchPageTimer < 32) {
+ sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
+ } else {
+ sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
+ sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+ }
+
+ pauseCtx->switchPageTimer += 8;
+
+ if (pauseCtx->switchPageTimer == 64) {
+ pauseCtx->switchPageTimer = 0;
+ pauseCtx->pageIndex = sPageSwitchNextPageIndex[pauseCtx->nextPageMode];
+ pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE;
+
+ KaleidoScope_HandlePageToggles(play, input);
+ }
+ }
+}
+
+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 sVtxPagePromptQuadsX[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_8082B9A8[] = {
- 0x0D002B00,
- 0x0D002F00,
- 0x0D003300,
- 0x0D002700,
+// 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 sVtxPagePromptQuadsWidth[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_8082B9B8[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+// 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 sVtxPagePromptQuadsY[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
};
-s16 D_8082B9C8 = 20;
-
-s32 D_8082B9CC = 0;
-
-s16 D_8082B9D0[] = {
- 0x00B4, 0x00D2, 0x00FF, 0x00DC, 0x0064, 0x0064, 0x0096, 0x00DC,
+// 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 sVtxPagePromptQuadsHeight[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
};
-s16 D_8082B9E0 = 20;
-
-s32 D_8082B9E4 = 0;
-
-s32 D_8082B9E8 = 0;
-
-s32 D_8082B9EC = 0;
-
-s16 D_8082B9F0[] = {
- 0xFFEB, 0xFF98, 0xFFB4, 0xFFD0, 0xFF98, 0xFFD8,
+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
+ sVtxPagePromptQuadsX, // VTX_PAGE_PROMPT
};
-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,
+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
+ sVtxPagePromptQuadsWidth, // VTX_PAGE_PROMPT
};
-s16 D_8082BA48[] = {
- 0xFFB4, 0xFFC6, 0x000A, 0xFFC6, 0x000A, 0x0000,
+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
+ sVtxPagePromptQuadsY, // VTX_PAGE_PROMPT
};
-s32 D_8082BA54 = 0;
-
-s32 D_8082BA58 = 0;
-
-s16 D_8082BA5C[] = {
- 0x0080, 0x0018, 0x0018, 0x0018, 0x0020, 0x0018,
+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
+ sVtxPagePromptQuadsHeight, // VTX_PAGE_PROMPT
};
-s32 D_8082BA68 = 0;
-
-s16 D_8082BA6C[] = {
- 0x0098, 0x0030, 0x0030, 0x0030, 0x0030, 0x0000,
+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_8082BA78 = 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;
-s32 D_8082BA7C = 0;
+ // Vertices for KaleidoScope_DrawPageSections
-s16 D_8082BA80[] = {
- 0x0036, 0xFFD6, 0xFFD6, 0xFFD6, 0xFFE8, 0x0032,
-};
+ pageBgQuadX = 0 - (PAGE_BG_COLS * PAGE_BG_QUAD_WIDTH) / 2 - PAGE_BG_QUAD_WIDTH;
-s32 D_8082BA8C = 0;
+ // For each column
+ for (k = 0, i = 0; i < 3; i++) {
+ pageBgQuadX += PAGE_BG_QUAD_WIDTH;
-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,
-};
+ // 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;
-s16 D_8082BAD8[] = {
- 0x0024, 0x000A, 0x000A, 0xFFFA, 0xFFFA, 0x0000,
-};
+ 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;
-s32 D_8082BAE4 = 0;
+ 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;
-s32 D_8082BAE8 = 0;
+ vtx[k + 0].v.flag = vtx[k + 1].v.flag = vtx[k + 2].v.flag = vtx[k + 3].v.flag = 0;
-s16 D_8082BAEC[] = {
- 0x0010, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
-};
+ 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);
-s32 D_8082BAF8 = 0;
+ 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;
-s16 D_8082BAFC[] = {
- 0x0010, 0x0030, 0x0030, 0x0010, 0x0010, 0x0000,
-};
+ 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;
-void* D_8082BB08[] = {
- &D_8082B9E8, &D_8082B9EC, &D_8082B9F0, &D_8082B9FC, &D_8082BA00, &D_8082BA48,
-};
+ 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;
+ }
+ }
-void* D_8082BB20[] = {
- &D_8082BA54, &D_8082BA58, &D_8082BA5C, &D_8082BA68, &D_8082B7F0, &D_8082BA6C,
-};
+ if (numQuads != 0) {
+ quadsX = sVtxPageQuadsX[vtxPage];
+ quadsWidth = sVtxPageQuadsWidth[vtxPage];
+ quadsY = sVtxPageQuadsY[vtxPage];
+ quadsHeight = sVtxPageQuadsHeight[vtxPage];
-void* D_8082BB38[] = {
- &D_8082BA78, &D_8082BA7C, &D_8082BA80, &D_8082BA8C, &D_8082BA90, &D_8082BAD8,
-};
+ for (i = 0; i < numQuads; i++, k += 4) {
+ vtx[k + 2].v.ob[0] = vtx[k + 0].v.ob[0] = quadsX[i];
-void* D_8082BB50[] = {
- &D_8082BAE4, &D_8082BAE8, &D_8082BAEC, &D_8082BAF8, &D_8082B838, &D_8082BAFC,
-};
+ vtx[k + 1].v.ob[0] = vtx[k + 3].v.ob[0] = vtx[k + 0].v.ob[0] + quadsWidth[i];
-s16 D_8082BB68[] = {
- 0x000E, 0xFFFE, 0xFFFE, 0xFFEE, 0xFFEE, 0x0000,
-};
+ 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,111 +1942,829 @@ s16 sQuestVtxHeights[] = {
16, // ocarina input button index 6
16, // ocarina input button index 7
};
-f32 D_8082BCB4[] = {
- -62.0f, -36.0f, -10.0f, 16.0f, 42.0f, 68.0f,
-};
-f32 D_8082BCCC[] = {
- 31.0f,
- 5.0f,
- -21.0f,
- -47.0f,
-};
+void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+ s16 j;
+ s16 k;
+ s16 vtx_x;
+ s16 vtx_y;
-f32 D_8082BCDC[] = {
- -49.0f, -35.0f, -3.0f, 4.0f, 12.0f, 8.0f, 7.0f, 40.0f, 47.0f, 49.0f, 55.0f,
-};
+ pauseCtx->offsetY = 0;
-f32 D_8082BD08[] = {
- -15.0f, -36.0f, -23.0f, -49.0f, -29.0f, -8.0f, 25.0f, 2.0f, -9.0f, 28.0f, 7.0f,
-};
+ 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;
+ }
-f32 D_8082BD34[] = {
- -50.0f, -38.0f, 6.0f, 11.0f, 8.0f, 0.0f, 12.0f, 31.0f, 48.0f, 56.0f,
-};
+ 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);
-f32 D_8082BD5C[] = {
- -14.0f, -39.0f, 23.0f, 11.0f, -8.0f, -15.0f, -31.0f, -30.0f, -10.0f, 11.0f,
-};
+ pauseCtx->itemVtx = GRAPH_ALLOC(gfxCtx, (QUAD_ITEM_MAX * 4) * sizeof(Vtx));
-f32 D_8082BD84[] = {
- -72.0f, -47.0f, -26.0f, -50.0f, -48.0f, -48.0f, -48.0f, -48.0f, -48.0f,
-};
+ // QUAD_ITEM_GRID_FIRST..QUAD_ITEM_GRID_LAST
-f32 D_8082BDA8[] = {
- -47.0f, -47.0f, -47.0f, -30.0f, 33.0f, 22.0f, 11.0f, -2.0f, -13.0f,
-};
+ // 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;
-f32 D_8082BDCC[] = {
- 52.0f, 80.0f, 24.0f, 52.0f, 81.0f, 24.0f, -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f,
- -78.0f, -61.0f, -44.0f, -24.0f, -6.0f, -3.0f, -68.0f, 22.0f, 83.0f, -67.0f, -21.0f,
-};
+ 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;
-f32 D_8082BE28[] = {
- 33.0f, 18.0f, 18.0f, 0.0f, -23.0f, -23.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f, -29.0f,
- -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, -11.0f, 27.0f, -53.0f, -53.0f, 14.0f, 26.0f,
-};
+ 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;
-s16 D_8082BE84 = 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;
-void func_80821900(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0x400);
+ 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);
+ }
}
-void func_8082192C(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(map_name_static), texIndex, segment, 0xA00);
+f32 sItemMaskCursorsX[] = {
+ -62.0f, // Column 1
+ -36.0f, // Column 2
+ -10.0f, // Column 3
+ 16.0f, // Column 4
+ 42.0f, // Column 5
+ 68.0f, // Column 6
+};
+
+f32 sItemMaskCursorsY[] = {
+ 31.0f, // Row 1
+ 5.0f, // Row 2
+ -21.0f, // Row 3
+ -47.0f, // Row 4
+};
+
+f32 sWorldMapCursorsX[REGION_MAX] = {
+ -49.0f, // REGION_GREAT_BAY
+ -35.0f, // REGION_ZORA_HALL
+ -3.0f, // REGION_ROMANI_RANCH
+ 4.0f, // REGION_DEKU_PALACE
+ 12.0f, // REGION_WOODFALL
+ 8.0f, // REGION_CLOCK_TOWN
+ 7.0f, // REGION_SNOWHEAD
+ 40.0f, // REGION_IKANA_GRAVEYARD
+ 47.0f, // REGION_IKANA_CANYON
+ 49.0f, // REGION_GORON_VILLAGE
+ 55.0f, // REGION_STONE_TOWER
+};
+
+f32 sWorldMapCursorsY[REGION_MAX] = {
+ -15.0f, // REGION_GREAT_BAY
+ -36.0f, // REGION_ZORA_HALL
+ -23.0f, // REGION_ROMANI_RANCH
+ -49.0f, // REGION_DEKU_PALACE
+ -29.0f, // REGION_WOODFALL
+ -8.0f, // REGION_CLOCK_TOWN
+ 25.0f, // REGION_SNOWHEAD
+ 2.0f, // REGION_IKANA_GRAVEYARD
+ -9.0f, // REGION_IKANA_CANYON
+ 28.0f, // REGION_GORON_VILLAGE
+ 7.0f, // REGION_STONE_TOWER
+};
+
+f32 sOwlWarpWorldMapCursorsX[OWL_WARP_MAX - 1] = {
+ -50.0f, // OWL_WARP_GREAT_BAY_COAST
+ -38.0f, // OWL_WARP_ZORA_CAPE
+ 6.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ 8.0f, // OWL_WARP_CLOCK_TOWN
+ 0.0f, // OWL_WARP_MILK_ROAD
+ 12.0f, // OWL_WARP_WOODFALL
+ 31.0f, // OWL_WARP_SOUTHERN_SWAMP
+ 48.0f, // OWL_WARP_IKANA_CANYON
+ 56.0f, // OWL_WARP_STONE_TOWER
+};
+
+f32 sOwlWarpWorldMapCursorsY[OWL_WARP_MAX - 1] = {
+ -14.0f, // OWL_WARP_GREAT_BAY_COAST
+ -39.0f, // OWL_WARP_ZORA_CAPE
+ 23.0f, // OWL_WARP_SNOWHEAD
+ 11.0f, // OWL_WARP_MOUNTAIN_VILLAGE
+ -8.0f, // OWL_WARP_CLOCK_TOWN
+ -15.0f, // OWL_WARP_MILK_ROAD
+ -31.0f, // OWL_WARP_WOODFALL
+ -30.0f, // OWL_WARP_SOUTHERN_SWAMP
+ -10.0f, // OWL_WARP_IKANA_CANYON
+ 11.0f, // OWL_WARP_STONE_TOWER
+};
+
+f32 sDungeonMapCursorsX[] = {
+ -72.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -26.0f, // DUNGEON_MAP
+ -50.0f, // DUNGEON_STRAY_FAIRIES
+ -48.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ -48.0f, // DUNGEON_FLOOR_INDEX_3
+ -48.0f, // DUNGEON_FLOOR_INDEX_2
+ -48.0f, // DUNGEON_FLOOR_INDEX_1
+ -48.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
+};
+
+f32 sDungeonMapCursorsY[] = {
+ -47.0f, // DUNGEON_BOSS_KEY
+ -47.0f, // DUNGEON_COMPASS
+ -47.0f, // DUNGEON_MAP
+ -30.0f, // DUNGEON_STRAY_FAIRIES
+ 33.0f, // DUNGEON_FLOOR_INDEX_4 (top floor)
+ 22.0f, // DUNGEON_FLOOR_INDEX_3
+ 11.0f, // DUNGEON_FLOOR_INDEX_2
+ -2.0f, // DUNGEON_FLOOR_INDEX_1
+ -13.0f, // DUNGEON_FLOOR_INDEX_0 (bottom floor)
+};
+
+f32 sQuestStatusCursorsX[] = {
+ 52.0f, // QUEST_REMAINS_ODOLWA
+ 80.0f, // QUEST_REMAINS_GOHT
+ 24.0f, // QUEST_REMAINS_GYORG
+ 52.0f, // QUEST_REMAINS_TWINMOLD
+ 81.0f, // QUEST_SHIELD
+ 24.0f, // QUEST_SWORD
+ -78.0f, // QUEST_SONG_SONATA
+ -61.0f, // QUEST_SONG_LULLABY
+ -44.0f, // QUEST_SONG_BOSSA_NOVA
+ -24.0f, // QUEST_SONG_ELEGY
+ -6.0f, // QUEST_SONG_OATH
+ -3.0f, // QUEST_SONG_SARIA
+ -78.0f, // QUEST_SONG_TIME
+ -61.0f, // QUEST_SONG_HEALING
+ -44.0f, // QUEST_SONG_EPONA
+ -24.0f, // QUEST_SONG_SOARING
+ -6.0f, // QUEST_SONG_STORMS
+ -3.0f, // QUEST_SONG_SUN
+ -68.0f, // QUEST_BOMBERS_NOTEBOOK
+ 22.0f, // QUEST_QUIVER
+ 83.0f, // QUEST_BOMB_BAG
+ -67.0f, // QUEST_SKULL_TOKEN
+ -21.0f, // QUEST_HEART_PIECE
+};
+
+f32 sQuestStatusCursorsY[] = {
+ 33.0f, // QUEST_REMAINS_ODOLWA
+ 18.0f, // QUEST_REMAINS_GOHT
+ 18.0f, // QUEST_REMAINS_GYORG
+ 0.0f, // QUEST_REMAINS_TWINMOLD
+ -23.0f, // QUEST_SHIELD
+ -23.0f, // QUEST_SWORD
+ -29.0f, // QUEST_SONG_SONATA
+ -29.0f, // QUEST_SONG_LULLABY
+ -29.0f, // QUEST_SONG_BOSSA_NOVA
+ -29.0f, // QUEST_SONG_ELEGY
+ -29.0f, // QUEST_SONG_OATH
+ -29.0f, // QUEST_SONG_SARIA
+ -11.0f, // QUEST_SONG_TIME
+ -11.0f, // QUEST_SONG_HEALING
+ -11.0f, // QUEST_SONG_EPONA
+ -11.0f, // QUEST_SONG_SOARING
+ -11.0f, // QUEST_SONG_STORMS
+ -11.0f, // QUEST_SONG_SUN
+ 27.0f, // QUEST_BOMBERS_NOTEBOOK
+ -53.0f, // QUEST_QUIVER
+ -53.0f, // QUEST_BOMB_BAG
+ 14.0f, // QUEST_SKULL_TOKEN
+ 26.0f, // QUEST_HEART_PIECE
+};
+
+void KaleidoScope_UpdateCursorSize(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 index;
+
+ pauseCtx->cursorVtx[0].v.ob[0] = pauseCtx->cursorVtx[2].v.ob[0] = -8;
+ pauseCtx->cursorVtx[1].v.ob[0] = pauseCtx->cursorVtx[3].v.ob[0] = pauseCtx->cursorVtx[0].v.ob[0] + 16;
+
+ pauseCtx->cursorVtx[0].v.ob[1] = pauseCtx->cursorVtx[1].v.ob[1] = 8;
+ pauseCtx->cursorVtx[2].v.ob[1] = pauseCtx->cursorVtx[3].v.ob[1] = pauseCtx->cursorVtx[0].v.ob[1] - 16;
+
+ if (pauseCtx->cursorSpecialPos == 0) {
+ switch (pauseCtx->pageIndex) {
+ case PAUSE_ITEM:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_ITEM]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_ITEM]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
+
+ case PAUSE_MAP:
+ if (!sInDungeonScene) {
+ if (IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorX = sOwlWarpWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sOwlWarpWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ } else {
+ pauseCtx->cursorX = sWorldMapCursorsX[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ pauseCtx->cursorY = sWorldMapCursorsY[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]];
+ }
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ pauseCtx->cursorHeight = 10.0f;
+ pauseCtx->cursorWidth = 10.0f;
+ } else {
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ } else {
+ pauseCtx->cursorX = sDungeonMapCursorsX[pauseCtx->cursorPoint[PAUSE_MAP]];
+ pauseCtx->cursorY = sDungeonMapCursorsY[pauseCtx->cursorPoint[PAUSE_MAP]];
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] >= DUNGEON_FLOOR_INDEX_4) {
+ // Floors
+ pauseCtx->cursorWidth = 18.0f;
+ pauseCtx->cursorHeight = 12.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == DUNGEON_STRAY_FAIRIES) {
+ // Stray Fairies
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 40.0f;
+ } else {
+ // Map, Compass, Boss Key
+ pauseCtx->cursorHeight = 15.0f;
+ pauseCtx->cursorWidth = 15.0f;
+ }
+ }
+ break;
+
+ case PAUSE_QUEST:
+ if (!R_PAUSE_DBG_QUEST_CURSOR_ON) {
+ pauseCtx->cursorX = sQuestStatusCursorsX[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ pauseCtx->cursorY = sQuestStatusCursorsY[pauseCtx->cursorPoint[PAUSE_QUEST]];
+ } else {
+ pauseCtx->cursorX = R_PAUSE_DBG_QUEST_CURSOR_X;
+ pauseCtx->cursorY = R_PAUSE_DBG_QUEST_CURSOR_Y;
+ }
+ pauseCtx->cursorHeight = 17.0f;
+ pauseCtx->cursorWidth = 17.0f;
+ if (pauseCtx->cursorSlot[pauseCtx->pageIndex] == QUEST_17) {
+ pauseCtx->cursorHeight = 25.0f;
+ pauseCtx->cursorWidth = 25.0f;
+ } else if (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SWORD) {
+ pauseCtx->cursorHeight = 18.0f;
+ pauseCtx->cursorWidth = 18.0f;
+ } else if ((pauseCtx->cursorSlot[pauseCtx->pageIndex] >= QUEST_SONG_SONATA) &&
+ (pauseCtx->cursorSlot[pauseCtx->pageIndex] <= QUEST_SONG_SUN)) {
+ pauseCtx->cursorHeight = 12.0f;
+ pauseCtx->cursorWidth = 12.0f;
+ }
+ break;
+
+ case PAUSE_MASK:
+ pauseCtx->cursorX = sItemMaskCursorsX[pauseCtx->cursorXIndex[PAUSE_MASK]];
+ pauseCtx->cursorY = sItemMaskCursorsY[pauseCtx->cursorYIndex[PAUSE_MASK]];
+ pauseCtx->cursorWidth = 15.0f;
+ pauseCtx->cursorHeight = 15.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ pauseCtx->cursorSpinPhase += 0x300;
+ } else {
+ if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
+ pauseCtx->cursorX = -93.0f;
+ } else { // PAUSE_CURSOR_PAGE_RIGHT
+ pauseCtx->cursorX = 101.0f;
+ }
+ pauseCtx->cursorSpinPhase += 0x300;
+ pauseCtx->cursorHeight = 16.0f;
+ pauseCtx->cursorWidth = 16.0f;
+ pauseCtx->cursorY = -4.0f;
+ }
+
+ if (pauseCtx->cursorWidth < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorWidth = 0;
+ } else {
+ pauseCtx->cursorWidth -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorHeight < pauseCtx->cursorShrinkRate) {
+ pauseCtx->cursorHeight = 0.0f;
+ } else {
+ pauseCtx->cursorHeight -= pauseCtx->cursorShrinkRate;
+ }
+
+ if (pauseCtx->cursorShrinkRate != 0.0f) {
+ pauseCtx->cursorShrinkRate -= 1.0f;
+ }
+
+ sCursorCirclesX[0] = Math_SinS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorWidth;
+ sCursorCirclesX[1] = Math_SinS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[2] = Math_SinS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorWidth;
+ sCursorCirclesX[3] = Math_SinS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorWidth;
+ sCursorCirclesY[0] = Math_CosS(pauseCtx->cursorSpinPhase) * pauseCtx->cursorHeight;
+ sCursorCirclesY[1] = Math_CosS(pauseCtx->cursorSpinPhase + 0x4000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[2] = Math_CosS(pauseCtx->cursorSpinPhase + 0x8000) * pauseCtx->cursorHeight;
+ sCursorCirclesY[3] = Math_CosS(pauseCtx->cursorSpinPhase + 0xC000) * pauseCtx->cursorHeight;
}
-void func_80821958(void* segment, u32 texIndex) {
- CmpDma_LoadFile(SEGMENT_ROM_START(item_name_static), texIndex, segment, 0x400);
+void KaleidoScope_DrawCursor(PlayState* play) {
+ PauseContext* pauseCtx = &play->pauseCtx;
+ s16 i;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if ((pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) ||
+ ((pauseCtx->pageIndex == PAUSE_QUEST) && ((pauseCtx->mainState <= PAUSE_MAIN_STATE_SONG_PLAYBACK) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_SONG_PROMPT) ||
+ (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG)))) {
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
+ PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimR, sCursorPrimG, sCursorPrimB, 255);
+ gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvR, sCursorEnvG, sCursorEnvB, 255);
+
+ Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW);
+ Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
+
+ for (i = 0; i < 4; i++) {
+ Matrix_Push();
+ Matrix_Translate(sCursorCirclesX[i], sCursorCirclesY[i], -50.0f, MTXMODE_APPLY);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPLoadTextureBlock(POLY_OPA_DISP++, &D_08064340, G_IM_FMT_IA, G_IM_SIZ_8b, 16, 16, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
+ G_TX_NOLOD, G_TX_NOLOD);
+ gSPVertex(POLY_OPA_DISP++, &pauseCtx->cursorVtx[0], 4, 0);
+ gSP1Quadrangle(POLY_OPA_DISP++, 0, 2, 3, 1, 0);
+ Matrix_Pop();
+ }
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_MoveCursorToSpecialPos.s")
+void KaleidoScope_DrawGameOver(PlayState* play) {
+ static s16 sGameOverUlt = 0;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821A04.s")
+ OPEN_DISPS(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_DrawTexQuadRGBA32.s")
+ Gfx_SetupDL39_Opa(gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821CC4.s")
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_2CYCLE);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
+ gDPSetCombineLERP(POLY_OPA_DISP++, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT,
+ COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0);
-void KaleidoScope_HandlePageToggles(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_HandlePageToggles.s")
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 80, sGameOverPrimR, sGameOverPrimG, sGameOverPrimB, sGameOverPrimAlpha);
+ gDPSetEnvColor(POLY_OPA_DISP++, sGameOverEnvR, sGameOverEnvG, sGameOverEnvB, 255);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80821F30.s")
+ sGameOverUlt -= 2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808221DC.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP1Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 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);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80823350.s")
+ gDPLoadMultiBlock(POLY_OPA_DISP++, gGameOverMaskTex, 256, 1, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, 5, G_TX_NOLOD, G_TX_NOLOD);
-void KaleidoScope_UpdateNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateNamePanel.s")
+ gDPSetTileSize(POLY_OPA_DISP++, 1, 0, sGameOverUlt & 0x7F, 252, (sGameOverUlt & 0x7F) + 124);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808248D0.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x100, sGameOverRectPosY << 2, 0x200, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80824B90.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP2Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
-void KaleidoScope_UpdateOwlWarpNamePanel(PlayState* play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateOwlWarpNamePanel.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x200, sGameOverRectPosY << 2, 0x300, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-void KaleidoScope_UpdateSwitchPage(PlayState* play, Input* input);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_UpdateSwitchPage.s")
+ gDPLoadTextureBlock(POLY_OPA_DISP++, gGameOverP3Tex, G_IM_FMT_IA, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
+ G_TX_NOLOD);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_SetView.s")
+ gSPTextureRectangle(POLY_OPA_DISP++, 0x300, sGameOverRectPosY << 2, 0x400, (sGameOverRectPosY + 32) << 2,
+ G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825A50.s")
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80825E28.s")
+void KaleidoScope_Draw(PlayState* play) {
+ s32 pad;
+ PauseContext* pauseCtx = &play->pauseCtx;
+ InterfaceContext* interfaceCtx = &play->interfaceCtx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808274DC.s")
+ OPEN_DISPS(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827A8C.s")
+ gSPSegment(POLY_OPA_DISP++, 0x02, interfaceCtx->parameterSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x08, pauseCtx->iconItemSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x09, pauseCtx->iconItem24Segment);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, pauseCtx->nameSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0C, pauseCtx->iconItemAltSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0D, pauseCtx->iconItemLangSegment);
+ gSPSegment(POLY_OPA_DISP++, 0x0B, pauseCtx->iconItemVtxSegment);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827E08.s")
+ if (pauseCtx->debugEditor == DEBUG_EDITOR_NONE) {
+ KaleidoScope_SetView(pauseCtx, pauseCtx->eye.x, pauseCtx->eye.y, pauseCtx->eye.z);
+ Gfx_SetupDL42_Opa(play->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Draw.s")
+ if (!IS_PAUSE_STATE_OWLWARP) {
+ // Draw Default or Game Over Menus
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
-void KaleidoScope_GrayOutTextureRGBA32(u32* texture, u16 pixelCount);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_GrayOutTextureRGBA32.s")
+ 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, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+
+ if (!IS_PAUSE_STATE_GAMEOVER) {
+ KaleidoScope_DrawInfoPanel(play);
+ }
+
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_MAIN) {
+ KaleidoScope_DrawCursor(play);
+ }
+
+ if ((pauseCtx->state >= PAUSE_STATE_GAMEOVER_3) && (pauseCtx->state <= PAUSE_STATE_GAMEOVER_10) &&
+ (play->gameOverCtx.state != GAMEOVER_INACTIVE)) {
+ KaleidoScope_DrawGameOver(play);
+ }
+ } else {
+ // Draw Owl Warp Menu
+ KaleidoScope_SetVertices(play, play->state.gfxCtx);
+ KaleidoScope_DrawPages(play, play->state.gfxCtx);
+ KaleidoScope_DrawOwlWarpMapPage(play);
+
+ 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, 0);
+
+ KaleidoScope_SetView(pauseCtx, 0.0f, 0.0f, 64.0f);
+ KaleidoScope_DrawOwlWarpInfoPanel(play);
+ KaleidoScope_UpdateCursorSize(play);
+
+ if (pauseCtx->state == PAUSE_STATE_OWLWARP_SELECT) {
+ KaleidoScope_DrawCursor(play);
+ }
+ }
+ }
+
+ if ((pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY_INIT) || (pauseCtx->debugEditor == DEBUG_EDITOR_INVENTORY)) {
+ KaleidoScope_DrawInventoryEditor(play);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+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;
@@ -531,10 +2778,10 @@ void KaleidoScope_UpdateOpening(PlayState* play) {
Interface_UpdateButtonsAlt(play, 1);
if (pauseCtx->cursorSpecialPos == 0) {
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1];
gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED;
} else {
gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
@@ -613,7 +2860,7 @@ void KaleidoScope_Update(PlayState* play) {
size0 = SEGMENT_ROM_SIZE(icon_item_static_old);
CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_static_test), pauseCtx->iconItemSegment, size0);
- gSegments[0x08] = PHYSICAL_TO_VIRTUAL(pauseCtx->iconItemSegment);
+ gSegments[0x08] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment);
for (itemId = 0; itemId <= ITEM_BOW_ARROW_FIRE; itemId++) {
if (!gPlayerFormItemRestrictions[(void)0, gSaveContext.save.playerForm][(s32)itemId]) {
@@ -650,7 +2897,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
func_8011552C(play, DO_ACTION_INFO);
if (((void)0, gSaveContext.worldMapArea) < 0x16) {
- func_8082192C(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
+ Kaleido_LoadMapNameStaticLarge(pauseCtx->nameSegment + 0x400, ((void)0, gSaveContext.worldMapArea));
}
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
@@ -793,7 +3040,7 @@ void KaleidoScope_Update(PlayState* play) {
case PAUSE_STATE_SAVEPROMPT:
switch (pauseCtx->savePromptState) {
- case PAUSE_SAVEPROMPT_STATE_0:
+ case PAUSE_SAVEPROMPT_STATE_APPEARING:
pauseCtx->roll -= 78.5f;
sPauseCursorLeftX -= (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX -= (s16)(sPauseCursorRightMoveOffsetX / 4);
@@ -807,18 +3054,18 @@ void KaleidoScope_Update(PlayState* play) {
if (CHECK_BTN_ALL(input->press.button, BTN_A) || CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
if (pauseCtx->promptChoice != PAUSE_PROMPT_YES) {
func_8011552C(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
} else {
play_sound(NA_SE_SY_PIECE_OF_HEART);
Play_SaveCycleSceneFlags(&play->state);
gSaveContext.save.saveInfo.playerData.savedSceneId = play->sceneId;
func_8014546C(sramCtx);
- if (gSaveContext.unk_3F3F == 0) {
+ if (!gSaveContext.flashSaveAvailable) {
pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_5;
} else {
- func_80147008(sramCtx, D_801C67C8[gSaveContext.fileNum],
- D_801C67F0[gSaveContext.fileNum]);
- func_80147020(sramCtx);
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[gSaveContext.fileNum],
+ gFlashSaveNumPages[gSaveContext.fileNum]);
+ Sram_StartWriteToFlashDefault(sramCtx);
pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_4;
}
sDelayTimer = 90;
@@ -831,7 +3078,7 @@ void KaleidoScope_Update(PlayState* play) {
func_801A3AEC(0);
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
func_8011552C(play, DO_ACTION_NONE);
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_2;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU;
D_8082B90C = pauseCtx->roll;
}
break;
@@ -877,26 +3124,31 @@ void KaleidoScope_Update(PlayState* play) {
}
break;
- case PAUSE_SAVEPROMPT_STATE_2:
+ case PAUSE_SAVEPROMPT_STATE_RETURN_TO_MENU:
pauseCtx->roll += 78.5f;
sPauseCursorLeftX += (s16)(sPauseCursorLeftMoveOffsetX / 4);
sPauseCursorRightX += (s16)(sPauseCursorRightMoveOffsetX / 4);
+
if (pauseCtx->roll >= -314.0f) {
pauseCtx->state = PAUSE_STATE_MAIN;
- pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_0;
+ pauseCtx->savePromptState = PAUSE_SAVEPROMPT_STATE_APPEARING;
pauseCtx->roll = -314.0f;
pauseCtx->itemPageRoll = pauseCtx->mapPageRoll = pauseCtx->questPageRoll =
pauseCtx->maskPageRoll = 0.0f;
func_8011552C(play, DO_ACTION_INFO);
- gSaveContext.buttonStatus[EQUIP_SLOT_B] = D_801C6A98[pauseCtx->pageIndex + 1][0];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = D_801C6A98[pauseCtx->pageIndex + 1][1];
- gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = D_801C6A98[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_B] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][0];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
+ gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] =
+ gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1];
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) ||
(pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT)) {
KaleidoScope_MoveCursorToSpecialPos(play, pauseCtx->cursorSpecialPos);
} else {
- func_80821A04(play);
+ KaleidoScope_MoveCursorFromSpecialPos(play);
}
}
break;
@@ -1075,11 +3327,12 @@ void KaleidoScope_Update(PlayState* play) {
gSaveContext.save.saveInfo.playerData.savedSceneId = play->sceneId;
gSaveContext.save.saveInfo.playerData.health = 0x30;
func_8014546C(sramCtx);
- if (gSaveContext.unk_3F3F == 0) {
+ if (!gSaveContext.flashSaveAvailable) {
pauseCtx->state = PAUSE_STATE_GAMEOVER_8;
} else {
- func_80147008(sramCtx, D_801C67C8[gSaveContext.fileNum], D_801C67F0[gSaveContext.fileNum]);
- func_80147020(sramCtx);
+ Sram_SetFlashPagesDefault(sramCtx, gFlashSaveStartPages[gSaveContext.fileNum],
+ gFlashSaveNumPages[gSaveContext.fileNum]);
+ Sram_StartWriteToFlashDefault(sramCtx);
pauseCtx->state = PAUSE_STATE_GAMEOVER_7;
}
sDelayTimer = 90;
@@ -1194,7 +3447,7 @@ void KaleidoScope_Update(PlayState* play) {
pauseCtx->nameSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemLangSegment + size2);
func_8011552C(play, DO_ACTION_WARP);
worldMapCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
- func_80821900(pauseCtx->nameSegment, worldMapCursorPoint);
+ Kaleido_LoadMapNameStatic(pauseCtx->nameSegment, worldMapCursorPoint);
pauseCtx->iconItemVtxSegment = (void*)ALIGN16((uintptr_t)pauseCtx->nameSegment + 0xA00);
DmaMgr_SendRequest0(pauseCtx->iconItemVtxSegment, SEGMENT_ROM_START(icon_item_vtx_static),
diff --git a/tools/disasm/disasm.py b/tools/disasm/disasm.py
index 0f5e16464..78d66d337 100755
--- a/tools/disasm/disasm.py
+++ b/tools/disasm/disasm.py
@@ -169,7 +169,6 @@ variable_addrs = None
files_text = {}
-
def proper_name(symbol, in_data=False, is_symbol=True):
# hacks
# ovl_En_Encount4 fake symbol at the very end of the data section
@@ -177,14 +176,22 @@ def proper_name(symbol, in_data=False, is_symbol=True):
return variables_ast[0x809C46DC][0] + " + 0x14"
elif symbol == 0x801EF66D: # z_message_nes constant-folding stray fairy array
return variables_ast[0x801EF670][0] + f" - 0x{0x801EF670 - 0x801EF66D:X}"
+ elif symbol == 0x801EF51D: # z_message constant-folding stray fairy array
+ return variables_ast[0x801EF670][0] + f" - 0x{0x801EF670 - 0x801EF51D:X}"
+ elif symbol == 0x801D0D7A: # play_hireso constant-folding D_801D0D80 array
+ return variables_ast[0x801D0D80][0] + f" - 0x{0x801D0D80 - 0x801D0D7A:X}"
+ elif symbol == 0x801D11F4: # play_hireso constant-folding D_801D1244 array
+ return variables_ast[0x801D1244][0] + f" - 0x{0x801D1244 - 0x801D11F4:X}"
+ elif symbol == 0x801D12C0: # play_hireso constant-folding D_801D12E8 array
+ return variables_ast[0x801D12E8][0] + f" - 0x{0x801D12E8 - 0x801D12C0:X}"
elif symbol == 0x80A09740: # boss_07 symbol with large addend folded into %lo
return variables_ast[0x80A09A60][0] + f" - 0x{0x80A09A60 - 0x80A09740:X}"
# 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 8cbc8f13f..4fc8f07c1 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -157,48 +157,48 @@
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",),
- 0x800867B4:("func_800867B4",),
- 0x800867D4:("func_800867D4",),
- 0x800867F4:("func_800867F4",),
- 0x80086814:("func_80086814",),
- 0x80086834:("func_80086834",),
- 0x80086880:("func_80086880",),
- 0x800869A4:("func_800869A4",),
- 0x80086AF0:("func_80086AF0",),
- 0x80086B30:("func_80086B30",),
- 0x80086C18:("func_80086C18",),
- 0x80086C48:("func_80086C48",),
- 0x80086C70:("func_80086C70",),
- 0x80086C7C:("func_80086C7C",),
- 0x80086C88:("func_80086C88",),
- 0x80086C98:("func_80086C98",),
- 0x80086CA8:("func_80086CA8",),
- 0x80086CB4:("func_80086CB4",),
- 0x80086CC0:("func_80086CC0",),
- 0x80086CD0:("func_80086CD0",),
- 0x80086CE0:("func_80086CE0",),
- 0x80086CEC:("func_80086CEC",),
- 0x80086CF8:("func_80086CF8",),
- 0x80086D08:("func_80086D08",),
- 0x80086D18:("func_80086D18",),
- 0x80086D24:("func_80086D24",),
- 0x80086D30:("func_80086D30",),
- 0x80086D40:("func_80086D40",),
- 0x80086D50:("func_80086D50",),
- 0x80086D6C:("func_80086D6C",),
- 0x80086D8C:("func_80086D8C",),
- 0x80086DAC:("func_80086DAC",),
+ 0x80086760:("Math_FTanF",),
+ 0x80086794:("Math_FFloorF",),
+ 0x800867B4:("Math_FCeilF",),
+ 0x800867D4:("Math_FRoundF",),
+ 0x800867F4:("Math_FTruncF",),
+ 0x80086814:("Math_FNearbyIntF",),
+ 0x80086834:("Math_FAtanTaylorQF",),
+ 0x80086880:("Math_FAtanTaylorF",),
+ 0x800869A4:("Math_FAtanContFracF",),
+ 0x80086AF0:("Math_FAtanF",),
+ 0x80086B30:("Math_FAtan2F",),
+ 0x80086C18:("Math_FAsinF",),
+ 0x80086C48:("Math_FAcosF",),
+ 0x80086C70:("floorf",),
+ 0x80086C7C:("floor",),
+ 0x80086C88:("lfloorf",),
+ 0x80086C98:("lfloor",),
+ 0x80086CA8:("ceilf",),
+ 0x80086CB4:("ceil",),
+ 0x80086CC0:("lceilf",),
+ 0x80086CD0:("lceil",),
+ 0x80086CE0:("truncf",),
+ 0x80086CEC:("trunc",),
+ 0x80086CF8:("ltruncf",),
+ 0x80086D08:("ltrunc",),
+ 0x80086D18:("nearbyintf",),
+ 0x80086D24:("nearbyint",),
+ 0x80086D30:("lnearbyintf",),
+ 0x80086D40:("lnearbyint",),
+ 0x80086D50:("roundf",),
+ 0x80086D6C:("round",),
+ 0x80086D8C:("lroundf",),
+ 0x80086DAC:("lround",),
0x80086DD0:("SystemArena_Malloc",),
0x80086DF8:("SystemArena_MallocR",),
0x80086E20:("SystemArena_Realloc",),
@@ -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",),
@@ -743,7 +743,7 @@
0x800B7170:("Actor_SetCameraHorseSetting",),
0x800B71DC:("Actor_MountHorse",),
0x800B7200:("func_800B7200",),
- 0x800B722C:("func_800B722C",),
+ 0x800B722C:("Actor_SpawnHorse",),
0x800B724C:("func_800B724C",),
0x800B7298:("func_800B7298",),
0x800B72E0:("func_800B72E0",),
@@ -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",),
@@ -1683,16 +1683,16 @@
0x800F37B0:("FireObj_Destroy",),
0x800F37F0:("FireObj_SetState2",),
0x800F3820:("FireObj_Update",),
- 0x800F3940:("func_800F3940",),
- 0x800F39B4:("func_800F39B4",),
- 0x800F3A64:("func_800F3A64",),
- 0x800F3B2C:("func_800F3B2C",),
- 0x800F3B68:("func_800F3B68",),
- 0x800F3C44:("func_800F3C44",),
- 0x800F3ED4:("func_800F3ED4",),
- 0x800F40A0:("func_800F40A0",),
- 0x800F415C:("func_800F415C",),
- 0x800F41E4:("func_800F41E4",),
+ 0x800F3940:("Horse_GetJumpingFencePathIndex",),
+ 0x800F39B4:("Horse_CopyPointFromPathList",),
+ 0x800F3A64:("Horse_IsValidSpawn",),
+ 0x800F3B2C:("Horse_ResetHorseData",),
+ 0x800F3B68:("Horse_IsValidSceneLayer",),
+ 0x800F3C44:("Horse_SpawnOverworld",),
+ 0x800F3ED4:("Horse_SpawnMinigame",),
+ 0x800F40A0:("Horse_Spawn",),
+ 0x800F415C:("Horse_RotateToPoint",),
+ 0x800F41E4:("Horse_IsActive",),
0x800F42A0:("Jpeg_ScheduleDecoderTask",),
0x800F43BC:("Jpeg_CopyToZbuffer",),
0x800F44F4:("Jpeg_GetUnalignedU16",),
@@ -1707,7 +1707,7 @@
0x800F4FC0:("Font_LoadMessageBoxEndIcon",),
0x800F5004:("Font_LoadOrderedFont",),
0x800F5090:("func_800F5090",),
- 0x800F50D4:("func_800F50D4",),
+ 0x800F50D4:("Environment_ZBufValToFixedPoint",),
0x800F510C:("Environment_Init",),
0x800F5954:("func_800F5954",),
0x800F5A8C:("Environment_LerpWeight",),
@@ -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",),
@@ -2748,17 +2748,17 @@
0x8013FD74:("View_ApplyPerspectiveToOverlay",),
0x80140024:("View_UpdateViewingMatrix",),
0x801400CC:("View_ApplyTo",),
- 0x80140260:("func_80140260",),
- 0x8014026C:("func_8014026C",),
- 0x80140730:("func_80140730",),
- 0x80140810:("func_80140810",),
- 0x80140898:("func_80140898",),
- 0x80140900:("func_80140900",),
- 0x8014090C:("func_8014090C",),
- 0x80140970:("func_80140970",),
- 0x80140CE0:("func_80140CE0",),
- 0x80140D04:("func_80140D04",),
- 0x80140D10:("func_80140D10",),
+ 0x80140260:("ViMode_LogPrint",),
+ 0x8014026C:("ViMode_Configure",),
+ 0x80140730:("ViMode_Save",),
+ 0x80140810:("ViMode_Load",),
+ 0x80140898:("ViMode_Init",),
+ 0x80140900:("ViMode_Destroy",),
+ 0x8014090C:("ViMode_ConfigureFeatures",),
+ 0x80140970:("ViMode_Update",),
+ 0x80140CE0:("VisCvg_Init",),
+ 0x80140D04:("VisCvg_Destroy",),
+ 0x80140D10:("VisCvg_Draw",),
0x80140E80:("func_80140E80",),
0x80140EA0:("func_80140EA0",),
0x80140EAC:("func_80140EAC",),
@@ -2802,21 +2802,21 @@
0x8014546C:("func_8014546C",),
0x80145698:("func_80145698",),
0x801457CC:("func_801457CC",),
- 0x80146580:("func_80146580",),
- 0x80146628:("func_80146628",),
+ 0x80146580:("Sram_EraseSave",),
+ 0x80146628:("Sram_CopySave",),
0x80146AA0:("Sram_InitSave",),
- 0x80146DF8:("func_80146DF8",),
+ 0x80146DF8:("Sram_WriteSaveOptionsToBuffer",),
0x80146E40:("Sram_InitSram",),
0x80146E70:("Sram_Alloc",),
- 0x80146EBC:("func_80146EBC",),
+ 0x80146EBC:("Sram_SyncWriteToFlash",),
0x80146EE8:("Sram_SaveSpecialEnterClockTown",),
0x80146F5C:("Sram_SaveSpecialNewDay",),
- 0x80147008:("func_80147008",),
- 0x80147020:("func_80147020",),
- 0x80147068:("func_80147068",),
- 0x80147138:("func_80147138",),
- 0x80147150:("func_80147150",),
- 0x80147198:("func_80147198",),
+ 0x80147008:("Sram_SetFlashPagesDefault",),
+ 0x80147020:("Sram_StartWriteToFlashDefault",),
+ 0x80147068:("Sram_UpdateWriteToFlashDefault",),
+ 0x80147138:("Sram_SetFlashPagesOwlSave",),
+ 0x80147150:("Sram_StartWriteToFlashOwlSave",),
+ 0x80147198:("Sram_UpdateWriteToFlashOwlSave",),
0x80147314:("func_80147314",),
0x80147414:("func_80147414",),
0x8014750C:("Sram_nop8014750C",),
@@ -2855,7 +2855,7 @@
0x801518B0:("Message_StartTextbox",),
0x80151938:("Message_ContinueTextbox",),
0x80151A68:("func_80151A68",),
- 0x80151BB4:("func_80151BB4",),
+ 0x80151BB4:("Message_BombersNotebookQueueEvent",),
0x80151C9C:("func_80151C9C",),
0x80151DA4:("func_80151DA4",),
0x80152434:("func_80152434",),
@@ -3040,16 +3040,16 @@
0x8016A178:("Play_AssignPlayerCsIdsFromScene",),
0x8016A268:("Play_FillScreen",),
0x8016A2C8:("Play_Init",),
- 0x8016AC10:("func_8016AC10",),
- 0x8016AE1C:("func_8016AE1C",),
- 0x8016B278:("func_8016B278",),
- 0x8016B4B0:("func_8016B4B0",),
- 0x8016C344:("func_8016C344",),
- 0x8016CD4C:("func_8016CD4C",),
- 0x8016E40C:("func_8016E40C",),
- 0x8016EA90:("func_8016EA90",),
+ 0x8016AC10:("BombersNotebook_DrawScisTexRect",),
+ 0x8016AE1C:("BombersNotebook_DrawHeaders",),
+ 0x8016B278:("BombersNotebook_DrawColumns",),
+ 0x8016B4B0:("BombersNotebook_DrawEntries",),
+ 0x8016C344:("BombersNotebook_DrawRows",),
+ 0x8016CD4C:("BombersNotebook_DrawTimeOfDay",),
+ 0x8016E40C:("BombersNotebook_DrawCursor",),
+ 0x8016EA90:("BombersNotebook_DrawArrows",),
0x8016F1A8:("BombersNotebook_Draw",),
- 0x8016F4EC:("func_8016F4EC",),
+ 0x8016F4EC:("BombersNotebook_LoadFiles",),
0x8016F5A8:("BombersNotebook_Update",),
0x8016FC78:("BombersNotebook_Init",),
0x8016FC98:("BombersNotebook_Destroy",),
@@ -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",),
@@ -3225,15 +3225,15 @@
0x801780F0:("Mtx_SetTranslateScaleMtx",),
0x801781EC:("Mtx_SetRotationMtx",),
0x8017842C:("Mtx_SetTranslationRotationScaleMtx",),
- 0x80178750:("func_80178750",),
- 0x80178818:("func_80178818",),
- 0x80178978:("func_80178978",),
- 0x801789D4:("func_801789D4",),
- 0x801789EC:("SysCfb_GetFbPtr",),
+ 0x80178750:("SysCfb_SetLoResMode",),
+ 0x80178818:("SysCfb_SetHiResMode",),
+ 0x80178978:("SysCfb_Init",),
+ 0x801789D4:("SysCfb_Reset",),
+ 0x801789EC:("SysCfb_GetFramebuffer",),
0x80178A14:("SysCfb_GetZBuffer",),
- 0x80178A24:("func_80178A24",),
- 0x80178A34:("func_80178A34",),
- 0x80178A94:("func_80178A94",),
+ 0x80178A24:("SysCfb_GetWorkBuffer",),
+ 0x80178A34:("SysCfb_GetZBufferPixel",),
+ 0x80178A94:("SysCfb_GetZBufferInt",),
0x80178AC0:("func_80178AC0",),
0x80178C80:("CmpDma_GetFileInfo",),
0x80178D7C:("CmpDma_Decompress",),
@@ -3248,13 +3248,13 @@
0x801791CC:("Check_DrawRegionLockErrorMessage",),
0x80179260:("Check_ExpansionPak",),
0x801792A4:("Check_RegionIsSupported",),
- 0x80179300:("func_80179300",),
- 0x80179400:("func_80179400",),
- 0x801794C4:("pow_int",),
- 0x801794EC:("sin_rad",),
- 0x80179540:("cos_rad",),
+ 0x80179300:("Math_FactorialF",),
+ 0x80179400:("Math_Factorial",),
+ 0x801794C4:("Math_PowF",),
+ 0x801794EC:("Math_SinF",),
+ 0x80179540:("Math_CosF",),
0x80179594:("Rand_ZeroFloat",),
- 0x801795C0:("randPlusMinusPoint5Scaled",),
+ 0x801795C0:("Rand_CenteredFloat",),
0x801795F0:("Math3D_Normalize",),
0x80179678:("Math3D_PlaneVsLineSegClosestPoint",),
0x80179798:("func_80179798",),
@@ -3447,21 +3447,21 @@
0x801856FC:("Slowly_ThreadEntry",),
0x8018571C:("Slowly_Init",),
0x801857A0:("Slowly_Destroy",),
- 0x801857C0:("func_801857C0",),
- 0x801857D0:("func_801857D0",),
- 0x80185864:("func_80185864",),
- 0x80185908:("func_80185908",),
- 0x80185968:("func_80185968",),
- 0x801859F0:("func_801859F0",),
- 0x80185A2C:("func_80185A2C",),
- 0x80185B1C:("func_80185B1C",),
- 0x80185BE4:("func_80185BE4",),
+ 0x801857C0:("SysFlashrom_IsInit",),
+ 0x801857D0:("SysFlashrom_GetVendorStr",),
+ 0x80185864:("SysFlashrom_CheckFlashType",),
+ 0x80185908:("SysFlashrom_InitFlash",),
+ 0x80185968:("SysFlashrom_ReadData",),
+ 0x801859F0:("SysFlashrom_EraseSector",),
+ 0x80185A2C:("SysFlashrom_ExecWrite",),
+ 0x80185B1C:("SysFlashrom_AttemptWrite",),
+ 0x80185BE4:("SysFlashrom_NeedsToErase",),
0x80185C24:("func_80185C24",),
0x80185D40:("SysFlashrom_ThreadEntry",),
- 0x80185DDC:("func_80185DDC",),
- 0x80185EC4:("func_80185EC4",),
- 0x80185F04:("func_80185F04",),
- 0x80185F64:("func_80185F64",),
+ 0x80185DDC:("SysFlashrom_WriteDataAsync",),
+ 0x80185EC4:("SysFlashrom_IsBusy",),
+ 0x80185F04:("SysFlashrom_AwaitResult",),
+ 0x80185F64:("SysFlashrom_WriteDataSync",),
0x80185F90:("func_80185F90",),
0x80186A70:("osFlashGetAddr",),
0x80186AB8:("osFlashReInit",),
@@ -4107,87 +4107,87 @@
0x80803EC0:("TitleSetup_Main",),
0x80803F0C:("TitleSetup_Destroy",),
0x80803F30:("TitleSetup_Init",),
- 0x80804010:("func_80804010",),
- 0x808041A0:("func_808041A0",),
- 0x80804654:("func_80804654",),
- 0x808047D8:("func_808047D8",),
- 0x8080489C:("func_8080489C",),
- 0x80804DAC:("func_80804DAC",),
- 0x80804E74:("func_80804E74",),
- 0x80804F98:("func_80804F98",),
- 0x8080525C:("func_8080525C",),
- 0x808052B0:("func_808052B0",),
- 0x808054A4:("func_808054A4",),
- 0x808055D0:("func_808055D0",),
- 0x808058A4:("func_808058A4",),
- 0x80805918:("func_80805918",),
- 0x80805A58:("func_80805A58",),
- 0x80805B30:("func_80805B30",),
- 0x80805C1C:("func_80805C1C",),
- 0x80806014:("func_80806014",),
- 0x80806148:("func_80806148",),
- 0x80806310:("func_80806310",),
- 0x808067E0:("func_808067E0",),
- 0x80806BC8:("func_80806BC8",),
- 0x80806CA0:("func_80806CA0",),
- 0x80806E84:("func_80806E84",),
- 0x80806F30:("func_80806F30",),
- 0x808071E4:("func_808071E4",),
- 0x80807390:("func_80807390",),
- 0x8080742C:("func_8080742C",),
- 0x808074B4:("func_808074B4",),
- 0x808077AC:("func_808077AC",),
- 0x80807940:("func_80807940",),
- 0x80807A78:("func_80807A78",),
- 0x80807C58:("func_80807C58",),
- 0x80808214:("func_80808214",),
- 0x80808D30:("func_80808D30",),
- 0x80808F1C:("func_80808F1C",),
- 0x80809DF0:("func_80809DF0",),
- 0x80809EA0:("func_80809EA0",),
- 0x8080A3CC:("func_8080A3CC",),
- 0x8080A418:("func_8080A418",),
- 0x8080A4A0:("func_8080A4A0",),
- 0x8080A6BC:("func_8080A6BC",),
- 0x8080A708:("func_8080A708",),
- 0x8080BBFC:("func_8080BBFC",),
- 0x8080BC20:("func_8080BC20",),
- 0x8080BC44:("FileSelect_nop8080bc44",),
- 0x8080BC4C:("FileSelect_nop8080BC4C",),
- 0x8080BC58:("func_8080BC58",),
- 0x8080BDAC:("func_8080BDAC",),
- 0x8080BDDC:("FileSelect_RenderView",),
- 0x8080BE60:("func_8080BE60",),
- 0x8080C040:("func_8080C040",),
- 0x8080C228:("func_8080C228",),
- 0x8080C29C:("func_8080C29C",),
- 0x8080C324:("func_8080C324",),
- 0x8080C3A8:("func_8080C3A8",),
- 0x8080D164:("func_8080D164",),
- 0x8080D170:("func_8080D170",),
- 0x8080D1BC:("func_8080D1BC",),
- 0x8080D220:("func_8080D220",),
- 0x8080D284:("func_8080D284",),
- 0x8080D2EC:("func_8080D2EC",),
- 0x8080D3D0:("func_8080D3D0",),
- 0x8080D40C:("func_8080D40C",),
- 0x8080D6D4:("func_8080D6D4",),
- 0x8080F25C:("func_8080F25C",),
- 0x808108DC:("func_808108DC",),
- 0x80811CB8:("func_80811CB8",),
- 0x80812460:("func_80812460",),
- 0x80812668:("func_80812668",),
- 0x80812760:("func_80812760",),
- 0x80812840:("func_80812840",),
- 0x80812980:("func_80812980",),
- 0x80812A6C:("func_80812A6C",),
- 0x80812D44:("func_80812D44",),
- 0x80812D94:("func_80812D94",),
- 0x80812E94:("func_80812E94",),
- 0x80812ED0:("func_80812ED0",),
+ 0x80804010:("FileSelect_SetupCopySource",),
+ 0x808041A0:("FileSelect_SelectCopySource",),
+ 0x80804654:("FileSelect_SetupCopyDest1",),
+ 0x808047D8:("FileSelect_SetupCopyDest2",),
+ 0x8080489C:("FileSelect_SelectCopyDest",),
+ 0x80804DAC:("FileSelect_ExitToCopySource1",),
+ 0x80804E74:("FileSelect_ExitToCopySource2",),
+ 0x80804F98:("FileSelect_SetupCopyConfirm1",),
+ 0x8080525C:("FileSelect_SetupCopyConfirm2",),
+ 0x808052B0:("FileSelect_CopyConfirm",),
+ 0x808054A4:("FileSelect_CopyWaitForFlashSave",),
+ 0x808055D0:("FileSelect_ReturnToCopyDest",),
+ 0x808058A4:("FileSelect_CopyAnim1",),
+ 0x80805918:("FileSelect_CopyAnim2",),
+ 0x80805A58:("FileSelect_CopyAnim3",),
+ 0x80805B30:("FileSelect_CopyAnim4",),
+ 0x80805C1C:("FileSelect_CopyAnim5",),
+ 0x80806014:("FileSelect_ExitCopyToMain",),
+ 0x80806148:("FileSelect_SetupEraseSelect",),
+ 0x80806310:("FileSelect_EraseSelect",),
+ 0x808067E0:("FileSelect_SetupEraseConfirm1",),
+ 0x80806BC8:("FileSelect_SetupEraseConfirm2",),
+ 0x80806CA0:("FileSelect_EraseConfirm",),
+ 0x80806E84:("FileSelect_ExitToEraseSelect1",),
+ 0x80806F30:("FileSelect_ExitToEraseSelect2",),
+ 0x808071E4:("FileSelect_EraseAnim1",),
+ 0x80807390:("FileSelect_EraseWaitForFlashSave",),
+ 0x8080742C:("FileSelect_EraseAnim2",),
+ 0x808074B4:("FileSelect_EraseAnim3",),
+ 0x808077AC:("FileSelect_ExitEraseToMain",),
+ 0x80807940:("FileSelect_DrawTexQuadI4",),
+ 0x80807A78:("FileSelect_DrawMultiTexQuadI4",),
+ 0x80807C58:("FileSelect_SetKeyboardVtx",),
+ 0x80808214:("FileSelect_SetNameEntryVtx",),
+ 0x80808D30:("FileSelect_DrawKeyboard",),
+ 0x80808F1C:("FileSelect_DrawNameEntry",),
+ 0x80809DF0:("FileSelect_StartNameEntry",),
+ 0x80809EA0:("FileSelect_UpdateKeyboardCursor",),
+ 0x8080A3CC:("FileSelect_NameEntryWaitForFlashSave",),
+ 0x8080A418:("FileSelect_StartOptions",),
+ 0x8080A4A0:("FileSelect_UpdateOptionsMenu",),
+ 0x8080A6BC:("FileSelect_OptionsWaitForFlashSave",),
+ 0x8080A708:("FileSelect_DrawOptionsImpl",),
+ 0x8080BBFC:("FileSelect_DrawOptions",),
+ 0x8080BC20:("FileSelect_IncrementConfigMode",),
+ 0x8080BC44:("FileSelect_Noop1",),
+ 0x8080BC4C:("FileSelect_Noop2",),
+ 0x8080BC58:("FileSelect_InitModeUpdate",),
+ 0x8080BDAC:("FileSelect_InitModeDraw",),
+ 0x8080BDDC:("FileSelect_SetView",),
+ 0x8080BE60:("FileSelect_DrawTexQuadIA8",),
+ 0x8080C040:("FileSelect_FadeInMenuElements",),
+ 0x8080C228:("FileSelect_SplitNumber",),
+ 0x8080C29C:("FileSelect_StartFadeIn",),
+ 0x8080C324:("FileSelect_FinishFadeIn",),
+ 0x8080C3A8:("FileSelect_UpdateMainMenu",),
+ 0x8080D164:("FileSelect_UnusedCM31",),
+ 0x8080D170:("FileSelect_UnusedCMDelay",),
+ 0x8080D1BC:("FileSelect_RotateToNameEntry",),
+ 0x8080D220:("FileSelect_RotateToOptions",),
+ 0x8080D284:("FileSelect_RotateToMain",),
+ 0x8080D2EC:("FileSelect_PulsateCursor",),
+ 0x8080D3D0:("FileSelect_ConfigModeUpdate",),
+ 0x8080D40C:("FileSelect_SetWindowVtx",),
+ 0x8080D6D4:("FileSelect_SetWindowContentVtx",),
+ 0x8080F25C:("FileSelect_DrawFileInfo",),
+ 0x808108DC:("FileSelect_DrawWindowContents",),
+ 0x80811CB8:("FileSelect_ConfigModeDraw",),
+ 0x80812460:("FileSelect_FadeMainToSelect",),
+ 0x80812668:("FileSelect_MoveSelectedFileToTop",),
+ 0x80812760:("FileSelect_FadeInFileInfo",),
+ 0x80812840:("FileSelect_ConfirmFile",),
+ 0x80812980:("FileSelect_FadeOutFileInfo",),
+ 0x80812A6C:("FileSelect_MoveSelectedFileToSlot",),
+ 0x80812D44:("FileSelect_FadeOut",),
+ 0x80812D94:("FileSelect_LoadGame",),
+ 0x80812E94:("FileSelect_SelectModeUpdate",),
+ 0x80812ED0:("FileSelect_SelectModeDraw",),
0x8081313C:("FileSelect_UpdateAndDrawSkybox",),
0x80813268:("FileSelect_Main",),
- 0x80813908:("func_80813908",),
+ 0x80813908:("FileSelect_InitContext",),
0x80813C74:("FileSelect_Destroy",),
0x80813C98:("FileSelect_Init",),
0x80814EB0:("DayTelop_Update",),
@@ -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",),
@@ -4218,41 +4218,41 @@
0x808204AC:("KaleidoScope_UpdateMaskCursor",),
0x80820FA4:("KaleidoScope_UpdateMaskEquip",),
0x80821730:("KaleidoScope_UpdatePrompt",),
- 0x80821900:("func_80821900",),
- 0x8082192C:("func_8082192C",),
- 0x80821958:("func_80821958",),
+ 0x80821900:("Kaleido_LoadMapNameStatic",),
+ 0x8082192C:("Kaleido_LoadMapNameStaticLarge",),
+ 0x80821958:("Kaleido_LoadItemNameStatic",),
0x80821984:("KaleidoScope_MoveCursorToSpecialPos",),
- 0x80821A04:("func_80821A04",),
+ 0x80821A04:("KaleidoScope_MoveCursorFromSpecialPos",),
0x80821AD4:("KaleidoScope_DrawTexQuadRGBA32",),
- 0x80821CC4:("func_80821CC4",),
+ 0x80821CC4:("KaleidoScope_SwitchPage",),
0x80821D84:("KaleidoScope_HandlePageToggles",),
- 0x80821F30:("func_80821F30",),
- 0x808221DC:("func_808221DC",),
- 0x80823350:("func_80823350",),
+ 0x80821F30:("KaleidoScope_DrawPageSections",),
+ 0x808221DC:("KaleidoScope_DrawPages",),
+ 0x80823350:("KaleidoScope_DrawInfoPanel",),
0x80824738:("KaleidoScope_UpdateNamePanel",),
- 0x808248D0:("func_808248D0",),
- 0x80824B90:("func_80824B90",),
+ 0x808248D0:("KaleidoScope_DrawOwlWarpMapPage",),
+ 0x80824B90:("KaleidoScope_DrawOwlWarpInfoPanel",),
0x808256E4:("KaleidoScope_UpdateOwlWarpNamePanel",),
0x8082585C:("KaleidoScope_UpdateSwitchPage",),
0x808259D4:("KaleidoScope_SetView",),
- 0x80825A50:("func_80825A50",),
- 0x80825E28:("func_80825E28",),
- 0x808274DC:("func_808274DC",),
- 0x80827A8C:("func_80827A8C",),
- 0x80827E08:("func_80827E08",),
+ 0x80825A50:("KaleidoScope_SetPageVertices",),
+ 0x80825E28:("KaleidoScope_SetVertices",),
+ 0x808274DC:("KaleidoScope_UpdateCursorSize",),
+ 0x80827A8C:("KaleidoScope_DrawCursor",),
+ 0x80827E08:("KaleidoScope_DrawGameOver",),
0x808283D8:("KaleidoScope_Draw",),
0x808286D8:("KaleidoScope_GrayOutTextureRGBA32",),
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",),
@@ -9675,76 +9675,76 @@
0x80A10368:("EnSob1_ZoraShopkeeper_Draw",),
0x80A104E4:("EnSob1_GoronShopkeeper_Draw",),
0x80A10608:("EnSob1_BombShopkeeper_Draw",),
- 0x80A10FD0:("func_80A10FD0",),
- 0x80A11144:("func_80A11144",),
- 0x80A1143C:("func_80A1143C",),
- 0x80A115B4:("func_80A115B4",),
- 0x80A118F8:("func_80A118F8",),
- 0x80A11BF8:("func_80A11BF8",),
- 0x80A11EC0:("func_80A11EC0",),
- 0x80A1203C:("func_80A1203C",),
- 0x80A1213C:("func_80A1213C",),
- 0x80A121F4:("func_80A121F4",),
- 0x80A1222C:("func_80A1222C",),
- 0x80A122EC:("func_80A122EC",),
- 0x80A123A0:("func_80A123A0",),
- 0x80A124A0:("func_80A124A0",),
- 0x80A124FC:("func_80A124FC",),
- 0x80A125BC:("func_80A125BC",),
- 0x80A12660:("func_80A12660",),
- 0x80A126BC:("func_80A126BC",),
- 0x80A12774:("func_80A12774",),
- 0x80A12868:("func_80A12868",),
- 0x80A12954:("func_80A12954",),
- 0x80A12A64:("func_80A12A64",),
- 0x80A12B78:("func_80A12B78",),
- 0x80A12C48:("func_80A12C48",),
- 0x80A12D6C:("func_80A12D6C",),
- 0x80A12DF4:("func_80A12DF4",),
- 0x80A12E80:("func_80A12E80",),
- 0x80A12FE8:("func_80A12FE8",),
- 0x80A131F8:("func_80A131F8",),
- 0x80A132C8:("func_80A132C8",),
- 0x80A133A8:("func_80A133A8",),
- 0x80A13400:("func_80A13400",),
- 0x80A134B0:("func_80A134B0",),
- 0x80A134F4:("func_80A134F4",),
- 0x80A13564:("func_80A13564",),
- 0x80A136B8:("func_80A136B8",),
- 0x80A13728:("func_80A13728",),
- 0x80A137C0:("func_80A137C0",),
- 0x80A139E4:("func_80A139E4",),
- 0x80A13B1C:("func_80A13B1C",),
- 0x80A13E80:("func_80A13E80",),
- 0x80A14018:("func_80A14018",),
- 0x80A14104:("func_80A14104",),
- 0x80A141D4:("func_80A141D4",),
- 0x80A1428C:("func_80A1428C",),
- 0x80A14324:("func_80A14324",),
- 0x80A143A8:("func_80A143A8",),
- 0x80A14430:("func_80A14430",),
- 0x80A1449C:("func_80A1449C",),
- 0x80A144F4:("func_80A144F4",),
- 0x80A145AC:("func_80A145AC",),
- 0x80A14668:("func_80A14668",),
- 0x80A146CC:("func_80A146CC",),
- 0x80A14798:("func_80A14798",),
- 0x80A149B0:("func_80A149B0",),
- 0x80A14B30:("func_80A14B30",),
- 0x80A14E14:("func_80A14E14",),
- 0x80A14E74:("func_80A14E74",),
- 0x80A14EB0:("func_80A14EB0",),
- 0x80A14FC8:("func_80A14FC8",),
- 0x80A153FC:("func_80A153FC",),
- 0x80A15684:("func_80A15684",),
- 0x80A157C4:("func_80A157C4",),
+ 0x80A10FD0:("EnGo_InitSteam",),
+ 0x80A11144:("EnGo_DrawSteam",),
+ 0x80A1143C:("EnGo_InitDust",),
+ 0x80A115B4:("EnGo_DrawDust",),
+ 0x80A118F8:("EnGo_InitSnow",),
+ 0x80A11BF8:("EnGo_UpdateSnow",),
+ 0x80A11EC0:("EnGo_DrawSnow",),
+ 0x80A1203C:("EnGo_UpdateEffects",),
+ 0x80A1213C:("EnGo_DrawEffects",),
+ 0x80A121F4:("EnGo_CanSnowballHurtPlayer",),
+ 0x80A1222C:("EnGo_IsFallingAsleep",),
+ 0x80A122EC:("EnGo_UpdateFocus",),
+ 0x80A123A0:("EnGo_UpdateSnowballCollider",),
+ 0x80A124A0:("EnGo_UpdateMedigoronCollider",),
+ 0x80A124FC:("EnGo_UpdateRolledUpCollider",),
+ 0x80A125BC:("EnGo_UpdateFrozenCollider",),
+ 0x80A12660:("EnGo_UpdateStandingCollider",),
+ 0x80A126BC:("EnGo_UpdateCollider",),
+ 0x80A12774:("EnGo_UpdateTalking",),
+ 0x80A12868:("EnGo_DetectCollisions",),
+ 0x80A12954:("EnGo_UpdateSpringArrivalCutscene",),
+ 0x80A12A64:("EnGo_UpdateAnimationToCurrent",),
+ 0x80A12B78:("EnGo_UpdateSfx",),
+ 0x80A12C48:("EnGo_ChangeAnim",),
+ 0x80A12D6C:("EnGo_UpdateEyes",),
+ 0x80A12DF4:("EnGo_UpdateShiverSurprisedAnimation",),
+ 0x80A12E80:("EnGo_UpdateGraveyardAttentionTargetAndReactions",),
+ 0x80A12FE8:("EnGo_UpdateRotationToTarget",),
+ 0x80A131F8:("EnGo_UpdateAttentionTargetAndReactions",),
+ 0x80A132C8:("EnGo_GravemakerIdle",),
+ 0x80A133A8:("EnGo_FrozenIdle",),
+ 0x80A13400:("EnGo_FindGravemaker",),
+ 0x80A134B0:("EnGo_UpdateMedigoronColliderRadius",),
+ 0x80A134F4:("EnGo_ChangeCutscene",),
+ 0x80A13564:("EnGo_HandleGatekeeperPoundCutscene",),
+ 0x80A136B8:("EnGo_RequestQuake",),
+ 0x80A13728:("EnGo_CreateGatekeeperPoundEffects",),
+ 0x80A137C0:("EnGo_DrawIceBlockWhenFrozen",),
+ 0x80A139E4:("EnGo_MakeSteam",),
+ 0x80A13B1C:("EnGo_HandleOpenShrineCutscene",),
+ 0x80A13E80:("EnGo_HandleGivePowderKegCutscene",),
+ 0x80A14018:("EnGo_ChangeToStretchingAnimation",),
+ 0x80A14104:("EnGo_ChangeToSpectatingAnimation",),
+ 0x80A141D4:("EnGo_ChangeToFrozenAnimation",),
+ 0x80A1428C:("EnGo_ChangeToSnowballAnimation",),
+ 0x80A14324:("EnGo_ChangeToCoveringEarsAnimation",),
+ 0x80A143A8:("EnGo_ChangeToShiveringAnimation",),
+ 0x80A14430:("EnGo_SetupAthletic",),
+ 0x80A1449C:("EnGo_SetupSpectator",),
+ 0x80A144F4:("EnGo_SetupGatekeeper",),
+ 0x80A145AC:("EnGo_SetupGraveyardGoron",),
+ 0x80A14668:("EnGo_SetupShrineGoron",),
+ 0x80A146CC:("EnGo_SetupMedigoron",),
+ 0x80A14798:("EnGo_SetupInitialAction",),
+ 0x80A149B0:("EnGo_Idle",),
+ 0x80A14B30:("EnGo_Sleep",),
+ 0x80A14E14:("EnGo_Frozen",),
+ 0x80A14E74:("EnGo_AwaitThaw",),
+ 0x80A14EB0:("EnGo_Thaw",),
+ 0x80A14FC8:("EnGo_HandleSpringArrivalCutscene",),
+ 0x80A153FC:("EnGo_Snowball",),
+ 0x80A15684:("EnGo_GetMsgEventScript",),
+ 0x80A157C4:("EnGo_Talk",),
0x80A1590C:("EnGo_Init",),
0x80A15960:("EnGo_Destroy",),
0x80A159B0:("EnGo_Update",),
- 0x80A15B80:("func_80A15B80",),
+ 0x80A15B80:("EnGo_Draw_NoSkeleton",),
0x80A15D04:("EnGo_OverrideLimbDraw",),
0x80A15E38:("EnGo_TransfromLimbDraw",),
- 0x80A15FEC:("func_80A15FEC",),
+ 0x80A15FEC:("EnGo_Draw",),
0x80A16D40:("EnRaf_ClearPixelTeeth",),
0x80A16D6C:("EnRaf_ClearPixelPetal",),
0x80A16D90:("EnRaf_Init",),
@@ -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",),
@@ -11971,7 +11971,7 @@
0x80AC6740:("TransitionWipe3_Start",),
0x80AC687C:("TransitionWipe3_Init",),
0x80AC68A8:("TransitionWipe3_Destroy",),
- 0x80AC68B4:("func_80AC68B4",),
+ 0x80AC68B4:("TransitionWipe3_UpdateScrollY",),
0x80AC68E0:("TransitionWipe3_Update",),
0x80AC69F8:("TransitionWipe3_Draw",),
0x80AC6BE4:("TransitionWipe3_IsDone",),
@@ -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 855900bb2..749ee5878 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),
@@ -946,22 +933,12 @@
0x801BD8FC:("sFireObjColors","FireObjColors","[1]",0x08),
0x801BD904:("sFireObjLightParams","FireObjLightParams","[1]",0x08),
0x801BD910:("gGameStateOverlayTable","GameStateOverlay","[7]",0x150),
- 0x801BDA60:("graphNumGameStates","UNK_TYPE4","",0x4),
- 0x801BDA70:("D_801BDA70","UNK_TYPE2","",0x2),
- 0x801BDA74:("D_801BDA74","UNK_TYPE2","",0x2),
- 0x801BDA78:("D_801BDA78","UNK_TYPE2","",0x2),
- 0x801BDA7C:("D_801BDA7C","UNK_TYPE2","",0x2),
- 0x801BDA9C:("D_801BDA9C","UNK_TYPE4","",0x4),
- 0x801BDAA0:("D_801BDAA0","UNK_TYPE4","",0x4),
- 0x801BDAA4:("D_801BDAA4","UNK_TYPE4","",0x4),
- 0x801BDAA8:("D_801BDAA8","UNK_TYPE2","",0x2),
- 0x801BDAAA:("D_801BDAAA","UNK_TYPE2","",0x2),
- 0x801BDAAC:("D_801BDAAC","UNK_TYPE2","",0x2),
- 0x801BDAAE:("D_801BDAAE","UNK_TYPE2","",0x2),
- 0x801BDAB0:("D_801BDAB0","UNK_TYPE2","",0x2),
- 0x801BDAB2:("D_801BDAB2","UNK_TYPE2","",0x2),
- 0x801BDAB4:("D_801BDAB4","UNK_TYPE2","",0x2),
- 0x801BDAB6:("D_801BDAB6","UNK_TYPE2","",0x2),
+ 0x801BDA60:("gGraphNumGameStates","UNK_TYPE4","",0x4),
+ 0x801BDA70:("sHorseValidScenes","struct_801BDAA8","[11]",0x2C),
+ 0x801BDA9C:("gHorseIsMounted","s32","",0x4),
+ 0x801BDAA0:("D_801BDAA0","s32","",0x4),
+ 0x801BDAA4:("gHorsePlayedEponasSong","s32","",0x4),
+ 0x801BDAA8:("sHorseValidSceneLayers","struct_801BDAA8","[4]",0x10),
0x801BDAC0:("D_801BDAC0","UNK_TYPE4","",0x4),
0x801BDAC4:("D_801BDAC4","UNK_TYPE4","",0x4),
0x801BDAC8:("D_801BDAC8","UNK_TYPE4","",0x4),
@@ -1011,10 +988,10 @@
0x801BE9F4:("sHeartsDDEnvColors","s16","[3][3]",0x12),
0x801BEA08:("sHeartsDDPrimFactors","s16","[3][3]",0x12),
0x801BEA1C:("sHeartsDDEnvFactors","s16","[3][3]",0x12),
- 0x801BEA30:("HeartTextures","UNK_TYPE1","",0x1),
- 0x801BEA70:("HeartDDTextures","UNK_TYPE1","",0x1),
- 0x801BEAB0:("posBindFuncs","LightsPosBindFunc","[3]",0xc),
- 0x801BEABC:("dirBindFuncs","LightsBindFunc","[3]",0xc),
+ 0x801BEA30:("sHeartTextures","UNK_TYPE1","",0x1),
+ 0x801BEA70:("sHeartDDTextures","UNK_TYPE1","",0x1),
+ 0x801BEAB0:("sPosBindFuncs","LightsPosBindFunc","[3]",0xc),
+ 0x801BEABC:("sDirBindFuncs","LightsBindFunc","[3]",0xc),
0x801BEAD4:("D_801BEAD4","UNK_TYPE4","",0x4),
0x801BEAD8:("D_801BEAD8","UNK_TYPE4","",0x4),
0x801BEAE0:("D_801BEAE0","UNK_TYPE1","",0x1),
@@ -1137,30 +1114,30 @@
0x801BFB1C:("sMagicArrowEffectsG","UNK_TYPE1","",0x1),
0x801BFB24:("sMagicArrowEffectsB","UNK_TYPE1","",0x1),
0x801BFB2C:("sThreeDayClockAlpha","UNK_TYPE2","",0x2),
- 0x801BFB30:("D_801BFB30","UNK_TYPE2","",0x2),
- 0x801BFB34:("D_801BFB34","UNK_TYPE2","",0x2),
+ 0x801BFB30:("sClockAlphaTimer1","UNK_TYPE2","",0x2),
+ 0x801BFB34:("sClockAlphaTimer2","UNK_TYPE2","",0x2),
0x801BFB38:("sThreeDayClockHours","UNK_TYPE1","",0x1),
0x801BFB6C:("sThreeDayClockHourTextures","UNK_TYPE1","",0x1),
- 0x801BFBCC:("D_801BFBCC","UNK_TYPE2","",0x2),
- 0x801BFBD0:("D_801BFBD0","UNK_TYPE2","",0x2),
- 0x801BFBD4:("D_801BFBD4","UNK_TYPE2","",0x2),
- 0x801BFBD8:("D_801BFBD8","UNK_TYPE2","",0x2),
- 0x801BFBDC:("D_801BFBDC","UNK_TYPE2","",0x2),
- 0x801BFBE0:("D_801BFBE0","UNK_TYPE2","",0x2),
- 0x801BFBE4:("D_801BFBE4","UNK_TYPE2","",0x2),
- 0x801BFBE8:("D_801BFBE8","UNK_TYPE2","",0x2),
- 0x801BFBEC:("D_801BFBEC","UNK_TYPE1","",0x1),
- 0x801BFBF0:("D_801BFBF0","UNK_TYPE1","",0x1),
- 0x801BFBF4:("D_801BFBF4","UNK_TYPE1","",0x1),
- 0x801BFBF8:("D_801BFBF8","UNK_TYPE1","",0x1),
- 0x801BFBFC:("D_801BFBFC","UNK_TYPE1","",0x1),
- 0x801BFC00:("D_801BFC00","UNK_TYPE1","",0x1),
- 0x801BFC04:("D_801BFC04","UNK_TYPE1","",0x1),
- 0x801BFC08:("D_801BFC08","UNK_TYPE1","",0x1),
- 0x801BFC0C:("D_801BFC0C","UNK_TYPE1","",0x1),
- 0x801BFC10:("D_801BFC10","UNK_TYPE1","",0x1),
+ 0x801BFBCC:("sClockInvDiamondPrimRed","UNK_TYPE2","",0x2),
+ 0x801BFBD0:("sClockInvDiamondPrimGreen","UNK_TYPE2","",0x2),
+ 0x801BFBD4:("sClockInvDiamondPrimBlue","UNK_TYPE2","",0x2),
+ 0x801BFBD8:("sClockInvDiamondEnvRed","UNK_TYPE2","",0x2),
+ 0x801BFBDC:("sClockInvDiamondEnvGreen","UNK_TYPE2","",0x2),
+ 0x801BFBE0:("sClockInvDiamondEnvBlue","UNK_TYPE2","",0x2),
+ 0x801BFBE4:("sClockInvDiamondTimer","UNK_TYPE2","",0x2),
+ 0x801BFBE8:("sClockInvDiamondTargetIndex","UNK_TYPE2","",0x2),
+ 0x801BFBEC:("sClockInvDiamondPrimRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF0:("sClockInvDiamondPrimGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF4:("sClockInvDiamondPrimBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFBF8:("sClockInvDiamondEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFBFC:("sClockInvDiamondEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC00:("sClockInvDiamondEnvBlueTargets","UNK_TYPE1","",0x1),
+ 0x801BFC04:("sFinalHoursClockDigitsRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC08:("sFinalHoursClockFrameEnvRedTargets","UNK_TYPE1","",0x1),
+ 0x801BFC0C:("sFinalHoursClockFrameEnvGreenTargets","UNK_TYPE1","",0x1),
+ 0x801BFC10:("sFinalHoursClockFrameEnvBlueTargets","UNK_TYPE1","",0x1),
0x801BFC14:("sFinalHoursDigitTextures","UNK_TYPE1","",0x1),
- 0x801BFC40:("D_801BFC40","UNK_TYPE1","",0x1),
+ 0x801BFC40:("sFinalHoursDigitSlotPosXOffset","UNK_TYPE1","",0x1),
0x801BFC50:("sPerfectLettersType1OffScreenAngles","UNK_TYPE2","",0x2),
0x801BFC60:("sPerfectLettersType1PrimColorTargets","s16","[6]",0xC),
0x801BFC6C:("sPerfectLettersType2SpellingOffsetsX","UNK_TYPE4","",0x4),
@@ -1326,13 +1303,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),
@@ -1948,16 +1925,16 @@
0x801C5EB0:("D_801C5EB0","UNK_TYPE4","",0x4),
0x801C5EC4:("D_801C5EC4","UNK_TYPE2","",0x2),
0x801C5F44:("D_801C5F44","UNK_TYPE4","",0x4),
- 0x801C5FC0:("D_801C5FC0","u32","[452]",0x710),
+ 0x801C5FC0:("sPersistentCycleFlags","u32","[452]",0x710),
0x801C66D0:("D_801C66D0","UNK_TYPE2","",0x2),
- 0x801C6798:("D_801C6798","UNK_TYPE4","",0x4),
+ 0x801C6798:("gSramSlotOffsets","UNK_TYPE4","",0x4),
0x801C67B0:("gAmmoItems","UNK_TYPE1","",0x1),
- 0x801C67C8:("D_801C67C8","s32","[10]",0x28),
- 0x801C67F0:("D_801C67F0","s32","[10]",0x28),
- 0x801C6818:("D_801C6818","s32","[10]",0x28),
- 0x801C6840:("D_801C6840","UNK_TYPE1","",0x1),
- 0x801C6850:("D_801C6850","UNK_TYPE1","",0x1),
- 0x801C6870:("D_801C6870","UNK_TYPE1","",0x1),
+ 0x801C67C8:("gFlashSaveStartPages","s32","[10]",0x28),
+ 0x801C67F0:("gFlashSaveNumPages","s32","[10]",0x28),
+ 0x801C6818:("gFlashSpecialSaveNumPages","s32","[10]",0x28),
+ 0x801C6840:("gFlashOwlSaveStartPages","UNK_TYPE1","",0x1),
+ 0x801C6850:("gFlashOwlSaveNumPages","UNK_TYPE1","",0x1),
+ 0x801C6870:("gFlashSaveSizes","UNK_TYPE1","",0x1),
0x801C6890:("D_801C6890","UNK_TYPE1","",0x1),
0x801C6898:("sSaveDefaultPlayerData","SavePlayerData","",0x28),
0x801C68C0:("sSaveDefaultItemEquips","ItemEquips","",0x22),
@@ -1980,9 +1957,9 @@
0x801C6A8C:("D_801C6A8C","UNK_TYPE2","",0x2),
0x801C6A90:("D_801C6A90","UNK_TYPE2","",0x2),
0x801C6A94:("D_801C6A94","UNK_TYPE2","",0x2),
- 0x801C6A98:("D_801C6A98","UNK_TYPE1","",0x1),
- 0x801C6AB8:("D_801C6AB8","UNK_TYPE1","",0x1),
- 0x801C6B28:("D_801C6B28","UNK_TYPE1","",0x1),
+ 0x801C6A98:("gPageSwitchNextButtonStatus","UNK_TYPE1","",0x1),
+ 0x801C6AB8:("sBombersNotebookEventMessages","UNK_TYPE1","",0x1),
+ 0x801C6B28:("gBombersNotebookWeekEventFlags","UNK_TYPE1","",0x1),
0x801C6B98:("D_801C6B98","UNK_TYPE1","",0x1),
0x801CED40:("D_801CED40","UNK_TYPE1","",0x1),
0x801CFB08:("D_801CFB08","UNK_TYPE1","",0x1),
@@ -2126,7 +2103,7 @@
0x801D0B70:("gKaleidoMgrOverlayTable","KaleidoMgrOverlay","",0x38),
0x801D0BA8:("sKaleidoAreaPtr","void*","",0x4),
0x801D0BAC:("gKaleidoMgrCurOvl","KaleidoMgrOverlay*","",0x4),
- 0x801D0BB0:("D_801D0BB0","UNK_TYPE4","",0x4),
+ 0x801D0BB0:("gTransitionOverlayTable","UNK_TYPE4","",0x4),
0x801D0C80:("D_801D0C80","UNK_TYPE1","",0x1),
0x801D0CB0:("D_801D0CB0","UNK_TYPE1","",0x1),
0x801D0CD8:("TransitionFade_InitVars","UNK_PTR","",0x4),
@@ -2138,20 +2115,14 @@
0x801D0D5C:("sIsCameraUnderwater","UNK_TYPE2","",0x2),
0x801D0D60:("D_801D0D60","Input*","",0x4),
0x801D0D64:("sPlayerCsIdToCsCamId","s16","[10]",0x14),
- 0x801D0D78:("D_801D0D78","u16","[4]",0x4),
- 0x801D0D80:("D_801D0D80","UNK_TYPE1","",0x1),
- 0x801D11F4:("D_801D11F4","UNK_TYPE1","",0x1),
- 0x801D1230:("D_801D1230","UNK_TYPE1","",0x1),
- 0x801D1234:("D_801D1234","UNK_TYPE1","",0x1),
- 0x801D1238:("D_801D1238","UNK_TYPE4","",0x4),
- 0x801D1244:("D_801D1244","UNK_TYPE1","",0x1),
- 0x801D12C0:("D_801D12C0","UNK_TYPE1","",0x1),
- 0x801D12D0:("D_801D12D0","UNK_TYPE1","",0x1),
- 0x801D12D4:("D_801D12D4","UNK_TYPE1","",0x1),
- 0x801D12D8:("D_801D12D8","UNK_TYPE1","",0x1),
+ 0x801D0D80:("D_801D0D80","UNK_TYPE1","",0x4B0),
+ 0x801D1230:("D_801D1230","UNK_TYPE1","",0x8),
+ 0x801D1238:("D_801D1238","UNK_TYPE4","",0x1),
+ 0x801D1244:("D_801D1244","UNK_TYPE1","",0x8C),
+ 0x801D12D0:("D_801D12D0","UNK_TYPE1","",0xC),
0x801D12DC:("D_801D12DC","UNK_TYPE1","",0x1),
- 0x801D1330:("D_801D1330","UNK_TYPE2","",0x2),
- 0x801D1342:("D_801D1342","UNK_TYPE1","",0x1),
+ 0x801D12E8:("D_801D12E8","UNK_TYPE1","",0x1),
+ 0x801D1330:("D_801D1330","UNK_TYPE1","",0x14),
0x801D1344:("D_801D1344","UNK_TYPE2","",0x2),
0x801D1368:("D_801D1368","UNK_TYPE1","",0x1),
0x801D1374:("D_801D1374","UNK_TYPE2","",0x2),
@@ -2194,9 +2165,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),
@@ -3851,7 +3822,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),
@@ -3868,9 +3839,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),
@@ -4007,7 +3978,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),
@@ -4065,7 +4036,7 @@
0x801F8010:("D_801F8010","struct_801F8010","",0x10),
0x801F8020:("sVisZbuf","VisZbuf","",0x10),
0x801F8030:("sMonoColors","VisMono","",0x18),
- 0x801F8048:("D_801F8048","UNK_TYPE1","",0x1),
+ 0x801F8048:("D_801F8048","ViMode","",0x88),
0x801F80D0:("sGraphFaultAddrConvClient","FaultAddrConvClient","",0xc),
0x801F80E0:("sGraphFaultClient","FaultClient","",0x10),
0x801F80F0:("gGfxMasterDL","Gfx*","",0x4),
@@ -4108,30 +4079,30 @@
0x801FBB14:("D_801FBB14","UNK_TYPE1","",0x1),
0x801FBB20:("gRDPTotalTime","UNK_TYPE1","",0x1),
0x801FBB28:("D_801FBB28","UNK_TYPE1","",0x1),
- 0x801FBB30:("D_801FBB30","OSViMode","",0x50),
+ 0x801FBB30:("sNotebookViMode","OSViMode","",0x50),
0x801FBB80:("gFramebuffers","u32*","[2]",0x8),
- 0x801FBB88:("D_801FBB88","OSViMode*","",0x4),
+ 0x801FBB88:("gActiveViMode","OSViMode*","",0x4),
0x801FBB8C:("gZBufferPtr","u16*","",0x4),
- 0x801FBB90:("D_801FBB90","UNK_TYPE4","",0x4),
+ 0x801FBB90:("gWorkBuffer","UNK_TYPE4","",0x4),
0x801FBB94:("gGfxSPTaskOutputBufferPtr","UNK_TYPE1","",0x1),
- 0x801FBB98:("gGfxSPTaskOutputBufferSize","UNK_TYPE1","",0x1),
- 0x801FBB9C:("D_801FBB9C","UNK_TYPE1","",0x1),
- 0x801FBBA0:("D_801FBBA0","UNK_TYPE1","",0x1),
- 0x801FBBA4:("gZBuffer","u16*","",0x4),
- 0x801FBBA8:("gWorkBuffer","u16**","",0x4),
- 0x801FBBAC:("gGfxSPTaskOutputBuffer","u16**","",0x4),
- 0x801FBBB0:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
- 0x801FBBB4:("D_801FBBB4","UNK_TYPE1","",0x1),
- 0x801FBBB8:("D_801FBBB8","UNK_TYPE1","",0x1),
- 0x801FBBBC:("D_801FBBBC","UNK_TYPE1","",0x1),
- 0x801FBBC0:("D_801FBBC0","UNK_TYPE1","",0x1),
- 0x801FBBC4:("gGfxSPTaskOutputBuffer2","UNK_TYPE1","",0x1),
- 0x801FBBC8:("gGfxSPTaskOutputBufferEnd2","UNK_TYPE1","",0x1),
- 0x801FBBCC:("D_801FBBCC","UNK_TYPE2","",0x2),
- 0x801FBBCE:("D_801FBBCE","UNK_TYPE2","",0x2),
- 0x801FBBD0:("D_801FBBD0","UNK_TYPE1","",0x1),
- 0x801FBBD2:("D_801FBBD2","UNK_TYPE1","",0x1),
- 0x801FBBD4:("D_801FBBD4","UNK_TYPE1","",0x1),
+ 0x801FBB98:("gGfxSPTaskOutputBufferEnd","UNK_TYPE1","",0x1),
+ 0x801FBB9C:("sCfbLoRes1","UNK_TYPE1","",0x1),
+ 0x801FBBA0:("sCfbLoRes0","UNK_TYPE1","",0x1),
+ 0x801FBBA4:("gZBufferLoRes","u16*","",0x4),
+ 0x801FBBA8:("gWorkBufferLoRes","u16**","",0x4),
+ 0x801FBBAC:("gGfxSPTaskOutputBufferLoRes","u16**","",0x4),
+ 0x801FBBB0:("gGfxSPTaskOutputBufferEndLoRes","UNK_TYPE1","",0x1),
+ 0x801FBBB4:("sCfbHiRes1","UNK_TYPE1","",0x1),
+ 0x801FBBB8:("sCfbHiRes0","UNK_TYPE1","",0x1),
+ 0x801FBBBC:("gZBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC0:("gWorkBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC4:("gGfxSPTaskOutputBufferHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBC8:("gGfxSPTaskOutputBufferEndHiRes","UNK_TYPE1","",0x1),
+ 0x801FBBCC:("gCfbWidth","UNK_TYPE2","",0x2),
+ 0x801FBBCE:("gCfbHeight","UNK_TYPE2","",0x2),
+ 0x801FBBD0:("gCfbLeftAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD2:("gCfbUpperAdjust","UNK_TYPE1","",0x1),
+ 0x801FBBD4:("gSysCfbHiResEnabled","UNK_TYPE1","",0x1),
0x801FBBE0:("sDmaBuffer","u32","[2]",0x8),
0x801FBBF0:("D_801FBBF0","Vec3f","",0xc),
0x801FBC00:("Math3D_ColSphereTri_line","LineSegment","",0x18),
@@ -4207,14 +4178,14 @@
0x801FBDE8:("D_801FBDE8","Vec3f","",0xc),
0x801FBE00:("sMatrixStack","MtxF*","",0x4),
0x801FBE04:("sCurrentMatrix","MtxF*","",0x4),
- 0x801FBE10:("D_801FBE10","UNK_TYPE1","",0x1),
- 0x801FBE28:("D_801FBE28","UNK_TYPE1","",0x1),
- 0x801FBE2C:("D_801FBE2C","UNK_TYPE1","",0x1),
- 0x801FBE30:("D_801FBE30","UNK_TYPE4","",0x4),
+ 0x801FBE10:("sFlashromMesgQueue","UNK_TYPE1","",0x1),
+ 0x801FBE28:("sFlashromMesg","UNK_TYPE1","",0x1),
+ 0x801FBE2C:("sFlashromIsInit","UNK_TYPE1","",0x1),
+ 0x801FBE30:("sFlashromVendor","UNK_TYPE4","",0x4),
0x801FBE38:("sSysFlashromStack","u8","[4096]",0x1000),
0x801FCE38:("sSysFlashromStackInfo","StackEntry","",0x1c),
0x801FCE58:("sSysFlashromThread","OSThread","",0x1b0),
- 0x801FD008:("D_801FD008","s80185D40","",0x2c),
+ 0x801FD008:("sFlashromRequest","s80185D40","",0x2c),
0x801FD034:("D_801FD034","OSMesg","",0x4),
0x801FD040:("D_801FD040","s32","",0x10),
0x801FD050:("D_801FD050","OSIoMesg","",0x18),
@@ -4306,7 +4277,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),
@@ -4568,13 +4539,13 @@
0x80803FC8:("openingCutscenes","u32","[2]",0x8),
0x80813DF0:("D_80813DF0","UNK_TYPE1","",0x1),
0x80813F30:("D_80813F30","UNK_TYPE1","",0x1),
- 0x80814130:("D_80814130","UNK_TYPE1","",0x1),
- 0x80814170:("D_80814170","UNK_TYPE1","",0x1),
- 0x808141B0:("D_808141B0","UNK_TYPE1","",0x1),
+ 0x80814130:("gOptionsDividerTopVtx","UNK_TYPE1","",0x1),
+ 0x80814170:("gOptionsDividerMiddleVtx","UNK_TYPE1","",0x1),
+ 0x808141B0:("gOptionsDividerBottomVtx","UNK_TYPE1","",0x1),
0x808141F0:("D_808141F0","UNK_TYPE1","",0x1),
- 0x80814240:("D_80814240","UNK_TYPE2","",0x2),
+ 0x80814240:("sChooseFileYOffsets","UNK_TYPE2","",0x2),
0x8081424C:("D_8081424C","UNK_TYPE2","",0x2),
- 0x80814260:("D_80814260","UNK_TYPE2","",0x2),
+ 0x80814260:("sEraseDelayTimer","UNK_TYPE2","",0x2),
0x80814264:("D_80814264","UNK_TYPE2","",0x2),
0x8081426C:("D_8081426C","UNK_TYPE1","",0x1),
0x80814280:("D_80814280","UNK_TYPE1","",0x1),
@@ -4583,31 +4554,31 @@
0x80814404:("D_80814404","UNK_TYPE2","",0x2),
0x80814410:("D_80814410","UNK_TYPE2","",0x2),
0x8081441C:("D_8081441C","UNK_TYPE2","",0x2),
- 0x80814428:("D_80814428","UNK_TYPE4","",0x4),
- 0x80814430:("D_80814430","UNK_TYPE2","",0x2),
+ 0x80814428:("sBackspaceEndTextures","UNK_TYPE4","",0x4),
+ 0x80814430:("sBackspaceEndWidths","UNK_TYPE2","",0x2),
0x80814434:("D_80814434","UNK_TYPE2","",0x2),
0x8081444C:("D_8081444C","UNK_TYPE1","",0x1),
- 0x80814464:("D_80814464","UNK_TYPE4","",0x4),
- 0x8081448C:("D_8081448C","UNK_TYPE4","",0x4),
- 0x808144BC:("D_808144BC","UNK_TYPE2","",0x2),
- 0x808144C0:("D_808144C0","UNK_TYPE2","",0x2),
- 0x808144C4:("D_808144C4","UNK_TYPE2","",0x2),
- 0x808144C8:("D_808144C8","UNK_TYPE2","",0x2),
- 0x808144CC:("D_808144CC","UNK_TYPE2","",0x2),
- 0x808144D0:("D_808144D0","UNK_TYPE2","",0x2),
- 0x808144D4:("D_808144D4","UNK_TYPE2","",0x2),
- 0x808144D8:("D_808144D8","UNK_TYPE2","",0x2),
- 0x808144DC:("D_808144DC","UNK_TYPE1","",0x1),
- 0x808144E8:("D_808144E8","UNK_TYPE1","",0x1),
- 0x80814510:("D_80814510","Gfx","[5]",0x28),
- 0x80814538:("D_80814538","UNK_TYPE2","",0x2),
- 0x80814548:("D_80814548","UNK_TYPE2","",0x2),
- 0x80814550:("fileChooseSkyboxRotation","s16","",0x2),
- 0x80814554:("D_80814554","UNK_TYPE1","",0x1),
- 0x8081455C:("D_8081455C","UNK_TYPE1","",0x1),
+ 0x80814464:("gOptionsMenuHeaders","UNK_TYPE4","",0x4),
+ 0x8081448C:("gOptionsMenuSettings","UNK_TYPE4","",0x4),
+ 0x808144BC:("sCursorPrimRed","UNK_TYPE2","",0x2),
+ 0x808144C0:("sCursorPrimGreen","UNK_TYPE2","",0x2),
+ 0x808144C4:("sCursorPrimBlue","UNK_TYPE2","",0x2),
+ 0x808144C8:("sCursorEnvRed","UNK_TYPE2","",0x2),
+ 0x808144CC:("sCursorEnvGreen","UNK_TYPE2","",0x2),
+ 0x808144D0:("sCursorEnvBlue","UNK_TYPE2","",0x2),
+ 0x808144D4:("sCursorPulseDir","UNK_TYPE2","",0x2),
+ 0x808144D8:("sCursorFlashTimer","UNK_TYPE2","",0x2),
+ 0x808144DC:("sCursorPrimColors","UNK_TYPE1","",0x1),
+ 0x808144E8:("sCursorEnvColors","UNK_TYPE1","",0x1),
+ 0x80814510:("sScreenFillSetupDL","Gfx","[5]",0x28),
+ 0x80814538:("sFileInfoBoxPartWidths","UNK_TYPE2","",0x2),
+ 0x80814548:("sWindowContentColors","UNK_TYPE2","",0x2),
+ 0x80814550:("sFileSelectSkyboxRotation","s16","",0x2),
+ 0x80814554:("sWalletFirstDigit","UNK_TYPE1","",0x1),
+ 0x8081455C:("sEmptyName","UNK_TYPE1","",0x1),
0x80814564:("D_80814564","UNK_TYPE2","",0x2),
- 0x80814568:("D_80814568","UNK_TYPE","[45]",0xb4),
- 0x8081461C:("D_8081461C","s16","[2]",0x4),
+ 0x80814568:("sConfigModeUpdateFuncs","UNK_TYPE","[45]",0xb4),
+ 0x8081461C:("sCursorAlphaTargets","s16","[2]",0x4),
0x80814620:("D_80814620","UNK_TYPE2","",0x2),
0x80814628:("D_80814628","UNK_TYPE2","",0x2),
0x80814630:("D_80814630","UNK_TYPE2","",0x2),
@@ -4616,24 +4587,24 @@
0x8081464C:("D_8081464C","UNK_TYPE1","",0x1),
0x80814650:("D_80814650","UNK_TYPE1","",0x1),
0x80814654:("D_80814654","UNK_TYPE1","",0x1),
- 0x8081465C:("D_8081465C","UNK_TYPE4","",0x4),
- 0x8081466C:("D_8081466C","UNK_TYPE1","",0x1),
- 0x8081467C:("D_8081467C","UNK_TYPE1","",0x1),
- 0x8081468C:("D_8081468C","UNK_TYPE4","",0x4),
- 0x808146B4:("D_808146B4","UNK_TYPE1","",0x1),
- 0x808146C4:("D_808146C4","UNK_TYPE1","",0x1),
- 0x808146D8:("D_808146D8","UNK_TYPE1","",0x1),
- 0x808146EC:("D_808146EC","UNK_TYPE2","",0x2),
- 0x808146F8:("D_808146F8","UNK_TYPE2","",0x2),
- 0x80814704:("D_80814704","UNK_TYPE4","",0x4),
- 0x80814720:("D_80814720","UNK_TYPE1","",0x1),
- 0x80814744:("D_80814744","UNK_TYPE1","",0x1),
- 0x80814758:("D_80814758","UNK_TYPE4","",0x4),
- 0x80814764:("D_80814764","UNK_TYPE4","",0x4),
- 0x80814774:("D_80814774","UNK_TYPE1","",0x1),
- 0x8081477C:("D_8081477C","UNK_TYPE","[8]",0x20),
- 0x8081479C:("D_8081479C","UNK_TYPE","[3]",0xc),
- 0x808147A8:("D_808147A8","UNK_TYPE","[3]",0xc),
+ 0x8081465C:("sFileSelRemainsTextures","UNK_TYPE4","",0x4),
+ 0x8081466C:("sFileSelDayENGTextures","UNK_TYPE1","",0x1),
+ 0x8081467C:("sFileSelHeartPieceTextures","UNK_TYPE1","",0x1),
+ 0x8081468C:("sHeartTextures","UNK_TYPE4","",0x4),
+ 0x808146B4:("sHealthToQuarterHeartCount","UNK_TYPE1","",0x1),
+ 0x808146C4:("sFileSelRupeePrimColors","UNK_TYPE1","",0x1),
+ 0x808146D8:("sFileSelRupeeEnvColors","UNK_TYPE1","",0x1),
+ 0x808146EC:("sHeartPrimColors","UNK_TYPE2","",0x2),
+ 0x808146F8:("sHeartEnvColors","UNK_TYPE2","",0x2),
+ 0x80814704:("sFileInfoBoxTextures","UNK_TYPE4","",0x4),
+ 0x80814720:("sTitleLabels","UNK_TYPE1","",0x1),
+ 0x80814744:("sWarningLabels","UNK_TYPE1","",0x1),
+ 0x80814758:("sFileButtonTextures","UNK_TYPE4","",0x4),
+ 0x80814764:("sActionButtonTextures","UNK_TYPE4","",0x4),
+ 0x80814774:("sFileYOffsets","UNK_TYPE1","",0x1),
+ 0x8081477C:("sSelectModeUpdateFuncs","UNK_TYPE","[8]",0x20),
+ 0x8081479C:("gFileSelectDrawFuncs","UNK_TYPE","[3]",0xc),
+ 0x808147A8:("gFileSelectUpdateFuncs","UNK_TYPE","[3]",0xc),
0x808147B4:("D_808147B4","UNK_TYPE4","",0x4),
0x808147C0:("D_808147C0","UNK_TYPE2","",0x2),
0x808147C8:("D_808147C8","UNK_TYPE2","",0x2),
@@ -4646,13 +4617,13 @@
0x808147EC:("D_808147EC","f32","",0x4),
0x808147F0:("D_808147F0","f32","",0x4),
0x80814E80:("D_80814E80","UNK_TYPE1","",0x1),
- 0x80814E90:("D_80814E90","UNK_TYPE1","",0x1),
+ 0x80814E90:("sSelectedSetting","UNK_TYPE1","",0x1),
0x80815FF0:("D_80815FF0","u8","",0x1),
0x80815FF4:("sDayLeftTextures","TexturePtr","[4]",0x10),
0x80816004:("sDayRightTextures","TexturePtr","[4]",0x10),
0x80816014:("sHoursLeftTextures","TexturePtr","[3]",0xC),
0x8082AED0:("sQuestRemainsColorTimerInit","UNK_TYPE1","",0x1),
- 0x8082AED8:("sQuestHpColorTimerInit","UNK_TYPE1","",0x1),
+ 0x8082AED8:("sQuestHpColorTimerInits","UNK_TYPE1","",0x1),
0x8082AEE0:("sQuestSongPlayedOcarinaButtonsNum","UNK_TYPE2","",0x2),
0x8082AEE4:("sQuestSongPlayedOcarinaButtons","UNK_TYPE1","",0x1),
0x8082AEF0:("sQuestSongPlayedOcarinaButtonsAlpha","UNK_TYPE2","",0x2),
@@ -4728,12 +4699,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),
@@ -4758,62 +4729,62 @@
0x8082B918:("sPauseCursorLeftX","UNK_TYPE2","",0x2),
0x8082B91C:("sPauseCursorRightX","UNK_TYPE2","",0x2),
0x8082B920:("D_8082B920","UNK_TYPE2","",0x2),
- 0x8082B924:("D_8082B924","UNK_TYPE2","",0x2),
+ 0x8082B924:("sPauseZRCursorColorTimerInits","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),
- 0x8082B9C8:("D_8082B9C8","UNK_TYPE2","",0x2),
- 0x8082B9CC:("D_8082B9CC","UNK_TYPE2","",0x2),
- 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),
+ 0x8082B9B8:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9C8:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9CC:("sPauseZRCursorColorIndex","UNK_TYPE2","",0x2),
+ 0x8082B9D0:("sPauseZRCursorColorTargets","UNK_TYPE1","",0x1),
+ 0x8082B9E0:("sPauseZRCursorColorTimer","UNK_TYPE2","",0x2),
+ 0x8082B9E4:("sPauseZRCursorColorIndex","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),
0x8082BC64:("sQuestVtxHeights","UNK_TYPE2","",0x2),
- 0x8082BCB4:("D_8082BCB4","UNK_TYPE1","",0x1),
- 0x8082BCCC:("D_8082BCCC","UNK_TYPE1","",0x1),
- 0x8082BCDC:("D_8082BCDC","UNK_TYPE1","",0x1),
- 0x8082BD08:("D_8082BD08","UNK_TYPE1","",0x1),
- 0x8082BD34:("D_8082BD34","UNK_TYPE1","",0x1),
- 0x8082BD5C:("D_8082BD5C","UNK_TYPE1","",0x1),
- 0x8082BD84:("D_8082BD84","UNK_TYPE1","",0x1),
- 0x8082BDA8:("D_8082BDA8","UNK_TYPE1","",0x1),
- 0x8082BDCC:("D_8082BDCC","UNK_TYPE1","",0x1),
- 0x8082BE28:("D_8082BE28","UNK_TYPE1","",0x1),
- 0x8082BE84:("D_8082BE84","UNK_TYPE2","",0x2),
+ 0x8082BCB4:("sItemMaskCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BCCC:("sItemMaskCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BCDC:("sWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD08:("sWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD34:("sOwlWarpWorldMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BD5C:("sOwlWarpWorldMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BD84:("sDungeonMapCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BDA8:("sDungeonMapCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BDCC:("sQuestStatusCursorsX","UNK_TYPE1","",0x1),
+ 0x8082BE28:("sQuestStatusCursorsY","UNK_TYPE1","",0x1),
+ 0x8082BE84:("sGameOverUlt","UNK_TYPE2","",0x2),
0x8082BE88:("sCursorPointsToOcarinaModes","UNK_TYPE1","",0x1),
0x8082BE9C:("sUnpausedHudVisibility","UNK_TYPE2","",0x2),
0x8082BEA0:("sNextMainState","UNK_TYPE2","",0x2),
@@ -4935,72 +4906,29 @@
0x8082C0E4:("jtbl_8082C0E4","UNK_PTR","",0x4),
0x8082C148:("jtbl_8082C148","UNK_PTR","",0x4),
0x8082C18C:("jtbl_8082C18C","UNK_PTR","",0x4),
- 0x8082DA50:("D_8082DA50","UNK_TYPE1","",0x1),
- 0x8082DA52:("D_8082DA52","UNK_TYPE1","",0x1),
- 0x8082DA54:("D_8082DA54","UNK_TYPE1","",0x1),
- 0x8082DA56:("D_8082DA56","UNK_TYPE1","",0x1),
+ 0x8082DA50:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA52:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA54:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA56:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
0x8082DA58:("sUnpausedButtonStatus","UNK_TYPE1","",0x1),
- 0x8082DA60:("D_8082DA60","f32","",0x4),
+ 0x8082DA60:("sCursorCirclesX","f32","",0x4),
0x8082DA64:("D_8082DA64","f32","",0x4),
0x8082DA68:("D_8082DA68","f32","",0x4),
0x8082DA6C:("D_8082DA6C","f32","",0x4),
- 0x8082DA70:("D_8082DA70","f32","",0x4),
+ 0x8082DA70:("sCursorCirclesY","f32","",0x4),
0x8082DA74:("D_8082DA74","f32","",0x4),
0x8082DA78:("D_8082DA78","f32","",0x4),
0x8082DA7C:("D_8082DA7C","f32","",0x4),
- 0x8082DA80:("D_8082DA80","UNK_TYPE1","",0x1),
- 0x8082DA82:("D_8082DA82","UNK_TYPE1","",0x1),
- 0x8082DA84:("D_8082DA84","UNK_TYPE1","",0x1),
- 0x8082DA86:("D_8082DA86","UNK_TYPE1","",0x1),
+ 0x8082DA80:("sPauseZRCursorRed","UNK_TYPE1","",0x1),
+ 0x8082DA82:("sPauseZRCursorGreen","UNK_TYPE1","",0x1),
+ 0x8082DA84:("sPauseZRCursorBlue","UNK_TYPE1","",0x1),
+ 0x8082DA86:("sPauseZRCursorAlpha","UNK_TYPE1","",0x1),
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),
@@ -5008,9 +4936,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),
@@ -5021,19 +4948,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),
@@ -5042,10 +4967,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),
@@ -5065,47 +4990,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),
@@ -5115,9 +5035,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),
@@ -5127,8 +5045,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),
@@ -5146,32 +5064,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),
@@ -5182,18 +5096,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),
@@ -5203,18 +5115,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),
@@ -5458,20 +5366,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),
@@ -5479,7 +5385,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),
@@ -5680,8 +5586,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),
@@ -6549,7 +6455,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),
@@ -7668,11 +7574,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),
@@ -9861,11 +9767,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),
@@ -12929,15 +12835,14 @@
0x80AC65B0:("D_80AC65B0","UNK_TYPE1","",0x1),
0x80AC66A8:("TransitionWipe1_InitVars","UNK_PTR","",0x4),
0x80AC66D0:("D_80AC66D0","f32","",0x4),
- 0x80AC6C60:("D_80AC6C60","UNK_TYPE1","",0x1),
- 0x80AC7060:("D_80AC7060","UNK_TYPE1","",0x1),
- 0x80AC7460:("D_80AC7460","UNK_TYPE1","",0x1),
- 0x80AC7860:("D_80AC7860","UNK_TYPE1","",0x1),
- 0x80AC7C60:("D_80AC7C60","UNK_TYPE1","",0x1),
- 0x80AC8060:("D_80AC8060","UNK_TYPE1","",0x1),
- 0x80AC8250:("D_80AC8250","UNK_TYPE1","",0x1),
- 0x80AC8280:("D_80AC8280","UNK_TYPE1","",0x1),
- 0x80AC8350:("D_80AC8350","UNK_PTR","",0x4),
+ 0x80AC6C60:("fbdemo_tex_000520","UNK_TYPE1","",0x1),
+ 0x80AC7060:("fbdemo_tex_000920","UNK_TYPE1","",0x1),
+ 0x80AC7460:("fbdemo_tex_000D20","UNK_TYPE1","",0x1),
+ 0x80AC7860:("fbdemo_tex_001120","UNK_TYPE1","",0x1),
+ 0x80AC7C60:("fbdemo_tex_001520","UNK_TYPE1","",0x1),
+ 0x80AC8060:("sTransWipe3Vtx","UNK_TYPE1","",0x1),
+ 0x80AC8280:("sTransWipe3DL","UNK_TYPE1","",0x1),
+ 0x80AC8350:("sTransWipe3Textures","TexturePtr[]","8",0x4),
0x80AC8370:("TransitionWipe3_InitVars","UNK_PTR","",0x4),
0x80AC83A0:("D_80AC83A0","f32","",0x4),
0x80AC8650:("TransitionWipe4_InitVars","UNK_PTR","",0x4),
diff --git a/tools/fixbaserom.py b/tools/fixbaserom.py
index 2c3942160..3966c3533 100755
--- a/tools/fixbaserom.py
+++ b/tools/fixbaserom.py
@@ -122,6 +122,7 @@ def decompress_rom(dmadata_addr, dmadata):
# re-calculate crc
return update_crc(decompressed)
+correct_compressed_str_hash = "2a0a8acb61538235bc1094d297fb6556"
correct_str_hash = "f46493eaa0628827dbd6ad3ecd8d65d6"
def get_str_hash(byte_array):
@@ -179,6 +180,13 @@ elif fileContent[0] == 0x37:
print("Byte swapping done.")
+# Check to see if the ROM is a compressed "vanilla" ROM
+compressed_str_hash = get_str_hash(bytearray(fileContent))
+if compressed_str_hash != correct_compressed_str_hash:
+ print("Error: Expected a hash of " + correct_compressed_str_hash + " but got " + compressed_str_hash + ". " +
+ "The baserom has probably been tampered, find a new one")
+ sys.exit(1)
+
# Decompress
FILE_TABLE_OFFSET = 0x1A500 # 0x1C110 for JP1.0, 0x1C050 for JP1.1, 0x24F60 for debug
if any([b != 0 for b in fileContent[FILE_TABLE_OFFSET + 0x9C:FILE_TABLE_OFFSET + 0x9C + 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 3d77dba9c..417210d8f 100755
--- a/tools/namefixer.py
+++ b/tools/namefixer.py
@@ -18,10 +18,16 @@ simpleReplace = {
wordReplace = {
# Functions
"Actor_GetSwitchFlag": "Flags_GetSwitch",
- "Math_FAtan2F": "Math_Atan2S_XY",
"Math_Acot2F": "Math_Atan2F_XY",
"atan_flip": "Math_Atan2F_XY",
"atans": "Math_Atan2S",
+ "sin_rad": "Math_SinF",
+ "cos_rad": "Math_CosF",
+ "randPlusMinusPoint5Scaled": "Rand_CenteredFloat",
+ # "Math_FAtan2F": "Math_Atan2S_XY", // Old Math_FAtan2F was renamed
+ "func_80086B30": "Math_FAtan2F",
+ "func_80086760": "Math_FTanF",
+ "func_80086C48": "Math_FAcosF",
# "SysMatrix_StateAlloc": "Matrix_StateAlloc",
# "SysMatrix_StatePush": "Matrix_StatePush",
@@ -164,6 +170,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 +228,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 +328,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 +525,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",
@@ -631,12 +646,22 @@ wordReplace = {
"func_80114E90": "Inventory_HasEmptyBottle",
"func_80114F2C": "Inventory_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",
@@ -688,6 +713,7 @@ wordReplace = {
"func_80158FB0": "Message_LoadTimeNES",
"func_8015926C": "Message_LoadOwlWarpTextNES",
"func_8015E750": "Message_FindCreditsMessage",
+ "func_80151BB4": "Message_BombersNotebookQueueEvent",
"func_80133038": "Schedule_RunScript",
"EffectSsKiraKira_SpawnSmallYellow": "EffectSsKirakira_SpawnSmallYellow",
@@ -724,6 +750,98 @@ wordReplace = {
"func_80102544": "LightContext_SetFog",
+ "func_800F3A64": "Horse_IsValidSpawn",
+ "func_800F3B2C": "Horse_ResetHorseData",
+ "func_800F40A0": "Horse_Spawn",
+ "func_800F415C": "Horse_RotateToPoint",
+ "func_800F41E4": "Horse_IsActive",
+
+ "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",
@@ -790,9 +908,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",
@@ -800,7 +917,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",
@@ -864,6 +981,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",
@@ -872,6 +990,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",
@@ -924,6 +1044,9 @@ wordReplace = {
"play->nextEntranceIndex": "play->nextEntrance",
"play->sceneNum": "play->sceneId",
"play->pauseCtx.unk_1F0": "play->pauseCtx.bombersNotebookOpen",
+ "play->sceneLoadFlag": "play->transitionTrigger",
+ "play->unk_18B4A": "play->transitionMode",
+ "play->unk_1887F": "play->transitionType",
"play->playerActorCsIds": "play->playerCsIds",
"play->envFlags": "play->cutsceneFlags",
"play->roomCtx.curRoom.unk3": "play->roomCtx.curRoom.behaviorType1",
@@ -931,10 +1054,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",
@@ -944,19 +1071,22 @@ wordReplace = {
"gSaveContext.unk_3E50": "gSaveContext.timerStartOsTimes",
"gSaveContext.unk_3E88": "gSaveContext.timerStopTimes",
"gSaveContext.unk_3EC0": "gSaveContext.timerPausedOsTimes",
-
- "play->sceneLoadFlag": "play->transitionTrigger",
- "play->unk_18B4A": "play->transitionMode",
- "play->unk_1887F": "play->transitionType",
"gSaveContext.nextTransition": "gSaveContext.nextTransitionType",
"gSaveContext.unk_3F48": "gSaveContext.cutsceneTransitionControl",
"gSaveContext.fadeDuration": "gSaveContext.transFadeDuration",
"gSaveContext.fadeSpeed": "gSaveContext.transWipeSpeed",
+ "path->unk1": "path->additionalPathIndex",
+ "path->unk2": "path->customValue",
+
"D_801D15B0": "gZeroVec3f",
"D_801D15BC": "gZeroVec3s",
"D_801D1DE0": "gIdentityMtx",
"D_801D1E20": "gIdentityMtxF",
+ "sSetupDL": "gSetupDLs",
+
+ "D_801BDA9C": "gHorseIsMounted",
+ "D_801BDAA4": "gHorsePlayedEponasSong",
# Macros
"CUR_EQUIP_VALUE_VOID": "GET_CUR_EQUIP_VALUE",
diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml
index 5f42d30d6..efa3bc2fe 100644
--- a/tools/permuter_settings.toml
+++ b/tools/permuter_settings.toml
@@ -5,6 +5,8 @@ compiler_type = "ido"
"gs[DS]P.*" = "void"
"gDma.*" = "void"
"G_IM_SIZ_.*" = "int"
+"G_IM_FMT_.*" = "int"
+"G_TX_.*" = "int"
"G_[AC]C.*" = "int"
LOG = "void"
SET_FULLSCREEN_VIEWPORT = "void"
diff --git a/tools/sizes/boot_functions.csv b/tools/sizes/boot_functions.csv
index bbcf6d5de..ecc9eed27 100644
--- a/tools/sizes/boot_functions.csv
+++ b/tools/sizes/boot_functions.csv
@@ -154,48 +154,48 @@ 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
-asm/non_matchings/boot/boot_80086760/func_800867B4.s,func_800867B4,0x800867B4,0x8
-asm/non_matchings/boot/boot_80086760/func_800867D4.s,func_800867D4,0x800867D4,0x8
-asm/non_matchings/boot/boot_80086760/func_800867F4.s,func_800867F4,0x800867F4,0x8
-asm/non_matchings/boot/boot_80086760/func_80086814.s,func_80086814,0x80086814,0x8
-asm/non_matchings/boot/boot_80086760/func_80086834.s,func_80086834,0x80086834,0x13
-asm/non_matchings/boot/boot_80086760/func_80086880.s,func_80086880,0x80086880,0x49
-asm/non_matchings/boot/boot_80086760/func_800869A4.s,func_800869A4,0x800869A4,0x53
-asm/non_matchings/boot/boot_80086760/func_80086AF0.s,func_80086AF0,0x80086AF0,0x10
-asm/non_matchings/boot/boot_80086760/func_80086B30.s,func_80086B30,0x80086B30,0x3A
-asm/non_matchings/boot/boot_80086760/func_80086C18.s,func_80086C18,0x80086C18,0xC
-asm/non_matchings/boot/boot_80086760/func_80086C48.s,func_80086C48,0x80086C48,0xA
-asm/non_matchings/boot/fp/func_80086C70.s,func_80086C70,0x80086C70,0x3
-asm/non_matchings/boot/fp/func_80086C7C.s,func_80086C7C,0x80086C7C,0x3
-asm/non_matchings/boot/fp/func_80086C88.s,func_80086C88,0x80086C88,0x4
-asm/non_matchings/boot/fp/func_80086C98.s,func_80086C98,0x80086C98,0x4
-asm/non_matchings/boot/fp/func_80086CA8.s,func_80086CA8,0x80086CA8,0x3
-asm/non_matchings/boot/fp/func_80086CB4.s,func_80086CB4,0x80086CB4,0x3
-asm/non_matchings/boot/fp/func_80086CC0.s,func_80086CC0,0x80086CC0,0x4
-asm/non_matchings/boot/fp/func_80086CD0.s,func_80086CD0,0x80086CD0,0x4
-asm/non_matchings/boot/fp/func_80086CE0.s,func_80086CE0,0x80086CE0,0x3
-asm/non_matchings/boot/fp/func_80086CEC.s,func_80086CEC,0x80086CEC,0x3
-asm/non_matchings/boot/fp/func_80086CF8.s,func_80086CF8,0x80086CF8,0x4
-asm/non_matchings/boot/fp/func_80086D08.s,func_80086D08,0x80086D08,0x4
-asm/non_matchings/boot/fp/func_80086D18.s,func_80086D18,0x80086D18,0x3
-asm/non_matchings/boot/fp/func_80086D24.s,func_80086D24,0x80086D24,0x3
-asm/non_matchings/boot/fp/func_80086D30.s,func_80086D30,0x80086D30,0x4
-asm/non_matchings/boot/fp/func_80086D40.s,func_80086D40,0x80086D40,0x4
-asm/non_matchings/boot/fp/func_80086D50.s,func_80086D50,0x80086D50,0x7
-asm/non_matchings/boot/fp/func_80086D6C.s,func_80086D6C,0x80086D6C,0x8
-asm/non_matchings/boot/fp/func_80086D8C.s,func_80086D8C,0x80086D8C,0x8
-asm/non_matchings/boot/fp/func_80086DAC.s,func_80086DAC,0x80086DAC,0x9
+asm/non_matchings/boot/boot_80086760/Math_FTanF.s,Math_FTanF,0x80086760,0xD
+asm/non_matchings/boot/boot_80086760/Math_FFloorF.s,Math_FFloorF,0x80086794,0x8
+asm/non_matchings/boot/boot_80086760/Math_FCeilF.s,Math_FCeilF,0x800867B4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FRoundF.s,Math_FRoundF,0x800867D4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FTruncF.s,Math_FTruncF,0x800867F4,0x8
+asm/non_matchings/boot/boot_80086760/Math_FNearbyIntF.s,Math_FNearbyIntF,0x80086814,0x8
+asm/non_matchings/boot/boot_80086760/Math_FAtanTaylorQF.s,Math_FAtanTaylorQF,0x80086834,0x13
+asm/non_matchings/boot/boot_80086760/Math_FAtanTaylorF.s,Math_FAtanTaylorF,0x80086880,0x49
+asm/non_matchings/boot/boot_80086760/Math_FAtanContFracF.s,Math_FAtanContFracF,0x800869A4,0x53
+asm/non_matchings/boot/boot_80086760/Math_FAtanF.s,Math_FAtanF,0x80086AF0,0x10
+asm/non_matchings/boot/boot_80086760/Math_FAtan2F.s,Math_FAtan2F,0x80086B30,0x3A
+asm/non_matchings/boot/boot_80086760/Math_FAsinF.s,Math_FAsinF,0x80086C18,0xC
+asm/non_matchings/boot/boot_80086760/Math_FAcosF.s,Math_FAcosF,0x80086C48,0xA
+asm/non_matchings/boot/fp/floorf.s,floorf,0x80086C70,0x3
+asm/non_matchings/boot/fp/floor.s,floor,0x80086C7C,0x3
+asm/non_matchings/boot/fp/lfloorf.s,lfloorf,0x80086C88,0x4
+asm/non_matchings/boot/fp/lfloor.s,lfloor,0x80086C98,0x4
+asm/non_matchings/boot/fp/ceilf.s,ceilf,0x80086CA8,0x3
+asm/non_matchings/boot/fp/ceil.s,ceil,0x80086CB4,0x3
+asm/non_matchings/boot/fp/lceilf.s,lceilf,0x80086CC0,0x4
+asm/non_matchings/boot/fp/lceil.s,lceil,0x80086CD0,0x4
+asm/non_matchings/boot/fp/truncf.s,truncf,0x80086CE0,0x3
+asm/non_matchings/boot/fp/trunc.s,trunc,0x80086CEC,0x3
+asm/non_matchings/boot/fp/ltruncf.s,ltruncf,0x80086CF8,0x4
+asm/non_matchings/boot/fp/ltrunc.s,ltrunc,0x80086D08,0x4
+asm/non_matchings/boot/fp/nearbyintf.s,nearbyintf,0x80086D18,0x3
+asm/non_matchings/boot/fp/nearbyint.s,nearbyint,0x80086D24,0x3
+asm/non_matchings/boot/fp/lnearbyintf.s,lnearbyintf,0x80086D30,0x4
+asm/non_matchings/boot/fp/lnearbyint.s,lnearbyint,0x80086D40,0x4
+asm/non_matchings/boot/fp/roundf.s,roundf,0x80086D50,0x7
+asm/non_matchings/boot/fp/round.s,round,0x80086D6C,0x8
+asm/non_matchings/boot/fp/lroundf.s,lroundf,0x80086D8C,0x8
+asm/non_matchings/boot/fp/lround.s,lround,0x80086DAC,0x9
asm/non_matchings/boot/system_malloc/SystemArena_Malloc.s,SystemArena_Malloc,0x80086DD0,0xA
asm/non_matchings/boot/system_malloc/SystemArena_MallocR.s,SystemArena_MallocR,0x80086DF8,0xA
asm/non_matchings/boot/system_malloc/SystemArena_Realloc.s,SystemArena_Realloc,0x80086E20,0xC
@@ -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 a643f147f..80d36de95 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
@@ -257,7 +257,7 @@ asm/non_matchings/code/z_actor/func_800B715C.s,func_800B715C,0x800B715C,0x5
asm/non_matchings/code/z_actor/Actor_SetCameraHorseSetting.s,Actor_SetCameraHorseSetting,0x800B7170,0x1B
asm/non_matchings/code/z_actor/Actor_MountHorse.s,Actor_MountHorse,0x800B71DC,0x9
asm/non_matchings/code/z_actor/func_800B7200.s,func_800B7200,0x800B7200,0xB
-asm/non_matchings/code/z_actor/func_800B722C.s,func_800B722C,0x800B722C,0x8
+asm/non_matchings/code/z_actor/Actor_SpawnHorse.s,Actor_SpawnHorse,0x800B722C,0x8
asm/non_matchings/code/z_actor/func_800B724C.s,func_800B724C,0x800B724C,0x13
asm/non_matchings/code/z_actor/func_800B7298.s,func_800B7298,0x800B7298,0x12
asm/non_matchings/code/z_actor/func_800B72E0.s,func_800B72E0,0x800B72E0,0x6
@@ -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
@@ -1197,16 +1197,16 @@ asm/non_matchings/code/z_fireobj/FireObj_Init.s,FireObj_Init,0x800F36CC,0x39
asm/non_matchings/code/z_fireobj/FireObj_Fini.s,FireObj_Fini,0x800F37B0,0x10
asm/non_matchings/code/z_fireobj/FireObj_SetState2.s,FireObj_SetState2,0x800F37F0,0xC
asm/non_matchings/code/z_fireobj/FireObj_Update.s,FireObj_Update,0x800F3820,0x48
-asm/non_matchings/code/z_horse/func_800F3940.s,func_800F3940,0x800F3940,0x1D
-asm/non_matchings/code/z_horse/func_800F39B4.s,func_800F39B4,0x800F39B4,0x2C
-asm/non_matchings/code/z_horse/func_800F3A64.s,func_800F3A64,0x800F3A64,0x32
-asm/non_matchings/code/z_horse/func_800F3B2C.s,func_800F3B2C,0x800F3B2C,0xF
-asm/non_matchings/code/z_horse/func_800F3B68.s,func_800F3B68,0x800F3B68,0x37
-asm/non_matchings/code/z_horse/func_800F3C44.s,func_800F3C44,0x800F3C44,0xA4
-asm/non_matchings/code/z_horse/func_800F3ED4.s,func_800F3ED4,0x800F3ED4,0x73
-asm/non_matchings/code/z_horse/func_800F40A0.s,func_800F40A0,0x800F40A0,0x2F
-asm/non_matchings/code/z_horse/func_800F415C.s,func_800F415C,0x800F415C,0x22
-asm/non_matchings/code/z_horse/func_800F41E4.s,func_800F41E4,0x800F41E4,0x2F
+asm/non_matchings/code/z_horse/Horse_GetJumpingFencePathIndex.s,Horse_GetJumpingFencePathIndex,0x800F3940,0x1D
+asm/non_matchings/code/z_horse/Horse_CopyPointFromPathList.s,Horse_CopyPointFromPathList,0x800F39B4,0x2C
+asm/non_matchings/code/z_horse/Horse_IsValidSpawn.s,Horse_IsValidSpawn,0x800F3A64,0x32
+asm/non_matchings/code/z_horse/Horse_ResetHorseData.s,Horse_ResetHorseData,0x800F3B2C,0xF
+asm/non_matchings/code/z_horse/Horse_IsValidSceneLayer.s,Horse_IsValidSceneLayer,0x800F3B68,0x37
+asm/non_matchings/code/z_horse/Horse_SpawnOverworld.s,Horse_SpawnOverworld,0x800F3C44,0xA4
+asm/non_matchings/code/z_horse/Horse_SpawnMinigame.s,Horse_SpawnMinigame,0x800F3ED4,0x73
+asm/non_matchings/code/z_horse/Horse_Spawn.s,Horse_Spawn,0x800F40A0,0x2F
+asm/non_matchings/code/z_horse/Horse_RotateToPoint.s,Horse_RotateToPoint,0x800F415C,0x22
+asm/non_matchings/code/z_horse/Horse_IsActive.s,Horse_IsActive,0x800F41E4,0x2F
asm/non_matchings/code/z_jpeg/Jpeg_ScheduleDecoderTask.s,Jpeg_ScheduleDecoderTask,0x800F42A0,0x47
asm/non_matchings/code/z_jpeg/Jpeg_CopyToZbuffer.s,Jpeg_CopyToZbuffer,0x800F43BC,0x4E
asm/non_matchings/code/z_jpeg/Jpeg_GetUnalignedU16.s,Jpeg_GetUnalignedU16,0x800F44F4,0x13
@@ -1221,7 +1221,7 @@ asm/non_matchings/code/z_kanfont/Font_LoadCharNES.s,Font_LoadCharNES,0x800F4F54,
asm/non_matchings/code/z_kanfont/Font_LoadMessageBoxEndIcon.s,Font_LoadMessageBoxEndIcon,0x800F4FC0,0x11
asm/non_matchings/code/z_kanfont/Font_LoadOrderedFont.s,Font_LoadOrderedFont,0x800F5004,0x23
asm/non_matchings/code/z_kankyo/func_800F5090.s,func_800F5090,0x800F5090,0x11
-asm/non_matchings/code/z_kankyo/func_800F50D4.s,func_800F50D4,0x800F50D4,0xE
+asm/non_matchings/code/z_kankyo/Environment_ZBufValToFixedPoint.s,Environment_ZBufValToFixedPoint,0x800F50D4,0xE
asm/non_matchings/code/z_kankyo/Environment_Init.s,Environment_Init,0x800F510C,0x212
asm/non_matchings/code/z_kankyo/func_800F5954.s,func_800F5954,0x800F5954,0x4E
asm/non_matchings/code/z_kankyo/Environment_LerpWeight.s,Environment_LerpWeight,0x800F5A8C,0x21
@@ -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
@@ -2270,9 +2270,9 @@ asm/non_matchings/code/z_vimode/func_80140898.s,func_80140898,0x80140898,0x1A
asm/non_matchings/code/z_vimode/func_80140900.s,func_80140900,0x80140900,0x3
asm/non_matchings/code/z_vimode/func_8014090C.s,func_8014090C,0x8014090C,0x19
asm/non_matchings/code/z_vimode/func_80140970.s,func_80140970,0x80140970,0xDC
-asm/non_matchings/code/z_vimode/func_80140CE0.s,func_80140CE0,0x80140CE0,0x9
-asm/non_matchings/code/z_vimode/func_80140D04.s,func_80140D04,0x80140D04,0x3
-asm/non_matchings/code/z_vimode/func_80140D10.s,func_80140D10,0x80140D10,0x5C
+asm/non_matchings/code/z_vimode/VisCvg_Init.s,VisCvg_Init,0x80140CE0,0x9
+asm/non_matchings/code/z_vimode/VisCvg_Destroy.s,VisCvg_Destroy,0x80140D04,0x3
+asm/non_matchings/code/z_vimode/VisCvg_Draw.s,VisCvg_Draw,0x80140D10,0x5C
asm/non_matchings/code/code_80140E80/func_80140E80.s,func_80140E80,0x80140E80,0x8
asm/non_matchings/code/code_80140E80/func_80140EA0.s,func_80140EA0,0x80140EA0,0x3
asm/non_matchings/code/code_80140E80/func_80140EAC.s,func_80140EAC,0x80140EAC,0x57
@@ -2316,21 +2316,21 @@ asm/non_matchings/code/z_sram_NES/Sram_OpenSave.s,Sram_OpenSave,0x80144E78,0x17D
asm/non_matchings/code/z_sram_NES/func_8014546C.s,func_8014546C,0x8014546C,0x8B
asm/non_matchings/code/z_sram_NES/func_80145698.s,func_80145698,0x80145698,0x4D
asm/non_matchings/code/z_sram_NES/func_801457CC.s,func_801457CC,0x801457CC,0x36D
-asm/non_matchings/code/z_sram_NES/func_80146580.s,func_80146580,0x80146580,0x2A
-asm/non_matchings/code/z_sram_NES/func_80146628.s,func_80146628,0x80146628,0x11E
+asm/non_matchings/code/z_sram_NES/Sram_EraseSave.s,Sram_EraseSave,0x80146580,0x2A
+asm/non_matchings/code/z_sram_NES/Sram_CopySave.s,Sram_CopySave,0x80146628,0x11E
asm/non_matchings/code/z_sram_NES/Sram_InitSave.s,Sram_InitSave,0x80146AA0,0xD6
-asm/non_matchings/code/z_sram_NES/func_80146DF8.s,func_80146DF8,0x80146DF8,0x12
+asm/non_matchings/code/z_sram_NES/Sram_WriteSaveOptionsToBuffer.s,Sram_WriteSaveOptionsToBuffer,0x80146DF8,0x12
asm/non_matchings/code/z_sram_NES/Sram_InitSram.s,Sram_InitSram,0x80146E40,0xC
asm/non_matchings/code/z_sram_NES/Sram_Alloc.s,Sram_Alloc,0x80146E70,0x13
-asm/non_matchings/code/z_sram_NES/func_80146EBC.s,func_80146EBC,0x80146EBC,0xB
+asm/non_matchings/code/z_sram_NES/Sram_SyncWriteToFlash.s,Sram_SyncWriteToFlash,0x80146EBC,0xB
asm/non_matchings/code/z_sram_NES/Sram_SaveSpecialEnterClockTown.s,Sram_SaveSpecialEnterClockTown,0x80146EE8,0x1D
asm/non_matchings/code/z_sram_NES/Sram_SaveSpecialNewDay.s,Sram_SaveSpecialNewDay,0x80146F5C,0x2B
-asm/non_matchings/code/z_sram_NES/func_80147008.s,func_80147008,0x80147008,0x6
-asm/non_matchings/code/z_sram_NES/func_80147020.s,func_80147020,0x80147020,0x12
-asm/non_matchings/code/z_sram_NES/func_80147068.s,func_80147068,0x80147068,0x34
-asm/non_matchings/code/z_sram_NES/func_80147138.s,func_80147138,0x80147138,0x6
-asm/non_matchings/code/z_sram_NES/func_80147150.s,func_80147150,0x80147150,0x12
-asm/non_matchings/code/z_sram_NES/func_80147198.s,func_80147198,0x80147198,0x5F
+asm/non_matchings/code/z_sram_NES/Sram_SetFlashPagesDefault.s,Sram_SetFlashPagesDefault,0x80147008,0x6
+asm/non_matchings/code/z_sram_NES/Sram_StartWriteToFlashDefault.s,Sram_StartWriteToFlashDefault,0x80147020,0x12
+asm/non_matchings/code/z_sram_NES/Sram_UpdateWriteToFlashDefault.s,Sram_UpdateWriteToFlashDefault,0x80147068,0x34
+asm/non_matchings/code/z_sram_NES/Sram_SetFlashPagesOwlSave.s,Sram_SetFlashPagesOwlSave,0x80147138,0x6
+asm/non_matchings/code/z_sram_NES/Sram_StartWriteToFlashOwlSave.s,Sram_StartWriteToFlashOwlSave,0x80147150,0x12
+asm/non_matchings/code/z_sram_NES/Sram_UpdateWriteToFlashOwlSave.s,Sram_UpdateWriteToFlashOwlSave,0x80147198,0x5F
asm/non_matchings/code/z_sram_NES/func_80147314.s,func_80147314,0x80147314,0x40
asm/non_matchings/code/z_sram_NES/func_80147414.s,func_80147414,0x80147414,0x3E
asm/non_matchings/code/z_sram_NES/Sram_nop8014750C.s,Sram_nop8014750C,0x8014750C,0x5
@@ -2369,7 +2369,7 @@ asm/non_matchings/code/z_message/func_801514B0.s,func_801514B0,0x801514B0,0x100
asm/non_matchings/code/z_message/Message_StartTextbox.s,Message_StartTextbox,0x801518B0,0x22
asm/non_matchings/code/z_message/Message_ContinueTextbox.s,Message_ContinueTextbox,0x80151938,0x4C
asm/non_matchings/code/z_message/func_80151A68.s,func_80151A68,0x80151A68,0x53
-asm/non_matchings/code/z_message/func_80151BB4.s,func_80151BB4,0x80151BB4,0x3A
+asm/non_matchings/code/z_message/Message_BombersNotebookQueueEvent.s,Message_BombersNotebookQueueEvent,0x80151BB4,0x3A
asm/non_matchings/code/z_message/func_80151C9C.s,func_80151C9C,0x80151C9C,0x42
asm/non_matchings/code/z_message/func_80151DA4.s,func_80151DA4,0x80151DA4,0x1A4
asm/non_matchings/code/z_message/func_80152434.s,func_80152434,0x80152434,0xC
@@ -2554,16 +2554,16 @@ asm/non_matchings/code/z_play/Play_IsDebugCamEnabled.s,Play_IsDebugCamEnabled,0x
asm/non_matchings/code/z_play/func_8016A178.s,func_8016A178,0x8016A178,0x3C
asm/non_matchings/code/z_play/Play_FillScreen.s,Play_FillScreen,0x8016A268,0x18
asm/non_matchings/code/z_play/Play_Init.s,Play_Init,0x8016A2C8,0x252
-asm/non_matchings/code/z_play_hireso/func_8016AC10.s,func_8016AC10,0x8016AC10,0x83
-asm/non_matchings/code/z_play_hireso/func_8016AE1C.s,func_8016AE1C,0x8016AE1C,0x117
-asm/non_matchings/code/z_play_hireso/func_8016B278.s,func_8016B278,0x8016B278,0x8E
-asm/non_matchings/code/z_play_hireso/func_8016B4B0.s,func_8016B4B0,0x8016B4B0,0x3A5
-asm/non_matchings/code/z_play_hireso/func_8016C344.s,func_8016C344,0x8016C344,0x282
-asm/non_matchings/code/z_play_hireso/func_8016CD4C.s,func_8016CD4C,0x8016CD4C,0x5B0
-asm/non_matchings/code/z_play_hireso/func_8016E40C.s,func_8016E40C,0x8016E40C,0x1A1
-asm/non_matchings/code/z_play_hireso/func_8016EA90.s,func_8016EA90,0x8016EA90,0x1C6
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawScisTexRect.s,BombersNotebook_DrawScisTexRect,0x8016AC10,0x83
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawHeaders.s,BombersNotebook_DrawHeaders,0x8016AE1C,0x117
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawColumns.s,BombersNotebook_DrawColumns,0x8016B278,0x8E
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawEntries.s,BombersNotebook_DrawEntries,0x8016B4B0,0x3A5
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawRows.s,BombersNotebook_DrawRows,0x8016C344,0x282
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawTimeOfDay.s,BombersNotebook_DrawTimeOfDay,0x8016CD4C,0x5B0
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawCursor.s,BombersNotebook_DrawCursor,0x8016E40C,0x1A1
+asm/non_matchings/code/z_play_hireso/BombersNotebook_DrawArrows.s,BombersNotebook_DrawArrows,0x8016EA90,0x1C6
asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s,BombersNotebook_Draw,0x8016F1A8,0xD1
-asm/non_matchings/code/z_play_hireso/func_8016F4EC.s,func_8016F4EC,0x8016F4EC,0x2F
+asm/non_matchings/code/z_play_hireso/BombersNotebook_LoadFiles.s,BombersNotebook_LoadFiles,0x8016F4EC,0x2F
asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s,BombersNotebook_Update,0x8016F5A8,0x1B4
asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s,BombersNotebook_Init,0x8016FC78,0x8
asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s,BombersNotebook_Destroy,0x8016FC98,0x16
@@ -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
@@ -2739,15 +2739,15 @@ asm/non_matchings/code/speed_meter/SpeedMeter_DrawAllocEntries.s,SpeedMeter_Draw
asm/non_matchings/code/speed_meter/func_801780F0.s,func_801780F0,0x801780F0,0x3F
asm/non_matchings/code/speed_meter/func_801781EC.s,func_801781EC,0x801781EC,0x90
asm/non_matchings/code/speed_meter/func_8017842C.s,func_8017842C,0x8017842C,0xC9
-asm/non_matchings/code/sys_cmpdma/func_80178750.s,func_80178750,0x80178750,0x32
-asm/non_matchings/code/sys_cmpdma/func_80178818.s,func_80178818,0x80178818,0x58
-asm/non_matchings/code/sys_cmpdma/func_80178978.s,func_80178978,0x80178978,0x17
-asm/non_matchings/code/sys_cmpdma/func_801789D4.s,func_801789D4,0x801789D4,0x6
-asm/non_matchings/code/sys_cmpdma/SysCfb_GetFbPtr.s,SysCfb_GetFbPtr,0x801789EC,0xA
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetLoResMode.s,SysCfb_SetLoResMode,0x80178750,0x32
+asm/non_matchings/code/sys_cmpdma/SysCfb_SetHiResMode.s,SysCfb_SetHiResMode,0x80178818,0x58
+asm/non_matchings/code/sys_cmpdma/SysCfb_Init.s,SysCfb_Init,0x80178978,0x17
+asm/non_matchings/code/sys_cmpdma/SysCfb_Reset.s,SysCfb_Reset,0x801789D4,0x6
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetFramebuffer.s,SysCfb_GetFramebuffer,0x801789EC,0xA
asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBuffer.s,SysCfb_GetZBuffer,0x80178A14,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A24.s,func_80178A24,0x80178A24,0x4
-asm/non_matchings/code/sys_cmpdma/func_80178A34.s,func_80178A34,0x80178A34,0x18
-asm/non_matchings/code/sys_cmpdma/func_80178A94.s,func_80178A94,0x80178A94,0xB
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetWorkBuffer.s,SysCfb_GetWorkBuffer,0x80178A24,0x4
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferPixel.s,SysCfb_GetZBufferPixel,0x80178A34,0x18
+asm/non_matchings/code/sys_cmpdma/SysCfb_GetZBufferInt.s,SysCfb_GetZBufferInt,0x80178A94,0xB
asm/non_matchings/code/sys_cmpdma/func_80178AC0.s,func_80178AC0,0x80178AC0,0x70
asm/non_matchings/code/sys_cmpdma/CmpDma_GetFileInfo.s,CmpDma_GetFileInfo,0x80178C80,0x3F
asm/non_matchings/code/sys_cmpdma/CmpDma_Decompress.s,CmpDma_Decompress,0x80178D7C,0xC
@@ -2762,13 +2762,13 @@ asm/non_matchings/code/sys_initial_check/Check_DrawExpansionPakErrorMessage.s,Ch
asm/non_matchings/code/sys_initial_check/Check_DrawRegionLockErrorMessage.s,Check_DrawRegionLockErrorMessage,0x801791CC,0x25
asm/non_matchings/code/sys_initial_check/Check_ExpansionPak.s,Check_ExpansionPak,0x80179260,0x11
asm/non_matchings/code/sys_initial_check/Check_RegionIsSupported.s,Check_RegionIsSupported,0x801792A4,0x17
-asm/non_matchings/code/sys_math/func_80179300.s,func_80179300,0x80179300,0x40
-asm/non_matchings/code/sys_math/func_80179400.s,func_80179400,0x80179400,0x31
-asm/non_matchings/code/sys_math/pow_int.s,pow_int,0x801794C4,0xA
-asm/non_matchings/code/sys_math/sin_rad.s,sin_rad,0x801794EC,0x15
-asm/non_matchings/code/sys_math/cos_rad.s,cos_rad,0x80179540,0x15
+asm/non_matchings/code/sys_math/Math_FactorialF.s,Math_FactorialF,0x80179300,0x40
+asm/non_matchings/code/sys_math/Math_Factorial.s,Math_Factorial,0x80179400,0x31
+asm/non_matchings/code/sys_math/Math_PowF.s,Math_PowF,0x801794C4,0xA
+asm/non_matchings/code/sys_math/Math_SinF.s,Math_SinF,0x801794EC,0x15
+asm/non_matchings/code/sys_math/Math_CosF.s,Math_CosF,0x80179540,0x15
asm/non_matchings/code/sys_math/Rand_ZeroFloat.s,Rand_ZeroFloat,0x80179594,0xB
-asm/non_matchings/code/sys_math/randPlusMinusPoint5Scaled.s,randPlusMinusPoint5Scaled,0x801795C0,0xC
+asm/non_matchings/code/sys_math/Rand_CenteredFloat.s,Rand_CenteredFloat,0x801795C0,0xC
asm/non_matchings/code/sys_math3d/Math3D_Normalize.s,Math3D_Normalize,0x801795F0,0x22
asm/non_matchings/code/sys_math3d/Math3D_PlaneVsLineSegClosestPoint.s,Math3D_PlaneVsLineSegClosestPoint,0x80179678,0x48
asm/non_matchings/code/sys_math3d/func_80179798.s,func_80179798,0x80179798,0xAB
@@ -2962,20 +2962,21 @@ asm/non_matchings/code/sys_slowly/Slowly_ThreadEntry.s,Slowly_ThreadEntry,0x8018
asm/non_matchings/code/sys_slowly/Slowly_Init.s,Slowly_Init,0x8018571C,0x21
asm/non_matchings/code/sys_slowly/Slowly_Destroy.s,Slowly_Destroy,0x801857A0,0x8
asm/non_matchings/code/sys_flashrom/func_801857C0.s,func_801857C0,0x801857C0,0x4
-asm/non_matchings/code/sys_flashrom/func_801857D0.s,func_801857D0,0x801857D0,0x25
-asm/non_matchings/code/sys_flashrom/func_80185864.s,func_80185864,0x80185864,0x29
-asm/non_matchings/code/sys_flashrom/func_80185908.s,func_80185908,0x80185908,0x18
-asm/non_matchings/code/sys_flashrom/func_80185968.s,func_80185968,0x80185968,0x22
-asm/non_matchings/code/sys_flashrom/func_801859F0.s,func_801859F0,0x801859F0,0xF
-asm/non_matchings/code/sys_flashrom/func_80185A2C.s,func_80185A2C,0x80185A2C,0x3C
-asm/non_matchings/code/sys_flashrom/func_80185B1C.s,func_80185B1C,0x80185B1C,0x32
-asm/non_matchings/code/sys_flashrom/func_80185BE4.s,func_80185BE4,0x80185BE4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsInit.s,SysFlashrom_IsInit,0x801857C0,0x4
+asm/non_matchings/code/sys_flashrom/SysFlashrom_GetVendorStr.s,SysFlashrom_GetVendorStr,0x801857D0,0x25
+asm/non_matchings/code/sys_flashrom/SysFlashrom_CheckFlashType.s,SysFlashrom_CheckFlashType,0x80185864,0x29
+asm/non_matchings/code/sys_flashrom/SysFlashrom_InitFlash.s,SysFlashrom_InitFlash,0x80185908,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ReadData.s,SysFlashrom_ReadData,0x80185968,0x22
+asm/non_matchings/code/sys_flashrom/SysFlashrom_EraseSector.s,SysFlashrom_EraseSector,0x801859F0,0xF
+asm/non_matchings/code/sys_flashrom/SysFlashrom_ExecWrite.s,SysFlashrom_ExecWrite,0x80185A2C,0x3C
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AttemptWrite.s,SysFlashrom_AttemptWrite,0x80185B1C,0x32
+asm/non_matchings/code/sys_flashrom/SysFlashrom_NeedsToErase.s,SysFlashrom_NeedsToErase,0x80185BE4,0x10
asm/non_matchings/code/sys_flashrom/func_80185C24.s,func_80185C24,0x80185C24,0x47
asm/non_matchings/code/sys_flashrom/SysFlashrom_ThreadEntry.s,SysFlashrom_ThreadEntry,0x80185D40,0x27
-asm/non_matchings/code/sys_flashrom/func_80185DDC.s,func_80185DDC,0x80185DDC,0x3A
-asm/non_matchings/code/sys_flashrom/func_80185EC4.s,func_80185EC4,0x80185EC4,0x10
-asm/non_matchings/code/sys_flashrom/func_80185F04.s,func_80185F04,0x80185F04,0x18
-asm/non_matchings/code/sys_flashrom/func_80185F64.s,func_80185F64,0x80185F64,0xB
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataAsync.s,SysFlashrom_WriteDataAsync,0x80185DDC,0x3A
+asm/non_matchings/code/sys_flashrom/SysFlashrom_IsBusy.s,SysFlashrom_IsBusy,0x80185EC4,0x10
+asm/non_matchings/code/sys_flashrom/SysFlashrom_AwaitResult.s,SysFlashrom_AwaitResult,0x80185F04,0x18
+asm/non_matchings/code/sys_flashrom/SysFlashrom_WriteDataSync.s,SysFlashrom_WriteDataSync,0x80185F64,0xB
asm/non_matchings/code/code_80185F90/func_80185F90.s,func_80185F90,0x80185F90,0x26
asm/non_matchings/code/osFlash/func_80186A70.s,func_80186A70,0x80186A70,0x12
asm/non_matchings/code/osFlash/func_80186AB8.s,func_80186AB8,0x80186AB8,0x1C
diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py
index 34b3ddc46..591671ab8 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",
@@ -155,7 +155,7 @@ weekEventReg = {
(18 << 8) | 0x10: "WEEKEVENTREG_18_10",
(18 << 8) | 0x20: "WEEKEVENTREG_18_20",
(18 << 8) | 0x40: "WEEKEVENTREG_18_40",
- (18 << 8) | 0x80: "WEEKEVENTREG_18_80",
+ (18 << 8) | 0x80: "WEEKEVENTREG_HAS_POWDERKEG_PRIVILEGES",
(19 << 8) | 0x01: "WEEKEVENTREG_19_01",
(19 << 8) | 0x02: "WEEKEVENTREG_19_02",
(19 << 8) | 0x04: "WEEKEVENTREG_19_04",
@@ -174,15 +174,15 @@ weekEventReg = {
(20 << 8) | 0x80: "WEEKEVENTREG_20_80",
(21 << 8) | 0x01: "WEEKEVENTREG_21_01",
(21 << 8) | 0x02: "WEEKEVENTREG_21_02",
- (21 << 8) | 0x04: "WEEKEVENTREG_21_04",
- (21 << 8) | 0x08: "WEEKEVENTREG_21_08",
+ (21 << 8) | 0x04: "WEEKEVENTREG_TALKED_GORON_GRAVEMAKER_AS_GORON",
+ (21 << 8) | 0x08: "WEEKEVENTREG_TALKED_THAWED_GRAVEYARD_GORON",
(21 << 8) | 0x10: "WEEKEVENTREG_21_10",
- (21 << 8) | 0x20: "WEEKEVENTREG_21_20",
+ (21 << 8) | 0x20: "WEEKEVENTREG_PROMISED_TO_HELP_WITH_THEM",
(21 << 8) | 0x40: "WEEKEVENTREG_21_40",
(21 << 8) | 0x80: "WEEKEVENTREG_21_80",
- (22 << 8) | 0x01: "WEEKEVENTREG_22_01",
+ (22 << 8) | 0x01: "WEEKEVENTREG_DEFENDED_AGAINST_THEM",
(22 << 8) | 0x02: "WEEKEVENTREG_22_02",
- (22 << 8) | 0x04: "WEEKEVENTREG_22_04",
+ (22 << 8) | 0x04: "WEEKEVENTREG_CALMED_GORON_ELDERS_SON",
(22 << 8) | 0x08: "WEEKEVENTREG_22_08",
(22 << 8) | 0x10: "WEEKEVENTREG_22_10",
(22 << 8) | 0x20: "WEEKEVENTREG_22_20",
@@ -221,11 +221,11 @@ weekEventReg = {
(26 << 8) | 0x40: "WEEKEVENTREG_26_40",
(26 << 8) | 0x80: "WEEKEVENTREG_26_80",
(27 << 8) | 0x01: "WEEKEVENTREG_27_01",
- (27 << 8) | 0x02: "WEEKEVENTREG_27_02",
- (27 << 8) | 0x04: "WEEKEVENTREG_27_04",
- (27 << 8) | 0x08: "WEEKEVENTREG_27_08",
- (27 << 8) | 0x10: "WEEKEVENTREG_27_10",
- (27 << 8) | 0x20: "WEEKEVENTREG_27_20",
+ (27 << 8) | 0x02: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN",
+ (27 << 8) | 0x04: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN",
+ (27 << 8) | 0x08: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN",
+ (27 << 8) | 0x10: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN",
+ (27 << 8) | 0x20: "WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN",
(27 << 8) | 0x40: "WEEKEVENTREG_27_40",
(27 << 8) | 0x80: "WEEKEVENTREG_27_80",
(28 << 8) | 0x01: "WEEKEVENTREG_28_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",
@@ -407,20 +407,20 @@ weekEventReg = {
(50 << 8) | 0x01: "WEEKEVENTREG_50_01",
(50 << 8) | 0x02: "WEEKEVENTREG_50_02",
(50 << 8) | 0x04: "WEEKEVENTREG_50_04",
- (50 << 8) | 0x08: "WEEKEVENTREG_50_08",
+ (50 << 8) | 0x08: "WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING",
(50 << 8) | 0x10: "WEEKEVENTREG_50_10",
- (50 << 8) | 0x20: "WEEKEVENTREG_50_20",
+ (50 << 8) | 0x20: "WEEKEVENTREG_HAD_MIDNIGHT_MEETING",
(50 << 8) | 0x40: "WEEKEVENTREG_50_40",
- (50 << 8) | 0x80: "WEEKEVENTREG_50_80",
- (51 << 8) | 0x01: "WEEKEVENTREG_51_01",
+ (50 << 8) | 0x80: "WEEKEVENTREG_RECEIVED_PENDANT_OF_MEMORIES",
+ (51 << 8) | 0x01: "WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES",
(51 << 8) | 0x02: "WEEKEVENTREG_51_02",
(51 << 8) | 0x04: "WEEKEVENTREG_51_04",
(51 << 8) | 0x08: "WEEKEVENTREG_51_08",
(51 << 8) | 0x10: "WEEKEVENTREG_51_10",
- (51 << 8) | 0x20: "WEEKEVENTREG_51_20",
+ (51 << 8) | 0x20: "WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT",
(51 << 8) | 0x40: "WEEKEVENTREG_51_40",
(51 << 8) | 0x80: "WEEKEVENTREG_51_80",
- (52 << 8) | 0x01: "WEEKEVENTREG_52_01",
+ (52 << 8) | 0x01: "WEEKEVENTREG_ESCORTED_CREMIA",
(52 << 8) | 0x02: "WEEKEVENTREG_52_02",
(52 << 8) | 0x04: "WEEKEVENTREG_52_04",
(52 << 8) | 0x08: "WEEKEVENTREG_52_08",
@@ -523,70 +523,70 @@ 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",
- (66 << 8) | 0x01: "WEEKEVENTREG_66_01",
- (66 << 8) | 0x02: "WEEKEVENTREG_66_02",
- (66 << 8) | 0x04: "WEEKEVENTREG_66_04",
- (66 << 8) | 0x08: "WEEKEVENTREG_66_08",
- (66 << 8) | 0x10: "WEEKEVENTREG_66_10",
- (66 << 8) | 0x20: "WEEKEVENTREG_66_20",
- (66 << 8) | 0x40: "WEEKEVENTREG_66_40",
- (66 << 8) | 0x80: "WEEKEVENTREG_66_80",
- (67 << 8) | 0x01: "WEEKEVENTREG_67_01",
- (67 << 8) | 0x02: "WEEKEVENTREG_67_02",
- (67 << 8) | 0x04: "WEEKEVENTREG_67_04",
- (67 << 8) | 0x08: "WEEKEVENTREG_67_08",
- (67 << 8) | 0x10: "WEEKEVENTREG_67_10",
- (67 << 8) | 0x20: "WEEKEVENTREG_67_20",
- (67 << 8) | 0x40: "WEEKEVENTREG_67_40",
- (67 << 8) | 0x80: "WEEKEVENTREG_67_80",
- (68 << 8) | 0x01: "WEEKEVENTREG_68_01",
- (68 << 8) | 0x02: "WEEKEVENTREG_68_02",
- (68 << 8) | 0x04: "WEEKEVENTREG_68_04",
- (68 << 8) | 0x08: "WEEKEVENTREG_68_08",
- (68 << 8) | 0x10: "WEEKEVENTREG_68_10",
- (68 << 8) | 0x20: "WEEKEVENTREG_68_20",
- (68 << 8) | 0x40: "WEEKEVENTREG_68_40",
- (68 << 8) | 0x80: "WEEKEVENTREG_68_80",
- (69 << 8) | 0x01: "WEEKEVENTREG_69_01",
- (69 << 8) | 0x02: "WEEKEVENTREG_69_02",
- (69 << 8) | 0x04: "WEEKEVENTREG_69_04",
- (69 << 8) | 0x08: "WEEKEVENTREG_69_08",
- (69 << 8) | 0x10: "WEEKEVENTREG_69_10",
- (69 << 8) | 0x20: "WEEKEVENTREG_69_20",
- (69 << 8) | 0x40: "WEEKEVENTREG_69_40",
- (69 << 8) | 0x80: "WEEKEVENTREG_69_80",
- (70 << 8) | 0x01: "WEEKEVENTREG_70_01",
- (70 << 8) | 0x02: "WEEKEVENTREG_70_02",
- (70 << 8) | 0x04: "WEEKEVENTREG_70_04",
- (70 << 8) | 0x08: "WEEKEVENTREG_70_08",
- (70 << 8) | 0x10: "WEEKEVENTREG_70_10",
- (70 << 8) | 0x20: "WEEKEVENTREG_70_20",
- (70 << 8) | 0x40: "WEEKEVENTREG_70_40",
- (70 << 8) | 0x80: "WEEKEVENTREG_70_80",
- (71 << 8) | 0x01: "WEEKEVENTREG_71_01",
- (71 << 8) | 0x02: "WEEKEVENTREG_71_02",
- (71 << 8) | 0x04: "WEEKEVENTREG_71_04",
- (71 << 8) | 0x08: "WEEKEVENTREG_71_08",
- (71 << 8) | 0x10: "WEEKEVENTREG_71_10",
- (71 << 8) | 0x20: "WEEKEVENTREG_71_20",
- (71 << 8) | 0x40: "WEEKEVENTREG_71_40",
- (71 << 8) | 0x80: "WEEKEVENTREG_71_80",
- (72 << 8) | 0x01: "WEEKEVENTREG_72_01",
- (72 << 8) | 0x02: "WEEKEVENTREG_72_02",
- (72 << 8) | 0x04: "WEEKEVENTREG_72_04",
- (72 << 8) | 0x08: "WEEKEVENTREG_72_08",
- (72 << 8) | 0x10: "WEEKEVENTREG_72_10",
- (72 << 8) | 0x20: "WEEKEVENTREG_72_20",
- (72 << 8) | 0x40: "WEEKEVENTREG_72_40",
+ (66 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU",
+ (66 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI",
+ (66 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN",
+ (66 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY",
+ (66 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI",
+ (66 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA",
+ (66 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR",
+ (66 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAOME_AROMA",
+ (67 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO",
+ (67 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN",
+ (67 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN",
+ (67 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS",
+ (67 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND",
+ (67 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER",
+ (67 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO",
+ (67 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG",
+ (68 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS",
+ (68 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO",
+ (68 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU",
+ (68 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS",
+ (68 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY",
+ (68 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING",
+ (68 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI",
+ (68 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI",
+ (69 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI",
+ (69 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES",
+ (69 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES",
+ (69 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT",
+ (69 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM",
+ (69 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM",
+ (69 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE",
+ (69 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA",
+ (70 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK",
+ (70 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK",
+ (70 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL",
+ (70 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL",
+ (70 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE",
+ (70 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK",
+ (70 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP",
+ (70 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP",
+ (71 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP",
+ (71 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP",
+ (71 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP",
+ (71 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP",
+ (71 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK",
+ (71 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK",
+ (71 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD",
+ (71 << 8) | 0x80: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK",
+ (72 << 8) | 0x01: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK",
+ (72 << 8) | 0x02: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT",
+ (72 << 8) | 0x04: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK",
+ (72 << 8) | 0x08: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK",
+ (72 << 8) | 0x10: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK",
+ (72 << 8) | 0x20: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK",
+ (72 << 8) | 0x40: "WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK",
(72 << 8) | 0x80: "WEEKEVENTREG_72_80",
(73 << 8) | 0x01: "WEEKEVENTREG_73_01",
(73 << 8) | 0x02: "WEEKEVENTREG_73_02",
@@ -608,7 +608,7 @@ weekEventReg = {
(75 << 8) | 0x02: "WEEKEVENTREG_75_02",
(75 << 8) | 0x04: "WEEKEVENTREG_75_04",
(75 << 8) | 0x08: "WEEKEVENTREG_75_08",
- (75 << 8) | 0x10: "WEEKEVENTREG_75_10",
+ (75 << 8) | 0x10: "WEEKEVENTREG_RECEIVED_ROOM_KEY",
(75 << 8) | 0x20: "WEEKEVENTREG_75_20",
(75 << 8) | 0x40: "WEEKEVENTREG_75_40",
(75 << 8) | 0x80: "WEEKEVENTREG_75_80",
@@ -648,7 +648,7 @@ weekEventReg = {
(80 << 8) | 0x02: "WEEKEVENTREG_80_02",
(80 << 8) | 0x04: "WEEKEVENTREG_80_04",
(80 << 8) | 0x08: "WEEKEVENTREG_80_08",
- (80 << 8) | 0x10: "WEEKEVENTREG_80_10",
+ (80 << 8) | 0x10: "WEEKEVENTREG_RECEIVED_PRIORITY_MAIL",
(80 << 8) | 0x20: "WEEKEVENTREG_80_20",
(80 << 8) | 0x40: "WEEKEVENTREG_80_40",
(80 << 8) | 0x80: "WEEKEVENTREG_80_80",
@@ -714,11 +714,11 @@ weekEventReg = {
(88 << 8) | 0x08: "WEEKEVENTREG_88_08",
(88 << 8) | 0x10: "WEEKEVENTREG_88_10",
(88 << 8) | 0x20: "WEEKEVENTREG_88_20",
- (88 << 8) | 0x40: "WEEKEVENTREG_88_40",
- (88 << 8) | 0x80: "WEEKEVENTREG_88_80",
- (89 << 8) | 0x01: "WEEKEVENTREG_89_01",
- (89 << 8) | 0x02: "WEEKEVENTREG_89_02",
- (89 << 8) | 0x04: "WEEKEVENTREG_89_04",
+ (88 << 8) | 0x40: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE",
+ (88 << 8) | 0x80: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_HUMAN",
+ (89 << 8) | 0x01: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_DEKU",
+ (89 << 8) | 0x02: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_ZORA",
+ (89 << 8) | 0x04: "WEEKEVENTREG_GATEKEEPER_OPENED_GORON_SHRINE_FOR_GORON",
(89 << 8) | 0x08: "WEEKEVENTREG_89_08",
(89 << 8) | 0x10: "WEEKEVENTREG_89_10",
(89 << 8) | 0x20: "WEEKEVENTREG_89_20",
diff --git a/undefined_syms.txt b/undefined_syms.txt
index e0a7e58be..dbe596d77 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -122,9 +122,11 @@ D_A4800010 = 0xA4800010; // SI_PIF_ADDR_WR64B_REG
D_A4800014 = 0xA4800014; // reserved
D_A4800018 = 0xA4800018; // SI_STATUS_REG
-// buffers
+// sys_cfb buffers
gFramebuffer1 = 0x80000500;
+gFramebufferHiRes0 = 0x80780000;
+gFramebufferHiRes1 = 0x80000500;
D_80025D00 = 0x80025D00;
// Ucode symbols
@@ -586,10 +588,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;
@@ -727,14 +725,6 @@ D_060134D0 = 0x060134D0;
D_06013828 = 0x06013828;
D_06014040 = 0x06014040;
-// ovl_Demo_Moonend
-
-D_06001214 = 0x06001214;
-D_0600B540 = 0x0600B540;
-D_0600B5A0 = 0x0600B5A0;
-D_06010C40 = 0x06010C40;
-D_060129F0 = 0x060129F0;
-
// ovl_Dm_Tsg
D_06002D30 = 0x06002D30;
@@ -770,10 +760,6 @@ D_060111E8 = 0x060111E8;
D_06012478 = 0x06012478;
D_06012618 = 0x06012618;
-// ovl_En_And
-
-D_0600B380 = 0x0600B380;
-
// ovl_En_Bal
D_060005FC = 0x060005FC;
@@ -1132,21 +1118,32 @@ 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
+D_07000000 = 0x07000000;
+D_07000800 = 0x07000800;
+D_07001000 = 0x07001000;
+D_07001800 = 0x07001800;
+D_07002000 = 0x07002000;
+D_07002800 = 0x07002800;
+D_07003000 = 0x07003000;
+D_07003800 = 0x07003800;
+D_07004000 = 0x07004000;
+D_07004800 = 0x07004800;
+D_07005000 = 0x07005000;
+D_07005800 = 0x07005800;
+D_07006000 = 0x07006000;
+D_07006800 = 0x07006800;
+D_07007000 = 0x07007000;
+D_07007800 = 0x07007800;
+D_07008000 = 0x07008000;
+D_07008800 = 0x07008800;
+D_07009000 = 0x07009000;
+D_07009800 = 0x07009800;
+D_0700AC00 = 0x0700AC00;
+D_0700AEA0 = 0x0700AEA0;
+
// segment 0x08
@@ -1200,20 +1197,6 @@ D_0B000188 = 0x0B000188;
// segment 0x0C
D_0C000000 = 0x0C000000;
-D_0C000800 = 0x0C000800;
-D_0C001000 = 0x0C001000;
-D_0C001800 = 0x0C001800;
-D_0C001980 = 0x0C001980;
-D_0C006C00 = 0x0C006C00;
-D_0C006E00 = 0x0C006E00;
-D_0C014668 = 0x0C014668;
-
-// segment 0x0D
-
-D_0D002000 = 0x0D002000;
-D_0D002200 = 0x0D002200;
-D_0D002400 = 0x0D002400;
-D_0D003700 = 0x0D003700;
// segment 0x0E