diff --git a/assets/xml/code/eff_shield_particle.xml b/assets/xml/code/eff_shield_particle.xml
new file mode 100644
index 0000000000..3ff5535062
--- /dev/null
+++ b/assets/xml/code/eff_shield_particle.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index 892749e732..f3ed5c8984 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -1324,11 +1324,11 @@
-
+
-
+
-
+
diff --git a/assets/xml/objects/object_aob.xml b/assets/xml/objects/object_aob.xml
index f44ec32463..dcdb757484 100644
--- a/assets/xml/objects/object_aob.xml
+++ b/assets/xml/objects/object_aob.xml
@@ -23,9 +23,9 @@
-
-
-
+
+
+
diff --git a/assets/xml/objects/object_bigpo.xml b/assets/xml/objects/object_bigpo.xml
index 5a930c9ac5..c41d5ff793 100644
--- a/assets/xml/objects/object_bigpo.xml
+++ b/assets/xml/objects/object_bigpo.xml
@@ -1,46 +1,46 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_bigslime.xml b/assets/xml/objects/object_bigslime.xml
index d0238adef4..18b7025061 100644
--- a/assets/xml/objects/object_bigslime.xml
+++ b/assets/xml/objects/object_bigslime.xml
@@ -1,114 +1,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_cs.xml b/assets/xml/objects/object_cs.xml
index d55f866caf..7fff51fd8f 100644
--- a/assets/xml/objects/object_cs.xml
+++ b/assets/xml/objects/object_cs.xml
@@ -56,11 +56,18 @@
-
+
+
+
+
+
-
+
+
+
+
+
-
diff --git a/assets/xml/objects/object_dnt.xml b/assets/xml/objects/object_dnt.xml
index d75f29cfc0..d2ff328d3e 100644
--- a/assets/xml/objects/object_dnt.xml
+++ b/assets/xml/objects/object_dnt.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/assets/xml/objects/object_gmo.xml b/assets/xml/objects/object_gmo.xml
index 732634d761..4884d79190 100644
--- a/assets/xml/objects/object_gmo.xml
+++ b/assets/xml/objects/object_gmo.xml
@@ -1,13 +1,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_mag.xml b/assets/xml/objects/object_mag.xml
index 061ff6bca9..1feae8057c 100644
--- a/assets/xml/objects/object_mag.xml
+++ b/assets/xml/objects/object_mag.xml
@@ -1,28 +1,30 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_tokei_step.xml b/assets/xml/objects/object_tokei_step.xml
index fad13984a3..ecdf14ac38 100644
--- a/assets/xml/objects/object_tokei_step.xml
+++ b/assets/xml/objects/object_tokei_step.xml
@@ -1,8 +1,8 @@
-
-
-
-
+
+
+
+
diff --git a/assets/xml/objects/object_warp1.xml b/assets/xml/objects/object_warp1.xml
index 9324f1301c..50d4c527a1 100644
--- a/assets/xml/objects/object_warp1.xml
+++ b/assets/xml/objects/object_warp1.xml
@@ -54,6 +54,6 @@
-
+
diff --git a/assets/xml/objects/object_zog.xml b/assets/xml/objects/object_zog.xml
index aae7b0381f..55f169ad1a 100644
--- a/assets/xml/objects/object_zog.xml
+++ b/assets/xml/objects/object_zog.xml
@@ -74,7 +74,12 @@
-
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_En_Bigslime.xml b/assets/xml/overlays/ovl_En_Bigslime.xml
new file mode 100644
index 0000000000..9526daea6f
--- /dev/null
+++ b/assets/xml/overlays/ovl_En_Bigslime.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/overlays/ovl_En_Bomjimb.xml b/assets/xml/overlays/ovl_En_Bomjimb.xml
new file mode 100644
index 0000000000..af42c79568
--- /dev/null
+++ b/assets/xml/overlays/ovl_En_Bomjimb.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 8cbccc85e9..6d6dd20852 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -167,7 +167,7 @@ s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status);
// void func_800867B4(void);
// void func_800867D4(void);
// void func_800867F4(void);
-// void func_80086814(void);
+f32 func_80086814(f32 x);
// void func_80086834(void);
// void func_80086880(void);
// void func_800869A4(void);
@@ -381,7 +381,7 @@ void guRotateF(float mf[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);
-// void __osContChannelReset(void);
+s32 __osContChannelReset(OSMesgQueue* mq, s32 channel);
// void __osVoiceSetADConverter(void);
s32 osAiSetFrequency(u32 frequency);
s32 __osContRamRead(OSMesgQueue* mq, s32 channel, u16 address, u8* buffer);
@@ -499,52 +499,37 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
s32 func_800A8150(s32 index);
s32 func_800A817C(s32 index);
s32 func_800A81A4(GlobalContext* globalCtx, s32 a1, s32 a2);
-void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2);
-void func_800A8514(void* effectParams);
-void EffectBlure_Initcommon(EffectBlure* params);
-void EffectBlure_Init1(EffectBlure* params, EffBlureInit1* init);
-void EffectBlure_Init2(EffectBlure* params, EffBlureInit2* init);
-void EffectBlure_Destroy(EffectBlure* params);
-s32 EffectBlure_Update(EffectBlure* params);
-// void func_800A8C78(void);
-// void func_800A8DE8(void);
-// void func_800A92FC(void);
-// void func_800A9330(void);
-// void func_800A9804(void);
-// void func_800AA190(void);
-// void func_800AA460(void);
-// void func_800AA498(void);
-// void func_800AA700(void);
-// void func_800AABE0(void);
-void EffectBlure_Draw(EffectBlure* params, GraphicsContext* gfxCtx);
-void EffectShieldParticle_Init(EffShieldParticleParams* params, EffShieldParticleInit* init);
-void EffectShieldParticle_Destroy(EffShieldParticleParams* params);
-s32 EffectShieldParticle_Update(EffShieldParticleParams* params);
-void EffectShieldParticle_CalculateColors(EffShieldParticleParams* params, Color_RGBA8* primColor, Color_RGBA8* envColor);
-void EffectShieldParticle_Draw(EffShieldParticleParams* params, GraphicsContext* gfxCtx);
-void EffectSpark_Init(EffSparkParams* params, EffSparkParams* init);
-void EffectSpark_Destroy(EffSparkParams* params);
-s32 EffectSpark_Update(EffSparkParams* params);
-void EffectSpark_Draw(EffSparkParams* params, GraphicsContext* gfxCtx);
-void func_800AE2A0(GlobalContext* globalCtx, Color_RGBA8* arg1, s16 arg2, s16 arg3);
-void func_800AE434(GlobalContext* globalCtx, Color_RGBA8* color, s16 sParm3, s16 sParm4);
+void EffectBlure_AddVertex(EffectBlure* this, Vec3f* p1, Vec3f* p2);
+void EffectBlure_AddSpace(EffectBlure* this);
+void EffectBlure_Init1(void* thisx, void* initParamsx);
+void EffectBlure_Init2(void* thisx, void* initParamsx);
+void EffectBlure_Destroy(void* thisx);
+s32 EffectBlure_Update(void* thisx);
+void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx);
+void EffectShieldParticle_Init(void* thisx, void* initParamsx);
+void EffectShieldParticle_Destroy(void* thisx);
+s32 EffectShieldParticle_Update(void* thisx);
+void EffectShieldParticle_Draw(void* thisx, GraphicsContext* gfxCtx);
+void EffectSpark_Init(void* thisx, void* initParamsx);
+void EffectSpark_Destroy(void* thisx);
+s32 EffectSpark_Update(void* thisx);
+void EffectSpark_Draw(void* thisx, GraphicsContext* gfxCtx);
+void func_800AE2A0(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3);
+void func_800AE434(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3);
void func_800AE5A0(GlobalContext* globalCtx);
-void func_800AE5E4(GlobalContext* globalCtx, Color_RGBA8* arg1, s16 arg2, s16 arg3);
-void func_800AE778(GlobalContext* globalCtx, Color_RGBA8* color, s16 param_3, s16 param_4);
+void func_800AE5E4(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3);
+void func_800AE778(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3);
void func_800AE8EC(GlobalContext* globalCtx);
-void func_800AE930(CollisionContext* colCtx, s32 param_2, Vec3f* param_3, f32 param_4, s16 param_5, CollisionPoly* param_6, s32 param_7);
-void func_800AEF44(s32 arg0);
-void EffectTireMark_InitParticle(EffTireMarkParticle* particle);
-void EffectTireMark_Init(EffTireMarkParams* params, EffTireMarkInit* init);
-void EffectTireMark_Destroy(EffTireMarkParams* params);
-s32 EffectTireMark_Update(EffTireMarkParams* params);
-void EffectTireMark_InitVertices(F3DVertexColor* vertices, EffTireMarkParticle* particle, s32 index, s32 alpha);
-void EffectTireMark_Draw(EffTireMarkParams* params, GraphicsContext* gfxCtx);
-GlobalContext* Effect_GetContext(void);
-void* Effect_GetParams(s32 index);
-void Effect_InitCommon(EffCommon* common);
+void func_800AE930(CollisionContext* colCtx, EffectTireMark* this, Vec3f* pos, f32 arg3, s16 angle, CollisionPoly* colPoly, s32 arg6);
+void func_800AEF44(EffectTireMark* this);
+void EffectTireMark_Init(void* thisx, void* initParamsx);
+void EffectTireMark_Destroy(void* thisx);
+s32 EffectTireMark_Update(void* thisx);
+void EffectTireMark_Draw(void* thisx, GraphicsContext* gfxCtx);
+GlobalContext* Effect_GetGlobalCtx(void);
+void* Effect_GetByIndex(s32 index);
void Effect_Init(GlobalContext* globalCtx);
-void Effect_Add(GlobalContext* globalCtx, s32* index, s32 type, u8 param_4, u8 param_5, void* initParams);
+void Effect_Add(GlobalContext* globalCtx, s32* pIndex, s32 type, u8 arg3, u8 arg4, void* initParams);
void Effect_DrawAll(GraphicsContext* gfxCtx);
void Effect_UpdateAll(GlobalContext* globalCtx);
void Effect_Destroy(GlobalContext* globalCtx, s32 index);
@@ -666,7 +651,7 @@ void func_800B3030(GlobalContext* globalCtx, Vec3f* pos, Vec3f* velocity, Vec3f*
// void EffectSsDeadDs_Spawn(UNK_TYPE4 uParm1, Vec3f* pzParm2, Vec3f* pzParm3, Vec3f* pzParm4, UNK_TYPE2 param_5, UNK_TYPE2 param_6, UNK_TYPE2 param_7, UNK_TYPE4 param_8);
// void func_800B31BC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE4 param_6);
void EffectSsIceSmoke_Spawn(GlobalContext* globalCtx, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale);
-// void EffectSsIceBlock_Spawn(UNK_TYPE4 uParm1, Vec3f* pzParm2, Vec3f* pzParm3, Vec3f* pzParm4, UNK_TYPE2 param_5);
+void EffectSsIceBlock_Spawn(GlobalContext* globalCtx, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale);
void FlagSet_Update(GameState* gameState);
void FlagSet_Draw(GameState* gameState);
void Overlay_LoadGameState(GameStateOverlay* gameState);
@@ -870,7 +855,7 @@ void func_800BC154(GlobalContext* globalCtx, ActorContext* actorCtx, Actor* acto
// void func_800BC1B4(void);
Actor* func_800BC270(GlobalContext* globalCtx, Actor* actor, f32 arg2, UNK_TYPE4 arg3);
Actor* func_800BC444(GlobalContext* globalCtx, Actor* actor, f32 arg2);
-// void func_800BC4EC(void);
+s16 func_800BC4EC(Actor* actor, GlobalContext* globalCtx, f32 distance, s16 angle);
s32 func_800BC5B8(GlobalContext* globalCtx, Actor* actor);
s32 func_800BC5EC(GlobalContext* globalCtx, Actor* actor);
void func_800BC620(Vec3f* arg0, Vec3f* arg1, u8 arg2, GlobalContext* globalCtx);
@@ -1625,7 +1610,7 @@ ActorCutscene* ActorCutscene_GetCutscene(s16 index);
s16 ActorCutscene_GetAdditionalCutscene(s16 index);
s16 ActorCutscene_GetLength(s16 index);
// void func_800F2138(void);
-// void func_800F2178(void);
+s32 func_800F2178(s16 arg0);
s16 ActorCutscene_GetCurrentCamera(s16 index);
// void func_800F21CC(void);
s32 func_800F22C4(s16 param_1, Actor* actor);
@@ -1660,8 +1645,8 @@ UNK_TYPE func_800F41E4(GlobalContext* globalCtx, ActorContext* actorCtx);
void func_800F4A10(GlobalContext* globalCtx);
void func_800F4C0C(GlobalContext* globalCtx);
-void func_800F4E20(GlobalContext* globalCtx);
-void func_800F4F28(GlobalContext* globalCtx);
+void KaleidoSetup_Init(GlobalContext* globalCtx);
+void KaleidoSetup_Destroy(GlobalContext* globalCtx);
void Font_LoadChar(GlobalContext* globalCtx, u16 codePointIndex, s32 offset);
void Font_LoadCharNES(GlobalContext* globalCtx, u8 codePointIndex, s32 offset);
void Font_LoadMessageBoxEndIcon(Font* font, u16 icon);
@@ -1709,7 +1694,7 @@ void Kankyo_FadeOutGameOverLights(GlobalContext* globalCtx);
// void func_800FC3DC(void);
void func_800FC444(GraphicsContext* gfxCtx, u8 arg1, u8 arg2, u8 arg3, u8 arg4, UNK_TYPE arg5);
// void func_800FC64C(void);
-// void func_800FD2B4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
+s32 func_800FD2B4(GlobalContext* globalCtx, f32 arg1, f32 arg2, f32 arg3, f32 arg4);
void func_800FD538(Color_RGB8* param_1, Color_RGB8* param_2, f32 param_3, Vec3s* param_4);
void func_800FD59C(GlobalContext* globalCtx, Color_RGB8* pzParm2, f32 fParm3);
void func_800FD5E0(GlobalContext* globalCtx, Color_RGB8* pzParm2, f32 fParm3);
@@ -2903,17 +2888,17 @@ void ShrinkWindow_Draw(GraphicsContext* gfxCtx);
// void func_801631DC(void);
// void func_80163334(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_80163660(void);
-// void func_80163700(void);
-// void func_80163758(void);
-// void func_801637B4(void);
-void func_80163804(GlobalContext* globalCtx);
-// void func_8016388C(void);
-// void func_801638D8(void);
-// void func_801639A0(void);
-void func_801639EC(GlobalContext* globalCtx);
-void func_80163A38(GlobalContext* globalCtx);
-// void func_80163A58(void);
-// void func_80163C0C(void);
+void* KaleidoManager_FaultAddrConvFunc(void* address, void* param);
+void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl);
+void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl);
+void KaleidoManager_Init(GlobalContext* globalCtx);
+void KaleidoManager_Destroy();
+void* KaleidoManager_GetRamAddr(void* vram);
+void KaleidoScopeCall_LoadPlayer(void);
+void KaleidoScopeCall_Init(GlobalContext* globalCtx);
+void KaleidoScopeCall_Destroy(GlobalContext* globalCtx);
+void KaleidoScopeCall_Update(GlobalContext* globalCtx);
+void KaleidoScopeCall_Draw(GlobalContext* globalCtx);
// void func_80163C90(void);
// void func_80163D80(void);
// void func_80163DC0(void);
@@ -3005,7 +2990,7 @@ void func_80169E6C(GlobalContext* globalCtx, s32 param_1, s32 param_2);
// void func_80169ECC(void);
void func_80169EFC(GlobalContext* globalCtx);
void func_80169F78(GlobalContext* globalCtx);
-// void func_80169FDC(void);
+void func_80169FDC(GlobalContext* globalCtx);
// void func_80169FFC(void);
s32 FrameAdvance_IsEnabled(GlobalContext* globalCtx);
// UNK_TYPE4 func_8016A02C(s32 param_1, s32 param_2, s16* param_3);
@@ -3231,7 +3216,7 @@ 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);
-// UNK_TYPE4 func_80179798(Vec3f* param_1, Vec3f* param_2, Vec3f* param_3, Vec3f* param_4, Vec3f* param_5, Vec3f* param_6);
+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);
// 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);
@@ -3657,8 +3642,8 @@ AudioTask* func_80192BE0(void);
// void func_80194568(void);
// void func_80194668(void);
// void func_801946E4(void);
-// void func_80194710(void);
-// void func_80194750(void);
+void Audio_InvalDCache(void* buf, size_t size);
+void Audio_WritebackDCache(void* buf, size_t size);
// void func_80194790(void);
// void func_80194840(void);
// void func_801948B0(void);
diff --git a/include/macros.h b/include/macros.h
index 6dc1e5e4e4..1afbde243b 100644
--- a/include/macros.h
+++ b/include/macros.h
@@ -63,6 +63,7 @@
((((void)0, gSaveContext.equips.equipment) & gEquipMasks[equip]) >> gEquipShifts[equip])
#define CUR_UPG_VALUE_VOID(upg) \
((((void)0, gSaveContext.inventory.upgrades) & gUpgradeMasks[upg]) >> gUpgradeShifts[upg])
+#define INV_CONTENT_VOID(item) ((void)0, gSaveContext.inventory.items)[SLOT(item)]
#define CUR_FORM ((gSaveContext.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.playerForm)
@@ -101,6 +102,7 @@ extern GraphicsContext* __gfxCtx;
s32 __dispPad
#define CLOSE_DISPS(gfxCtx) \
+ (void)0; \
} \
(void)0
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index 0044936729..3f02baa5c0 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -73,7 +73,7 @@ DECLARE_OVERLAY_SEGMENT(opening)
DECLARE_OVERLAY_SEGMENT(file_choose)
DECLARE_OVERLAY_SEGMENT(daytelop)
DECLARE_OVERLAY_SEGMENT(kaleido_scope)
-DECLARE_OVERLAY_SEGMENT(Player_Actor)
+DECLARE_OVERLAY_SEGMENT(player_actor)
DECLARE_OVERLAY_SEGMENT(En_Test)
DECLARE_OVERLAY_SEGMENT(En_GirlA)
diff --git a/include/variables.h b/include/variables.h
index 35277bb802..81e55391ba 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -382,8 +382,6 @@ extern UNK_PTR D_801AE260[3];
// extern UNK_TYPE4 D_801AE2BC;
// extern UNK_TYPE4 D_801AE2CC;
// extern UNK_TYPE4 D_801AE2DC;
-extern F3DVertex sEffectShieldParticleVertices[4];
-extern EffInfo sEffInfoTable[5];
extern EffectSsInfo EffectSS2Info;
// extern UNK_TYPE1 D_801AE3B0;
// extern UNK_TYPE1 D_801AE3B4;
@@ -870,8 +868,8 @@ extern ColChkVsFunc sOCVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX];
extern CollisionCheckInfo defaultColChkInfo;
extern ColChkApplyFunc sApplyDamageFuncs[COLSHAPE_MAX];
extern ColChkLineFunc sOCLineCheckFuncs[COLSHAPE_MAX];
-extern EffShieldParticleInit shieldParticleInitMetal;
-extern EffShieldParticleInit shieldParticleInitWood;
+extern EffectShieldParticleInit shieldParticleInitMetal;
+extern EffectShieldParticleInit shieldParticleInitWood;
// extern UNK_TYPE4 D_801BB090;
// extern UNK_TYPE1 D_801BB094;
// extern UNK_TYPE1 D_801BB0DC;
@@ -1552,10 +1550,9 @@ extern char D_801D0714[];
// extern UNK_TYPE1 D_801D08E8;
// extern UNK_TYPE1 D_801D0900;
extern ActorInit Player_InitVars;
-// extern UNK_TYPE1 D_801D0B70;
+extern KaleidoMgrOverlay gKaleidoMgrOverlayTable[2];
// extern UNK_TYPE1 D_801D0B8C;
-// extern UNK_TYPE4 D_801D0BA8;
-// extern UNK_TYPE4 D_801D0BAC;
+extern KaleidoMgrOverlay* gKaleidoMgrCurOvl;
// extern UNK_TYPE4 D_801D0BB0;
// extern UNK_TYPE1 D_801D0C80;
// extern UNK_TYPE1 D_801D0CB0;
@@ -1631,10 +1628,10 @@ extern PadMgr* padmgrContext;
// extern UNK_TYPE4 D_801D1538;
extern UNK_PTR D_801D1540;
// extern f32 sFactorialTbl[13];
-extern Vec3f D_801D15B0;
-extern Vec3s D_801D15BC;
-extern Mtx D_801D1DE0;
-extern MtxF D_801D1E20;
+extern Vec3f gZeroVec3f;
+extern Vec3s gZeroVec3s;
+extern Mtx gIdentityMtx;
+extern MtxF gIdentityMtxF;
// extern u64* initialgspUcodeText;
// extern u64* initialgspUcodeData;
// extern UNK_TYPE1 D_801D1E70;
@@ -3104,15 +3101,7 @@ extern u64 gJpegUCodeData[];
// extern UNK_TYPE1 D_801E3FA0;
// bss
-extern EffTables sEffTable;
-// extern UNK_TYPE1 D_801E4514;
-// extern UNK_TYPE1 D_801E4E08;
-// extern UNK_TYPE1 D_801E531C;
-// extern UNK_TYPE1 D_801E69E0;
-// extern UNK_TYPE1 D_801E9AA0;
-// extern UNK_TYPE1 D_801ED4C0;
// extern UNK_TYPE1 D_801ED890;
-// extern UNK_TYPE1 D_801ED894;
// extern UNK_TYPE1 D_801ED8A0;
// extern UNK_TYPE1 D_801ED8B0;
// extern UNK_TYPE1 D_801ED8B4;
@@ -3197,12 +3186,12 @@ extern Vec3f D_801EE1E0;
extern Vec3f D_801EE1F0;
// extern UNK_TYPE1 D_801EE1F4;
// extern UNK_TYPE1 D_801EE1F8;
-extern EffSparkParams D_801EE200;
+extern EffectSparkInit D_801EE200;
extern TriNorm D_801EE6C8;
extern TriNorm D_801EE700;
-extern EffSparkParams D_801EE738;
-extern EffSparkParams D_801EEC00;
-extern EffSparkParams D_801EF0C8;
+extern EffectSparkInit D_801EE738;
+extern EffectSparkInit D_801EEC00;
+extern EffectSparkInit D_801EF0C8;
extern TriNorm D_801EF590;
extern TriNorm D_801EF5C8;
extern TriNorm D_801EF600;
@@ -3227,7 +3216,7 @@ extern GameInfo* gGameInfo;
// extern UNK_TYPE2 D_801F4DCC[8];
// extern UNK_TYPE1 D_801F4DDC;
// extern UNK_TYPE1 D_801F4DE0;
-// extern UNK_TYPE2 D_801F4DE2;
+extern s16 D_801F4DE2;
extern ActorCutscene* actorCutscenes;
extern s16 actorCutsceneCount;
extern u8 actorCutsceneWaiting[16];
@@ -3342,9 +3331,9 @@ extern ShrinkWindowContext gShrinkWindowContext;
extern ShrinkWindowContext* gShrinkWindowContextPtr;
// extern UNK_TYPE4 D_801F6B50;
// extern UNK_TYPE1 D_801F6B58;
-// extern UNK_TYPE1 D_801F6BF0;
-// extern UNK_TYPE1 D_801F6C00;
-// extern UNK_TYPE1 D_801F6C04;
+extern FaultAddrConvClient sKaleidoAreaFaultClient;
+extern void (*sKaleidoScopeUpdateFunc)(GlobalContext* globalCtx);
+extern void (*sKaleidoScopeDrawFunc)(GlobalContext* globalCtx);
// extern UNK_TYPE1 D_801F6C10;
extern Input D_801F6C18;
// extern UNK_TYPE1 D_801F6C30;
@@ -3887,6 +3876,7 @@ extern Gfx D_04011BD0; // Gold Deku Flower display list
extern SkeletonHeader D_040127E8; // Gold Deku Flower skeleton
extern UNK_TYPE D_04012860;
extern UNK_TYPE D_040128BC;
+extern u64 D_04014570[];
extern UNK_TYPE D_04015FA0;
extern UNK_TYPE D_04016360;
extern UNK_TYPE D_0401A4D0;
@@ -3909,7 +3899,7 @@ extern UNK_TYPE D_04025850;
extern UNK_TYPE D_04025DD0;
extern UNK_TYPE D_040281DC;
extern UNK_TYPE D_04028FEC;
-extern UNK_TYPE D_04029140;
+extern AnimationHeader D_04029140;
extern Gfx D_04029CB0[];
extern Gfx D_04029CF0[];
extern UNK_TYPE D_04029D20;
@@ -3950,6 +3940,7 @@ extern AnimationHeader D_0405140C;
extern UNK_TYPE D_040527F0;
extern UNK_TYPE D_040528B0;
extern Gfx D_04054A90[];
+extern u64 D_04054F20[];
extern UNK_TYPE D_04055628;
extern Gfx D_04057B10[];
extern Gfx D_04058BA0[];
@@ -3999,7 +3990,7 @@ extern UNK_TYPE D_04079B10;
extern Gfx D_0407AB10[]; // sun (sparkles when small) displaylist
extern Gfx D_0407AB58[];
extern UNK_TYPE D_0407AFB0;
-extern Gfx D_0407D590[];
+extern Gfx gGameplayKeepDrawFlameDL[];
extern UNK_TYPE D_0407D650;
extern UNK_TYPE D_0407F218;
extern UNK_TYPE D_040815D0;
diff --git a/include/z64.h b/include/z64.h
index f094c7cfc4..e34af950e1 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -702,6 +702,22 @@ typedef struct {
/* 0x344 */ u32 unk_344;
} InterfaceContext; // size = 0x348
+typedef struct {
+ /* 0x00 */ void* loadedRamAddr;
+ /* 0x04 */ uintptr_t vromStart;
+ /* 0x08 */ uintptr_t vromEnd;
+ /* 0x0C */ void* vramStart;
+ /* 0x10 */ void* vramEnd;
+ /* 0x14 */ uintptr_t offset; // loadedRamAddr - vramStart
+ /* 0x18 */ const char* name;
+} KaleidoMgrOverlay; // size = 0x1C
+
+typedef enum {
+ /* 0x00 */ KALEIDO_OVL_KALEIDO_SCOPE,
+ /* 0x01 */ KALEIDO_OVL_PLAYER_ACTOR,
+ /* 0x02 */ KALEID_OVL_MAX
+} KaleidoMgrOverlayType;
+
typedef struct {
/* 0x00 */ u16 unk_0;
/* 0x02 */ u16 unk_2;
@@ -1258,14 +1274,8 @@ struct FireObj {
struct TargetContext {
/* 0x00 */ Vec3f unk0;
/* 0x0C */ Vec3f unkC;
- /* 0x18 */ f32 unk18;
- /* 0x1C */ f32 unk1C;
- /* 0x20 */ f32 unk20;
- /* 0x24 */ f32 unk24;
- /* 0x28 */ f32 unk28;
- /* 0x2C */ f32 unk2C;
- /* 0x30 */ f32 unk30;
- /* 0x34 */ f32 unk34;
+ /* 0x18 */ Color_RGBAf unk18;
+ /* 0x28 */ Color_RGBAf unk28;
/* 0x38 */ Actor* unk38;
/* 0x3C */ Actor* unk3C;
/* 0x40 */ f32 unk40;
diff --git a/include/z64cutscene.h b/include/z64cutscene.h
index 51e60799e0..0f2a6e6784 100644
--- a/include/z64cutscene.h
+++ b/include/z64cutscene.h
@@ -29,11 +29,11 @@ typedef struct {
/* 0x00 */ u16 unk0; // action; // "dousa"
/* 0x02 */ u16 startFrame;
/* 0x04 */ u16 endFrame;
- /* 0x06 */ UNK_TYPE1 pad6[0xA];
- /* 0x10 */ s32 unk10;
- /* 0x14 */ UNK_TYPE1 pad14[0x8];
- /* 0x1C */ s32 unk1C;
- /* 0x20 */ UNK_TYPE1 pad20[0x10];
+ /* 0x06 */ u16 unk6;
+ /* 0x08 */ u16 unk8;
+ /* 0x0C */ Vec3i unk0C;
+ /* 0x18 */ Vec3i unk18;
+ /* 0x24 */ UNK_TYPE1 unk24[0xC];
} CsCmdActorAction; // size = 0x30
typedef struct {
diff --git a/include/z64effect.h b/include/z64effect.h
index adb6907324..b095c89e90 100644
--- a/include/z64effect.h
+++ b/include/z64effect.h
@@ -10,14 +10,6 @@
struct GraphicsContext;
struct GlobalContext;
-typedef void(*eff_destroy_func)(void* params);
-
-typedef void(*eff_draw_func)(void* params, struct GraphicsContext* gfxCtx);
-
-typedef void(*eff_init_func)(void* params, void* init);
-
-typedef s32(*eff_update_func)(void* params);
-
#define SPARK_COUNT 3
#define BLURE_COUNT 25
#define SHIELD_PARTICLE_COUNT 3
@@ -41,37 +33,45 @@ typedef s32(*eff_update_func)(void* params);
#define rgObjBankIdx regs[11]
typedef struct {
- /* 0x0 */ u8 active;
- /* 0x1 */ u8 unk1;
- /* 0x2 */ u8 unk2;
- /* 0x3 */ UNK_TYPE1 pad3[0x1];
-} EffCommon; // size = 0x4
+ /* 0x00 */ u8 active;
+ /* 0x01 */ u8 unk1;
+ /* 0x02 */ u8 unk2;
+} EffectStatus; // size = 0x03
typedef struct {
/* 0x00 */ Vec3f velocity;
/* 0x0C */ Vec3f position;
- /* 0x18 */ Vec3s unk18;
- /* 0x1E */ Vec3s unk1E;
-} EffSparkParticle; // size = 0x24
+ /* 0x18 */ Vec3s unkVelocity;
+ /* 0x1E */ Vec3s unkPosition;
+} EffectSparkElement; // size = 0x24
typedef struct {
/* 0x000 */ Vec3s position;
- /* 0x008 */ s32 numParticles; // Will be calculated as particleFactor1 * particleFactor2 + 2
- /* 0x00C */ EffSparkParticle particles[32];
- /* 0x48C */ f32 velocity;
+ /* 0x008 */ s32 numElements; // "table_size"; calculated as uDiv * vDiv + 2
+ /* 0x00C */ EffectSparkElement elements[32];
+ /* 0x48C */ f32 speed;
/* 0x490 */ f32 gravity;
- /* 0x494 */ u32 particleFactor1;
- /* 0x498 */ u32 particleFactor2;
+ /* 0x494 */ u32 uDiv; // "u_div"
+ /* 0x498 */ u32 vDiv; // "v_div"
/* 0x49C */ Color_RGBA8 colorStart[4];
/* 0x4AC */ Color_RGBA8 colorEnd[4];
- /* 0x4BC */ s32 age;
+ /* 0x4BC */ s32 timer;
/* 0x4C0 */ s32 duration;
-} EffSparkParams; // size = 0x4C4
+} EffectSparkInit; // size = 0x4C4
typedef struct {
- /* 0x000 */ EffCommon base;
- /* 0x004 */ EffSparkParams params;
-} EffSpark; // size = 0x4C8
+ /* 0x000 */ Vec3s position;
+ /* 0x008 */ s32 numElements; // "table_size"; calculated as uDiv * vDiv + 2
+ /* 0x00C */ EffectSparkElement elements[32];
+ /* 0x48C */ f32 speed;
+ /* 0x490 */ f32 gravity;
+ /* 0x494 */ u32 uDiv; // "u_div"
+ /* 0x498 */ u32 vDiv; // "v_div"
+ /* 0x49C */ Color_RGBA8 colorStart[4];
+ /* 0x4AC */ Color_RGBA8 colorEnd[4];
+ /* 0x4BC */ s32 timer;
+ /* 0x4C0 */ s32 duration;
+} EffectSpark; // size = 0x4C4
typedef struct {
/* 0x00 */ s32 state;
@@ -82,13 +82,15 @@ typedef struct {
} EffectBlureElement; // size = 0x18
typedef struct {
- /* 0x000 */ UNK_TYPE1 pad0[0x184];
- /* 0x184 */ Color_RGBA8 unk184;
- /* 0x188 */ Color_RGBA8 unk188;
- /* 0x18C */ Color_RGBA8 unk18C;
- /* 0x190 */ Color_RGBA8 unk190;
- /* 0x194 */ UNK_TYPE1 pad194[0xC];
-} EffBlureInit1; // size = 0x1A0
+ /* 0x000 */ char unk_00[0x184];
+ /* 0x184 */ u8 p1StartColor[4];
+ /* 0x188 */ u8 p2StartColor[4];
+ /* 0x18C */ u8 p1EndColor[4];
+ /* 0x190 */ u8 p2EndColor[4];
+ /* 0x194 */ s32 elemDuration;
+ /* 0x198 */ s32 unkFlag;
+ /* 0x19C */ s32 calcMode;
+} EffectBlureInit1; // size = 0x1A0
typedef struct {
/* 0x00 */ s32 calcMode;
@@ -104,7 +106,7 @@ typedef struct {
/* 0x1B */ u8 mode4Param;
/* 0x1C */ Color_RGBA8 altPrimColor; // used with drawMode 1
/* 0x20 */ Color_RGBA8 altEnvColor; // used with drawMode 1
-} EffBlureInit2; // size = 0x24
+} EffectBlureInit2; // size = 0x24
typedef struct {
/* 0x000 */ EffectBlureElement elements[16];
@@ -117,31 +119,26 @@ typedef struct {
/* 0x192 */ Color_RGBA8 p2StartColor;
/* 0x196 */ Color_RGBA8 p1EndColor;
/* 0x19A */ Color_RGBA8 p2EndColor;
- /* 0x19E */ u8 numElements;
+ /* 0x19E */ u8 numElements; // "now_edge_num"
/* 0x19F */ u8 elemDuration;
/* 0x1A0 */ u8 unkFlag;
/* 0x1A1 */ u8 drawMode; // 0: simple; 1: simple with alt colors; 2+: smooth
- /* 0x1A2 */ Color_RGBA8 altPrimColor;
- /* 0x1A6 */ Color_RGBA8 altEnvColor;
+ /* 0x1A2 */ Color_RGBA8 altPrimColor; // used with drawMode 1
+ /* 0x1A6 */ Color_RGBA8 altEnvColor; // used with drawMode 1
} EffectBlure; // size = 0x1AC
typedef struct {
- /* 0x000 */ EffCommon base;
- /* 0x004 */ EffectBlure params;
-} EffBlure; // size = 0x1B0
-
-typedef struct {
- /* 0x00 */ f32 startSpeed;
+ /* 0x00 */ f32 initialSpeed;
/* 0x04 */ f32 endXChange;
/* 0x08 */ f32 endX;
/* 0x0C */ f32 startXChange;
/* 0x10 */ f32 startX;
- /* 0x14 */ s16 rotationY;
- /* 0x16 */ s16 rotationZ;
-} EffShieldParticleParticle; // size = 0x18
+ /* 0x14 */ s16 yaw;
+ /* 0x16 */ s16 pitch;
+} EffectShieldParticleElement; // size = 0x18
typedef struct {
- /* 0x00 */ u8 numParticles;
+ /* 0x00 */ u8 numElements;
/* 0x02 */ Vec3s position;
/* 0x08 */ Color_RGBA8 primColorStart;
/* 0x0C */ Color_RGBA8 envColorStart;
@@ -149,18 +146,17 @@ typedef struct {
/* 0x14 */ Color_RGBA8 envColorMid;
/* 0x18 */ Color_RGBA8 primColorEnd;
/* 0x1C */ Color_RGBA8 envColorEnd;
- /* 0x20 */ f32 acceleration;
+ /* 0x20 */ f32 deceleration;
/* 0x24 */ f32 maxInitialSpeed;
/* 0x28 */ f32 lengthCutoff;
/* 0x2C */ u8 duration;
/* 0x2E */ LightPoint lightPoint;
- /* 0x3C */ s32 hasLight;
-} EffShieldParticleInit; // size = 0x40
+ /* 0x3C */ s32 lightDecay; // halves light radius every frame when set to 1
+} EffectShieldParticleInit; // size = 0x40
typedef struct {
- /* 0x000 */ EffShieldParticleParticle particles[16];
- /* 0x180 */ u8 numParticles;
- /* 0x181 */ UNK_TYPE1 pad181[0x1];
+ /* 0x000 */ EffectShieldParticleElement elements[16];
+ /* 0x180 */ u8 numElements;
/* 0x182 */ Vec3s position;
/* 0x188 */ Color_RGBA8 primColorStart;
/* 0x18C */ Color_RGBA8 envColorStart;
@@ -168,66 +164,75 @@ typedef struct {
/* 0x194 */ Color_RGBA8 envColorMid;
/* 0x198 */ Color_RGBA8 primColorEnd;
/* 0x19C */ Color_RGBA8 envColorEnd;
- /* 0x1A0 */ f32 acceleration;
- /* 0x1A4 */ UNK_TYPE1 pad1A4[0x4];
+ /* 0x1A0 */ f32 deceleration;
+ /* 0x1A4 */ char unk_1A4[0x04];
/* 0x1A8 */ f32 maxInitialSpeed;
/* 0x1AC */ f32 lengthCutoff;
/* 0x1B0 */ u8 duration;
- /* 0x1B1 */ u8 age;
+ /* 0x1B1 */ u8 timer;
/* 0x1B2 */ LightInfo lightInfo;
- /* 0x1C0 */ LightNode* light;
- /* 0x1C4 */ s32 hasLight;
-} EffShieldParticleParams; // size = 0x1C8
+ /* 0x1C0 */ LightNode* lightNode;
+ /* 0x1C4 */ s32 lightDecay; // halves light radius every frame when set to 1
+} EffectShieldParticle; // size = 0x1C8
typedef struct {
- /* 0x000 */ EffCommon base;
- /* 0x004 */ EffShieldParticleParams params;
-} EffShieldParticle; // size = 0x1CC
-
-typedef struct {
- /* 0x00 */ UNK_TYPE2 active;
- /* 0x02 */ Vec3s position1;
- /* 0x08 */ Vec3s position2;
+ /* 0x00 */ u16 flags;
+ /* 0x02 */ Vec3s p1;
+ /* 0x08 */ Vec3s p2;
/* 0x0E */ s16 life;
/* 0x10 */ UNK_TYPE1 pad10[0x4];
- /* 0x14 */ UNK_TYPE4 unk14;
-} EffTireMarkParticle; // size = 0x18
+ /* 0x14 */ CollisionPoly* colPoly;
+} EffectTireMarkElement; // size = 0x18
typedef struct {
/* 0x0 */ s16 unk0;
- /* 0x2 */ s16 maxLife;
+ /* 0x2 */ s16 elemDuration;
/* 0x4 */ Color_RGBA8 color;
-} EffTireMarkInit; // size = 0x8
+} EffectTireMarkInit; // size = 0x8
typedef struct {
- /* 0x000 */ EffTireMarkParticle particles[64];
+ /* 0x000 */ EffectTireMarkElement elements[64];
/* 0x600 */ s16 unk600;
- /* 0x602 */ s16 numParticles;
- /* 0x604 */ s16 maxLife;
+ /* 0x602 */ s16 numElements;
+ /* 0x604 */ s16 elemDuration;
/* 0x606 */ Color_RGBA8 color;
- /* 0x60A */ UNK_TYPE1 pad60A[0x2];
-} EffTireMarkParams; // size = 0x60C
-
-typedef struct {
- /* 0x000 */ EffCommon base;
- /* 0x004 */ EffTireMarkParams params;
-} EffTireMark; // size = 0x610
-
-typedef struct {
- /* 0x00 */ u32 paramsSize;
- /* 0x04 */ eff_init_func init;
- /* 0x08 */ eff_destroy_func destroy;
- /* 0x0C */ eff_update_func update;
- /* 0x10 */ eff_draw_func draw;
-} EffInfo; // size = 0x14
+} EffectTireMark; // size = 0x60C
typedef struct {
/* 0x0000 */ struct GlobalContext* globalCtx;
- /* 0x0004 */ EffSpark sparks[SPARK_COUNT];
- /* 0x0E5C */ EffBlure blures[BLURE_COUNT];
- /* 0x388C */ EffShieldParticle shieldParticles[SHIELD_PARTICLE_COUNT];
- /* 0x3DF0 */ EffTireMark tireMarks[TIRE_MARK_COUNT];
-} EffTables; // size = 0x98E0
+ struct {
+ EffectStatus status;
+ EffectSpark effect;
+ } /* 0x0004 */ sparks[SPARK_COUNT];
+ struct {
+ EffectStatus status;
+ EffectBlure effect;
+ } /* 0x0E5C */ blures[BLURE_COUNT];
+ struct {
+ EffectStatus status;
+ EffectShieldParticle effect;
+ } /* 0x388C */ shieldParticles[SHIELD_PARTICLE_COUNT];
+ struct {
+ EffectStatus status;
+ EffectTireMark effect;
+ } /* 0x3DF0 */ tireMarks[TIRE_MARK_COUNT];
+} EffectContext; // size = 0x98E0
+
+typedef struct {
+ /* 0x00 */ u32 size;
+ /* 0x04 */ void (*init)(void* effect, void* initParams);
+ /* 0x08 */ void (*destroy)(void* effect);
+ /* 0x0C */ s32 (*update)(void* effect);
+ /* 0x10 */ void (*draw)(void* effect, struct GraphicsContext* gfxCtx);
+} EffectInfo; // size = 0x14
+
+typedef enum {
+ /* 0x00 */ EFFECT_SPARK,
+ /* 0x01 */ EFFECT_BLURE1,
+ /* 0x02 */ EFFECT_BLURE2,
+ /* 0x03 */ EFFECT_SHIELD_PARTICLE,
+ /* 0x04 */ EFFECT_TIRE_MARK
+} EffectType;
/* Effect Soft Sprites */
diff --git a/include/z64math.h b/include/z64math.h
index 3caad91083..dff6699766 100644
--- a/include/z64math.h
+++ b/include/z64math.h
@@ -85,9 +85,10 @@ typedef struct {
/* 0x06 */ s16 yaw; // azimuthal angle
} VecSph; // size = 0x08
-#define F32_LERP(v0,v1,t) ((1.0f - (t)) * (v0) + (t) * (v1))
-#define F32_LERPIMP(v0, v1, t) (v0 + ((v1 - v0) * t))
-#define F32_LERPIMPINV(v0, v1, t) ((v0) + (((v1) - (v0)) / (t)))
+#define LERPIMP(v0, v1, t) ((v0) + (((v1) - (v0)) * (t)))
+#define F32_LERP(v0, v1, t) ((1.0f - (t)) * (f32)(v0) + (t) * (f32)(v1))
+#define F32_LERPIMP(v0, v1, t) ((f32)(v0) + (((f32)(v1) - (f32)(v0)) * (t)))
+#define F32_LERPIMPINV(v0, v1, t) ((f32)(v0) + (((f32)(v1) - (f32)(v0)) / (t)))
#define BINANG_LERPIMP(v0, v1, t) ((v0) + (s16)(BINANG_SUB((v1), (v0)) * (t)))
#define BINANG_LERPIMPINV(v0, v1, t) ((v0) + BINANG_SUB((v1), (v0)) / (t))
diff --git a/include/z64save.h b/include/z64save.h
index a1ec72ab96..63d0372dc4 100644
--- a/include/z64save.h
+++ b/include/z64save.h
@@ -67,7 +67,7 @@ typedef struct {
/* 0x0039 */ s8 magic; // "magic_now"
/* 0x003A */ s16 rupees; // "lupy_count"
/* 0x003C */ u16 swordHealth; // "long_sword_hp"
- /* 0x003E */ u16 naviTimer; // "navi_timer"
+ /* 0x003E */ u16 tatlTimer; // "navi_timer"
/* 0x0040 */ u8 magicAcquired; // "magic_mode"
/* 0x0041 */ u8 doubleMagic; // "magic_ability"
/* 0x0042 */ u8 doubleDefense; // "life_ability"
diff --git a/spec b/spec
index bdf94ffaf0..90c92ac529 100644
--- a/spec
+++ b/spec
@@ -430,19 +430,17 @@ beginseg
include "build/data/code/code_801E3FA0.bss.o"
include "build/src/code/z_en_item00.o"
include "build/src/code/z_eff_blure.o"
- include "build/data/code/z_eff_blure.data.o"
include "build/src/code/z_eff_shield_particle.o"
- include "build/data/code/z_eff_shield_particle.data.o"
include "build/src/code/z_eff_spark.o"
include "build/src/code/z_eff_ss_dead.o"
include "build/src/code/z_eff_tire_mark.o"
include "build/src/code/z_effect.o"
- include "build/data/code/z_effect.bss.o"
include "build/src/code/z_effect_soft_sprite.o"
include "build/data/code/z_effect_soft_sprite.data.o"
include "build/src/code/z_effect_soft_sprite_old_init.o"
include "build/data/code/z_effect_soft_sprite_old_init.data.o"
include "build/src/code/flg_set.o"
+ include "build/data/code/flg_set.bss.o"
include "build/src/code/pad_801DC9C0.o"
include "build/src/code/z_DLF.o"
include "build/src/code/z_actor.o"
@@ -567,10 +565,7 @@ beginseg
include "build/data/code/db_camera.bss.o"
include "build/data/code/code_801D0B50.data.o"
include "build/src/code/z_kaleido_manager.o"
- include "build/data/code/z_kaleido_manager.data.o"
- include "build/data/code/z_kaleido_manager.bss.o"
include "build/src/code/z_kaleido_scope_call.o"
- include "build/data/code/z_kaleido_scope_call.bss.o"
include "build/src/code/z_fbdemo_dlftbls.o"
include "build/data/code/code_801D0BB0.data.o"
include "build/src/code/z_fbdemo.o"
@@ -641,7 +636,7 @@ beginseg
include "build/data/code/audio_load.bss.o"
include "build/src/code/audio/code_80192BE0.o"
include "build/data/code/code_80192BE0.data.o"
- include "build/src/code/audio/code_80194710.o"
+ include "build/src/code/audio/audio_dcache.o"
include "build/src/code/audio/code_80194790.o"
include "build/data/code/code_80194790.data.o"
include "build/src/code/audio/audio_playback.o"
@@ -741,12 +736,12 @@ beginseg
endseg
beginseg
- name "ovl_Player_Actor"
+ 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/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"
endseg
beginseg
@@ -863,8 +858,7 @@ beginseg
name "ovl_En_Elf"
compress
include "build/src/overlays/actors/ovl_En_Elf/z_en_elf.o"
- include "build/data/ovl_En_Elf/ovl_En_Elf.data.o"
- include "build/data/ovl_En_Elf/ovl_En_Elf.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Elf/ovl_En_Elf_reloc.o"
endseg
beginseg
@@ -1055,9 +1049,11 @@ beginseg
name "ovl_Door_Warp1"
compress
include "build/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.o"
- include "build/data/ovl_Door_Warp1/ovl_Door_Warp1.data.o"
- include "build/data/ovl_Door_Warp1/ovl_Door_Warp1.bss.o"
+#ifdef NON_MATCHING
+ include "build/src/overlays/actors/ovl_Door_Warp1/ovl_Door_Warp1_reloc.o"
+#else
include "build/data/ovl_Door_Warp1/ovl_Door_Warp1.reloc.o"
+#endif
endseg
beginseg
@@ -1280,8 +1276,7 @@ beginseg
name "ovl_En_Bigslime"
compress
include "build/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.o"
- include "build/data/ovl_En_Bigslime/ovl_En_Bigslime.data.o"
- include "build/data/ovl_En_Bigslime/ovl_En_Bigslime.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Bigslime/ovl_En_Bigslime_reloc.o"
endseg
beginseg
@@ -1490,8 +1485,7 @@ beginseg
name "ovl_En_Fz"
compress
include "build/src/overlays/actors/ovl_En_Fz/z_en_fz.o"
- include "build/data/ovl_En_Fz/ovl_En_Fz.data.o"
- include "build/data/ovl_En_Fz/ovl_En_Fz.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Fz/ovl_En_Fz_reloc.o"
endseg
beginseg
@@ -2418,8 +2412,7 @@ beginseg
name "ovl_En_Aob_01"
compress
include "build/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.o"
- include "build/data/ovl_En_Aob_01/ovl_En_Aob_01.data.o"
- include "build/data/ovl_En_Aob_01/ovl_En_Aob_01.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Aob_01/ovl_En_Aob_01_reloc.o"
endseg
beginseg
@@ -2705,8 +2698,11 @@ beginseg
name "ovl_Obj_Iceblock"
compress
include "build/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.o"
- include "build/data/ovl_Obj_Iceblock/ovl_Obj_Iceblock.data.o"
+#ifdef NON_MATCHING
+ include "build/src/overlays/actors/ovl_Obj_Iceblock/ovl_Obj_Iceblock_reloc.o"
+#else
include "build/data/ovl_Obj_Iceblock/ovl_Obj_Iceblock.reloc.o"
+#endif
endseg
beginseg
@@ -4274,8 +4270,7 @@ beginseg
name "ovl_En_Rail_Skb"
compress
include "build/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.o"
- include "build/data/ovl_En_Rail_Skb/ovl_En_Rail_Skb.data.o"
- include "build/data/ovl_En_Rail_Skb/ovl_En_Rail_Skb.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Rail_Skb/ovl_En_Rail_Skb_reloc.o"
endseg
beginseg
@@ -4415,9 +4410,7 @@ beginseg
name "ovl_En_Zog"
compress
include "build/src/overlays/actors/ovl_En_Zog/z_en_zog.o"
- include "build/data/ovl_En_Zog/ovl_En_Zog.data.o"
- include "build/data/ovl_En_Zog/ovl_En_Zog.bss.o"
- include "build/data/ovl_En_Zog/ovl_En_Zog.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Zog/ovl_En_Zog_reloc.o"
endseg
beginseg
@@ -4440,8 +4433,7 @@ beginseg
name "ovl_Bg_Inibs_Movebg"
compress
include "build/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.o"
- include "build/data/ovl_Bg_Inibs_Movebg/ovl_Bg_Inibs_Movebg.data.o"
- include "build/data/ovl_Bg_Inibs_Movebg/ovl_Bg_Inibs_Movebg.reloc.o"
+ include "build/src/overlays/actors/ovl_Bg_Inibs_Movebg/ovl_Bg_Inibs_Movebg_reloc.o"
endseg
beginseg
@@ -4896,8 +4888,7 @@ beginseg
name "ovl_En_Talk"
compress
include "build/src/overlays/actors/ovl_En_Talk/z_en_talk.o"
- include "build/data/ovl_En_Talk/ovl_En_Talk.data.o"
- include "build/data/ovl_En_Talk/ovl_En_Talk.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Talk/ovl_En_Talk_reloc.o"
endseg
beginseg
@@ -5042,8 +5033,7 @@ beginseg
name "ovl_En_Akindonuts"
compress
include "build/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.o"
- include "build/data/ovl_En_Akindonuts/ovl_En_Akindonuts.data.o"
- include "build/data/ovl_En_Akindonuts/ovl_En_Akindonuts.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Akindonuts/ovl_En_Akindonuts_reloc.o"
endseg
beginseg
@@ -5130,8 +5120,7 @@ beginseg
name "ovl_En_Bomjimb"
compress
include "build/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.o"
- include "build/data/ovl_En_Bomjimb/ovl_En_Bomjimb.data.o"
- include "build/data/ovl_En_Bomjimb/ovl_En_Bomjimb.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Bomjimb/ovl_En_Bomjimb_reloc.o"
endseg
beginseg
diff --git a/src/code/audio/audio_dcache.c b/src/code/audio/audio_dcache.c
new file mode 100644
index 0000000000..27f019fef9
--- /dev/null
+++ b/src/code/audio/audio_dcache.c
@@ -0,0 +1,15 @@
+#include "global.h"
+
+void Audio_InvalDCache(void* buf, size_t size) {
+ OSIntMask prevMask = osSetIntMask(1);
+
+ osInvalDCache(buf, size);
+ osSetIntMask(prevMask);
+}
+
+void Audio_WritebackDCache(void* buf, size_t size) {
+ OSIntMask prevMask = osSetIntMask(1);
+
+ osWritebackDCache(buf, size);
+ osSetIntMask(prevMask);
+}
diff --git a/src/code/audio/code_80194710.c b/src/code/audio/code_80194710.c
deleted file mode 100644
index 090c5735b1..0000000000
--- a/src/code/audio/code_80194710.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "global.h"
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80194710/func_80194710.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/code/code_80194710/func_80194750.s")
diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c
index e5cb1ddb16..d7a94da5ba 100644
--- a/src/code/z_bgcheck.c
+++ b/src/code/z_bgcheck.c
@@ -68,10 +68,12 @@ BgSpecialSceneMaxObjects sCustomDynapolyMem[] = {
{ SCENE_21MITURINMAE, 1000, 600, 512 },
};
+// TODO: All these bss variables are localized to one function and can
+// likely be made into in-function static bss variables in the future
char D_801ED950[80];
char D_801ED9A0[80];
Vec3f D_801ED9F0[3]; // polyVerts
-Vec3f D_801EDA18[3]; // polyVerts //not ok, needs to be inlined to match
+Vec3f D_801EDA18[3]; // polyVerts
MtxF D_801EDA40;
Vec3f D_801EDA80[3]; // polyVerts
char D_801EDAA8[80];
@@ -79,8 +81,6 @@ char D_801EDAF8[80];
Vec3f D_801EDB48[3]; // polyVerts
Vec3f D_801EDB70[3];
Plane D_801EDB98;
-Sphere16 D_801EDBA8;
-TriNorm D_801EDBB0;
void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector);
f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast);
@@ -322,40 +322,34 @@ s32 CollisionPoly_CheckYIntersectApprox1(CollisionPoly* poly, Vec3s* vtxList, f3
* Checks if point (`x`,`z`) is within `checkDist` of `poly`, computing `yIntersect` if true
* Determinant max 0.0f (checks if on or within poly)
*/
-#ifdef NON_MATCHING
s32 CollisionPoly_CheckYIntersect(CollisionPoly* poly, Vec3s* vtxList, f32 x, f32 z, f32* yIntersect, f32 checkDist) {
- static Vec3f polyVerts[3]; // D_801EDA18
Vec3s* sVerts;
f32 nx;
f32 ny;
f32 nz;
sVerts = &vtxList[COLPOLY_VTX_INDEX(poly->flags_vIA)];
- polyVerts[0].x = sVerts->x;
- polyVerts[0].y = sVerts->y;
- polyVerts[0].z = sVerts->z;
+ D_801EDA18[0].x = sVerts->x;
+ D_801EDA18[0].y = sVerts->y;
+ D_801EDA18[0].z = sVerts->z;
sVerts = &vtxList[COLPOLY_VTX_INDEX(poly->flags_vIB)];
- polyVerts[1].x = sVerts->x;
- polyVerts[1].y = sVerts->y;
- polyVerts[1].z = sVerts->z;
- sVerts = &vtxList[poly->vIC];
- polyVerts[2].x = sVerts->x;
- polyVerts[2].y = sVerts->y;
- polyVerts[2].z = sVerts->z;
+ D_801EDA18[1].x = sVerts->x;
+ D_801EDA18[1].y = sVerts->y;
+ D_801EDA18[1].z = sVerts->z;
+ sVerts = &vtxList[(s32)poly->vIC];
+ D_801EDA18[2].x = sVerts->x;
+ D_801EDA18[2].y = sVerts->y;
+ D_801EDA18[2].z = sVerts->z;
- if (!func_8017A304(&polyVerts[0], &polyVerts[1], &polyVerts[2], z, x, checkDist)) {
+ if (!func_8017A304(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], z, x, checkDist)) {
return 0;
}
nx = COLPOLY_GET_NORMAL(poly->normal.x);
ny = COLPOLY_GET_NORMAL(poly->normal.y);
nz = COLPOLY_GET_NORMAL(poly->normal.z);
- return Math3D_TriChkPointParaYIntersectInsideTri2(&polyVerts[0], &polyVerts[1], &polyVerts[2], nx, ny, nz,
+ return Math3D_TriChkPointParaYIntersectInsideTri2(&D_801EDA18[0], &D_801EDA18[1], &D_801EDA18[2], nx, ny, nz,
poly->dist, z, x, yIntersect, checkDist);
}
-#else
-s32 CollisionPoly_CheckYIntersect(CollisionPoly* poly, Vec3s* vtxList, f32 x, f32 z, f32* yIntersect, f32 checkDist);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/CollisionPoly_CheckYIntersect.s")
-#endif
s32 CollisionPoly_CheckYIntersectApprox2(CollisionPoly* poly, Vec3s* vtxList, f32 x, f32 z, f32* yIntersect) {
return CollisionPoly_CheckYIntersectApprox1(poly, vtxList, x, z, yIntersect, 1.0f);
@@ -427,8 +421,6 @@ s32 CollisionPoly_LineVsPoly(BgLineVsPolyTest* a0);
#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/CollisionPoly_LineVsPoly.s")
#endif
-#ifdef NON_MATCHING
-// OK but .bss order issues
s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center, f32 radius) {
static Sphere16 sphere; // D_801EDBA8
static TriNorm tri; // D_801EDBB0
@@ -443,12 +435,7 @@ s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center,
sphere.radius = radius;
return Math3D_ColSphereTri(&sphere, &tri, &intersect);
}
-#else
-s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center, f32 radius);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/CollisionPoly_SphVsPoly.s")
-#endif
-#ifdef NON_MATCHING
/**
* Add poly to StaticLookup table
* Table is sorted by poly's smallest y vertex component
@@ -486,6 +473,8 @@ void StaticLookup_AddPolyToSSList(CollisionContext* colCtx, SSList* ssList, Coll
while (true) {
// if at the end of the list
if (curNode->next == SS_NULL) {
+ s32 pad;
+
newNodeId = SSNodeList_GetNextNodeIdx(&colCtx->polyNodes);
SSNode_SetValue(&colCtx->polyNodes.tbl[newNodeId], &polyId, SS_NULL);
curNode->next = newNodeId;
@@ -507,9 +496,6 @@ void StaticLookup_AddPolyToSSList(CollisionContext* colCtx, SSList* ssList, Coll
curNode = nextNode;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/StaticLookup_AddPolyToSSList.s")
-#endif
/**
* Add CollisionPoly to StaticLookup list
@@ -871,28 +857,29 @@ s32 BgCheck_SphVsStaticWall(StaticLookup* lookup, CollisionContext* colCtx, u16
* `outPoly` returns the poly collided with
* `outY` returns the y coordinate needed to not collide with `outPoly`
*/
-#ifdef NON_MATCHING
s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionContext* colCtx, f32* outY, Vec3f* pos,
f32 checkHeight, CollisionPoly** outPoly, Actor* actor) {
s32 result = false;
- // u16 nextId;
CollisionPoly* curPoly;
CollisionPoly* polyList;
- f32 ceilingY;
- Vec3s* vtxList;
- SSNode* curNode;
s32 curPolyId;
+ f32 ceilingY;
+ SSNode* curNode;
+ Vec3s* vtxList;
if (lookup->ceiling.head == SS_NULL) {
return result;
}
- curNode = &colCtx->polyNodes.tbl[lookup->ceiling.head];
polyList = colCtx->colHeader->polyList;
vtxList = colCtx->colHeader->vtxList;
+ curNode = &colCtx->polyNodes.tbl[lookup->ceiling.head];
*outY = pos->y;
while (true) {
+ f32 intersectDist;
+ f32 ny;
+
curPolyId = curNode->polyId;
curPoly = &polyList[curPolyId];
if (COLPOLY_VIA_FLAG_TEST(colCtx->colHeader->polyList[curPolyId].flags_vIA, xpFlags) ||
@@ -908,8 +895,8 @@ s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionConte
}
if (CollisionPoly_CheckYIntersectApprox2(curPoly, vtxList, pos->x, pos->z, &ceilingY)) {
- f32 intersectDist = ceilingY - *outY;
- f32 ny = COLPOLY_GET_NORMAL(curPoly->normal.y);
+ intersectDist = ceilingY - *outY;
+ ny = COLPOLY_GET_NORMAL(curPoly->normal.y);
if (intersectDist > 0 && intersectDist < checkHeight && intersectDist * ny <= 0) {
*outY = ceilingY - checkHeight;
@@ -926,11 +913,6 @@ s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionConte
}
return result;
}
-#else
-s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionContext* colCtx, f32* outY, Vec3f* pos,
- f32 checkHeight, CollisionPoly** outPoly, Actor* actor);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_CheckStaticCeiling.s")
-#endif
/**
* Tests if line `posA` to `posB` intersects with a static poly in list `ssList`. Uses polyCheckTbl
@@ -1049,7 +1031,6 @@ s32 BgCheck_CheckLineInSubdivision(StaticLineTest* arg0) {
* returns true if any poly intersects the sphere, else returns false
* `outPoly` returns the pointer of the first poly found that intersects
*/
-#ifdef NON_MATCHING
s32 BgCheck_SphVsFirstStaticPolyList(SSNode* node, u16 xpFlags, CollisionContext* colCtx, Vec3f* center, f32 radius,
CollisionPoly** outPoly, Actor* actor) {
Vec3s* vtxList;
@@ -1057,7 +1038,6 @@ s32 BgCheck_SphVsFirstStaticPolyList(SSNode* node, u16 xpFlags, CollisionContext
CollisionPoly* curPoly;
u16 nextId;
s16 curPolyId;
- s32 pad;
polyList = colCtx->colHeader->polyList;
vtxList = colCtx->colHeader->vtxList;
@@ -1088,17 +1068,14 @@ s32 BgCheck_SphVsFirstStaticPolyList(SSNode* node, u16 xpFlags, CollisionContext
}
if (node->next != SS_NULL) {
node = &colCtx->polyNodes.tbl[node->next];
+ { s32 pad; }
+
continue;
}
break;
}
return false;
}
-#else
-s32 BgCheck_SphVsFirstStaticPolyList(SSNode* node, u16 xpFlags, CollisionContext* colCtx, Vec3f* center, f32 radius,
- CollisionPoly** outPoly, Actor* actor);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_SphVsFirstStaticPolyList.s")
-#endif
/**
* Get first static poly intersecting sphere `center` `radius` within `lookup`
@@ -1539,16 +1516,12 @@ s32 BgCheck_GetSpecialSceneMaxObjects(GlobalContext* globalCtx, s32* maxNodes, s
/**
* Allocate CollisionContext
*/
-#ifdef NON_MATCHING
void BgCheck_Allocate(CollisionContext* colCtx, GlobalContext* globalCtx, CollisionHeader* colHeader) {
u32 tblMax;
u32 memSize;
u32 lookupTblMemSize;
SSNodeList* nodeList;
- s32 useCustomSubdivisions;
- u32 customMemSize;
s32 customNodeListMax;
- s32 i;
customNodeListMax = -1;
colCtx->colHeader = colHeader;
@@ -1563,6 +1536,10 @@ void BgCheck_Allocate(CollisionContext* colCtx, GlobalContext* globalCtx, Collis
colCtx->subdivAmount.y = 4;
colCtx->subdivAmount.z = 16;
} else {
+ u32 customMemSize;
+ s32 useCustomSubdivisions;
+ s32 i;
+
if (BgCheck_TryGetCustomMemsize(globalCtx->sceneNum, &customMemSize)) {
colCtx->memSize = customMemSize;
} else {
@@ -1631,10 +1608,6 @@ void BgCheck_Allocate(CollisionContext* colCtx, GlobalContext* globalCtx, Collis
DynaPoly_Init(globalCtx, &colCtx->dyna);
DynaPoly_Alloc(globalCtx, &colCtx->dyna);
}
-#else
-void BgCheck_Allocate(CollisionContext* colCtx, GlobalContext* globalCtx, CollisionHeader* colHeader);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_Allocate.s")
-#endif
/**
* Enables CollisionContext wide flags
@@ -2182,7 +2155,6 @@ s32 BgCheck_EntityCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos,
return BgCheck_CheckCeilingImpl(colCtx, COLPOLY_IGNORE_ENTITY, outY, pos, checkHeight, outPoly, outBgId, actor);
}
-#ifdef NON_MATCHING
/**
* Tests if a line from `posA` to `posB` intersects with a poly
* returns true if it does, else false
@@ -2202,12 +2174,9 @@ s32 BgCheck_CheckLineImpl(CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2,
StaticLineTest checkLine;
Vec3f sectorMin;
Vec3f sectorMax;
- s32 k;
+ s32 temp_lo;
StaticLookup* lookup;
s32 j;
- StaticLookup* jLookup;
- s32 temp_lo;
- s32 pad[2];
lookupTbl = colCtx->lookupTbl;
posBTemp = *posB;
@@ -2247,11 +2216,15 @@ s32 BgCheck_CheckLineImpl(CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2,
sectorMax.z = colCtx->subdivLength.z + sectorMin.z;
for (i = subdivMin[2]; i < subdivMax[2] + 1; i++) {
- jLookup = iLookup + subdivMin[1] * colCtx->subdivAmount.x;
+ StaticLookup* jLookup = iLookup + subdivMin[1] * colCtx->subdivAmount.x;
+ s32 pad;
+
sectorMin.y = subdivMin[1] * colCtx->subdivLength.y + colCtx->minBounds.y;
sectorMax.y = colCtx->subdivLength.y + sectorMin.y;
for (j = subdivMin[1]; j < subdivMax[1] + 1; j++) {
+ s32 k;
+
lookup = jLookup + subdivMin[0];
sectorMin.x = subdivMin[0] * colCtx->subdivLength.x + colCtx->minBounds.x;
sectorMax.x = colCtx->subdivLength.x + sectorMin.x;
@@ -2292,9 +2265,6 @@ s32 BgCheck_CheckLineImpl(CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2,
}
return result;
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_CheckLineImpl.s")
-#endif
/**
* Get bccFlags
@@ -3373,8 +3343,6 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_RaycastFloorDyna.s")
#endif
-#ifdef NON_MATCHING
-// regalloc, minor instruction ordering
/**
* Performs collision detection on a BgActor's wall polys on sphere `pos`, `radius`
* returns true if a collision was detected
@@ -3401,8 +3369,6 @@ s32 BgCheck_SphVsDynaWallInBgActor(CollisionContext* colCtx, u16 xpFlags, DynaCo
f32 invNormalXZ;
f32 planeDist;
f32 temp_f18;
- f32 zIntersectDist;
- f32 xIntersectDist;
f32 zMin;
f32 zMax;
f32 xMin;
@@ -3472,6 +3438,8 @@ s32 BgCheck_SphVsDynaWallInBgActor(CollisionContext* colCtx, u16 xpFlags, DynaCo
}
}
if (CollisionPoly_CheckZIntersectApprox(poly, dyna->vtxList, resultPos.x, pos->y, &intersect)) {
+ s32 pad;
+
if (fabsf(intersect - resultPos.z) <= radius / temp_f18) {
if ((intersect - resultPos.z) * nz <= 4.0f) {
if (BgCheck_ComputeWallDisplacement(colCtx, poly, &resultPos.x, &resultPos.z, nx, ny, nz,
@@ -3547,7 +3515,8 @@ s32 BgCheck_SphVsDynaWallInBgActor(CollisionContext* colCtx, u16 xpFlags, DynaCo
}
if (CollisionPoly_CheckXIntersectApprox(poly, dyna->vtxList, pos->y, resultPos.z, &intersect)) {
- xIntersectDist = intersect - resultPos.x;
+ f32 xIntersectDist = intersect - resultPos.x;
+
if (fabsf(xIntersectDist) <= radius / temp_f18) {
if (xIntersectDist * nx <= 4.0f) {
if (BgCheck_ComputeWallDisplacement(colCtx, poly, &resultPos.x, &resultPos.z, nx, ny, nz,
@@ -3567,12 +3536,6 @@ s32 BgCheck_SphVsDynaWallInBgActor(CollisionContext* colCtx, u16 xpFlags, DynaCo
*outZ = resultPos.z;
return result;
}
-#else
-s32 BgCheck_SphVsDynaWallInBgActor(CollisionContext* colCtx, u16 xpFlags, DynaCollisionContext* dyna, SSList* ssList,
- f32* outX, f32* outZ, CollisionPoly** outPoly, s32* outBgId, Vec3f* pos, f32 radius,
- s32 bgId, Actor* actor);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_bgcheck/BgCheck_SphVsDynaWallInBgActor.s")
-#endif
/**
* Performs collision detection on all dyna poly walls using sphere `pos`, `radius`
diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c
index e11e6cbd74..44885d6c77 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -27,12 +27,12 @@ Vec3f D_801EE1C0;
Vec3f D_801EE1D0;
Vec3f D_801EE1E0;
Vec3f D_801EE1F0;
-EffSparkParams D_801EE200;
+EffectSparkInit D_801EE200;
TriNorm D_801EE6C8;
TriNorm D_801EE700;
-EffSparkParams D_801EE738;
-EffSparkParams D_801EEC00;
-EffSparkParams D_801EF0C8;
+EffectSparkInit D_801EE738;
+EffectSparkInit D_801EEC00;
+EffectSparkInit D_801EF0C8;
TriNorm D_801EF590;
TriNorm D_801EF5C8;
TriNorm D_801EF600;
@@ -1382,14 +1382,14 @@ void CollisionCheck_NoBlood(GlobalContext* globalCtx, Collider* collider, Vec3f*
#ifdef NON_MATCHING
// needs in-function static bss
void CollisionCheck_BlueBlood(GlobalContext* globalCtx, Collider* collider, Vec3f* v) {
- static EffSparkParams D_801EEC00;
+ static EffectSparkInit D_801EEC00;
s32 effectIndex;
D_801EEC00.position.x = v->x;
D_801EEC00.position.x = v->y;
D_801EEC00.position.x = v->z;
- D_801EEC00.particleFactor1 = 5;
- D_801EEC00.particleFactor2 = 5;
+ D_801EEC00.uDiv = 5;
+ D_801EEC00.vDiv = 5;
D_801EEC00.colorStart[0].r = 10;
D_801EEC00.colorStart[0].g = 10;
D_801EEC00.colorStart[0].b = 200;
@@ -1422,12 +1422,12 @@ void CollisionCheck_BlueBlood(GlobalContext* globalCtx, Collider* collider, Vec3
D_801EEC00.colorEnd[3].g = 0;
D_801EEC00.colorEnd[3].b = 64;
D_801EEC00.colorEnd[3].a = 0;
- D_801EEC00.age = 0;
+ D_801EEC00.timer = 0;
D_801EEC00.duration = 16;
- D_801EEC00.velocity = 8.0f;
+ D_801EEC00.speed = 8.0f;
D_801EEC00.gravity = -1.0f;
- Effect_Add(globalCtx, &effectIndex, 0, 0, 1, &D_801EEC00);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SPARK, 0, 1, &D_801EEC00);
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/CollisionCheck_BlueBlood.s")
@@ -1440,14 +1440,14 @@ void CollisionCheck_BlueBlood(GlobalContext* globalCtx, Collider* collider, Vec3
#ifdef NON_MATCHING
// needs in-function static bss
void CollisionCheck_GreenBlood(GlobalContext* globalCtx, Collider* collider, Vec3f* v) {
- static EffSparkParams D_801EF0C8;
+ static EffectSparkInit D_801EF0C8;
s32 effectIndex;
D_801EF0C8.position.x = v->x;
D_801EF0C8.position.x = v->y;
D_801EF0C8.position.x = v->z;
- D_801EF0C8.particleFactor1 = 5;
- D_801EF0C8.particleFactor2 = 5;
+ D_801EF0C8.uDiv = 5;
+ D_801EF0C8.vDiv = 5;
D_801EF0C8.colorStart[0].r = 10;
D_801EF0C8.colorStart[0].g = 200;
D_801EF0C8.colorStart[0].b = 10;
@@ -1480,11 +1480,11 @@ void CollisionCheck_GreenBlood(GlobalContext* globalCtx, Collider* collider, Vec
D_801EF0C8.colorEnd[3].g = 64;
D_801EF0C8.colorEnd[3].b = 0;
D_801EF0C8.colorEnd[3].a = 0;
- D_801EF0C8.age = 0;
+ D_801EF0C8.timer = 0;
D_801EF0C8.duration = 16;
- D_801EF0C8.velocity = 8.0f;
+ D_801EF0C8.speed = 8.0f;
D_801EF0C8.gravity = -1.0f;
- Effect_Add(globalCtx, &effectIndex, 0, 0, 1, &D_801EF0C8);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SPARK, 0, 1, &D_801EF0C8);
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/CollisionCheck_GreenBlood.s")
@@ -3751,14 +3751,14 @@ void Collider_UpdateSphere(s32 limb, ColliderSphere* collider) {
#ifdef NON_MATCHING
// needs in-function static bss
void CollisionCheck_SpawnRedBlood(GlobalContext* globalCtx, Vec3f* v) {
- static EffSparkParams D_801EE200;
+ static EffectSparkInit D_801EE200;
s32 effectIndex;
D_801EE200.position.x = v->x;
D_801EE200.position.x = v->y;
D_801EE200.position.x = v->z;
- D_801EE200.particleFactor1 = 5;
- D_801EE200.particleFactor2 = 5;
+ D_801EE200.uDiv = 5;
+ D_801EE200.vDiv = 5;
D_801EE200.colorStart[0].r = 128;
D_801EE200.colorStart[0].g = 0;
D_801EE200.colorStart[0].b = 64;
@@ -3791,12 +3791,12 @@ void CollisionCheck_SpawnRedBlood(GlobalContext* globalCtx, Vec3f* v) {
D_801EE200.colorEnd[3].g = 0;
D_801EE200.colorEnd[3].b = 64;
D_801EE200.colorEnd[3].a = 0;
- D_801EE200.age = 0;
+ D_801EE200.timer = 0;
D_801EE200.duration = 16;
- D_801EE200.velocity = 8.0f;
+ D_801EE200.speed = 8.0f;
D_801EE200.gravity = -1.0f;
- Effect_Add(globalCtx, &effectIndex, 0, 0, 1, &D_801EE200);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SPARK, 0, 1, &D_801EE200);
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/CollisionCheck_SpawnRedBlood.s")
@@ -3809,14 +3809,14 @@ void CollisionCheck_SpawnRedBlood(GlobalContext* globalCtx, Vec3f* v) {
#ifdef NON_MATCHING
// needs in-function static bss
void CollisionCheck_SpawnWaterDroplets(GlobalContext* globalCtx, Vec3f* v) {
- static EffSparkParams D_801EE738;
+ static EffectSparkInit D_801EE738;
s32 effectIndex;
D_801EE738.position.x = v->x;
D_801EE738.position.x = v->y;
D_801EE738.position.x = v->z;
- D_801EE738.particleFactor1 = 5;
- D_801EE738.particleFactor2 = 5;
+ D_801EE738.uDiv = 5;
+ D_801EE738.vDiv = 5;
D_801EE738.colorStart[0].r = 255;
D_801EE738.colorStart[0].g = 255;
D_801EE738.colorStart[0].b = 255;
@@ -3849,12 +3849,12 @@ void CollisionCheck_SpawnWaterDroplets(GlobalContext* globalCtx, Vec3f* v) {
D_801EE738.colorEnd[3].g = 0;
D_801EE738.colorEnd[3].b = 0;
D_801EE738.colorEnd[3].a = 0;
- D_801EE738.age = 0;
+ D_801EE738.timer = 0;
D_801EE738.duration = 16;
- D_801EE738.velocity = 8.0f;
+ D_801EE738.speed = 8.0f;
D_801EE738.gravity = -1.0f;
- Effect_Add(globalCtx, &effectIndex, 0, 0, 1, &D_801EE738);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SPARK, 0, 1, &D_801EE738);
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_collision_check/CollisionCheck_SpawnWaterDroplets.s")
@@ -3864,7 +3864,7 @@ void CollisionCheck_SpawnWaterDroplets(GlobalContext* globalCtx, Vec3f* v) {
* Spawns streaks of light from hits against solid objects
*/
void CollisionCheck_SpawnShieldParticles(GlobalContext* globalCtx, Vec3f* v) {
- static EffShieldParticleInit shieldParticleInitMetal = {
+ static EffectShieldParticleInit shieldParticleInitMetal = {
16,
{ 0, 0, 0 },
{ 0, 200, 255, 255 },
@@ -3889,7 +3889,7 @@ void CollisionCheck_SpawnShieldParticles(GlobalContext* globalCtx, Vec3f* v) {
shieldParticleInitMetal.lightPoint.y = shieldParticleInitMetal.position.y;
shieldParticleInitMetal.lightPoint.z = shieldParticleInitMetal.position.z;
- Effect_Add(globalCtx, &effectIndex, 3, 0, 1, &shieldParticleInitMetal);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &shieldParticleInitMetal);
}
/**
@@ -3919,7 +3919,7 @@ void CollisionCheck_SpawnShieldParticlesMetal2(GlobalContext* globalCtx, Vec3f*
* Spawns streaks of light and makes a wooden sound
*/
void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* globalCtx, Vec3f* v, Vec3f* pos) {
- static EffShieldParticleInit shieldParticleInitWood = {
+ static EffectShieldParticleInit shieldParticleInitWood = {
16,
{ 0, 0, 0 },
{ 0, 200, 255, 255 },
@@ -3944,7 +3944,7 @@ void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* globalCtx, Vec3f* v,
shieldParticleInitWood.lightPoint.y = shieldParticleInitWood.position.y;
shieldParticleInitWood.lightPoint.z = shieldParticleInitWood.position.z;
- Effect_Add(globalCtx, &effectIndex, 3, 0, 1, &shieldParticleInitWood);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &shieldParticleInitWood);
func_8019F1C0(pos, NA_SE_IT_REFLECTION_WOOD);
}
diff --git a/src/code/z_debug_display.c b/src/code/z_debug_display.c
index a62d4ddb9e..ab3478fa1c 100644
--- a/src/code/z_debug_display.c
+++ b/src/code/z_debug_display.c
@@ -116,7 +116,7 @@ void func_800E992C(GlobalContext* globalCtx, s32 arg1) {
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C560(globalCtx->state.gfxCtx);
- gSPMatrix(POLY_XLU_DISP++, &D_801D1DE0, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, func_800E99B0(globalCtx->state.gfxCtx, arg1));
CLOSE_DISPS(globalCtx->state.gfxCtx);
diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c
index 17685de15d..8875343662 100644
--- a/src/code/z_eff_blure.c
+++ b/src/code/z_eff_blure.c
@@ -1,27 +1,18 @@
#include "global.h"
-#ifdef NON_MATCHING
-void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
+void EffectBlure_AddVertex(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
EffectBlureElement* elem;
s32 numElements;
- Vec3f sp16C;
- Vec3f sp160;
- Vec3f sp154;
- f32 scale;
- MtxF sp110;
- MtxF spD0;
- MtxF sp90;
- MtxF sp50;
- Vec3f sp44;
- Vec3f sp38;
+
+ if (this) {}
+ if (this) {}
if (this != NULL) {
- numElements = this->numElements;
- if (numElements >= 16) {
+ if (this->numElements >= ARRAY_COUNT(this->elements)) {
return;
}
- elem = &this->elements[numElements];
+ elem = &this->elements[this->numElements];
elem->state = 1;
if (!(this->flags & 2)) {
@@ -32,6 +23,17 @@ void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
elem->p2.y = p2->y;
elem->p2.z = p2->z;
} else {
+ Vec3f sp16C;
+ Vec3f sp160;
+ Vec3f sp154;
+ f32 scale;
+ MtxF sp110;
+ MtxF spD0;
+ MtxF sp90;
+ MtxF sp50;
+ Vec3f sp44;
+ Vec3f sp38;
+
sp16C.x = ((f32)(elem - 1)->p2.x + (f32)(elem - 1)->p1.x) * 0.5f;
sp16C.y = ((f32)(elem - 1)->p2.y + (f32)(elem - 1)->p1.y) * 0.5f;
sp16C.z = ((f32)(elem - 1)->p2.z + (f32)(elem - 1)->p1.z) * 0.5f;
@@ -41,7 +43,7 @@ void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
Math_Vec3f_Diff(&sp160, &sp16C, &sp154);
scale = Math3D_Vec3fMagnitude(&sp154);
- if (!(fabsf(scale) < D_801DC080)) {
+ if (!(fabsf(scale) < 0.008f)) {
scale = 1.0f / scale;
Math_Vec3f_Scale(&sp154, scale);
@@ -66,40 +68,977 @@ void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
this->numElements++;
}
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A81F0.s")
-#endif
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A8514.s")
+void EffectBlure_AddSpace(EffectBlure* this) {
+ EffectBlureElement* elem;
+ s32 numElements;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Initcommon.s")
+ if (this != NULL) {
+ numElements = this->numElements;
+ if (numElements >= ARRAY_COUNT(this->elements)) {
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Init1.s")
+ elem = &this->elements[numElements];
+ elem->state = 0;
+ elem->timer = 1;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Init2.s")
+ this->numElements++;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Destroy.s")
+void EffectBlure_InitElements(EffectBlure* this) {
+ EffectBlureElement* elem;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Update.s")
+ this->numElements = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A8C78.s")
+ for (i = 0; i < ARRAY_COUNT(this->elements); i++) {
+ elem = &this->elements[i];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A8DE8.s")
+ elem->state = 2;
+ elem->p1.x = 0;
+ elem->p1.y = 0;
+ elem->p1.z = 0;
+ elem->p2.x = 0;
+ elem->p2.y = 0;
+ elem->p2.z = 0;
+ elem->timer = 0;
+ elem->flags = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A92FC.s")
+void EffectBlure_Init1(void* thisx, void* initParamsx) {
+ EffectBlure* this = (EffectBlure*)thisx;
+ EffectBlureInit1* initParams = (EffectBlureInit1*)initParamsx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A9330.s")
+ if ((this != NULL) && (initParams != NULL)) {
+ 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];
+ this->elemDuration = initParams->elemDuration;
+ this->unkFlag = initParams->unkFlag;
+ this->calcMode = initParams->calcMode;
+ this->flags = 0;
+ this->addAngleChange = 0;
+ this->addAngle = 0;
+ this->drawMode = 0;
+ this->altPrimColor.r = 0;
+ this->altPrimColor.g = 0;
+ this->altPrimColor.b = 0;
+ this->altPrimColor.a = 0;
+ this->altEnvColor.r = 0;
+ this->altEnvColor.g = 0;
+ this->altEnvColor.b = 0;
+ this->altEnvColor.a = 0;
+ this->mode4Param = 1.0f;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800A9804.s")
+void EffectBlure_Init2(void* thisx, void* initParamsx) {
+ EffectBlure* this = (EffectBlure*)thisx;
+ EffectBlureInit2* initParams = (EffectBlureInit2*)initParamsx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800AA190.s")
+ if ((this != NULL) && (initParams != NULL)) {
+ 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];
+ this->elemDuration = initParams->elemDuration;
+ this->unkFlag = initParams->unkFlag;
+ this->calcMode = initParams->calcMode;
+ this->flags = initParams->flags;
+ this->drawMode = initParams->drawMode;
+ this->addAngleChange = initParams->addAngleChange;
+ this->addAngle = 0;
+ this->mode4Param = initParams->mode4Param;
+ this->altPrimColor = initParams->altPrimColor;
+ this->altEnvColor = initParams->altEnvColor;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800AA460.s")
+void EffectBlure_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800AA498.s")
+s32 EffectBlure_Update(void* thisx) {
+ EffectBlure* this = (EffectBlure*)thisx;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800AA700.s")
+ if (this == NULL) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/func_800AABE0.s")
+ if (this->numElements == 0) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_blure/EffectBlure_Draw.s")
+ while (true) {
+ if (this->elements[0].state == 0) {
+ for (i = 0; i < ARRAY_COUNT(this->elements) - 1; i++) {
+ this->elements[i] = this->elements[i + 1];
+ }
+
+ this->elements[i].state = 2;
+ this->elements[i].p1.x = 0;
+ this->elements[i].p1.y = 0;
+ this->elements[i].p1.z = 0;
+ this->elements[i].p2.x = 0;
+ this->elements[i].p2.y = 0;
+ this->elements[i].p2.z = 0;
+ this->elements[i].flags = 0;
+ this->elements[i].timer = 0;
+
+ this->numElements--;
+ if (this->numElements <= 0) {
+ this->numElements = 0;
+ return 0;
+ }
+ } else {
+ break;
+ }
+ }
+
+ if (this->elements[0].state == 2) {
+ return 0;
+ }
+
+ for (i = 0; i < this->numElements; i++) {
+ this->elements[i].timer++;
+ }
+
+ if (this->elemDuration < this->elements[0].timer) {
+ for (i = 0; i < ARRAY_COUNT(this->elements) - 1; i++) {
+ this->elements[i] = this->elements[i + 1];
+ if (this->elements[i].timer >= this->elemDuration) {
+ this->elements[i].timer = this->elemDuration;
+ }
+ }
+
+ this->elements[i].state = 2;
+ this->elements[i].p1.x = 0;
+ this->elements[i].p1.y = 0;
+ this->elements[i].p1.z = 0;
+ this->elements[i].p2.x = 0;
+ this->elements[i].p2.y = 0;
+ this->elements[i].p2.z = 0;
+ this->elements[i].flags = 0;
+ this->elements[i].timer = 0;
+
+ this->numElements--;
+ if (this->numElements <= 0) {
+ this->numElements = 0;
+ return 0;
+ }
+ return 0;
+ }
+
+ for (i = 0; i < this->numElements; i++) {
+ if (this->elements[i].timer >= this->elemDuration) {
+ this->elements[i].timer = this->elemDuration;
+ }
+ }
+
+ this->addAngle += this->addAngleChange;
+ return 0;
+}
+
+void EffectBlure_UpdateFlags(EffectBlureElement* elem) {
+ Vec3f sp64;
+ Vec3f sp58;
+ Vec3f sp4C;
+ Vec3f sp40;
+ EffectBlureElement* prev = elem - 1;
+ EffectBlureElement* next = elem + 1;
+ f32 sp34;
+ f32 sp30;
+ f32 sp2C;
+
+ if (((elem - 1)->state == 0) || ((elem + 1)->state == 0)) {
+ elem->flags &= ~3;
+ elem->flags |= 2;
+ } else {
+ Math_Vec3s_DiffToVec3f(&sp64, &elem->p1, &prev->p1);
+ Math_Vec3s_DiffToVec3f(&sp58, &elem->p2, &prev->p2);
+ Math_Vec3s_DiffToVec3f(&sp4C, &next->p1, &elem->p1);
+ Math_Vec3s_DiffToVec3f(&sp40, &next->p2, &elem->p2);
+
+ if (Math3D_AngleBetweenVectors(&sp64, &sp4C, &sp34) || Math3D_AngleBetweenVectors(&sp58, &sp40, &sp30) ||
+ Math3D_AngleBetweenVectors(&sp4C, &sp40, &sp2C)) {
+ elem->flags &= ~3;
+ elem->flags |= 0;
+ } else if ((sp34 <= -0.5f) || (sp30 <= -0.5f) || (sp2C <= 0.7071f)) {
+ elem->flags &= ~3;
+ elem->flags |= 0;
+ } else {
+ elem->flags &= ~3;
+ elem->flags |= 1;
+ }
+ }
+}
+
+void EffectBlure_GetComputedValues(EffectBlure* this, s32 index, f32 ratio, Vec3s* vec1, Vec3s* vec2,
+ Color_RGBA8* color1, Color_RGBA8* color2) {
+ Vec3s sp30;
+ f32 mode4Param;
+ EffectBlureElement* elem = &this->elements[index];
+
+ switch (this->calcMode) {
+ case 1:
+ vec1->x = func_800B09D0(elem->p1.x, elem->p2.x, ratio);
+ vec1->y = func_800B09D0(elem->p1.y, elem->p2.y, ratio);
+ vec1->z = func_800B09D0(elem->p1.z, elem->p2.z, ratio);
+ vec2->x = elem->p2.x;
+ vec2->y = elem->p2.y;
+ vec2->z = elem->p2.z;
+ break;
+
+ case 2:
+ vec1->x = elem->p1.x;
+ vec1->y = elem->p1.y;
+ vec1->z = elem->p1.z;
+ vec2->x = func_800B09D0(elem->p2.x, elem->p1.x, ratio);
+ vec2->y = func_800B09D0(elem->p2.y, elem->p1.y, ratio);
+ vec2->z = func_800B09D0(elem->p2.z, elem->p1.z, ratio);
+ break;
+
+ case 3:
+ ratio *= 0.5f;
+ vec1->x = func_800B09D0(elem->p1.x, elem->p2.x, ratio);
+ vec1->y = func_800B09D0(elem->p1.y, elem->p2.y, ratio);
+ vec1->z = func_800B09D0(elem->p1.z, elem->p2.z, ratio);
+ vec2->x = func_800B09D0(elem->p2.x, elem->p1.x, ratio);
+ vec2->y = func_800B09D0(elem->p2.y, elem->p1.y, ratio);
+ vec2->z = func_800B09D0(elem->p2.z, elem->p1.z, ratio);
+ ratio *= 2.0f;
+ break;
+
+ case 4:
+ sp30.x = elem->p1.x - elem->p2.x;
+ sp30.y = elem->p1.y - elem->p2.y;
+ sp30.z = elem->p1.z - elem->p2.z;
+ mode4Param = this->mode4Param - 1.0f;
+
+ vec1->x = (sp30.x * 0.5f * mode4Param * ratio) + elem->p1.x;
+ vec1->y = (sp30.y * 0.5f * mode4Param * ratio) + elem->p1.y;
+ if (1) {} // Necessary to match
+ vec1->z = (sp30.z * 0.5f * mode4Param * ratio) + elem->p1.z;
+
+ vec2->x = -(sp30.x * 0.5f * mode4Param * ratio) + elem->p2.x;
+ vec2->y = -(sp30.y * 0.5f * mode4Param * ratio) + elem->p2.y;
+ vec2->z = -(sp30.z * 0.5f * mode4Param * ratio) + elem->p2.z;
+ break;
+
+ case 0:
+ default:
+ vec1->x = elem->p1.x;
+ vec1->y = elem->p1.y;
+ vec1->z = elem->p1.z;
+ vec2->x = elem->p2.x;
+ vec2->y = elem->p2.y;
+ vec2->z = elem->p2.z;
+ break;
+ }
+
+ sp30 = sp30; // Optimized out but seems necessary to match stack usage
+
+ if (this->flags & 0x10) {
+ 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);
+ }
+}
+
+void EffectBlure_SetupSmooth(EffectBlure* this, GraphicsContext* gfxCtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectBlure_DrawElemNoInterpolation(EffectBlure* this, EffectBlureElement* elem, s32 index,
+ GraphicsContext* gfxCtx) {
+ static Vtx_t baseVtx = VTX_T(0, 0, 0, 0, 0, 255, 255, 255, 255);
+ Vtx* vtx;
+ Vec3s sp8C;
+ Vec3s sp84;
+ f32 ratio;
+ Color_RGBA8 sp7C;
+ Color_RGBA8 sp78;
+ Vec3f sp6C;
+ Vec3f sp60;
+ Vec3f sp54;
+
+ OPEN_DISPS(gfxCtx);
+
+ Math_Vec3s_ToVec3f(&sp6C, &this->elements[0].p2);
+
+ vtx = GRAPH_ALLOC(gfxCtx, sizeof(Vtx[4]));
+ if (vtx == NULL) {
+ } else {
+ vtx[0].v = baseVtx;
+ vtx[1].v = baseVtx;
+ vtx[2].v = baseVtx;
+ vtx[3].v = baseVtx;
+
+ ratio = (f32)elem->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index, ratio, &sp8C, &sp84, &sp7C, &sp78);
+
+ sp60.x = sp84.x;
+ sp60.y = sp84.y;
+ sp60.z = sp84.z;
+ Math_Vec3f_Diff(&sp60, &sp6C, &sp54);
+ Math_Vec3f_Scale(&sp54, 10.0f);
+ vtx[0].v.ob[0] = sp54.x;
+ vtx[0].v.ob[1] = sp54.y;
+ vtx[0].v.ob[2] = sp54.z;
+ vtx[0].v.cn[0] = sp78.r;
+ vtx[0].v.cn[1] = sp78.g;
+ vtx[0].v.cn[2] = sp78.b;
+ vtx[0].v.cn[3] = sp78.a;
+
+ sp60.x = sp8C.x;
+ sp60.y = sp8C.y;
+ sp60.z = sp8C.z;
+ Math_Vec3f_Diff(&sp60, &sp6C, &sp54);
+ Math_Vec3f_Scale(&sp54, 10.0f);
+ vtx[1].v.ob[0] = sp54.x;
+ vtx[1].v.ob[1] = sp54.y;
+ vtx[1].v.ob[2] = sp54.z;
+ vtx[1].v.cn[0] = sp7C.r;
+ vtx[1].v.cn[1] = sp7C.g;
+ vtx[1].v.cn[2] = sp7C.b;
+ vtx[1].v.cn[3] = sp7C.a;
+
+ ratio = (f32)(elem + 1)->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index + 1, ratio, &sp8C, &sp84, &sp7C, &sp78);
+
+ sp60.x = sp8C.x;
+ sp60.y = sp8C.y;
+ sp60.z = sp8C.z;
+ Math_Vec3f_Diff(&sp60, &sp6C, &sp54);
+ Math_Vec3f_Scale(&sp54, 10.0f);
+ vtx[2].v.ob[0] = sp54.x;
+ vtx[2].v.ob[1] = sp54.y;
+ vtx[2].v.ob[2] = sp54.z;
+ vtx[2].v.cn[0] = sp7C.r;
+ vtx[2].v.cn[1] = sp7C.g;
+ vtx[2].v.cn[2] = sp7C.b;
+ vtx[2].v.cn[3] = sp7C.a;
+
+ sp60.x = sp84.x;
+ sp60.y = sp84.y;
+ sp60.z = sp84.z;
+ Math_Vec3f_Diff(&sp60, &sp6C, &sp54);
+ Math_Vec3f_Scale(&sp54, 10.0f);
+ vtx[3].v.ob[0] = sp54.x;
+ vtx[3].v.ob[1] = sp54.y;
+ vtx[3].v.ob[2] = sp54.z;
+ vtx[3].v.cn[0] = sp78.r;
+ vtx[3].v.cn[1] = sp78.g;
+ vtx[3].v.cn[2] = sp78.b;
+ vtx[3].v.cn[3] = sp78.a;
+
+ gSPVertex(POLY_XLU_DISP++, vtx, 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 2, 0, 0, 2, 3, 0);
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElement* elem, s32 index,
+ GraphicsContext* gfxCtx) {
+ static Vtx_t baseVtx = VTX_T(0, 0, 0, 0, 0, 255, 255, 255, 255);
+ Vtx* vtx;
+ Vec3s sp1EC;
+ Vec3s sp1E4;
+ f32 ratio;
+ Color_RGBA8 sp1DC;
+ Color_RGBA8 sp1D8;
+ Vec3f sp1CC;
+ Vec3f sp1C0;
+ Vec3f sp1B4;
+ Vec3f sp1A8;
+ Color_RGBA8 sp1A4;
+ Color_RGBA8 sp1A0;
+ Color_RGBA8 sp19C;
+ Color_RGBA8 sp198;
+ Vec3f sp18C;
+ Vec3f sp180;
+ Vec3f sp174;
+ Vec3f sp168;
+ s32 i;
+ Vec3f sp158;
+ Vec3f sp14C;
+ Color_RGBA8 sp148;
+ Color_RGBA8 sp144;
+ Vec3f sp138;
+
+ OPEN_DISPS(gfxCtx);
+
+ Math_Vec3s_ToVec3f(&sp138, &this->elements[0].p2);
+
+ ratio = (f32)elem->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index, ratio, &sp1EC, &sp1E4, &sp1A4, &sp1A0);
+ Math_Vec3s_ToVec3f(&sp1CC, &sp1EC);
+ Math_Vec3s_ToVec3f(&sp1C0, &sp1E4);
+
+ ratio = (f32)(elem + 1)->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index + 1, ratio, &sp1EC, &sp1E4, &sp19C, &sp198);
+ Math_Vec3s_ToVec3f(&sp18C, &sp1EC);
+ Math_Vec3s_ToVec3f(&sp180, &sp1E4);
+
+ if ((elem->flags & 3) == 2) {
+ Math_Vec3f_Diff(&sp18C, &sp1CC, &sp1B4);
+ Math_Vec3f_Diff(&sp180, &sp1C0, &sp1A8);
+ } else {
+ Vec3f sp118;
+ Vec3f sp10C;
+
+ ratio = (f32)(elem - 1)->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index - 1, ratio, &sp1EC, &sp1E4, &sp1DC, &sp1D8);
+ Math_Vec3s_ToVec3f(&sp118, &sp1EC);
+ Math_Vec3s_ToVec3f(&sp10C, &sp1E4);
+ Math_Vec3f_Diff(&sp18C, &sp118, &sp1B4);
+ Math_Vec3f_Diff(&sp180, &sp10C, &sp1A8);
+ }
+
+ Math_Vec3f_Scale(&sp1B4, 0.5f);
+ Math_Vec3f_Scale(&sp1A8, 0.5f);
+
+ if (((elem + 1)->flags & 3) == 2) {
+ Math_Vec3f_Diff(&sp18C, &sp1CC, &sp174);
+ Math_Vec3f_Diff(&sp180, &sp1C0, &sp168);
+ } else {
+ Vec3f sp100;
+ Vec3f spF4;
+
+ ratio = (f32)(elem + 2)->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, index + 2, ratio, &sp1EC, &sp1E4, &sp1DC, &sp1D8);
+ Math_Vec3s_ToVec3f(&sp100, &sp1EC);
+ Math_Vec3s_ToVec3f(&spF4, &sp1E4);
+ Math_Vec3f_Diff(&sp100, &sp1CC, &sp174);
+ Math_Vec3f_Diff(&spF4, &sp1C0, &sp168);
+ }
+
+ Math_Vec3f_Scale(&sp174, 0.5f);
+ Math_Vec3f_Scale(&sp168, 0.5f);
+
+ vtx = GRAPH_ALLOC(gfxCtx, sizeof(Vtx[16]));
+ if (vtx == NULL) {
+ } else {
+ Math_Vec3f_Diff(&sp1CC, &sp138, &sp158);
+ Math_Vec3f_Scale(&sp158, 10.0f);
+ Math_Vec3f_Diff(&sp1C0, &sp138, &sp14C);
+ Math_Vec3f_Scale(&sp14C, 10.0f);
+
+ Color_RGBA8_Copy(&sp148, &sp1A4);
+ Color_RGBA8_Copy(&sp144, &sp1A0);
+
+ 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.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.cn[0] = sp144.r;
+ vtx[1].v.cn[1] = sp144.g;
+ vtx[1].v.cn[2] = sp144.b;
+ vtx[1].v.cn[3] = sp144.a;
+
+ for (i = 1; i < 8; i++) {
+ s32 j1 = 2 * i;
+ s32 j2 = 2 * i + 1;
+ Vec3f spE0;
+ f32 temp_f28 = i / 7.0f; // t
+ f32 temp_f0 = SQ(temp_f28); // t^2
+ f32 temp_f2 = temp_f0 * temp_f28; // t^3
+ f32 temp_f20 = temp_f2 - temp_f0; // t^3 - t^2
+ f32 temp_f22 = temp_f2 - 2.0f * temp_f0 + temp_f28; // t^3 - 2t^2 + t
+ f32 temp_f24 = 2.0f * temp_f2 - temp_f0 * 3.0f + 1.0f; // 2t^3 - 3t^2 + 1
+ f32 temp_f26 = temp_f0 * 3.0f - 2.0f * temp_f2; // 3t^2 - 2t^3
+ s32 pad1;
+ s32 pad2;
+
+ // p = (2t^3 - 3t^2 + 1)p0 + (3t^2 - 2t^3)p1 + (t^3 - 2t^2 + t)m0 + (t^3 - t^2)m1
+ spE0.x = (temp_f24 * sp1CC.x) + (temp_f26 * sp18C.x) + (temp_f22 * sp1B4.x) + (temp_f20 * sp174.x);
+ spE0.y = (temp_f24 * sp1CC.y) + (temp_f26 * sp18C.y) + (temp_f22 * sp1B4.y) + (temp_f20 * sp174.y);
+ spE0.z = (temp_f24 * sp1CC.z) + (temp_f26 * sp18C.z) + (temp_f22 * sp1B4.z) + (temp_f20 * sp174.z);
+ Math_Vec3f_Diff(&spE0, &sp138, &sp158);
+ Math_Vec3f_Scale(&sp158, 10.0f);
+
+ spE0.x = (temp_f24 * sp1C0.x) + (temp_f26 * sp180.x) + (temp_f22 * sp1A8.x) + (temp_f20 * sp168.x);
+ spE0.y = (temp_f24 * sp1C0.y) + (temp_f26 * sp180.y) + (temp_f22 * sp1A8.y) + (temp_f20 * sp168.y);
+ spE0.z = (temp_f24 * sp1C0.z) + (temp_f26 * sp180.z) + (temp_f22 * sp1A8.z) + (temp_f20 * sp168.z);
+ Math_Vec3f_Diff(&spE0, &sp138, &sp14C);
+ Math_Vec3f_Scale(&sp14C, 10.0f);
+
+ 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.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.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);
+ vtx[j2].v.cn[3] = func_800B0A24(sp1A0.a, sp198.a, temp_f28);
+ }
+
+ gSPVertex(POLY_XLU_DISP++, vtx, 16, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 2, 3, 5, 0, 2, 5, 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 4, 5, 7, 0, 4, 7, 6, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 6, 7, 9, 0, 6, 9, 8, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 8, 9, 11, 0, 8, 11, 10, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 10, 11, 13, 0, 10, 13, 12, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 12, 13, 15, 0, 12, 15, 14, 0);
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectBlure_DrawSmooth(EffectBlure* this2, GraphicsContext* gfxCtx) {
+ EffectBlure* this = this2;
+ EffectBlureElement* elem;
+ s32 i;
+ MtxF spDC;
+ MtxF sp9C;
+ MtxF sp5C;
+ Mtx* mtx;
+
+ OPEN_DISPS(gfxCtx);
+
+ if (this->numElements < 2) {
+ return;
+ }
+
+ this->elements[0].flags &= ~3;
+ this->elements[0].flags |= 2;
+
+ for (elem = &this->elements[1]; elem < this->elements + this->numElements - 1; elem++) {
+ EffectBlure_UpdateFlags(elem);
+ }
+
+ this->elements[this->numElements - 1].flags &= ~3;
+ this->elements[this->numElements - 1].flags |= 2;
+
+ EffectBlure_SetupSmooth(this, gfxCtx);
+ SkinMatrix_SetTranslate(&spDC, this->elements[0].p2.x, this->elements[0].p2.y, this->elements[0].p2.z);
+ SkinMatrix_SetScale(&sp9C, 0.1f, 0.1f, 0.1f);
+ SkinMatrix_MtxFMtxFMult(&spDC, &sp9C, &sp5C);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp5C);
+ if (mtx == NULL) {
+ return;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ for (i = 0, elem = &this->elements[0]; elem < this->elements + this->numElements - 1; i++, elem++) {
+ if ((elem->state == 0) || ((elem + 1)->state == 0)) {
+ continue;
+ }
+ if ((((elem->flags & 3) == 0) && (((elem + 1)->flags & 3) == 0)) ||
+ (((elem->flags & 3) == 2) && (((elem + 1)->flags & 3) == 0)) ||
+ (((elem->flags & 3) == 0) && (((elem + 1)->flags & 3) == 2)) ||
+ (((elem->flags & 3) == 2) && (((elem + 1)->flags & 3) == 2))) {
+ EffectBlure_DrawElemNoInterpolation(this, elem, i, gfxCtx);
+ } else {
+ EffectBlure_DrawElemHermiteInterpolation(this, elem, i, gfxCtx);
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectBlure_SetupSimple(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) {
+ OPEN_DISPS(gfxCtx);
+
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectBlure_SetupSimpleAlt(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) {
+ OPEN_DISPS(gfxCtx);
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+
+ gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
+ gDPSetTextureLUT(POLY_XLU_DISP++, G_TT_NONE);
+ gSPTexture(POLY_XLU_DISP++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
+
+ gDPLoadTextureBlock(POLY_XLU_DISP++, D_04014570, G_IM_FMT_I, G_IM_SIZ_8b, 64, 32, 0, G_TX_NOMIRROR | G_TX_CLAMP,
+ G_TX_NOMIRROR | G_TX_WRAP, 6, 5, G_TX_NOLOD, G_TX_NOLOD);
+
+ gDPSetCombineLERP(POLY_XLU_DISP++, TEXEL0, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE,
+ ENVIRONMENT, COMBINED, ENVIRONMENT, 0, 0, 0, COMBINED);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ gDPSetEnvColor(POLY_XLU_DISP++, this->altEnvColor.r, this->altEnvColor.g, this->altEnvColor.b, this->altEnvColor.a);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void (*sSetupHandlers[])(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) = {
+ EffectBlure_SetupSimple,
+ EffectBlure_SetupSimpleAlt,
+};
+
+s32 D_801AE268 = 0; // unused
+
+void EffectBlure_DrawSimpleVertices(GraphicsContext* gfxCtx, EffectBlure* this, Vtx* vtx) {
+ Mtx* mtx;
+
+ OPEN_DISPS(gfxCtx);
+
+ sSetupHandlers[this->drawMode](gfxCtx, this, vtx);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ {
+ Vec3f sp1B0;
+ Vec3f sp1A4;
+ Vec3f sp198;
+ f32 alphaRatio;
+ MtxF sp154;
+ MtxF sp114;
+ MtxF spD4;
+ MtxF sp94;
+ f32 scale;
+ s32 i;
+ s32 j;
+
+ j = 0;
+
+ for (i = 0; i < this->numElements - 1; i++) {
+ 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,
+ this->altPrimColor.b, this->altPrimColor.a * (1.0f - alphaRatio));
+ 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);
+ }
+ }
+
+ j += 4;
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+Vtx_t D_801AE26C[] = {
+ VTX_T(0, 0, 0, 0, 1024, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 0, 0, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 2048, 1024, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 2048, 0, 255, 255, 255, 255),
+};
+
+Vtx_t D_801AE2AC[] = {
+ VTX_T(0, 0, 0, 2048, 1024, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 2048, 0, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 2048, 1024, 255, 255, 255, 255),
+ VTX_T(0, 0, 0, 2048, 0, 255, 255, 255, 255),
+};
+
+void EffectBlure_DrawSimple(EffectBlure* this2, GraphicsContext* gfxCtx) {
+ EffectBlure* this = this2;
+ Vtx* vtx;
+ Vtx* vtxIter;
+ EffectBlureElement* elem;
+ s32 vtxCount;
+ s32 i;
+ s32 j;
+ Vec3s sp74;
+ Vec3s sp6C;
+ f32 ratio;
+ Color_RGBA8 sp64;
+ Color_RGBA8 sp60;
+
+ if (this->numElements >= 2) {
+ vtxCount = this->numElements * 4;
+
+ vtx = GRAPH_ALLOC(gfxCtx, ALIGN16(vtxCount * sizeof(Vtx)));
+ if (vtx == NULL) {
+ return;
+ }
+
+ vtxIter = vtx;
+ for (i = 0; i < 4; i++) {
+ vtxIter->v = D_801AE26C[i];
+ vtxIter++;
+ }
+
+ if (this->numElements >= 2) {
+ for (elem = this->elements; elem < this->elements + this->numElements - 2; elem++) {
+ for (i = 0; i < 4; i++) {
+ vtxIter->v = D_801AE2AC[i];
+ vtxIter++;
+ }
+ }
+ }
+
+ for (i = 0; i < this->numElements; i++) {
+ elem = &this->elements[i];
+
+ ratio = (f32)elem->timer / (f32)this->elemDuration;
+ EffectBlure_GetComputedValues(this, i, ratio, &sp74, &sp6C, &sp64, &sp60);
+
+ j = i * 4 - 2;
+ if (j >= 0) {
+ vtx[j].v.ob[0] = sp74.x;
+ vtx[j].v.ob[1] = sp74.y;
+ vtx[j].v.ob[2] = sp74.z;
+ vtx[j].v.cn[0] = sp64.r;
+ vtx[j].v.cn[1] = sp64.g;
+ vtx[j].v.cn[2] = sp64.b;
+ vtx[j].v.cn[3] = sp64.a;
+ }
+
+ j++;
+ if (j >= 0) {
+ vtx[j].v.ob[0] = sp6C.x;
+ vtx[j].v.ob[1] = sp6C.y;
+ vtx[j].v.ob[2] = sp6C.z;
+ vtx[j].v.cn[0] = sp60.r;
+ vtx[j].v.cn[1] = sp60.g;
+ vtx[j].v.cn[2] = sp60.b;
+ vtx[j].v.cn[3] = sp60.a;
+ }
+
+ j++;
+ if (vtxCount >= j) {
+ vtx[j].v.ob[0] = sp74.x;
+ vtx[j].v.ob[1] = sp74.y;
+ vtx[j].v.ob[2] = sp74.z;
+ vtx[j].v.cn[0] = sp64.r;
+ vtx[j].v.cn[1] = sp64.g;
+ vtx[j].v.cn[2] = sp64.b;
+ vtx[j].v.cn[3] = sp64.a;
+ }
+
+ j++;
+ if (vtxCount >= j) {
+ vtx[j].v.ob[0] = sp6C.x;
+ vtx[j].v.ob[1] = sp6C.y;
+ vtx[j].v.ob[2] = sp6C.z;
+ vtx[j].v.cn[0] = sp60.r;
+ vtx[j].v.cn[1] = sp60.g;
+ vtx[j].v.cn[2] = sp60.b;
+ vtx[j].v.cn[3] = sp60.a;
+ }
+ }
+
+ EffectBlure_DrawSimpleVertices(gfxCtx, this, vtx);
+ }
+}
+
+void EffectBlure_Draw(void* thisx, GraphicsContext* gfxCtx) {
+ EffectBlure* this = (EffectBlure*)thisx;
+ Vtx* vtx;
+ EffectBlureElement* elem;
+ s32 i;
+ s32 j;
+ s32 phi_t2;
+
+ OPEN_DISPS(gfxCtx);
+
+ gSPMatrix(POLY_XLU_DISP++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (this->numElements != 0) {
+ if (this->flags == 0) {
+ func_8012C560(gfxCtx);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ vtx = GRAPH_ALLOC(gfxCtx, sizeof(Vtx[32]));
+ if (vtx == NULL) {
+ } else {
+ j = 0;
+ for (i = 0; i < this->numElements; i++) {
+ elem = &this->elements[i];
+
+ if (elem->state == 1) {
+ f32 ratio = (f32)elem->timer / (f32)this->elemDuration;
+
+ switch (this->calcMode) {
+ case 1:
+ vtx[j].v.ob[0] = func_800B09D0(elem->p1.x, elem->p2.x, ratio);
+ vtx[j].v.ob[1] = func_800B09D0(elem->p1.y, elem->p2.y, ratio);
+ vtx[j].v.ob[2] = func_800B09D0(elem->p1.z, elem->p2.z, ratio);
+ vtx[j + 1].v.ob[0] = elem->p2.x;
+ vtx[j + 1].v.ob[1] = elem->p2.y;
+ vtx[j + 1].v.ob[2] = elem->p2.z;
+ break;
+ case 2:
+ vtx[j].v.ob[0] = elem->p1.x;
+ vtx[j].v.ob[1] = elem->p1.y;
+ vtx[j].v.ob[2] = elem->p1.z;
+ vtx[j + 1].v.ob[0] = func_800B09D0(elem->p2.x, elem->p1.x, ratio);
+ vtx[j + 1].v.ob[1] = func_800B09D0(elem->p2.y, elem->p1.y, ratio);
+ vtx[j + 1].v.ob[2] = func_800B09D0(elem->p2.z, elem->p1.z, ratio);
+ break;
+ case 3:
+ ratio *= 0.5f;
+ vtx[j].v.ob[0] = func_800B09D0(elem->p1.x, elem->p2.x, ratio);
+ vtx[j].v.ob[1] = func_800B09D0(elem->p1.y, elem->p2.y, ratio);
+ vtx[j].v.ob[2] = func_800B09D0(elem->p1.z, elem->p2.z, ratio);
+ vtx[j + 1].v.ob[0] = func_800B09D0(elem->p2.x, elem->p1.x, ratio);
+ vtx[j + 1].v.ob[1] = func_800B09D0(elem->p2.y, elem->p1.y, ratio);
+ vtx[j + 1].v.ob[2] = func_800B09D0(elem->p2.z, elem->p1.z, ratio);
+ ratio *= 2.0f;
+ break;
+ case 0:
+ default:
+ vtx[j].v.ob[0] = elem->p1.x;
+ vtx[j].v.ob[1] = elem->p1.y;
+ vtx[j].v.ob[2] = elem->p1.z;
+ vtx[j + 1].v.ob[0] = elem->p2.x;
+ vtx[j + 1].v.ob[1] = elem->p2.y;
+ vtx[j + 1].v.ob[2] = elem->p2.z;
+ break;
+ }
+
+ 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);
+ 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);
+ j++;
+ }
+ }
+
+ phi_t2 = 0;
+ j = 0;
+
+ gSPVertex(POLY_XLU_DISP++, vtx, 32, 0);
+
+ for (i = 0; i < this->numElements; i++) {
+ elem = &this->elements[i];
+
+ if (elem->state == 0) {
+ phi_t2 = 0;
+ } else {
+ if (phi_t2 == 0) {
+ phi_t2 = 1;
+ } else {
+ gSP1Quadrangle(POLY_XLU_DISP++, j - 2, j - 1, j + 1, j, 0);
+
+ if (this->unkFlag == 1) {
+ phi_t2 = 0;
+ }
+ }
+ j += 2;
+ }
+ }
+ }
+ } else if (this->drawMode < 2) {
+ EffectBlure_DrawSimple(this, gfxCtx);
+ } else {
+ EffectBlure_DrawSmooth(this, gfxCtx);
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/code/z_eff_shield_particle.c b/src/code/z_eff_shield_particle.c
index 29d93a7159..05669d63ad 100644
--- a/src/code/z_eff_shield_particle.c
+++ b/src/code/z_eff_shield_particle.c
@@ -1,11 +1,207 @@
#include "global.h"
+#include "vt.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Init.s")
+#include "assets/code/eff_shield_particle/eff_shield_particle.c"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Destroy.s")
+void EffectShieldParticle_Init(void* thisx, void* initParamsx) {
+ EffectShieldParticle* this = (EffectShieldParticle*)thisx;
+ EffectShieldParticleInit* initParams = (EffectShieldParticleInit*)initParamsx;
+ EffectShieldParticleElement* elem;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Update.s")
+ if ((this != NULL) && (initParams != NULL)) {
+ this->numElements = initParams->numElements;
+ if (this->numElements > ARRAY_COUNT(this->elements)) {
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_CalculateColors.s")
+ this->position = initParams->position;
+ this->primColorStart = initParams->primColorStart;
+ this->envColorStart = initParams->envColorStart;
+ this->primColorMid = initParams->primColorMid;
+ this->envColorMid = initParams->envColorMid;
+ this->primColorEnd = initParams->primColorEnd;
+ this->envColorEnd = initParams->envColorEnd;
+ this->deceleration = initParams->deceleration;
+ this->maxInitialSpeed = initParams->maxInitialSpeed;
+ this->lengthCutoff = initParams->lengthCutoff;
+ this->duration = initParams->duration;
+ this->timer = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Draw.s")
+ for (elem = &this->elements[0]; elem < &this->elements[this->numElements]; elem++) {
+ elem->initialSpeed = (Rand_ZeroOne() * (this->maxInitialSpeed * 0.5f)) + (this->maxInitialSpeed * 0.5f);
+ elem->endX = 0.0f;
+ elem->startXChange = 0.0f;
+ elem->startX = 0.0f;
+ elem->endXChange = elem->initialSpeed;
+ elem->yaw = Rand_ZeroOne() * 65534.0f;
+ elem->pitch = Rand_ZeroOne() * 65534.0f;
+ }
+
+ this->lightDecay = initParams->lightDecay;
+ if (this->lightDecay == true) {
+ this->lightInfo.type = LIGHT_POINT_NOGLOW;
+ this->lightInfo.params.point = initParams->lightPoint;
+ this->lightNode =
+ LightContext_InsertLight(Effect_GetGlobalCtx(), &Effect_GetGlobalCtx()->lightCtx, &this->lightInfo);
+ } else {
+ this->lightNode = NULL;
+ }
+ }
+}
+
+void EffectShieldParticle_Destroy(void* thisx) {
+ EffectShieldParticle* this = (EffectShieldParticle*)thisx;
+
+ if ((this != NULL) && (this->lightDecay == true)) {
+ if (this->lightNode == Effect_GetGlobalCtx()->lightCtx.listHead) {
+ Effect_GetGlobalCtx()->lightCtx.listHead = this->lightNode->next;
+ }
+ LightContext_RemoveLight(Effect_GetGlobalCtx(), &Effect_GetGlobalCtx()->lightCtx, this->lightNode);
+ }
+}
+
+s32 EffectShieldParticle_Update(void* thisx) {
+ EffectShieldParticle* this = (EffectShieldParticle*)thisx;
+ EffectShieldParticleElement* elem;
+
+ if (this == NULL) {
+ return 0;
+ }
+
+ for (elem = &this->elements[0]; elem < &this->elements[this->numElements]; elem++) {
+ elem->endXChange -= this->deceleration;
+ if (elem->endXChange < 0.0f) {
+ elem->endXChange = 0.0f;
+ }
+
+ if (elem->startXChange > 0.0f) {
+ elem->startXChange -= this->deceleration;
+ if (elem->startXChange < 0.0f) {
+ elem->startXChange = 0.0f;
+ }
+ }
+
+ elem->endX += elem->endXChange;
+ elem->startX += elem->startXChange;
+
+ if ((elem->startXChange == 0.0f) && (this->lengthCutoff < (elem->endX - elem->startX))) {
+ elem->startXChange = elem->initialSpeed;
+ }
+ }
+
+ if (this->lightDecay == true) {
+ this->lightInfo.params.point.radius /= 2;
+ }
+
+ this->timer++;
+
+ if (this->duration < this->timer) {
+ return 1;
+ }
+
+ return 0;
+}
+
+void EffectShieldParticle_GetColors(EffectShieldParticle* this, Color_RGBA8* primColor, Color_RGBA8* envColor) {
+ s32 halfDuration = this->duration * 0.5f;
+
+ if (halfDuration == 0) {
+ primColor->r = this->primColorStart.r;
+ primColor->g = this->primColorStart.g;
+ primColor->b = this->primColorStart.b;
+ primColor->a = this->primColorStart.a;
+ envColor->r = this->envColorStart.r;
+ envColor->g = this->envColorStart.g;
+ envColor->b = this->envColorStart.b;
+ envColor->a = this->envColorStart.a;
+ } else if (this->timer < halfDuration) {
+ f32 ratio = this->timer / (f32)halfDuration;
+
+ primColor->r = LERPIMP(this->primColorStart.r, this->primColorMid.r, ratio);
+ primColor->g = LERPIMP(this->primColorStart.g, this->primColorMid.g, ratio);
+ primColor->b = LERPIMP(this->primColorStart.b, this->primColorMid.b, ratio);
+ primColor->a = LERPIMP(this->primColorStart.a, this->primColorMid.a, ratio);
+ envColor->r = LERPIMP(this->envColorStart.r, this->envColorMid.r, ratio);
+ envColor->g = LERPIMP(this->envColorStart.g, this->envColorMid.g, ratio);
+ envColor->b = LERPIMP(this->envColorStart.b, this->envColorMid.b, ratio);
+ envColor->a = LERPIMP(this->envColorStart.a, this->envColorMid.a, ratio);
+ } else {
+ f32 ratio = (this->timer - halfDuration) / (f32)halfDuration;
+
+ primColor->r = LERPIMP(this->primColorMid.r, this->primColorEnd.r, ratio);
+ primColor->g = LERPIMP(this->primColorMid.g, this->primColorEnd.g, ratio);
+ primColor->b = LERPIMP(this->primColorMid.b, this->primColorEnd.b, ratio);
+ primColor->a = LERPIMP(this->primColorMid.a, this->primColorEnd.a, ratio);
+ envColor->r = LERPIMP(this->envColorMid.r, this->envColorEnd.r, ratio);
+ envColor->g = LERPIMP(this->envColorMid.g, this->envColorEnd.g, ratio);
+ envColor->b = LERPIMP(this->envColorMid.b, this->envColorEnd.b, ratio);
+ envColor->a = LERPIMP(this->envColorMid.a, this->envColorEnd.a, ratio);
+ }
+}
+
+void EffectShieldParticle_Draw(void* thisx, GraphicsContext* gfxCtx) {
+ EffectShieldParticle* this = (EffectShieldParticle*)thisx;
+ EffectShieldParticleElement* elem;
+ Color_RGBA8 primColor;
+ Color_RGBA8 envColor;
+
+ OPEN_DISPS(gfxCtx);
+
+ if (this != NULL) {
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x26);
+
+ gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gSPTexture(POLY_XLU_DISP++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
+
+ gDPLoadTextureBlock(POLY_XLU_DISP++, D_04054F20, 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);
+
+ gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, PRIMITIVE, 0, TEXEL0, 0, 0, 0,
+ 0, COMBINED, 0, 0, 0, COMBINED);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
+
+ EffectShieldParticle_GetColors(this, &primColor, &envColor);
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, primColor.r, primColor.g, primColor.b, primColor.a);
+ gDPSetEnvColor(POLY_XLU_DISP++, envColor.r, envColor.g, envColor.b, envColor.a);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ for (elem = &this->elements[0]; elem < &this->elements[this->numElements]; elem++) {
+ Mtx* mtx;
+ MtxF sp104;
+ MtxF spC4;
+ MtxF sp84;
+ f32 temp1 = (elem->endX + elem->startX) * 0.5f;
+ f32 temp2 = elem->endX - elem->startX;
+ f32 temp3 = (temp2 * (1.0f / 64.0f)) / 0.02f;
+
+ if (temp3 < 1.0f) {
+ temp3 = 1.0f;
+ }
+
+ SkinMatrix_SetTranslate(&spC4, this->position.x, this->position.y, this->position.z);
+ SkinMatrix_SetRotateRPY(&sp104, 0, elem->yaw, 0);
+ SkinMatrix_MtxFMtxFMult(&spC4, &sp104, &sp84);
+ SkinMatrix_SetRotateRPY(&sp104, 0, 0, elem->pitch);
+ SkinMatrix_MtxFMtxFMult(&sp84, &sp104, &spC4);
+ SkinMatrix_SetTranslate(&sp104, temp1, 0.0f, 0.0f);
+ SkinMatrix_MtxFMtxFMult(&spC4, &sp104, &sp84);
+ SkinMatrix_SetScale(&sp104, temp3 * 0.02f, 0.02f, 0.02f);
+ SkinMatrix_MtxFMtxFMult(&sp84, &sp104, &spC4);
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &spC4);
+ if (mtx == NULL) {
+ break;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_XLU_DISP++, sEffShieldParticleVtx, 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 0, 1, 2, 0, 0, 3, 1, 0);
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/code/z_eff_spark.c b/src/code/z_eff_spark.c
index d06bc4b276..27ed1443db 100644
--- a/src/code/z_eff_spark.c
+++ b/src/code/z_eff_spark.c
@@ -1,9 +1,265 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_spark/EffectSpark_Init.s")
+void EffectSpark_Init(void* thisx, void* initParamsx) {
+ EffectSpark* this = (EffectSpark*)thisx;
+ EffectSparkInit* initParams = (EffectSparkInit*)initParamsx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_spark/EffectSpark_Destroy.s")
+ f32 velocityNorm;
+ s32 i;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_spark/EffectSpark_Update.s")
+ if ((this != NULL) && (initParams != NULL)) {
+ if ((initParams->uDiv == 0) || (initParams->vDiv == 0)) {
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_spark/EffectSpark_Draw.s")
+ this->position = initParams->position;
+ this->speed = initParams->speed;
+ this->gravity = initParams->gravity;
+ this->uDiv = initParams->uDiv;
+ this->vDiv = initParams->vDiv;
+ this->colorStart[0].r = initParams->colorStart[0].r;
+ this->colorStart[0].g = initParams->colorStart[0].g;
+ this->colorStart[0].b = initParams->colorStart[0].b;
+ this->colorStart[0].a = initParams->colorStart[0].a;
+ this->colorStart[1].r = initParams->colorStart[1].r;
+ this->colorStart[1].g = initParams->colorStart[1].g;
+ this->colorStart[1].b = initParams->colorStart[1].b;
+ this->colorStart[1].a = initParams->colorStart[1].a;
+ this->colorStart[2].r = initParams->colorStart[2].r;
+ this->colorStart[2].g = initParams->colorStart[2].g;
+ this->colorStart[2].b = initParams->colorStart[2].b;
+ this->colorStart[2].a = initParams->colorStart[2].a;
+ this->colorStart[3].r = initParams->colorStart[3].r;
+ this->colorStart[3].g = initParams->colorStart[3].g;
+ this->colorStart[3].b = initParams->colorStart[3].b;
+ this->colorStart[3].a = initParams->colorStart[3].a;
+ this->colorEnd[0].r = initParams->colorEnd[0].r;
+ this->colorEnd[0].g = initParams->colorEnd[0].g;
+ this->colorEnd[0].b = initParams->colorEnd[0].b;
+ this->colorEnd[0].a = initParams->colorEnd[0].a;
+ this->colorEnd[1].r = initParams->colorEnd[1].r;
+ this->colorEnd[1].g = initParams->colorEnd[1].g;
+ this->colorEnd[1].b = initParams->colorEnd[1].b;
+ this->colorEnd[1].a = initParams->colorEnd[1].a;
+ this->colorEnd[2].r = initParams->colorEnd[2].r;
+ this->colorEnd[2].g = initParams->colorEnd[2].g;
+ this->colorEnd[2].b = initParams->colorEnd[2].b;
+ this->colorEnd[2].a = initParams->colorEnd[2].a;
+ this->colorEnd[3].r = initParams->colorEnd[3].r;
+ this->colorEnd[3].g = initParams->colorEnd[3].g;
+ this->colorEnd[3].b = initParams->colorEnd[3].b;
+ this->colorEnd[3].a = initParams->colorEnd[3].a;
+ this->duration = initParams->duration;
+
+ this->numElements = (this->uDiv * this->vDiv) + 2;
+ if (this->numElements > ARRAY_COUNT(this->elements)) {
+ return;
+ }
+
+ for (i = 0; i < this->numElements; i++) {
+ EffectSparkElement* elem = &this->elements[i];
+
+ elem->position.x = this->position.x;
+ elem->position.y = this->position.y;
+ elem->position.z = this->position.z;
+ elem->velocity.x = Rand_ZeroOne() - 0.5f;
+ elem->velocity.y = Rand_ZeroOne() - 0.5f;
+ elem->velocity.z = Rand_ZeroOne() - 0.5f;
+
+ velocityNorm = sqrtf(SQXYZ(elem->velocity));
+
+ if (!(fabsf(velocityNorm) < 0.008f)) {
+ elem->velocity.x *= this->speed * (1.0f / velocityNorm);
+ elem->velocity.y *= this->speed * (1.0f / velocityNorm);
+ elem->velocity.z *= this->speed * (1.0f / velocityNorm);
+ } else {
+ elem->velocity.x = elem->velocity.z = 0.0f;
+ elem->velocity.y = this->speed;
+ }
+
+ elem->unkVelocity.x = 30000.0f - Rand_ZeroOne() * 15000.0f;
+ elem->unkVelocity.y = 30000.0f - Rand_ZeroOne() * 15000.0f;
+ elem->unkVelocity.z = 30000.0f - Rand_ZeroOne() * 15000.0f;
+ elem->unkPosition.x = Rand_ZeroOne() * 65534.0f;
+ elem->unkPosition.y = Rand_ZeroOne() * 65534.0f;
+ elem->unkPosition.z = Rand_ZeroOne() * 65534.0f;
+ }
+
+ this->timer = 0;
+ }
+}
+
+void EffectSpark_Destroy(void* thisx) {
+}
+
+s32 EffectSpark_Update(void* thisx) {
+ EffectSpark* this = (EffectSpark*)thisx;
+ EffectSparkElement* elem;
+ s32 i;
+
+ for (i = 0; i < this->numElements; i++) {
+ elem = &this->elements[i];
+
+ elem->position.x += elem->velocity.x;
+ elem->position.y += elem->velocity.y;
+ elem->position.z += elem->velocity.z;
+ elem->velocity.y += this->gravity;
+ elem->unkPosition.x += elem->unkVelocity.x;
+ elem->unkPosition.y += elem->unkVelocity.y;
+ elem->unkPosition.z += elem->unkVelocity.z;
+ }
+
+ this->timer++;
+
+ if (this->duration < this->timer) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void EffectSpark_Draw(void* thisx, GraphicsContext* gfxCtx) {
+ Vtx* vertices;
+ EffectSpark* this = (EffectSpark*)thisx;
+ GlobalContext* globalCtx = Effect_GetGlobalCtx();
+ s32 i;
+ s32 j;
+ u8 sp1D3;
+ u8 sp1D2;
+ u8 sp1D1;
+ u8 sp1D0;
+ u8 sp1CF;
+ u8 sp1CE;
+ u8 sp1CD;
+ u8 sp1CC;
+ u8 sp1CB;
+ u8 sp1CA;
+ u8 sp1C9;
+ u8 sp1C8;
+ u8 sp1C7;
+ u8 sp1C6;
+ u8 sp1C5;
+ u8 sp1C4;
+ f32 ratio;
+
+ OPEN_DISPS(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);
+ gDPSetCycleType(POLY_XLU_DISP++, G_CYC_2CYCLE);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ gSPTexture(POLY_XLU_DISP++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
+ gDPLoadTextureBlock(POLY_XLU_DISP++, D_04054F20, 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);
+
+ gDPSetCombineMode(POLY_XLU_DISP++, G_CC_SHADEDECALA, G_CC_PASS2);
+ gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+ gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR);
+ gSPSetGeometryMode(POLY_XLU_DISP++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ vertices = GRAPH_ALLOC(gfxCtx, ALIGN16(this->numElements * sizeof(Vtx[4])));
+ if (vertices == NULL) {
+ goto end;
+ }
+
+ j = 0;
+
+ ratio = (f32)this->timer / (f32)this->duration;
+ sp1D3 = F32_LERPIMP(this->colorStart[0].r, this->colorEnd[0].r, ratio);
+ sp1D2 = F32_LERPIMP(this->colorStart[0].g, this->colorEnd[0].g, ratio);
+ sp1D1 = F32_LERPIMP(this->colorStart[0].b, this->colorEnd[0].b, ratio);
+ sp1D0 = F32_LERPIMP(this->colorStart[0].a, this->colorEnd[0].a, ratio);
+ sp1CF = F32_LERPIMP(this->colorStart[1].r, this->colorEnd[1].r, ratio);
+ sp1CE = F32_LERPIMP(this->colorStart[1].g, this->colorEnd[1].g, ratio);
+ sp1CD = F32_LERPIMP(this->colorStart[1].b, this->colorEnd[1].b, ratio);
+ sp1CC = F32_LERPIMP(this->colorStart[1].a, this->colorEnd[1].a, ratio);
+ sp1CB = F32_LERPIMP(this->colorStart[2].r, this->colorEnd[2].r, ratio);
+ sp1CA = F32_LERPIMP(this->colorStart[2].g, this->colorEnd[2].g, ratio);
+ sp1C9 = F32_LERPIMP(this->colorStart[2].b, this->colorEnd[2].b, ratio);
+ sp1C8 = F32_LERPIMP(this->colorStart[2].a, this->colorEnd[2].a, ratio);
+ sp1C7 = F32_LERPIMP(this->colorStart[3].r, this->colorEnd[3].r, ratio);
+ sp1C6 = F32_LERPIMP(this->colorStart[3].g, this->colorEnd[3].g, ratio);
+ sp1C5 = F32_LERPIMP(this->colorStart[3].b, this->colorEnd[3].b, ratio);
+ sp1C4 = F32_LERPIMP(this->colorStart[3].a, this->colorEnd[3].a, ratio);
+
+ for (i = 0; i < this->numElements; i++) {
+ MtxF sp12C;
+ MtxF spEC;
+ MtxF spAC;
+ MtxF sp6C;
+ EffectSparkElement* elem = &this->elements[i];
+ Mtx* mtx;
+ f32 temp;
+
+ SkinMatrix_SetTranslate(&spEC, elem->position.x, elem->position.y, elem->position.z);
+ temp = ((Rand_ZeroOne() * 2.5f) + 1.5f) / 64.0f;
+ SkinMatrix_SetScale(&spAC, temp, temp, 1.0f);
+ SkinMatrix_MtxFMtxFMult(&spEC, &globalCtx->billboardMtxF, &sp6C);
+ SkinMatrix_MtxFMtxFMult(&sp6C, &spAC, &sp12C);
+
+ vertices[j].v.ob[0] = -32;
+ vertices[j].v.ob[1] = -32;
+ vertices[j].v.ob[2] = 0;
+ vertices[j].v.cn[0] = sp1D3;
+ vertices[j].v.cn[1] = sp1D2;
+ vertices[j].v.cn[2] = sp1D1;
+ vertices[j].v.cn[3] = sp1D0;
+ vertices[j].v.tc[0] = 0;
+ vertices[j].v.tc[1] = 1024;
+ vertices[j].v.flag = 0;
+
+ vertices[j + 1].v.ob[0] = 32;
+ vertices[j + 1].v.ob[1] = 32;
+ vertices[j + 1].v.ob[2] = 0;
+ vertices[j + 1].v.cn[0] = sp1CF;
+ vertices[j + 1].v.cn[1] = sp1CE;
+ vertices[j + 1].v.cn[2] = sp1CD;
+ vertices[j + 1].v.cn[3] = sp1CC;
+ vertices[j + 1].v.tc[0] = 1024;
+ vertices[j + 1].v.tc[1] = 0;
+ vertices[j + 1].v.flag = 0;
+
+ vertices[j + 2].v.ob[0] = -32;
+ vertices[j + 2].v.ob[1] = 32;
+ vertices[j + 2].v.ob[2] = 0;
+ vertices[j + 2].v.cn[0] = sp1CB;
+ vertices[j + 2].v.cn[1] = sp1CA;
+ vertices[j + 2].v.cn[2] = sp1C9;
+ vertices[j + 2].v.cn[3] = sp1C8;
+ vertices[j + 2].v.tc[0] = 0;
+ vertices[j + 2].v.tc[1] = 0;
+ vertices[j + 2].v.flag = 0;
+
+ vertices[j + 3].v.ob[0] = 32;
+ vertices[j + 3].v.ob[1] = -32;
+ vertices[j + 3].v.ob[2] = 0;
+ vertices[j + 3].v.cn[0] = sp1C7;
+ vertices[j + 3].v.cn[1] = sp1C6;
+ vertices[j + 3].v.cn[2] = sp1C5;
+ vertices[j + 3].v.cn[3] = sp1C4;
+ vertices[j + 3].v.tc[0] = 1024;
+ vertices[j + 3].v.tc[1] = 1024;
+ vertices[j + 3].v.flag = 0;
+
+ j += 4;
+
+ mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &sp12C);
+ if (mtx == NULL) {
+ goto end;
+ }
+
+ gSPMatrix(POLY_XLU_DISP++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPVertex(POLY_XLU_DISP++, &vertices[4 * i], 4, 0);
+ gSP2Triangles(POLY_XLU_DISP++, 2, 0, 3, 0, 2, 3, 1, 0);
+ }
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ }
+
+end:
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/code/z_eff_ss_dead.c b/src/code/z_eff_ss_dead.c
index 12665d6b2f..bd93f5eeda 100644
--- a/src/code/z_eff_ss_dead.c
+++ b/src/code/z_eff_ss_dead.c
@@ -1,13 +1,111 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE2A0.s")
+void func_800AE2A0(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3) {
+ f32 cos;
+ Gfx* displayListHead;
+ f32 absCos;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE434.s")
+ OPEN_DISPS(globalCtx->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE5A0.s")
+ displayListHead = POLY_OPA_DISP;
+ cos = Math_CosS((0x8000 / arg3) * arg2);
+ absCos = fabsf(cos);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE5E4.s")
+ gDPPipeSync(displayListHead++);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE778.s")
+ if (color == NULL) {
+ gDPSetFogColor(displayListHead++, 255, 0, 0, 0);
+ } else {
+ gDPSetFogColor(displayListHead++, color->r, color->g, color->b, color->a);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_ss_dead/func_800AE8EC.s")
+ gSPFogPosition(displayListHead++, 0, (s16)(absCos * 3000.0f) + 1500);
+
+ POLY_OPA_DISP = displayListHead;
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_800AE434(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3) {
+ Gfx* displayListHead;
+ f32 cos;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ cos = Math_CosS((0x4000 / arg3) * arg2);
+ displayListHead = POLY_OPA_DISP;
+
+ gDPPipeSync(displayListHead++);
+ gDPSetFogColor(displayListHead++, color->r, color->g, color->b, color->a);
+ gSPFogPosition(displayListHead++, 0, (s16)(2800.0f * fabsf(cos)) + 1700);
+
+ POLY_OPA_DISP = displayListHead;
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_800AE5A0(GlobalContext* globalCtx) {
+ s32 pad;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ POLY_OPA_DISP = func_801660B8(globalCtx, POLY_OPA_DISP);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_800AE5E4(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3) {
+ f32 cos;
+ Gfx* displayListHead;
+ f32 absCos;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ displayListHead = POLY_XLU_DISP;
+ cos = Math_CosS((0x8000 / arg3) * arg2);
+ absCos = fabsf(cos);
+
+ gDPPipeSync(displayListHead++);
+
+ if (color == NULL) {
+ gDPSetFogColor(displayListHead++, 255, 0, 0, 0);
+ } else {
+ gDPSetFogColor(displayListHead++, color->r, color->g, color->b, color->a);
+ }
+
+ gSPFogPosition(displayListHead++, 0, (s16)(absCos * 3000.0f) + 1500);
+
+ POLY_XLU_DISP = displayListHead;
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_800AE778(GlobalContext* globalCtx, Color_RGBA8* color, s16 arg2, s16 arg3) {
+ f32 cos;
+ Gfx* displayListHead;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ displayListHead = POLY_XLU_DISP;
+ cos = Math_CosS((0x4000 / arg3) * arg2);
+
+ gDPPipeSync(displayListHead++);
+ gDPSetFogColor(displayListHead++, color->r, color->g, color->b, color->a);
+ gSPFogPosition(displayListHead++, 0, (s16)(2800.0f * fabsf(cos)) + 1700);
+
+ POLY_XLU_DISP = displayListHead;
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_800AE8EC(GlobalContext* globalCtx) {
+ s32 pad;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ gDPPipeSync(POLY_XLU_DISP++);
+ POLY_XLU_DISP = func_801660B8(globalCtx, POLY_XLU_DISP);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
diff --git a/src/code/z_eff_tire_mark.c b/src/code/z_eff_tire_mark.c
index 0ae14c86f7..517ee52512 100644
--- a/src/code/z_eff_tire_mark.c
+++ b/src/code/z_eff_tire_mark.c
@@ -1,17 +1,287 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/func_800AE930.s")
+void func_800AE930(CollisionContext* colCtx, EffectTireMark* this, Vec3f* pos, f32 arg3, s16 arg4,
+ CollisionPoly* colPoly, s32 arg6) {
+ Vec3s spB8;
+ Vec3s spB0;
+ EffectTireMarkElement* spAC;
+ EffectTireMarkElement* spA8;
+ u32 spA4;
+ u32 spA0;
+ Vec3s* vtxList = colCtx->colHeader->vtxList;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/func_800AEF44.s")
+ if ((arg6 != 50) || (this->numElements >= (ARRAY_COUNT(this->elements) - 1)) || (colPoly == NULL)) {
+ func_800AEF44(this);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_InitParticle.s")
+ spB8.x = (Math_SinS(arg4 - 0x4000) * arg3) + pos->x;
+ spB8.z = (Math_CosS(arg4 - 0x4000) * arg3) + pos->z;
+ spB8.y = func_800BFD84(colPoly, spB8.x, spB8.z) + 2.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Init.s")
+ spB0.x = (Math_SinS(arg4 + 0x4000) * arg3) + pos->x;
+ spB0.z = (Math_CosS(arg4 + 0x4000) * arg3) + pos->z;
+ spB0.y = func_800BFD84(colPoly, spB0.x, spB0.z) + 2.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Destroy.s")
+ spAC = &this->elements[this->numElements - 1];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Update.s")
+ if ((this->numElements != 0) && (spAC->colPoly != NULL) && (colPoly != spAC->colPoly) &&
+ (func_800BFDEC(spAC->colPoly, colPoly, &spA4, &spA0) == 2)) {
+ Vec3f sp90;
+ Vec3f sp84;
+ Vec3f sp78;
+ Vec3f sp6C;
+ Vec3f sp60;
+ Vec3f sp54;
+ Vec3f sp48;
+ Vec3f sp3C;
+ Vec3f sp30;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_InitVertices.s")
+ sp84.x = vtxList[spA4].x;
+ sp84.y = vtxList[spA4].y;
+ sp84.z = vtxList[spA4].z;
+ sp90.x = vtxList[spA0].x;
+ sp90.y = vtxList[spA0].y;
+ sp90.z = vtxList[spA0].z;
+ sp54.x = spAC->p1.x;
+ sp54.y = spAC->p1.y;
+ sp54.z = spAC->p1.z;
+ sp60.x = spB0.x;
+ sp60.y = spB0.y;
+ sp60.z = spB0.z;
+ sp3C.x = spAC->p2.x;
+ sp3C.y = spAC->p2.y;
+ sp3C.z = spAC->p2.z;
+ sp48.x = spB8.x;
+ sp48.y = spB8.y;
+ sp48.z = spB8.z;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Draw.s")
+ if ((func_80179798(&sp84, &sp90, &sp54, &sp60, &sp6C, &sp30) != 0) &&
+ (func_80179798(&sp84, &sp90, &sp3C, &sp48, &sp78, &sp30) != 0)) {
+ if (!(spAC->flags & 2)) {
+ spAC->flags |= 1;
+ }
+
+ spA8 = &this->elements[this->numElements];
+ spA8->flags = 0;
+ spA8->p1.x = sp6C.x;
+ spA8->p1.y = sp6C.y;
+ spA8->p1.z = sp6C.z;
+ spA8->p2.x = sp78.x;
+ spA8->p2.y = sp78.y;
+ spA8->p2.z = sp78.z;
+ spA8->life = this->elemDuration;
+ spA8->colPoly = NULL;
+ this->numElements++;
+
+ spAC = &this->elements[this->numElements - 1];
+ if (!(spAC->flags & 2)) {
+ spAC->flags |= 1;
+ }
+
+ if (spA8) {} // Necessary to match
+
+ spA8 = &this->elements[this->numElements];
+ spA8->flags = 0;
+ spA8->p1 = spB0;
+ spA8->p2 = spB8;
+ spA8->life = this->elemDuration;
+ spA8->colPoly = colPoly;
+ this->numElements++;
+ return;
+ }
+
+ if (!(spAC->flags & 2)) {
+ spAC->flags |= 1;
+ }
+
+ spA8 = &this->elements[this->numElements];
+ spA8->flags = 0;
+ spA8->p1 = spB0;
+ spA8->p2 = spB8;
+ spA8->life = this->elemDuration;
+ spA8->colPoly = colPoly;
+
+ this->numElements++;
+ return;
+ }
+
+ if (!(spAC->flags & 2)) {
+ spAC->flags |= 1;
+ }
+
+ spA8 = &this->elements[this->numElements];
+ spA8->flags = 0;
+ spA8->p1 = spB0;
+ spA8->p2 = spB8;
+ spA8->life = this->elemDuration;
+ spA8->colPoly = colPoly;
+
+ this->numElements++;
+}
+
+void func_800AEF44(EffectTireMark* this) {
+ EffectTireMarkElement* elem = &this->elements[this->numElements - 1];
+
+ elem->flags |= 2;
+}
+
+void EffectTireMark_InitElement(EffectTireMarkElement* elem) {
+ elem->flags = 0;
+ elem->life = 0;
+ elem->colPoly = NULL;
+ elem->p1.x = elem->p1.y = elem->p1.z = elem->p2.x = elem->p2.y = elem->p2.z = 0;
+}
+
+void EffectTireMark_Init(void* thisx, void* initParamsx) {
+ EffectTireMark* this = (EffectTireMark*)thisx;
+ EffectTireMarkInit* initParams = (EffectTireMarkInit*)initParamsx;
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(this->elements); i++) {
+ EffectTireMark_InitElement(&this->elements[i]);
+ }
+
+ this->unk600 = initParams->unk0;
+ this->numElements = 0;
+
+ if (initParams->elemDuration > 62) {
+ this->elemDuration = 62;
+ } else {
+ this->elemDuration = initParams->elemDuration;
+ }
+
+ this->color = initParams->color;
+}
+
+void EffectTireMark_Destroy(void* thisx) {
+}
+
+s32 EffectTireMark_Update(void* thisx) {
+ EffectTireMark* this = (EffectTireMark*)thisx;
+ s32 i;
+ s32 j;
+
+ if (this->numElements == 0) {
+ return 0;
+ }
+
+ for (i = 0; i < this->numElements; i++) {
+ this->elements[i].life--;
+ }
+
+ if (this->elements[0].life <= 0) {
+ for (j = 0; j < ARRAY_COUNT(this->elements) - 1; j++) {
+ this->elements[j] = this->elements[j + 1];
+ }
+
+ EffectTireMark_InitElement(&this->elements[j]);
+
+ this->numElements--;
+ if (this->numElements < 0) {
+ this->numElements = 0;
+ }
+ return 0;
+ }
+
+ return 0;
+}
+
+void EffectTireMark_SetVertices(Vtx* vtx, EffectTireMarkElement* elem, s32 i, s32 alpha) {
+ s32 i1 = i * 2;
+ s32 i2 = i * 2 + 1;
+
+ vtx[i1].v.ob[0] = elem->p1.x;
+ vtx[i1].v.ob[1] = elem->p1.y;
+ vtx[i1].v.ob[2] = elem->p1.z;
+ vtx[i1].v.tc[0] = 2048;
+ vtx[i1].v.tc[1] = 0;
+ vtx[i1].v.cn[0] = 255;
+ vtx[i1].v.cn[1] = 255;
+ vtx[i1].v.cn[2] = 255;
+ vtx[i1].v.cn[3] = alpha;
+
+ vtx[i2].v.ob[0] = elem->p2.x;
+ vtx[i2].v.ob[1] = elem->p2.y;
+ vtx[i2].v.ob[2] = elem->p2.z;
+ vtx[i2].v.tc[0] = 2048;
+ vtx[i2].v.tc[1] = 1024;
+ vtx[i2].v.cn[0] = 255;
+ vtx[i2].v.cn[1] = 255;
+ vtx[i2].v.cn[2] = 255;
+ vtx[i2].v.cn[3] = alpha;
+}
+
+void EffectTireMark_Draw(void* thisx, GraphicsContext* gfxCtx) {
+ EffectTireMark* this = (EffectTireMark*)thisx;
+ EffectTireMarkElement* elem;
+ Vtx* vtx;
+ s32 pad;
+ f32 sp34;
+ s32 i;
+
+ sp34 = 1.0f / this->elemDuration;
+
+ OPEN_DISPS(gfxCtx);
+
+ if (this->numElements >= 2) {
+ vtx = GRAPH_ALLOC(gfxCtx, ALIGN16(this->numElements * sizeof(Vtx[2])));
+
+ 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);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+
+ gDPLoadTextureBlock(POLY_OPA_DISP++, D_04014570, G_IM_FMT_I, G_IM_SIZ_8b, 64, 32, 0,
+ G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_WRAP, 6, 5, G_TX_NOLOD, G_TX_NOLOD);
+
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
+ COMBINED);
+ gSPSetGeometryMode(POLY_OPA_DISP++, G_SHADE | G_SHADING_SMOOTH);
+ gSPClearGeometryMode(POLY_OPA_DISP++, G_CULL_BACK | G_LIGHTING);
+
+ EffectTireMark_SetVertices(vtx, &this->elements[0], 0, 255);
+
+ vtx[0].v.tc[0] = 0;
+ vtx[0].v.tc[1] = 0;
+ vtx[1].v.tc[0] = 0;
+ vtx[1].v.tc[1] = 1024;
+
+ for (i = 1; i < this->numElements; i++) {
+ elem = &this->elements[i];
+
+ EffectTireMark_SetVertices(vtx, elem, i, 255);
+
+ if ((elem - 1)->flags & 1) {
+ if (!(elem->flags & 1)) {
+ vtx[i * 2 + 0].v.tc[0] = 0;
+ vtx[i * 2 + 0].v.tc[1] = 0;
+ vtx[i * 2 + 1].v.tc[0] = 0;
+ vtx[i * 2 + 1].v.tc[1] = 1024;
+ dummy_label:;
+ } else if ((i >= 2) && !((elem - 2)->flags & 1)) {
+ vtx[i * 2 - 2].v.tc[0] = 0;
+ vtx[i * 2 - 2].v.tc[1] = 0;
+ vtx[i * 2 - 1].v.tc[0] = 0;
+ vtx[i * 2 - 1].v.tc[1] = 1024;
+ }
+
+ if (i == (this->numElements - 1)) {
+ vtx[i * 2 + 0].v.tc[0] = 0;
+ vtx[i * 2 + 0].v.tc[1] = 0;
+ vtx[i * 2 + 1].v.tc[0] = 0;
+ vtx[i * 2 + 1].v.tc[1] = 1024;
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, this->color.r, this->color.g, this->color.b,
+ (s32)((f32)this->color.a * (f32)elem->life * sp34));
+ gSPVertex(POLY_OPA_DISP++, &vtx[i * 2 - 2], 4, 0);
+ gSP2Triangles(POLY_OPA_DISP++, 0, 1, 3, 0, 0, 3, 2, 0);
+ }
+ }
+ }
+ }
+
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/code/z_effect.c b/src/code/z_effect.c
index 1c7ad38914..dd696393ff 100644
--- a/src/code/z_effect.c
+++ b/src/code/z_effect.c
@@ -1,55 +1,57 @@
#include "global.h"
-EffInfo sEffInfoTable[] = {
+EffectContext sEffectContext;
+
+EffectInfo sEffectInfoTable[] = {
{
- sizeof(EffSparkParams),
- (eff_init_func)EffectSpark_Init,
- (eff_destroy_func)EffectSpark_Destroy,
- (eff_update_func)EffectSpark_Update,
- (eff_draw_func)EffectSpark_Draw,
+ sizeof(EffectSpark),
+ EffectSpark_Init,
+ EffectSpark_Destroy,
+ EffectSpark_Update,
+ EffectSpark_Draw,
},
{
sizeof(EffectBlure),
- (eff_init_func)EffectBlure_Init1,
- (eff_destroy_func)EffectBlure_Destroy,
- (eff_update_func)EffectBlure_Update,
- (eff_draw_func)EffectBlure_Draw,
+ EffectBlure_Init1,
+ EffectBlure_Destroy,
+ EffectBlure_Update,
+ EffectBlure_Draw,
},
{
sizeof(EffectBlure),
- (eff_init_func)EffectBlure_Init2,
- (eff_destroy_func)EffectBlure_Destroy,
- (eff_update_func)EffectBlure_Update,
- (eff_draw_func)EffectBlure_Draw,
+ EffectBlure_Init2,
+ EffectBlure_Destroy,
+ EffectBlure_Update,
+ EffectBlure_Draw,
},
{
- sizeof(EffShieldParticleParams),
- (eff_init_func)EffectShieldParticle_Init,
- (eff_destroy_func)EffectShieldParticle_Destroy,
- (eff_update_func)EffectShieldParticle_Update,
- (eff_draw_func)EffectShieldParticle_Draw,
+ sizeof(EffectShieldParticle),
+ EffectShieldParticle_Init,
+ EffectShieldParticle_Destroy,
+ EffectShieldParticle_Update,
+ EffectShieldParticle_Draw,
},
{
- sizeof(EffTireMarkParams),
- (eff_init_func)EffectTireMark_Init,
- (eff_destroy_func)EffectTireMark_Destroy,
- (eff_update_func)EffectTireMark_Update,
- (eff_draw_func)EffectTireMark_Draw,
+ sizeof(EffectTireMark),
+ EffectTireMark_Init,
+ EffectTireMark_Destroy,
+ EffectTireMark_Update,
+ EffectTireMark_Draw,
},
};
-GlobalContext* Effect_GetContext(void) {
- return sEffTable.globalCtx;
+GlobalContext* Effect_GetGlobalCtx(void) {
+ return sEffectContext.globalCtx;
}
-void* Effect_GetParams(s32 index) {
+void* Effect_GetByIndex(s32 index) {
if (index == TOTAL_EFFECT_COUNT) {
return NULL;
}
if (index < SPARK_COUNT) {
- if (sEffTable.sparks[index].base.active == 1) {
- return &sEffTable.sparks[index].params;
+ if (sEffectContext.sparks[index].status.active == true) {
+ return &sEffectContext.sparks[index].effect;
} else {
return NULL;
}
@@ -57,8 +59,8 @@ void* Effect_GetParams(s32 index) {
index -= SPARK_COUNT;
if (index < BLURE_COUNT) {
- if (sEffTable.blures[index].base.active == 1) {
- return &sEffTable.blures[index].params;
+ if (sEffectContext.blures[index].status.active == true) {
+ return &sEffectContext.blures[index].effect;
} else {
return NULL;
}
@@ -66,8 +68,8 @@ void* Effect_GetParams(s32 index) {
index -= BLURE_COUNT;
if (index < SHIELD_PARTICLE_COUNT) {
- if (sEffTable.shieldParticles[index].base.active == 1) {
- return &sEffTable.shieldParticles[index].params;
+ if (sEffectContext.shieldParticles[index].status.active == true) {
+ return &sEffectContext.shieldParticles[index].effect;
} else {
return NULL;
}
@@ -75,8 +77,8 @@ void* Effect_GetParams(s32 index) {
index -= SHIELD_PARTICLE_COUNT;
if (index < TIRE_MARK_COUNT) {
- if (sEffTable.tireMarks[index].base.active == 1) {
- return &sEffTable.tireMarks[index].params;
+ if (sEffectContext.tireMarks[index].status.active == true) {
+ return &sEffectContext.tireMarks[index].effect;
} else {
return NULL;
}
@@ -85,89 +87,87 @@ void* Effect_GetParams(s32 index) {
return NULL;
}
-void Effect_InitCommon(EffCommon* common) {
- common->active = 0;
- common->unk1 = 0;
- common->unk2 = 0;
+void Effect_InitStatus(EffectStatus* status) {
+ status->active = false;
+ status->unk1 = 0;
+ status->unk2 = 0;
}
void Effect_Init(GlobalContext* globalCtx) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- Effect_InitCommon(&sEffTable.sparks[i].base);
+ Effect_InitStatus(&sEffectContext.sparks[i].status);
}
for (i = 0; i < BLURE_COUNT; i++) {
- Effect_InitCommon(&sEffTable.blures[i].base);
+ Effect_InitStatus(&sEffectContext.blures[i].status);
}
- //! @bug This is probably supposed to loop over shieldParticles, not blures again
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- Effect_InitCommon(&sEffTable.blures[i].base);
+ //! @bug This is probably supposed to initialize shieldParticles, not blures again
+ Effect_InitStatus(&sEffectContext.blures[i].status);
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- Effect_InitCommon(&sEffTable.tireMarks[i].base);
+ Effect_InitStatus(&sEffectContext.tireMarks[i].status);
}
- sEffTable.globalCtx = globalCtx;
+ sEffectContext.globalCtx = globalCtx;
}
-void Effect_Add(GlobalContext* globalCtx, s32* index, s32 type, u8 param_4, u8 param_5, void* initParams) {
+void Effect_Add(GlobalContext* globalCtx, s32* pIndex, s32 type, u8 arg3, u8 arg4, void* initParams) {
u32 slotFound;
s32 i;
- void* params;
- EffCommon* common;
+ void* effect = NULL;
+ EffectStatus* status = NULL;
- params = NULL;
- *index = TOTAL_EFFECT_COUNT;
- common = NULL;
+ *pIndex = TOTAL_EFFECT_COUNT;
if (FrameAdvance_IsEnabled(globalCtx) != true) {
- slotFound = 0;
+ slotFound = false;
switch (type) {
- case 0:
+ case EFFECT_SPARK:
for (i = 0; i < SPARK_COUNT; i++) {
- if (sEffTable.sparks[i].base.active == 0) {
- slotFound = 1;
- *index = i;
- params = &sEffTable.sparks[i].params;
- common = &sEffTable.sparks[i].base;
+ if (sEffectContext.sparks[i].status.active == false) {
+ slotFound = true;
+ *pIndex = i;
+ effect = &sEffectContext.sparks[i].effect;
+ status = &sEffectContext.sparks[i].status;
break;
}
}
break;
- case 1:
- case 2:
+ case EFFECT_BLURE1:
+ case EFFECT_BLURE2:
for (i = 0; i < BLURE_COUNT; i++) {
- if (sEffTable.blures[i].base.active == 0) {
- slotFound = 1;
- *index = i + 3;
- params = &sEffTable.blures[i].params;
- common = &sEffTable.blures[i].base;
+ if (sEffectContext.blures[i].status.active == false) {
+ slotFound = true;
+ *pIndex = i + SPARK_COUNT;
+ effect = &sEffectContext.blures[i].effect;
+ status = &sEffectContext.blures[i].status;
break;
}
}
break;
- case 3:
+ case EFFECT_SHIELD_PARTICLE:
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- if (sEffTable.shieldParticles[i].base.active == 0) {
- slotFound = 1;
- *index = i + 28;
- params = &sEffTable.shieldParticles[i].params;
- common = &sEffTable.shieldParticles[i].base;
+ if (sEffectContext.shieldParticles[i].status.active == false) {
+ slotFound = true;
+ *pIndex = i + SPARK_COUNT + BLURE_COUNT;
+ effect = &sEffectContext.shieldParticles[i].effect;
+ status = &sEffectContext.shieldParticles[i].status;
break;
}
}
break;
- case 4:
+ case EFFECT_TIRE_MARK:
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (sEffTable.tireMarks[i].base.active == 0) {
- slotFound = 1;
- *index = i + 31;
- params = &sEffTable.tireMarks[i].params;
- common = &sEffTable.tireMarks[i].base;
+ if (sEffectContext.tireMarks[i].status.active == false) {
+ slotFound = true;
+ *pIndex = i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT;
+ effect = &sEffectContext.tireMarks[i].effect;
+ status = &sEffectContext.tireMarks[i].status;
break;
}
}
@@ -175,10 +175,10 @@ void Effect_Add(GlobalContext* globalCtx, s32* index, s32 type, u8 param_4, u8 p
}
if (slotFound) {
- sEffInfoTable[type].init(params, initParams);
- common->unk2 = param_4;
- common->unk1 = param_5;
- common->active = 1;
+ sEffectInfoTable[type].init(effect, initParams);
+ status->unk2 = arg3;
+ status->unk1 = arg4;
+ status->active = true;
}
}
}
@@ -188,8 +188,8 @@ void Effect_DrawAll(GraphicsContext* gfxCtx) {
for (i = 0; i < SPARK_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.sparks[i].base.active) {
- sEffInfoTable[0].draw(&sEffTable.sparks[i].params, gfxCtx);
+ if (sEffectContext.sparks[i].status.active) {
+ sEffectInfoTable[EFFECT_SPARK].draw(&sEffectContext.sparks[i].effect, gfxCtx);
}
}
@@ -197,22 +197,22 @@ void Effect_DrawAll(GraphicsContext* gfxCtx) {
if (1) {
if (gfxCtx) {}
} // necessary to match
- if (sEffTable.blures[i].base.active) {
- sEffInfoTable[1].draw(&sEffTable.blures[i].params, gfxCtx);
+ if (sEffectContext.blures[i].status.active) {
+ sEffectInfoTable[EFFECT_BLURE1].draw(&sEffectContext.blures[i].effect, gfxCtx);
}
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.shieldParticles[i].base.active) {
- sEffInfoTable[3].draw(&sEffTable.shieldParticles[i].params, gfxCtx);
+ if (sEffectContext.shieldParticles[i].status.active) {
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].draw(&sEffectContext.shieldParticles[i].effect, gfxCtx);
}
}
if (1) {} // necessary to match
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- if (sEffTable.tireMarks[i].base.active) {
- sEffInfoTable[4].draw(&sEffTable.tireMarks[i].params, gfxCtx);
+ if (sEffectContext.tireMarks[i].status.active) {
+ sEffectInfoTable[EFFECT_TIRE_MARK].draw(&sEffectContext.tireMarks[i].effect, gfxCtx);
}
}
}
@@ -222,8 +222,8 @@ void Effect_UpdateAll(GlobalContext* globalCtx) {
for (i = 0; i < SPARK_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.sparks[i].base.active) {
- if (sEffInfoTable[0].update(&sEffTable.sparks[i].params) == 1) {
+ if (sEffectContext.sparks[i].status.active) {
+ if (sEffectInfoTable[EFFECT_SPARK].update(&sEffectContext.sparks[i].effect) == 1) {
Effect_Destroy(globalCtx, i);
}
}
@@ -231,27 +231,27 @@ void Effect_UpdateAll(GlobalContext* globalCtx) {
for (i = 0; i < BLURE_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.blures[i].base.active) {
- if (sEffInfoTable[1].update(&sEffTable.blures[i].params) == 1) {
- Effect_Destroy(globalCtx, i + 3);
+ if (sEffectContext.blures[i].status.active) {
+ if (sEffectInfoTable[EFFECT_BLURE1].update(&sEffectContext.blures[i].effect) == 1) {
+ Effect_Destroy(globalCtx, i + SPARK_COUNT);
}
}
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.shieldParticles[i].base.active) {
- if (sEffInfoTable[3].update(&sEffTable.shieldParticles[i].params) == 1) {
- Effect_Destroy(globalCtx, i + 28);
+ if (sEffectContext.shieldParticles[i].status.active) {
+ if (sEffectInfoTable[EFFECT_SHIELD_PARTICLE].update(&sEffectContext.shieldParticles[i].effect) == 1) {
+ Effect_Destroy(globalCtx, i + SPARK_COUNT + BLURE_COUNT);
}
}
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
if (1) {} // necessary to match
- if (sEffTable.tireMarks[i].base.active) {
- if (sEffInfoTable[4].update(&sEffTable.tireMarks[i].params) == 1) {
- Effect_Destroy(globalCtx, i + 31);
+ if (sEffectContext.tireMarks[i].status.active) {
+ if (sEffectInfoTable[EFFECT_TIRE_MARK].update(&sEffectContext.tireMarks[i].effect) == 1) {
+ Effect_Destroy(globalCtx, i + SPARK_COUNT + BLURE_COUNT + SHIELD_PARTICLE_COUNT);
}
}
}
@@ -263,29 +263,29 @@ void Effect_Destroy(GlobalContext* globalCtx, s32 index) {
}
if (index < SPARK_COUNT) {
- sEffTable.sparks[index].base.active = 0;
- sEffInfoTable[0].destroy(&sEffTable.sparks[index].params);
+ sEffectContext.sparks[index].status.active = false;
+ sEffectInfoTable[EFFECT_SPARK].destroy(&sEffectContext.sparks[index].effect);
return;
}
index -= SPARK_COUNT;
if (index < BLURE_COUNT) {
- sEffTable.blures[index].base.active = 0;
- sEffInfoTable[1].destroy(&sEffTable.blures[index].params);
+ sEffectContext.blures[index].status.active = false;
+ sEffectInfoTable[EFFECT_BLURE1].destroy(&sEffectContext.blures[index].effect);
return;
}
index -= BLURE_COUNT;
if (index < SHIELD_PARTICLE_COUNT) {
- sEffTable.shieldParticles[index].base.active = 0;
- sEffInfoTable[3].destroy(&sEffTable.shieldParticles[index].params);
+ sEffectContext.shieldParticles[index].status.active = false;
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].destroy(&sEffectContext.shieldParticles[index].effect);
return;
}
index -= SHIELD_PARTICLE_COUNT;
if (index < TIRE_MARK_COUNT) {
- sEffTable.tireMarks[index].base.active = 0;
- sEffInfoTable[4].destroy(&sEffTable.tireMarks[index].params);
+ sEffectContext.tireMarks[index].status.active = false;
+ sEffectInfoTable[EFFECT_TIRE_MARK].destroy(&sEffectContext.tireMarks[index].effect);
return;
}
}
@@ -294,22 +294,22 @@ void Effect_DestroyAll(GlobalContext* globalCtx) {
s32 i;
for (i = 0; i < SPARK_COUNT; i++) {
- sEffTable.sparks[i].base.active = 0;
- sEffInfoTable[0].destroy(&sEffTable.sparks[i].params);
+ sEffectContext.sparks[i].status.active = false;
+ sEffectInfoTable[EFFECT_SPARK].destroy(&sEffectContext.sparks[i].effect);
}
for (i = 0; i < BLURE_COUNT; i++) {
- sEffTable.blures[i].base.active = 0;
- sEffInfoTable[1].destroy(&sEffTable.blures[i].params);
+ sEffectContext.blures[i].status.active = false;
+ sEffectInfoTable[EFFECT_BLURE1].destroy(&sEffectContext.blures[i].effect);
}
for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
- sEffTable.shieldParticles[i].base.active = 0;
- sEffInfoTable[3].destroy(&sEffTable.shieldParticles[i].params);
+ sEffectContext.shieldParticles[i].status.active = false;
+ sEffectInfoTable[EFFECT_SHIELD_PARTICLE].destroy(&sEffectContext.shieldParticles[i].effect);
}
for (i = 0; i < TIRE_MARK_COUNT; i++) {
- sEffTable.tireMarks[i].base.active = 0;
- sEffInfoTable[4].destroy(&sEffTable.tireMarks[i].params);
+ sEffectContext.tireMarks[i].status.active = false;
+ sEffectInfoTable[EFFECT_TIRE_MARK].destroy(&sEffectContext.tireMarks[i].effect);
}
}
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 6deeb79434..4303d3db2d 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -590,7 +590,7 @@ extern Vec3f D_801AE3E0;
void func_800B2364(GlobalContext* globalCtx, Vec3f* pos, Gfx* dList) {
Vec3f posVec = D_801AE3E0;
- EffectSsHahen_Spawn(globalCtx, pos, &D_801D15B0, &posVec, 1, 5, 1, 10, dList);
+ EffectSsHahen_Spawn(globalCtx, pos, &gZeroVec3f, &posVec, 1, 5, 1, 10, dList);
}
// EffectSsStick Spawn Functions
@@ -1032,7 +1032,7 @@ void EffectSsDeadDs_Spawn(GlobalContext* globalCtx, Vec3f* pos, Vec3f* velocity,
}
void func_800B31BC(GlobalContext* globalCtx, Vec3f* pos, s16 scale, s16 scaleStep, s16 alpha, s32 life) {
- EffectSsDeadDs_Spawn(globalCtx, pos, &D_801D15B0, &D_801D15B0, scale, scaleStep, alpha, life);
+ EffectSsDeadDs_Spawn(globalCtx, pos, &gZeroVec3f, &gZeroVec3f, scale, scaleStep, alpha, life);
}
// EffectSsIceSmoke Spawn Functions
diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c
index 6e543d115a..7c5de646a8 100644
--- a/src/code/z_fireobj.c
+++ b/src/code/z_fireobj.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
typedef enum {
FIRE_STATE_0,
@@ -162,7 +163,7 @@ void FireObj_Draw(GlobalContext* globalCtx, FireObj* fire) {
Matrix_Scale(fire->xScale, fire->yScale, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_0407D590);
+ gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}
diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c
index 979b28cbaa..15f3a66935 100644
--- a/src/code/z_game_over.c
+++ b/src/code/z_game_over.c
@@ -44,7 +44,7 @@ void GameOver_Update(GlobalContext* globalCtx) {
}
gSaveContext.unk_3DC0 = 2000;
- gSaveContext.naviTimer = 0;
+ gSaveContext.tatlTimer = 0;
gSaveContext.seqIndex = (u8)NA_BGM_DISABLED;
gSaveContext.nightSeqIndex = 0xFF;
gSaveContext.eventInf[0] = 0;
diff --git a/src/code/z_kaleido_manager.c b/src/code/z_kaleido_manager.c
index c79b0067f3..318b033f64 100644
--- a/src/code/z_kaleido_manager.c
+++ b/src/code/z_kaleido_manager.c
@@ -1,15 +1,104 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/D_801DF9C0.s")
+#define KALEIDO_OVERLAY(name) \
+ { \
+ NULL, SEGMENT_ROM_START(ovl_##name), SEGMENT_ROM_END(ovl_##name), SEGMENT_START(ovl_##name), \
+ SEGMENT_END(ovl_##name), 0, #name, \
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_80163700.s")
+KaleidoMgrOverlay gKaleidoMgrOverlayTable[] = {
+ KALEIDO_OVERLAY(kaleido_scope),
+ KALEIDO_OVERLAY(player_actor),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_80163758.s")
+void* sKaleidoAreaPtr = NULL;
+KaleidoMgrOverlay* gKaleidoMgrCurOvl = NULL;
+FaultAddrConvClient sKaleidoAreaFaultClient;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_801637B4.s")
+void* KaleidoManager_FaultAddrConvFunc(void* address, void* param) {
+ u8* ptr = address;
+ KaleidoMgrOverlay* ovl = &gKaleidoMgrCurOvl[0];
+ u8* ramStart;
+ u8* ramEnd;
+ size_t size;
+ uintptr_t offset;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_80163804.s")
+ if (ovl != NULL) {
+ size = (u8*)ovl->vramEnd - (u8*)ovl->vramStart;
+ ramStart = ovl->loadedRamAddr;
+ ramEnd = ramStart + size;
+ offset = (u8*)ovl->vramStart - ramStart;
+ if (ramStart != NULL) {
+ if (ptr >= ramStart && ptr < ramEnd) {
+ return ptr + offset;
+ }
+ }
+ }
+ return NULL;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_8016388C.s")
+void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl) {
+ ovl->loadedRamAddr = sKaleidoAreaPtr;
+ Load2_LoadOverlay(ovl->vromStart, ovl->vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr);
+ ovl->offset = (uintptr_t)ovl->loadedRamAddr - (uintptr_t)ovl->vramStart;
+ gKaleidoMgrCurOvl = ovl;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_manager/func_801638D8.s")
+void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl) {
+ if (ovl->loadedRamAddr != NULL) {
+ ovl->offset = 0;
+ bzero(ovl->loadedRamAddr, (uintptr_t)ovl->vramEnd - (uintptr_t)ovl->vramStart);
+ ovl->loadedRamAddr = NULL;
+ gKaleidoMgrCurOvl = NULL;
+ }
+}
+
+void KaleidoManager_Init(GlobalContext* globalCtx) {
+ s32 largestSize = 0;
+ s32 size;
+ u32 i;
+
+ for (i = 0; i < ARRAY_COUNT(gKaleidoMgrOverlayTable); i++) {
+ size = (uintptr_t)gKaleidoMgrOverlayTable[i].vramEnd - (uintptr_t)gKaleidoMgrOverlayTable[i].vramStart;
+ if (size > largestSize) {
+ largestSize = size;
+ }
+ }
+
+ sKaleidoAreaPtr = THA_AllocEndAlign16(&globalCtx->state.heap, largestSize);
+ gKaleidoMgrCurOvl = NULL;
+ Fault_AddAddrConvClient(&sKaleidoAreaFaultClient, KaleidoManager_FaultAddrConvFunc, NULL);
+}
+
+void KaleidoManager_Destroy() {
+ Fault_RemoveAddrConvClient(&sKaleidoAreaFaultClient);
+
+ if (gKaleidoMgrCurOvl != NULL) {
+ KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
+ gKaleidoMgrCurOvl = NULL;
+ }
+
+ sKaleidoAreaPtr = NULL;
+}
+
+void* KaleidoManager_GetRamAddr(void* vram) {
+ if (gKaleidoMgrCurOvl == NULL) {
+ s32 pad[2];
+ KaleidoMgrOverlay* ovl = &gKaleidoMgrOverlayTable[0];
+
+ do {
+ if (((uintptr_t)vram >= (uintptr_t)ovl->vramStart) && ((uintptr_t)ovl->vramEnd >= (uintptr_t)vram)) {
+ KaleidoManager_LoadOvl(ovl);
+ return (void*)((uintptr_t)vram + ovl->offset);
+ }
+ ovl++;
+ } while (ovl != (KaleidoMgrOverlay*)&sKaleidoAreaPtr);
+
+ return NULL;
+ } else if (((uintptr_t)vram < (uintptr_t)gKaleidoMgrCurOvl->vramStart) ||
+ ((uintptr_t)vram >= (uintptr_t)gKaleidoMgrCurOvl->vramEnd)) {
+ return NULL;
+ }
+
+ return (void*)((uintptr_t)vram + gKaleidoMgrCurOvl->offset);
+}
diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c
index 58f30ae165..b6d46eba16 100644
--- a/src/code/z_kaleido_scope_call.c
+++ b/src/code/z_kaleido_scope_call.c
@@ -1,11 +1,84 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_scope_call/func_801639A0.s")
+void (*sKaleidoScopeUpdateFunc)(GlobalContext* globalCtx);
+void (*sKaleidoScopeDrawFunc)(GlobalContext* globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_scope_call/func_801639EC.s")
+extern void KaleidoScope_Update(GlobalContext* globalCtx);
+extern void KaleidoScope_Draw(GlobalContext* globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_scope_call/func_80163A38.s")
+void KaleidoScopeCall_LoadPlayer() {
+ KaleidoMgrOverlay* playerActorOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_PLAYER_ACTOR];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_scope_call/func_80163A58.s")
+ if (gKaleidoMgrCurOvl != playerActorOvl) {
+ if (gKaleidoMgrCurOvl != NULL) {
+ KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_scope_call/func_80163C0C.s")
+ KaleidoManager_LoadOvl(playerActorOvl);
+ }
+}
+
+void KaleidoScopeCall_Init(GlobalContext* globalCtx) {
+ sKaleidoScopeUpdateFunc = KaleidoManager_GetRamAddr(KaleidoScope_Update);
+ sKaleidoScopeDrawFunc = KaleidoManager_GetRamAddr(KaleidoScope_Draw);
+ KaleidoSetup_Init(globalCtx);
+}
+
+void KaleidoScopeCall_Destroy(GlobalContext* globalCtx) {
+ KaleidoSetup_Destroy(globalCtx);
+}
+
+void KaleidoScopeCall_Update(GlobalContext* globalCtx) {
+ PauseContext* pauseCtx = &globalCtx->pauseCtx;
+ KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE];
+
+ if ((globalCtx->pauseCtx.state != 0) || (globalCtx->pauseCtx.debugState != 0)) {
+ if (pauseCtx->state == 1 || pauseCtx->state == 19) {
+ if (ShrinkWindow_GetLetterboxMagnitude() == 0) {
+ R_PAUSE_MENU_MODE = 1;
+ pauseCtx->unk_200 = 0;
+ pauseCtx->unk_208 = 0;
+ pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
+ }
+ } else if (pauseCtx->state == 8) {
+ R_PAUSE_MENU_MODE = 1;
+ pauseCtx->unk_200 = 0;
+ pauseCtx->unk_208 = 0;
+ pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1;
+ } else if ((pauseCtx->state == 2) || (pauseCtx->state == 9) || (pauseCtx->state == 20)) {
+ if (R_PAUSE_MENU_MODE == 3) {
+ pauseCtx->state++;
+ }
+ } else if (pauseCtx->state != 0) {
+ if (gKaleidoMgrCurOvl != kaleidoScopeOvl) {
+ if (gKaleidoMgrCurOvl != NULL) {
+ KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
+ }
+
+ KaleidoManager_LoadOvl(kaleidoScopeOvl);
+ }
+
+ if (gKaleidoMgrCurOvl == kaleidoScopeOvl) {
+ sKaleidoScopeUpdateFunc(globalCtx);
+
+ if ((globalCtx->pauseCtx.state == 0) && (globalCtx->pauseCtx.debugState == 0)) {
+ KaleidoManager_ClearOvl(kaleidoScopeOvl);
+ KaleidoScopeCall_LoadPlayer();
+ }
+ }
+ }
+ }
+}
+
+void KaleidoScopeCall_Draw(GlobalContext* globalCtx) {
+ KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE];
+
+ if (R_PAUSE_MENU_MODE == 3) {
+ if (((globalCtx->pauseCtx.state >= 4) && (globalCtx->pauseCtx.state <= 7)) ||
+ ((globalCtx->pauseCtx.state >= 11) && (globalCtx->pauseCtx.state <= 26))) {
+ if (gKaleidoMgrCurOvl == kaleidoScopeOvl) {
+ sKaleidoScopeDrawFunc(globalCtx);
+ }
+ }
+ }
+}
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index 8065a9a6b5..7f4d437845 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -4,6 +4,6 @@
#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_setup/func_800F4C0C.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_setup/func_800F4E20.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_setup/KaleidoSetup_Init.s")
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_setup/func_800F4F28.s")
+#pragma GLOBAL_ASM("asm/non_matchings/code/z_kaleido_setup/KaleidoSetup_Destroy.s")
diff --git a/src/code/z_room.c b/src/code/z_room.c
index fe4b51d68c..1685acc80e 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -18,14 +18,14 @@ void Room_DrawType0Mesh(GlobalContext* globalCtx, Room* room, u32 flags) {
func_800BCBF4(&D_801C1D10, globalCtx);
gSPSegment(gfxCtx->polyOpa.p++, 0x03, room->segment);
func_8012C268(globalCtx);
- gSPMatrix(gfxCtx->polyOpa.p++, &D_801D1DE0, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPMatrix(gfxCtx->polyOpa.p++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
if (flags & 2) {
func_800BCC68(&D_801C1D10, globalCtx);
gSPSegment(gfxCtx->polyXlu.p++, 0x03, room->segment);
func_8012C2DC(globalCtx->state.gfxCtx);
- gSPMatrix(gfxCtx->polyXlu.p++, &D_801D1DE0, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPMatrix(gfxCtx->polyXlu.p++, &gIdentityMtx, G_MTX_MODELVIEW | G_MTX_LOAD);
}
mesh = &room->mesh->type0;
diff --git a/src/libultra/io/contchannelreset.c b/src/libultra/io/contchannelreset.c
index 841dad7386..5a66274a96 100644
--- a/src/libultra/io/contchannelreset.c
+++ b/src/libultra/io/contchannelreset.c
@@ -1,3 +1,27 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/boot/contchannelreset/__osContChannelReset.s")
+s32 __osContChannelReset(OSMesgQueue* mq, s32 channel) {
+ s32 i;
+ s32 ret;
+ u8* bufptr = (u8*)&__osPfsPifRam;
+
+ __osSiGetAccess();
+
+ __osPfsPifRam.pifstatus = 1;
+
+ for (i = 0; i < channel; i++) {
+ *bufptr++ = 0;
+ }
+
+ *bufptr++ = 0xFD;
+ *bufptr = CONT_CMD_END;
+
+ __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+ ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
+ osRecvMesg(mq, NULL, OS_MESG_BLOCK);
+
+ __osSiRelAccess();
+
+ return ret;
+}
diff --git a/src/libultra/io/pfsfreeblocks.c b/src/libultra/io/pfsfreeblocks.c
index af10a5b887..b90979c595 100644
--- a/src/libultra/io/pfsfreeblocks.c
+++ b/src/libultra/io/pfsfreeblocks.c
@@ -1,3 +1,37 @@
#include "global.h"
+#include "PR/pfs.h"
-#pragma GLOBAL_ASM("asm/non_matchings/boot/pfsfreeblocks/osPfsFreeBlocks.s")
+s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes) {
+ s32 j;
+ s32 pages = 0;
+ __OSInode inode;
+ s32 ret = 0;
+ u8 bank;
+ s32 offset;
+
+ if (!(pfs->status & PFS_INITIALIZED)) {
+ return PFS_ERR_INVALID;
+ }
+
+ ret = __osCheckId(pfs);
+ if (ret != 0) {
+ return ret;
+ }
+
+ for (bank = PFS_ID_BANK_256K; bank < pfs->banks; bank++) {
+ ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank);
+ if (ret != 0) {
+ return ret;
+ }
+
+ offset = ((bank > PFS_ID_BANK_256K) ? 1 : pfs->inodeStartPage);
+ for (j = offset; j < PFS_INODE_SIZE_PER_PAGE; j++) {
+ if (inode.inodePage[j].ipage == PFS_PAGE_NOT_USED) {
+ pages++;
+ }
+ }
+ }
+
+ *leftoverBytes = pages * PFS_ONE_PAGE * BLOCKSIZE;
+ return 0;
+}
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 e32492e9c0..3d0f5c204b 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
@@ -133,7 +133,7 @@ void BgGoronOyu_SpawnParticles(BgGoronOyu* this, GlobalContext* globalCtx) {
if (BgCheck_EntityRaycastFloor2(globalCtx, &globalCtx->colCtx, &poly, &pos1) < this->waterBoxPos.y) {
pos1.y = this->waterBoxPos.y + 10.0f;
- EffectSsIceSmoke_Spawn(globalCtx, &pos1, &vel1, &D_801D15B0, scale);
+ EffectSsIceSmoke_Spawn(globalCtx, &pos1, &vel1, &gZeroVec3f, scale);
}
pos2.x = (Rand_ZeroOne() * this->waterBoxXLength) + this->waterBoxPos.x;
pos2.y = this->waterBoxPos.y + 100.0f;
@@ -145,7 +145,7 @@ void BgGoronOyu_SpawnParticles(BgGoronOyu* this, GlobalContext* globalCtx) {
if (BgCheck_EntityRaycastFloor2(globalCtx, &globalCtx->colCtx, &poly, &pos2) < this->waterBoxPos.y) {
pos2.y = this->waterBoxPos.y + 10.0f;
- EffectSsIceSmoke_Spawn(globalCtx, &pos2, &vel2, &D_801D15B0, scale);
+ EffectSsIceSmoke_Spawn(globalCtx, &pos2, &vel2, &gZeroVec3f, scale);
}
}
}
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 77a0cb2eea..cf628cc952 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
@@ -362,7 +362,7 @@ void func_80A9B554(BgHakuginPost* this, GlobalContext* globalCtx, BgHakuginPostU
spA0.x = Math_SinS(val) * temp_f20 + spB8.x;
spA0.y = (Rand_ZeroOne() * 1.2f - 0.1f) * spE4 + spB8.y;
spA0.z = Math_CosS(val) * temp_f20 + spB8.z;
- func_800B0E48(globalCtx, &spA0, &D_801D15B0, &D_80A9D8EC, &D_80A9D8E4, &D_80A9D8E8,
+ func_800B0E48(globalCtx, &spA0, &gZeroVec3f, &D_80A9D8EC, &D_80A9D8E4, &D_80A9D8E8,
(Rand_Next() >> 0x1A) + 0x82, (Rand_Next() >> 0x1A) + 0x6E);
}
diff --git a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
index 817cda67ed..c75db53063 100644
--- a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
+++ b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.c
@@ -14,7 +14,6 @@ void BgInibsMovebg_Init(Actor* thisx, GlobalContext* globalCtx);
void BgInibsMovebg_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgInibsMovebg_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
const ActorInit Bg_Inibs_Movebg_InitVars = {
ACTOR_BG_INIBS_MOVEBG,
ACTORCAT_BG,
@@ -27,17 +26,56 @@ const ActorInit Bg_Inibs_Movebg_InitVars = {
(ActorFunc)BgInibsMovebg_Draw,
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80B96578[] = {
+extern Gfx D_06001C10[];
+extern Gfx D_06001DC0[];
+extern AnimatedMaterial D_06002598;
+extern Gfx D_06006140[];
+extern Gfx D_060062D8[];
+extern AnimatedMaterial D_06006858;
+Gfx* D_80B96560[] = { D_060062D8, D_06001DC0 };
+Gfx* D_80B96568[] = { D_06006140, D_06001C10 };
+AnimatedMaterial* D_80B96570[] = { &D_06006858, &D_06002598 };
+
+static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
};
-#endif
+void BgInibsMovebg_Init(Actor* thisx, GlobalContext* globalCtx) {
+ BgInibsMovebg* this = THIS;
-extern InitChainEntry D_80B96578[];
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ DynaPolyActor_Init(&this->dyna, 1);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Inibs_Movebg/BgInibsMovebg_Init.s")
+ this->unk_15C = D_80B96560[BGINIBSMOVEBG_GET_F(thisx)];
+ this->unk_160 = D_80B96568[BGINIBSMOVEBG_GET_F(thisx)];
+ this->unk_164 = D_80B96570[BGINIBSMOVEBG_GET_F(thisx)];
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Inibs_Movebg/BgInibsMovebg_Destroy.s")
+void BgInibsMovebg_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ BgInibsMovebg* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Inibs_Movebg/BgInibsMovebg_Draw.s")
+ DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+}
+
+void BgInibsMovebg_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ BgInibsMovebg* this = THIS;
+
+ AnimatedMaterial* animMat;
+ Gfx* dl1;
+ Gfx* dl2;
+
+ animMat = this->unk_164;
+ if (animMat != NULL) {
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(this->unk_164));
+ }
+
+ dl1 = this->unk_15C;
+ if (dl1 != NULL) {
+ func_800BDFC0(globalCtx, this->unk_15C);
+ }
+
+ dl2 = this->unk_160;
+ if (dl2 != NULL) {
+ func_800BE03C(globalCtx, this->unk_160);
+ }
+}
diff --git a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
index fea6c8a67e..92494a35f9 100644
--- a/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
+++ b/src/overlays/actors/ovl_Bg_Inibs_Movebg/z_bg_inibs_movebg.h
@@ -5,9 +5,13 @@
struct BgInibsMovebg;
+#define BGINIBSMOVEBG_GET_F(thisx) ((u16)((thisx)->params) & 0xF)
+
typedef struct BgInibsMovebg {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x24];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ Gfx* unk_15C;
+ /* 0x160 */ Gfx* unk_160;
+ /* 0x164 */ AnimatedMaterial* unk_164;
} BgInibsMovebg; // size = 0x168
extern const ActorInit Bg_Inibs_Movebg_InitVars;
diff --git a/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
index cc92791fcc..ac56722384 100644
--- a/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
+++ b/src/overlays/actors/ovl_Bg_Kin2_Fence/z_bg_kin2_fence.c
@@ -149,7 +149,7 @@ void BgKin2Fence_SpawnEyeSparkles(BgKin2Fence* this, GlobalContext* globalCtx, s
for (i = 0; i < 2; i++) {
Matrix_MultiplyVector3fByState(&eyeSparkleSpawnPositions[mask][i], &sp58);
- EffectSsKiraKira_SpawnDispersed(globalCtx, &sp58, &D_801D15B0, &D_801D15B0, &primColor, &envColor, 6000, -10);
+ EffectSsKiraKira_SpawnDispersed(globalCtx, &sp58, &gZeroVec3f, &gZeroVec3f, &primColor, &envColor, 6000, -10);
}
}
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 03c1733153..f0455bb05f 100644
--- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c
+++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c
@@ -555,8 +555,8 @@ void func_809DA460(Boss02Effects* effects, Vec3f* vec) {
if ((effects->unk_24 == 0) || (effects->unk_24 == 3)) {
effects->unk_24 = 4;
effects->unk_00 = *vec;
- Math_Vec3f_Copy(&effects->unk_0C, &D_801D15B0);
- Math_Vec3f_Copy(&effects->unk_18, &D_801D15B0);
+ Math_Vec3f_Copy(&effects->unk_0C, &gZeroVec3f);
+ Math_Vec3f_Copy(&effects->unk_18, &gZeroVec3f);
effects->unk_2C = 0xFF;
effects->unk_34 = 0.0f;
break;
@@ -1820,7 +1820,7 @@ void func_809DD934(Boss02* this, GlobalContext* globalCtx) {
if (D_809E0434 != NULL) {
D_809E0434->unk_203 = 0;
D_809E0434->unk_204 = 1.0f;
- D_809E0434->actor.world.pos.y = 60.0f;
+ D_809E0434->dyna.actor.world.pos.y = 60.0f;
}
player->actor.world.pos.x *= 10.0f;
@@ -1892,7 +1892,7 @@ void func_809DD934(Boss02* this, GlobalContext* globalCtx) {
if (D_809E0434 != 0) {
D_809E0434->unk_203 = 1;
D_809E0434->unk_204 = 0.1f;
- D_809E0434->actor.world.pos.y = 3155.0f;
+ D_809E0434->dyna.actor.world.pos.y = 3155.0f;
}
player->actor.world.pos.x *= 0.1f;
diff --git a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
index 4ce31a8a17..00385a1d1a 100644
--- a/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
+++ b/src/overlays/actors/ovl_Dm_Hina/z_dm_hina.h
@@ -10,7 +10,10 @@ typedef void (*DmHinaActionFunc)(struct DmHina*, GlobalContext*);
typedef struct DmHina {
/* 0x0000 */ Actor actor;
/* 0x0144 */ DmHinaActionFunc actionFunc;
- /* 0x0148 */ char unk_148[0x3C];
+ /* 0x0148 */ char unk_148[0x10];
+ /* 0x0158 */ f32 unk_158;
+ /* 0x015C */ f32 unk_15C;
+ /* 0x0160 */ char unk_160[0x24];
} DmHina; // size = 0x184
extern const ActorInit Dm_Hina_InitVars;
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 22e2498617..b37a3df2f9 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -5,6 +5,7 @@
*/
#include "z_door_warp1.h"
+#include "objects/object_warp1/object_warp1.h"
#define FLAGS 0x00000000
@@ -15,26 +16,39 @@ void DoorWarp1_Destroy(Actor* thisx, GlobalContext* globalCtx);
void DoorWarp1_Update(Actor* thisx, GlobalContext* globalCtx);
void DoorWarp1_Draw(Actor* thisx, GlobalContext* globalCtx);
+void DoorWarp1_SetupAction(DoorWarp1* this, DoorWarp1ActionFunc actionFunc);
+void func_808B8924(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B8A7C(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B8C48(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B8E78(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B9094(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B90CC(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B921C(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B93A0(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B94A4(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9524(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B958C(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B96A0(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B96B0(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B977C(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9840(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B98A8(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9B30(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9BE8(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9CE8(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9E94(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B9ED8(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808B9F10(DoorWarp1* this, GlobalContext* globalCtx);
void func_808B9FD0(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808BA10C(DoorWarp1* this, GlobalContext* globalCtx);
void func_808BA550(DoorWarp1* this, GlobalContext* globalCtx);
void func_808BAAF4(DoorWarp1* this, GlobalContext* globalCtx);
void func_808BABF4(DoorWarp1* this, GlobalContext* globalCtx);
+void func_808BB8D4(DoorWarp1* this, GlobalContext* globalCtx, s32 arg2);
-void DoorWarp1_SetupAction(DoorWarp1* this, DoorWarp1ActionFunc actionFunc);
+static s16 D_808BC000;
+static f32 D_808BC004;
-#if 0
const ActorInit Door_Warp1_InitVars = {
ACTOR_DOOR_WARP1,
ACTORCAT_ITEMACTION,
@@ -47,92 +61,1114 @@ const ActorInit Door_Warp1_InitVars = {
(ActorFunc)DoorWarp1_Draw,
};
+static InitChainEntry sInitChain[] = {
+ ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneDownward, 4000, ICHAIN_STOP),
+};
+
+void DoorWarp1_SetupAction(DoorWarp1* this, DoorWarp1ActionFunc actionFunc) {
+ this->actionFunc = actionFunc;
+}
+
+s32 func_808B849C(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 ret = 0;
+
+ if ((globalCtx->sceneNum == SCENE_MITURIN_BS) && !CHECK_QUEST_ITEM(QUEST_REMAINS_ODOWLA)) {
+ ret = 1;
+ } else if ((globalCtx->sceneNum == SCENE_HAKUGIN_BS) && !CHECK_QUEST_ITEM(QUEST_REMAINS_GOHT)) {
+ ret = 2;
+ } else if ((globalCtx->sceneNum == SCENE_SEA_BS) && !CHECK_QUEST_ITEM(QUEST_REMAINS_GYORG)) {
+ ret = 3;
+ } else if ((globalCtx->sceneNum == SCENE_INISIE_BS) && !CHECK_QUEST_ITEM(QUEST_REMAINS_TWINMOLD)) {
+ ret = 4;
+ }
+ return ret;
+}
+
+void func_808B8568(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 0, 0, 0, 0);
+ this->unk_1DC = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &this->unk_1E0);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 0, 0, 0, 0);
+ this->unk_1F0 = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &this->unk_1F4);
+}
+
+s32 func_808B866C(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ s32 ret = false;
+
+ if ((fabsf(this->dyna.actor.xzDistToPlayer) < 60.0f) &&
+ (((player->actor.world.pos.y - 20.0f) < this->dyna.actor.world.pos.y) &&
+ (this->dyna.actor.world.pos.y < (player->actor.world.pos.y + 20.0f)))) {
+ ret = true;
+ }
+ return ret;
+}
+
+void DoorWarp1_Init(Actor* thisx, GlobalContext* globalCtx) {
+ DoorWarp1* this = THIS;
+
+ this->unk_1CC = 0;
+ this->unk_202 = 0;
+ this->unk_203 = 0;
+ this->unk_1A0 = NULL;
+ this->unk_1C0 = 0.0f;
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ ActorShape_Init(&this->dyna.actor.shape, 0.0f, NULL, 0.0f);
+
+ this->unk_1D3 = 0;
+ this->unk_1D4 = 0;
+ this->unk_203 = 0;
+ this->unk_204 = 1.0f;
+
+ switch (DOORWARP1_GET_FF(&this->dyna.actor)) {
+ case ENDOORWARP1_FF_0:
+ case ENDOORWARP1_FF_1:
+ case ENDOORWARP1_FF_2:
+ case ENDOORWARP1_FF_3:
+ case ENDOORWARP1_FF_4:
+ case ENDOORWARP1_FF_5:
+ func_808B8568(this, globalCtx);
+ break;
+ }
+
+ switch (DOORWARP1_GET_FF(&this->dyna.actor)) {
+ case ENDOORWARP1_FF_0:
+ func_808B8924(this, globalCtx);
+ break;
+
+ case ENDOORWARP1_FF_1:
+ func_808B8A7C(this, globalCtx);
+ break;
+
+ case ENDOORWARP1_FF_2:
+ case ENDOORWARP1_FF_3:
+ case ENDOORWARP1_FF_4:
+ case ENDOORWARP1_FF_5:
+ this->unk_1D3 = 1;
+ DynaPolyActor_Init(&this->dyna, 0);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_warp1_Colheader_008BD4);
+ func_808B8C48(this, globalCtx);
+ break;
+
+ case ENDOORWARP1_FF_6:
+ func_808B8E78(this, globalCtx);
+ break;
+ }
+
+ if ((globalCtx->sceneNum == SCENE_MITURIN_BS) || (globalCtx->sceneNum == SCENE_HAKUGIN_BS) ||
+ (globalCtx->sceneNum == SCENE_INISIE_BS) || (globalCtx->sceneNum == SCENE_SEA_BS)) {
+ func_800FE484();
+ globalCtx->interfaceCtx.restrictions.unk_312 = 1;
+ globalCtx->interfaceCtx.restrictions.songOfSoaring = 1;
+ }
+}
+
+void DoorWarp1_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ DoorWarp1* this = THIS;
+ s16 i;
+
+ LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, this->unk_1DC);
+ LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, this->unk_1F0);
+
+ for (i = 0; i < ARRAY_COUNT(globalCtx->envCtx.unk_8C.diffuseColor1); i++) {
+ globalCtx->envCtx.unk_8C.diffuseColor1[i] = 0;
+ globalCtx->envCtx.unk_8C.fogColor[i] = globalCtx->envCtx.unk_8C.diffuseColor1[i];
+ globalCtx->envCtx.unk_8C.ambientColor[i] = globalCtx->envCtx.unk_8C.diffuseColor1[i];
+ }
+
+ if (this->unk_1D3 != 0) {
+ DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ }
+}
+
+void func_808B8924(DoorWarp1* this, GlobalContext* globalCtx) {
+ this->unk_1C4 = 0;
+ this->unk_1C6 = -140;
+ this->unk_1C8 = -80;
+ this->unk_1BC = 1.0f;
+ this->unk_1B0 = 0.0f;
+ this->unk_1B4 = 0.0f;
+ this->unk_1B8 = 0.0f;
+ this->unk_1A4 = 0.3f;
+ this->unk_1A8 = 0.3f;
+ this->unk_1AC = 0.0f;
+ this->dyna.actor.shape.yOffset = 1.0f;
+ this->unk_1D0 = 0;
+ D_808BC000 = 100;
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ DoorWarp1_SetupAction(this, func_808B96B0);
+}
+
+void func_808B8A7C(DoorWarp1* this, GlobalContext* globalCtx) {
+ SkelAnime_Init(globalCtx, &this->skelAnime, &object_warp1_Skel_002CA8, &object_warp1_Anim_001374, NULL, NULL, 0);
+ Animation_ChangeImpl(&this->skelAnime, &object_warp1_Anim_001374, 1.0f, 1.0f, 1.0f, 2, 40.0f, 1);
+ this->unk_1C4 = 0;
+ this->unk_1C6 = -140;
+ this->unk_1C8 = -80;
+ this->unk_1D0 = 0;
+ this->unk_1BC = 1.0f;
+ this->unk_1A4 = 0.3f;
+ this->unk_1A8 = 0.3f;
+ this->unk_1B0 = 0.0f;
+ this->unk_1B4 = 0.0f;
+ this->unk_1B8 = 0.0f;
+ this->unk_1AC = 0.0f;
+ this->dyna.actor.shape.yOffset = -400.0f;
+ D_808BC000 = 160;
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ DoorWarp1_SetupAction(this, func_808B9B30);
+}
+
+void func_808B8C48(DoorWarp1* this, GlobalContext* globalCtx) {
+ this->dyna.actor.shape.yOffset = 0.0f;
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 255);
+ if (((DOORWARP1_GET_FF(&this->dyna.actor) == ENDOORWARP1_FF_2) && CHECK_QUEST_ITEM(QUEST_REMAINS_ODOWLA)) ||
+ ((DOORWARP1_GET_FF(&this->dyna.actor) == ENDOORWARP1_FF_3) && CHECK_QUEST_ITEM(QUEST_REMAINS_GOHT)) ||
+ ((DOORWARP1_GET_FF(&this->dyna.actor) == ENDOORWARP1_FF_4) && CHECK_QUEST_ITEM(QUEST_REMAINS_GYORG)) ||
+ ((DOORWARP1_GET_FF(&this->dyna.actor) == ENDOORWARP1_FF_5) && CHECK_QUEST_ITEM(QUEST_REMAINS_TWINMOLD))) {
+ s16 params = DOORWARP1_GET_FF00_2(&this->dyna.actor);
+
+ params |= 6;
+ Actor_SpawnAsChild(&globalCtx->actorCtx, &this->dyna.actor, globalCtx, ACTOR_DOOR_WARP1,
+ this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 10.0f,
+ this->dyna.actor.world.pos.z, this->dyna.actor.world.rot.x, this->dyna.actor.world.rot.y,
+ this->dyna.actor.world.rot.z, params);
+ DoorWarp1_SetupAction(this, func_808BAAF4);
+ } else {
+ DoorWarp1_SetupAction(this, func_808BABF4);
+ }
+}
+
+void func_808B8E78(DoorWarp1* this, GlobalContext* globalCtx) {
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 0);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 200, 255, 255, 0);
+ Actor_SetScale(&this->dyna.actor, 3.0f);
+ this->unk_1D4 = 1;
+ this->unk_1D0 = 0;
+ this->unk_1A8 = 0.0f;
+ this->unk_1AC = 0.0f;
+ this->unk_1A4 = 700.0f;
+ if (globalCtx->sceneNum == SCENE_INISIE_N) {
+ DoorWarp1_SetupAction(this, func_808B96A0);
+ } else if (gSaveContext.weekEventReg[86] & 0x80) {
+ this->unk_1D4 = 0;
+ DoorWarp1_SetupAction(this, func_808B921C);
+ } else {
+ DoorWarp1_SetupAction(this, func_808B9094);
+ }
+}
+
+s32 func_808B900C(DoorWarp1* this, GlobalContext* globalCtx) {
+ u32 index;
+ u8 ret = false;
+
+ if (func_800EE29C(globalCtx, 0x239)) {
+ index = func_800EE200(globalCtx, 0x239);
+ if (this->unk_208 != globalCtx->csCtx.npcActions[index]->unk0) {
+ this->unk_208 = globalCtx->csCtx.npcActions[index]->unk0;
+ if (globalCtx->csCtx.npcActions[index]->unk0 == 2) {
+ ret = true;
+ }
+ }
+ }
+
+ return ret;
+}
+
+void func_808B9094(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (func_808B900C(this, globalCtx)) {
+ DoorWarp1_SetupAction(this, func_808B90CC);
+ }
+}
+
+void func_808B90CC(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+ s16 sp2E = 0;
+ f32 phi_f0 = 0.0f;
+
+ if (globalCtx->sceneNum == SCENE_MITURIN) {
+ sp2E = -10;
+ phi_f0 = -5.0f;
+ } else if (globalCtx->sceneNum == SCENE_HAKUGIN) {
+ sp2E = -20;
+ } else if (globalCtx->sceneNum == SCENE_SEA) {
+ sp2E = -20;
+ }
+
+ Math_SmoothStepToF(&this->unk_1AC, 40.0f, 0.5f, 1.2f + phi_f0, 0.01f);
+ Math_SmoothStepToF(&this->unk_1A4, 0.0f, 0.5f, 12.0f, 0.1f);
+ if ((this->unk_1A4 < 460.0f) && (this->unk_1A4 > 100.0f)) {
+ func_808BB8D4(this, globalCtx, 6);
+ }
+
+ if (this->unk_1A4 < 0.1f) {
+ this->unk_1D0 = sp2E + 30;
+ this->unk_1D4 = 0;
+ DoorWarp1_SetupAction(this, func_808B921C);
+ }
+
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WARP_HOLE_ENERGY - SFX_FLAG);
+}
+
+void func_808B921C(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (this->unk_1D0 != 0) {
+ this->unk_1D0--;
+ return;
+ }
+
+ Math_SmoothStepToF(&this->unk_1A8, 1.0f, 0.2f, 0.05f, 0.01f);
+ this->unk_203 = (u8)(this->unk_1A8 * 200.0f);
+ if (this->unk_1A8 > 0.8f) {
+ func_808BB8D4(this, globalCtx, 1);
+ }
+
+ if (func_808B866C(this, globalCtx) && !func_801690CC(globalCtx)) {
+ func_800B7298(globalCtx, &this->dyna.actor, 7);
+ func_801518B0(globalCtx, 0xF2, &this->dyna.actor);
+ DoorWarp1_SetupAction(this, func_808B93A0);
+ }
+
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+}
+
+void func_808B93A0(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Player* player = GET_PLAYER(globalCtx);
+
+ if ((func_80152498(&globalCtx->msgCtx) == 4) && func_80147624(globalCtx)) {
+ func_801477B4(globalCtx);
+ if (globalCtx->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ func_800B7298(globalCtx, &this->dyna.actor, 9);
+ player->unk_3A0.x = this->dyna.actor.world.pos.x;
+ player->unk_3A0.z = this->dyna.actor.world.pos.z;
+ this->unk_1CA = 1;
+ DoorWarp1_SetupAction(this, func_808B9524);
+ } else {
+ func_8019F230();
+ func_800B7298(globalCtx, &this->dyna.actor, 6);
+ DoorWarp1_SetupAction(this, func_808B94A4);
+ }
+ }
+ func_808BB8D4(this, globalCtx, 1);
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+}
+
+void func_808B94A4(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (!func_808B866C(this, globalCtx) && (ActorCutscene_GetCurrentIndex() != globalCtx->unk_1879C[8])) {
+ DoorWarp1_SetupAction(this, func_808B921C);
+ }
+ func_808BB8D4(this, globalCtx, 1);
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BOSS_WARP_HOLE - SFX_FLAG);
+}
+
+void func_808B9524(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (!ActorCutscene_GetCanPlayNext(globalCtx->unk_1879C[9])) {
+ ActorCutscene_SetIntentToPlay(globalCtx->unk_1879C[9]);
+ } else {
+ ActorCutscene_Start(globalCtx->unk_1879C[9], NULL);
+ DoorWarp1_SetupAction(this, func_808B958C);
+ }
+}
+
+void func_808B958C(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ func_808BB8D4(this, globalCtx, 1);
+
+ if (this->unk_1CA > 100) {
+ if (player->actor.velocity.y < 10.0f) {
+ player->actor.gravity = 0.1f;
+ } else {
+ player->actor.gravity = 0.0f;
+ }
+ } else {
+ this->unk_1CA++;
+ }
+
+ this->unk_1D0++;
+ if ((this->unk_1D0 > 120) && (gSaveContext.nextCutsceneIndex == 0xFFEF)) {
+ func_808BA10C(this, globalCtx);
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ }
+
+ Math_SmoothStepToF(&this->unk_1A8, 6.0f, 0.2f, 0.02f, 0.01f);
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_LINK_WARP - SFX_FLAG);
+}
+
+void func_808B96A0(DoorWarp1* this, GlobalContext* globalCtx) {
+}
+
+void func_808B96B0(DoorWarp1* this, GlobalContext* globalCtx) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Math_SmoothStepToF(&this->unk_1B0, 255.0f, 0.4f, 10.0f, 0.01f);
+ Math_SmoothStepToF(&this->unk_1B4, 255.0f, 0.4f, 10.0f, 0.01f);
+
+ if (this->unk_1C4 < 100) {
+ this->unk_1C4 += 2;
+ }
+
+ if (this->unk_1C6 < 120) {
+ this->unk_1C6 += 4;
+ }
+
+ if (this->unk_1C8 < 230) {
+ this->unk_1C8 += 4;
+ } else {
+ DoorWarp1_SetupAction(this, func_808B977C);
+ }
+}
+
+void func_808B977C(DoorWarp1* this, GlobalContext* globalCtx) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ if (func_808B866C(this, globalCtx) && !func_801690CC(globalCtx)) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ func_801A5CFC(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8);
+ func_800B7298(globalCtx, &this->dyna.actor, 9);
+ player->unk_3A0.x = this->dyna.actor.world.pos.x;
+ player->unk_3A0.z = this->dyna.actor.world.pos.z;
+ this->unk_1CA = 1;
+ DoorWarp1_SetupAction(this, func_808B9840);
+ }
+}
+
+void func_808B9840(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (!ActorCutscene_GetCanPlayNext(globalCtx->unk_1879C[9])) {
+ ActorCutscene_SetIntentToPlay(globalCtx->unk_1879C[9]);
+ } else {
+ ActorCutscene_Start(globalCtx->unk_1879C[9], NULL);
+ DoorWarp1_SetupAction(this, func_808B98A8);
+ }
+}
+
+void func_808B98A8(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (this->unk_1CA > 100) {
+ if (player->actor.velocity.y < 10.0f) {
+ player->actor.gravity = 0.1f;
+ } else {
+ player->actor.gravity = 0.0f;
+ }
+ } else {
+ this->unk_1CA++;
+ }
+
+ Math_SmoothStepToF(&this->unk_1B0, 0.0f, 0.2f, 6.0f, 0.01f);
+
+ this->unk_1D0++;
+ if (D_808BC000 < this->unk_1D0) {
+ if ((gSaveContext.nextCutsceneIndex == 0xFFEF) && (D_808BC000 < this->unk_1D0) &&
+ (gSaveContext.nextCutsceneIndex == 0xFFEF)) {
+ if (DOORWARP1_GET_FF00_1(&this->dyna.actor) != 0xFF) {
+ globalCtx->nextEntranceIndex = globalCtx->setupExitList[DOORWARP1_GET_FF00_3(&this->dyna.actor)];
+ Scene_SetExitFade(globalCtx);
+ globalCtx->sceneLoadFlag = 0x14;
+ } else {
+ func_80169FDC(globalCtx);
+ }
+ }
+ }
+
+ Math_StepToF(&this->unk_1A4, 2.0f, 0.01f);
+ Math_StepToF(&this->unk_1A8, 10.0f, 0.02f);
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, player->actor.world.pos.x + 10, player->actor.world.pos.y + 10,
+ player->actor.world.pos.z + 10, 235, 255, 255, 255);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, player->actor.world.pos.x - 10, player->actor.world.pos.y - 10,
+ player->actor.world.pos.z - 10, 235, 255, 255, 255);
+ Math_SmoothStepToF(&this->dyna.actor.shape.yOffset, 0.0f, 0.5f, 2.0f, 0.1f);
+}
+
+void func_808B9B30(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (fabsf(this->dyna.actor.xzDistToPlayer) >= 60.0f) {
+ if (func_808B849C(this, globalCtx)) {
+ this->unk_1A0 =
+ (DmHina*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->dyna.actor, globalCtx, ACTOR_DM_HINA,
+ this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, 0, 0, 0, func_808B849C(this, globalCtx) - 1);
+ }
+ DoorWarp1_SetupAction(this, func_808B9BE8);
+ }
+}
+
+void func_808B9BE8(DoorWarp1* this, GlobalContext* globalCtx) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ Math_SmoothStepToF(&this->unk_1B0, 255.0f, 0.2f, 2.0f, 0.1f);
+ Math_SmoothStepToF(&this->unk_1B4, 255.0f, 0.2f, 2.0f, 0.1f);
+ if (this->unk_1C4 < 10) {
+ this->unk_1C4 += 2;
+ }
+
+ if (this->unk_1C6 < 120) {
+ this->unk_1C6 += 4;
+ }
+
+ if (this->unk_1C8 < 230) {
+ this->unk_1C8 += 4;
+ return;
+ }
+
+ this->dyna.actor.parent = NULL;
+ if (func_808B849C(this, globalCtx)) {
+ this->unk_202 = 1;
+ DoorWarp1_SetupAction(this, func_808B9CE8);
+ } else {
+ DoorWarp1_SetupAction(this, func_808B9F10);
+ }
+}
+
+void func_808B9CE8(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (this->unk_203 != 0) {
+ if (1) {}
+ return;
+ }
+
+ if (!Actor_HasParent(&this->dyna.actor, globalCtx)) {
+ func_800B8A1C(&this->dyna.actor, globalCtx, func_808B849C(this, globalCtx) + 84, 30.0f, 80.0f);
+ return;
+ }
+
+ switch (globalCtx->sceneNum) {
+ case SCENE_MITURIN_BS:
+ gSaveContext.roomInf[126][3] =
+ (((void)0, gSaveContext.roomInf[126][3]) & 0xFFFFFF00) | (((u8)gSaveContext.roomInf[126][4]) & 0xFF);
+ break;
+
+ case SCENE_HAKUGIN_BS:
+ gSaveContext.roomInf[126][3] = (((void)0, gSaveContext.roomInf[126][3]) & 0xFFFF00FF) |
+ ((((u8)gSaveContext.roomInf[126][4]) & 0xFF) << 8);
+ break;
+
+ case SCENE_INISIE_BS:
+ gSaveContext.roomInf[126][3] = (((void)0, gSaveContext.roomInf[126][3]) & 0xFF00FFFF) |
+ ((((u8)gSaveContext.roomInf[126][4]) & 0xFF) << 0x10);
+ break;
+
+ case SCENE_SEA_BS:
+ gSaveContext.roomInf[126][3] = (((void)0, gSaveContext.roomInf[126][3]) & 0x00FFFFFF) |
+ ((((u8)gSaveContext.roomInf[126][4]) & 0xFF) << 0x18);
+ break;
+ }
+
+ gSaveContext.roomInf[126][4] =
+ (gSaveContext.roomInf[126][4] & 0xFFFFFF00) | ((((u8)gSaveContext.roomInf[126][4]) + 1) & 0xFF);
+ Item_Give(globalCtx, func_808B849C(this, globalCtx) + (ITEM_REMAINS_ODOLWA - 1));
+ DoorWarp1_SetupAction(this, func_808B9E94);
+}
+
+void func_808B9E94(DoorWarp1* this, GlobalContext* globalCtx) {
+ if (func_80152498(&globalCtx->msgCtx) == 2) {
+ this->unk_1CE = 110;
+ DoorWarp1_SetupAction(this, func_808B9ED8);
+ }
+}
+
+void func_808B9ED8(DoorWarp1* this, GlobalContext* globalCtx) {
+ this->unk_1CE--;
+ if (this->unk_1CE <= 0) {
+ func_808BA10C(this, globalCtx);
+ }
+}
+
+void func_808B9F10(DoorWarp1* this, GlobalContext* globalCtx) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_WARP_HOLE - SFX_FLAG);
+ if ((this->unk_203 == 0) && func_808B866C(this, globalCtx) && !func_801690CC(globalCtx) && (this->unk_203 == 0)) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ Interface_ChangeAlpha(1);
+ func_800B7298(globalCtx, &this->dyna.actor, 9);
+ player->unk_3A0.x = this->dyna.actor.world.pos.x;
+ player->unk_3A0.z = this->dyna.actor.world.pos.z;
+ this->unk_1CA = 20;
+ DoorWarp1_SetupAction(this, func_808B9FD0);
+ }
+}
+
+void func_808B9FD0(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ Player* player2 = GET_PLAYER(globalCtx);
+
+ if (this->unk_1CA != 0) {
+ this->unk_1CA--;
+ return;
+ }
+
+ if (!ActorCutscene_GetCanPlayNext(globalCtx->unk_1879C[9])) {
+ ActorCutscene_SetIntentToPlay(globalCtx->unk_1879C[9]);
+ } else {
+ ActorCutscene_Start(globalCtx->unk_1879C[9], NULL);
+ func_801A5CFC(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &D_801DB4B0, &D_801DB4B0, &D_801DB4B8);
+ Animation_ChangeImpl(&this->skelAnime, &object_warp1_Anim_001374, 1.0f,
+ Animation_GetLastFrame(&object_warp1_Anim_001374.common),
+ Animation_GetLastFrame(&object_warp1_Anim_001374.common), 2, 40.0f, 1);
+ this->unk_1CA = 50;
+ D_808BC004 = player2->actor.world.pos.y;
+ DoorWarp1_SetupAction(this, func_808BA550);
+ }
+}
+
+void func_808BA10C(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 phi_v0_2;
+ u8 phi_a0;
+ s32 phi_v0_3;
+
+ if ((globalCtx->sceneNum == SCENE_MITURIN_BS) || (globalCtx->sceneNum == SCENE_HAKUGIN_BS) ||
+ (globalCtx->sceneNum == SCENE_INISIE_BS) || (globalCtx->sceneNum == SCENE_SEA_BS)) {
+ D_801F4DE2 = globalCtx->sceneNum;
+ if (globalCtx->sceneNum == SCENE_MITURIN_BS) {
+ phi_v0_2 = 0;
+ } else if (globalCtx->sceneNum == SCENE_HAKUGIN_BS) {
+ phi_v0_2 = 1;
+ } else if (globalCtx->sceneNum == SCENE_INISIE_BS) {
+ phi_v0_2 = 2;
+ } else if (globalCtx->sceneNum == SCENE_SEA_BS) {
+ phi_v0_2 = 3;
+ } else {
+ phi_v0_2 = 0;
+ }
+
+ if (this->unk_202 != 0) {
+ if (phi_v0_2 > 0) {
+ gSaveContext.weekEventReg[7] |= 0x80;
+ }
+
+ switch (phi_v0_2) {
+ case 0:
+ phi_a0 = gSaveContext.roomInf[126][3] & 0xFF;
+ break;
+
+ case 1:
+ phi_a0 = (gSaveContext.roomInf[126][3] & 0xFF00) >> 8;
+ break;
+
+ case 2:
+ phi_a0 = (gSaveContext.roomInf[126][3] & 0xFF0000) >> 0x10;
+ break;
+
+ case 3:
+ phi_a0 = (gSaveContext.roomInf[126][3] & 0xFF000000) >> 0x18;
+ break;
+
+ default:
+ phi_a0 = 0;
+ break;
+ }
+
+ switch (phi_a0) {
+ case 0:
+ phi_v0_3 = 10;
+ break;
+
+ case 1:
+ phi_v0_3 = 0;
+ break;
+
+ case 2:
+ phi_v0_3 = 1;
+ break;
+
+ case 3:
+ phi_v0_3 = 2;
+ break;
+
+ default:
+ phi_v0_3 = 10;
+ break;
+ }
+
+ globalCtx->nextEntranceIndex = 0xCC00;
+ if (phi_v0_3 < 10) {
+ gSaveContext.nextCutsceneIndex = phi_v0_3 + 0xFFF0;
+ }
+
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ } else {
+ switch (phi_v0_2) {
+ case 0:
+ if (gSaveContext.weekEventReg[20] & 2) {
+ gSaveContext.weekEventReg[7] |= 0x80;
+ globalCtx->nextEntranceIndex = 0x3010;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ } else {
+ globalCtx->nextEntranceIndex = 0x8600;
+ gSaveContext.nextCutsceneIndex = 0xFFF0;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ }
+ break;
+
+ case 1:
+ gSaveContext.weekEventReg[33] |= 0x80;
+ globalCtx->nextEntranceIndex = 0xAE70;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ break;
+
+ case 3:
+ if (gSaveContext.weekEventReg[55] & 0x80) {
+ globalCtx->nextEntranceIndex = 0x6A90;
+ gSaveContext.nextCutsceneIndex = 0xFFF0;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ } else {
+ gSaveContext.weekEventReg[55] |= 0x80;
+ globalCtx->nextEntranceIndex = 0x6A80;
+ gSaveContext.nextCutsceneIndex = 0xFFF0;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ }
+ break;
+
+ case 2:
+ gSaveContext.weekEventReg[52] |= 0x20;
+ globalCtx->nextEntranceIndex = 0x20F0;
+ gSaveContext.nextCutsceneIndex = 0xFFF2;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 3;
+ gSaveContext.nextTransition = 3;
+ break;
+ }
+ }
+ } else if (DOORWARP1_GET_FF00_1(&this->dyna.actor) != 0xFF) {
+ if (DOORWARP1_GET_FF(&this->dyna.actor) == ENDOORWARP1_FF_6) {
+ gSaveContext.respawnFlag = ~1;
+ }
+ globalCtx->nextEntranceIndex = globalCtx->setupExitList[DOORWARP1_GET_FF00_3(&this->dyna.actor)];
+ Scene_SetExitFade(globalCtx);
+ globalCtx->sceneLoadFlag = 0x14;
+ } else {
+ func_80169FDC(globalCtx);
+ }
+}
+
+void func_808BA550(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player2 = GET_PLAYER(globalCtx);
+ Player* player = GET_PLAYER(globalCtx);
+ s16 i;
+ s32 temp_f16;
+ f32 temp_f0;
+ f32 temp_f2;
+ s32 temp;
+ s32 tempS;
+
+ if (this->unk_1CA != 0) {
+ this->unk_1CA--;
+ }
+
+ if (this->unk_1CA < 0x1F) {
+ temp_f0 = 0.0f;
+ switch (player2->transformation) {
+ case PLAYER_FORM_FIERCE_DEITY:
+ temp_f0 = -37.0f;
+ break;
+
+ case PLAYER_FORM_GORON:
+ temp_f0 = -37.0f;
+ break;
+
+ case PLAYER_FORM_ZORA:
+ temp_f0 = -37.0f;
+ break;
+
+ case PLAYER_FORM_DEKU:
+ temp_f0 = -20.0f;
+ break;
+
+ case PLAYER_FORM_HUMAN:
+ temp_f0 = -25.0f;
+ break;
+ }
+
+ temp_f2 = this->dyna.actor.world.pos.y + (this->dyna.actor.shape.yOffset * 0.1f) + temp_f0;
+
+ if (D_808BC004 < temp_f2) {
+ player->actor.world.pos.y = temp_f2;
+ }
+
+ if (this->unk_1CA <= 0) {
+ if (this->unk_1CC < 4000) {
+ this->unk_1CC += 40;
+ }
+ player->actor.world.rot.y -= this->unk_1CC;
+ player->actor.shape.rot.y -= this->unk_1CC;
+ }
+ Math_SmoothStepToF(&player->actor.world.pos.x, this->dyna.actor.world.pos.x, 0.5f, 0.1f, 0.01f);
+ Math_SmoothStepToF(&player->actor.world.pos.z, this->dyna.actor.world.pos.z, 0.5f, 0.1f, 0.01f);
+ }
+
+ this->unk_1D0++;
+ if ((D_808BC000 < this->unk_1D0) && (gSaveContext.nextCutsceneIndex == 0xFFEF)) {
+ func_808BA10C(this, globalCtx);
+ }
+
+ if (this->unk_1D0 > 140) {
+ globalCtx->envCtx.unk_E5 = 1;
+ temp_f0 = (this->unk_1D0 - 140) / 20.0f;
+ if (temp_f0 > 1.0f) {
+ temp_f0 = 1.0f;
+ }
+ globalCtx->envCtx.unk_E6[0] = 160;
+ globalCtx->envCtx.unk_E6[1] = 160;
+ globalCtx->envCtx.unk_E6[2] = 160;
+ globalCtx->envCtx.unk_E6[3] = 255.0f * temp_f0;
+ }
+
+ Lights_PointNoGlowSetInfo(&this->unk_1E0, player->actor.world.pos.x + 10.0f, player->actor.world.pos.y + 10.0f,
+ player->actor.world.pos.z + 10.0f, 235, 255, 255, 255);
+ Lights_PointNoGlowSetInfo(&this->unk_1F4, player->actor.world.pos.x - 10.0f, player->actor.world.pos.y - 10.0f,
+ player->actor.world.pos.z - 10.0f, 235, 255, 255, 255);
+ Math_SmoothStepToF(&this->dyna.actor.shape.yOffset, 800.0f, 0.2f, 15.0f, 0.01f);
+ this->dyna.actor.shape.rot.y += 0x320;
+ Math_SmoothStepToF(&this->unk_1BC, 1.13f, 0.2f, 0.1f, 0.01f);
+ Math_StepToF(&this->unk_1A4, 2.0f, 0.003f);
+ Math_StepToF(&this->unk_1A8, 10.0f, 0.006f);
+ Math_SmoothStepToF(&this->unk_1B0, 0.0f, 0.2f, 3.0f, 0.01f);
+ Math_SmoothStepToF(&this->unk_1B4, 0.0f, 0.2f, 2.0f, 0.01f);
+ Math_SmoothStepToF(&this->unk_1B8, 255.0f, 0.1f, 1.0f, 0.01f);
+
+ tempS = D_808BC000;
+ if (1) {}
+ temp_f0 = 1.0f - ((f32)(D_808BC000 - this->unk_1D0) / ((D_808BC000 - tempS) + 100));
+ if (temp_f0 > 0.0f) {
+ temp_f16 = -255.0f * temp_f0;
+
+ for (i = 0; i < 3; i++) {
+ globalCtx->envCtx.unk_8C.diffuseColor1[i] = temp_f16;
+ globalCtx->envCtx.unk_8C.fogColor[i] = temp_f16;
+ globalCtx->envCtx.unk_8C.ambientColor[i] = temp_f16;
+ }
+
+ globalCtx->envCtx.unk_8C.fogNear = -500.0f * temp_f0;
+ if (globalCtx->envCtx.unk_8C.fogNear < -300) {
+ globalCtx->roomCtx.currRoom.segment = NULL;
+ }
+ }
+}
+
+void func_808BAAF4(DoorWarp1* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ s16 cutscene;
+ f32 phi_f2;
+
+ phi_f2 = 200.0f;
+ if (globalCtx->sceneNum == SCENE_SEA) {
+ phi_f2 = 85.0f;
+ }
+
+ if (!(gSaveContext.weekEventReg[86] & 0x80) && (fabsf(this->dyna.actor.xzDistToPlayer) < phi_f2) &&
+ ((player->actor.world.pos.y - 20.0f) < this->dyna.actor.world.pos.y) &&
+ (this->dyna.actor.world.pos.y < (player->actor.world.pos.y + 20.0f))) {
+ cutscene = this->dyna.actor.cutscene;
+
+ if (ActorCutscene_GetCanPlayNext(cutscene)) {
+ ActorCutscene_Start(cutscene, &this->dyna.actor);
+ gSaveContext.weekEventReg[86] |= 0x80;
+ DoorWarp1_SetupAction(this, func_808BABF4);
+ } else {
+ ActorCutscene_SetIntentToPlay(cutscene);
+ }
+ }
+}
+
+void func_808BABF4(DoorWarp1* this, GlobalContext* globalCtx) {
+}
+
+void DoorWarp1_Update(Actor* thisx, GlobalContext* globalCtx) {
+ DoorWarp1* this = THIS;
+
+ if (this->unk_203 == 0) {
+ this->unk_204 = 1.0f;
+ }
+
+ if ((this->unk_1A0 != NULL) && (this->unk_1A0->unk_15C != this->unk_204)) {
+ this->unk_1A0->actor.world.pos.y = this->dyna.actor.world.pos.y;
+ this->unk_1A0->unk_158 = this->dyna.actor.world.pos.y;
+ this->unk_1A0->unk_15C = this->unk_204;
+ }
+
+ this->actionFunc(this, globalCtx);
+
+ if (DOORWARP1_GET_FF(&this->dyna.actor) < ENDOORWARP1_FF_2) {
+ Actor_SetScale(&this->dyna.actor, this->unk_1C4 / 100.0f);
+ }
+}
+
+void func_808BACCC(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 pad;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C2DC(globalCtx->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);
+
+ POLY_XLU_DISP = SkelAnime_Draw(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL,
+ &this->dyna.actor, POLY_XLU_DISP);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+
+ SkelAnime_Update(&this->skelAnime);
+}
+
+void func_808BAE9C(DoorWarp1* this, GlobalContext* globalCtx) {
+ s32 pad;
+ s32 pad2;
+ s32 sp94 = globalCtx->state.frames * 10;
+ f32 sp90;
+ f32 sp8C;
+ f32 phi_f12;
+ f32 sp84;
+
+ if (this->unk_1A4 >= 1.0f) {
+ sp90 = 0.0f;
+ } else {
+ sp90 = 1.0f - this->unk_1A4;
+ }
+
+ if (this->unk_1A8 >= 1.0f) {
+ sp8C = 0.0f;
+ } else {
+ sp8C = 1.0f - this->unk_1A8;
+ }
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ sp84 = 1.0f - ((2.0f - this->unk_1A4) / 1.7f);
+ this->unk_1AC += sp84 * 15.0f;
+ func_8012C2DC(globalCtx->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);
+
+ Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + 1.0f,
+ this->dyna.actor.world.pos.z, MTXMODE_NEW);
+ phi_f12 = 1.0f;
+ if (this->unk_203 != 0) {
+ phi_f12 = this->unk_204 * phi_f12;
+ }
+ Matrix_Scale(phi_f12, phi_f12, phi_f12, MTXMODE_APPLY);
+
+ gSPSegment(POLY_XLU_DISP++, 0x0A, Matrix_NewMtx(globalCtx->state.gfxCtx));
+ Matrix_StatePush();
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, sp94 & 0xFF, -((s16)(2.0f * this->unk_1AC) & 0x1FF), 0x100,
+ 0x100, 1, sp94 & 0xFF, -((s16)(2.0f * this->unk_1AC) & 0x1FF), 0x100, 0x100));
+
+ Matrix_InsertTranslation(0.0f, this->unk_1A4 * 230.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(((this->unk_1C6 * sp90) / 100.0f) + 1.0f, 1.0f, ((this->unk_1C6 * sp90) / 100.0f) + 1.0f,
+ MTXMODE_APPLY);
+
+ gSPSegment(POLY_XLU_DISP++, 0x09, Matrix_NewMtx(globalCtx->state.gfxCtx));
+ gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0001A0);
+
+ Matrix_StatePop();
+
+ if (this->unk_1B0 > 0.0f) {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255.0f * sp84, 255, 255, (u8)this->unk_1B0);
+ gDPSetEnvColor(POLY_XLU_DISP++, 0, 255.0f * sp84, 255, 255);
+
+ sp94 *= 2;
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, sp94 & 0xFF, -((s16)this->unk_1AC & 0x1FF), 0x100,
+ 0x100, 1, sp94 & 0xFF, -((s16)this->unk_1AC & 0x1FF), 0x100, 0x100));
+
+ Matrix_InsertTranslation(0.0f, this->unk_1A8 * 60.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_Scale(((this->unk_1C8 * sp8C) / 100.0f) + 1.0f, 1.0f, ((this->unk_1C8 * sp8C) / 100.0f) + 1.0f,
+ MTXMODE_APPLY);
+
+ gSPSegment(POLY_XLU_DISP++, 0x09, Matrix_NewMtx(globalCtx->state.gfxCtx));
+ gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0001A0);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_808BB4C4(DoorWarp1* this, GlobalContext* globalCtx) {
+ func_800BDFC0(globalCtx, object_warp1_DL_0076C0);
+}
+
+#ifdef NON_MATCHING
+// GraphicsContext should be compiler-managed?
+void func_808BB4F4(DoorWarp1* this, GlobalContext* globalCtx2) {
+ GlobalContext* globalCtx = globalCtx2;
+ GraphicsContext* gfxCtx;
+ Color_RGB8 sp64[] = {
+ { 50, 150, 0 },
+ { 100, 150, 200 },
+ { 0, 50, 200 },
+ { 120, 150, 0 },
+ };
+ s32 sp60 = 0;
+
+ if (this->unk_1D4 != 0) {
+ Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y + this->unk_1A4,
+ this->dyna.actor.world.pos.z, MTXMODE_NEW);
+ Matrix_Scale(4.0f, this->unk_1AC, 4.0f, MTXMODE_APPLY);
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_warp1_Matanimheader_0044D8));
+ func_800BE03C(globalCtx, object_warp1_DL_003230);
+ return;
+ }
+
+ if (globalCtx->sceneNum != SCENE_MITURIN) {
+ if (globalCtx->sceneNum == SCENE_HAKUGIN) {
+ sp60 = 1;
+ } else if (globalCtx->sceneNum == SCENE_SEA) {
+ sp60 = 2;
+ } else if (globalCtx->sceneNum == SCENE_INISIE_R) {
+ sp60 = 3;
+ }
+ }
+
+ Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z,
+ MTXMODE_NEW);
+ Matrix_RotateY(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, this->unk_1A8, 1.0f, MTXMODE_APPLY);
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_warp1_Matanimheader_0057D8));
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C2DC(globalCtx->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);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_004690);
+ gfxCtx = globalCtx->state.gfxCtx;
+
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_warp1_Matanimheader_007238));
+ Matrix_InsertTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z,
+ MTXMODE_NEW);
+ Matrix_RotateY(this->dyna.actor.world.rot.y, MTXMODE_APPLY);
+ Matrix_Scale(1.0f, 0.0f, 1.0f, MTXMODE_APPLY);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+
+ OPEN_DISPS(gfxCtx);
+
+ func_8012C2DC(globalCtx->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);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_warp1_DL_0058C8);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+#else
+static Color_RGB8 D_808BBB50[] = {
+ { 50, 150, 0 },
+ { 100, 150, 200 },
+ { 0, 50, 200 },
+ { 120, 150, 0 },
+};
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BB4F4.s")
#endif
-extern UNK_TYPE D_060001A0;
-extern UNK_TYPE D_06001374;
-extern UNK_TYPE D_060044D8;
-extern UNK_TYPE D_060076C0;
-extern UNK_TYPE D_06008BD4;
+void DoorWarp1_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ DoorWarp1* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/DoorWarp1_SetupAction.s")
+ switch (DOORWARP1_GET_FF(&this->dyna.actor)) {
+ case ENDOORWARP1_FF_0:
+ func_808BAE9C(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B849C.s")
+ case ENDOORWARP1_FF_1:
+ func_808BACCC(this, globalCtx);
+ func_808BAE9C(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B8568.s")
+ case ENDOORWARP1_FF_2:
+ case ENDOORWARP1_FF_3:
+ case ENDOORWARP1_FF_4:
+ case ENDOORWARP1_FF_5:
+ func_808BB4C4(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B866C.s")
+ case ENDOORWARP1_FF_6:
+ func_808BB4F4(this, globalCtx);
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/DoorWarp1_Init.s")
+#ifdef NON_MATCHING
+// casting/macro on temp_s1/s0
+void func_808BB8D4(DoorWarp1* this, GlobalContext* globalCtx, s32 arg2) {
+ static Vec3f D_808BBB5C = { 0.0f, 0.05f, 0.0f };
+ static Vec3f D_808BBB68 = { 0.0f, 0.25f, 0.0f };
+ Vec3f sp9C;
+ Color_RGBA8 sp98;
+ Color_RGBA8 sp94;
+ s32 i;
+ s16 temp_s0;
+ s32 temp_s1;
+ s32 phi_s2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/DoorWarp1_Destroy.s")
+ for (i = 0; i < arg2; i++) {
+ temp_s1 = (Rand_ZeroOne() * 0x10000);
+ temp_s0 = temp_s1 - 0x8000;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B8924.s")
+ sp9C.x = (-Math_SinS(temp_s0) * 35.0f) + this->dyna.actor.world.pos.x;
+ sp9C.y = this->dyna.actor.world.pos.y;
+ temp_s0 = (s16)(temp_s1 - 0x8000);
+ sp9C.z = Math_CosS(temp_s0) * 35.0f + this->dyna.actor.world.pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B8A7C.s")
+ D_808BBB5C.x = 0.0f;
+ D_808BBB68.y = 0.25f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B8C48.s")
+ sp98.r = 255;
+ sp98.g = 255;
+ sp98.b = 255;
+ sp94.r = 200;
+ sp94.g = 200;
+ sp94.b = 255;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B8E78.s")
+ D_808BBB5C.z = 0.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B900C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9094.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B90CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B921C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B93A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B94A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9524.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B958C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B96A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B96B0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B977C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9840.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B98A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9B30.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9BE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9CE8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9E94.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9ED8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9F10.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808B9FD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BA10C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BA550.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BAAF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BABF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/DoorWarp1_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BACCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BAE9C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BB4C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BB4F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/DoorWarp1_Draw.s")
+ temp_s1 = (s16)((Rand_ZeroOne() * 1000.0f) + 800.0f);
+ phi_s2 = 27;
+ if (arg2 >= 2) {
+ phi_s2 = 8;
+ D_808BBB68.y = 1.8f;
+ D_808BBB5C.x = -Math_SinS(temp_s0) * 5.0f;
+ D_808BBB5C.z = Math_CosS(temp_s0) * 5.0f;
+ }
+ EffectSsKiraKira_SpawnDispersed(globalCtx, &sp9C, &D_808BBB5C, &D_808BBB68, &sp98, &sp94, temp_s1, phi_s2);
+ }
+}
+#else
+static Vec3f D_808BBB5C = { 0.0f, 0.05f, 0.0f };
+static Vec3f D_808BBB68 = { 0.0f, 0.25f, 0.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Door_Warp1/func_808BB8D4.s")
+#endif
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 e7b67312e9..ca177006bd 100644
--- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
+++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.h
@@ -2,19 +2,58 @@
#define Z_DOOR_WARP1_H
#include "global.h"
+#include "overlays/actors/ovl_Dm_Hina/z_dm_hina.h"
struct DoorWarp1;
typedef void (*DoorWarp1ActionFunc)(struct DoorWarp1*, GlobalContext*);
+#define DOORWARP1_GET_FF(thisx) ((thisx)->params & 0xFF)
+#define DOORWARP1_GET_FF00_1(thisx) (((thisx)->params >> 8) & 0xFF)
+#define DOORWARP1_GET_FF00_2(thisx) ((thisx)->params & 0xFF00)
+#define DOORWARP1_GET_FF00_3(thisx) ((thisx)->params >> 8)
+
+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,
+};
+
typedef struct DoorWarp1 {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x94];
+ /* 0x0000 */ DynaPolyActor dyna;
+ /* 0x015C */ SkelAnime skelAnime;
+ /* 0x01A0 */ DmHina* unk_1A0;
+ /* 0x01A4 */ f32 unk_1A4;
+ /* 0x01A8 */ f32 unk_1A8;
+ /* 0x01AC */ f32 unk_1AC;
+ /* 0x01B0 */ f32 unk_1B0;
+ /* 0x01B4 */ f32 unk_1B4;
+ /* 0x01B8 */ f32 unk_1B8;
+ /* 0x01BC */ f32 unk_1BC;
+ /* 0x01C0 */ f32 unk_1C0;
+ /* 0x01C4 */ s16 unk_1C4;
+ /* 0x01C6 */ s16 unk_1C6;
+ /* 0x01C8 */ s16 unk_1C8;
+ /* 0x01CA */ s16 unk_1CA;
+ /* 0x01CC */ s16 unk_1CC;
+ /* 0x01CE */ s16 unk_1CE;
+ /* 0x01D0 */ u16 unk_1D0;
+ /* 0x01D2 */ s8 unk_1D2;
+ /* 0x01D3 */ u8 unk_1D3;
+ /* 0x01D4 */ u8 unk_1D4;
/* 0x01D8 */ DoorWarp1ActionFunc actionFunc;
- /* 0x01DC */ char unk_1DC[0x27];
+ /* 0x01DC */ LightNode* unk_1DC;
+ /* 0x01E0 */ LightInfo unk_1E0;
+ /* 0x01F0 */ LightNode* unk_1F0;
+ /* 0x01F4 */ LightInfo unk_1F4;
+ /* 0x0202 */ u8 unk_202;
/* 0x0203 */ u8 unk_203;
/* 0x0204 */ f32 unk_204;
- /* 0x0208 */ char unk_208[0x4];
+ /* 0x0208 */ u8 unk_208;
} DoorWarp1; // size = 0x20C
extern const ActorInit Door_Warp1_InitVars;
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 f2590f255b..4010b1e124 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.c
@@ -5,6 +5,7 @@
*/
#include "z_en_akindonuts.h"
+#include "objects/object_dnt/object_dnt.h"
#define FLAGS 0x00000039
@@ -15,7 +16,21 @@ void EnAkindonuts_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnAkindonuts_Update(Actor* thisx, GlobalContext* globalCtx);
void EnAkindonuts_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
+void func_80BEEDC0(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEEE10(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEEFA8(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF18C(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF20C(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF360(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF450(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF4B8(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF518(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF770(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF83C(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEF9F0(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEFAF0(EnAkindonuts* this, GlobalContext* globalCtx);
+void func_80BEFD74(EnAkindonuts* this, GlobalContext* globalCtx);
+
const ActorInit En_Akindonuts_InitVars = {
ACTOR_EN_AKINDONUTS,
ACTORCAT_NPC,
@@ -28,113 +43,1659 @@ const ActorInit En_Akindonuts_InitVars = {
(ActorFunc)EnAkindonuts_Draw,
};
-// static ColliderCylinderInitType1 sCylinderInit = {
-static ColliderCylinderInitType1 D_80BF02F0 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInitType1 sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 27, 32, 0, { 0, 0, 0 } },
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80BF04B4[] = {
+static ActorAnimationEntryS sAnimations[] = {
+ { &object_dnt_Anim_005488, 1.0f, 0, -1, 0, 0 }, { &object_dnt_Anim_00B0B4, 1.0f, 0, -1, 0, 0 },
+ { &object_dnt_Anim_004AA0, 1.0f, 0, -1, 2, 0 }, { &object_dnt_Anim_004E38, 1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_0029E8, 1.0f, 0, -1, 2, 0 }, { &object_dnt_Anim_005CA8, 1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_0038CC, 1.0f, 0, -1, 0, 0 }, { &object_dnt_Anim_003CC0, 1.0f, 0, -1, 0, 0 },
+ { &object_dnt_Anim_0012F4, 1.0f, 0, -1, 2, 0 }, { &object_dnt_Anim_004700, 1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_001BC8, 1.0f, 0, -1, 0, 0 }, { &object_dnt_Anim_003438, 1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_001E2C, 1.0f, 0, -1, 0, 0 }, { &object_dnt_Anim_000994, 1.0f, 0, -1, 0, 0 },
+ { &object_dnt_Anim_002268, 1.0f, 0, -1, 2, 0 }, { &object_dnt_Anim_002F08, 1.0f, 0, -1, 0, 0 },
+ { &object_dnt_Anim_00577C, 1.0f, 0, -1, 0, -4 }, { &object_dnt_Anim_0029E8, 1.0f, 8, -1, 2, 0 },
+ { &object_dnt_Anim_0029E8, 1.0f, 4, -1, 2, -4 }, { &object_dnt_Anim_0029E8, 1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_001BC8, 1.0f, 0, -1, 0, 0 }, { &object_dnt_Anim_0012F4, -1.0f, 0, -1, 2, 0 },
+ { &object_dnt_Anim_002670, 1.0f, 0, -1, 2, 0 },
+};
+
+static u16 D_80BF048C[] = {
+ 0x15E4,
+ 0x15F8,
+ 0x1609,
+ 0x161D,
+};
+
+static u16 D_80BF0494[] = {
+ 0x15E3,
+ 0x15F9,
+ 0x160A,
+ 0x161E,
+};
+
+static u16 D_80BF049C[] = {
+ 0x15E3,
+ 0x15F7,
+ 0x160C,
+ 0x161F,
+};
+
+static u16 D_80BF04A4[] = {
+ 0x15E3,
+ 0x15F7,
+ 0x160B,
+ 0x1621,
+};
+
+static u16 D_80BF04AC[] = {
+ 0x15E3,
+ 0x15F7,
+ 0x160B,
+ 0x1620,
+};
+
+static InitChainEntry sInitChain[] = {
ICHAIN_U8(targetMode, 0, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
-#endif
+void func_80BECBE0(EnAkindonuts* this, s16 arg1) {
+ f32 sp24 = Math_CosS(this->actor.world.rot.x) * this->actor.speedXZ;
-extern ColliderCylinderInit D_80BF02F0;
-extern InitChainEntry D_80BF04B4[];
+ this->actor.velocity.x = Math_SinS(this->actor.world.rot.y) * sp24;
+ this->actor.velocity.y = Math_SinS(this->actor.world.rot.x) * this->actor.speedXZ;
+ this->actor.velocity.z = Math_CosS(this->actor.world.rot.y) * sp24;
-extern UNK_TYPE D_06001350;
-extern UNK_TYPE D_06005488;
+ if (arg1) {
+ this->actor.velocity.x = 0.0f;
+ this->actor.velocity.z = 0.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECBE0.s")
+ Actor_ApplyMovement(&this->actor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECC7C.s")
+void func_80BECC7C(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if (this->unk_32C & 4) {
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECD10.s")
+ if (this->unk_32C & 2) {
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECEAC.s")
+s32 func_80BECD10(EnAkindonuts* this, Path* path, s32 arg2) {
+ Vec3s* sp5C = Lib_SegmentedToVirtual(path->points);
+ s32 sp58 = path->count;
+ s32 idx = arg2;
+ s32 sp50 = false;
+ f32 phi_f12;
+ f32 phi_f14;
+ f32 sp44;
+ f32 sp40;
+ f32 sp3C;
+ Vec3f sp30;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECF6C.s")
+ Math_Vec3s_ToVec3f(&sp30, &sp5C[idx]);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BECFBC.s")
+ if (idx == 0) {
+ phi_f12 = sp5C[1].x - sp5C[0].x;
+ phi_f14 = sp5C[1].z - sp5C[0].z;
+ } else if (idx == (sp58 - 1)) {
+ phi_f12 = sp5C[sp58 - 1].x - sp5C[sp58 - 2].x;
+ phi_f14 = sp5C[sp58 - 1].z - sp5C[sp58 - 2].z;
+ } else {
+ phi_f12 = sp5C[idx + 1].x - sp5C[idx - 1].x;
+ phi_f14 = sp5C[idx + 1].z - sp5C[idx - 1].z;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED034.s")
+ func_8017B7F8(&sp30, RADF_TO_BINANG(func_80086B30(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;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED090.s")
+ return sp50;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED140.s")
+f32 func_80BECEAC(Path* path, s32 arg1, Vec3f* pos, Vec3s* arg3) {
+ Vec3s* temp;
+ Vec3f sp20;
+ Vec3s* point;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED208.s")
+ if (path != NULL) {
+ temp = Lib_SegmentedToVirtual(path->points);
+ point = &temp[arg1];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED27C.s")
+ sp20.x = point->x;
+ sp20.y = point->y;
+ sp20.z = point->z;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED2FC.s")
+ arg3->y = Math_Vec3f_Yaw(pos, &sp20);
+ arg3->x = Math_Vec3f_Pitch(pos, &sp20);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED35C.s")
+ return sp20.y - pos->y;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED3BC.s")
+s16 func_80BECF6C(Path* path) {
+ Vec3s* sp34 = Lib_SegmentedToVirtual(path->points);
+ Vec3f sp28;
+ Vec3f sp1C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED680.s")
+ Math_Vec3s_ToVec3f(&sp28, &sp34[0]);
+ Math_Vec3s_ToVec3f(&sp1C, &sp34[1]);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BED8A4.s")
+ return Math_Vec3f_Yaw(&sp28, &sp1C);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEDB88.s")
+s32 func_80BECFBC(EnAkindonuts* this) {
+ switch (ENAKINDONUTS_GET_3(&this->actor)) {
+ case 0:
+ return 0x98;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEDDAC.s")
+ case 1:
+ return 0x99;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEE070.s")
+ case 2:
+ return 0x9A;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEE274.s")
+ case 3:
+ func_801149A0(ITEM_DEED_OCEAN, SLOT(ITEM_DEED_OCEAN));
+ return 0x7;
+ }
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEE530.s")
+s32 func_80BED034(EnAkindonuts* this) {
+ switch (ENAKINDONUTS_GET_3(&this->actor)) {
+ case 0:
+ return 0x35;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEE73C.s")
+ case 1:
+ return 0x1D;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEE938.s")
+ case 2:
+ return 0x5C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEEB20.s")
+ case 3:
+ return 0x5D;
+ }
+ return 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEEDC0.s")
+void func_80BED090(GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEEE10.s")
+ if (player->transformation == PLAYER_FORM_DEKU) {
+ gSaveContext.weekEventReg[63] |= 0x8;
+ gSaveContext.weekEventReg[63] &= (u8)~0x10;
+ } else if (player->transformation == PLAYER_FORM_ZORA) {
+ gSaveContext.weekEventReg[63] &= (u8)~0x8;
+ gSaveContext.weekEventReg[63] |= 0x10;
+ } else if (player->transformation == PLAYER_FORM_GORON) {
+ gSaveContext.weekEventReg[63] |= 0x8;
+ gSaveContext.weekEventReg[63] |= 0x10;
+ } else if (player->transformation == PLAYER_FORM_HUMAN) {
+ gSaveContext.weekEventReg[63] &= (u8)~0x8;
+ gSaveContext.weekEventReg[63] &= (u8)~0x10;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEEFA8.s")
+s32 func_80BED140(GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF18C.s")
+ if (player->transformation == PLAYER_FORM_DEKU) {
+ if ((gSaveContext.weekEventReg[63] & 0x8) && !(gSaveContext.weekEventReg[63] & 0x10)) {
+ return true;
+ }
+ } else if (player->transformation == PLAYER_FORM_ZORA) {
+ if (!(gSaveContext.weekEventReg[63] & 0x8) && (gSaveContext.weekEventReg[63] & 0x10)) {
+ return true;
+ }
+ } else if (player->transformation == PLAYER_FORM_GORON) {
+ if ((gSaveContext.weekEventReg[63] & 0x8) && (gSaveContext.weekEventReg[63] & 0x10)) {
+ return true;
+ }
+ } else if (player->transformation == PLAYER_FORM_HUMAN) {
+ if (!(gSaveContext.weekEventReg[63] & 0x8) && !(gSaveContext.weekEventReg[63] & 0x10)) {
+ return true;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF20C.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF360.s")
+s32 func_80BED208(EnAkindonuts* this) {
+ if (INV_CONTENT(ITEM_MAGIC_BEANS) != 10U) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF450.s")
+ if (gSaveContext.rupees < 10) {
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF4B8.s")
+ if (AMMO(ITEM_MAGIC_BEANS) >= 20) {
+ return 2;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF518.s")
+ this->unk_364 = -10;
+ this->unk_366 = 10;
+ return 3;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF770.s")
+s32 func_80BED27C(EnAkindonuts* this) {
+ if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 3) {
+ return 2;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF83C.s")
+ if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) < 2) {
+ return 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEF9F0.s")
+ if (gSaveContext.rupees < 200) {
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEFAF0.s")
+ this->unk_364 = -200;
+ this->unk_366 = 88;
+ return 3;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEFD74.s")
+s32 func_80BED2FC(EnAkindonuts* this) {
+ if (!func_80114E90()) {
+ return 2;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/EnAkindonuts_Init.s")
+ if (gSaveContext.rupees < 40) {
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/EnAkindonuts_Destroy.s")
+ this->unk_364 = -40;
+ this->unk_366 = 20;
+ return 3;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/EnAkindonuts_Update.s")
+s32 func_80BED35C(EnAkindonuts* this) {
+ if (!func_80114E90()) {
+ return 2;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BEFFB4.s")
+ if (gSaveContext.rupees < 100) {
+ return 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BF0178.s")
+ this->unk_364 = -100;
+ this->unk_366 = 21;
+ return 3;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/func_80BF0190.s")
+void func_80BED3BC(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Akindonuts/EnAkindonuts_Draw.s")
+ switch (this->unk_33C) {
+ case 0:
+ if (player->transformation != PLAYER_FORM_DEKU) {
+ this->unk_33C = 0x15E0;
+ break;
+ }
+ this->unk_33C = 0x15E7;
+ break;
+
+ case 0x15E0:
+ this->unk_33C = 0x15E1;
+ break;
+
+ case 0x15E1:
+ this->unk_33C = 0x15E2;
+ break;
+
+ case 0x15E2:
+ this->unk_33C = 0xFF;
+ break;
+
+ case 0x15E7:
+ if (!(gSaveContext.weekEventReg[61] & 0x20)) {
+ gSaveContext.weekEventReg[61] |= 0x20;
+ this->unk_33C = 0x15E8;
+ break;
+ }
+ this->unk_33C = 0x15E9;
+ break;
+
+ case 0x15E8:
+ this->unk_33C = 0x15E9;
+ break;
+
+ case 0x15E9:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED208(this)) {
+ case 0:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15EC;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15EE;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C &= ~0x1;
+ this->unk_32C |= 0x40;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x15EB;
+ break;
+ }
+ break;
+
+ case 0x15E4:
+ this->unk_33C = 0x15E5;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x15E5:
+ this->unk_33C = 0x15E6;
+ func_80BED090(globalCtx);
+ gSaveContext.weekEventReg[61] |= 0x10;
+ this->unk_32C |= 0x20;
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BED680(EnAkindonuts* this, GlobalContext* globalCtx) {
+ switch (this->unk_33C) {
+ case 0:
+ if (func_80BED140(globalCtx) && !(gSaveContext.weekEventReg[61] & 0x40)) {
+ gSaveContext.weekEventReg[61] |= 0x40;
+ this->unk_33C = 0x15F0;
+ break;
+ }
+
+ this->unk_33C = 0x15F2;
+ break;
+
+ case 0x15F0:
+ this->unk_33C = 0x15F1;
+ break;
+
+ case 0x15F1:
+ case 0x15F2:
+ this->unk_33C = 0x15F3;
+ break;
+
+ case 0x15F3:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 1;
+ if (this->unk_32C & 8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED208(this)) {
+ case 0:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15EC;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15EE;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x15EB;
+ break;
+ }
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BED8A4(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if (player->transformation == PLAYER_FORM_DEKU) {
+ this->unk_33C = 0x15F4;
+ break;
+ } else if (player->transformation == PLAYER_FORM_GORON) {
+ this->unk_33C = 0x15FE;
+ break;
+ }
+ this->unk_33C = 0x15FC;
+ break;
+
+ case 0x15F4:
+ this->unk_33C = 0x15F5;
+ break;
+
+ case 0x15F5:
+ this->unk_33C = 0x15F6;
+ break;
+
+ case 0x15F6:
+ this->unk_33C = 0xFF;
+ break;
+
+ case 0x15FC:
+ this->unk_33C = 0x15FD;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x15FE:
+ if (!(gSaveContext.weekEventReg[62] & 1)) {
+ gSaveContext.weekEventReg[62] |= 1;
+ this->unk_33C = 0x15FF;
+ break;
+ }
+ this->unk_33C = 0x1600;
+ break;
+
+ case 0x15FF:
+ this->unk_33C = 0x1600;
+ break;
+
+ case 0x1600:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED27C(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1601;
+ break;
+
+ case 0:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1602;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1603;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x1604;
+ break;
+ }
+ break;
+
+ case 0x15F9:
+ this->unk_33C = 0x15FA;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x15FA:
+ this->unk_33C = 0x15FB;
+ gSaveContext.weekEventReg[61] |= 0x80;
+ this->unk_32C |= 0x20;
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEDB88(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if ((player->transformation == PLAYER_FORM_DEKU) && !(gSaveContext.weekEventReg[62] & 2)) {
+ gSaveContext.weekEventReg[62] |= 0x2;
+ this->unk_33C = 0x15F0;
+ break;
+ }
+ this->unk_33C = 0x15F2;
+ break;
+
+ case 0x15F0:
+ this->unk_33C = 0x1605;
+ break;
+
+ case 0x15F2:
+ case 0x1605:
+ this->unk_33C = 0x1606;
+ break;
+
+ case 0x1606:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED27C(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1601;
+ break;
+
+ case 0:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1602;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1603;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x15EB;
+ break;
+ }
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEDDAC(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if (player->transformation == PLAYER_FORM_GORON) {
+ this->unk_33C = 0x1607;
+ break;
+ } else if (player->transformation == PLAYER_FORM_ZORA) {
+ this->unk_33C = 0x1610;
+ break;
+ }
+ this->unk_33C = 0x160E;
+ break;
+
+ case 0x1607:
+ this->unk_33C = 0x1608;
+ break;
+
+ case 0x1608:
+ this->unk_33C = 0x15E2;
+ break;
+
+ case 0x15E2:
+ this->unk_33C = 0xFF;
+ break;
+
+ case 0x160E:
+ this->unk_33C = 0x160F;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x1610:
+ if (!(gSaveContext.weekEventReg[62] & 8)) {
+ gSaveContext.weekEventReg[62] |= 8;
+ this->unk_33C = 0x1611;
+ break;
+ }
+ this->unk_33C = 0x1612;
+ break;
+
+ case 0x1611:
+ this->unk_33C = 0x1612;
+ break;
+
+ case 0x1612:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 0x8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED2FC(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1613;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x15EB;
+ break;
+ }
+ break;
+
+ case 0x160C:
+ this->unk_33C = 0x15FA;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x15FA:
+ this->unk_33C = 0x160D;
+ gSaveContext.weekEventReg[62] |= 0x4;
+ this->unk_32C |= 0x20;
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEE070(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if ((player->transformation == PLAYER_FORM_GORON) && !(gSaveContext.weekEventReg[62] & 0x10)) {
+ gSaveContext.weekEventReg[62] |= 0x10;
+ this->unk_33C = 0x1614;
+ break;
+ }
+ this->unk_33C = 0x1616;
+ break;
+
+ case 0x1614:
+ this->unk_33C = 0x1615;
+ break;
+
+ case 0x1615:
+ case 0x1616:
+ this->unk_33C = 0x1617;
+ break;
+
+ case 0x1617:
+ this->unk_33C = 0x1618;
+ break;
+
+ case 0x1618:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 0x8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED2FC(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1613;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x161A;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x1619;
+ break;
+ }
+ break;
+
+ case 0x161A:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEE274(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if (player->transformation == PLAYER_FORM_ZORA) {
+ this->unk_33C = 0x161B;
+ break;
+ }
+ this->unk_33C = 0x1624;
+ break;
+
+ case 0x161B:
+ this->unk_33C = 0x161C;
+ break;
+
+ case 0x161C:
+ this->unk_33C = 0x15E2;
+ break;
+
+ case 0x15E2:
+ this->unk_33C = 0xFF;
+ break;
+
+ case 0x1624:
+ if (!(gSaveContext.weekEventReg[62] & 0x40)) {
+ gSaveContext.weekEventReg[62] |= 0x40;
+ this->unk_33C = 0x1625;
+ break;
+ }
+ this->unk_33C = 0x1627;
+ break;
+
+ case 0x1625:
+ case 0x1627:
+ this->unk_33C = 0x1626;
+ break;
+
+ case 0x1626:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 0x8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED35C(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1613;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x1629;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x1628;
+ break;
+ }
+ break;
+
+ case 0x1621:
+ this->unk_33C = 0x1622;
+ this->unk_32C |= 1;
+ break;
+
+ case 0x1622:
+ this->unk_33C = 0x1623;
+ gSaveContext.weekEventReg[62] |= 0x20;
+ this->unk_32C |= 0x20;
+ break;
+
+ case 0x1629:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEE530(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ switch (this->unk_33C) {
+ case 0:
+ if ((player->transformation == PLAYER_FORM_ZORA) && !(gSaveContext.weekEventReg[62] & 0x80)) {
+ gSaveContext.weekEventReg[62] |= 0x80;
+ this->unk_33C = 0x162A;
+ break;
+ }
+ this->unk_33C = 0x162C;
+ break;
+
+ case 0x162A:
+ this->unk_33C = 0x162B;
+ break;
+
+ case 0x162B:
+ case 0x162C:
+ this->unk_33C = 0x162D;
+ break;
+
+ case 0x162D:
+ this->unk_33C = 0x15EA;
+ break;
+
+ case 0x15EA:
+ this->unk_32C |= 0x1;
+ if (this->unk_32C & 0x8) {
+ this->unk_32C &= ~8;
+
+ switch (func_80BED35C(this)) {
+ case 2:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x1613;
+ break;
+
+ case 1:
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_33C = 0x15ED;
+ break;
+
+ case 3:
+ func_8019F208();
+ this->unk_32C |= 0x40;
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0x15EF;
+ this->actionFunc = func_80BEF360;
+ return;
+ }
+ } else if (this->unk_32C & 0x10) {
+ this->unk_32C &= ~0x10;
+ this->unk_33C = 0x162E;
+ break;
+ }
+ break;
+
+ case 0x15EF:
+ this->unk_32C |= 1;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_33C, &this->actor);
+}
+
+void func_80BEE73C(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ s32 pad;
+ s32 params = ENAKINDONUTS_GET_3(&this->actor);
+ s32 itemActionParam = func_80123810(globalCtx);
+
+ if (itemActionParam > PLAYER_AP_NONE) {
+ if (itemActionParam == PLAYER_AP_DEED_LAND) {
+ player->actor.textId = D_80BF048C[params];
+ this->unk_33C = player->actor.textId;
+ if (this->unk_33C == 0x15E4) {
+ player->unk_A87 = itemActionParam;
+ this->actionFunc = func_80BEF20C;
+ } else {
+ this->actionFunc = func_80BEF18C;
+ }
+ } else if (itemActionParam == PLAYER_AP_DEED_SWAMP) {
+ player->actor.textId = D_80BF0494[params];
+ this->unk_33C = player->actor.textId;
+ if (this->unk_33C == 0x15F9) {
+ player->unk_A87 = itemActionParam;
+ this->actionFunc = func_80BEF20C;
+ } else {
+ this->actionFunc = func_80BEF18C;
+ }
+ } else if (itemActionParam == PLAYER_AP_DEED_MOUNTAIN) {
+ player->actor.textId = D_80BF049C[params];
+ this->unk_33C = player->actor.textId;
+ if (this->unk_33C == 0x160C) {
+ player->unk_A87 = itemActionParam;
+ this->actionFunc = func_80BEF20C;
+ } else {
+ this->actionFunc = func_80BEF18C;
+ }
+ } else if (itemActionParam == PLAYER_AP_DEED_OCEAN) {
+ player->actor.textId = D_80BF04A4[params];
+ this->unk_33C = player->actor.textId;
+ if (this->unk_33C == 0x1621) {
+ player->unk_A87 = itemActionParam;
+ this->actionFunc = func_80BEF20C;
+ } else {
+ this->actionFunc = func_80BEF18C;
+ }
+ } else {
+ player->actor.textId = D_80BF04AC[params];
+ this->unk_33C = player->actor.textId;
+ this->actionFunc = func_80BEF18C;
+ }
+ func_801477B4(globalCtx);
+ } else if (itemActionParam < PLAYER_AP_NONE) {
+ this->unk_33C = D_80BF04AC[params];
+ func_80151938(globalCtx, this->unk_33C);
+ this->actionFunc = func_80BEF18C;
+ }
+}
+
+void func_80BEE938(EnAkindonuts* this, GlobalContext* globalCtx) {
+ switch (ENAKINDONUTS_GET_3(&this->actor)) {
+ case 0:
+ if (gSaveContext.weekEventReg[61] & 0x10) {
+ if (ENAKINDONUTS_GET_4(&this->actor)) {
+ this->unk_2DC = func_80BED680;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+ } else if (ENAKINDONUTS_GET_4(&this->actor)) {
+ Actor_MarkForDeath(&this->actor);
+ } else {
+ this->unk_2DC = func_80BED3BC;
+ }
+ break;
+
+ case 1:
+ if (gSaveContext.weekEventReg[61] & 0x80) {
+ if (ENAKINDONUTS_GET_4(&this->actor)) {
+ this->unk_2DC = func_80BEDB88;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+ } else if (ENAKINDONUTS_GET_4(&this->actor)) {
+ Actor_MarkForDeath(&this->actor);
+ } else {
+ this->unk_2DC = func_80BED8A4;
+ }
+ break;
+
+ case 2:
+ if (gSaveContext.weekEventReg[62] & 4) {
+ if (ENAKINDONUTS_GET_4(&this->actor)) {
+ this->unk_2DC = func_80BEE070;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+ } else if (ENAKINDONUTS_GET_4(&this->actor)) {
+ Actor_MarkForDeath(&this->actor);
+ } else {
+ this->unk_2DC = func_80BEDDAC;
+ }
+ break;
+
+ case 3:
+ if (gSaveContext.weekEventReg[62] & 0x20) {
+ if (ENAKINDONUTS_GET_4(&this->actor)) {
+ this->unk_2DC = func_80BEE530;
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+ } else if (ENAKINDONUTS_GET_4(&this->actor)) {
+ Actor_MarkForDeath(&this->actor);
+ } else {
+ this->unk_2DC = func_80BEE274;
+ }
+ break;
+ }
+}
+
+void func_80BEEB20(EnAkindonuts* this, GlobalContext* globalCtx) {
+ s16 sp26 = this->skelAnime.curFrame;
+ s16 sp24 = Animation_GetLastFrame(&sAnimations[this->unk_338].animationSeg->common);
+ s16 phi_v0;
+
+ Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xE38);
+
+ if ((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) {
+ phi_v0 = true;
+ } else {
+ phi_v0 = false;
+ }
+
+ if (phi_v0) {
+ if (this->actor.xzDistToPlayer < 200.0f) {
+ phi_v0 = true;
+ } else {
+ phi_v0 = false;
+ }
+
+ if (phi_v0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->actionFunc = func_80BEEDC0;
+ this->unk_338 = 3;
+ this->collider.dim.height = 64;
+ func_8013BC6C(&this->skelAnime, sAnimations, 3);
+ return;
+ }
+ }
+
+ if (sp26 == sp24) {
+ if ((this->unk_338 == 4) || (this->unk_338 == 18)) {
+ this->unk_338 = 17;
+ this->collider.dim.height = 0;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_NUTS_DOWN);
+ func_8013BC6C(&this->skelAnime, sAnimations, 17);
+ } else if (this->unk_338 == 2) {
+ this->unk_338 = 16;
+ this->collider.dim.height = 32;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_NUTS_UP);
+ func_8013BC6C(&this->skelAnime, sAnimations, 16);
+ } else if (this->unk_338 == 17) {
+ phi_v0 = DECR(this->unk_33A);
+ if (phi_v0 == 0) {
+ this->unk_33A = Rand_ZeroOne() * 10.0f;
+ this->unk_338 = 2;
+ this->collider.dim.height = 32;
+ func_8013BC6C(&this->skelAnime, sAnimations, 2);
+ }
+ } else if (this->unk_338 == 16) {
+ phi_v0 = DECR(this->unk_33A);
+ if (phi_v0 == 0) {
+ this->unk_33A = Rand_S16Offset(40, 40);
+ this->unk_338 = 18;
+ this->collider.dim.height = 32;
+ func_8013BC6C(&this->skelAnime, sAnimations, 18);
+ }
+ }
+ }
+}
+
+void func_80BEEDC0(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if (this->skelAnime.curFrame == this->skelAnime.endFrame) {
+ this->actionFunc = func_80BEEE10;
+ func_8013BC6C(&this->skelAnime, sAnimations, 0);
+ }
+}
+
+void func_80BEEE10(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 2000, 0);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_2DC(this, globalCtx);
+ this->actionFunc = func_80BEEFA8;
+ } else if (((this->actor.xzDistToPlayer < 100.0f) &&
+ (((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false)) ||
+ this->actor.isTargeted) {
+ func_800B8614(&this->actor, globalCtx, 100.0f);
+ } else if (!(((this->actor.playerHeightRel < 50.0f) && (this->actor.playerHeightRel > -50.0f)) ? true : false) ||
+ !((this->actor.xzDistToPlayer < 200.0f) ? true : false)) {
+ this->unk_338 = 4;
+ func_8013BC6C(&this->skelAnime, sAnimations, 4);
+ this->actionFunc = func_80BEEB20;
+ }
+}
+
+void func_80BEEFA8(EnAkindonuts* this, GlobalContext* globalCtx) {
+ u8 temp_v0 = func_80152498(&globalCtx->msgCtx);
+
+ if (temp_v0 == 5) {
+ if (func_80147624(globalCtx)) {
+ if (this->unk_32C & 1) {
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0;
+ this->actionFunc = func_80BEEE10;
+ } else if (this->unk_32C & 0x20) {
+ this->unk_32C &= ~0x20;
+ this->actor.flags &= ~1;
+ this->unk_32C &= ~0x4;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_338 = 8;
+ this->unk_33C = 0;
+ func_8013BC6C(&this->skelAnime, sAnimations, this->unk_338);
+ this->actionFunc = func_80BEF518;
+ } else {
+ this->unk_2DC(this, globalCtx);
+ }
+ }
+ } else if (temp_v0 == 4) {
+ if (func_80147624(globalCtx)) {
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ this->unk_32C |= 0x8;
+ this->unk_2DC(this, globalCtx);
+ break;
+
+ case 1:
+ func_8019F230();
+ this->unk_32C |= 0x10;
+ this->unk_2DC(this, globalCtx);
+ break;
+ }
+ }
+ } else if (temp_v0 == 16) {
+ func_80BEE73C(this, globalCtx);
+ }
+}
+
+void func_80BEF18C(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if ((func_80152498(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_33C = 0;
+ this->actionFunc = func_80BEEE10;
+ }
+}
+
+void func_80BEF20C(EnAkindonuts* this, GlobalContext* globalCtx) {
+ u8 sp27 = func_80152498(&globalCtx->msgCtx);
+ s16 sp24 = this->skelAnime.curFrame;
+ s16 sp22 = Animation_GetLastFrame(&sAnimations[this->unk_338].animationSeg->common);
+
+ if (this->unk_356 == 40) {
+ this->unk_338 = 5;
+ func_8013BC6C(&this->skelAnime, sAnimations, 5);
+ }
+
+ this->unk_356++;
+
+ if ((sp24 == sp22) && (this->unk_338 == 5)) {
+ this->unk_338 = 6;
+ func_8013BC6C(&this->skelAnime, sAnimations, 6);
+ }
+
+ if ((sp27 == 5) && func_80147624(globalCtx)) {
+ if (this->unk_32C & 1) {
+ this->unk_32C &= ~0x1;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->actionFunc = func_80BEF360;
+ } else {
+ this->unk_2DC(this, globalCtx);
+ }
+ }
+}
+
+void func_80BEF360(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if (this->unk_32C & 0x40) {
+ if (Actor_HasParent(&this->actor, globalCtx)) {
+ this->actor.parent = NULL;
+ func_801159EC(this->unk_364);
+ this->unk_32C &= ~0x40;
+ this->actionFunc = func_80BEF450;
+ } else {
+ func_800B8A1C(&this->actor, globalCtx, func_80BED034(this), 300.0f, 300.0f);
+ }
+ } else if (Actor_HasParent(&this->actor, globalCtx)) {
+ this->actor.parent = NULL;
+ this->actionFunc = func_80BEF450;
+ } else {
+ func_800B8A1C(&this->actor, globalCtx, func_80BECFBC(this), 300.0f, 300.0f);
+ }
+}
+
+void func_80BEF450(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if ((func_80152498(&globalCtx->msgCtx) == 6) && func_80147624(globalCtx)) {
+ func_800B85E0(&this->actor, globalCtx, 400.0f, -1);
+ this->actionFunc = func_80BEF4B8;
+ }
+}
+
+void func_80BEF4B8(EnAkindonuts* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_2DC(this, globalCtx);
+ this->actionFunc = func_80BEEFA8;
+ } else {
+ func_800B85E0(&this->actor, globalCtx, 400.0f, -1);
+ }
+}
+
+void func_80BEF518(EnAkindonuts* this, GlobalContext* globalCtx) {
+ s16 sp26 = this->skelAnime.curFrame;
+ s16 sp24 = Animation_GetLastFrame(&sAnimations[this->unk_338].animationSeg->common);
+
+ switch (sp26) {
+ case 10:
+ this->unk_33E = 1;
+ this->unk_340 = 0.1f;
+ this->unk_344 = 0.1f;
+ this->unk_348 = 0.1f;
+ break;
+
+ case 11:
+ case 12:
+ this->unk_340 += 0.15f;
+ this->unk_344 += 0.32f;
+ this->unk_348 += 0.15f;
+ break;
+
+ case 13:
+ this->unk_340 = 0.55f;
+ this->unk_344 = 1.05f;
+ this->unk_348 = 0.55f;
+ break;
+
+ case 14:
+ this->unk_340 = 1.0f;
+ this->unk_344 = 2.0f;
+ this->unk_348 = 1.0f;
+ break;
+
+ case 15:
+ case 16:
+ this->unk_344 -= 0.33f;
+ break;
+
+ case 17:
+ this->unk_344 = 1.0f;
+ break;
+
+ case 18:
+ case 19:
+ this->unk_344 += 0.27f;
+ break;
+ case 20:
+ this->unk_33E = 2;
+ this->unk_344 = 1.8f;
+ break;
+
+ case 21:
+ case 22:
+ case 23:
+ this->unk_344 -= 0.2f;
+ break;
+
+ case 24:
+ this->unk_344 = 1.0f;
+ break;
+ }
+
+ if (this->unk_35E == 0) {
+ if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ this->unk_35E = 1;
+ } else {
+ if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ ActorCutscene_Stop(0x7C);
+ }
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ return;
+ }
+ }
+
+ if (sp26 == sp24) {
+ this->unk_33E = 3;
+ this->unk_338 = 19;
+ func_8013BC6C(&this->skelAnime, sAnimations, this->unk_338);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_NUTS_DOWN);
+ this->unk_32C &= ~2;
+ this->unk_32C |= 0x80;
+ this->unk_358 = this->actor.world.pos.y;
+ this->actionFunc = func_80BEF770;
+ }
+}
+
+void func_80BEF770(EnAkindonuts* this, GlobalContext* globalCtx) {
+ f32 sp24 = this->unk_358 - this->actor.world.pos.y;
+ Vec3f sp18;
+
+ this->unk_352 += this->unk_362;
+ if (!(this->unk_35C & 3)) {
+ sp18.x = this->actor.world.pos.x;
+ sp18.y = this->unk_358;
+ sp18.z = this->actor.world.pos.z;
+ func_800B14D4(globalCtx, 20.0f, &sp18);
+ }
+
+ if (sp24 > 5.0f) {
+ this->unk_33A = 50;
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ this->unk_368 = func_80BECF6C(this->path);
+ this->actionFunc = func_80BEF83C;
+ }
+}
+
+void func_80BEF83C(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Vec3f sp34;
+ s16 sp32 = this->skelAnime.curFrame;
+ s16 sp30 = Animation_GetLastFrame(&sAnimations[this->unk_338].animationSeg->common);
+
+ if (sp32 == sp30) {
+ Math_SmoothStepToS(&this->unk_362, 0x1C71, 3, 0x100, 0);
+ this->unk_352 += this->unk_362;
+ this->actor.shape.yOffset = 1500.0f;
+ }
+
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_368, 3, 2000, 0);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+
+ if (DECR(this->unk_33A) == 0) {
+ if (!(this->unk_35C & 3)) {
+ sp34 = this->actor.world.pos;
+ func_800B14D4(globalCtx, 20.0f, &sp34);
+ }
+ this->actor.velocity.y = 5.0f;
+ } else if (!(this->unk_35C & 3)) {
+ sp34.x = this->actor.world.pos.x;
+ sp34.y = this->unk_358;
+ sp34.z = this->actor.world.pos.z;
+ func_800B14D4(globalCtx, 20.0f, &sp34);
+ }
+ if ((this->actor.home.pos.y + 22.5f) < this->actor.world.pos.y) {
+ this->unk_34C = 0.3f;
+ this->unk_338 = 9;
+ func_8013BC6C(&this->skelAnime, sAnimations, this->unk_338);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_AKINDONUTS_HIDE);
+ this->actionFunc = func_80BEF9F0;
+ }
+}
+
+void func_80BEF9F0(EnAkindonuts* this, GlobalContext* globalCtx) {
+ this->unk_352 += this->unk_362;
+ if (this->unk_34C >= 1.0f) {
+ this->unk_34C = 1.0f;
+ this->actor.velocity.y = 5.0f;
+ } else {
+ this->actor.velocity.y = 5.0f;
+ this->unk_34C += 0.1f;
+ }
+
+ if ((this->actor.home.pos.y + 200.0f) < this->actor.world.pos.y) {
+ Math_ApproachF(&this->actor.velocity.y, 0.0f, 0.2f, 1.0f);
+ this->unk_338 = 10;
+ func_8013BC6C(&this->skelAnime, sAnimations, this->unk_338);
+ if (ENAKINDONUTS_GET_3(&this->actor) == ENAKINDONUTS_3_2) {
+ this->unk_32C |= 0x2;
+ }
+ this->unk_356 = 0;
+ this->actionFunc = func_80BEFAF0;
+ }
+}
+
+void func_80BEFAF0(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Vec3s sp38;
+ f32 sp34;
+ s16 sp32 = false;
+
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+
+ if (this->path != NULL) {
+ sp34 = func_80BECEAC(this->path, this->unk_334, &this->actor.world.pos, &sp38);
+ if (this->actor.bgCheckFlags & 0x8) {
+ sp38.y = this->actor.wallYaw;
+ }
+
+ if (ENAKINDONUTS_GET_3(&this->actor) == ENAKINDONUTS_3_1) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, sp38.y, 10, 1000, 0);
+ } else {
+ Math_SmoothStepToS(&this->actor.world.rot.y, sp38.y, 10, 300, 0);
+ }
+
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ this->unk_350 = 0x1000;
+ this->unk_352 += this->unk_362;
+ this->actor.world.rot.x = -sp38.x;
+
+ if (func_80BECD10(this, this->path, this->unk_334) && (sp34 < 10.0f)) {
+ if (this->unk_334 >= (this->path->count - 1)) {
+ ActorCutscene_Stop(this->cutscene);
+ this->actionFunc = func_80BEFD74;
+ } else {
+ this->unk_334++;
+ }
+ }
+ } else if (this->actor.playerHeightRel > 500.0f) {
+ ActorCutscene_Stop(this->cutscene);
+ this->actionFunc = func_80BEFD74;
+ }
+
+ if (ENAKINDONUTS_GET_3(&this->actor) == ENAKINDONUTS_3_2) {
+ if (this->unk_334 >= 3) {
+ sp32 = true;
+ }
+ Math_ApproachF(&this->actor.speedXZ, 1.5f, 0.2f, 1.0f);
+ } else {
+ Math_ApproachF(&this->actor.speedXZ, 2.0f, 0.2f, 1.0f);
+ }
+
+ func_80BECBE0(this, sp32);
+
+ if (this->unk_35E == 2) {
+ if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &this->actor);
+ this->unk_35E = 3;
+ } else {
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ return;
+ }
+ } else if ((this->unk_35E == 1) && (this->unk_356 == 20)) {
+ ActorCutscene_Stop(this->cutscene);
+ this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene);
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->unk_35E = 2;
+ }
+ this->unk_356++;
+}
+
+void func_80BEFD74(EnAkindonuts* this, GlobalContext* globalCtx) {
+ Actor_MarkForDeath(&this->actor);
+}
+
+void EnAkindonuts_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnAkindonuts* this = THIS;
+
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_dnt_Skel_00AC70, &object_dnt_Anim_005488, this->jointTable,
+ this->morphTable, 28);
+ Collider_InitCylinder(globalCtx, &this->collider);
+ Collider_SetCylinderType1(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 35.0f);
+ Actor_SetScale(&this->actor, 0.01f);
+
+ this->actor.colChkInfo.cylRadius = 0;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->actor.gravity = -1.0f;
+
+ if (!ENAKINDONUTS_GET_4(&this->actor)) {
+ this->path = func_8013D648(globalCtx, ENAKINDONUTS_GET_FC00(&this->actor), 0x3F);
+ if (this->path == NULL) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ }
+
+ func_8013BC6C(&this->skelAnime, sAnimations, 4);
+ this->unk_32C |= 0x2;
+ this->unk_32C |= 0x4;
+ this->unk_338 = 4;
+ this->cutscene = this->actor.cutscene;
+ func_80BEE938(this, globalCtx);
+ this->actionFunc = func_80BEEB20;
+}
+
+void EnAkindonuts_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnAkindonuts* this = THIS;
+
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
+
+void EnAkindonuts_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnAkindonuts* this = THIS;
+
+ Actor_SetHeight(&this->actor, 60.0f);
+ SkelAnime_Update(&this->skelAnime);
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+
+ this->actionFunc(this, globalCtx);
+
+ if (this->unk_32C & 0x80) {
+ func_800B9010(&this->actor, NA_SE_EN_AKINDO_FLY - SFX_FLAG);
+ }
+ func_80BECC7C(this, globalCtx);
+}
+
+s32 EnAkindonuts_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ EnAkindonuts* this = THIS;
+
+ if (((this->unk_338 == 4) && (this->unk_33E == 0)) || ((this->unk_338 == 8) && (this->unk_33E == 0)) ||
+ (this->unk_338 == 18) || (this->unk_338 == 2) || (this->unk_338 == 3) || (this->unk_338 == 17) ||
+ (this->unk_338 == 5) || (this->unk_338 == 6) || (this->unk_338 == 7) || (this->unk_338 == 16)) {
+ if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 23) || (limbIndex == 24) ||
+ (limbIndex == 15)) {
+ *dList = NULL;
+ }
+ } else if ((this->unk_338 == 8) || (this->unk_338 == 19)) {
+ switch (this->unk_33E) {
+ case 1:
+ if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 25)) {
+ *dList = NULL;
+ }
+ break;
+
+ case 2:
+ case 3:
+ if ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27) || (limbIndex == 15) ||
+ (limbIndex == 25)) {
+ *dList = NULL;
+ }
+ break;
+ }
+ } else if (((this->unk_338 == 9) || (this->unk_338 == 10)) && ((limbIndex == 15) || (limbIndex == 25))) {
+ *dList = NULL;
+ }
+
+ if (limbIndex == 26) {
+ if ((this->unk_338 == 6) || (this->unk_338 == 5) || (this->unk_338 == 7)) {
+ *dList = object_dnt_DL_001350;
+ } else {
+ *dList = object_dnt_DL_008290;
+ }
+ }
+ return 0;
+}
+
+void EnAkindonuts_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+}
+
+void EnAkindonuts_UnkActorDraw(GlobalContext* globalCtx, s32 limbIndex, Actor* thisx) {
+ EnAkindonuts* this = THIS;
+
+ if (((this->unk_33E == 1) || (this->unk_33E == 2)) && ((limbIndex == 23) || (limbIndex == 24))) {
+ Matrix_Scale(this->unk_340, this->unk_344, this->unk_348, MTXMODE_APPLY);
+ }
+
+ if ((this->unk_338 == 9) && ((limbIndex == 16) || (limbIndex == 21) || (limbIndex == 27))) {
+ Matrix_Scale(this->unk_34C, this->unk_34C, this->unk_34C, MTXMODE_APPLY);
+ }
+
+ if (limbIndex == 24) {
+ Matrix_RotateY(this->unk_352, MTXMODE_APPLY);
+ }
+}
+
+void EnAkindonuts_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ EnAkindonuts* this = THIS;
+
+ func_8012C28C(globalCtx->state.gfxCtx);
+ func_801343C0(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnAkindonuts_OverrideLimbDraw, EnAkindonuts_PostLimbDraw, EnAkindonuts_UnkActorDraw, &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 08efd89752..e5d134f454 100644
--- a/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
+++ b/src/overlays/actors/ovl_En_Akindonuts/z_en_akindonuts.h
@@ -6,12 +6,48 @@
struct EnAkindonuts;
typedef void (*EnAkindonutsActionFunc)(struct EnAkindonuts*, GlobalContext*);
+typedef void (*EnAkindonutsUnkFunc)(struct EnAkindonuts*, GlobalContext*);
+
+#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)
+
+enum {
+ /* 1 */ ENAKINDONUTS_3_1 = 1,
+ /* 2 */ ENAKINDONUTS_3_2,
+};
typedef struct EnAkindonuts {
/* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x194];
+ /* 0x0144 */ SkelAnime skelAnime;
+ /* 0x0188 */ Vec3s jointTable[28];
+ /* 0x0230 */ Vec3s morphTable[28];
/* 0x02D8 */ EnAkindonutsActionFunc actionFunc;
- /* 0x02DC */ char unk_2DC[0x90];
+ /* 0x02DC */ EnAkindonutsUnkFunc unk_2DC;
+ /* 0x02E0 */ ColliderCylinder collider;
+ /* 0x032C */ u16 unk_32C;
+ /* 0x0330 */ Path* path;
+ /* 0x0334 */ s32 unk_334;
+ /* 0x0338 */ s16 unk_338;
+ /* 0x033A */ s16 unk_33A;
+ /* 0x033C */ u16 unk_33C;
+ /* 0x033E */ s16 unk_33E;
+ /* 0x0340 */ f32 unk_340;
+ /* 0x0344 */ f32 unk_344;
+ /* 0x0348 */ f32 unk_348;
+ /* 0x034C */ f32 unk_34C;
+ /* 0x0350 */ s16 unk_350;
+ /* 0x0352 */ s16 unk_352;
+ /* 0x0354 */ UNK_TYPE1 unk354[0x2];
+ /* 0x0356 */ s16 unk_356;
+ /* 0x0358 */ f32 unk_358;
+ /* 0x035C */ s16 unk_35C;
+ /* 0x035E */ s16 unk_35E;
+ /* 0x0360 */ s16 cutscene;
+ /* 0x0362 */ s16 unk_362;
+ /* 0x0364 */ s16 unk_364;
+ /* 0x0366 */ s8 unk_366;
+ /* 0x0368 */ s16 unk_368;
} EnAkindonuts; // size = 0x36C
extern const ActorInit En_Akindonuts_InitVars;
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 e434c69c2e..c26081e0de 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
@@ -5,6 +5,9 @@
*/
#include "z_en_aob_01.h"
+#include "overlays/actors/ovl_En_Racedog/z_en_racedog.h"
+#include "overlays/actors/ovl_En_Dg/z_en_dg.h"
+#include "objects/object_aob/object_aob.h"
#define FLAGS 0x00000019
@@ -28,8 +31,8 @@ void func_809C2A64(EnAob01* this, GlobalContext* globalCtx);
void func_809C2BE4(EnAob01* this, GlobalContext* globalCtx);
void func_809C2C9C(EnAob01* this, GlobalContext* globalCtx);
void func_809C2D0C(EnAob01* this, GlobalContext* globalCtx);
+s32 func_809C2EC4(EnAob01* this, GlobalContext* globalCtx);
-#if 0
const ActorInit En_Aob_01_InitVars = {
ACTOR_EN_AOB_01,
ACTORCAT_NPC,
@@ -42,92 +45,1012 @@ const ActorInit En_Aob_01_InitVars = {
(ActorFunc)EnAob01_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_809C3820 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ActorAnimationEntry D_809C3790[6] = {
+ { &object_aob_Anim_007758, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_aob_Anim_0068B4, 1.0f, 0.0f, 0.0f, 2, 0.0f },
+ { &object_aob_Anim_00700C, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_aob_Anim_0058EC, 1.0f, 0.0f, 0.0f, 2, 0.0f },
+ { &object_aob_Anim_006040, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &object_aob_Anim_007758, 1.0f, 0.0f, 0.0f, 0, -6.0f },
+};
+
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 18, 64, 0, { 0, 0, 0 } },
};
-#endif
+typedef struct {
+ Vec3f unk_00;
+ s16 unk_04;
+ s16 unk_06;
+} EnAobStruct;
-extern ColliderCylinderInit D_809C3820;
+static EnAobStruct D_809C384C[] = {
+ { { -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 },
+ { { -4582.0f, 158.0f, 1206.0f }, 144, 2 }, { { -4595.0f, 156.0f, 1493.0f }, 61, 3 },
+ { { -4526.0f, 146.0f, 1702.0f }, 61, 4 }, { { -3820.0f, 162.0f, 1965.0f }, 109, 5 },
+ { { -4395.0f, 147.0f, 1569.0f }, -24, 0 }, { { -4315.0f, 150.0f, 2048.0f }, 61, 6 },
+ { { -4827.0f, 168.0f, 1328.0f }, 115, 4 }, { { -4130.0f, 150.0f, 1367.0f }, 112, 0 },
+};
-extern UNK_TYPE D_06000180;
-extern UNK_TYPE D_06003D18;
+void func_809C10B0(EnAob01* this, s32 arg1) {
+ if (DECR(this->unk_3F0) == 0) {
+ this->unk_3EE++;
+ if (this->unk_3EE >= arg1) {
+ this->unk_3EE = 0;
+ this->unk_3F0 = Rand_S16Offset(30, 30);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C10B0.s")
+void func_809C1124(void) {
+ u16 time = gSaveContext.time;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1124.s")
+ gSaveContext.time = (u16)REG(15) + time;
+ time = gSaveContext.time;
+ gSaveContext.time = (u16)gSaveContext.unk_14 + time;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1158.s")
+void func_809C1158(EnAob01* this, GlobalContext* globalCtx) {
+ s32 temp_s0 = ENAOB01_GET_7E00_2(&this->actor);
+ s16 i = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C11EC.s")
+ if (temp_s0 != 0x3F) {
+ do {
+ this->unk_1D8[i] = func_8013D648(globalCtx, temp_s0, 0x3F);
+ temp_s0 = this->unk_1D8[i]->unk1;
+ i++;
+ } while (temp_s0 != 0xFF);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1304.s")
+void func_809C11EC(EnAob01* this, GlobalContext* globalCtx) {
+ s32 unk;
+ s16 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1424.s")
+ func_809C1158(this, globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C14D0.s")
+ for (i = 0; i < ARRAY_COUNT(D_809C384C); i++) {
+ unk = (this->unk_1D8[D_809C384C[i].unk_06]->unk1 << 0xA) | (i << 5);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C15BC.s")
+ this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
+ &globalCtx->actorCtx, globalCtx, ACTOR_EN_DG, D_809C384C[i].unk_00.x, D_809C384C[i].unk_00.y,
+ D_809C384C[i].unk_00.z, 0, D_809C384C[i].unk_04 * 182.04445f, 0, unk, 0xFFFF, this->actor.unk20, NULL);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C165C.s")
+void func_809C1304(EnAob01* this, GlobalContext* globalCtx) {
+ s16 i;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C16DC.s")
+ for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++) {
+ this->unk_3F8[i] = Actor_SpawnAsChildAndCutscene(
+ &globalCtx->actorCtx, globalCtx, 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), 0xFFFF, this->actor.unk20, NULL);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1C9C.s")
+s32 func_809C1424(EnAob01* this) {
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 lastFrame = Animation_GetLastFrame(D_809C3790[this->unk_43C].animation);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1D64.s")
+ if (this->unk_43C == 1) {
+ if (curFrame == lastFrame) {
+ this->unk_43C = 2;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 2);
+ return true;
+ }
+ } else if (this->unk_43C == 2) {
+ return true;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C1EC8.s")
+s32 func_809C14D0(EnAob01* this) {
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 lastFrame = Animation_GetLastFrame(D_809C3790[this->unk_43C].animation);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2060.s")
+ if ((this->unk_43C == 0) || (this->unk_43C == 5)) {
+ if (curFrame == lastFrame) {
+ this->unk_43C = 3;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 3);
+ return true;
+ }
+ } else if (this->unk_43C == 3) {
+ if (curFrame == lastFrame) {
+ this->unk_43C = 4;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 4);
+ return true;
+ }
+ } else if (this->unk_43C == 4) {
+ return true;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C21E0.s")
+s32 func_809C15BC(EnAob01* this) {
+ s16 curFrame = this->skelAnime.curFrame;
+ s16 lastFrame = Animation_GetLastFrame(D_809C3790[this->unk_43C].animation);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2504.s")
+ if ((this->unk_43C != 0) && (this->unk_43C != 5)) {
+ if (curFrame == lastFrame) {
+ this->unk_43C = 5;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 5);
+ return true;
+ }
+ } else {
+ return true;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2594.s")
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C25E4.s")
+void func_809C165C(EnAob01* this, GlobalContext* globalCtx) {
+ 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;
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2680.s")
+void func_809C16DC(EnAob01* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C26E4.s")
+ switch (this->unk_210) {
+ case 0:
+ case 0x3524:
+ case 0x3535:
+ case 0x3548:
+ case 0x3549:
+ case 0x354A:
+ switch (gSaveContext.day) {
+ case 1:
+ if (!gSaveContext.isNight) {
+ if (!(gSaveContext.weekEventReg[64] & 0x80)) {
+ gSaveContext.weekEventReg[64] |= 0x80;
+ this->unk_210 = 0x3520;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ } else {
+ if (!(gSaveContext.weekEventReg[65] & 1)) {
+ gSaveContext.weekEventReg[65] |= 1;
+ this->unk_210 = 0x3530;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2730.s")
+ case 2:
+ if (!gSaveContext.isNight) {
+ if (!(gSaveContext.weekEventReg[65] & 2)) {
+ gSaveContext.weekEventReg[65] |= 2;
+ this->unk_210 = 0x3531;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ } else {
+ if (!(gSaveContext.weekEventReg[65] & 4)) {
+ gSaveContext.weekEventReg[65] |= 4;
+ this->unk_210 = 0x3532;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2788.s")
+ case 3:
+ if (!gSaveContext.isNight) {
+ if (!(gSaveContext.weekEventReg[65] & 8)) {
+ gSaveContext.weekEventReg[65] |= 8;
+ this->unk_210 = 0x3533;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ } else {
+ if (!(gSaveContext.weekEventReg[65] & 0x10)) {
+ gSaveContext.weekEventReg[65] |= 0x10;
+ this->unk_210 = 0x3534;
+ } else {
+ this->unk_210 = 0x352F;
+ }
+ }
+ break;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2824.s")
+ case 0x3520:
+ case 0x352F:
+ case 0x3530:
+ case 0x3531:
+ case 0x3532:
+ case 0x3533:
+ case 0x3534:
+ this->unk_210 = 0x3521;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C28B8.s")
+ case 0x3521:
+ if (this->unk_2D2 & 2) {
+ this->unk_2D2 &= ~2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2A64.s")
+ switch (player->transformation) {
+ case PLAYER_FORM_GORON:
+ this->unk_210 = 0x3548;
+ this->unk_2D2 |= 0x10;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2BE4.s")
+ case PLAYER_FORM_ZORA:
+ this->unk_210 = 0x3549;
+ this->unk_2D2 |= 0x10;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2C9C.s")
+ case PLAYER_FORM_DEKU:
+ this->unk_210 = 0x354A;
+ this->unk_2D2 |= 0x10;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2D0C.s")
+ case PLAYER_FORM_HUMAN:
+ if (gSaveContext.rupees < 10) {
+ this->unk_210 = 0x3524;
+ this->unk_2D2 |= 0x10;
+ } else {
+ this->unk_210 = 0x3522;
+ this->unk_2D2 |= 4;
+ this->unk_2D2 |= 0x10;
+ }
+ }
+ } else {
+ this->unk_2D2 |= 0x10;
+ this->unk_210 = 0x3535;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2EC4.s")
+ case 0x3522:
+ case 0x3523:
+ if (this->unk_2D2 & 8) {
+ this->unk_210 = 0x3525;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2F34.s")
+ this->unk_210 = 0x3523;
+ this->unk_2D2 |= 0x40;
+ this->unk_2D2 |= 0x10;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C2FA0.s")
+ case 0x3525:
+ case 0x3526:
+ if (this->unk_2D2 & 4) {
+ if (this->unk_2D2 & 8) {
+ this->unk_210 = 0x3525;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/EnAob01_Init.s")
+ this->unk_210 = 0x3523;
+ this->unk_2D2 |= 0x40;
+ this->unk_2D2 |= 0x10;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/EnAob01_Destroy.s")
+ if (this->unk_2D2 & 2) {
+ this->unk_2D2 &= ~2;
+ this->unk_210 = 0x3527;
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/EnAob01_Update.s")
+ this->unk_210 = 0x3526;
+ this->unk_2D2 |= 0x40;
+ this->unk_2D2 |= 4;
+ this->unk_2D2 |= 0x10;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C33D8.s")
+ case 0x3527:
+ this->unk_210 = 0x3528;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C35B4.s")
+ case 0x3528:
+ if (gSaveContext.rupees < this->unk_434) {
+ this->unk_210 = 0x3536;
+ this->unk_2D2 |= 0x40;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/func_809C35F4.s")
+ if (this->unk_434 == 0) {
+ this->unk_210 = 0x3537;
+ this->unk_2D2 |= 0x40;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Aob_01/EnAob01_Draw.s")
+ gSaveContext.unk_3F5C = this->unk_434;
+ globalCtx->msgCtx.bankRupees = this->unk_434;
+ this->unk_210 = 0x3529;
+ break;
+
+ case 0x3529:
+ if (this->unk_2D2 & 2) {
+ this->unk_2D2 &= ~2;
+ func_801159EC(-this->unk_434);
+ func_800B7298(globalCtx, NULL, 7);
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->actionFunc = func_809C1C9C;
+ return;
+ }
+ this->unk_210 = 0x3528;
+ break;
+
+ case 0x3536:
+ case 0x3537:
+ this->unk_210 = 0x3528;
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+}
+
+void func_809C1C9C(EnAob01* this, GlobalContext* globalCtx) {
+ if (gSaveContext.rupeeAccumulator == 0) {
+ gSaveContext.weekEventReg[63] |= 1;
+ gSaveContext.weekEventReg[63] &= (u8)~2;
+ this->unk_2D2 |= 0x20;
+ func_800FD750(0x40);
+ globalCtx->nextEntranceIndex = 0x7C10;
+ globalCtx->unk_1887F = 0x40;
+ gSaveContext.nextTransition = 0x40;
+ gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 2;
+ gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & 7) | (this->unk_432 * 8);
+ globalCtx->sceneLoadFlag = 0x14;
+ }
+}
+
+void func_809C1D64(EnAob01* this, GlobalContext* globalCtx) {
+ u8 temp_v0 = func_80152498(&globalCtx->msgCtx);
+
+ if (temp_v0 == 4) {
+ if (func_80147624(globalCtx)) {
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ if (gSaveContext.rupees < 10) {
+ play_sound(NA_SE_SY_ERROR);
+ this->unk_210 = 0x3524;
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ } else {
+ func_8019F208();
+ this->unk_2D2 |= 4;
+ this->unk_2D2 |= 0x10;
+ this->unk_210 = 0x3522;
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ this->actionFunc = func_809C21E0;
+ }
+ break;
+
+ case 1:
+ func_8019F230();
+ this->unk_210 = 0x3535;
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ break;
+ }
+ }
+ } else if ((temp_v0 == 5) && func_80147624(globalCtx)) {
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->unk_210 = 0;
+ this->actionFunc = func_809C2060;
+ }
+}
+
+void func_809C1EC8(EnAob01* this, GlobalContext* globalCtx) {
+ static u16 D_809C392C[] = { 4000, 4, 1, 3, 6000, 4, 1, 6, 4000, 4, 1, 3, 6000, 4, 1, 6 };
+ Player* player = GET_PLAYER(globalCtx);
+ Vec3f sp30;
+
+ SkelAnime_Update(&this->skelAnime);
+ if (func_8013D5E8(this->actor.shape.rot.y, 14000, this->actor.yawTowardsPlayer)) {
+ sp30.x = player->actor.world.pos.x;
+ sp30.y = player->bodyPartsPos[7].y + 3.0f;
+ sp30.z = player->actor.world.pos.z;
+ func_8013D2E0(&sp30, &this->actor.focus.pos, &this->actor.shape.rot, &this->unk_2D4, &this->unk_2DA,
+ &this->unk_2E0, D_809C392C);
+ } else {
+ Math_SmoothStepToS(&this->unk_2D4.x, 0, 4, 1000, 1);
+ Math_SmoothStepToS(&this->unk_2D4.y, 0, 4, 1000, 1);
+ Math_SmoothStepToS(&this->unk_2DA.x, 0, 4, 1000, 1);
+ Math_SmoothStepToS(&this->unk_2DA.y, 0, 4, 1000, 1);
+ Math_SmoothStepToS(&this->unk_2E0.x, 0, 4, 1000, 1);
+ Math_SmoothStepToS(&this->unk_2E0.y, 0, 4, 1000, 1);
+ }
+ func_809C10B0(this, 3);
+ func_8013D9C8(globalCtx, this->unk_2F8, this->unk_318, 0x10);
+ func_809C165C(this, globalCtx);
+ if (player->stateFlags1 & 0x20) {
+ func_809C1124();
+ }
+}
+
+void func_809C2060(EnAob01* this, GlobalContext* globalCtx) {
+ if (func_809C15BC(this)) {
+ if (func_809C2EC4(this, globalCtx) && !(this->unk_2D2 & 0x100)) {
+ if (this->collider.base.ocFlags2 & OC2_HIT_PLAYER) {
+ this->actor.flags |= 0x10000;
+ func_800B8614(&this->actor, globalCtx, 100.0f);
+ this->unk_2D2 |= 8;
+ this->actionFunc = func_809C21E0;
+ }
+ } else if (func_800B84D0(&this->actor, globalCtx) && (this->unk_2D2 & 0x100)) {
+ this->unk_2D2 &= ~0x100;
+ this->unk_2E6 = this->unk_2D4;
+ this->unk_2EC = this->unk_2DA;
+ this->unk_2F2 = this->unk_2E0;
+ func_809C16DC(this, globalCtx);
+ this->actionFunc = func_809C21E0;
+ } else {
+ this->unk_2D2 &= ~0x100;
+ if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.ocFlags2 & OC2_HIT_PLAYER)) {
+ this->unk_2D2 |= 0x100;
+ func_800B8614(&this->actor, globalCtx, 100.0f);
+ }
+ }
+ }
+}
+
+void func_809C21E0(EnAob01* this, GlobalContext* globalCtx) {
+ u8 sp2F = func_80152498(&globalCtx->msgCtx);
+
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
+
+ if ((this->unk_2D2 & 8) && !func_809C2EC4(this, globalCtx)) {
+ 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;
+ }
+ this->actor.textId = 0;
+ this->unk_2D2 &= ~8;
+ this->actor.flags &= ~0x10000;
+ this->actionFunc = func_809C2060;
+ return;
+ }
+
+ if (this->unk_2D2 & 0x40) {
+ if (!func_809C1424(this)) {
+ return;
+ }
+ } else if (!func_809C15BC(this)) {
+ return;
+ }
+
+ if (this->unk_2D2 & 8) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->actor.flags &= ~0x10000;
+ func_80123E90(globalCtx, &this->actor);
+ if (this->unk_2D2 & 4) {
+ func_809C16DC(this, globalCtx);
+ this->unk_2D2 &= ~4;
+ } else {
+ this->unk_2D2 |= 0x10;
+ this->unk_2D2 |= 0x40;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ func_801518B0(globalCtx, 0x354B, &this->actor);
+ }
+ this->unk_2D2 &= ~8;
+ }
+ } else if (sp2F == 4) {
+ if (func_80147624(globalCtx)) {
+ this->unk_2D2 &= ~0x40;
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ this->unk_2D2 |= 2;
+ func_809C16DC(this, globalCtx);
+ break;
+
+ case 1:
+ func_8019F230();
+ func_809C16DC(this, globalCtx);
+ break;
+ }
+ }
+ } else if (sp2F == 5) {
+ if (func_80147624(globalCtx)) {
+ this->unk_2D2 &= ~0x40;
+ if (this->unk_2D2 & 0x10) {
+ this->unk_2D2 &= ~0x10;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ this->actionFunc = func_809C2060;
+ } else {
+ func_809C16DC(this, globalCtx);
+ }
+ }
+ } else if ((sp2F == 14) && func_80147624(globalCtx)) {
+ this->unk_2D2 &= ~0x40;
+ this->unk_434 = globalCtx->msgCtx.bankRupeesSelected;
+ func_809C16DC(this, globalCtx);
+ }
+}
+
+s32 func_809C2504(EnAob01* this, GlobalContext* globalCtx) {
+ Actor* npc = globalCtx->actorCtx.actorList[ACTORCAT_NPC].first;
+
+ while (npc != NULL) {
+ if ((npc->id == ACTOR_EN_RACEDOG) && (func_800F2178(this->unk_430) == ((EnRacedog*)npc)->unk_1E8)) {
+ ActorCutscene_Stop(this->unk_430);
+ this->unk_3F4 = npc;
+ this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
+ return true;
+ }
+ npc = npc->next;
+ }
+
+ return false;
+}
+
+s32 func_809C2594(EnAob01* this, GlobalContext* globalCtx) {
+ Actor* npc = globalCtx->actorCtx.actorList[ACTORCAT_NPC].first;
+
+ while (npc != NULL) {
+ if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->unk_290 == ((EnRacedog*)npc)->unk_292)) {
+ this->unk_3F4 = npc;
+ return true;
+ }
+ npc = npc->next;
+ }
+
+ return false;
+}
+
+s32 func_809C25E4(EnAob01* this, GlobalContext* globalCtx) {
+ Actor* npc = globalCtx->actorCtx.actorList[ACTORCAT_NPC].first;
+ s16 count = 0;
+
+ while (npc != NULL) {
+ if ((npc->id == ACTOR_EN_RACEDOG) && (((EnRacedog*)npc)->unk_29C == 3)) {
+ count++;
+ }
+ npc = npc->next;
+ }
+
+ if (count >= 14) {
+ return true;
+ }
+
+ if ((count >= 10) && (DECR(this->unk_440) == 0)) {
+ return true;
+ }
+ return false;
+}
+
+s32 func_809C2680(EnAob01* this) {
+ if ((ActorCutscene_GetLength(this->unk_430) > 0) && (ActorCutscene_GetCurrentIndex() != this->unk_430)) {
+ this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
+ return true;
+ }
+ return false;
+}
+
+void func_809C26E4(EnAob01* this, GlobalContext* globalCtx) {
+ ActorCutscene_Stop(this->unk_430);
+ this->unk_430 = ActorCutscene_GetAdditionalCutscene(this->unk_430);
+ this->actionFunc = func_809C2824;
+}
+
+void func_809C2730(EnAob01* this, GlobalContext* globalCtx) {
+ if (func_809C2504(this, globalCtx) || func_809C2680(this)) {
+ ActorCutscene_SetIntentToPlay(this->unk_430);
+ this->actionFunc = func_809C2824;
+ }
+}
+
+void func_809C2788(EnAob01* this, GlobalContext* globalCtx) {
+ this->unk_2D2 |= 0x20;
+ if (func_809C25E4(this, globalCtx)) {
+ globalCtx = globalCtx;
+ if (func_801A8A50(0) != 0x41) {
+ globalCtx->nextEntranceIndex = 0x7C10;
+ gSaveContext.eventInf[0] = (gSaveContext.eventInf[0] & (u8)~7) | 3;
+ globalCtx->unk_1887F = 0x40;
+ gSaveContext.nextTransition = 3;
+ globalCtx->sceneLoadFlag = 0x14;
+ }
+ }
+}
+
+void func_809C2824(EnAob01* this, GlobalContext* globalCtx) {
+ if (ActorCutscene_GetCanPlayNext(this->unk_430)) {
+ ActorCutscene_Start(this->unk_430, this->unk_3F4);
+ switch (func_800F2178(this->unk_430)) {
+ case 255:
+ this->actionFunc = func_809C26E4;
+ break;
+
+ case 99:
+ this->actionFunc = func_809C2788;
+ break;
+
+ default:
+ this->actionFunc = func_809C2730;
+ }
+ } else {
+ ActorCutscene_SetIntentToPlay(this->unk_430);
+ }
+}
+
+void func_809C28B8(EnAob01* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->actor.flags &= ~0x10000;
+ func_80123E90(globalCtx, &this->actor);
+ this->unk_434 = gSaveContext.unk_3F5C;
+ switch ((gSaveContext.eventInf[0] & 0xF8) >> 3) {
+ case 1:
+ this->unk_210 = 0x352A;
+ this->unk_2D2 |= 0x80;
+ this->unk_434 *= 3;
+ func_801159EC(this->unk_434);
+ globalCtx->msgCtx.bankRupees = this->unk_434;
+ break;
+
+ case 2:
+ this->unk_210 = 0x352B;
+ this->unk_2D2 |= 0x80;
+ this->unk_434 *= 2;
+ func_801159EC(this->unk_434);
+ globalCtx->msgCtx.bankRupees = this->unk_434;
+ break;
+
+ case 3:
+ case 4:
+ case 5:
+ this->unk_210 = 0x352C;
+ func_801159EC(this->unk_434);
+ break;
+
+ default:
+ this->unk_210 = 0x352D;
+ this->unk_2D2 |= 0x40;
+ this->unk_43C = 1;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 1);
+ break;
+ }
+
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ this->actionFunc = func_809C2D0C;
+ } else if (this->actor.xzDistToPlayer < 100.0f) {
+ func_800B8614(&this->actor, globalCtx, 100.0f);
+ }
+}
+
+void func_809C2A64(EnAob01* this, GlobalContext* globalCtx) {
+ u8 sp2F = func_80152498(&globalCtx->msgCtx);
+
+ if (func_809C15BC(this)) {
+ if ((sp2F == 5) && func_80147624(globalCtx)) {
+ this->unk_434 = 0;
+ globalCtx->msgCtx.unk11F22 = 0x43;
+ globalCtx->msgCtx.unk12023 = 4;
+ }
+
+ if (Actor_HasParent(&this->actor, globalCtx)) {
+ this->unk_2D4 = this->unk_2E6;
+ this->unk_2DA = this->unk_2EC;
+ this->unk_2E0 = this->unk_2F2;
+ this->actor.parent = NULL;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (gSaveContext.weekEventReg[8] & 0x20) {
+ this->actionFunc = func_809C2BE4;
+ } else {
+ gSaveContext.weekEventReg[8] |= 0x20;
+ this->actionFunc = func_809C2BE4;
+ }
+ } else if (gSaveContext.weekEventReg[8] & 0x20) {
+ func_800B8A1C(&this->actor, globalCtx, 4, 300.0f, 300.0f);
+ } else {
+ func_800B8A1C(&this->actor, globalCtx, 12, 300.0f, 300.0f);
+ }
+ }
+}
+
+void func_809C2BE4(EnAob01* this, GlobalContext* globalCtx) {
+ u8 temp_v0 = func_80152498(&globalCtx->msgCtx);
+
+ if (((temp_v0 == 5) || (temp_v0 == 6)) && func_80147624(globalCtx)) {
+ if (gSaveContext.weekEventReg[63] & 2) {
+ gSaveContext.weekEventReg[63] &= (u8)~2;
+ }
+
+ if (gSaveContext.weekEventReg[63] & 1) {
+ gSaveContext.weekEventReg[63] &= (u8)~1;
+ }
+
+ this->unk_210 = 0;
+ func_800B85E0(&this->actor, globalCtx, 400.0f, -1);
+ gSaveContext.eventInf[0] &= (u8)~7;
+ this->actionFunc = func_809C2C9C;
+ }
+}
+
+void func_809C2C9C(EnAob01* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_210 = 0x354C;
+ func_80151938(globalCtx, this->unk_210);
+ this->actionFunc = func_809C1D64;
+ } else {
+ func_800B85E0(&this->actor, globalCtx, 400.0f, -1);
+ }
+}
+
+void func_809C2D0C(EnAob01* this, GlobalContext* globalCtx) {
+ u8 sp2F = func_80152498(&globalCtx->msgCtx);
+
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 1);
+
+ if (this->unk_2D2 & 0x40) {
+ if (!func_809C1424(this)) {
+ return;
+ }
+ } else if (this->unk_2D2 & 0x80) {
+ if (!func_809C14D0(this)) {
+ return;
+ }
+ }
+
+ if ((sp2F == 5) && func_80147624(globalCtx)) {
+ this->unk_2D2 &= ~0x40;
+ this->unk_2D2 &= ~0x80;
+ if (this->unk_434 >= 150) {
+ this->unk_210 = 0x352E;
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ this->actionFunc = func_809C2A64;
+ } else {
+ this->unk_2D4 = this->unk_2E6;
+ this->unk_2DA = this->unk_2EC;
+ this->unk_2E0 = this->unk_2F2;
+
+ this->unk_434 = 0;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ if (gSaveContext.weekEventReg[63] & 2) {
+ gSaveContext.weekEventReg[63] &= (u8)~2;
+ }
+
+ if (gSaveContext.weekEventReg[63] & 1) {
+ gSaveContext.weekEventReg[63] &= (u8)~1;
+ }
+
+ this->unk_210 = 0x354C;
+ func_801518B0(globalCtx, this->unk_210, &this->actor);
+ this->actionFunc = func_809C1D64;
+ gSaveContext.eventInf[0] &= (u8)~7;
+ }
+ }
+}
+
+s32 func_809C2EC4(EnAob01* this, GlobalContext* globalCtx) {
+ Actor* dog = globalCtx->actorCtx.actorList[ACTORCAT_ENEMY].first;
+
+ while (dog != NULL) {
+ if (dog->id == ACTOR_EN_DG) {
+ this->unk_432 = ((EnDg*)dog)->unk_288;
+ if (this->unk_432 == -1) {
+ return false;
+ }
+
+ if (this->unk_432 == ENDG_GET_3E0(dog)) {
+ return true;
+ }
+ }
+ dog = dog->next;
+ }
+
+ return false;
+}
+
+void func_809C2F34(EnAob01* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ player->actor.world.pos.x = -4134.0f;
+ player->actor.world.pos.z = 1464.0f;
+ player->actor.shape.rot.y = player->actor.world.rot.y;
+ player->actor.draw = NULL;
+ player->stateFlags1 |= 0x20;
+ this->actor.world.pos.x = -4308.0f;
+ this->actor.world.pos.z = 1620.0f;
+ this->actor.prevPos = this->actor.world.pos;
+}
+
+void func_809C2FA0(void) {
+ u8 i;
+ u8 idx;
+ u8 idx2;
+ u8 orig;
+ u8 orig2;
+ u8 sp44[7];
+ u8 sp34[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ };
+
+ for (i = 0; i < ARRAY_COUNT(sp34); i++) {
+ idx = Rand_ZeroFloat(14.0f);
+ orig = sp34[i];
+
+ sp34[i] = sp34[idx];
+ sp34[idx] = orig;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sp44); i++) {
+ gSaveContext.weekEventReg[42 + i] = 0;
+ sp44[i] = 0;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(sp34); i++) {
+ orig2 = sp34[i];
+ idx2 = i / 2;
+
+ if (i % 2) {
+ sp44[idx2] |= orig2 << 0x4;
+ idx = gSaveContext.weekEventReg[42 + idx2];
+ gSaveContext.weekEventReg[42 + idx2] = idx | sp44[idx2];
+ } else {
+ sp44[idx2] |= orig2;
+ }
+ }
+}
+
+void EnAob01_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnAob01* this = THIS;
+
+ ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_aob_Skel_000180, NULL, this->jointTable, this->morphTable,
+ 16);
+ Collider_InitCylinder(globalCtx, &this->collider);
+ Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ this->unk_43C = 0;
+ func_800BDC5C(&this->skelAnime, D_809C3790, 0);
+ Actor_SetScale(&this->actor, 0.01f);
+
+ switch (gSaveContext.eventInf[0] & 7) {
+ case 0:
+ func_809C2FA0();
+ func_809C11EC(this, globalCtx);
+ this->actor.flags |= 1;
+ this->actionFunc = func_809C2060;
+ break;
+
+ case 2:
+ this->unk_440 = 500;
+ func_809C1304(this, globalCtx);
+ this->actor.draw = NULL;
+ this->unk_430 = this->actor.cutscene;
+ func_809C2594(this, globalCtx);
+ ActorCutscene_SetIntentToPlay(this->unk_430);
+ this->actor.flags &= ~1;
+ func_809C2F34(this, globalCtx);
+ this->actionFunc = func_809C2824;
+ break;
+
+ case 3:
+ func_809C2FA0();
+ func_809C11EC(this, globalCtx);
+ this->actor.flags |= 1;
+ this->actor.flags |= 0x10000;
+ this->actionFunc = func_809C28B8;
+ break;
+ }
+}
+
+void EnAob01_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnAob01* this = THIS;
+
+ if (!(this->unk_2D2 & 0x20)) {
+ gSaveContext.weekEventReg[63] &= (u8)~1;
+ }
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
+
+void EnAob01_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnAob01* this = THIS;
+
+ this->actionFunc(this, globalCtx);
+ func_809C1EC8(this, globalCtx);
+}
+
+s32 EnAob01_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ EnAob01* this = THIS;
+ UNK_TYPE sp38[] = {
+ &object_aob_Tex_000658,
+ &object_aob_Tex_000E58,
+ &object_aob_Tex_001658,
+ };
+
+ if (limbIndex == 15) {
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ *dList = object_aob_DL_003D18;
+
+ gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(sp38[this->unk_3EE]));
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ }
+
+ if (limbIndex == 15) {
+ Matrix_InsertTranslation(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ Matrix_InsertXRotation_s(this->unk_2DA.y, MTXMODE_APPLY);
+ Matrix_InsertZRotation_s(this->unk_2DA.x * -1, MTXMODE_APPLY);
+ Matrix_InsertTranslation(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
+ }
+
+ if (limbIndex == 8) {
+ Matrix_InsertXRotation_s(this->unk_2E0.y * -1, MTXMODE_APPLY);
+ Matrix_InsertZRotation_s(this->unk_2E0.x * -1, MTXMODE_APPLY);
+ }
+
+ if ((limbIndex == 8) || (limbIndex == 9) || (limbIndex == 12)) {
+ rot->y += (s16)Math_SinS(this->unk_2F8[limbIndex]) * 200;
+ rot->z += (s16)Math_CosS(this->unk_318[limbIndex]) * 200;
+ }
+ return false;
+}
+
+void EnAob01_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f D_809C3968 = { 0.0f, 0.0f, 0.0f };
+ EnAob01* this = THIS;
+
+ if (limbIndex == 15) {
+ Matrix_MultiplyVector3fByState(&D_809C3968, &this->actor.focus.pos);
+ }
+}
+
+void EnAob01_UnkDraw(GlobalContext* globalCtx, s32 limbIndex, Actor* thisx) {
+}
+
+void EnAob01_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnAob01* this = THIS;
+ Vec3f sp5C;
+ Vec3f sp50;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C28C(globalCtx->state.gfxCtx);
+
+ gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(globalCtx->state.gfxCtx, 50, 80, 0, 0));
+ gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(globalCtx->state.gfxCtx, 50, 80, 0, 0));
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ func_801343C0(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnAob01_OverrideLimbDraw, EnAob01_PostLimbDraw, EnAob01_UnkDraw, &this->actor);
+
+ if (this->actor.draw != NULL) {
+ func_8012C2DC(globalCtx->state.gfxCtx);
+ sp5C = this->actor.world.pos;
+ sp50.x = 0.5f;
+ sp50.y = 0.5f;
+ sp50.z = 0.5f;
+ func_800BC620(&sp5C, &sp50, 0xFF, globalCtx);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
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 5f30ef196e..be7655fad0 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
@@ -7,10 +7,38 @@ struct EnAob01;
typedef void (*EnAob01ActionFunc)(struct EnAob01*, GlobalContext*);
+#define ENAOB01_GET_7E00_1(thisx) ((thisx)->params & 0x7E00)
+#define ENAOB01_GET_7E00_2(thisx) (((thisx)->params & 0x7E00) >> 9)
+
typedef struct EnAob01 {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ EnAob01ActionFunc actionFunc;
- /* 0x0148 */ char unk_148[0x2FC];
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ EnAob01ActionFunc actionFunc;
+ /* 0x148 */ SkelAnime skelAnime;
+ /* 0x18C */ ColliderCylinder collider;
+ /* 0x1D8 */ Path* unk_1D8[14];
+ /* 0x210 */ u16 unk_210;
+ /* 0x212 */ Vec3s jointTable[16];
+ /* 0x272 */ Vec3s morphTable[16];
+ /* 0x2D2 */ u16 unk_2D2;
+ /* 0x2D4 */ Vec3s unk_2D4;
+ /* 0x2DA */ Vec3s unk_2DA;
+ /* 0x2E0 */ Vec3s unk_2E0;
+ /* 0x2E6 */ Vec3s unk_2E6;
+ /* 0x2EC */ Vec3s unk_2EC;
+ /* 0x2F2 */ Vec3s unk_2F2;
+ /* 0x2F8 */ s16 unk_2F8[16];
+ /* 0x318 */ s16 unk_318[16];
+ /* 0x338 */ UNK_TYPE1 unk338[0xB6];
+ /* 0x3EE */ s16 unk_3EE;
+ /* 0x3F0 */ s16 unk_3F0;
+ /* 0x3F4 */ Actor* unk_3F4;
+ /* 0x3F8 */ Actor* unk_3F8[14];
+ /* 0x430 */ s16 unk_430;
+ /* 0x432 */ s16 unk_432;
+ /* 0x434 */ s32 unk_434;
+ /* 0x438 */ UNK_TYPE1 unk438[4];
+ /* 0x43C */ s32 unk_43C;
+ /* 0x440 */ s16 unk_440;
} EnAob01; // size = 0x444
extern const ActorInit En_Aob_01_InitVars;
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 1e84a0f7bf..c776dc6963 100644
--- a/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
+++ b/src/overlays/actors/ovl_En_Baguo/z_en_baguo.c
@@ -5,6 +5,8 @@
*/
#include "z_en_baguo.h"
+#include "objects/object_gmo/object_gmo.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000005
@@ -106,16 +108,11 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, NEJIRON_DMGEFF_KILL),
};
-extern Gfx D_060014C8;
-extern Gfx D_060018C8;
-extern Gfx D_06001CC8;
-extern SkeletonHeader D_060020E8;
-
void EnBaguo_Init(Actor* thisx, GlobalContext* globalCtx) {
EnBaguo* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 0.0f);
- SkelAnime_Init(globalCtx, &this->skelAnime, &D_060020E8, NULL, this->jointTable, this->morphTable, 3);
+ SkelAnime_Init(globalCtx, &this->skelAnime, &gNejironSkel, NULL, this->jointTable, this->morphTable, 3);
this->actor.hintId = 0xB;
this->maxDistanceFromHome = 240.0f;
this->maxDistanceFromHome += this->actor.world.rot.z * 40.0f;
@@ -203,8 +200,8 @@ void EnBaguo_Idle(EnBaguo* this, GlobalContext* globalCtx) {
yaw = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
absoluteYaw = ABS_ALT(yaw);
- Math_Vec3f_Copy(&this->targetRotation, &D_801D15B0);
- Math_Vec3f_Copy(&this->currentRotation, &D_801D15B0);
+ Math_Vec3f_Copy(&this->targetRotation, &gZeroVec3f);
+ Math_Vec3f_Copy(&this->currentRotation, &gZeroVec3f);
if (absoluteYaw < 0x2000) {
this->targetRotation.x = 2000.0f;
} else {
@@ -390,7 +387,7 @@ void EnBaguo_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
}
void EnBaguo_DrawBody(Actor* thisx, GlobalContext* globalCtx) {
- static TexturePtr sEyeTextures[] = { &D_060014C8, &D_060018C8, &D_06001CC8 };
+ static TexturePtr sEyeTextures[] = { &gNejironEyeOpenTex, &gNejironEyeHalfTex, &gNejironEyeClosedTex };
EnBaguo* this = THIS;
Gfx* gfx;
s32 eyeIndex;
@@ -483,7 +480,7 @@ void EnBaguo_DrawRockParticles(EnBaguo* this, GlobalContext* globalCtx) {
Matrix_Scale(particle->scale, particle->scale, particle->scale, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 1, 255, 255, 255, 255);
- gSPDisplayList(POLY_OPA_DISP++, &D_0401FA40);
+ gSPDisplayList(POLY_OPA_DISP++, &gameplay_keep_DL_01FA40);
}
}
CLOSE_DISPS(gfxCtx);
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 ddc5742423..7ea98689ec 100644
--- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
+++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c
@@ -5,6 +5,8 @@
*/
#include "z_en_bigpo.h"
+#include "objects/object_bigpo/object_bigpo.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00001215
@@ -32,6 +34,7 @@ void EnBigpo_SpawnCutsceneStage6(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_SpawnCutsceneStage7(EnBigpo* this);
void EnBigpo_SpawnCutsceneStage8(EnBigpo* this, GlobalContext* globalCtx);
+s32 EnBigpo_ApplyDamage(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_LowerCutsceneSubCamera(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_WellWaitForProximity(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_WaitCutsceneQueue(EnBigpo* this, GlobalContext* globalCtx);
@@ -48,7 +51,6 @@ void EnBigpo_SpinAttack(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_SetupSpinDown(EnBigpo* this);
void EnBigpo_SpinningDown(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_CheckHealth(EnBigpo* this, GlobalContext* globalCtx);
-s32 EnBigpo_ApplyDamage(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_SetupDeath(EnBigpo* this);
void EnBigpo_BurnAwayDeath(EnBigpo* this, GlobalContext* globalCtx);
void EnBigpo_SetupLanternDrop(EnBigpo* this, GlobalContext* globalCtx);
@@ -80,17 +82,6 @@ void EnBigpo_DrawLantern(Actor* thisx, GlobalContext* globalCtx);
void EnBigpo_DrawCircleFlames(Actor* thisx, GlobalContext* globalCtx);
void EnBigpo_RevealedFire(Actor* thisx, GlobalContext* globalCtx);
-extern AnimationHeader D_06001360;
-extern SkeletonHeader D_06005C18;
-extern AnimationHeader D_06000924;
-extern AnimationHeader D_06000924;
-extern AnimationHeader D_06000454;
-extern Gfx D_060041A0;
-extern Gfx D_06001BB0;
-extern Gfx D_060058B8;
-extern Gfx D_060042C8;
-extern Gfx D_060043F8;
-
extern const ActorInit En_Bigpo_InitVars;
const ActorInit En_Bigpo_InitVars = {
@@ -203,7 +194,7 @@ void EnBigpo_Init(Actor* thisx, GlobalContext* globalCtx2) {
return;
}
- SkelAnime_Init(globalCtx, &this->skelAnime, &D_06005C18, &D_06000924, this->jointTable, this->morphTable,
+ SkelAnime_Init(globalCtx, &this->skelAnime, &gBigpoSkeleton, &gBigpoFloatAnim, this->jointTable, this->morphTable,
ENBIGPO_LIMBCOUNT);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo(&thisx->colChkInfo, &sDamageTable, &sColChkInfoInit);
@@ -244,7 +235,7 @@ void EnBigpo_Destroy(Actor* thisx, GlobalContext* globalCtx) {
if ((this->actor.params != ENBIGPO_POSSIBLEFIRE) && (this->actor.params != ENBIGPO_CHOSENFIRE) &&
(this->actor.params != ENBIGPO_REVEALEDFIRE) && (this->actor.params != ENBIGPO_UNK5)) {
- // if NOT a fire type, *ENBIGPO_REGULAR and ENBIGPO_SUMMONED combat types only)
+ // if NOT a fire type, *ENBIGPO_REGULAR and ENBIGPO_SUMMONED (combat types only)
if (1) {}
globalCtx2 = globalCtx;
for (fireCount = 0; fireCount < ARRAY_COUNT(this->fires); fireCount++) {
@@ -254,7 +245,7 @@ void EnBigpo_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
}
-void func_80B61914(EnBigpo* this) {
+void EnBigpo_RotateSpawnCutsceneFires(EnBigpo* this) {
EnBigpoFireEffect* firePtr;
s32 i;
@@ -275,7 +266,9 @@ void EnBigpo_UpdateSpin(EnBigpo* this) {
}
}
-// Lowers the position/eye of the camera during the Big Poe spawn cutscene
+/*
+ * Lowers the position/eye of the camera during the Big Poe spawn cutscene
+ */
void EnBigpo_LowerCutsceneSubCamera(EnBigpo* this, GlobalContext* globalContext) {
Camera* subCam;
@@ -330,7 +323,7 @@ void EnBigpo_SpawnCutsceneStage1(EnBigpo* this, GlobalContext* globalCtx) {
this->actor.draw = EnBigpo_DrawCircleFlames;
this->actor.shape.rot.y = BINANG_ROT180(this->actor.yawTowardsPlayer);
- func_80B61914(this);
+ EnBigpo_RotateSpawnCutsceneFires(this);
for (i = 0; i < ARRAY_COUNT(this->fires); i++) {
this->fires[i].pos.y = this->actor.world.pos.y;
@@ -383,7 +376,7 @@ void EnBigpo_SpawnCutsceneStage4(EnBigpo* this, GlobalContext* globalCtx) {
this->actor.velocity.y += 0.25f;
}
this->actor.shape.rot.y += this->rotVelocity;
- func_80B61914(this);
+ EnBigpo_RotateSpawnCutsceneFires(this);
if (1) {}
for (i = 0; i < ARRAY_COUNT(this->fires); i++) {
@@ -402,7 +395,7 @@ void EnBigpo_SpawnCutsceneStage4(EnBigpo* this, GlobalContext* globalCtx) {
* big poe starts to visibly appear
*/
void EnBigpo_SpawnCutsceneStage5(EnBigpo* this) {
- Animation_PlayLoop(&this->skelAnime, &D_06001360);
+ Animation_PlayLoop(&this->skelAnime, &gBigpoAwakenStretchAnim);
this->actor.draw = EnBigpo_DrawMainBigpo;
Actor_SetScale(&this->actor, 0.014f);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
@@ -420,7 +413,7 @@ void EnBigpo_SpawnCutsceneStage6(EnBigpo* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
this->actor.shape.rot.y += this->rotVelocity;
alphaPlus = this->mainColor.a + 10; // decrease transparency
- func_80B61914(this);
+ EnBigpo_RotateSpawnCutsceneFires(this);
if (alphaPlus >= 90) {
this->rotVelocity -= 0x80;
this->actor.velocity.y -= 0.25f;
@@ -516,7 +509,7 @@ void EnBigpo_SetupWarpIn(EnBigpo* this, GlobalContext* globalCtx) {
s16 randomYaw = (Rand_Next() >> 0x14) + this->actor.yawTowardsPlayer;
Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKIDS_APPEAR);
- Animation_PlayLoop(&this->skelAnime, &D_06001360);
+ Animation_PlayLoop(&this->skelAnime, &gBigpoAwakenStretchAnim);
this->rotVelocity = 0x2000;
this->actor.world.pos.x = (Math_SinS(randomYaw) * distance) + player->actor.world.pos.x;
this->actor.world.pos.z = (Math_CosS(randomYaw) * distance) + player->actor.world.pos.z;
@@ -543,7 +536,7 @@ void EnBigpo_WarpingIn(EnBigpo* this, GlobalContext* globalCtx) {
}
void EnBigpo_SetupIdleFlying(EnBigpo* this) {
- Animation_MorphToLoop(&this->skelAnime, &D_06000924, -5.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gBigpoFloatAnim, -5.0f);
// if poe missed attack, idle 4 seconds, otherwise its reappearing: attack immediately
this->idleTimer = (this->actionFunc == EnBigpo_SpinningDown) ? 80 : 0;
this->hoverHeightCycleTimer = 40;
@@ -654,7 +647,7 @@ void EnBigpo_SpinningDown(EnBigpo* this, GlobalContext* globalCtx) {
* called by EnBigpo_ApplyDamage
*/
void EnBigpo_HitStun(EnBigpo* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &D_06000454, -6.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gBigpoShockAnim, -6.0f);
func_800BCB70(&this->actor, 0x4000, 0xFF, 0, 0x10);
this->collider.base.acFlags &= ~AC_ON;
func_800BE504(&this->actor, &this->collider);
@@ -714,13 +707,13 @@ void EnBigpo_BurnAwayDeath(EnBigpo* this, GlobalContext* globalCtx) {
// not sure what we're turning this into, but its based on the timer
modifiedTimer = ((f32)((this->idleTimer * 10) + 80) * 1.4000001f);
- func_800B3030(globalCtx, &tempVec, &D_80B6506C, &D_801D15B0, modifiedTimer, 0, 2);
+ func_800B3030(globalCtx, &tempVec, &D_80B6506C, &gZeroVec3f, modifiedTimer, 0, 2);
tempVec.x = (2.0f * this->actor.world.pos.x) - tempVec.x;
tempVec.z = (2.0f * this->actor.world.pos.z) - tempVec.z;
- func_800B3030(globalCtx, &tempVec, &D_80B6506C, &D_801D15B0, modifiedTimer, 0, 2);
+ func_800B3030(globalCtx, &tempVec, &D_80B6506C, &gZeroVec3f, modifiedTimer, 0, 2);
tempVec.x = this->actor.world.pos.x;
tempVec.z = this->actor.world.pos.z;
- func_800B3030(globalCtx, &tempVec, &D_80B6506C, &D_801D15B0, modifiedTimer, 0, 2);
+ func_800B3030(globalCtx, &tempVec, &D_80B6506C, &gZeroVec3f, modifiedTimer, 0, 2);
} else if (this->idleTimer >= 28) {
EnBigpo_SetupLanternDrop(this, globalCtx);
@@ -764,7 +757,8 @@ void EnBigpo_LanternFalling(EnBigpo* this, GlobalContext* globalCtx) {
Actor_SetSwitchFlag(globalCtx, this->switchFlags);
}
- EffectSsHahen_SpawnBurst(globalCtx, &this->actor.world.pos, 6.0f, 0, 1, 1, 15, OBJECT_BIGPO, 10, &D_060041A0);
+ EffectSsHahen_SpawnBurst(globalCtx, &this->actor.world.pos, 6.0f, 0, 1, 1, 15, OBJECT_BIGPO, 10,
+ gBigpoDrawLanternFallingDL);
EnBigpo_SpawnScoopSoul(this);
}
}
@@ -1252,7 +1246,7 @@ void EnBigpo_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
if ((this->actionFunc == EnBigpo_BurnAwayDeath) && (this->idleTimer >= 2) && (limbIndex == 8)) {
gSPMatrix((*gfx)++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList((*gfx)++, &D_060058B8);
+ gSPDisplayList((*gfx)++, &gBigpoDrawCrispyBodyDL);
}
if (limbIndex == 7) {
@@ -1305,7 +1299,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, GlobalContext* globalCtx) {
// fully visible OR fully transparent
dispHead = POLY_OPA_DISP;
gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
- gSPSegment(&dispHead[1], 0x0C, &D_801AEFA0);
+ gSPSegment(&dispHead[1], 0x0C, &D_801AEFA0); // empty display list for no transparency
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(globalCtx->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
this->mainColor.a));
@@ -1315,7 +1309,7 @@ void EnBigpo_DrawMainBigpo(Actor* thisx, GlobalContext* globalCtx) {
} else {
dispHead = POLY_XLU_DISP;
gSPDisplayList(dispHead, &sSetupDL[6 * 0x19]);
- gSPSegment(&dispHead[1], 0x0C, &D_801AEF88);
+ gSPSegment(&dispHead[1], 0x0C, &D_801AEF88); // transparency display list
gSPSegment(&dispHead[2], 0x08,
Gfx_EnvColor(globalCtx->state.gfxCtx, this->mainColor.r, this->mainColor.g, this->mainColor.b,
this->mainColor.a));
@@ -1360,7 +1354,7 @@ void EnBigpo_DrawScoopSoul(Actor* thisx, GlobalContext* globalCtx) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, &D_06001BB0);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigpoDrawSoulDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
@@ -1384,7 +1378,7 @@ void EnBigpo_DrawLantern(Actor* thisx, GlobalContext* globalCtx) {
magnitude2 = (magnitude > 1.0f) ? (20.0f / magnitude) : (20.0f);
Math_Vec3f_Scale(&vec1, magnitude2);
} else {
- Math_Vec3f_Copy(&vec1, &D_801D15B0);
+ Math_Vec3f_Copy(&vec1, &gZeroVec3f);
}
{
@@ -1412,9 +1406,9 @@ void EnBigpo_DrawLantern(Actor* thisx, GlobalContext* globalCtx) {
gSPMatrix(&dispHead[3], Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(&dispHead[4], &D_060042C8);
+ gSPDisplayList(&dispHead[4], &gBigpoDrawLanternMainDL);
- gSPDisplayList(&dispHead[5], &D_060043F8);
+ gSPDisplayList(&dispHead[5], &gBigpoDrawLanternPurpleTopDL);
// fully transparent OR fully invisible
if ((this->mainColor.a == 255) || (this->mainColor.a == 0)) {
@@ -1461,7 +1455,7 @@ void EnBigpo_DrawCircleFlames(Actor* thisx, GlobalContext* globalCtx) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, &D_0407D590); // flame displaylist
+ gSPDisplayList(POLY_XLU_DISP++, &gGameplayKeepDrawFlameDL);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
@@ -1488,7 +1482,7 @@ void EnBigpo_RevealedFire(Actor* thisx, GlobalContext* globalCtx) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, &D_0407D590); // flame displaylist
+ gSPDisplayList(POLY_XLU_DISP++, &gGameplayKeepDrawFlameDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
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 f67e80980d..42395579eb 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c
@@ -1,10 +1,12 @@
/*
* File: z_en_bigslime.c
* Overlay: ovl_En_Bigslime
- * Description: Mad Jelly (miniboss)
+ * Description: Mad Jelly & Gekko Miniboss: Fused Jellies & Gekko
*/
#include "z_en_bigslime.h"
+#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
+#include "objects/object_bigslime/object_bigslime.h"
#define FLAGS 0x00000235
@@ -12,40 +14,200 @@
void EnBigslime_Init(Actor* thisx, GlobalContext* globalCtx);
void EnBigslime_Destroy(Actor* thisx, GlobalContext* globalCtx);
-void EnBigslime_Update(Actor* thisx, GlobalContext* globalCtx);
-void EnBigslime_Draw(Actor* thisx, GlobalContext* globalCtx);
+void EnBigslime_UpdateGekko(Actor* thisx, GlobalContext* globalCtx);
+void EnBigslime_DrawGekko(Actor* thisx, GlobalContext* globalCtx);
-void func_808E6E80(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E6F50(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E7048(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E71FC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E7354(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E7B80(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E84DC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E89CC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E8CCC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E91EC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E97D0(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E9AE0(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E9DD0(EnBigslime* this, GlobalContext* globalCtx);
-void func_808E9FC0(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA1C8(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA2D0(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA5E8(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA7A4(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA860(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EA9B8(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EAA8C(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EAB74(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EACEC(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB0A8(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB24C(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB574(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB708(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB804(EnBigslime* this, GlobalContext* globalCtx);
-void func_808EB8B4(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_EndCutscene(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_CutsceneStartBattle(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupCutsceneNoticePlayer(EnBigslime* this);
+void EnBigslime_CutsceneNoticePlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupCallMinislime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_CallMinislime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_MoveOnCeiling(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupDrop(EnBigslime* this);
+void EnBigslime_Drop(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this);
+void EnBigslime_SquishFlat(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupSquishFlat(EnBigslime* this);
+void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this);
+void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this);
+void EnBigslime_SetTargetVtxToStaticVtx(EnBigslime* this);
+void EnBigslime_SetupRise(EnBigslime* this);
+void EnBigslime_Rise(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_CutsceneGrabPlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupAttackPlayerInBigslime(EnBigslime* this);
+void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupWindupThrowPlayer(EnBigslime* this);
+void EnBigslime_WindupThrowPlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupSetDynamicVtxThrowPlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetDynamicVtxThrowPlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupFrozenGround(EnBigslime* this);
+void EnBigslime_FrozenGround(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_Freeze(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_Melt(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupFrozenFall(EnBigslime* this);
+void EnBigslime_FrozenFall(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupJumpGekko(EnBigslime* this);
+void EnBigslime_JumpGekko(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupIdleLookAround(EnBigslime* this);
+void EnBigslime_IdleLookAround(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupIdleNoticePlayer(EnBigslime* this);
+void EnBigslime_IdleNoticePlayer(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupThrowMinislime(EnBigslime* this);
+void EnBigslime_DamageGekko(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_StunGekko(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_CutsceneFormBigslime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupFormBigslime(EnBigslime* this);
+void EnBigslime_FormBigslime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_CutsceneDefeat(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupGekkoDespawn(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_GekkoDespawn(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupFrogSpawn(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_FrogSpawn(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupDespawn(EnBigslime* this);
+void EnBigslime_Despawn(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupInitEntrance(EnBigslime* this);
+void EnBigslime_InitEntrance(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_ThrowMinislime(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_SetupCutscene(EnBigslime* this);
+void EnBigslime_PlayCutscene(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_AddIceShardEffect(EnBigslime* this, GlobalContext* globalCtx);
+void EnBigslime_UpdateBigslime(Actor* thisx, GlobalContext* globalCtx);
+void EnBigslime_DrawBigslime(Actor* thisx, GlobalContext* globalCtx);
+void EnBigslime_DrawShatteringEffects(EnBigslime* this, GlobalContext* globalCtx);
+
+/*
+ * Bigslime Spherical Vtx Data:
+ * - The vtx data for Bigslime is put directly into the overlay
+ * - This vtx is directly manipulated in a significant number of functions in this overlay
+ * - The initialized vtx data has the following properties: (some of this data may change as overlay functions are
+ * called)
+ * -- It is a sphere with radius 1000
+ * -- There are 162 vertices numbered top to bottom along the y-axis,
+ * with vertex 0 being the top apex, and vertex 161 being the bottom apex
+ * -- There are 4 entire copies of the sphere
+ * --- The first 3 copies are identical
+ * --- All 4 copies have identical coordinates and number of vertices
+ * --- See below (variants) for the uses of these copies
+ *
+ * Vtx Rings:
+ * - The vtx mesh was designed to be seperated into distint "rings" of vertices and faces
+ * from top to bottom at discrete y-intervals
+ * - These different rings of vertices lie in the xzPlane along discrete y-direction steps of the sphere
+ * -- There are the single apex nodes at the top (vertex 0 y-coordiante 1000) and bottom (vertex 161
+ * y-coordiante -1000)
+ * -- There are a cluster of vertices (vertex 1-5) which all have y-coordinate 962
+ * and form a ring of vertices in the xz-plane
+ * -- There are a cluster of vertices (vertex 6-15) which all have y-coordinate around 870
+ * and form a ring of vertices in the xz-plane
+ * -- So on and so forth (See sVtxRingStartIndex)
+ * -- BIGSLIME_NUM_RING_VTX: There are a total of 13 rings of vertices including the two single apex vertex
+ * -- BIGSLIME_NUM_RING_FACES: There are a total of 12 rings of faces between the rings of vertices
+ * - A collider is assigned to each of the 12 rings of faces for bigslime
+ *
+ * Three Variants of the Spherical Vtx:
+ * Static (1 copy):
+ * - Fixed mesh, no values are ever modified
+ * - Used as reference to store the original vertices
+ * - Never drawn, only used in calculations
+ * Dynamic (2 copies):
+ * - Coordinate are updated and deformed, mesh is drawn as the deforming Fused Jelly.
+ * - Initially Identical to Static.
+ * - Two copies are used that alternate every frame and copies over coordinates/normals immediately.
+ * One copy is the version that is drawn, and the other copy is updated in the background
+ * - Alpha values remain fixed
+ * Target (1 copy):
+ * - Used to define the target vertices/shape for the dynamic vertices to smoothly step to.
+ * - When frozen:
+ * -- The current target vertices are set to the current dynamic vertices
+ * -- These are the vertices that are used to draw the frozen Fused Jelly
+ * -- The alpha values are used for the frozen effects alpha
+ */
+
+// Reference data: used to store the original vertices
+static Vtx sBigslimeStaticVtx[BIGSLIME_NUM_VTX] = {
+#include "overlays/ovl_En_Bigslime/sBigslimeStaticVtx.vtx.inc"
+};
+
+// Dynamic data: used to draw the real shape and has 2 states
+static Vtx sBigslimeDynamicVtx[2][BIGSLIME_NUM_VTX] = {
+ {
+#include "overlays/ovl_En_Bigslime/sBigslimeDynamicState0Vtx.vtx.inc"
+ },
+ {
+#include "overlays/ovl_En_Bigslime/sBigslimeDynamicState1Vtx.vtx.inc"
+ },
+};
+
+// Target data: used to define the shape the dynamic vertices morph to
+static Vtx sBigslimeTargetVtx[BIGSLIME_NUM_VTX] = {
+#include "overlays/ovl_En_Bigslime/sBigslimeTargetVtx.vtx.inc"
+};
+
+/*
+ * Triangle face
+ * Connectivity matrix for mesh above. Covers every triangle in the sphere
+ * 320 triangles x 3 vertices per triangle
+ * Purpose: indices to calculate/update normal vector for lighting calculations
+ * "EnBigslimeTri" struct based on "Tri" struct from gbi.h, but without the flag
+ */
+static EnBigslimeTri sEnbigslimeTri[BIGSLIME_NUM_FACES] = {
+ { 0, 2, 1 }, { 1, 7, 6 }, { 1, 2, 7 }, { 2, 8, 7 }, { 6, 17, 16 }, { 6, 7, 17 },
+ { 8, 19, 18 }, { 7, 8, 18 }, { 7, 18, 17 }, { 9, 21, 20 }, { 0, 3, 2 }, { 2, 9, 8 },
+ { 2, 3, 9 }, { 3, 10, 9 }, { 8, 20, 19 }, { 8, 9, 20 }, { 10, 22, 21 }, { 9, 10, 21 },
+ { 0, 4, 3 }, { 3, 11, 10 }, { 3, 4, 11 }, { 4, 12, 11 }, { 10, 23, 22 }, { 10, 11, 23 },
+ { 12, 25, 24 }, { 11, 12, 24 }, { 11, 24, 23 }, { 13, 27, 26 }, { 0, 5, 4 }, { 4, 13, 12 },
+ { 4, 5, 13 }, { 5, 14, 13 }, { 12, 26, 25 }, { 12, 13, 26 }, { 14, 28, 27 }, { 13, 14, 27 },
+ { 0, 1, 5 }, { 5, 15, 14 }, { 5, 1, 15 }, { 1, 6, 15 }, { 14, 29, 28 }, { 14, 15, 29 },
+ { 6, 16, 30 }, { 15, 6, 30 }, { 15, 30, 29 }, { 16, 32, 31 }, { 16, 17, 32 }, { 17, 33, 32 },
+ { 17, 18, 33 }, { 18, 34, 33 }, { 18, 19, 34 }, { 19, 35, 34 }, { 19, 20, 36 }, { 20, 37, 36 },
+ { 20, 21, 37 }, { 21, 38, 37 }, { 21, 22, 38 }, { 22, 39, 38 }, { 19, 36, 35 }, { 22, 40, 39 },
+ { 22, 23, 40 }, { 23, 41, 40 }, { 23, 24, 41 }, { 24, 42, 41 }, { 24, 25, 42 }, { 25, 43, 42 },
+ { 25, 26, 44 }, { 26, 45, 44 }, { 26, 27, 45 }, { 27, 46, 45 }, { 27, 28, 46 }, { 28, 47, 46 },
+ { 25, 44, 43 }, { 28, 48, 47 }, { 28, 29, 48 }, { 29, 49, 48 }, { 29, 30, 49 }, { 30, 50, 49 },
+ { 30, 16, 50 }, { 16, 31, 50 }, { 31, 32, 51 }, { 32, 52, 51 }, { 32, 33, 52 }, { 33, 53, 52 },
+ { 33, 34, 53 }, { 34, 54, 53 }, { 34, 35, 54 }, { 35, 55, 54 }, { 35, 36, 55 }, { 36, 56, 55 },
+ { 36, 37, 56 }, { 37, 57, 56 }, { 37, 38, 57 }, { 38, 58, 57 }, { 38, 39, 58 }, { 39, 59, 58 },
+ { 39, 40, 59 }, { 40, 60, 59 }, { 40, 41, 60 }, { 41, 61, 60 }, { 41, 42, 61 }, { 42, 62, 61 },
+ { 42, 43, 62 }, { 43, 63, 62 }, { 51, 72, 71 }, { 51, 52, 72 }, { 52, 73, 72 }, { 52, 53, 73 },
+ { 53, 74, 73 }, { 53, 54, 74 }, { 54, 75, 74 }, { 54, 55, 75 }, { 55, 76, 75 }, { 55, 56, 76 },
+ { 56, 77, 76 }, { 56, 57, 77 }, { 57, 78, 77 }, { 57, 58, 78 }, { 58, 79, 78 }, { 58, 59, 79 },
+ { 59, 80, 79 }, { 59, 60, 80 }, { 60, 81, 80 }, { 60, 61, 81 }, { 61, 82, 81 }, { 61, 62, 82 },
+ { 62, 83, 82 }, { 62, 63, 83 }, { 71, 72, 91 }, { 72, 92, 91 }, { 72, 73, 92 }, { 73, 93, 92 },
+ { 73, 74, 93 }, { 74, 94, 93 }, { 74, 75, 94 }, { 75, 95, 94 }, { 75, 76, 95 }, { 76, 96, 95 },
+ { 76, 77, 96 }, { 77, 97, 96 }, { 77, 78, 97 }, { 78, 98, 97 }, { 78, 79, 98 }, { 79, 99, 98 },
+ { 79, 80, 99 }, { 80, 100, 99 }, { 80, 81, 100 }, { 81, 101, 100 }, { 81, 82, 101 }, { 82, 102, 101 },
+ { 82, 83, 102 }, { 83, 103, 102 }, { 91, 112, 111 }, { 91, 92, 112 }, { 92, 113, 112 }, { 92, 93, 113 },
+ { 93, 114, 113 }, { 93, 94, 114 }, { 94, 115, 114 }, { 94, 95, 115 }, { 95, 116, 115 }, { 95, 96, 116 },
+ { 96, 117, 116 }, { 96, 97, 117 }, { 97, 118, 117 }, { 97, 98, 118 }, { 98, 119, 118 }, { 98, 99, 119 },
+ { 99, 120, 119 }, { 99, 100, 120 }, { 100, 121, 120 }, { 100, 101, 121 }, { 101, 122, 121 }, { 101, 102, 122 },
+ { 102, 123, 122 }, { 102, 103, 123 }, { 43, 44, 63 }, { 44, 64, 63 }, { 44, 45, 64 }, { 45, 65, 64 },
+ { 45, 46, 65 }, { 46, 66, 65 }, { 46, 47, 66 }, { 47, 67, 66 }, { 47, 48, 67 }, { 48, 68, 67 },
+ { 48, 49, 68 }, { 49, 69, 68 }, { 49, 50, 69 }, { 50, 70, 69 }, { 50, 31, 70 }, { 31, 51, 70 },
+ { 63, 84, 83 }, { 63, 64, 84 }, { 64, 85, 84 }, { 64, 65, 85 }, { 65, 86, 85 }, { 65, 66, 86 },
+ { 66, 87, 86 }, { 66, 67, 87 }, { 67, 88, 87 }, { 67, 68, 88 }, { 68, 89, 88 }, { 68, 69, 89 },
+ { 69, 90, 89 }, { 69, 70, 90 }, { 70, 71, 90 }, { 70, 51, 71 }, { 83, 84, 103 }, { 84, 104, 103 },
+ { 84, 85, 104 }, { 85, 105, 104 }, { 85, 86, 105 }, { 86, 106, 105 }, { 86, 87, 106 }, { 87, 107, 106 },
+ { 87, 88, 107 }, { 88, 108, 107 }, { 88, 89, 108 }, { 89, 109, 108 }, { 89, 90, 109 }, { 90, 110, 109 },
+ { 90, 71, 110 }, { 71, 91, 110 }, { 103, 124, 123 }, { 103, 104, 124 }, { 104, 125, 124 }, { 104, 105, 125 },
+ { 105, 126, 125 }, { 105, 106, 126 }, { 106, 127, 126 }, { 106, 107, 127 }, { 107, 128, 127 }, { 107, 108, 128 },
+ { 108, 129, 128 }, { 108, 109, 129 }, { 109, 130, 129 }, { 109, 110, 130 }, { 110, 111, 130 }, { 110, 91, 111 },
+ { 161, 160, 156 }, { 155, 146, 160 }, { 146, 156, 160 }, { 146, 147, 156 }, { 144, 145, 155 }, { 145, 146, 155 },
+ { 145, 131, 146 }, { 131, 147, 146 }, { 131, 132, 147 }, { 134, 135, 149 }, { 161, 156, 157 }, { 147, 148, 156 },
+ { 148, 157, 156 }, { 148, 149, 157 }, { 132, 133, 147 }, { 133, 148, 147 }, { 133, 134, 148 }, { 134, 149, 148 },
+ { 161, 157, 158 }, { 149, 150, 157 }, { 150, 158, 157 }, { 150, 151, 158 }, { 135, 136, 149 }, { 136, 150, 149 },
+ { 136, 137, 150 }, { 137, 151, 150 }, { 137, 138, 151 }, { 140, 141, 153 }, { 161, 158, 159 }, { 151, 152, 158 },
+ { 152, 159, 158 }, { 152, 153, 159 }, { 138, 139, 151 }, { 139, 152, 151 }, { 139, 140, 152 }, { 140, 153, 152 },
+ { 161, 159, 160 }, { 153, 154, 159 }, { 154, 160, 159 }, { 154, 155, 160 }, { 141, 142, 153 }, { 142, 154, 153 },
+ { 142, 143, 154 }, { 143, 155, 154 }, { 143, 144, 155 }, { 111, 131, 145 }, { 111, 112, 131 }, { 112, 132, 131 },
+ { 112, 113, 132 }, { 113, 114, 132 }, { 114, 133, 132 }, { 114, 115, 133 }, { 115, 116, 134 }, { 116, 135, 134 },
+ { 116, 117, 135 }, { 117, 118, 135 }, { 118, 136, 135 }, { 118, 119, 136 }, { 115, 134, 133 }, { 119, 137, 136 },
+ { 119, 120, 137 }, { 120, 138, 137 }, { 120, 121, 138 }, { 121, 122, 138 }, { 122, 139, 138 }, { 122, 123, 139 },
+ { 139, 123, 140 }, { 140, 123, 124 }, { 140, 124, 141 }, { 141, 124, 125 }, { 141, 125, 126 }, { 141, 126, 142 },
+ { 142, 127, 143 }, { 143, 127, 128 }, { 143, 128, 144 }, { 144, 128, 129 }, { 144, 129, 130 }, { 144, 130, 145 },
+ { 142, 126, 127 }, { 130, 111, 145 },
+};
-#if 0
const ActorInit En_Bigslime_InitVars = {
ACTOR_EN_BIGSLIME,
ACTORCAT_BOSS,
@@ -54,289 +216,2941 @@ const ActorInit En_Bigslime_InitVars = {
sizeof(EnBigslime),
(ActorFunc)EnBigslime_Init,
(ActorFunc)EnBigslime_Destroy,
- (ActorFunc)EnBigslime_Update,
- (ActorFunc)EnBigslime_Draw,
+ (ActorFunc)EnBigslime_UpdateGekko,
+ (ActorFunc)EnBigslime_DrawGekko,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_808F02A0 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x20000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NONE, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x20000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NONE,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 30, 60, 0, { 0, 0, 0 } },
};
-// sColChkInfoInit
-static CollisionCheckInfoInit D_808F02CC = { 10, 100, 100, 50 };
+static CollisionCheckInfoInit sColChkInfoInit = { 10, 100, 100, 50 };
-// static DamageTable sDamageTable = {
-static DamageTable D_808F02D4 = {
- /* Deku Nut */ DMG_ENTRY(0, 0x1),
- /* Deku Stick */ DMG_ENTRY(1, 0x0),
- /* Horse trample */ DMG_ENTRY(0, 0x0),
- /* Explosives */ DMG_ENTRY(1, 0xF),
- /* Zora boomerang */ DMG_ENTRY(1, 0x0),
- /* Normal arrow */ DMG_ENTRY(1, 0x0),
- /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
- /* Hookshot */ DMG_ENTRY(0, 0xE),
- /* 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, 0x3),
- /* Light arrow */ DMG_ENTRY(2, 0x4),
- /* Goron spikes */ DMG_ENTRY(1, 0xF),
- /* Deku spin */ DMG_ENTRY(0, 0xD),
- /* Deku bubble */ DMG_ENTRY(1, 0x0),
- /* Deku launch */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1),
- /* Zora barrier */ DMG_ENTRY(0, 0x5),
- /* Normal shield */ DMG_ENTRY(0, 0x0),
- /* Light ray */ DMG_ENTRY(0, 0x0),
- /* Thrown object */ DMG_ENTRY(1, 0xF),
- /* Zora punch */ DMG_ENTRY(1, 0x0),
- /* Spin attack */ DMG_ENTRY(1, 0x0),
- /* Sword beam */ DMG_ENTRY(1, 0x0),
- /* Normal Roll */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
- /* Unblockable */ DMG_ENTRY(0, 0x0),
- /* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0),
- /* Powder Keg */ DMG_ENTRY(1, 0xF),
+typedef enum {
+ /* 0x0 */ BIGSLIME_DMGEFF_NONE,
+ /* 0x0 */ BIGSLIME_DMGEFF_STUN,
+ /* 0x2 */ BIGSLIME_DMGEFF_FIRE,
+ /* 0x3 */ BIGSLIME_DMGEFF_ICE,
+ /* 0x4 */ BIGSLIME_DMGEFF_LIGHT,
+ /* 0x5 */ BIGSLIME_DMGEFF_ELECTRIC_STUN,
+ /* 0xD */ BIGSLIME_DMGEFF_DEKU_STUN = 0xD,
+ /* 0xE */ BIGSLIME_DMGEFF_HOOKSHOT,
+ /* 0xF */ BIGSLIME_DMGEFF_BREAK_ICE,
+} BigslimeDamageEffect;
+
+static DamageTable sDamageTable = {
+ /* Deku Nut */ DMG_ENTRY(0, BIGSLIME_DMGEFF_STUN),
+ /* Deku Stick */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Horse trample */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Explosives */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
+ /* Zora boomerang */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Normal arrow */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* UNK_DMG_0x06 */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Hookshot */ DMG_ENTRY(0, BIGSLIME_DMGEFF_HOOKSHOT),
+ /* Goron punch */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
+ /* Sword */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Goron pound */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
+ /* Fire arrow */ DMG_ENTRY(1, BIGSLIME_DMGEFF_FIRE),
+ /* Ice arrow */ DMG_ENTRY(1, BIGSLIME_DMGEFF_ICE),
+ /* Light arrow */ DMG_ENTRY(2, BIGSLIME_DMGEFF_LIGHT),
+ /* Goron spikes */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
+ /* Deku spin */ DMG_ENTRY(0, BIGSLIME_DMGEFF_DEKU_STUN),
+ /* Deku bubble */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Deku launch */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* UNK_DMG_0x12 */ DMG_ENTRY(0, BIGSLIME_DMGEFF_STUN),
+ /* Zora barrier */ DMG_ENTRY(0, BIGSLIME_DMGEFF_ELECTRIC_STUN),
+ /* Normal shield */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Light ray */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Thrown object */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
+ /* Zora punch */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Spin attack */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Sword beam */ DMG_ENTRY(1, BIGSLIME_DMGEFF_NONE),
+ /* Normal Roll */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* UNK_DMG_0x1B */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* UNK_DMG_0x1C */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Unblockable */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* UNK_DMG_0x1E */ DMG_ENTRY(0, BIGSLIME_DMGEFF_NONE),
+ /* Powder Keg */ DMG_ENTRY(1, BIGSLIME_DMGEFF_BREAK_ICE),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_808F0338[] = {
+// Start vtx numbers for each ring in the vtx sphere
+static s32 sVtxRingStartIndex[] = {
+ 0, 1, 6, 16, 31, 51, 71, 91, 111, 131, 146, 156, 161, BIGSLIME_NUM_VTX,
+};
+
+static AnimationHeader* sGekkoAttackAnimations[] = {
+ &gGekkoJabPunchAnim,
+ &gGekkoHookPunchAnim,
+ &gGekkoKickAnim,
+};
+
+static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, 95, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(targetArrowOffset, -13221, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 5, ICHAIN_STOP),
};
-#endif
-
-extern ColliderCylinderInit D_808F02A0;
-extern CollisionCheckInfoInit D_808F02CC;
-extern DamageTable D_808F02D4;
-extern InitChainEntry D_808F0338[];
-
-extern UNK_TYPE D_060010F4;
-extern UNK_TYPE D_06001B08;
-extern UNK_TYPE D_0600276C;
-extern UNK_TYPE D_06002E0C;
-extern UNK_TYPE D_0600347C;
-extern UNK_TYPE D_060039C4;
-extern UNK_TYPE D_060066B4;
-extern UNK_TYPE D_060069FC;
-extern UNK_TYPE D_06007790;
-extern UNK_TYPE D_0600F048;
-extern UNK_TYPE D_0600F990;
-extern UNK_TYPE D_0600FB40;
-extern UNK_TYPE D_06010530;
-extern UNK_TYPE D_06011050;
-extern UNK_TYPE D_060113B0;
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/EnBigslime_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/EnBigslime_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5388.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5430.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5484.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E574C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5988.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5A00.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5BB0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E5ED4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E601C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E616C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E62B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E64D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6538.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6570.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E670C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6828.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E68AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E69AC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E69F4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6A70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6B08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6B68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6C18.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6C44.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6CC8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6D58.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6E80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6F08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6F50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E6FE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7048.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7154.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E71FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E732C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7354.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E75D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7770.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7AF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7B80.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E7D68.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E8064.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E836C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E844C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E84DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E88B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E89CC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E8C38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E8CCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E90A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E91EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9778.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E97D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E994C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9AE0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9DA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9DD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9F38.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808E9FC0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA14C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA1C8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA264.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA2D0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA538.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA5E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA748.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA7A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA80C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA860.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA8FC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EA9B8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EAA40.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EAA8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EAAF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EAB74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EABCC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EACEC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EAEBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB0A8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB178.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB24C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB328.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB574.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB690.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB7F0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB804.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB83C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB8B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EB9E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EBBE4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EBED0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EC158.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EC354.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/EnBigslime_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EC708.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808EC990.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808ECD14.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808ED07C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/EnBigslime_Draw.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bigslime/func_808ED3F4.s")
+void EnBigslime_Init(Actor* thisx, GlobalContext* globalCtx) {
+ // gSaveContext.weekEventReg[KEY] = VALUE
+ // KEY | VALUE
+ static s32 isFrogReturnedFlags[] = {
+ (32 << 8) | 0x40, // Woodfall Temple Frog Returned
+ (32 << 8) | 0x80, // Great Bay Temple Frog Returned
+ (33 << 8) | 0x01, // Southern Swamp Frog Returned
+ (33 << 8) | 0x02, // Laundry Pool Frog Returned
+ };
+ EnBigslime* this = THIS;
+ GlobalContext* globalCtx2 = globalCtx;
+ s32 i;
+
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGekkoSkel, &gGekkoLookAroundAnim, this->jointTable,
+ this->morphTable, GEKKO_LIMB_MAX);
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ Collider_InitAndSetCylinder(globalCtx, &this->bigslimeCollider[i], &this->actor, &sCylinderInit);
+ }
+
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ Collider_InitAndSetCylinder(globalCtx, &this->gekkoCollider, &this->actor, &sCylinderInit);
+ this->gekkoCollider.base.colType = COLTYPE_HIT6;
+ this->gekkoCollider.info.elemType = ELEMTYPE_UNK1;
+ this->gekkoCollider.base.atFlags &= ~AT_ON;
+ this->gekkoCollider.base.ocFlags1 &= ~OC1_NO_PUSH;
+ this->actor.params = CLAMP(this->actor.params, 1, 4);
+
+ if (Actor_GetRoomCleared(globalCtx, globalCtx->roomCtx.currRoom.num)) {
+ Actor_MarkForDeath(&this->actor);
+ if (!(gSaveContext.weekEventReg[isFrogReturnedFlags[this->actor.params - 1] >> 8] &
+ (u8)isFrogReturnedFlags[this->actor.params - 1])) {
+ Actor_Spawn(&globalCtx2->actorCtx, globalCtx, ACTOR_EN_MINIFROG, this->actor.world.pos.x,
+ this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.shape.rot.y, 0,
+ this->actor.params);
+ }
+ } else {
+ this->cutscene = this->actor.cutscene;
+ this->actor.scale.x = this->actor.scale.z = 0.15f;
+ this->actor.scale.y = 0.075f;
+ this->vtxScaleX = this->vtxScaleZ = 0.015000001f;
+ this->actor.home.pos.x = GBT_ROOM_5_CENTER_X;
+ this->actor.home.pos.y = GBT_ROOM_5_MAX_Y - 75.0f;
+ this->actor.home.pos.z = GBT_ROOM_5_CENTER_Z;
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ this->minislime[i] = (EnMinislime*)Actor_SpawnAsChild(&globalCtx2->actorCtx, &this->actor, globalCtx,
+ ACTOR_EN_MINISLIME, 0.0f, 0.0f, 0.0f, 0, 0, 0, i);
+ if (this->minislime[i] == NULL) {
+ for (i = i - 1; i >= 0; i--) {
+ Actor_MarkForDeath(&this->minislime[i]->actor);
+ }
+
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ }
+
+ this->minislimeFrozenTexAnim = Lib_SegmentedToVirtual(&gMinislimeFrozenTexAnim);
+ this->bigslimeFrozenTexAnim = Lib_SegmentedToVirtual(&gBigslimeFrozenTexAnim);
+ this->iceShardTexAnim = Lib_SegmentedToVirtual(&gBigslimeIceShardTexAnim);
+ this->actor.world.pos.y = GBT_ROOM_5_MIN_Y;
+ this->actor.flags &= ~1;
+ this->actor.shape.shadowAlpha = 255;
+ this->gekkoScale = 0.007f;
+ this->actor.shape.rot.y = 0;
+ this->minislimeToThrow = this->minislime[0];
+ EnBigslime_SetupInitEntrance(this);
+ }
+}
+
+void EnBigslime_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnBigslime* this = THIS;
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ Collider_DestroyCylinder(globalCtx, &this->bigslimeCollider[i]);
+ }
+
+ Collider_DestroyCylinder(globalCtx, &this->gekkoCollider);
+ func_801A72CC(&this->gekkoProjectedPos);
+}
+
+void EnBigslime_DynamicVtxCopyState(EnBigslime* this) {
+ Vtx* dynamicVtxDest;
+ Vtx* dynamicVtxSrc;
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtxDest = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ dynamicVtxSrc = &sBigslimeDynamicVtx[this->dynamicVtxState ^ 1][i];
+ for (j = 0; j < 3; j++) {
+ dynamicVtxDest->n.ob[j] = dynamicVtxSrc->n.ob[j];
+ dynamicVtxDest->n.n[j] = dynamicVtxSrc->n.n[j];
+ }
+ }
+}
+
+void EnBigslime_Vec3fNormalize(Vec3f* vec) {
+ f32 magnitude = Math3D_Vec3fMagnitude(vec);
+
+ if (magnitude > 1.0f) {
+ Math_Vec3f_Scale(vec, 1.0f / magnitude);
+ }
+}
+
+/**
+ * Updates the surface normal vector of each vertex in the fused jelly mesh
+ * each frame as the dynamic vtx is constantly changing shape
+ */
+void EnBigslime_UpdateSurfaceNorm(EnBigslime* this) {
+ Vec3f vtxNorm[BIGSLIME_NUM_VTX];
+ Vec3f vecTriEdge1;
+ Vec3f vecTriEdge2;
+ Vec3f vecTriNorm;
+ Vec3f* vtxNormAddr;
+ Vtx* dynamicVtx;
+ Vtx* dynamicVtx12;
+ Vtx* dynamicVtx0;
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ Math_Vec3f_Copy(&vtxNorm[i], &gZeroVec3f);
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_FACES; i++) {
+ dynamicVtx0 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[0]];
+ dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[1]];
+ vecTriEdge1.x = dynamicVtx12->n.ob[0] - dynamicVtx0->n.ob[0];
+ vecTriEdge1.y = dynamicVtx12->n.ob[1] - dynamicVtx0->n.ob[1];
+ vecTriEdge1.z = dynamicVtx12->n.ob[2] - dynamicVtx0->n.ob[2];
+
+ dynamicVtx12 = &sBigslimeDynamicVtx[this->dynamicVtxState][sEnbigslimeTri[i].v[2]];
+ vecTriEdge2.x = dynamicVtx12->n.ob[0] - dynamicVtx0->n.ob[0];
+ vecTriEdge2.y = dynamicVtx12->n.ob[1] - dynamicVtx0->n.ob[1];
+ vecTriEdge2.z = dynamicVtx12->n.ob[2] - dynamicVtx0->n.ob[2];
+
+ Math3D_CrossProduct(&vecTriEdge1, &vecTriEdge2, &vecTriNorm);
+ EnBigslime_Vec3fNormalize(&vecTriNorm);
+
+ Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[0]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[0]]);
+ Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[1]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[1]]);
+ Math_Vec3f_Sum(&vtxNorm[sEnbigslimeTri[i].v[2]], &vecTriNorm, &vtxNorm[sEnbigslimeTri[i].v[2]]);
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ vtxNormAddr = &vtxNorm[i];
+ EnBigslime_Vec3fNormalize(vtxNormAddr);
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ dynamicVtx->n.n[0] = vtxNormAddr->x * 120.0f;
+ dynamicVtx->n.n[1] = vtxNormAddr->y * 120.0f;
+ dynamicVtx->n.n[2] = vtxNormAddr->z * 120.0f;
+ }
+}
+
+void EnBigslime_GetMaxMinVertices(EnBigslime* this, Vec3f* vtxMax, Vec3f* vtxMin) {
+ Vtx* dynamicVtx;
+ s16 vtxMaxX = 0;
+ s16 vtxMaxY = 0;
+ s16 vtxMaxZ = 0;
+ s16 vtxMinX = 0;
+ s16 vtxMinY = 0;
+ s16 vtxMinZ = 0;
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+
+ if (vtxMaxX < dynamicVtx->n.ob[0]) {
+ vtxMaxX = dynamicVtx->n.ob[0];
+ } else if (vtxMinX > dynamicVtx->n.ob[0]) {
+ vtxMinX = dynamicVtx->n.ob[0];
+ }
+
+ if (vtxMaxY < dynamicVtx->n.ob[1]) {
+ vtxMaxY = dynamicVtx->n.ob[1];
+ } else if (vtxMinY > dynamicVtx->n.ob[1]) {
+ vtxMinY = dynamicVtx->n.ob[1];
+ }
+
+ if (vtxMaxZ < dynamicVtx->n.ob[2]) {
+ vtxMaxZ = dynamicVtx->n.ob[2];
+ } else if (vtxMinZ > dynamicVtx->n.ob[2]) {
+ vtxMinZ = dynamicVtx->n.ob[2];
+ }
+ }
+
+ vtxMax->x = vtxMaxX * this->actor.scale.x;
+ vtxMax->y = vtxMaxY * this->actor.scale.y;
+ vtxMax->z = vtxMaxZ * this->actor.scale.z;
+
+ vtxMin->x = vtxMinX * this->actor.scale.x;
+ vtxMin->y = vtxMinY * this->actor.scale.y;
+ vtxMin->z = vtxMinZ * this->actor.scale.z;
+}
+
+void EnBigslime_UpdateScale(EnBigslime* this, Vec3f* vtxMax, Vec3f* vtxMin) {
+ if (vtxMin->x < vtxMax->x) {
+ this->vtxScaleX = vtxMax->x * (0.100000005f / BIGSLIME_RADIUS_F);
+ } else {
+ this->vtxScaleX = -vtxMin->x * (0.100000005f / BIGSLIME_RADIUS_F);
+ }
+
+ if (vtxMin->z < vtxMax->z) {
+ this->vtxScaleZ = vtxMax->z * (0.100000005f / BIGSLIME_RADIUS_F);
+ } else {
+ this->vtxScaleZ = -vtxMin->z * (0.100000005f / BIGSLIME_RADIUS_F);
+ }
+}
+
+/**
+ * Checks the world position against all walls, the floor, and the ceiling to ensure
+ * bigslime is not outside this range. Accounts only for the world position, and the
+ * maximum and minimum verticies. If any boundaries are crossed, the world position
+ * and bgCheckFlags are updated accordingly.
+ *
+ * Differs from EnBigslime_CheckVtxWallBoundaries by checking and updating
+ * a single world position instead of checking and updating individual vertices
+ */
+void EnBigslime_CheckRoomBoundaries(EnBigslime* this, Vec3f* vtxMax, Vec3f* vtxMin) {
+ f32 worldPosX;
+ f32 vtxMaxX;
+ f32 vtxMinX;
+ f32 worldPosZ;
+ f32 vtxMaxZ;
+ f32 vtxMinZ;
+
+ this->actor.bgCheckFlags &= ~(0x2 | 0x8 | 0x10);
+ if ((this->actor.world.pos.y + vtxMax->y) > GBT_ROOM_5_MAX_Y) {
+ this->actor.world.pos.y = GBT_ROOM_5_MAX_Y - vtxMax->y;
+ this->actor.bgCheckFlags |= 0x10;
+ }
+
+ if ((this->actor.world.pos.y + vtxMin->y) <= GBT_ROOM_5_MIN_Y) {
+ this->actor.world.pos.y = GBT_ROOM_5_MIN_Y - vtxMin->y;
+ if (!(this->actor.bgCheckFlags & 1)) {
+ this->actor.bgCheckFlags |= 2;
+ }
+
+ this->actor.bgCheckFlags |= 1;
+ } else {
+ this->actor.bgCheckFlags &= ~1;
+ }
+
+ if ((this->actionFunc != EnBigslime_Freeze) || !(this->actor.bgCheckFlags & 1)) {
+ worldPosX = this->actor.world.pos.x;
+ vtxMaxX = vtxMax->x;
+ if (GBT_ROOM_5_MAX_X < (worldPosX + vtxMaxX)) {
+ this->actor.bgCheckFlags |= 8;
+ this->actor.world.pos.x = GBT_ROOM_5_MAX_X - vtxMaxX;
+ } else {
+ vtxMinX = vtxMin->x;
+ if ((worldPosX + vtxMinX) < GBT_ROOM_5_MIN_X) {
+ this->actor.world.pos.x = GBT_ROOM_5_MIN_X - vtxMinX;
+ this->actor.bgCheckFlags |= 8;
+ }
+ }
+
+ worldPosZ = this->actor.world.pos.z;
+ vtxMaxZ = vtxMax->z;
+ if (GBT_ROOM_5_MAX_Z < (worldPosZ + vtxMaxZ)) {
+ this->actor.bgCheckFlags |= 8;
+ this->actor.world.pos.z = GBT_ROOM_5_MAX_Z - vtxMaxZ;
+ } else {
+ vtxMinZ = vtxMin->z;
+ if ((worldPosZ + vtxMinZ) < GBT_ROOM_5_MIN_Z) {
+ this->actor.world.pos.z = GBT_ROOM_5_MIN_Z - vtxMinZ;
+ this->actor.bgCheckFlags |= 8;
+ }
+ }
+ }
+}
+
+void EnBigslime_UpdateBigslimeCollider(EnBigslime* this, GlobalContext* globalCtx) {
+ Vtx* dynamicVtx;
+ f32 xzDist;
+ s16 vtxRingMaxY[BIGSLIME_NUM_RING_VTX];
+ s16 vtxRingMinY[BIGSLIME_NUM_RING_VTX];
+ f32 vtxRingMaxXZDist[BIGSLIME_NUM_RING_VTX];
+ Cylinder16* dim;
+ f32 maxScaleXScaleZ = (this->actor.scale.z < this->actor.scale.x ? this->actor.scale.x : this->actor.scale.z);
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < BIGSLIME_NUM_RING_VTX; i++) {
+ vtxRingMaxY[i] = -30000;
+ vtxRingMinY[i] = 30000;
+ vtxRingMaxXZDist[i] = 0.0f;
+
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][j];
+ if (vtxRingMaxY[i] < dynamicVtx->n.ob[1]) {
+ vtxRingMaxY[i] = dynamicVtx->n.ob[1];
+ }
+
+ if (vtxRingMinY[i] > dynamicVtx->n.ob[1]) {
+ vtxRingMinY[i] = dynamicVtx->n.ob[1];
+ }
+
+ xzDist = sqrtf(SQ(dynamicVtx->n.ob[0]) + SQ(dynamicVtx->n.ob[2]));
+ if (vtxRingMaxXZDist[i] < xzDist) {
+ vtxRingMaxXZDist[i] = xzDist;
+ }
+ }
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ dim = &this->bigslimeCollider[i].dim;
+ dim->pos.y = (vtxRingMinY[i + 1] * this->actor.scale.y) + this->actor.world.pos.y;
+ dim->height = (vtxRingMaxY[i] - vtxRingMinY[i + 1]) * this->actor.scale.y;
+ dim->radius = maxScaleXScaleZ *
+ (vtxRingMaxXZDist[i] < vtxRingMaxXZDist[i + 1] ? vtxRingMaxXZDist[i + 1] : vtxRingMaxXZDist[i]);
+ dim->height = CLAMP_MIN(dim->height, 1);
+ dim->pos.x = this->actor.world.pos.x;
+ dim->pos.z = this->actor.world.pos.z;
+ }
+
+ if (this->bigslimeCollider[0].base.atFlags & AT_ON) {
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->bigslimeCollider[i].base);
+ }
+ }
+
+ if (this->bigslimeCollider[0].base.acFlags & AC_ON) {
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->bigslimeCollider[i].base);
+ }
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->bigslimeCollider[i].base);
+ }
+}
+
+void EnBigslime_AddWavySurface(EnBigslime* this) {
+ s32 randInt;
+ f32 randFloat;
+ s32 i;
+
+ this->wavySurfaceTimer = 24;
+ randInt = (s32)(Rand_ZeroOne() * 6.0f) >> 1;
+ randFloat = (Rand_ZeroOne() * 40.0f) + 50.0f;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ if ((i % 6) == 0) {
+ randFloat = (Rand_ZeroOne() * 40.0f) + 50.0f;
+ }
+
+ this->vtxSurfacePerturbation[i] = sin_rad((randInt + i) * (M_PI / 3)) * randFloat * 0.001f;
+ }
+}
+
+void EnBigslime_UpdateWavySurface(EnBigslime* this) {
+ f32 vtxSurfaceWave;
+ Vtx* staticVtx;
+ Vtx* dynamicVtx;
+ s32 i;
+ s32 j;
+
+ if (this->wavySurfaceTimer == 0) {
+ EnBigslime_AddWavySurface(this);
+ }
+
+ this->wavySurfaceTimer--;
+ vtxSurfaceWave = sin_rad(this->wavySurfaceTimer * (M_PI / 12));
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ staticVtx = &sBigslimeStaticVtx[i];
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ for (j = 0; j < 3; j++) {
+ // Formula: dynamicVtx = staticVtx * (1 + sin * perturbation)
+ dynamicVtx->n.ob[j] =
+ staticVtx->n.ob[j] + (s32)(vtxSurfaceWave * staticVtx->n.ob[j] * this->vtxSurfacePerturbation[i]);
+ }
+ }
+}
+
+void EnBigslime_InitFallMinislime(EnBigslime* this) {
+ EnMinislime* minislime;
+ s32 i;
+
+ 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.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);
+ }
+
+ this->minislimeState = MINISLIME_ACTIVE_INIT_STATE;
+}
+
+void EnBigslime_SetMinislimeBreakLocation(EnBigslime* this) {
+ // Minislime spawn at these vertices when Frozen Bigslime Shatters
+ static s32 minislimeSpawnVtx[] = {
+ 7, 9, 11, 13, 15, // 5 equally spaced vertices on vtx ring 2 from top
+ 52, 56, 60, 64, 68, // 5 equally spaced vertices on vtx ring 5 from top
+ 94, 98, 102, 106, 110, // 5 equally spaced vertices on vtx ring 7 from top
+ };
+ Vtx* dynamicVtx;
+ EnMinislime* minislime;
+ s32 i;
+
+ this->minislimeState = MINISLIME_ACTIVE_CONTINUE_STATE;
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][minislimeSpawnVtx[i]];
+ minislime = this->minislime[i];
+ minislime->actor.params = MINISLIME_BREAK_BIGSLIME;
+ minislime->actor.world.pos.x = (dynamicVtx->n.ob[0] * this->actor.scale.x) + this->actor.world.pos.x;
+ minislime->actor.world.pos.y = (dynamicVtx->n.ob[1] * this->actor.scale.y) + this->actor.world.pos.y;
+ minislime->actor.world.pos.z = (dynamicVtx->n.ob[2] * this->actor.scale.z) + this->actor.world.pos.z;
+ minislime->actor.world.rot.x = 0x1000 + 0x333 * (MINISLIME_NUM_SPAWN - i);
+ }
+}
+
+void EnBigslime_SetPlayerParams(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (player->stateFlags2 & 0x80) {
+ player->actor.parent = NULL;
+ player->unk_AE8 = 100;
+ func_800B8D98(globalCtx, &this->actor, 10.0f, this->actor.world.rot.y, 10.0f);
+ }
+}
+
+void EnBigslime_EndThrowMinislime(EnBigslime* this) {
+ if (this->actionFunc == EnBigslime_ThrowMinislime &&
+ this->minislimeToThrow->actor.params == MINISLIME_SETUP_GEKKO_THROW) {
+ this->minislimeToThrow->actor.params = MINISLIME_IDLE;
+ }
+}
+
+void EnBigslime_BreakIntoMinislime(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 i;
+ s16 quake = Quake_Add(GET_ACTIVE_CAM(globalCtx), 3);
+
+ Quake_SetSpeed(quake, 20000);
+ Quake_SetQuakeValues(quake, 15, 0, 0, 0);
+ Quake_SetCountdown(quake, 15);
+ func_8013ECE0(this->actor.xyzDistToPlayerSq, 180, 20, 100);
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ this->gekkoCollider.base.acFlags &= ~(AC_ON | AC_HIT);
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.acFlags &= ~AC_HIT;
+ }
+
+ EnBigslime_SetMinislimeBreakLocation(this);
+ this->actor.update = EnBigslime_UpdateGekko;
+ this->actor.draw = EnBigslime_DrawGekko;
+ this->actor.gravity = -2.0f;
+ EnBigslime_SetPlayerParams(this, globalCtx);
+ EnBigslime_EndCutscene(this, globalCtx);
+ this->actor.colChkInfo.mass = 50;
+ this->actor.flags &= ~(0x1 | 0x400);
+ this->actor.flags |= 0x200;
+ this->actor.hintId = 95;
+ this->gekkoRot.x = 0;
+ this->gekkoRot.y = 0;
+ this->actor.bgCheckFlags &= ~1;
+ this->formBigslimeTimer = 2;
+ EnBigslime_AddIceShardEffect(this, globalCtx);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_BREAK);
+ EnBigslime_SetupJumpGekko(this);
+}
+
+/**
+ * Smoothly moves the camera to a side view and keeps it there
+ * as bigslime grabs player and the Gekko melee-attacks player
+ */
+void EnBigslime_UpdateCameraGrabPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Vec3f subCamEye;
+ Vec3f subCamAt;
+
+ Math_Vec3f_Copy(&subCamEye, &subCam->eye);
+ Math_Vec3f_Copy(&subCamAt, &subCam->at);
+
+ Math_StepToF(&subCamEye.x, (Math_SinS(this->subCamYawGrabPlayer) * 250.0f) + this->actor.world.pos.x, 10.0f);
+ Math_StepToF(&subCamEye.y, GBT_ROOM_5_MIN_Y + 187.5f, 10.0f);
+ Math_StepToF(&subCamEye.z, (Math_CosS(this->subCamYawGrabPlayer) * 250.0f) + this->actor.world.pos.z, 10.0f);
+
+ Math_StepToF(&subCamAt.x, this->actor.world.pos.x, 10.0f);
+ Math_StepToF(&subCamAt.y, GBT_ROOM_5_MIN_Y + 87.5f, 10.0f);
+ Math_StepToF(&subCamAt.z, this->actor.world.pos.z, 10.0f);
+
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCamAt, &subCamEye);
+}
+
+/**
+ * Takes the camera eye and instantaneously moves it 10% closer to the focus point "at".
+ * This gives the camera a "jerk" feeling
+ * Used everytime player is hit inside of bigslime while being grabbed
+ */
+void EnBigslime_JerkCameraPlayerHit(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Vec3f subCamEye;
+
+ Math_Vec3f_Diff(&subCam->eye, &subCam->at, &subCamEye);
+ Math_Vec3f_Scale(&subCamEye, 0.9f);
+ Math_Vec3f_Sum(&subCamEye, &subCam->at, &subCamEye);
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCam->at, &subCamEye);
+}
+
+/**
+ * Performs the camera motion for the intro cutscene as the player enters the room
+ * and the battle starts. Positions the camera slightly offset from player,
+ * then zooms into the Gekko until the Gekko calls the minislimes down from the ceiling
+ */
+void EnBigslime_UpdateCameraIntroCs(EnBigslime* this, GlobalContext* globalCtx, s32 noticeTimer) {
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Vec3f subCamEye;
+ f32 zoom = (noticeTimer * 19.0f) + 67.0f;
+ s16 yawOffset = this->actor.yawTowardsPlayer + (noticeTimer * 0x31);
+
+ subCamEye.x = Math_SinS(yawOffset) * zoom + subCam->at.x;
+ subCamEye.z = Math_CosS(yawOffset) * zoom + subCam->at.z;
+ subCamEye.y = subCam->at.y + -4.0f + (noticeTimer * 2.0f);
+
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCam->at, &subCamEye);
+}
+
+/**
+ * Takes the camera and makes the focus point (at) point at bigslime, who is on the
+ * center of the roof. This is used when the minislimes merges into bigslime.
+ */
+void EnBigslime_UpdateCameraFormingBigslime(EnBigslime* this, GlobalContext* globalCtx) {
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &this->actor.focus.pos,
+ &Play_GetCamera(globalCtx, this->subCamId)->eye);
+}
+
+void EnBigslime_EndCutscene(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* subCam;
+
+ if (this->subCamId != MAIN_CAM) {
+ subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Play_CameraSetAtEye(globalCtx, MAIN_CAM, &subCam->at, &subCam->eye);
+ this->subCamId = MAIN_CAM;
+ ActorCutscene_Stop(this->cutscene);
+ this->cutscene = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ func_800B724C(globalCtx, &this->actor, 6);
+ }
+}
+
+void EnBigslime_Scale(EnBigslime* this, s16 pitch, f32 xzScale, f32 yScale) {
+ this->actor.scale.x = ((Math_SinS(pitch) * xzScale) + 1.5f) * 0.1f; // = 0.15f + 0.1f * xzScale * sin(pitch)
+ this->actor.scale.y = ((Math_CosS(pitch) * yScale) + 0.75f) * 0.1f; // = 0.075f + 0.1f * yScale * cos(pitch)
+ this->actor.scale.z = 0.3f - this->actor.scale.x; // = 0.15f - 0.1f * xzScale * sin(pitch)
+}
+
+/**
+ * Set the params used by the floor shockwave when bigslime shatters into minislime
+ */
+void EnBigslime_InitShockwave(EnBigslime* this, GlobalContext* globalCtx) {
+ globalCtx->envCtx.unk_C3 = 3;
+ Math_Vec3f_Copy(&this->frozenPos, &this->actor.world.pos);
+ this->frozenPos.y = GBT_ROOM_5_MIN_Y;
+ this->shockwaveAlpha = 235;
+ this->shockwaveScale = 0.025f;
+}
+
+/**
+ * Restores bigslime behaviour to the state before it was frozen
+ */
+void EnBigslime_SetTargetVtxFromPreFrozen(EnBigslime* this) {
+ this->bigslimeCollider[0].base.acFlags |= AC_ON;
+ this->actionFunc = this->actionFuncStored;
+ this->skelAnime.playSpeed = 1.0f;
+ if (this->actionFunc == EnBigslime_SquishFlat) {
+ this->bigslimeCollider[0].base.atFlags |= AT_ON;
+ EnBigslime_SetTargetVtxToWideCone(this);
+ } else if (this->actionFunc == EnBigslime_Rise) {
+ if (this->riseCounter == 0) {
+ EnBigslime_SetTargetVtxToThinCone(this);
+ } else if (this->riseCounter == 1) {
+ EnBigslime_SetTargetVtxToInverseCone(this);
+ } else {
+ EnBigslime_SetTargetVtxToStaticVtx(this);
+ }
+ }
+}
+
+/**
+ * Plays the standard Gekko sound effects without reverb
+ */
+void EnBigslime_GekkoSfxOutsideBigslime(EnBigslime* this, u16 sfxId) {
+ func_8019F1C0(&this->gekkoProjectedPos, sfxId);
+}
+
+/**
+ * Adds reverb to Gekko sound effects when enclosed by bigslime
+ */
+void EnBigslime_GekkoSfxInsideBigslime(EnBigslime* this, u16 sfxId) {
+ func_8019F420(&this->gekkoProjectedPos, sfxId);
+}
+
+void EnBigslime_GekkoFreeze(EnBigslime* this) {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_FROZEN;
+ this->gekkoCollider.base.colType = COLTYPE_HIT3;
+ this->gekkoCollider.info.elemType = ELEMTYPE_UNK0;
+ this->stunTimer = 2;
+ this->unk_38C = 0.75f;
+ this->unk_390 = 1.125f;
+ this->unk_388 = 1.0f;
+ this->actor.flags &= ~0x200;
+}
+
+void EnBigslime_GekkoThaw(EnBigslime* this, GlobalContext* globalCtx) {
+ if (this->gekkoDrawEffect == GEKKO_DRAW_EFFECT_FROZEN) {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_THAW;
+ this->gekkoCollider.base.colType = COLTYPE_HIT6;
+ this->gekkoCollider.info.elemType = ELEMTYPE_UNK1;
+ this->unk_388 = 0.0f;
+ func_800BF7CC(globalCtx, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.3f, 0.2f);
+ this->actor.flags |= 0x200;
+ }
+}
+
+void EnBigslime_SetupCutsceneStartBattle(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+
+ globalCtx->envCtx.unk_C3 = 4;
+ Animation_PlayLoop(&this->skelAnime, &gGekkoLookAroundAnim);
+
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ this->bigslimeCollider[0].base.acFlags &= ~AC_ON;
+
+ Math_Vec3f_Copy(&subCam->at, &this->actor.focus.pos);
+ func_800B7298(globalCtx, &this->actor, 4);
+
+ player->actor.shape.rot.y = this->actor.yawTowardsPlayer + 0x8000;
+ player->actor.world.pos.x = Math_SinS(this->actor.yawTowardsPlayer) * 347.0f + this->actor.world.pos.x;
+ player->actor.world.pos.z = Math_CosS(this->actor.yawTowardsPlayer) * 347.0f + this->actor.world.pos.z;
+
+ EnBigslime_UpdateCameraIntroCs(this, globalCtx, 25);
+
+ this->gekkoRot.y = this->actor.yawTowardsPlayer + 0x8000;
+ this->isInitJump = false;
+ this->actionFunc = EnBigslime_CutsceneStartBattle;
+}
+
+void EnBigslime_CutsceneStartBattle(EnBigslime* this, GlobalContext* globalCtx) {
+ if (this->isAnimUpdate) {
+ EnBigslime_SetupCutsceneNoticePlayer(this);
+ } else if (!this->isInitJump && Math_ScaledStepToS(&this->gekkoRot.y, this->actor.yawTowardsPlayer, 0x200)) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoSurpriseJumpAnim);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP);
+ this->isInitJump = true;
+ }
+}
+
+void EnBigslime_SetupCutsceneNoticePlayer(EnBigslime* this) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoNervousIdleAnim);
+ this->noticeTimer = 25;
+ this->actionFunc = EnBigslime_CutsceneNoticePlayer;
+}
+
+void EnBigslime_CutsceneNoticePlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ if (this->noticeTimer != 0) {
+ this->noticeTimer--;
+ }
+
+ EnBigslime_UpdateCameraIntroCs(this, globalCtx, this->noticeTimer);
+ if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 4.0f)) {
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EV_WALK_WATER);
+ }
+
+ if (this->noticeTimer == 0) {
+ EnBigslime_SetupCallMinislime(this, globalCtx);
+ }
+}
+
+void EnBigslime_SetupCallMinislime(EnBigslime* this, GlobalContext* globalCtx) {
+ Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoCallAnim, 5.0f);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_GREET);
+ this->callTimer = 0;
+ func_800B7298(globalCtx, &this->actor, 7);
+ this->actionFunc = EnBigslime_CallMinislime;
+}
+
+void EnBigslime_CallMinislime(EnBigslime* this, GlobalContext* globalCtx) {
+ if (this->callTimer > 0) {
+ this->callTimer--;
+ if (Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 4.0f)) {
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EV_WALK_WATER);
+ }
+
+ if (this->callTimer == 0) {
+ EnBigslime_EndCutscene(this, globalCtx);
+ this->formBigslimeTimer = 2;
+ this->actor.flags |= 1;
+ EnBigslime_SetupIdleNoticePlayer(this);
+ }
+ } else if (this->isAnimUpdate) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoNervousIdleAnim);
+ EnBigslime_UpdateCameraIntroCs(this, globalCtx, 25);
+ func_801A2E54(0x38);
+ EnBigslime_InitFallMinislime(this);
+ globalCtx->envCtx.unk_C3 = 0xFF;
+ this->callTimer = 35;
+ func_800B7298(globalCtx, &this->actor, 4);
+ }
+}
+
+void EnBigslime_SetupMoveOnCeiling(EnBigslime* this) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoSwimForwardAnim);
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 20.0f;
+
+ if (this->subCamId != MAIN_CAM) {
+ this->actor.speedXZ = 0.0f;
+ this->ceilingMoveTimer = 20;
+ } else {
+ this->ceilingMoveTimer = 320;
+ this->actor.speedXZ = 5.0f;
+ }
+
+ this->wavySurfaceTimer = 0;
+ this->bigslimeCollider[0].base.acFlags |= AC_ON;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->actor.flags &= ~0x200;
+ this->actionFunc = EnBigslime_MoveOnCeiling;
+}
+
+void EnBigslime_MoveOnCeiling(EnBigslime* this, GlobalContext* globalCtx) {
+ s16 pitch; // polar (zenith) angle
+
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ this->ceilingMoveTimer--;
+ pitch = this->ceilingMoveTimer * 0x800;
+ EnBigslime_Scale(this, pitch, 0.04f, 0.04f);
+ EnBigslime_UpdateWavySurface(this);
+
+ if (this->subCamId != MAIN_CAM) {
+ if (this->ceilingMoveTimer == 0) {
+ EnBigslime_EndCutscene(this, globalCtx);
+ this->ceilingMoveTimer = 320;
+ }
+ } else if ((this->actor.xzDistToPlayer < 250.0f) || (this->ceilingMoveTimer == 0)) {
+ EnBigslime_SetupDrop(this);
+ } else {
+ this->actor.speedXZ = (fabsf(Math_SinS(pitch)) * 3.0f) + 5.0f;
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 10, 0x800, 0x80);
+ this->gekkoRot.y = this->actor.world.rot.y;
+ }
+}
+
+void EnBigslime_SetupDrop(EnBigslime* this) {
+ this->actor.velocity.y = 0.0f;
+ this->ceilingDropTimer = 30;
+ this->actor.speedXZ = 0.0f;
+ this->actionFunc = EnBigslime_Drop;
+}
+
+void EnBigslime_Drop(EnBigslime* this, GlobalContext* globalCtx) {
+ Vtx* staticVtx;
+ Vtx* dynamicVtx;
+ s32 i;
+
+ Math_ScaledStepToS(&this->gekkoRot.x, 0x4000, 0x400);
+ if (this->ceilingDropTimer != 0) {
+ s32 requiredScopeTemp;
+
+ this->ceilingDropTimer--;
+ this->ceilingMoveTimer--;
+ EnBigslime_UpdateWavySurface(this);
+ EnBigslime_Scale(this, this->ceilingMoveTimer * 0x4000, 0.2f, 0.15);
+ this->actor.scale.z = this->actor.scale.x;
+ if (this->ceilingDropTimer == 0) {
+ this->actor.gravity = -2.0f;
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_DOWN);
+ this->rotation = 0;
+ }
+ } else if (this->actor.bgCheckFlags & 1) {
+ EnBigslime_SetupSquishFlat(this);
+ } else {
+ Math_StepToF(&this->actor.scale.x, 0.15f, 0.0025f);
+ Math_StepToF(&this->actor.scale.y, 0.080000006f, 0.0025f);
+ Math_StepToF(&this->actor.scale.z, 0.15f, 0.0025f);
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ staticVtx = &sBigslimeStaticVtx[i];
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ if (i > 145) {
+ Math_StepToS(&dynamicVtx->n.ob[1], staticVtx->n.ob[1] * 0.9f, 5);
+ } else if (i < 16) {
+ Math_StepToS(&dynamicVtx->n.ob[1], staticVtx->n.ob[1] * 1.3f, 5);
+ } else {
+ Math_StepToS(&dynamicVtx->n.ob[1], staticVtx->n.ob[1], 5);
+ }
+ Math_StepToS(&dynamicVtx->n.ob[0], staticVtx->n.ob[0], 5);
+ Math_StepToS(&dynamicVtx->n.ob[2], staticVtx->n.ob[2], 5);
+ }
+ }
+}
+
+/**
+ * Checks each individual vertex to see if it is outside the walls of the room.
+ * If it is, updates the vertex to be back inside the boundary of the room.
+ * Also raises the vertex in the y-direction 100 units in model-space for a single wall
+ * and 200 unites in the y-direction for two walls i.e a corner.
+ *
+ * Differs from EnBigslime_CheckRoomBoundaries by checking and updating
+ * individual vertices instead of checking and updating a single world position
+ */
+void EnBigslime_CheckVtxWallBoundaries(EnBigslime* this) {
+ Vtx* dynamicVtx;
+ f32 vtxX;
+ f32 vtxZ;
+ s32 collisionCounter;
+ s32 i;
+ s16 updateVtxY;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ vtxX = dynamicVtx->n.ob[0] * this->actor.scale.x;
+ vtxZ = dynamicVtx->n.ob[2] * this->actor.scale.z;
+ collisionCounter = 0;
+ if ((this->actor.world.pos.x + vtxX) > GBT_ROOM_5_MAX_X) {
+ dynamicVtx->n.ob[0] = (GBT_ROOM_5_MAX_X - this->actor.world.pos.x) / this->actor.scale.x;
+ collisionCounter++;
+ } else if ((this->actor.world.pos.x + vtxX) < GBT_ROOM_5_MIN_X) {
+ dynamicVtx->n.ob[0] = (GBT_ROOM_5_MIN_X - this->actor.world.pos.x) / this->actor.scale.x;
+ collisionCounter++;
+ }
+
+ if ((this->actor.world.pos.z + vtxZ) > GBT_ROOM_5_MAX_Z) {
+ dynamicVtx->n.ob[2] = (GBT_ROOM_5_MAX_Z - this->actor.world.pos.z) / this->actor.scale.z;
+ collisionCounter++;
+ } else if ((this->actor.world.pos.z + vtxZ) < GBT_ROOM_5_MIN_Z) {
+ dynamicVtx->n.ob[2] = (GBT_ROOM_5_MIN_Z - this->actor.world.pos.z) / this->actor.scale.z;
+ collisionCounter++;
+ }
+
+ if (dynamicVtx->n.ob[1] != -BIGSLIME_RADIUS_S) {
+ updateVtxY = collisionCounter * 100;
+ dynamicVtx->n.ob[1] += updateVtxY;
+ }
+ }
+}
+
+/**
+ * This sets the target vertices into a wide cone shape
+ *
+ * Notes:
+ * - The flat surface of the cone is in the xz-plane at y = -1000
+ * - The radius of the flat surface of the cone is 1000 units
+ * - The apex/point of the cone is at the point (0, 1000, 0)
+ * - It is wide because it is smooth and thicker near the apex than a standard cone
+ */
+void EnBigslime_SetTargetVtxToWideCone(EnBigslime* this) {
+ Vtx* staticVtx;
+ Vtx* targetVtx;
+ s16 vtxY;
+ f32 xzDist;
+ f32 xzScaleVtx;
+ s32 i;
+ 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;
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ staticVtx = &sBigslimeStaticVtx[j];
+ targetVtx = &sBigslimeTargetVtx[j];
+ xzDist = sqrtf(SQ(staticVtx->n.ob[0]) + SQ(staticVtx->n.ob[2]));
+
+ if (xzDist > 1.0f) {
+ xzScaleVtx = (BIGSLIME_RADIUS_F / (5.0f * xzDist)) * i;
+ } else {
+ xzScaleVtx = 200.0f * i; // only taken when i = 0, making 200.0f useless
+ }
+
+ targetVtx->n.ob[0] = staticVtx->n.ob[0] * xzScaleVtx;
+ targetVtx->n.ob[2] = staticVtx->n.ob[2] * xzScaleVtx;
+ targetVtx->n.ob[1] = vtxY;
+ }
+ }
+
+ 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;
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ staticVtx = &sBigslimeStaticVtx[j];
+ targetVtx = &sBigslimeTargetVtx[j];
+ xzDist = sqrtf(SQ(staticVtx->n.ob[0]) + SQ(staticVtx->n.ob[2]));
+ if (xzDist > 1.0f) {
+ xzScaleVtx = (BIGSLIME_RADIUS_F / (8.0f * xzDist)) * (14 - i);
+ } else {
+ // only taken when j = 161, but gets immediately written over (bottom vtx of the sphere)
+ xzScaleVtx = 125.0f * (14 - i);
+ }
+
+ targetVtx->n.ob[0] = staticVtx->n.ob[0] * xzScaleVtx;
+ targetVtx->n.ob[2] = staticVtx->n.ob[2] * xzScaleVtx;
+ targetVtx->n.ob[1] = vtxY;
+ }
+ }
+
+ // Bottom vtx of the sphere
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[0] = 0;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[2] = 0;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[1] = -BIGSLIME_RADIUS_S;
+}
+
+void EnBigslime_SetupSquishFlat(EnBigslime* this) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_JUMP2);
+ this->squishFlatTimer = 20;
+ this->actor.scale.x = 0.2f;
+ this->actor.scale.z = 0.2f;
+ this->actor.scale.y = 0.05f;
+ this->actor.world.pos.y = GBT_ROOM_5_MIN_Y + 50.0f;
+ EnBigslime_SetTargetVtxToWideCone(this);
+ EnBigslime_CheckVtxWallBoundaries(this);
+ this->bigslimeCollider[0].base.atFlags |= AT_ON;
+ this->actionFunc = EnBigslime_SquishFlat;
+}
+
+/**
+ * Squishes flat like a pancake to try and grab player
+ *
+ * Notes:
+ * - The vtx shape of Fused Jelly starts from a wide cone shape
+ * - The squishing occurs throught the large changes in &this->actor.scale
+ */
+void EnBigslime_SquishFlat(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player;
+ Vtx* dynamicVtx;
+ Vtx* targetVtx;
+ s32 i;
+
+ this->squishFlatTimer--;
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ Math_SmoothStepToF(&this->actor.scale.x, 0.35f, 0.4f, 0.035f, 0.0034999999f);
+ Math_SmoothStepToF(&this->actor.scale.y, 0.030000001f, 0.4f, 0.0030000003f, 0.0003f);
+ this->actor.scale.z = this->actor.scale.x;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ targetVtx = &sBigslimeTargetVtx[i];
+ Math_SmoothStepToS(&dynamicVtx->n.ob[0], targetVtx->n.ob[0], 5, 40, 5);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[2], targetVtx->n.ob[2], 5, 40, 5);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[1], targetVtx->n.ob[1], 2, 600, 3);
+ }
+
+ EnBigslime_CheckVtxWallBoundaries(this);
+
+ // Checks if any collider is interacting with player. If so, player is grabbed
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ if (this->bigslimeCollider[i].base.atFlags & AT_HIT) {
+ break;
+ }
+ }
+
+ if (i != BIGSLIME_NUM_RING_FACES) {
+ player = GET_PLAYER(globalCtx);
+ if (globalCtx->grabPlayer(globalCtx, player)) {
+ player->actor.parent = &this->actor;
+ EnBigslime_SetupCutscene(this);
+ return;
+ }
+ }
+
+ if (this->squishFlatTimer == 0) {
+ EnBigslime_SetupRise(this);
+ }
+}
+
+/**
+ * This sets the target vertices into a thin cone shape
+ *
+ * Notes:
+ * - The flat surface of the cone is in the xz-plane at y = -1000
+ * - The radius of the flat surface of the cone is 1000 units
+ * - The apex/point of the cone is at the point (0, 1000, 0)
+ * - It is thin because it is smooth and thinner near the apex than a standard cone
+ */
+void EnBigslime_SetTargetVtxToThinCone(EnBigslime* this) {
+ Vtx* targetVtx;
+ Vtx* staticVtx;
+ f32 xzDistVtx;
+ f32 xzScaleVtx;
+ s32 i;
+ s32 j;
+ s16 upperSphereCos;
+ f32 lowerSphereCos;
+ s32 targetVtxY;
+
+ // Top vtx of the sphere
+ sBigslimeTargetVtx[0].n.ob[1] = BIGSLIME_RADIUS_S;
+ sBigslimeTargetVtx[0].n.ob[0] = 0;
+ 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;
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ staticVtx = &sBigslimeStaticVtx[j];
+ targetVtx = &sBigslimeTargetVtx[j];
+ xzDistVtx = sqrtf(SQ(staticVtx->n.ob[0]) + SQ(staticVtx->n.ob[2]));
+ xzDistVtx = (BIGSLIME_RADIUS_F / (5.0f * xzDistVtx)) * i;
+ // xzDistVtx is always less than 500.0f
+ xzScaleVtx =
+ xzDistVtx < 500.0f ? xzDistVtx * 0.75f : BIGSLIME_RADIUS_F - ((BIGSLIME_RADIUS_F - xzDistVtx) * 0.75f);
+
+ targetVtx->n.ob[0] = staticVtx->n.ob[0] * xzScaleVtx;
+ targetVtx->n.ob[2] = staticVtx->n.ob[2] * xzScaleVtx;
+ targetVtx->n.ob[1] = upperSphereCos;
+ }
+ }
+
+ for (; i < BIGSLIME_NUM_RING_FACES; i++) {
+ lowerSphereCos = cos_rad((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];
+ targetVtx->n.ob[0] = staticVtx->n.ob[0];
+ targetVtx->n.ob[2] = staticVtx->n.ob[2];
+ targetVtxY = (s16)(((lowerSphereCos * 0.05f) + -1.0f) * BIGSLIME_RADIUS_F);
+ targetVtx->n.ob[1] = targetVtxY;
+ }
+ }
+
+ // Bottom vtx of the sphere
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[1] = -BIGSLIME_RADIUS_S;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[0] = 0;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[2] = 0;
+}
+
+/**
+ * This sets the target vertices into a thin inverse cone shape
+ *
+ * Notes:
+ * - The flat surface of the cone is in the xz-plane at y = +1000
+ * - The radius of the flat surface of the cone is 1000 units
+ * - The apex/point of the cone is at the point (0, -1000, 0)
+ * - It is thin because it is smooth and thinner near the apex than a standard cone
+ */
+void EnBigslime_SetTargetVtxToInverseCone(EnBigslime* this) {
+ Vtx* targetVtx;
+ Vtx* staticVtx;
+ f32 xzDistVtx;
+ f32 upperSphereCos;
+ s16 lowerSphereCos;
+ f32 xzScaleVtx;
+ s32 i;
+ s32 j;
+ s32 vtxY;
+
+ // Top vtx of the sphere
+ sBigslimeTargetVtx[0].n.ob[1] = BIGSLIME_RADIUS_S;
+ sBigslimeTargetVtx[0].n.ob[0] = 0;
+ sBigslimeTargetVtx[0].n.ob[2] = 0;
+
+ for (i = 1; i < BIGSLIME_NUM_RING_FACES / 2; i++) {
+ upperSphereCos = cos_rad((i - 1) * (M_PI / 10));
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ staticVtx = &sBigslimeStaticVtx[j];
+ targetVtx = &sBigslimeTargetVtx[j];
+ targetVtx->n.ob[0] = staticVtx->n.ob[0];
+ targetVtx->n.ob[2] = staticVtx->n.ob[2];
+ vtxY = (s16)(((upperSphereCos * 0.1f) + 0.9f) * BIGSLIME_RADIUS_F);
+ targetVtx->n.ob[1] = vtxY;
+ }
+ }
+
+ 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;
+ for (j = sVtxRingStartIndex[i]; j < sVtxRingStartIndex[i + 1]; j++) {
+ staticVtx = &sBigslimeStaticVtx[j];
+ targetVtx = &sBigslimeTargetVtx[j];
+ xzDistVtx = sqrtf(SQ(staticVtx->n.ob[0]) + SQ(staticVtx->n.ob[2]));
+ xzDistVtx = (BIGSLIME_RADIUS_F / (6.0f * xzDistVtx)) * (BIGSLIME_NUM_RING_FACES - i);
+ // xzDistVtx is always less than 500.0f
+ xzScaleVtx =
+ xzDistVtx < 500.0f ? xzDistVtx * 0.75f : BIGSLIME_RADIUS_F - ((BIGSLIME_RADIUS_F - xzDistVtx) * 0.75f);
+
+ targetVtx->n.ob[0] = staticVtx->n.ob[0] * xzScaleVtx;
+ targetVtx->n.ob[2] = staticVtx->n.ob[2] * xzScaleVtx;
+ targetVtx->n.ob[1] = lowerSphereCos;
+ }
+ }
+
+ // Bottom vtx of the sphere
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[1] = -BIGSLIME_RADIUS_S;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[0] = 0;
+ sBigslimeTargetVtx[BIGSLIME_NUM_VTX - 1].n.ob[2] = 0;
+}
+
+void EnBigslime_SetTargetVtxToStaticVtx(EnBigslime* this) {
+ s32 i;
+ Vtx* staticVtx;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ staticVtx = &sBigslimeStaticVtx[i];
+ sBigslimeTargetVtx[i].n.ob[0] = staticVtx->n.ob[0];
+ sBigslimeTargetVtx[i].n.ob[2] = staticVtx->n.ob[2];
+ sBigslimeTargetVtx[i].n.ob[1] = staticVtx->n.ob[1];
+ }
+}
+
+void EnBigslime_SetupRise(EnBigslime* this) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoSwimForwardAnim);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP_ABOVE);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_UTSUBO_APPEAR_TRG);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_JUMP1);
+ this->riseCounter = 0;
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ EnBigslime_SetTargetVtxToThinCone(this);
+ this->actor.world.rot.y = this->gekkoRot.y;
+ this->actionFunc = EnBigslime_Rise;
+}
+
+/**
+ * Moves Fused Jelly from a squish pancake on the floor to the ceiling
+ *
+ * Notes:
+ * - When riseCounter == 0, Fused Jelly is un-squishing into a thin cone shape
+ * - When riseCounter == 1, Fused Jelly is deforming into an inverse thin cone shape
+ * - When riseCounter == 2 to 9, Fused Jelly is returning to its default spherical shape
+ * - When riseCounter == 10, Fused Jelly starts moving on the ceiling
+ */
+void EnBigslime_Rise(EnBigslime* this, GlobalContext* globalCtx) {
+ Vtx* dynamicVtx;
+ Vtx* targetVtx;
+ s32 i;
+
+ if (this->riseCounter < 2) {
+ Math_SmoothStepToF(&this->actor.scale.x, 0.13f, 0.2f, 0.039f, 0.0038999997f);
+ Math_ScaledStepToS(&this->gekkoRot.x, -0x4000, 0x400);
+ } else {
+ Math_SmoothStepToF(&this->actor.scale.x, 0.15f, 0.4f, 0.015000001f, 0.0015f);
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ }
+
+ this->actor.scale.z = this->actor.scale.x;
+ EnBigslime_CheckVtxWallBoundaries(this);
+ if (this->riseCounter == 0) {
+ if (Math_SmoothStepToF(&this->actor.scale.y, 0.3f, 0.5f, 0.015000001f, 0.00075f) < 0.01f) {
+ this->riseCounter = 1;
+ EnBigslime_SetTargetVtxToInverseCone(this);
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ targetVtx = &sBigslimeTargetVtx[i];
+ Math_SmoothStepToS(&dynamicVtx->n.ob[1], targetVtx->n.ob[1], 5, 550, 3);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[0], targetVtx->n.ob[0], 5, 40, 5);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[2], targetVtx->n.ob[2], 5, 40, 5);
+ }
+
+ } else if (this->riseCounter == 1) {
+ if (Math_SmoothStepToF(&this->actor.scale.y, 0.075f, 0.4f, 0.0075000003f, 0.00075f) < 0.01f) {
+ EnBigslime_SetTargetVtxToStaticVtx(this);
+ this->riseCounter++;
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ targetVtx = &sBigslimeTargetVtx[i];
+ Math_SmoothStepToS(&dynamicVtx->n.ob[1], targetVtx->n.ob[1], 5, 50, 3);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[0], targetVtx->n.ob[0], 5, 40, 5);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[2], targetVtx->n.ob[2], 5, 40, 5);
+ }
+
+ this->actor.world.pos.y = GBT_ROOM_5_MAX_Y - (this->actor.scale.y * BIGSLIME_RADIUS_F);
+ } else if (this->riseCounter == 10) {
+ EnBigslime_SetupMoveOnCeiling(this);
+ } else {
+ this->riseCounter++;
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ targetVtx = &sBigslimeTargetVtx[i];
+ Math_SmoothStepToS(&dynamicVtx->n.ob[1], targetVtx->n.ob[1], 5, 550, 3);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[0], targetVtx->n.ob[0], 5, 40, 5);
+ Math_SmoothStepToS(&dynamicVtx->n.ob[2], targetVtx->n.ob[2], 5, 40, 5);
+ }
+ }
+
+ EnBigslime_CheckVtxWallBoundaries(this);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 10, 0x800, 0x80);
+}
+
+void EnBigslime_SetupCutsceneGrabPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* mainCam = Play_GetCamera(globalCtx, MAIN_CAM);
+ s16 yaw;
+
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &mainCam->at, &mainCam->eye);
+ this->grabPlayerTimer = 15;
+ this->wavySurfaceTimer = 0;
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yaw = func_800DFCDC(GET_ACTIVE_CAM(globalCtx)) - this->actor.world.rot.y;
+
+ if (yaw > 0x4000) {
+ this->subCamYawGrabPlayer = -0x2000;
+ } else if (yaw > 0) {
+ this->subCamYawGrabPlayer = -0x6000;
+ } else if (yaw < -0x4000) {
+ this->subCamYawGrabPlayer = 0x2000;
+ } else {
+ this->subCamYawGrabPlayer = 0x6000;
+ }
+
+ this->subCamYawGrabPlayer += this->actor.world.rot.y;
+ Animation_PlayLoop(&this->skelAnime, &gGekkoBoxingStanceAnim);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_EAT);
+ this->actionFunc = EnBigslime_CutsceneGrabPlayer;
+}
+
+void EnBigslime_CutsceneGrabPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ f32 invgrabPlayerTimer;
+ f32 magPosXZOffset;
+ Vtx* dynamicVtx;
+ s32 i;
+ s32 j;
+
+ player->unk_AE8 = 0;
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ EnBigslime_UpdateCameraGrabPlayer(this, globalCtx);
+ if (this->grabPlayerTimer > 0) {
+ invgrabPlayerTimer = 1.0f / this->grabPlayerTimer;
+
+ this->actor.scale.x = F32_LERPIMP(this->actor.scale.x, 0.15f, invgrabPlayerTimer);
+ this->actor.scale.y = F32_LERPIMP(this->actor.scale.y, 0.075f, invgrabPlayerTimer);
+ this->actor.scale.z = this->actor.scale.x;
+
+ player->actor.world.pos.x = F32_LERPIMP(player->actor.world.pos.x, this->actor.world.pos.x, invgrabPlayerTimer);
+ player->actor.world.pos.z = F32_LERPIMP(player->actor.world.pos.z, this->actor.world.pos.z, invgrabPlayerTimer);
+ player->actor.world.pos.y = F32_LERPIMP(
+ player->actor.world.pos.y, this->actor.world.pos.y + this->actor.scale.y * -500.0f, invgrabPlayerTimer);
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+
+ // loop over x, y, z
+ for (j = 0; j < 3; j++) {
+ // Linearly interpolate dynamicVtx --> staticVtx
+ dynamicVtx->n.ob[j] +=
+ (s16)((sBigslimeStaticVtx[i].n.ob[j] - dynamicVtx->n.ob[j]) * invgrabPlayerTimer);
+ }
+ }
+
+ invgrabPlayerTimer = (15 - this->grabPlayerTimer) / 15.0f;
+ magPosXZOffset = invgrabPlayerTimer * -50.0f;
+ this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * magPosXZOffset;
+ this->gekkoPosOffset.y = invgrabPlayerTimer * -40.0f;
+ this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * magPosXZOffset;
+ this->grabPlayerTimer--;
+ if (this->grabPlayerTimer == 0) {
+ EnBigslime_SetupAttackPlayerInBigslime(this);
+ }
+ }
+}
+
+void EnBigslime_SetupAttackPlayerInBigslime(EnBigslime* this) {
+ Animation_PlayOnce(&this->skelAnime, sGekkoAttackAnimations[(s32)Rand_ZeroFloat(3.0f) % 3]);
+ this->numGekkoMeleeAttacks = (s32)Rand_ZeroFloat(3.0f) + 1;
+ this->numGekkoPosGrabPlayer = 6;
+ this->actionFunc = EnBigslime_AttackPlayerInBigslime;
+}
+
+void EnBigslime_AttackPlayerInBigslime(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ s16 pitch = this->scaleFactor * 0x3333; // polar (zenith) angle
+
+ player->unk_AE8 = 0;
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ EnBigslime_UpdateCameraGrabPlayer(this, globalCtx);
+ EnBigslime_UpdateWavySurface(this);
+
+ if (this->scaleFactor != 0) {
+ this->scaleFactor--;
+ }
+
+ // Checks to see if it's the frame of impact
+ if (((this->skelAnime.animation == &gGekkoJabPunchAnim) &&
+ Animation_OnFrame(&this->skelAnime, 2.0f)) || // Jab punch makes impact on frame 2 of animation
+ ((this->skelAnime.animation == &gGekkoHookPunchAnim) &&
+ Animation_OnFrame(&this->skelAnime, 9.0f)) || // Hook Punch makes impact on frames 9 of animation
+ ((this->skelAnime.animation == &gGekkoKickAnim) &&
+ Animation_OnFrame(&this->skelAnime, 2.0f))) { // Kick makes impact on frame 2 of animation
+ this->scaleFactor = 10;
+ player->actor.world.pos.x += 20.0f * Math_SinS(this->gekkoRot.y);
+ player->actor.world.pos.z += 20.0f * Math_CosS(this->gekkoRot.y);
+ EnBigslime_JerkCameraPlayerHit(this, globalCtx);
+ if (this->skelAnime.animation == &gGekkoKickAnim) {
+ EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_KICK);
+ } else {
+ EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_PUNCH1);
+ }
+ } else {
+ Math_StepToF(&player->actor.world.pos.x, this->actor.world.pos.x, 4.0f);
+ Math_StepToF(&player->actor.world.pos.z, this->actor.world.pos.z, 4.0f);
+ }
+
+ EnBigslime_Scale(this, pitch, ((this->scaleFactor * 0.08f) + 0.2f) * 0.15f,
+ ((this->scaleFactor * 0.08f) + 0.2f) * 0.05f);
+ player->actor.world.pos.y = this->actor.world.pos.y + (this->actor.scale.y * -500.0f);
+ if (this->isAnimUpdate) {
+ this->numGekkoMeleeAttacks--;
+ if (this->numGekkoMeleeAttacks == 0) {
+ this->numGekkoPosGrabPlayer--;
+
+ if ((gSaveContext.health < 5) || (this->numGekkoPosGrabPlayer == 0)) {
+ this->numGekkoPosGrabPlayer = 0;
+ this->gekkoRot.y = this->actor.world.rot.y;
+ this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * -50.0f;
+ this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * -50.0f;
+ EnBigslime_SetupWindupThrowPlayer(this);
+ return;
+ }
+
+ globalCtx->damagePlayer(globalCtx, -4);
+ func_800B8E58(&player->actor, player->ageProperties->unk_92 + 0x6805);
+ this->gekkoRot.y += (s16)(Rand_S16Offset(0x4000, 0x4000) * (Rand_ZeroOne() < 0.5f ? -1 : 1));
+ this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * -50.0f;
+ this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * -50.0f;
+ this->numGekkoMeleeAttacks = (s32)Rand_ZeroFloat(3.0f) + 1;
+ }
+ Animation_PlayOnce(&this->skelAnime, sGekkoAttackAnimations[((s32)Rand_ZeroFloat(3.0f) % 3)]);
+ }
+
+ func_800B9010(&this->actor, NA_SE_EN_B_SLIME_PUNCH_MOVE - SFX_FLAG);
+}
+
+/**
+ * Calculates the surface perturbation (multiplicative offset from the static vertices)
+ * used to update dynamic vertices when bigslime is about to throw/eject player from inside
+ * at the end of the grab-player cutscene
+ *
+ * A unit normal vector (unitVec) is used to represent the direction player will be thrown.
+ * This unit vector has the following spherical coordinates:
+ * - radius = 1
+ * - yaw (azimuthal angle) = this->actor.world.rot.y
+ * - pitch (polar/zenith angle) = M_PI / 4
+ *
+ * This unit normal vector is converted into x-y-z coordinates and dot-producted with
+ * the model coordinates of each individual vertex. The surface perturbation is then
+ * set to be linearly proportional to this dot product
+ *
+ * This leads to the bending shape observed during windup as player is about being thrown out of bigslime
+ */
+void EnBigslime_SetupWindupThrowPlayer(EnBigslime* this) {
+ Vtx* dynamicVtx;
+ f32 dotXYZ;
+ f32 unitVecX = Math_SinS(this->actor.world.rot.y) * M_SQRT1_2;
+ f32 unitVecZ = Math_CosS(this->actor.world.rot.y) * M_SQRT1_2;
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+
+ // vector dot product between each dynamicVtx and the unit normal vector describing player's thrown direction
+ dotXYZ = (dynamicVtx->n.ob[0] * unitVecX + dynamicVtx->n.ob[1] * M_SQRT1_2 + dynamicVtx->n.ob[2] * unitVecZ) *
+ 0.001f;
+ if (dotXYZ < 0.01f) {
+ this->vtxSurfacePerturbation[i] = 0.0f;
+ } else {
+ this->vtxSurfacePerturbation[i] = dotXYZ * 0.5f;
+ }
+ }
+
+ this->windupPunchTimer = 27;
+ Animation_PlayOnce(&this->skelAnime, &gGekkoWindupPunchAnim);
+ EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_PUNCH2);
+ this->actionFunc = EnBigslime_WindupThrowPlayer;
+}
+
+void EnBigslime_WindupThrowPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ f32 scale;
+ f32 invWindupPunchTimer;
+ Vtx* dynamicVtx;
+ Vtx* staticVtx;
+ s32 i;
+ s32 j;
+
+ this->windupPunchTimer--;
+ EnBigslime_UpdateCameraGrabPlayer(this, globalCtx);
+ if (this->windupPunchTimer > 0) {
+ invWindupPunchTimer = 1.0f / this->windupPunchTimer;
+ scale = cos_rad(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
+ this->gekkoRot.y += (s16)((s16)(this->actor.world.rot.y - this->gekkoRot.y) * invWindupPunchTimer);
+ this->gekkoPosOffset.x = Math_SinS(this->gekkoRot.y) * -50.0f;
+ this->gekkoPosOffset.z = Math_CosS(this->gekkoRot.y) * -50.0f;
+ } else {
+ if (this->windupPunchTimer == 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_REVERSE);
+ EnBigslime_GekkoSfxInsideBigslime(this, NA_SE_EN_FROG_PUNCH1);
+ }
+
+ scale = 0.5f - cos_rad(-this->windupPunchTimer * (M_PI / 5)) * 0.5f;
+ if (this->windupPunchTimer == -5) {
+ if (player->stateFlags2 & 0x80) {
+ player->actor.parent = NULL;
+ player->unk_AE8 = 100;
+ }
+
+ player->actor.velocity.y = 0.0f;
+ func_800B8D50(globalCtx, &this->actor, 10.0f, this->actor.world.rot.y, 10.0f, 4);
+ EnBigslime_SetupSetDynamicVtxThrowPlayer(this, globalCtx);
+ }
+
+ player->actor.world.pos.x =
+ (Math_SinS(this->actor.world.rot.y) * (1060.5f * this->actor.scale.x) * scale) + this->actor.world.pos.x;
+ player->actor.world.pos.z =
+ (Math_CosS(this->actor.world.rot.y) * (1060.5f * this->actor.scale.z) * scale) + this->actor.world.pos.z;
+ player->actor.world.pos.y =
+ this->actor.world.pos.y + (this->actor.scale.y * -500.0f) + (1060.5f * this->actor.scale.y * scale);
+ invWindupPunchTimer = 1.0f / (this->windupPunchTimer + 6);
+ // this->gekkoPosOffset *= (1 - invWindupPunchTimer)
+ this->gekkoPosOffset.x -= this->gekkoPosOffset.x * invWindupPunchTimer;
+ this->gekkoPosOffset.y -= this->gekkoPosOffset.y * invWindupPunchTimer;
+ this->gekkoPosOffset.z -= this->gekkoPosOffset.z * invWindupPunchTimer;
+ scale = 2.0f - (3.0f * scale);
+ }
+
+ // Deforming Bigslime during the final windup punch while grabbing player using vtxSurfacePerturbation
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ staticVtx = &sBigslimeStaticVtx[i];
+ if (this->vtxSurfacePerturbation[i] != 0.0f) {
+ if (this->windupPunchTimer > 0) {
+ // loop over x, y, z
+ for (j = 0; j < 3; j++) {
+ // Linearly interpolate dynamicVtx --> staticVtx * (1 - scale * vtxSurfacePerturbation)
+ dynamicVtx->n.ob[j] += (s16)(
+ ((staticVtx->n.ob[j] - (s32)(scale * staticVtx->n.ob[j] * this->vtxSurfacePerturbation[i])) -
+ dynamicVtx->n.ob[j]) *
+ invWindupPunchTimer);
+ }
+ } else {
+ // loop over x, y, z
+ for (j = 0; j < 3; j++) {
+ // Directly set dynamicVtx --> staticVtx * (1 - scale * vtxSurfacePerturbation)
+ dynamicVtx->n.ob[j] =
+ staticVtx->n.ob[j] - (s32)((scale * staticVtx->n.ob[j]) * this->vtxSurfacePerturbation[i]);
+ }
+ }
+ } else {
+ if (this->windupPunchTimer > 0) {
+ // loop over x, y, z
+ for (j = 0; j < 3; j++) {
+ // Linearly interpolate dynamicVtx --> staticVtx
+ dynamicVtx->n.ob[j] += (s16)((staticVtx->n.ob[j] - dynamicVtx->n.ob[j]) * invWindupPunchTimer);
+ }
+ }
+ }
+ }
+}
+
+void EnBigslime_SetupSetDynamicVtxThrowPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ this->grabPlayerTimer = 10;
+ EnBigslime_SetTargetVtxToWideCone(this);
+ EnBigslime_CheckVtxWallBoundaries(this);
+ EnBigslime_EndCutscene(this, globalCtx);
+ this->actionFunc = EnBigslime_SetDynamicVtxThrowPlayer;
+}
+
+/**
+ * Restores bigslime to wide cone after player is thrown
+ */
+void EnBigslime_SetDynamicVtxThrowPlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ f32 invThrowPlayerTimer;
+ Vtx* targetVtx;
+ Vtx* dynamicVtx;
+ s32 i;
+ s32 j;
+
+ this->throwPlayerTimer--;
+ if (this->throwPlayerTimer > 0) {
+ invThrowPlayerTimer = 1.0f / this->throwPlayerTimer;
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ targetVtx = &sBigslimeTargetVtx[i];
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+
+ // loop over x, y, z
+ for (j = 0; j < 3; j++) {
+ // Linearly interpolate dynamicVtx --> targetVtx
+ dynamicVtx->n.ob[j] += (s16)((targetVtx->n.ob[j] - dynamicVtx->n.ob[j]) * invThrowPlayerTimer);
+ }
+ }
+
+ this->actor.scale.x = F32_LERPIMP(this->actor.scale.x, 0.2f, invThrowPlayerTimer);
+ this->actor.scale.y = F32_LERPIMP(this->actor.scale.y, 0.05f, invThrowPlayerTimer);
+ this->actor.scale.z = this->actor.scale.x;
+ EnBigslime_CheckVtxWallBoundaries(this);
+ }
+
+ if (this->throwPlayerTimer == 0) {
+ EnBigslime_SetupRise(this);
+ }
+}
+
+/**
+ * Sets the frozen effect as a seed on the bottom 4 nodes of a sphere
+ * The frozen effect is initially set to be dimmer the farther from the initial seed you are
+ */
+void EnBigslime_SetupFreeze(EnBigslime* this) {
+ Vtx* targetVtx;
+ Vtx* dynamicVtx;
+ s32 i;
+ s32 j;
+
+ this->actor.speedXZ = 0.0f;
+ this->freezeTimer = 40;
+ if (this->actor.bgCheckFlags & 1) {
+ this->actor.velocity.y = 0.0f;
+ this->actor.gravity = 0.0f;
+ } else if ((this->actionFunc == EnBigslime_Rise) && (this->riseCounter < 2)) {
+ this->actor.gravity = -2.0f;
+ }
+
+ this->bigslimeCollider[0].base.atFlags &= ~AT_ON;
+ this->bigslimeCollider[0].base.acFlags &= ~AC_ON;
+
+ // Resets frozen effect alpha to 0
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][i];
+ targetVtx = &sBigslimeTargetVtx[i];
+ for (j = 0; j < 3; j++) {
+ targetVtx->n.ob[j] = dynamicVtx->n.ob[j];
+ }
+ targetVtx->n.a = 0;
+ }
+
+ // Initalizes frozen effect alpha near bottom of sphere by increasing levels of alpha
+ for (i = 0; i < 20; i++) {
+ sBigslimeTargetVtx[i + 138].n.a = 10 * i;
+ }
+
+ // Initalizes/seeds frozen effect alpha in bottom 4 nodes in vtx sphere to highest level of alpha
+ for (i = 0; i < 4; i++) {
+ sBigslimeTargetVtx[i + 158].n.a = 200;
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.ocFlags1 &= ~OC1_NO_PUSH;
+ }
+
+ this->actionFuncStored = this->actionFunc;
+ this->actionFunc = EnBigslime_Freeze;
+}
+
+/**
+ * Propogates the frozen effect from the seed at the bottom out through all vertices
+ */
+void EnBigslime_Freeze(EnBigslime* this, GlobalContext* globalCtx) {
+ f32 randFloat;
+ Vtx* targetVtx;
+ Vtx* dynamicVtx;
+ s32 vtxIceUpdate;
+ s32 vtxIceSeed;
+ s32 j;
+
+ if (this->freezeTimer) {
+ this->freezeTimer--;
+ }
+
+ this->skelAnime.playSpeed = this->freezeTimer / 40.0f;
+ vtxIceSeed = this->freezeTimer * 4;
+ for (vtxIceUpdate = 0; vtxIceUpdate < 4; vtxIceUpdate++, vtxIceSeed++) {
+ if (vtxIceSeed < BIGSLIME_NUM_VTX) {
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][vtxIceSeed];
+ targetVtx = &sBigslimeTargetVtx[vtxIceSeed];
+ randFloat = randPlusMinusPoint5Scaled(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);
+ if (((dynamicVtx->n.ob[1] * this->actor.scale.y) + this->actor.world.pos.y) < GBT_ROOM_5_MIN_Y) {
+ dynamicVtx->n.ob[1] = ((GBT_ROOM_5_MIN_Y - this->actor.world.pos.y) / this->actor.scale.y) - 1.0f;
+ }
+
+ for (j = 0; j < 3; j++) {
+ targetVtx->n.ob[j] = dynamicVtx->n.ob[j];
+ }
+ }
+ }
+
+ for (vtxIceUpdate = 4; vtxIceUpdate < BIGSLIME_NUM_VTX; vtxIceUpdate++) {
+ sBigslimeTargetVtx[vtxIceUpdate - 4].n.a = sBigslimeTargetVtx[vtxIceUpdate].n.a;
+ }
+
+ func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ if (this->actor.bgCheckFlags & 2) {
+ if (this->freezeTimer == 0) {
+ EnBigslime_BreakIntoMinislime(this, globalCtx);
+ } else {
+ this->bigslimeCollider[0].base.acFlags |= AC_ON;
+ EnBigslime_AddIceShardEffect(this, globalCtx);
+ EnBigslime_SetupSquishFlat(this);
+ }
+ } else if (this->freezeTimer == 0) {
+ if (!(this->actor.bgCheckFlags & 1)) {
+ EnBigslime_SetupFrozenFall(this);
+ } else {
+ EnBigslime_SetupFrozenGround(this);
+ }
+ }
+}
+
+void EnBigslime_SetupFrozenGround(EnBigslime* this) {
+ this->freezeTimer = 80;
+ this->bigslimeCollider[0].base.acFlags |= AC_ON;
+ this->actionFunc = EnBigslime_FrozenGround;
+}
+
+void EnBigslime_FrozenGround(EnBigslime* this, GlobalContext* globalCtx) {
+ f32 invFreezerTimer;
+ s32 randSign;
+ f32 randFloat;
+
+ this->freezeTimer--;
+ if (this->freezeTimer == 0) {
+ EnBigslime_AddIceShardEffect(this, globalCtx);
+ EnBigslime_SetTargetVtxFromPreFrozen(this);
+ } else if (this->freezeTimer == 40) {
+ Math_Vec3f_Copy(&this->frozenPos, &this->actor.world.pos);
+ } else if ((this->freezeTimer < 20) || ((this->freezeTimer < 40) && ((this->freezeTimer % 2) != 0))) {
+ invFreezerTimer = 1.0f / this->freezeTimer;
+
+ // clang-format off
+ randFloat = Rand_ZeroFloat(4.0f * invFreezerTimer);
+ randSign = Rand_ZeroOne() < 0.5f ? -1 : 1; \
+ this->actor.world.pos.x = randSign * (1.0f + invFreezerTimer + randFloat) + this->frozenPos.x;
+ // clang-format on
+
+ randFloat = Rand_ZeroFloat(4.0f * invFreezerTimer);
+ randSign = Rand_ZeroOne() < 0.5f ? -1 : 1;
+ this->actor.world.pos.z = randSign * (1.0f + invFreezerTimer + randFloat) + this->frozenPos.z;
+ }
+}
+
+void EnBigslime_SetupMelt(EnBigslime* this) {
+ s32 i;
+
+ this->bigslimeCollider[0].base.acFlags &= ~AC_ON;
+ for (i = 0; i < 2; i++) {
+ sBigslimeTargetVtx[i].n.a = 0;
+ }
+
+ for (i = 0; i < 20; i++) {
+ sBigslimeTargetVtx[i + 2].n.a = 10 * i;
+ }
+
+ this->meltCounter = 0;
+ this->actionFunc = EnBigslime_Melt;
+}
+
+void EnBigslime_Melt(EnBigslime* this, GlobalContext* globalCtx) {
+ static Vec3f iceSmokeVelocity = { 0.0f, 2.0f, 0.0f };
+ Vec3f iceSmokePos;
+ Vtx* targetVtx;
+ Vtx* dynamicVtx;
+ s32 i;
+
+ this->meltCounter++;
+ if ((this->meltCounter < 70) && ((this->meltCounter % 2) != 0)) {
+ dynamicVtx =
+ &sBigslimeDynamicVtx[this->dynamicVtxState][(s32)Rand_ZeroFloat(BIGSLIME_NUM_VTX) % BIGSLIME_NUM_VTX];
+ iceSmokePos.x = (dynamicVtx->n.ob[0] * this->actor.scale.x) + this->actor.world.pos.x;
+ iceSmokePos.y = (dynamicVtx->n.ob[1] * this->actor.scale.y) + this->actor.world.pos.y;
+ iceSmokePos.z = (dynamicVtx->n.ob[2] * this->actor.scale.z) + this->actor.world.pos.z;
+ EffectSsIceSmoke_Spawn(globalCtx, &iceSmokePos, &iceSmokeVelocity, &gZeroVec3f, 600);
+ }
+
+ func_800B9010(&this->actor, NA_SE_EV_ICE_MELT_LEVEL - SFX_FLAG);
+ for (i = 159; i >= 0; i--) {
+ sBigslimeTargetVtx[i + 2].n.a = sBigslimeTargetVtx[i].n.a;
+ }
+
+ if (this->meltCounter == 100) {
+ EnBigslime_SetTargetVtxFromPreFrozen(this);
+ } else if (this->meltCounter == 50) {
+ globalCtx->envCtx.unk_C3 = 0xFF;
+ }
+}
+
+void EnBigslime_SetupFrozenFall(EnBigslime* this) {
+ s32 i;
+
+ this->bigslimeCollider[0].base.atFlags |= AT_ON;
+ this->actor.gravity = -2.0f;
+ this->actor.velocity.y = 0.0f;
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.ocFlags1 |= OC1_NO_PUSH;
+ }
+
+ this->actionFunc = EnBigslime_FrozenFall;
+}
+
+void EnBigslime_FrozenFall(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ if (this->bigslimeCollider[i].base.atFlags & AT_HIT) {
+ break;
+ }
+ }
+
+ if (i != BIGSLIME_NUM_RING_FACES) {
+ func_800B8D50(globalCtx, &this->actor, 7.0f, this->actor.yawTowardsPlayer, 5.0f, 0x10);
+ }
+
+ if (this->actor.bgCheckFlags & 1) {
+ EnBigslime_BreakIntoMinislime(this, globalCtx);
+ }
+}
+
+void EnBigslime_SetupJumpGekko(EnBigslime* this) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoJumpForwardAnim);
+ this->actor.speedXZ = 8.0f;
+ this->jumpTimer = 100;
+ this->actor.world.rot.y = this->gekkoRot.y;
+ this->gekkoYaw = this->actor.yawTowardsPlayer + 0x8000;
+ this->actionFunc = EnBigslime_JumpGekko;
+}
+
+void EnBigslime_JumpGekko(EnBigslime* this, GlobalContext* globalCtx) {
+ s16 yaw;
+ s16 yawDiff;
+
+ if (this->actor.bgCheckFlags & 1) {
+ this->gekkoCollider.base.acFlags |= AC_ON;
+ this->actor.flags |= 1;
+ }
+
+ this->jumpTimer--;
+ if (Animation_OnFrame(&this->skelAnime, 1.0f)) {
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP);
+ } else if (Animation_OnFrame(&this->skelAnime, 11.0f)) {
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EV_WALK_WATER);
+ }
+
+ if (!(this->actor.bgCheckFlags & 1) || ((this->skelAnime.curFrame > 1.0f) && (this->skelAnime.curFrame < 12.0f))) {
+ this->actor.speedXZ = 8.0f;
+ } else {
+ this->actor.speedXZ = 0.0f;
+ }
+
+ if (Math_SmoothStepToS(&this->actor.world.rot.y, this->gekkoYaw, 5, 0x1000, 0x80) == 0) {
+ if (Actor_XZDistanceToPoint(&this->actor, &this->actor.home.pos) > 240.0f) {
+ yaw = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ yawDiff = yaw - (s16)(this->actor.yawTowardsPlayer + 0x8000);
+ this->gekkoYaw =
+ ABS_ALT(yawDiff) < 0x3000 ? yaw : (yawDiff / 2) + (s16)(this->actor.yawTowardsPlayer + 0x8000);
+ } else {
+ this->gekkoYaw = this->actor.yawTowardsPlayer + 0x8000;
+ }
+ }
+
+ this->gekkoRot.y = this->actor.world.rot.y;
+ if (this->jumpTimer == 0) {
+ if (this->formBigslimeTimer == 0) {
+ EnBigslime_SetupCutscene(this);
+ } else {
+ this->formBigslimeTimer--;
+ EnBigslime_SetupIdleLookAround(this);
+ }
+ } else if ((this->actor.xzDistToPlayer > 300.0f) && (this->gekkoCollider.base.ocFlags1 & OC1_HIT)) {
+ if ((this->gekkoCollider.base.oc->params == MINISLIME_IDLE) &&
+ (this->gekkoCollider.base.oc->id == ACTOR_EN_MINISLIME)) {
+ this->gekkoCollider.base.oc->params = MINISLIME_SETUP_GEKKO_THROW;
+ this->minislimeToThrow = (EnMinislime*)this->gekkoCollider.base.oc;
+ EnBigslime_SetupThrowMinislime(this);
+ }
+ }
+}
+
+void EnBigslime_SetupIdleLookAround(EnBigslime* this) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoNervousIdleAnim);
+ this->idleTimer = 60;
+ this->actor.speedXZ = 0.0f;
+ if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
+ this->gekkoYaw = this->gekkoRot.y + ((u32)Rand_Next() >> 20) + 0x2000;
+ } else {
+ this->gekkoYaw = this->gekkoRot.y - ((u32)Rand_Next() >> 20) - 0x2000;
+ }
+ this->actionFunc = EnBigslime_IdleLookAround;
+}
+
+void EnBigslime_IdleLookAround(EnBigslime* this, GlobalContext* globalCtx) {
+ s16 yawDiff;
+
+ this->idleTimer--;
+ if (this->isAnimUpdate) {
+ if (Rand_ZeroOne() < 0.25f) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoLookAroundAnim);
+ } else {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoNervousIdleAnim);
+ }
+ }
+
+ if ((this->skelAnime.animation == &gGekkoNervousIdleAnim) &&
+ Math_ScaledStepToS(&this->gekkoRot.y, this->gekkoYaw, 0x400)) {
+ if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->gekkoRot.y) > 0) {
+ this->gekkoYaw = this->gekkoRot.y + ((u32)Rand_Next() >> 20) + 0x2000;
+ } else {
+ this->gekkoYaw = this->gekkoRot.y - ((u32)Rand_Next() >> 20) - 0x2000;
+ }
+ }
+
+ yawDiff = this->actor.yawTowardsPlayer - this->gekkoRot.y;
+ if ((this->idleTimer == 0) || ((ABS_ALT(yawDiff) < 0x2800) && (this->actor.xzDistToPlayer < 240.0f))) {
+ EnBigslime_SetupIdleNoticePlayer(this);
+ }
+}
+
+void EnBigslime_SetupIdleNoticePlayer(EnBigslime* this) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoSurpriseJumpAnim);
+ this->gekkoYaw = this->gekkoRot.y + 0x8000;
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP_MID);
+ this->actionFunc = EnBigslime_IdleNoticePlayer;
+}
+
+void EnBigslime_IdleNoticePlayer(EnBigslime* this, GlobalContext* globalCtx) {
+ s16* yaw = &this->gekkoRot.y;
+
+ if (this->skelAnime.curFrame > 10.0f) {
+ Math_ScaledStepToS(yaw, this->gekkoYaw, 0x800);
+ }
+ if (this->isAnimUpdate) {
+ EnBigslime_SetupJumpGekko(this);
+ }
+}
+
+void EnBigslime_SetupThrowMinislime(EnBigslime* this) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoWindupPunchAnim);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_HOLD_SLIME);
+ this->actor.speedXZ = 0.0f;
+ this->actionFunc = EnBigslime_ThrowMinislime;
+}
+
+void EnBigslime_ThrowMinislime(EnBigslime* this, GlobalContext* globalCtx) {
+ s16 jumpTimerStored;
+
+ Math_ScaledStepToS(&this->gekkoRot.y, this->actor.yawTowardsPlayer, 0x300);
+ if (Animation_OnFrame(&this->skelAnime, 27.0f) &&
+ (this->minislimeToThrow->actor.params == MINISLIME_SETUP_GEKKO_THROW)) {
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_THROW_SLIME);
+ this->minislimeToThrow->actor.params = MINISLIME_GEKKO_THROW;
+ }
+ if (this->isAnimUpdate) {
+ jumpTimerStored = this->jumpTimer; // Stores jumpTimer so it doesn't get overwritten back to 100
+ EnBigslime_SetupJumpGekko(this);
+ this->jumpTimer = jumpTimerStored;
+ }
+}
+
+void EnBigslime_SetupDamageGekko(EnBigslime* this, s32 isNotFrozen) {
+ Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoDamagedAnim, -3.0f);
+ this->gekkoCollider.base.acFlags &= ~AC_ON;
+ this->damageSpinTimer = 20;
+ this->actor.speedXZ = 10.0f;
+ this->actor.gravity = -2.0f;
+ this->actor.velocity.y = 0.0f;
+ if (isNotFrozen) {
+ func_800BE504(&this->actor, &this->gekkoCollider);
+ }
+
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_DAMAGE);
+ if ((this->actor.flags & 0x2000) == 0x2000) {
+ this->actor.flags &= ~0x2000;
+ }
+
+ this->actionFunc = EnBigslime_DamageGekko;
+}
+
+/**
+ * Spins Gekko around as it takes damage
+ */
+void EnBigslime_DamageGekko(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 damageSpinTimer;
+
+ this->damageSpinTimer--;
+ damageSpinTimer = CLAMP_MAX(this->damageSpinTimer, 10);
+ this->gekkoRot.y += 0x300 * damageSpinTimer;
+ Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f);
+ if (this->damageSpinTimer == 0) {
+ EnBigslime_SetupCutscene(this);
+ }
+}
+
+void EnBigslime_SetupStunGekko(EnBigslime* this) {
+ if ((this->skelAnime.animation == &gGekkoJumpForwardAnim) ||
+ (this->skelAnime.animation == &gGekkoSurpriseJumpAnim)) {
+ this->skelAnime.curFrame = 1.0f;
+ }
+ this->actionFunc = EnBigslime_StunGekko;
+ this->skelAnime.playSpeed = 0.0f;
+ this->actor.speedXZ = 0.0f;
+}
+
+void EnBigslime_StunGekko(EnBigslime* this, GlobalContext* globalCtx) {
+ this->stunTimer--;
+ if (this->stunTimer == 0) {
+ if (this->gekkoDrawEffect == GEKKO_DRAW_EFFECT_FROZEN) {
+ EnBigslime_GekkoThaw(this, globalCtx);
+ EnBigslime_SetupDamageGekko(this, false);
+ } else {
+ this->gekkoCollider.base.acFlags &= ~AC_ON;
+ EnBigslime_SetupCutscene(this);
+ }
+ }
+}
+
+void EnBigslime_SetupCutsceneFormBigslime(EnBigslime* this) {
+ Animation_PlayOnce(&this->skelAnime, &gGekkoJumpUpAnim);
+ this->gekkoCollider.base.acFlags &= ~AC_ON;
+ this->actor.world.rot.x = -Actor_PitchToPoint(&this->actor, &this->actor.home.pos);
+ this->actor.world.rot.y = Actor_YawToPoint(&this->actor, &this->actor.home.pos);
+ this->actionFunc = EnBigslime_CutsceneFormBigslime;
+ this->actor.speedXZ = 0.0f;
+}
+
+void EnBigslime_CutsceneFormBigslime(EnBigslime* this, GlobalContext* globalCtx) {
+ EnBigslime_UpdateCameraFormingBigslime(this, globalCtx);
+ Math_ScaledStepToS(&this->gekkoRot.y, this->actor.world.rot.y, 0x800);
+ if (Animation_OnFrame(&this->skelAnime, 18.0f)) {
+ EnBigslime_SetupFormBigslime(this);
+ }
+}
+
+void EnBigslime_SetupFormBigslime(EnBigslime* this) {
+ s32 i;
+
+ this->actor.gravity = 0.0f;
+ this->gekkoRot.x = 0x4000 - this->actor.world.rot.x;
+ this->formBigslimeTimer = 0;
+ this->wavySurfaceTimer = 0;
+ this->actor.speedXZ = 25.0f;
+ this->gekkoRot.y = this->actor.world.rot.y;
+ this->formBigslimeCutsceneTimer = 2;
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ this->minislime[i]->actor.params = MINISLIME_FORM_BIGSLIME;
+ }
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.ocFlags1 |= OC1_NO_PUSH;
+ }
+
+ this->actor.update = EnBigslime_UpdateBigslime;
+ this->actor.draw = EnBigslime_DrawBigslime;
+ Actor_SetScale(&this->actor, 0.0f);
+ this->vtxScaleX = 0.0f;
+ this->vtxScaleZ = 0.0f;
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_JUMP_ABOVE);
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_UTSUBO_APPEAR_TRG);
+ this->actionFunc = EnBigslime_FormBigslime;
+}
+
+void EnBigslime_FormBigslime(EnBigslime* this, GlobalContext* globalCtx) {
+ f32 xzScale;
+ f32 yScaleFactor;
+ s32 i;
+
+ EnBigslime_UpdateWavySurface(this);
+ EnBigslime_UpdateCameraFormingBigslime(this, globalCtx);
+ if (this->formBigslimeCutsceneTimer < 0) {
+ Math_ScaledStepToS(&this->gekkoRot.x, 0, 0x400);
+ } else if (this->actor.world.pos.y > (GBT_ROOM_5_MAX_Y - 100.0f)) {
+ this->gekkoRot.x -= 0x4000;
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.home.pos);
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.speedXZ = 0.0f;
+ Animation_PlayLoop(&this->skelAnime, &gGekkoSwimForwardAnim);
+ this->formBigslimeCutsceneTimer--;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_B_SLIME_COMBINE);
+ } else if (this->isAnimUpdate) {
+ this->formBigslimeCutsceneTimer--;
+ if (this->formBigslimeCutsceneTimer == 0) {
+ Animation_PlayLoop(&this->skelAnime, &gGekkoSwimUpAnim);
+ }
+ }
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ if (this->minislime[i]->actor.params == MINISLIME_SETUP_DISAPPEAR) {
+ this->minislime[i]->actor.params = MINISLIME_DISAPPEAR;
+ this->minislimeCounter++;
+ }
+ }
+
+ if (this->minislimeCounter > 0) {
+ yScaleFactor = sqrtf(this->minislimeCounter * (2.0f / 30.0f)) * 0.6f + 0.4f;
+ xzScale = 0.15f * yScaleFactor;
+ this->actor.scale.x = xzScale;
+ this->actor.scale.y = 0.079f * yScaleFactor;
+ this->actor.scale.z = xzScale;
+ }
+
+ if (this->minislimeCounter == MINISLIME_NUM_SPAWN) {
+ this->minislimeState = MINISLIME_INACTIVE_STATE;
+ this->actor.hintId = 3;
+ EnBigslime_SetupMoveOnCeiling(this);
+ }
+}
+
+void EnBigslime_SetupCutsceneDefeat(EnBigslime* this, GlobalContext* globalCtx) {
+ Vec3f subCamEye;
+ Vec3f subCamAt;
+ s32 i;
+ s16 yawOffset;
+
+ Animation_Change(&this->skelAnime, &gGekkoDamagedAnim, 0.5f, 0.0f,
+ Animation_GetLastFrame(&gGekkoDamagedAnim.common), 3, 0.0f);
+ this->gekkoCollider.base.acFlags &= ~AC_ON;
+ this->defeatTimer = 60;
+ this->actor.speedXZ = 10.0f;
+ this->actor.gravity = -2.0f;
+ this->actor.velocity.y = 0.0f;
+ EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_DEAD);
+
+ // Points the camera at the defeated Gekko
+ subCamAt.x = this->actor.world.pos.x;
+ subCamAt.y = this->actor.world.pos.y + 40.0f;
+ subCamAt.z = this->actor.world.pos.z;
+
+ if (BINANG_SUB(Actor_YawToPoint(&this->actor, &this->actor.home.pos), this->actor.world.rot.y) > 0) {
+ yawOffset = this->actor.world.rot.y + 0x4000;
+ } else {
+ yawOffset = this->actor.world.rot.y - 0x4000;
+ }
+
+ // Moves the camera to the side of player and Gekko
+ subCamEye.x = (Math_SinS(yawOffset) * 250.0f) + subCamAt.x;
+ subCamEye.y = subCamAt.y + 60.0f;
+ subCamEye.z = (Math_CosS(yawOffset) * 250.0f) + subCamAt.z;
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCamAt, &subCamEye);
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ this->minislime[i]->actor.params = MINISLIME_DEFEAT_IDLE;
+ }
+
+ this->actor.flags &= ~1;
+ EnBigslime_GekkoThaw(this, globalCtx);
+ this->actionFunc = EnBigslime_CutsceneDefeat;
+}
+
+void EnBigslime_CutsceneDefeat(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 defeatTimer;
+ Camera* subCam;
+ Vec3f subCamAt;
+
+ this->defeatTimer--;
+ defeatTimer = CLAMP_MAX(this->defeatTimer, 10);
+ this->gekkoRot.y += 0x300 * defeatTimer;
+ if (Math_StepToF(&this->actor.speedXZ, 0.0f, 0.5f)) {
+ EnBigslime_SetupGekkoDespawn(this, globalCtx);
+ } else {
+ // Continue for the camera to follow Gekko as it spins in defeat
+ subCam = Play_GetCamera(globalCtx, this->subCamId);
+ subCamAt.x = this->actor.world.pos.x;
+ subCamAt.y = this->actor.world.pos.y + 40.0f;
+ subCamAt.z = this->actor.world.pos.z;
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCamAt, &subCam->eye);
+ }
+}
+
+void EnBigslime_SetupGekkoDespawn(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ f32 magnitude;
+ f32 invMagnitude;
+
+ Math_Vec3f_Diff(&subCam->eye, &subCam->at, &this->subCamDistToFrog);
+ magnitude = Math3D_Vec3fMagnitude(&this->subCamDistToFrog);
+ if (magnitude > 78.0f) {
+ invMagnitude = 1.0f / magnitude;
+ magnitude -= 77.0f;
+ magnitude /= 20.0f;
+ Math_Vec3f_Scale(&this->subCamDistToFrog, magnitude * invMagnitude);
+ } else {
+ Math_Vec3f_Copy(&this->subCamDistToFrog, &gZeroVec3f);
+ }
+
+ this->shockwaveAlpha = 0;
+ this->despawnTimer = 20;
+ this->actionFunc = EnBigslime_GekkoDespawn;
+}
+
+void EnBigslime_GekkoDespawn(EnBigslime* this, GlobalContext* globalCtx) {
+ Vec3f subCamEye;
+ Vec3f subCamAt;
+ Camera* subCam;
+
+ this->despawnTimer--;
+ this->gekkoScale = this->despawnTimer * 0.00035000002f;
+ if (this->despawnTimer == 0) {
+ EnBigslime_SetupFrogSpawn(this, globalCtx);
+ } else {
+ subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Math_Vec3f_Copy(&subCamAt, &subCam->at);
+ Math_Vec3f_Diff(&subCam->eye, &this->subCamDistToFrog, &subCamEye);
+ subCamEye.y -= 1.8f;
+ subCamAt.y -= 1.7f;
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCamAt, &subCamEye);
+ }
+}
+
+void EnBigslime_SetupFrogSpawn(EnBigslime* this, GlobalContext* globalCtx) {
+ static Color_RGBA8 dustPrimColor = { 250, 250, 250, 255 };
+ static Color_RGBA8 dustEnvColor = { 180, 180, 180, 255 };
+ static Vec3f hahenAccel = { 0.0f, -0.5f, 0.0f };
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Vec3f* worldPos;
+ Vec3f dustPos;
+ Vec3f hahenVel;
+ s16 yaw = func_800DFCDC(GET_ACTIVE_CAM(globalCtx));
+ s16 yawReverse = yaw + 0x8000;
+ s32 i;
+
+ this->gekkoCollider.base.ocFlags1 &= ~OC1_ON;
+
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_MINIFROG, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 0, yawReverse, 0, this->actor.params);
+
+ dustPos.x = (Math_SinS(yawReverse) * 20.0f) + this->actor.world.pos.x;
+ dustPos.y = this->actor.world.pos.y + 20.0f;
+ worldPos = &this->actor.world.pos;
+ dustPos.z = (Math_CosS(yawReverse) * 20.0f) + this->actor.world.pos.z;
+
+ Audio_PlaySoundAtPosition(globalCtx, worldPos, 40, NA_SE_EN_NPC_APPEAR);
+
+ // dust cloud where the red frog appears
+ func_800B0DE0(globalCtx, &dustPos, &gZeroVec3f, &gZeroVec3f, &dustPrimColor, &dustEnvColor, 500, 50);
+
+ for (i = 0; i < 25; i++) {
+ hahenVel.x = randPlusMinusPoint5Scaled(5.0f);
+ hahenVel.y = Rand_ZeroFloat(3.0f) + 4.0f;
+ hahenVel.z = randPlusMinusPoint5Scaled(5.0f);
+ EffectSsHahen_Spawn(globalCtx, worldPos, &hahenVel, &hahenAccel, 0, Rand_S16Offset(12, 3), HAHEN_OBJECT_DEFAULT,
+ 10, 0);
+ }
+
+ this->spawnFrogTimer = 40;
+ Math_Vec3f_Diff(&subCam->eye, &subCam->at, &this->subCamDistToFrog);
+ this->actionFunc = EnBigslime_FrogSpawn;
+}
+
+void EnBigslime_FrogSpawn(EnBigslime* this, GlobalContext* globalCtx) {
+ Camera* subCam = Play_GetCamera(globalCtx, this->subCamId);
+ Vec3f subCamEye;
+ f32 subCamZoom;
+
+ 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;
+ 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);
+ Play_CameraSetAtEye(globalCtx, this->subCamId, &subCam->at, &subCamEye);
+
+ if (this->spawnFrogTimer == 0) {
+ EnBigslime_EndCutscene(this, globalCtx);
+ EnBigslime_SetupDespawn(this);
+ }
+}
+
+void EnBigslime_SetupDespawn(EnBigslime* this) {
+ s32 i;
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ this->minislime[i]->actor.params = MINISLIME_DEFEAT_MELT;
+ }
+
+ this->isDespawned = false;
+ this->gekkoCollider.base.ocFlags1 &= ~OC1_ON;
+ this->actionFunc = EnBigslime_Despawn;
+}
+
+void EnBigslime_Despawn(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 i;
+ s32 counter = 0;
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ if (this->minislime[i]->actor.shape.shadowAlpha == 0) {
+ counter++;
+ }
+ }
+
+ if (!this->isDespawned) {
+ Actor_SetRoomClearedTemp(globalCtx, globalCtx->roomCtx.currRoom.num);
+ this->isDespawned = true;
+ }
+
+ if (counter == MINISLIME_NUM_SPAWN) {
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ this->minislime[i]->actor.params = MINISLIME_DESPAWN;
+ }
+
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void EnBigslime_SetupInitEntrance(EnBigslime* this) {
+ this->actionFunc = EnBigslime_InitEntrance;
+}
+
+void EnBigslime_InitEntrance(EnBigslime* this, GlobalContext* globalCtx) {
+ if (globalCtx->roomCtx.prevRoom.num == -1) {
+ EnBigslime_SetupCutscene(this);
+ }
+}
+
+void EnBigslime_SetupCutscene(EnBigslime* this) {
+ if (ActorCutscene_GetCurrentIndex() == 0x7D) {
+ ActorCutscene_Stop(0x7D);
+ }
+
+ if (this->actor.colChkInfo.health == 0) {
+ this->cutscene = this->actor.cutscene;
+ }
+
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ this->actionFuncStored = this->actionFunc;
+ this->actionFunc = EnBigslime_PlayCutscene;
+ this->actor.speedXZ = 0.0f;
+}
+
+void EnBigslime_PlayCutscene(EnBigslime* this, GlobalContext* globalCtx) {
+ if (ActorCutscene_GetCurrentIndex() == 0x7D) {
+ ActorCutscene_Stop(0x7D);
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ } else if (ActorCutscene_GetCanPlayNext(this->cutscene)) {
+ ActorCutscene_Start(this->cutscene, &this->actor);
+ if (this->actionFuncStored != EnBigslime_SquishFlat) {
+ func_800B724C(globalCtx, &this->actor, 7);
+ }
+
+ this->subCamId = ActorCutscene_GetCurrentCamera(this->cutscene);
+ if (this->actor.colChkInfo.health == 0) {
+ EnBigslime_SetupCutsceneDefeat(this, globalCtx);
+ } else if ((this->actionFuncStored == EnBigslime_DamageGekko) ||
+ (this->actionFuncStored == EnBigslime_JumpGekko) ||
+ (this->actionFuncStored == EnBigslime_StunGekko)) {
+ EnBigslime_SetupCutsceneFormBigslime(this);
+ } else if (this->actionFuncStored == EnBigslime_SquishFlat) {
+ EnBigslime_SetupCutsceneGrabPlayer(this, globalCtx);
+ } else {
+ EnBigslime_SetupCutsceneStartBattle(this, globalCtx);
+ }
+ } else {
+ ActorCutscene_SetIntentToPlay(this->cutscene);
+ }
+}
+
+void EnBigslime_ApplyDamageEffectBigslime(EnBigslime* this, GlobalContext* globalCtx) {
+ s32 i;
+
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ if (this->bigslimeCollider[i].base.acFlags & AC_HIT) {
+ this->bigslimeCollider[i].base.acFlags &= ~AC_HIT;
+ if (this->actionFunc == EnBigslime_FrozenGround) {
+ if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_BREAK_ICE) {
+ EnBigslime_BreakIntoMinislime(this, globalCtx);
+ break;
+ } else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_FIRE) {
+ EnBigslime_SetPlayerParams(this, globalCtx);
+ EnBigslime_SetupMelt(this);
+ break;
+ }
+ } else {
+ if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ICE) {
+ EnMinislime* minislime;
+
+ globalCtx->envCtx.unk_C3 = 2;
+ EnBigslime_SetPlayerParams(this, globalCtx);
+ this->rotation = 0;
+ EnBigslime_SetupFreeze(this);
+ minislime = (EnMinislime*)func_ActorCategoryIterateById(globalCtx, NULL, ACTORCAT_ITEMACTION,
+ ACTOR_ARROW_ICE);
+ if (minislime != NULL) {
+ minislime->shakeRefPos.z = -100.0f;
+ }
+ break;
+ }
+
+ if ((this->actor.colChkInfo.damageEffect != BIGSLIME_DMGEFF_STUN) && (this->itemDropTimer == 0)) {
+ f32 randFloat = Rand_ZeroOne();
+
+ if (randFloat < 0.15f) {
+ Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_ARROWS_10);
+ } else if (randFloat < 0.3f) {
+ Item_DropCollectible(globalCtx, &this->actor.world.pos, ITEM00_MAGIC_SMALL);
+ }
+ this->itemDropTimer = 40;
+ }
+ }
+ }
+ }
+
+ for (; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.acFlags &= ~AC_HIT;
+ }
+}
+
+void EnBigslime_ApplyDamageEffectGekko(EnBigslime* this, GlobalContext* globalCtx) {
+ if (this->gekkoCollider.base.acFlags & AC_HIT) {
+ this->gekkoCollider.base.acFlags &= ~AC_HIT;
+ if ((this->gekkoDrawEffect != GEKKO_DRAW_EFFECT_FROZEN) ||
+ !(this->gekkoCollider.info.acHitInfo->toucher.dmgFlags & 0xDB0B3)) {
+ EnBigslime_EndThrowMinislime(this);
+ if (this->actor.colChkInfo.damageEffect != BIGSLIME_DMGEFF_HOOKSHOT) {
+ if (Actor_ApplyDamage(&this->actor) == 0) {
+ func_800BE504(&this->actor, &this->gekkoCollider);
+ func_801A2ED8();
+ Enemy_StartFinishingBlow(globalCtx, &this->actor);
+ this->gekkoCollider.base.acFlags &= ~AC_ON;
+ EnBigslime_GekkoThaw(this, globalCtx);
+ if ((this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_FIRE) ||
+ (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_LIGHT)) {
+ this->unk_388 = 4.0f;
+ this->unk_38C = 0.75f;
+ if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_FIRE) {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_THAW;
+ } else {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_LIGHT_ORBS;
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG,
+ this->gekkoCollider.info.bumper.hitPos.x,
+ this->gekkoCollider.info.bumper.hitPos.y,
+ this->gekkoCollider.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ }
+ } else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ICE) {
+ EnBigslime_GekkoFreeze(this);
+ }
+ EnBigslime_SetupCutscene(this);
+ } else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ELECTRIC_STUN) {
+ this->stunTimer = 40;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_ELECTRIC_STUN;
+ this->unk_38C = 0.75f;
+ this->unk_388 = 2.0f;
+ EnBigslime_SetupStunGekko(this);
+ } else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_STUN ||
+ this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_DEKU_STUN) {
+ this->stunTimer = 40;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ EnBigslime_SetupStunGekko(this);
+ } else if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_ICE) {
+ EnBigslime_GekkoFreeze(this);
+ func_800BE504(&this->actor, &this->gekkoCollider);
+ EnBigslime_SetupStunGekko(this);
+ } else {
+ EnBigslime_GekkoThaw(this, globalCtx);
+ if ((this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_FIRE) ||
+ (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_LIGHT)) {
+ this->unk_388 = 3.0f;
+ this->unk_38C = 0.75f;
+ if (this->actor.colChkInfo.damageEffect == BIGSLIME_DMGEFF_FIRE) {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_THAW;
+ } else {
+ this->gekkoDrawEffect = GEKKO_DRAW_EFFECT_LIGHT_ORBS;
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG,
+ this->gekkoCollider.info.bumper.hitPos.x,
+ this->gekkoCollider.info.bumper.hitPos.y,
+ this->gekkoCollider.info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
+ }
+ }
+ EnBigslime_SetupDamageGekko(this, true);
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Adds ice shard effects and calls EnBigslime_InitShockwave
+ */
+void EnBigslime_AddIceShardEffect(EnBigslime* this, GlobalContext* globalCtx) {
+ Vtx* targetVtx = &sBigslimeTargetVtx[0];
+ EnBigslimeIceShardEffect* iceShardEffect;
+ s32 i;
+ f32 randFloat;
+ s16 randPitch; // Elevation Angle
+ s16 vtxX;
+ s16 vtxZ;
+ f32 xzDist;
+
+ for (i = 0; i < BIGSLIME_NUM_VTX; i++, targetVtx++) {
+ if (targetVtx->n.a > 0) {
+ iceShardEffect = &this->iceShardEffect[i];
+ iceShardEffect->pos.x = (targetVtx->n.ob[0] * this->actor.scale.x) + this->actor.world.pos.x;
+ iceShardEffect->pos.y = (targetVtx->n.ob[1] * this->actor.scale.y) + this->actor.world.pos.y;
+ iceShardEffect->pos.z = (targetVtx->n.ob[2] * this->actor.scale.z) + this->actor.world.pos.z;
+ iceShardEffect->rotation.x = Rand_Next() >> 0x10;
+ iceShardEffect->rotation.y = Rand_Next() >> 0x10;
+ iceShardEffect->rotation.z = Rand_Next() >> 0x10;
+ iceShardEffect->isActive = true;
+ randPitch = Rand_S16Offset(0x1000, 0x3000);
+ vtxZ = targetVtx->n.ob[2];
+ vtxX = targetVtx->n.ob[0];
+ xzDist = sqrtf(SQ(vtxZ) + SQ(vtxX));
+ randFloat = Rand_ZeroFloat(5.0f) + 14.0f;
+ if (xzDist > 1.0f) {
+ xzDist = Math_CosS(randPitch) * randFloat / xzDist;
+ } else {
+ xzDist = Math_CosS(randPitch) * randFloat;
+ }
+
+ iceShardEffect->vel.x = targetVtx->n.ob[0] * xzDist;
+ iceShardEffect->vel.y = Math_SinS(randPitch) * randFloat;
+ iceShardEffect->vel.z = targetVtx->n.ob[2] * xzDist;
+ iceShardEffect->scale = 0.001f * (Rand_ZeroFloat(6.0f) + 2.0f);
+ }
+ }
+
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_BROKEN);
+ EnBigslime_InitShockwave(this, globalCtx);
+}
+
+/**
+ * Updates ice shard effects, shockwave effects, and actor damage draw effects
+ */
+void EnBigslime_UpdateEffects(EnBigslime* this) {
+ EnBigslimeIceShardEffect* iceShardEffect;
+ s32 i;
+
+ // Update ice shards
+ for (i = 0; i < BIGSLIME_NUM_ICE_SHARD; i++) {
+ iceShardEffect = &this->iceShardEffect[i];
+ if (iceShardEffect->isActive > false) {
+ iceShardEffect->vel.y += -1.0f;
+ Math_Vec3f_Sum(&iceShardEffect->pos, &iceShardEffect->vel, &iceShardEffect->pos);
+ if (iceShardEffect->pos.y < (GBT_ROOM_5_MIN_Y - 20.0f)) {
+ iceShardEffect->isActive = false;
+ }
+ iceShardEffect->rotation.x += (s16)(((u32)Rand_Next() >> 0x17) + 0x700);
+ iceShardEffect->rotation.y += (s16)(((u32)Rand_Next() >> 0x17) + 0x900);
+ iceShardEffect->rotation.z += (s16)(((u32)Rand_Next() >> 0x17) + 0xB00);
+ }
+ }
+
+ // update shockwave
+ if (this->shockwaveAlpha > 0) {
+ this->shockwaveAlpha = (this->shockwaveAlpha - 10 < 0) ? 0 : (this->shockwaveAlpha - 10);
+ this->shockwaveScale += 0.0013f;
+ }
+
+ // update actor damage draw effects
+ if (this->unk_388 > 0.0f) {
+ if ((this->gekkoDrawEffect != GEKKO_DRAW_EFFECT_FROZEN) && (this->actionFunc != EnBigslime_PlayCutscene)) {
+ Math_StepToF(&this->unk_388, 0.0f, 0.05f);
+ this->unk_38C = 0.375f * (this->unk_388 + 1.0f);
+ this->unk_38C = CLAMP_MAX(this->unk_38C, 0.75f);
+ } else if (!Math_StepToF(&this->unk_390, 0.75f, 0.01875f)) {
+ func_800B9010(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
+ }
+ }
+}
+
+void EnBigslime_UpdateBigslime(Actor* thisx, GlobalContext* globalCtx) {
+ EnBigslime* this = THIS;
+ s32 i;
+ Vec3f vtxMax;
+ Vec3f vtxMin;
+
+ if (globalCtx->envCtx.unk_C3 == 3) {
+ globalCtx->envCtx.unk_C3 = 0xFF;
+ }
+
+ func_8019F540(1);
+ this->dynamicVtxState ^= 1;
+ EnBigslime_DynamicVtxCopyState(this);
+ this->isAnimUpdate = SkelAnime_Update(&this->skelAnime);
+ if (this->actionFunc != EnBigslime_PlayCutscene) {
+ EnBigslime_ApplyDamageEffectBigslime(this, globalCtx);
+ } else {
+ for (i = 0; i < BIGSLIME_NUM_RING_FACES; i++) {
+ this->bigslimeCollider[i].base.acFlags &= ~AC_HIT;
+ }
+ }
+
+ this->actionFunc(this, globalCtx);
+
+ if (this->actionFunc != EnBigslime_FormBigslime) {
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ } else {
+ Actor_SetVelocityAndMoveXYRotation(&this->actor);
+ }
+
+ if (this->actionFunc != EnBigslime_JumpGekko) {
+ EnBigslime_GetMaxMinVertices(this, &vtxMax, &vtxMin);
+ EnBigslime_UpdateScale(this, &vtxMax, &vtxMin);
+ EnBigslime_CheckRoomBoundaries(this, &vtxMax, &vtxMin);
+ EnBigslime_UpdateSurfaceNorm(this);
+ EnBigslime_UpdateBigslimeCollider(this, globalCtx);
+ }
+
+ EnBigslime_UpdateEffects(this);
+
+ if (this->itemDropTimer > 0) {
+ this->itemDropTimer--;
+ }
+}
+
+void EnBigslime_UpdateGekko(Actor* thisx, GlobalContext* globalCtx) {
+ static s32 isGekkoOnGround = false;
+ EnBigslime* this = THIS;
+ Player* player;
+ s32 pad;
+
+ if (globalCtx->envCtx.unk_C3 == 3) {
+ globalCtx->envCtx.unk_C3 = 0xFF;
+ }
+
+ func_8019F540(0);
+ this->isAnimUpdate = SkelAnime_Update(&this->skelAnime);
+ if (this->actionFunc != EnBigslime_PlayCutscene) {
+ EnBigslime_ApplyDamageEffectGekko(this, globalCtx);
+ } else {
+ this->gekkoCollider.base.acFlags &= ~AC_HIT;
+ }
+
+ this->actionFunc(this, globalCtx);
+ if (this->actionFunc != EnBigslime_FormBigslime) {
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ } else {
+ Actor_SetVelocityAndMoveXYRotation(&this->actor);
+ }
+
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 40.0f, 80.0f, 0x1F);
+ this->gekkoCollider.dim.pos.x = (s16)this->actor.world.pos.x;
+ this->gekkoCollider.dim.pos.z = (s16)this->actor.world.pos.z;
+ if (this->gekkoCollider.base.acFlags & AC_ON) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->gekkoCollider.base);
+ }
+
+ if ((this->actor.update == EnBigslime_UpdateGekko) && (this->gekkoCollider.base.ocFlags1 & OC1_ON)) {
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->gekkoCollider.base);
+ }
+
+ EnBigslime_UpdateEffects(this);
+
+ if ((this->actionFunc != EnBigslime_StunGekko) &&
+ (this->gekkoCollider.dim.pos.y < (s16)(3.0f + GBT_ROOM_5_MIN_Y))) {
+ Vec3f vtxNorm;
+
+ if (((globalCtx->gameplayFrames % 4) == 0) || !isGekkoOnGround) {
+ player = GET_PLAYER(globalCtx);
+ vtxNorm.x = this->actor.world.pos.x;
+ vtxNorm.z = this->actor.world.pos.z;
+ vtxNorm.y = player->actor.world.pos.y + player->actor.depthInWater;
+ EffectSsGRipple_Spawn(globalCtx, &vtxNorm, 150, 550, 0);
+ isGekkoOnGround = true;
+ }
+ } else {
+ isGekkoOnGround = false;
+ }
+}
+
+/**
+ * Related to transforming and drawing shadows
+ */
+void EnBigslime_SetSysMatrix(Vec3f* pos, GlobalContext* globalCtx, Gfx* shadowDList, f32 scaleX, f32 scalez, f32 scaleY,
+ s16 rotation, f32 alpha) {
+ f32 yDistMinY;
+ f32 xz;
+ MtxF* sysMatrix = Matrix_GetCurrentState();
+
+ yDistMinY = pos->y - scaleY - GBT_ROOM_5_MIN_Y;
+ yDistMinY = CLAMP((yDistMinY), 0.0f, (GBT_ROOM_5_CENTER_Y - GBT_ROOM_5_MIN_Y) / 2);
+ xz = 1.0f - (yDistMinY * (1.0f / 1550.0f));
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+ POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
+ sysMatrix->xx = xz;
+ sysMatrix->yy = 1.0f;
+ sysMatrix->zz = xz;
+ sysMatrix->xz = sysMatrix->xy = 0.0f;
+ sysMatrix->yz = sysMatrix->yx = 0.0f;
+ sysMatrix->zy = sysMatrix->zx = 0.0f;
+ sysMatrix->wx = pos->x;
+ sysMatrix->wy = GBT_ROOM_5_MIN_Y;
+ sysMatrix->wz = pos->z;
+ sysMatrix->xw = sysMatrix->yw = sysMatrix->zw = 0.0f;
+ sysMatrix->ww = 1.0f;
+
+ Matrix_RotateY(rotation, MTXMODE_APPLY);
+ Matrix_Scale(scaleX, 1.0f, scalez, MTXMODE_APPLY);
+ if (shadowDList != gBigslimeShadowDL) {
+ gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
+ COMBINED);
+ }
+
+ gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, (u8)(alpha * xz));
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_OPA_DISP++, shadowDList);
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void EnBigslime_DrawMinislime(EnBigslime* this, GlobalContext* globalCtx) {
+ EnMinislime* minislime;
+ GlobalContext* globalCtx2 = globalCtx;
+ s32 pad;
+ s32 currIndex;
+ s32 i;
+ Lights* lights;
+ s32 indices[MINISLIME_NUM_SPAWN];
+
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ indices[i] = i;
+ }
+
+ // Insertion sorting algorithm based on z projected Pos
+ for (i = 0; i < MINISLIME_NUM_SPAWN - 1; i++) {
+ if (this->minislime[indices[i]]->actor.projectedPos.z < this->minislime[indices[i + 1]]->actor.projectedPos.z) {
+ currIndex = indices[i];
+ indices[i] = indices[i + 1];
+ indices[i + 1] = currIndex;
+ if (i != 0) {
+ i -= 2;
+ }
+ }
+ }
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+ for (i = 0; i < MINISLIME_NUM_SPAWN; i++) {
+ minislime = this->minislime[indices[i]];
+ lights = LightContext_NewLights(&globalCtx2->lightCtx, globalCtx->state.gfxCtx);
+ Lights_BindAll(lights, globalCtx2->lightCtx.listHead, &minislime->actor.world.pos, globalCtx);
+ Lights_Draw(lights, globalCtx->state.gfxCtx);
+ func_8012C2DC(globalCtx->state.gfxCtx);
+ func_800B8118(&minislime->actor, globalCtx, 0);
+ Matrix_SetStateRotationAndTranslation(minislime->actor.world.pos.x, minislime->actor.world.pos.y,
+ minislime->actor.world.pos.z, &minislime->actor.shape.rot);
+ Matrix_Scale(minislime->actor.scale.x, minislime->actor.scale.y, minislime->actor.scale.z, MTXMODE_APPLY);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, minislime->actor.shape.shadowAlpha);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gMinislimeNormalDL);
+ if (minislime->frozenAlpha > 0) {
+ Matrix_InsertTranslation(0.0f, (0.1f - minislime->frozenScale) * -4000.0f, 0.0f, 1);
+ Matrix_Scale(0.1f, minislime->frozenScale, 0.1f, MTXMODE_APPLY);
+ AnimatedMat_Draw(globalCtx, this->minislimeFrozenTexAnim);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, minislime->frozenAlpha);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gMinislimeFrozenDL);
+ }
+
+ EnBigslime_SetSysMatrix(&minislime->actor.world.pos, globalCtx, gBigslimeShadowDL,
+ (minislime->actor.scale.x * 0.4f) * 0.1f, (minislime->actor.scale.z * 0.4f) * 0.1f,
+ minislime->actor.scale.y * 400.0f, minislime->actor.shape.rot.y,
+ minislime->actor.shape.shadowAlpha * (175.0f / 255.0f));
+ }
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void EnBigslime_DrawBigslime(Actor* thisx, GlobalContext* globalCtx) {
+ // 28 equidistance-spaced vtx Points (uniformally over the sphere)
+ static EnBigslimeBubbles bubblesInfo[] = {
+ { 0, 0.3f }, { 6, 0.1f }, { 12, 0.45f }, { 18, 0.5f }, { 24, 0.6f }, { 30, 0.2f }, { 36, 0.4f },
+ { 42, 0.25f }, { 48, 0.35f }, { 54, 0.65f }, { 60, 0.25f }, { 66, 0.55f }, { 72, 0.3f }, { 78, 0.1f },
+ { 84, 0.45f }, { 90, 0.5f }, { 96, 0.6f }, { 102, 0.2f }, { 108, 0.4f }, { 114, 0.15f }, { 120, 0.35f },
+ { 126, 0.65f }, { 132, 0.25f }, { 138, 0.3f }, { 144, 0.15f }, { 150, 0.45f }, { 156, 0.3f }, { 161, 0.25f },
+ };
+ EnBigslime* this = THIS;
+ EnBigslimeBubbles* bubblesInfoPtr;
+ Vtx* dynamicVtx;
+ MtxF* billboardMtxF;
+ s32 i;
+
+ func_8012C2DC(globalCtx->state.gfxCtx);
+ func_800B8118(&this->actor, globalCtx, 0);
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ // Draw Bigslime
+ gSPSegment(POLY_XLU_DISP++, 0x09, sBigslimeDynamicVtx[this->dynamicVtxState]);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeNormalDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeVtxDL);
+
+ // Draw frozen Bigslime
+ if ((this->actionFunc == EnBigslime_Freeze) || (this->actionFunc == EnBigslime_FrozenGround) ||
+ (this->actionFunc == EnBigslime_FrozenFall) || (this->actionFunc == EnBigslime_Melt)) {
+ AnimatedMat_Draw(globalCtx, this->bigslimeFrozenTexAnim);
+ gSPSegment(POLY_XLU_DISP++, 0x09, sBigslimeTargetVtx);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeFrozenVtxDL);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeVtxDL);
+ }
+
+ // Draw bubbles inside Bigslime
+ if (this->actor.scale.x > 0.0f) {
+ Matrix_SetCurrentState(&globalCtx->billboardMtxF);
+ Matrix_Scale(0.0050000003f, 0.0050000003f, 0.0050000003f, MTXMODE_APPLY);
+ billboardMtxF = Matrix_GetCurrentState();
+
+ for (i = 0; i < 28; i++) {
+ bubblesInfoPtr = &bubblesInfo[i];
+ dynamicVtx = &sBigslimeDynamicVtx[this->dynamicVtxState][bubblesInfoPtr->v];
+ billboardMtxF->wx =
+ dynamicVtx->n.ob[0] * this->actor.scale.x * bubblesInfoPtr->scaleVtx + this->actor.world.pos.x;
+ billboardMtxF->wy =
+ dynamicVtx->n.ob[1] * this->actor.scale.y * bubblesInfoPtr->scaleVtx + this->actor.world.pos.y;
+ billboardMtxF->wz =
+ dynamicVtx->n.ob[2] * this->actor.scale.z * bubblesInfoPtr->scaleVtx + this->actor.world.pos.z;
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeBubbleDL);
+ }
+ }
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+
+ EnBigslime_SetSysMatrix(&this->actor.world.pos, globalCtx, gBigslimeShadowDL, this->vtxScaleX, this->vtxScaleZ,
+ this->actor.scale.y * BIGSLIME_RADIUS_F, this->rotation, 175.0f);
+ EnBigslime_DrawGekko(&this->actor, globalCtx);
+}
+
+void EnBigslime_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ /* value -1: Limb Not used
+ * value 0: GEKKO_LIMB_WAIST
+ * value 1: GEKKO_LIMB_L_SHIN
+ * value 2: GEKKO_LIMB_L_FOOT
+ * value 3: GEKKO_LIMB_R_SHIN
+ * value 4: GEKKO_LIMB_R_FOOT
+ * value 5: GEKKO_LIMB_L_UPPER_ARM
+ * value 6: GEKKO_LIMB_L_FOREARM
+ * value 7: GEKKO_LIMB_L_HAND
+ * value 8: GEKKO_LIMB_R_UPPER_ARM
+ * value 9: GEKKO_LIMB_R_FOREARM
+ * value 10: GEKKO_LIMB_R_HAND
+ * value 11: GEKKO_LIMB_JAW
+ */
+ static s8 limbPosIndex[] = {
+ -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, 6, -1, 7, 8, 9, -1, 10, -1, 11, -1, -1,
+ };
+ // Some kind of offset for the position of the Gekkos right foot
+ static Vec3f rightFootOffsetRef = { 1500.0f, 2200.0f, 0.0f };
+ EnBigslime* this = THIS;
+ Vec3f rightFootOffset;
+
+ if (limbIndex == GEKKO_LIMB_HEAD) {
+ Matrix_GetStateTranslation(&this->actor.focus.pos);
+ this->actor.focus.rot.y = this->gekkoRot.y;
+ }
+
+ if (limbPosIndex[limbIndex] != -1) {
+ Matrix_GetStateTranslation(&this->limbPos[limbPosIndex[limbIndex]]);
+ }
+
+ if (limbIndex == GEKKO_LIMB_R_ANKLE) {
+ Matrix_MultiplyVector3fByState(&rightFootOffsetRef, &rightFootOffset);
+ this->gekkoCollider.dim.pos.y = rightFootOffset.y;
+ }
+}
+
+void EnBigslime_DrawGekko(Actor* thisx, GlobalContext* globalCtx) {
+ static Color_RGBA8 gekkoDamageColor = { 255, 0, 0, 0 };
+ static Color_RGBA8 gekkoStunColor = { 0, 0, 255, 0 };
+ Vec3f gekkoPos;
+ EnBigslime* this = THIS;
+ s32 pad;
+
+ func_8012C28C(globalCtx->state.gfxCtx);
+ if (this->actionFunc == EnBigslime_DamageGekko) {
+ func_800AE434(globalCtx, &gekkoDamageColor, this->damageSpinTimer, 20);
+ } else if ((this->actionFunc == EnBigslime_CutsceneDefeat) || (this->actionFunc == EnBigslime_GekkoDespawn)) {
+ func_800AE434(globalCtx, &gekkoDamageColor, 20, 20);
+ } else if (this->actionFunc == EnBigslime_StunGekko) {
+ if (this->gekkoDrawEffect == GEKKO_DRAW_EFFECT_FROZEN) {
+ func_800AE434(globalCtx, &gekkoDamageColor, this->stunTimer, 80);
+ } else if (this->gekkoDrawEffect == GEKKO_DRAW_EFFECT_ELECTRIC_STUN) {
+ func_800AE434(globalCtx, &gekkoStunColor, this->stunTimer, 40);
+ } else {
+ func_800AE434(globalCtx, &gekkoStunColor, this->stunTimer, 40);
+ }
+ }
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ Math_Vec3f_Sum(&this->actor.world.pos, &this->gekkoPosOffset, &gekkoPos);
+ Matrix_SetStateRotationAndTranslation(gekkoPos.x, gekkoPos.y, gekkoPos.z, &this->gekkoRot);
+ Matrix_Scale(this->gekkoScale, this->gekkoScale, this->gekkoScale, MTXMODE_APPLY);
+ SkinMatrix_Vec3fMtxFMultXYZ(&globalCtx->viewProjectionMtxF, &gekkoPos, &this->gekkoProjectedPos);
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ NULL, EnBigslime_PostLimbDraw, &this->actor);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+
+ if ((this->actionFunc == EnBigslime_DamageGekko) || (this->actionFunc == EnBigslime_CutsceneDefeat) ||
+ (this->actionFunc == EnBigslime_GekkoDespawn) || (this->actionFunc == EnBigslime_StunGekko)) {
+ func_800AE5A0(globalCtx);
+ }
+
+ EnBigslime_SetSysMatrix(&gekkoPos, globalCtx, D_04076BC0, this->gekkoScale * (550.0f / 7.0f),
+ this->gekkoScale * (550.0f / 7.0f), 0.0f, 0, 255.0f);
+
+ if (this->minislimeState != MINISLIME_INACTIVE_STATE) {
+ EnBigslime_DrawMinislime(this, globalCtx);
+ }
+
+ EnBigslime_DrawShatteringEffects(this, globalCtx);
+
+ // Draw actor damage effects
+ func_800BE680(globalCtx, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos),
+ this->gekkoScale * (999.99991f / 7.0f) * this->unk_38C, this->unk_390, this->unk_388,
+ this->gekkoDrawEffect);
+}
+
+void EnBigslime_DrawShatteringEffects(EnBigslime* this, GlobalContext* globalCtx) {
+ EnBigslimeIceShardEffect* iceShardEffect;
+ s32 i;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C2DC(globalCtx->state.gfxCtx);
+
+ // Draw Shockwave
+ if (this->shockwaveAlpha > 0) {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, this->shockwaveAlpha);
+ gSPSegment(POLY_XLU_DISP++, 0x0D,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, globalCtx->gameplayFrames % 128,
+ (u8)(globalCtx->gameplayFrames * 8), 32, 64, 1,
+ (-globalCtx->gameplayFrames * 2) % 64, 0, 16, 16));
+ Matrix_InsertTranslation(this->frozenPos.x, this->frozenPos.y, this->frozenPos.z, MTXMODE_NEW);
+ Matrix_Scale(this->shockwaveScale, this->shockwaveScale, this->shockwaveScale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeShockwaveDL);
+ }
+
+ // Draw Ice Shards
+ AnimatedMat_Draw(globalCtx, this->iceShardTexAnim);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeIceShardDL);
+
+ for (i = 0; i < BIGSLIME_NUM_ICE_SHARD; i++) {
+ iceShardEffect = &this->iceShardEffect[i];
+ if (iceShardEffect->isActive > false) {
+ Matrix_SetStateRotationAndTranslation(iceShardEffect->pos.x, iceShardEffect->pos.y, iceShardEffect->pos.z,
+ &iceShardEffect->rotation);
+ Matrix_Scale(iceShardEffect->scale, iceShardEffect->scale, iceShardEffect->scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, &gBigslimeIceShardVtxDL);
+ }
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
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 419b6c1f61..3f57f1666e 100644
--- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
+++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.h
@@ -63,7 +63,7 @@ typedef struct EnBigslime {
u8 minislimeCounter;
u8 numGekkoMeleeAttacks; // The Gekko will melee-attack link at 1-3 times at each position while engulfed in bigslime
};
- /* 0x02B4 */ u8 iceShardAlpha;
+ /* 0x02B4 */ u8 shockwaveAlpha;
/* 0x02B5 */ u8 gekkoDrawEffect;
/* 0x02B6 */ s16 gekkoYaw;
/* 0x02B8 */ s16 cutscene;
@@ -95,16 +95,16 @@ typedef struct EnBigslime {
};
/* 0x02C2 */ s16 ceilingDropTimer; // Bigslime is still during this timer and shakes before dropping
/* 0x02C4 */ s16 numGekkoPosGrabPlayer; // The Gekko will melee-attack link at 6 positions while engulfed in bigslime
- /* 0x02C6 */ s16 camId;
- /* 0x02C8 */ s16 cameraYawGrabPlayer;
+ /* 0x02C6 */ s16 subCamId;
+ /* 0x02C8 */ s16 subCamYawGrabPlayer;
/* 0x02CA */ s16 rotation; // is always 0, used in Matrix_RotateY
/* 0x02CC */ s16 itemDropTimer; // items only drop when zero, Set to 40 then decrements, prevents itemDrop spam
/* 0x02CE */ Vec3s gekkoRot;
/* 0x02D4 */ Vec3f gekkoPosOffset; // Used when Bigslime grabs link
/* 0x02E0 */ Vec3f gekkoProjectedPos;
/* 0x02EC */ union {
- Vec3f iceShardRefPos;
- Vec3f eyeDistToFrog; // Used to zoom into frogs as Gekko despawns/Frog spawns
+ Vec3f frozenPos;
+ Vec3f subCamDistToFrog; // Used to zoom into frogs as Gekko despawns/Frog spawns
};
/* 0x02F8 */ Vec3f limbPos[12];
/* 0x0388 */ f32 unk_388; // used as arg to func_800BE680
@@ -114,14 +114,14 @@ typedef struct EnBigslime {
/* 0x0398 */ f32 vtxSurfacePerturbation[BIGSLIME_NUM_VTX];
/* 0x0620 */ f32 vtxScaleX;
/* 0x0624 */ f32 vtxScaleZ;
- /* 0x0628 */ f32 iceShardScale;
+ /* 0x0628 */ f32 shockwaveScale;
/* 0x062C */ ColliderCylinder gekkoCollider;
/* 0x0678 */ ColliderCylinder bigslimeCollider[BIGSLIME_NUM_RING_FACES];
/* 0x0A14 */ EnMinislime* minislime[MINISLIME_NUM_SPAWN];
/* 0x0A44 */ EnMinislime* minislimeToThrow;
- /* 0x0A48 */ AnimatedMaterial* bigslimeFrozenTex;
- /* 0x0A4C */ AnimatedMaterial* minislimeFrozenTex;
- /* 0x0A50 */ AnimatedMaterial* iceShardTex;
+ /* 0x0A48 */ AnimatedMaterial* bigslimeFrozenTexAnim;
+ /* 0x0A4C */ AnimatedMaterial* minislimeFrozenTexAnim;
+ /* 0x0A50 */ AnimatedMaterial* iceShardTexAnim;
/* 0x0A54 */ EnBigslimeIceShardEffect iceShardEffect[BIGSLIME_NUM_ICE_SHARD]; // 312 = 162 (bigslime) + 10 * 15 (minislime)
} EnBigslime; // size = 0x3634
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 b052bb6af5..229803174b 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.c
@@ -5,6 +5,8 @@
*/
#include "z_en_bomjimb.h"
+#include "overlays/actors/ovl_En_Niw/z_en_niw.h"
+#include "objects/object_cs/object_cs.h"
#define FLAGS 0x00000009
@@ -15,19 +17,29 @@ void EnBomjimb_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnBomjimb_Update(Actor* thisx, GlobalContext* globalCtx);
void EnBomjimb_Draw(Actor* thisx, GlobalContext* globalCtx);
+void func_80C01494(EnBomjimb* this);
void func_80C014E4(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C01984(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C01A24(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C01B40(EnBomjimb* this);
void func_80C01B74(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C01C18(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C01CD0(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C0201C(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C02108(EnBomjimb* this);
void func_80C0217C(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C0250C(EnBomjimb* this);
void func_80C02570(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C0267C(EnBomjimb* this);
void func_80C02704(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C02740(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C02A14(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C02BCC(EnBomjimb* this, GlobalContext* globalCtx);
+void func_80C02CA4(EnBomjimb* this, GlobalContext* globalCtx);
void func_80C02DAC(EnBomjimb* this, GlobalContext* globalCtx);
-#if 0
+static Actor* D_80C03170 = NULL;
+
const ActorInit En_Bomjimb_InitVars = {
ACTOR_EN_BOMJIMB,
ACTORCAT_NPC,
@@ -40,79 +52,873 @@ const ActorInit En_Bomjimb_InitVars = {
(ActorFunc)EnBomjimb_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80C03194 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_2,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 20, 30, 0, { 0, 0, 0 } },
};
-#endif
+void EnBomjimb_Init(Actor* thisx, GlobalContext* globalCtx) {
+ EnBomjimb* this = THIS;
-extern ColliderCylinderInit D_80C03194;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 19.0f);
+ this->actor.gravity = -2.0f;
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_cs_Skel_00F82C, &object_cs_Anim_0064B8, this->jointTable,
+ this->morphTable, 21);
+ Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ this->actor.targetMode = 6;
+ Actor_SetScale(&this->actor, 0.01f);
-extern UNK_TYPE D_060064B8;
+ this->unk_2C6 = ENBOMJIMB_GET_F0(&this->actor);
+ this->unk_2B2 = ENBOMJIMB_GET_FF00(&this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/EnBomjimb_Init.s")
+ if (this->unk_2C6 != ENBOMJIMB_F0_0) {
+ this->unk_2C8 = ENBOMJIMB_GET_F(&this->actor) + 1;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/EnBomjimb_Destroy.s")
+ if (this->unk_2C8 < ENBOMJIMB_F_0) {
+ this->unk_2C8 = ENBOMJIMB_F_0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C0113C.s")
+ if (this->unk_2C6 < ENBOMJIMB_F0_0) {
+ this->unk_2C6 = ENBOMJIMB_F0_0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C011CC.s")
+ if ((gSaveContext.weekEventReg[73] & 0x10) || (gSaveContext.weekEventReg[85] & 2)) {
+ switch (this->unk_2C8) {
+ case ENBOMJIMB_F_0:
+ if (gSaveContext.weekEventReg[11] & 1) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C012E0.s")
+ case ENBOMJIMB_F_1:
+ if (gSaveContext.weekEventReg[11] & 2) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C012FC.s")
+ case ENBOMJIMB_F_2:
+ if (gSaveContext.weekEventReg[11] & 4) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C013B4.s")
+ case ENBOMJIMB_F_3:
+ if (gSaveContext.weekEventReg[11] & 8) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C013F0.s")
+ case ENBOMJIMB_F_4:
+ if (gSaveContext.weekEventReg[11] & 0x10) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ break;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01494.s")
+ if ((!(gSaveContext.weekEventReg[73] & 0x10) && !(gSaveContext.weekEventReg[85] & 2)) ||
+ (gSaveContext.weekEventReg[75] & 0x40)) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C014E4.s")
+ Math_Vec3f_Copy(&this->unk_2A0, &this->actor.home.pos);
+ if ((this->unk_2C6 == ENBOMJIMB_F0_0) || (this->unk_2C6 == ENBOMJIMB_F0_1) || (this->unk_2C6 != ENBOMJIMB_F0_2)) {
+ func_80C01494(this);
+ } else {
+ func_80C01984(this, globalCtx);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01984.s")
+void EnBomjimb_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnBomjimb* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01A24.s")
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01B40.s")
+void func_80C0113C(EnBomjimb* this, s32 arg1, f32 arg2) {
+ static AnimationHeader* sAnimations[] = {
+ &object_cs_Anim_0064B8, &object_cs_Anim_00FAF4, &object_cs_Anim_0057C8, &object_cs_Anim_0053F4,
+ &object_cs_Anim_002044, &object_cs_Anim_01007C, &object_cs_Anim_00349C, &object_cs_Anim_004960,
+ &object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_002930, &object_cs_Anim_001A1C,
+ &object_cs_Anim_003EE4, &object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8,
+ &object_cs_Anim_001708, &object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0,
+ &object_cs_Anim_0031C4, &object_cs_Anim_010B68,
+ };
+ static u8 D_80C03218[] = {
+ 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0,
+ };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01B74.s")
+ this->unk_2DC = arg1;
+ this->unk_2B8 = Animation_GetLastFrame(sAnimations[arg1]);
+ Animation_Change(&this->skelAnime, sAnimations[this->unk_2DC], arg2, 0.0f, this->unk_2B8, D_80C03218[this->unk_2DC],
+ -4.0f);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01C18.s")
+void func_80C011CC(EnBomjimb* this) {
+ if ((this->unk_2DC == 5) &&
+ (Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
+ Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01CD0.s")
+ if ((this->unk_2DC == 19) &&
+ (Animation_OnFrame(&this->skelAnime, 2.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BOMBERS_WALK);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C01FD4.s")
+ if ((this->unk_2DC == 18) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C0201C.s")
+ if ((this->unk_2DC == 7) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BOMBERS_LAND);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02108.s")
+void func_80C012E0(EnBomjimb* this) {
+ this->unk_2C0 = 0;
+ this->unk_2AE = 0;
+ this->unk_2B0 = 0;
+ this->unk_2CC = 0;
+ this->unk_290 = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C0217C.s")
+s32 func_80C012FC(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C0250C.s")
+ if (!func_801690CC(globalCtx) && (this->actor.xzDistToPlayer < 40.0f) &&
+ (fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 50.0f) && (globalCtx->msgCtx.unk11F10 == 0)) {
+ this->actor.speedXZ = 0.0f;
+ func_80C02740(this, globalCtx);
+ return true;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02570.s")
+s32 func_80C013B4(EnBomjimb* this) {
+ if (this->collider.base.acFlags & AC_HIT) {
+ func_80C0267C(this);
+ return true;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C0267C.s")
+s32 func_80C013F0(EnBomjimb* this, GlobalContext* globalCtx) {
+ Actor* sp1C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02704.s")
+ if (this->collider.base.ocFlags1 & OC1_HIT) {
+ sp1C = this->collider.base.oc;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02740.s")
+ if ((sp1C->id == ACTOR_OBJ_KIBAKO) && (D_80C03170 == NULL) && (sp1C->update != NULL) &&
+ !Actor_HasParent(sp1C, globalCtx)) {
+ D_80C03170 = sp1C;
+ this->unk_2E4 = sp1C;
+ func_80C01C18(this, globalCtx);
+ return true;
+ }
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02A14.s")
+void func_80C01494(EnBomjimb* this) {
+ func_80C012E0(this);
+ Math_Vec3f_Copy(&this->unk_2A0, &this->actor.world.pos);
+ this->unk_2CA = 3;
+ this->actionFunc = func_80C014E4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02BCC.s")
+void func_80C014E4(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ f32 curFrame = this->skelAnime.curFrame;
+ CollisionPoly* colPoly;
+ s16 abs;
+ f32 x;
+ f32 z;
+ f32 phi_f0;
+ Vec3f sp60;
+ Vec3f sp54;
+ Vec3f sp48;
+ s32 sp44;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02CA4.s")
+ if (func_80C012FC(this, globalCtx) || func_80C013B4(this) || func_80C013F0(this, globalCtx)) {
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02DAC.s")
+ switch (this->unk_2CC) {
+ 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);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/EnBomjimb_Update.s")
+ abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp48)));
+ if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp48, &sp60,
+ &colPoly, 1, 0, 0, 1, &sp44)) {
+ func_80C0113C(this, 5, 1.0f);
+ Math_Vec3f_Copy(&this->unk_294, &sp48);
+ this->unk_2B0 = Rand_S16Offset(30, 50);
+ this->unk_2CC++;
+ }
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/func_80C02FA8.s")
+ case 1:
+ if (curFrame >= 0.0f) {
+ this->unk_2D6 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_294);
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2D6, 10, 2000, 20);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bomjimb/EnBomjimb_Draw.s")
+ if ((s16)ABS_ALT(BINANG_SUB(this->actor.world.rot.y, this->unk_2D6)) < 0x100) {
+ Math_Vec3f_Copy(&sp54, &this->actor.world.pos);
+ sp54.x += Math_SinS(this->actor.world.rot.y) * 60.0f;
+ sp54.z += Math_CosS(this->actor.world.rot.y) * 60.0f;
+ if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp54, &sp60, &colPoly, 1, 0, 0,
+ 1, &sp44)) {
+ this->unk_2AE = 0;
+ if (Rand_ZeroOne() < 0.5f) {
+ func_80C0113C(this, 20, 1.0f);
+ } else {
+ func_80C0113C(this, 0, 1.0f);
+ }
+ this->unk_2CC = 0;
+ this->unk_2B4 = 0.0f;
+ break;
+ }
+ }
+
+ x = this->unk_294.x - this->actor.world.pos.x;
+ z = this->unk_294.z - this->actor.world.pos.z;
+
+ if ((this->unk_2B0 == 0) || (sqrtf(SQ(x) + SQ(z)) < 4.0f)) {
+ this->unk_2AE = Rand_S16Offset(20, 20);
+ if (!(this->unk_2AE & 1)) {
+ func_80C0113C(this, 20, 1.0f);
+ } else {
+ func_80C0113C(this, 0, 1.0f);
+ }
+ this->unk_2CC = 0;
+ this->unk_2B4 = 0.0f;
+ } else if (curFrame >= 0.0f) {
+ Math_ApproachF(&this->actor.world.pos.x, this->unk_294.x, 0.3f, this->unk_2B4);
+ Math_ApproachF(&this->actor.world.pos.z, this->unk_294.z, 0.3f, this->unk_2B4);
+ Math_ApproachF(&this->unk_2B4, 1.0f, 0.3f, 0.5f);
+ }
+ break;
+ }
+
+ if (player->stateFlags3 != 0x1000000) {
+ phi_f0 = 200.0f;
+
+ abs = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.world.rot.y));
+ if (abs > 0x2890) {
+ phi_f0 = 150.0f;
+ }
+
+ if (this->actor.xzDistToPlayer < phi_f0) {
+ func_80C02108(this);
+ }
+ }
+}
+
+void func_80C01984(EnBomjimb* this, GlobalContext* globalCtx) {
+ func_80C012E0(this);
+ this->unk_2E4 =
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_NIW, this->actor.world.pos.x,
+ this->actor.world.pos.y + 30.0f, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 2);
+ if (this->unk_2E4 != NULL) {
+ func_80C0113C(this, 11, 1.0f);
+ }
+ this->unk_2CA = 0;
+ this->actionFunc = func_80C01A24;
+}
+
+void func_80C01A24(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ this->actor.gravity = -0.1f;
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
+ if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
+ ((EnNiw*)this->unk_2E4)->unk2BC.z = 90000.0f;
+ }
+ this->actor.speedXZ = 0.0f;
+ this->unk_2E4 = NULL;
+ this->actor.gravity = -2.0f;
+ func_80C02108(this);
+ return;
+ }
+
+ if ((this->actor.xzDistToPlayer < 200.0f) && (fabsf(player->actor.world.pos.y - this->actor.world.pos.y) < 40.0f)) {
+ this->unk_2C0 = 1;
+ }
+
+ if (this->unk_2C0 != 0) {
+ Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.5f, 2.0f);
+ }
+
+ if ((this->unk_2C0 != 0) && !(this->actor.bgCheckFlags & 1)) {
+ func_80C01B40(this);
+ }
+}
+
+void func_80C01B40(EnBomjimb* this) {
+ func_80C012E0(this);
+ this->unk_2CA = 0;
+ this->actionFunc = func_80C01B74;
+}
+
+void func_80C01B74(EnBomjimb* this, GlobalContext* globalCtx) {
+ Math_ApproachF(&this->actor.speedXZ, 6.0f, 0.5f, 2.0f);
+ if ((this->collider.base.acFlags & AC_HIT) || (this->actor.bgCheckFlags & 1)) {
+ this->collider.base.acFlags &= ~AC_HIT;
+ if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
+ ((EnNiw*)this->unk_2E4)->unk2BC.z = 90000.0f;
+ }
+ this->actor.speedXZ = 0.0f;
+ this->unk_2E4 = NULL;
+ this->actor.gravity = -2.0f;
+ func_80C02108(this);
+ }
+}
+
+void func_80C01C18(EnBomjimb* this, GlobalContext* globalCtx) {
+ func_80C012E0(this);
+ if (this->unk_2E4 != NULL) {
+ if (this->unk_2E4->update != NULL) {
+ this->unk_2E4->velocity.y = 8.0f;
+ this->unk_2E4->shape.rot.z = BINANG_SUB(4000, ((s16)(globalCtx->gameplayFrames & 2) * 4000));
+ this->unk_294.x = this->unk_2E4->world.pos.x;
+ this->unk_294.y = this->actor.world.pos.y;
+ this->unk_294.z = this->unk_2E4->world.pos.z;
+ }
+ }
+ this->actor.speedXZ = 0.0f;
+ this->unk_2CA = 2;
+ this->actionFunc = func_80C01CD0;
+}
+
+void func_80C01CD0(EnBomjimb* this, GlobalContext* globalCtx) {
+ f32 sp3C = this->skelAnime.curFrame;
+ s32 pad[2];
+
+ if ((this->unk_2E4 != NULL) && ((this->unk_2E4->update == NULL) || Actor_HasParent(this->unk_2E4, globalCtx))) {
+ this->actor.draw = EnBomjimb_Draw;
+ D_80C03170 = NULL;
+ this->unk_2E4 = NULL;
+ func_80C02108(this);
+ return;
+ }
+
+ if (this->unk_2DC != 7) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_294), 1, 3000,
+ 0);
+ Math_ApproachF(&this->actor.world.pos.x, this->unk_294.x, 0.3f, 2.0f);
+ Math_ApproachF(&this->actor.world.pos.z, this->unk_294.z, 0.3f, 2.0f);
+ if (sqrtf(SQ(this->actor.world.pos.x - this->unk_294.x) + SQ(this->actor.world.pos.z - this->unk_294.z)) <
+ 3.0f) {
+ func_80C0113C(this, 7, 1.0f);
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_294);
+ }
+ } else if (this->unk_2B8 <= sp3C) {
+ this->actor.draw = NULL;
+ }
+
+ if ((this->unk_2C0 == 0) && (this->unk_2E4->bgCheckFlags & 1)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_PUT_DOWN_WOODBOX);
+ this->unk_2C0 = 1;
+ }
+
+ if (this->unk_2AE == 0) {
+ if (this->actor.draw == NULL) {
+ this->unk_2AE = Rand_S16Offset(20, 30);
+ this->unk_2E4->shape.rot.z = 1000;
+ return;
+ }
+
+ this->unk_2AE = 10;
+ if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
+ if ((globalCtx->gameplayFrames % 16) == 0) {
+ this->unk_2E4->shape.rot.z = -this->unk_2E4->shape.rot.z;
+ this->unk_2E4->shape.rot.z *= 0.1f;
+ }
+
+ if (fabsf(this->unk_2E4->shape.rot.z) < 100.0f) {
+ this->unk_2E4->shape.rot.z = 0;
+ }
+ }
+ return;
+ }
+
+ if (this->actor.draw == 0) {
+ this->unk_2E4->shape.rot.z = -this->unk_2E4->shape.rot.z;
+ this->unk_2E4->shape.rot.z *= 0.1f;
+ if (fabsf(this->unk_2E4->shape.rot.z) < 100.0f) {
+ this->unk_2E4->shape.rot.z = 0;
+ }
+ }
+}
+
+void func_80C01FD4(EnBomjimb* this) {
+ this->actor.textId = 0x72D;
+ func_80C0113C(this, 9, 1.0f);
+ this->unk_2CA = 4;
+ this->actionFunc = func_80C0201C;
+}
+
+void func_80C0201C(EnBomjimb* this, GlobalContext* globalCtx) {
+ s16 abs = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.world.rot.y));
+
+ this->unk_290 = 0;
+ if ((this->actor.xzDistToPlayer < 200.0f) && (abs < 0x61A8)) {
+ this->unk_290 = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
+ if (this->unk_290 > 10000) {
+ this->unk_290 = 10000;
+ } else if (this->unk_290 < -10000) {
+ this->unk_290 = -10000;
+ }
+ }
+
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_2CA = 10;
+ this->actionFunc = func_80C02A14;
+ } else {
+ func_800B8614(&this->actor, globalCtx, 40.0f);
+ }
+}
+
+void func_80C02108(EnBomjimb* this) {
+ func_80C0113C(this, 6, 1.0f);
+ this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ func_80C012E0(this);
+ Math_Vec3f_Copy(&this->unk_2A0, &this->actor.world.pos);
+ this->unk_2D4 = 0;
+ this->unk_2CA = 5;
+ this->actionFunc = func_80C0217C;
+}
+
+void func_80C0217C(EnBomjimb* this, GlobalContext* globalCtx) {
+ Vec3f sp74;
+ CollisionPoly* sp70;
+ Vec3f sp64;
+ s32 sp60;
+ s32 sp5C = this->actor.floorBgId;
+ CollisionPoly* sp58 = this->actor.floorPoly;
+ Player* player = GET_PLAYER(globalCtx);
+ s32 sp50 = false;
+
+ if (func_80C012FC(this, globalCtx) || func_80C013B4(this) || func_80C013F0(this, globalCtx)) {
+ return;
+ }
+
+ if (player->stateFlags3 == 0x1000000) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 3000, 0);
+ func_80C01494(this);
+ return;
+ }
+
+ if (this->unk_2DC == 6) {
+ f32 curFrame = this->skelAnime.curFrame;
+
+ if (this->unk_2B8 <= curFrame) {
+ func_80C0113C(this, 19, 2.0f);
+ }
+ return;
+ }
+
+ Math_ApproachF(&this->actor.speedXZ, 8.0f, 0.5f, 2.0f);
+ Math_Vec3f_Copy(&sp74, &this->actor.world.pos);
+
+ sp74.x += Math_SinS(this->actor.world.rot.y) * 50.0f;
+ sp74.y += 20.0f;
+ sp74.z += Math_CosS(this->actor.world.rot.y) * 50.0f;
+
+ if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp74, &sp64, &sp70, 1, 0, 0, 1, &sp60)) {
+ s16 temp = BINANG_SUB((this->actor.world.rot.y - this->actor.yawTowardsPlayer), 0x8000);
+ this->unk_2D6 = temp;
+
+ if (temp < 0) {
+ this->unk_2D6 += BINANG_ADD((s32)Rand_ZeroFloat(0x200), 0x4000);
+ if (this->unk_2D0 != 0) {
+ this->unk_2D6 += BINANG_ADD((s32)Rand_ZeroFloat(0x200), 0x4000);
+ }
+ this->unk_2D0 = 1;
+ } else {
+ this->unk_2D6 -= BINANG_ADD((s32)Rand_ZeroFloat(0x200), 0x4000);
+ if (this->unk_2D0 != 0) {
+ this->unk_2D6 -= BINANG_ADD((s32)Rand_ZeroFloat(0x200), 0x4000);
+ }
+ this->unk_2D0 = 1;
+ }
+ sp50 = true;
+ }
+
+ if (!sp50) {
+ this->unk_2D0 = 0;
+ if (this->actor.xzDistToPlayer < 60.0f) {
+ this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
+ }
+ }
+
+ this->actor.world.rot.y = this->unk_2D6 + this->unk_2D4;
+
+ if (SurfaceType_GetSceneExitIndex(&globalCtx->colCtx, sp58, sp5C)) {
+ s16 temp = BINANG_SUB(this->actor.world.rot.y, this->actor.yawTowardsPlayer - 0x8000);
+
+ if (temp < 0) {
+ this->unk_2D4 -= 0x1000;
+ } else {
+ this->unk_2D4 += 0x1000;
+ }
+ this->actor.world.rot.y = this->unk_2D6 + this->unk_2D4;
+ return;
+ }
+
+ this->unk_2D4 = 0;
+ if (!sp50 && (this->actor.xzDistToPlayer > 200.0f)) {
+ func_80C0250C(this);
+ }
+}
+
+void func_80C0250C(EnBomjimb* this) {
+ func_80C0113C(this, 15, 1.0f);
+ this->unk_2D4 = 0;
+ this->actor.speedXZ = 0.0f;
+ this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
+ func_80C012E0(this);
+ this->unk_2CA = 6;
+ this->actionFunc = func_80C02570;
+}
+
+void func_80C02570(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (func_80C012FC(this, globalCtx) || func_80C013B4(this) || func_80C013F0(this, globalCtx)) {
+ return;
+ }
+
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 5000, 0);
+
+ if (this->actor.xzDistToPlayer < 200.0f) {
+ this->unk_2D6 = BINANG_ROT180(this->actor.yawTowardsPlayer);
+ func_80C0113C(this, 19, 2.0f);
+ this->actionFunc = func_80C0217C;
+ } else if ((player->stateFlags3 == 0x1000000) || (this->actor.xzDistToPlayer > 410.0f)) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 3000, 0);
+ func_80C01494(this);
+ }
+}
+
+void func_80C0267C(EnBomjimb* this) {
+ func_80C012E0(this);
+ func_80C0113C(this, 8, 1.0f);
+ this->actor.speedXZ = 0.0f;
+ this->actor.world.rot.y = this->actor.yawTowardsPlayer;
+ this->unk_2AE = 40;
+ this->unk_2C2 = 0;
+ this->unk_2C4 = (s32)Rand_ZeroFloat(60.0f) + 20;
+ this->unk_2CA = 7;
+ this->actionFunc = func_80C02704;
+}
+
+void func_80C02704(EnBomjimb* this, GlobalContext* globalCtx) {
+ if (!func_80C012FC(this, globalCtx) && (this->unk_2AE == 0)) {
+ func_80C0250C(this);
+ }
+}
+
+void func_80C02740(EnBomjimb* this, GlobalContext* globalCtx) {
+ static u16 D_80C03230[] = {
+ 0x0721, 0x0722, 0x0723, 0x0724, 0x072C,
+ };
+ Player* player = GET_PLAYER(globalCtx);
+ s16 idx;
+
+ func_80C012E0(this);
+ func_80C0113C(this, 21, 1.0f);
+ if ((player->transformation != PLAYER_FORM_DEKU) && (player->transformation != PLAYER_FORM_HUMAN)) {
+ func_80C0113C(this, 17, 1.0f);
+ func_801518B0(globalCtx, 0x72E, &this->actor);
+ player->stateFlags1 |= 0x10000000;
+ player->actor.freezeTimer = 3;
+ func_80C012E0(this);
+ this->unk_2CA = 9;
+ this->actionFunc = func_80C02BCC;
+ return;
+ }
+
+ if (((player->transformation == PLAYER_FORM_DEKU) && !(gSaveContext.weekEventReg[73] & 0x10)) ||
+ ((player->transformation == PLAYER_FORM_HUMAN) && !(gSaveContext.weekEventReg[85] & 2))) {
+ func_80C0113C(this, 17, 1.0f);
+ func_801518B0(globalCtx, 0x72E, &this->actor);
+ player->stateFlags1 |= 0x10000000;
+ player->actor.freezeTimer = 3;
+ func_80C012E0(this);
+ this->unk_2CA = 9;
+ this->actionFunc = func_80C02BCC;
+ return;
+ }
+
+ idx = gSaveContext.unk_FE6;
+ func_801518B0(globalCtx, D_80C03230[idx], &this->actor);
+ idx = gSaveContext.unk_FE6;
+ gSaveContext.unk_FE7[idx] = this->unk_2C8 + 1;
+ gSaveContext.unk_FE6++;
+
+ if (gSaveContext.unk_FE6 > 4) {
+ func_801A3098(0x922);
+ } else {
+ Audio_PlayActorSound2(&this->actor, NA_SE_SY_PIECE_OF_HEART);
+ }
+
+ switch (this->unk_2C8) {
+ case ENBOMJIMB_F_0:
+ gSaveContext.weekEventReg[76] |= 1;
+ gSaveContext.weekEventReg[11] |= 1;
+ break;
+
+ case ENBOMJIMB_F_1:
+ gSaveContext.weekEventReg[76] |= 2;
+ gSaveContext.weekEventReg[11] |= 2;
+ break;
+
+ case ENBOMJIMB_F_2:
+ gSaveContext.weekEventReg[76] |= 4;
+ gSaveContext.weekEventReg[11] |= 4;
+ break;
+
+ case ENBOMJIMB_F_3:
+ gSaveContext.weekEventReg[76] |= 8;
+ gSaveContext.weekEventReg[11] |= 8;
+ break;
+
+ case ENBOMJIMB_F_4:
+ gSaveContext.weekEventReg[76] |= 0x10;
+ gSaveContext.weekEventReg[11] |= 0x10;
+ break;
+ }
+
+ if (!func_801690CC(globalCtx)) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ player->stateFlags1 |= 0x10000000;
+ player->actor.freezeTimer = 3;
+ }
+ this->unk_2CA = 8;
+ this->actionFunc = func_80C02A14;
+}
+
+void func_80C02A14(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ f32 curFrame = this->skelAnime.curFrame;
+
+ if (this->unk_2DC == 21) {
+ player->actor.freezeTimer = 3;
+ if (this->unk_2B8 <= curFrame) {
+ func_80C0113C(this, 9, 1.0f);
+ }
+ return;
+ }
+
+ if ((this->unk_2CA == 8) && (this->unk_2DC == 9)) {
+ player->actor.freezeTimer = 3;
+ if (this->unk_2E0 == 0) {
+ if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_HUMAN_BOUND);
+ this->unk_2E0 = 1;
+ }
+ }
+ }
+
+ if ((this->unk_2DC == 15) && (this->unk_2CA == 8)) {
+ player->actor.freezeTimer = 3;
+ }
+
+ if ((func_80152498(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
+ func_801477B4(globalCtx);
+ if ((this->unk_2CA == 8) && (gSaveContext.unk_FE6 >= 5)) {
+ func_80C02CA4(this, globalCtx);
+ } else {
+ if (this->unk_2CA == 8) {
+ player->stateFlags1 &= ~0x10000000;
+ }
+ func_80C01FD4(this);
+ }
+ }
+}
+
+void func_80C02BCC(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 5000, 0);
+ if (this->unk_2C0 == 0) {
+ player->actor.freezeTimer = 3;
+ if ((func_80152498(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
+ func_801477B4(globalCtx);
+ this->unk_2C0 = 1;
+ player->stateFlags1 &= ~0x10000000;
+ }
+ } else if (this->actor.xzDistToPlayer > 200.0f) {
+ func_80C01494(this);
+ }
+}
+
+void func_80C02CA4(EnBomjimb* this, GlobalContext* globalCtx) {
+ if (BREG(13) == 0) {
+ globalCtx->nextEntranceIndex = globalCtx->setupExitList[this->unk_2B2];
+ gSaveContext.nextCutsceneIndex = 0;
+ Scene_SetExitFade(globalCtx);
+ globalCtx->sceneLoadFlag = 0x14;
+ } else {
+ globalCtx->nextEntranceIndex = Entrance_CreateIndexFromSpawn(5);
+ gSaveContext.nextCutsceneIndex = 0;
+ globalCtx->sceneLoadFlag = 0x14;
+ globalCtx->unk_1887F = 0x56;
+ gSaveContext.nextTransition = 3;
+ }
+ gSaveContext.weekEventReg[75] |= 0x40;
+ gSaveContext.weekEventReg[83] |= 4;
+ this->actionFunc = func_80C02DAC;
+}
+
+void func_80C02DAC(EnBomjimb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ player->actor.freezeTimer = 3;
+}
+
+void EnBomjimb_Update(Actor* thisx, GlobalContext* globalCtx2) {
+ GlobalContext* globalCtx = globalCtx2;
+ EnBomjimb* this = THIS;
+
+ if (this->unk_2B0 != 0) {
+ this->unk_2B0--;
+ }
+
+ if (this->unk_2AE != 0) {
+ this->unk_2AE--;
+ }
+
+ if (this->unk_2AC != 0) {
+ this->unk_2AC--;
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ func_80C011CC(this);
+ Actor_SetHeight(&this->actor, 20.0f);
+
+ this->actionFunc(this, globalCtx);
+
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+
+ if (this->unk_2CA == 0) {
+ if ((this->unk_2E4 != NULL) && (this->unk_2E4->update != NULL)) {
+ Math_Vec3f_Copy(&this->unk_2E4->world.pos, &this->actor.world.pos);
+ if (this->actor.bgCheckFlags & 1) {
+ this->unk_2E4->world.pos.y = this->actor.world.pos.y + 35.0f;
+ } else {
+ this->unk_2E4->world.pos.y = this->actor.world.pos.y + 25.0f;
+ }
+ }
+ }
+
+ Math_SmoothStepToS(&this->unk_28A, this->unk_290, 1, 5000, 0);
+
+ if (this->unk_2C4 == 0) {
+ this->unk_2C2++;
+ if (this->unk_2C2 > 2) {
+ this->unk_2C2 = 0;
+ this->unk_2C4 = (s16)Rand_ZeroFloat(60.0f) + 20;
+ }
+ }
+
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+
+ if (this->unk_2CA != 2) {
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+}
+
+s32 EnBomjimb_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ EnBomjimb* this = THIS;
+
+ if (limbIndex == 15) {
+ *dList = NULL;
+ }
+
+ if (limbIndex == 17) {
+ rot->x += this->unk_28A;
+ rot->z += this->unk_288;
+ }
+
+ if ((limbIndex == 19) && (this->unk_2C8 != ENBOMJIMB_F_0)) {
+ *dList = NULL;
+ }
+
+ if ((limbIndex == 20) && (this->unk_2C8 == ENBOMJIMB_F_0)) {
+ *dList = NULL;
+ }
+
+ return false;
+}
+
+#include "overlays/ovl_En_Bomjimb/ovl_En_Bomjimb.c"
+
+void EnBomjimb_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ static Gfx* D_80C03260[] = {
+ gEnBomjimb_D_80C03240, gEnBomjimb_D_80C03250, gEnBomjimb_D_80C03250,
+ gEnBomjimb_D_80C03250, gEnBomjimb_D_80C03250,
+ };
+ static TexturePtr D_80C03274[] = {
+ &object_cs_Tex_00C520,
+ &object_cs_Tex_00CD20,
+ &object_cs_Tex_00D520,
+ };
+ static TexturePtr D_80C03280[] = {
+ &object_cs_Tex_00E620, &object_cs_Tex_00EA20, &object_cs_Tex_00EE20,
+ &object_cs_Tex_00DD20, &object_cs_Tex_00F220,
+ };
+ EnBomjimb* this = THIS;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C28C(globalCtx->state.gfxCtx);
+ func_8012C2DC(globalCtx->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]));
+ gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(D_80C03260[this->unk_2C8]));
+
+ Scene_SetRenderModeXlu(globalCtx, 0, 1);
+ SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ EnBomjimb_OverrideLimbDraw, NULL, &this->actor);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
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 664b34224c..7a961461c8 100644
--- a/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
+++ b/src/overlays/actors/ovl_En_Bomjimb/z_en_bomjimb.h
@@ -7,11 +7,58 @@ struct EnBomjimb;
typedef void (*EnBomjimbActionFunc)(struct EnBomjimb*, GlobalContext*);
+#define ENBOMJIMB_GET_F(thisx) ((thisx)->params & 0xF)
+#define ENBOMJIMB_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
+#define ENBOMJIMB_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+
+enum {
+ /* 0 */ ENBOMJIMB_F_0,
+ /* 1 */ ENBOMJIMB_F_1,
+ /* 2 */ ENBOMJIMB_F_2,
+ /* 3 */ ENBOMJIMB_F_3,
+ /* 4 */ ENBOMJIMB_F_4,
+};
+
+enum {
+ /* 0 */ ENBOMJIMB_F0_0,
+ /* 1 */ ENBOMJIMB_F0_1,
+ /* 2 */ ENBOMJIMB_F0_2,
+};
+
typedef struct EnBomjimb {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x140];
- /* 0x0284 */ EnBomjimbActionFunc actionFunc;
- /* 0x0288 */ char unk_288[0xAC];
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ Vec3s jointTable[21];
+ /* 0x206 */ Vec3s morphTable[21];
+ /* 0x284 */ EnBomjimbActionFunc actionFunc;
+ /* 0x288 */ s16 unk_288;
+ /* 0x28A */ s16 unk_28A;
+ /* 0x28C */ UNK_TYPE1 unk28C[4];
+ /* 0x290 */ s16 unk_290;
+ /* 0x294 */ Vec3f unk_294;
+ /* 0x2A0 */ Vec3f unk_2A0;
+ /* 0x2AC */ s16 unk_2AC;
+ /* 0x2AE */ s16 unk_2AE;
+ /* 0x2B0 */ s16 unk_2B0;
+ /* 0x2B2 */ s16 unk_2B2;
+ /* 0x2B4 */ f32 unk_2B4;
+ /* 0x2B8 */ f32 unk_2B8;
+ /* 0x2BC */ UNK_TYPE1 unk2BC[4];
+ /* 0x2C0 */ s16 unk_2C0;
+ /* 0x2C2 */ s16 unk_2C2;
+ /* 0x2C4 */ s16 unk_2C4;
+ /* 0x2C6 */ s16 unk_2C6;
+ /* 0x2C8 */ s16 unk_2C8;
+ /* 0x2CA */ s16 unk_2CA;
+ /* 0x2CC */ s16 unk_2CC;
+ /* 0x2D0 */ s32 unk_2D0;
+ /* 0x2D4 */ s16 unk_2D4;
+ /* 0x2D6 */ s16 unk_2D6;
+ /* 0x2D8 */ UNK_TYPE1 unk2D8[4];
+ /* 0x2DC */ s32 unk_2DC;
+ /* 0x2E0 */ u8 unk_2E0;
+ /* 0x2E4 */ Actor* unk_2E4;
+ /* 0x2E8 */ ColliderCylinder collider;
} EnBomjimb; // size = 0x334
extern const ActorInit En_Bomjimb_InitVars;
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 8f14b6c678..b84feb51a2 100644
--- a/src/overlays/actors/ovl_En_Dai/z_en_dai.c
+++ b/src/overlays/actors/ovl_En_Dai/z_en_dai.c
@@ -591,7 +591,7 @@ s32 func_80B3F598(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* p
}
if (limbIndex == 11) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &this->unk_1E4);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &this->unk_1E4);
}
if (limbIndex == 10) {
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 1ab2c9654b..69d2fc9d63 100644
--- a/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
+++ b/src/overlays/actors/ovl_En_Dekunuts/z_en_dekunuts.c
@@ -547,7 +547,7 @@ void func_808BE4D4(EnDekunuts* this, GlobalContext* globalCtx) {
sp40.x = this->actor.world.pos.x;
sp40.y = this->actor.world.pos.y + 18.0f;
sp40.z = this->actor.world.pos.z;
- EffectSsDeadDb_Spawn(globalCtx, &sp40, &D_801D15B0, &D_801D15B0, &D_808BEF90, &D_808BEF94, 200, 0, 13);
+ EffectSsDeadDb_Spawn(globalCtx, &sp40, &gZeroVec3f, &gZeroVec3f, &D_808BEF90, &D_808BEF94, 200, 0, 13);
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
sp40.y = this->actor.world.pos.y + 10.0f;
EffectSsHahen_SpawnBurst(globalCtx, &sp40, 3.0f, 0, 12, 3, 15, HAHEN_OBJECT_DEFAULT, 10, NULL);
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 bf0f977b74..f82295874b 100644
--- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
+++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c
@@ -278,7 +278,7 @@ static InitChainEntry sInitChain[] = {
void EnDinofos_Init(Actor* thisx, GlobalContext* globalCtx) {
static s32 D_8089E364 = 0;
- static EffBlureInit2 D_8089E368 = {
+ static EffectBlureInit2 D_8089E368 = {
0, 8, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, 8,
0, 2, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
};
@@ -288,7 +288,7 @@ void EnDinofos_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, func_800B42F8, 90.0f);
- Effect_Add(globalCtx, &this->unk_2A0, 2, 0, 0, &D_8089E368);
+ Effect_Add(globalCtx, &this->unk_2A0, EFFECT_BLURE2, 0, 0, &D_8089E368);
Collider_InitAndSetJntSph(globalCtx, &this->colliderJntSph, &this->actor, &sJntSphInit,
this->colliderJntSphElement);
Collider_InitAndSetQuad(globalCtx, &this->colliderQuad, &this->actor, &sQuadInit);
@@ -936,7 +936,7 @@ void func_8089C56C(EnDinofos* this, GlobalContext* globalCtx) {
Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0x800);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (SkelAnime_Update(&this->skelAnime)) {
- func_800A8514(Effect_GetParams(this->unk_2A0));
+ EffectBlure_AddSpace(Effect_GetByIndex(this->unk_2A0));
this->colliderQuad.base.atFlags &= ~AT_ON;
func_8089A9B0(this, globalCtx);
} else if (Animation_OnFrame(&this->skelAnime, 7.0f)) {
@@ -1454,7 +1454,7 @@ void func_8089DC84(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
Matrix_MultiplyVector3fByState(&D_8089E398, &sp5C);
Collider_SetQuadVertices(&this->colliderQuad, &sp5C, &sp68, &sp74, &sp80);
if (this->colliderQuad.base.atFlags & AT_ON) {
- func_800A81F0(Effect_GetParams(this->unk_2A0), &sp68, &sp5C);
+ EffectBlure_AddVertex(Effect_GetByIndex(this->unk_2A0), &sp68, &sp5C);
}
this->unk_292 = this->unk_290;
}
@@ -1475,7 +1475,7 @@ void func_8089DC84(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
sp4C.x -= sp48->mf[3][0];
sp4C.y -= sp48->mf[3][1];
sp4C.z -= sp48->mf[3][2];
- EffectSsDFire_Spawn(globalCtx, &this->unk_34C, &sp4C, &D_801D15B0, 30, 22, 255 - (sp58 * 20), 20, 3, 8);
+ EffectSsDFire_Spawn(globalCtx, &this->unk_34C, &sp4C, &gZeroVec3f, 30, 22, 255 - (sp58 * 20), 20, 3, 8);
this->unk_292 = this->unk_290;
}
}
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 be0f95eb93..7e4b67b7c3 100644
--- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
+++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c
@@ -47,7 +47,7 @@ void func_80A4FDD0(EnDnbParticle* particle, EnDnb* this, s16* alloc, s32 idx) {
particle->unk_00 = sp1C;
particle->unk_0C = sp1C;
particle->unk_24 = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp1C);
- particle->unk_18 = D_801D15BC;
+ particle->unk_18 = gZeroVec3s;
}
s32 func_80A4FEBC(EnDnbParticle* particle, f32 arg1) {
@@ -76,7 +76,7 @@ void func_80A4FFE8(EnDnbParticle* particle, s16 arg1) {
particle->unk_1E.x = (Rand_ZeroOne() - 0.5f) * 400.0f;
particle->unk_1E.y = (Rand_ZeroOne() - 0.5f) * 400.0f;
particle->unk_1E.z = (Rand_ZeroOne() - 0.5f) * 400.0f;
- particle->unk_18 = D_801D15BC;
+ particle->unk_18 = gZeroVec3s;
particle->unk_30 = 40.0f;
particle->unk_2C = 0.0f;
particle->unk_26 = arg1;
@@ -86,7 +86,7 @@ void func_80A4FFE8(EnDnbParticle* particle, s16 arg1) {
s32 func_80A500F8(EnDnb* this) {
static Vec3f D_80A50CB0 = { 0.0f, 0.0f, 1000.0f };
Actor* actor = &this->dyna.actor;
- Vec3f spA8 = D_801D15B0;
+ Vec3f spA8 = gZeroVec3f;
Vec3f sp9C;
s32 i;
f32 temp_f20;
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 7fd5c84b8f..8a6c3a5833 100644
--- a/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
+++ b/src/overlays/actors/ovl_En_Dnk/z_en_dnk.c
@@ -283,7 +283,7 @@ s32 func_80A51A78(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* p
void func_80A51AA4(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnDnk* this = THIS;
MtxF sp5C;
- Vec3f sp50 = D_801D15B0;
+ Vec3f sp50 = gZeroVec3f;
Vec3f sp44;
Vec3s sp3C;
@@ -359,7 +359,7 @@ s32 func_80A51D78(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* p
void func_80A51DA4(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnDnk* this = THIS;
MtxF sp5C;
- Vec3f sp50 = D_801D15B0;
+ Vec3f sp50 = gZeroVec3f;
Vec3f sp44;
Vec3s sp3C;
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 5a6b883685..2e82973da5 100644
--- a/src/overlays/actors/ovl_En_Dno/z_en_dno.c
+++ b/src/overlays/actors/ovl_En_Dno/z_en_dno.c
@@ -6,6 +6,7 @@
#include "z_en_dno.h"
#include "overlays/actors/ovl_Bg_Crace_Movebg/z_bg_crace_movebg.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000039
@@ -1015,7 +1016,7 @@ void EnDno_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Ve
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, -frames * 20, 0x20, 0x80));
gDPSetPrimColor(&gfxXlu[2], 0x80, 0x80, 255, 255, 0, 255);
gDPSetEnvColor(&gfxXlu[3], 255, 0, 0, 0);
- gSPDisplayList(&gfxXlu[4], D_0407D590);
+ gSPDisplayList(&gfxXlu[4], gGameplayKeepDrawFlameDL);
POLY_XLU_DISP = gfxXlu + 5;
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 8e0bbbaab2..f3753c978a 100644
--- a/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
+++ b/src/overlays/actors/ovl_En_Dnp/z_en_dnp.c
@@ -435,7 +435,7 @@ s32 func_80B3D974(s16 arg0, s16 arg1, Vec3f* arg2, Vec3s* arg3, s32 arg4, s32 ar
Vec3s sp6C;
MtxF sp2C;
- Matrix_MultiplyVector3fByState(&D_801D15B0, &sp74);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &sp74);
Matrix_CopyCurrentState(&sp2C);
func_8018219C(&sp2C, &sp6C, 0);
*arg2 = sp74;
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 e75f1aa461..97db5bcb68 100644
--- a/src/overlays/actors/ovl_En_Dns/z_en_dns.c
+++ b/src/overlays/actors/ovl_En_Dns/z_en_dns.c
@@ -284,11 +284,11 @@ s32 func_8092CCEC(EnDns* this, GlobalContext* globalCtx) {
Math_Vec3f_Copy(&sp30, &this->actor.world.pos);
Math_Vec3f_Copy(&sp3C, &player->actor.world.pos);
- this->unk_2D6 = Math_Vec3f_Yaw(&D_801D15B0, &sp3C);
- this->unk_2D4 = Math_Vec3f_Yaw(&D_801D15B0, &sp30);
- this->unk_2EC = Math_Vec3f_DistXZ(&sp30, &D_801D15B0);
- sp2E = Math_Vec3f_Yaw(&D_801D15B0, &sp3C);
- sp2E -= Math_Vec3f_Yaw(&D_801D15B0, &sp30);
+ this->unk_2D6 = Math_Vec3f_Yaw(&gZeroVec3f, &sp3C);
+ this->unk_2D4 = Math_Vec3f_Yaw(&gZeroVec3f, &sp30);
+ this->unk_2EC = Math_Vec3f_DistXZ(&sp30, &gZeroVec3f);
+ sp2E = Math_Vec3f_Yaw(&gZeroVec3f, &sp3C);
+ sp2E -= Math_Vec3f_Yaw(&gZeroVec3f, &sp30);
this->unk_2D8 = (Rand_ZeroOne() * 182.0f) + 182.0f;
this->unk_2D8 = (sp2E > 0) ? this->unk_2D8 : -this->unk_2D8;
this->unk_2D0 = 0x28;
@@ -413,7 +413,7 @@ void EnDns_DoNothing(EnDns* this, GlobalContext* globalCtx) {
void func_8092D330(EnDns* this, GlobalContext* globalCtx) {
s32 pad;
- Vec3f sp30 = D_801D15B0;
+ Vec3f sp30 = gZeroVec3f;
s16 temp = this->unk_2D6 - this->unk_2D4;
if (ABS_ALT(temp) < 0xC16) {
@@ -549,7 +549,7 @@ s32 func_8092D954(s16 arg0, s16 arg1, Vec3f* arg2, Vec3s* arg3, s32 arg4, s32 ar
Vec3s sp6C;
MtxF sp2C;
- Matrix_MultiplyVector3fByState(&D_801D15B0, &sp74);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &sp74);
Matrix_CopyCurrentState(&sp2C);
func_8018219C(&sp2C, &sp6C, 0);
*arg2 = sp74;
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 693ea4ec4f..fe92a5b1f9 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -288,7 +288,7 @@ static InitChainEntry sInitChain[] = {
};
void EnDodongo_Init(Actor* thisx, GlobalContext* globalCtx) {
- static EffBlureInit2 D_80879308 = {
+ static EffectBlureInit2 D_80879308 = {
2, 8, 0, { 255, 255, 255, 255 }, { 255, 255, 255, 64 }, { 255, 255, 255, 0 }, { 255, 255, 255, 0 }, 8,
0, 0, 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
};
@@ -315,7 +315,7 @@ void EnDodongo_Init(Actor* thisx, GlobalContext* globalCtx) {
this->collider2.elements[i].info.bumper.dmgFlags = 0x77C34FE6;
}
- Effect_Add(globalCtx, &this->unk_338, 2, 0, 0, &D_80879308);
+ Effect_Add(globalCtx, &this->unk_338, EFFECT_BLURE2, 0, 0, &D_80879308);
if (this->actor.params == 0) {
Actor_SetScale(&this->actor, 3.0f / 160.0f);
this->unk_334 = 1.0f;
@@ -384,7 +384,7 @@ void func_80876930(EnDodongo* this, GlobalContext* globalCtx, Vec3f* arg2) {
sp88.z = randPlusMinusPoint5Scaled(temp3) + arg2->z;
D_8087933C.x = randPlusMinusPoint5Scaled(2.0f);
D_8087933C.z = randPlusMinusPoint5Scaled(2.0f);
- func_800B0DE0(globalCtx, &sp88, &D_801D15B0, &D_8087933C, sp80, sp7C, temp1, temp2);
+ func_800B0DE0(globalCtx, &sp88, &gZeroVec3f, &D_8087933C, sp80, sp7C, temp1, temp2);
}
}
@@ -780,13 +780,13 @@ void func_80877E60(EnDodongo* this, GlobalContext* globalCtx) {
sp5E = this->unk_334 * 50.0f;
sp5C = this->unk_334 * 5.0f;
Math_Vec3f_Copy(&sp64, &this->unk_348[0]);
- func_800B0DE0(globalCtx, &sp64, &D_801D15B0, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
+ func_800B0DE0(globalCtx, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
sp64.x -= Math_CosS(this->actor.shape.rot.y) * 6.0f * this->unk_334;
sp64.z += Math_SinS(this->actor.shape.rot.y) * 6.0f * this->unk_334;
- func_800B0DE0(globalCtx, &sp64, &D_801D15B0, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
+ func_800B0DE0(globalCtx, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
sp64.x = (2.0f * this->unk_348[0].x) - sp64.x;
sp64.z = (2.0f * this->unk_348[0].z) - sp64.z;
- func_800B0DE0(globalCtx, &sp64, &D_801D15B0, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
+ func_800B0DE0(globalCtx, &sp64, &gZeroVec3f, &D_80879360, &D_8087936C, &D_8087936C, sp5E, sp5C);
}
}
@@ -1099,7 +1099,7 @@ void EnDodongo_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList
}
if ((limbIndex == 30) && (this->actionFunc == func_80878424) && (this->timer != this->unk_304)) {
- func_800A81F0(Effect_GetParams(this->unk_338), &this->unk_320, &this->unk_348[4]);
+ EffectBlure_AddVertex(Effect_GetByIndex(this->unk_338), &this->unk_320, &this->unk_348[4]);
this->unk_304 = this->timer;
}
}
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 1af159e0ba..112892a38e 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -15,16 +15,25 @@ void EnElf_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnElf_Update(Actor* thisx, GlobalContext* globalCtx);
void EnElf_Draw(Actor* thisx, GlobalContext* globalCtx);
+void EnElf_SetupAction(EnElf* this, EnElfActionFunc actionFunc);
+void func_8088C9CC(EnElf* this, GlobalContext* globalCtx);
+void func_8088D3EC(EnElf* this, GlobalContext* globalCtx);
+void func_8088D470(EnElf* this, GlobalContext* globalCtx);
+void func_8088D504(EnElf* this, GlobalContext* globalCtx);
void func_8088DD34(EnElf* this, GlobalContext* globalCtx);
void func_8088E018(EnElf* this, GlobalContext* globalCtx);
void func_8088E0E0(EnElf* this, GlobalContext* globalCtx);
void func_8088E0F0(EnElf* this, GlobalContext* globalCtx);
void func_8088E484(EnElf* this, GlobalContext* globalCtx);
void func_8088E850(EnElf* this, GlobalContext* globalCtx);
+void func_8088EFA4(EnElf* this, GlobalContext* globalCtx);
+void func_8088F214(EnElf* this, GlobalContext* globalCtx);
+void func_8088F5F4(EnElf* this, GlobalContext* globalCtx, s32 arg2);
+void func_8089010C(Actor* thisx, GlobalContext* globalCtx);
+void func_808908D0(Vec3f* arg0, GlobalContext* globalCtx, u32 arg2);
-void EnElf_SetupAction(EnElf* this, EnElfActionFunc actionFunc);
+extern SkeletonHeader D_0402AF58;
-#if 0
const ActorInit En_Elf_InitVars = {
ACTOR_EN_ELF,
ACTORCAT_ITEMACTION,
@@ -37,96 +46,1592 @@ const ActorInit En_Elf_InitVars = {
(ActorFunc)EnElf_Draw,
};
-#endif
+static InitChainEntry sInitChain[] = {
+ ICHAIN_VEC3F_DIV1000(scale, 8, ICHAIN_STOP),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/EnElf_SetupAction.s")
+static Color_RGBAf sInnerColors[] = {
+ { 255.0f, 255.0f, 230.0f, 255.0f },
+ { 255.0f, 220.0f, 220.0f, 255.0f },
+ { 255.0f, 235.0f, 220.0f, 255.0f },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088C51C.s")
+static Color_RGBAf sOuterColors[] = {
+ { 220.0f, 160.0f, 80.0f, 255.0f },
+ { 255.0f, 50.0f, 100.0f, 255.0f },
+ { 255.0f, 150.0f, 0.0f, 255.0f },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088C804.s")
+typedef struct {
+ u8 r, g, b;
+} FairyColorFlags;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088C858.s")
+static FairyColorFlags sColorFlags[] = {
+ { 0, 0, 0 }, { 1, 0, 0 }, { 1, 2, 0 }, { 1, 0, 2 }, { 0, 1, 0 }, { 2, 1, 0 }, { 0, 1, 2 },
+ { 0, 0, 1 }, { 2, 0, 1 }, { 0, 2, 1 }, { 1, 1, 0 }, { 1, 0, 1 }, { 0, 1, 1 },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088C920.s")
+void EnElf_SetupAction(EnElf* this, EnElfActionFunc actionFunc) {
+ this->actionFunc = actionFunc;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088C9CC.s")
+void func_8088C51C(EnElf* this, s32 arg1) {
+ this->unk_244 = arg1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088CBAC.s")
+ switch (this->unk_244) {
+ case 0:
+ this->unk_24A = 0x400;
+ this->unk_24C = 0x200;
+ this->unk_26C = func_8088D3EC;
+ this->unk_25C = 0x64;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_250 = 5.0f;
+ this->unk_254 = 20.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088CC48.s")
+ case 10:
+ this->unk_24A = 0x400;
+ this->unk_24C = 0x200;
+ this->unk_26C = func_8088D3EC;
+ this->unk_25C = 0x64;
+ this->unk_250 = 1.0f;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_254 = 5.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088CD3C.s")
+ case 8:
+ this->unk_24A = 0x400;
+ this->unk_24C = 0;
+ this->unk_26C = func_8088D3EC;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_254 = 0.0f;
+ this->unk_250 = 5.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/EnElf_Init.s")
+ case 7:
+ this->unk_24A = 0x1000;
+ this->unk_24C = 0x200;
+ this->unk_26C = func_8088D3EC;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_250 = 3.0f;
+ this->unk_254 = 10.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/EnElf_Destroy.s")
+ case 5:
+ this->unk_26C = func_8088D3EC;
+ this->unk_24A = 0x1E;
+ this->unk_25C = 1;
+ this->unk_250 = 0.0f;
+ this->unk_254 = 0.0f;
+ this->skelAnime.playSpeed = 1.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D3EC.s")
+ case 6:
+ this->unk_24A = 0x1000;
+ this->unk_24C = 0x200;
+ this->unk_26C = func_8088D3EC;
+ this->unk_250 = 0.0f;
+ this->unk_254 = 0.0f;
+ this->skelAnime.playSpeed = 1.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D470.s")
+ case 1:
+ this->unk_24A = 0x1000;
+ this->unk_24C = 0x800;
+ this->unk_26C = func_8088D3EC;
+ this->unk_250 = 5.0f;
+ this->unk_254 = 7.5f;
+ this->skelAnime.playSpeed = 2.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D504.s")
+ case 2:
+ this->unk_24A = 0x400;
+ this->unk_24C = 0x1000;
+ this->unk_26C = func_8088D470;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_250 = 10.0f;
+ this->unk_254 = 20.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D5A0.s")
+ case 3:
+ this->unk_24C = 0x600;
+ this->unk_26C = func_8088D504;
+ this->unk_254 = 1.0f;
+ this->unk_250 = 1.0f;
+ this->skelAnime.playSpeed = 1.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D660.s")
+ case 4:
+ this->unk_24A = 0x1000;
+ this->unk_24C = 0x800;
+ this->unk_26C = func_8088D3EC;
+ this->unk_250 = 60.0f;
+ this->unk_254 = 20.0f;
+ this->skelAnime.playSpeed = 2.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D7F8.s")
+ case 9:
+ this->unk_24A = 0x400;
+ this->unk_24C = 0x2000;
+ this->unk_26C = func_8088D3EC;
+ this->unk_25C = 0x2A;
+ this->unk_254 = 1.0f;
+ this->skelAnime.playSpeed = 1.0f;
+ this->unk_250 = 5.0f;
+ break;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D864.s")
+s32 func_8088C804(Vec3f* arg0, Vec3f* arg1, f32 arg2) {
+ return SQ(arg2) < SQ(arg1->x - arg0->x) + SQ(arg1->z - arg0->z);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D8D0.s")
+void func_8088C858(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088D9BC.s")
+ if (!func_8088C804(&this->actor.world.pos, &player->actor.world.pos, 30.0f)) {
+ this->unk_254 = 0.5f;
+ } else {
+ this->unk_254 = 2.0f;
+ }
+ if (this->unk_25C > 0) {
+ this->unk_25C--;
+ } else {
+ this->unk_244 = 1;
+ this->unk_248 = 128;
+ this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
+ this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_26C = func_8088C9CC;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088DB4C.s")
+void func_8088C920(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088DCA4.s")
+ if (func_8088C804(&this->actor.world.pos, &player->actor.world.pos, 50.0f)) {
+ if (this->unk_25C > 0) {
+ this->unk_25C--;
+ } else {
+ this->unk_244 = 1;
+ this->unk_248 = 128;
+ this->unk_254 = Rand_ZeroFloat(1.0f) + 0.5f;
+ this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ this->unk_26C = func_8088C9CC;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088DD34.s")
+void func_8088C9CC(EnElf* this, GlobalContext* globalCtx) {
+ f32 xzDistToPlayer;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E018.s")
+ if (this->unk_25C > 0) {
+ this->unk_25C--;
+ } else {
+ xzDistToPlayer = this->actor.xzDistToPlayer;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E0E0.s")
+ if (xzDistToPlayer < 50.0f) {
+ if (Rand_ZeroOne() < 0.2f) {
+ this->unk_244 = 2;
+ this->unk_248 = 0x400;
+ this->unk_254 = 2.0f;
+ this->actor.speedXZ = 1.5f;
+ this->unk_26C = func_8088C920;
+ this->unk_25C = (s32)Rand_ZeroFloat(8.0f) + 4;
+ } else {
+ this->unk_25C = 10;
+ }
+ } else {
+ if (xzDistToPlayer > 150.0f) {
+ xzDistToPlayer = 150.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E0F0.s")
+ xzDistToPlayer = ((xzDistToPlayer - 50.0f) * 0.95f) + 0.05f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E304.s")
+ if (Rand_ZeroOne() < xzDistToPlayer) {
+ this->unk_244 = 3;
+ this->unk_248 = 0x200;
+ this->unk_254 = (2.0f * xzDistToPlayer) + 1.0f;
+ this->unk_26C = func_8088C858;
+ this->unk_25C = (s32)Rand_ZeroFloat(16.0f) + 16;
+ } else {
+ this->unk_25C = 10;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E484.s")
+ if (Rand_ZeroOne() < 0.1f) {
+ this->unk_244 = 1;
+ this->unk_248 = 128;
+ this->unk_254 = Rand_ZeroFloat(0.5f) + 0.5f;
+ this->unk_24C = randPlusMinusPoint5Scaled(0x7FFF);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E5A8.s")
+void func_8088CBAC(EnElf* this, GlobalContext* globalCtx) {
+ f32 phi_f0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E60C.s")
+ if (this->fairyFlags & 0x4000) {
+ phi_f0 = 0.0f;
+ } else {
+ phi_f0 = 100.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088E850.s")
+ if (func_8088C804(&this->unk_224, &this->actor.world.pos, phi_f0)) {
+ this->unk_244 = 0;
+ this->unk_248 = 0x200;
+ this->unk_254 = 1.5f;
+ this->unk_26C = func_8088C9CC;
+ } else {
+ this->unk_26C(this, globalCtx);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088EF18.s")
+void func_8088CC48(EnElf* this, GlobalContext* globalCtx) {
+ EnElf_SetupAction(this, func_8088DD34);
+ this->unk_250 = Rand_ZeroFloat(10.0f) + 10.0f;
+ 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_26C = func_8088C9CC;
+ func_8088CBAC(this, globalCtx);
+ this->unk_25C = 0;
+ this->disappearTimer = 240;
+ if ((this->fairyFlags & 0x400) && Actor_GetCollectibleFlag(globalCtx, this->unk_260)) {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088EFA4.s")
+f32 func_8088CD3C(s32 colorFlag) {
+ switch (colorFlag) {
+ case 1:
+ return Rand_ZeroFloat(55.0f) + 200.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088F214.s")
+ case 2:
+ return Rand_ZeroFloat(255.0f);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088F5F4.s")
+ return 0.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088F9E4.s")
+void EnElf_Init(Actor* thisx, GlobalContext* globalCtx2) {
+ GlobalContext* globalCtx = globalCtx2;
+ EnElf* this = THIS;
+ Player* player = GET_PLAYER(globalCtx);
+ s32 colorConfig;
+ s32 params;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088FA38.s")
+ Actor_ProcessInitChain(thisx, sInitChain);
+ SkelAnime_Init(globalCtx, &this->skelAnime, &D_0402AF58, &D_04029140, this->jointTable, this->morphTable, 7);
+ ActorShape_Init(&thisx->shape, 0.0f, NULL, 15.0f);
+ thisx->shape.shadowAlpha = 255;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088FC34.s")
+ Lights_PointGlowSetInfo(&this->lightInfoGlow, thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, 255, 255,
+ 255, 0);
+ this->lightNodeGlow = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &this->lightInfoGlow);
+ Lights_PointNoGlowSetInfo(&this->lightInfoNoGlow, thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, 255,
+ 255, 255, 0);
+ this->lightNodeNoGlow = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &this->lightInfoNoGlow);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088FD04.s")
+ this->fairyFlags = 0;
+ this->disappearTimer = 600;
+ this->unk_240 = 0.0f;
+ colorConfig = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088FDCC.s")
+ this->unk_260 = ENELF_GET_FE00(&this->actor);
+ params = ENELF_GET_F(&this->actor);
+ if (thisx->params & 0x100) {
+ this->fairyFlags |= 0x400;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8088FE64.s")
+ this->actor.params = params;
+ switch (params) {
+ case 0:
+ thisx->room = -1;
+ EnElf_SetupAction(this, func_8088E850);
+ func_8088C51C(this, 0);
+ this->fairyFlags |= 4;
+ thisx->update = func_8089010C;
+ this->elfMsg = NULL;
+ this->unk_234 = NULL;
+ this->unk_269 = 20;
+ if ((gSaveContext.tatlTimer >= 25800) || (gSaveContext.tatlTimer < 3000)) {
+ gSaveContext.tatlTimer = 0;
+ }
+ this->unk_266 = ElfMessage_GetFirstCycleHint(globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_8089010C.s")
+ case 1:
+ colorConfig = -1;
+ gSaveContext.unk_1016 = 0;
+ EnElf_SetupAction(this, func_8088E0F0);
+ this->unk_254 = Math_Vec3f_DistXZ(&thisx->world.pos, &player->actor.world.pos);
+ this->unk_248 = player->actor.shape.rot.y;
+ this->unk_24C = -0x1000;
+ this->unk_224.y = thisx->world.pos.y - player->actor.world.pos.y;
+ this->unk_246 = 0;
+ this->unk_250 = 0.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/EnElf_Update.s")
+ case 5:
+ colorConfig = -1;
+ EnElf_SetupAction(this, func_8088E484);
+ this->unk_254 = 0.0f;
+ this->unk_248 = player->actor.shape.rot.y;
+ this->unk_24C = 0;
+ this->unk_224.y = thisx->world.pos.y - player->actor.world.pos.y;
+ this->unk_246 = 0;
+ this->unk_250 = 7.0f;
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_80890494.s")
+ case 7:
+ this->fairyFlags |= 0x200;
+ thisx->shape.shadowDraw = func_800B4088;
+ this->fairyFlags |= 0x100;
+ colorConfig = -1;
+ this->fairyFlags |= 0x800;
+ this->fairyFlags |= 0x1000;
+ func_8088CC48(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/EnElf_Draw.s")
+ case 2:
+ this->fairyFlags |= 0x100;
+ colorConfig = -1;
+ this->fairyFlags |= 0x800;
+ this->fairyFlags |= 0x2000;
+ this->fairyFlags |= 0x1000;
+ func_8088CC48(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Elf/func_808908D0.s")
+ case 6:
+ colorConfig = -1;
+ this->fairyFlags |= 0x800;
+ this->fairyFlags |= 0x2000;
+ this->fairyFlags |= 0x1000;
+ func_8088CC48(this, globalCtx);
+ break;
+
+ case 9:
+ this->fairyFlags |= 0x1000;
+
+ case 10:
+ colorConfig = -2;
+ func_8088CC48(this, globalCtx);
+ break;
+
+ case 8:
+ Actor_MarkForDeath(thisx);
+ return;
+
+ case 3:
+ colorConfig = Rand_ZeroFloat(11.99f) + 1.0f;
+ EnElf_SetupAction(this, func_8088E018);
+ func_8088C51C(this, 0);
+ break;
+
+ case 4:
+ EnElf_SetupAction(this, func_8088E0E0);
+ func_8088C51C(this, 6);
+ this->fairyFlags |= 8;
+ {
+ s32 i;
+
+ for (i = 0; i < 8; i++) {
+ Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, thisx->world.pos.x,
+ thisx->world.pos.y - 30.0f, thisx->world.pos.z, 0, 0, 0, 6);
+ }
+ }
+ break;
+ }
+
+ this->unk_23C = 3.0f;
+ this->innerColor = sInnerColors[0];
+ if (colorConfig > 0) {
+ this->outerColor.r = func_8088CD3C(sColorFlags[colorConfig].r);
+ this->outerColor.g = func_8088CD3C(sColorFlags[colorConfig].g);
+ this->outerColor.b = func_8088CD3C(sColorFlags[colorConfig].b);
+ this->outerColor.a = 0;
+ } else {
+ this->innerColor = sInnerColors[-colorConfig];
+ this->outerColor = sOuterColors[-colorConfig];
+ }
+}
+
+void EnElf_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnElf* this = THIS;
+
+ LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, this->lightNodeGlow);
+ LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, this->lightNodeNoGlow);
+}
+
+void func_8088D3EC(EnElf* this, GlobalContext* globalCtx) {
+ this->unk_224.x = Math_SinS(this->unk_248) * this->unk_254;
+ this->unk_224.y = Math_SinS(this->unk_246) * this->unk_250;
+ this->unk_224.z = Math_CosS(this->unk_248) * this->unk_254;
+ this->unk_248 += this->unk_24C;
+ this->unk_246 += this->unk_24A;
+}
+
+void func_8088D470(EnElf* this, GlobalContext* globalCtx) {
+ f32 xzScale = (Math_CosS(this->unk_246) * this->unk_250) + this->unk_254;
+
+ this->unk_224.x = Math_SinS(this->unk_248) * xzScale;
+ this->unk_224.y = 0.0f;
+ this->unk_224.z = Math_CosS(this->unk_248) * xzScale;
+
+ this->unk_248 += this->unk_24C;
+ this->unk_246 += this->unk_24A;
+}
+
+void func_8088D504(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ this->unk_246 = (this->unk_248 * 2) & 0xFFFF;
+ this->unk_224.x = Math_SinS(this->unk_248) * this->unk_254;
+ this->unk_224.y = Math_SinS(this->unk_246) * this->unk_250;
+ this->unk_224.z = -Math_SinS(player->actor.shape.rot.y) * this->unk_224.x;
+ this->unk_224.x = Math_CosS(player->actor.shape.rot.y) * this->unk_224.x;
+ this->unk_248 += this->unk_24C;
+}
+
+void func_8088D5A0(EnElf* this, Vec3f* arg1, f32 arg2) {
+ f32 yVelTarget = ((arg1->y + this->unk_224.y) - this->actor.world.pos.y) * arg2;
+ f32 yVelAbs = fabsf(yVelTarget);
+ f32 yVelDirection = (yVelTarget >= 0.0f) ? 1.0f : -1.0f;
+
+ yVelAbs = CLAMP(yVelAbs, 0.0f, 30.0f);
+ Math_StepToF(&this->actor.velocity.y, yVelAbs * yVelDirection, 32.0f);
+}
+
+void func_8088D660(EnElf* this, Vec3f* targetPos, f32 arg2) {
+ f32 xVelTarget = ((targetPos->x + this->unk_224.x) - this->actor.world.pos.x) * arg2;
+ f32 zVelTarget = ((targetPos->z + this->unk_224.z) - this->actor.world.pos.z) * arg2;
+ f32 xVelDirection = (xVelTarget >= 0.0f) ? 1.0f : -1.0f;
+ f32 zVelDirection = (zVelTarget >= 0.0f) ? 1.0f : -1.0f;
+
+ xVelTarget = fabsf(xVelTarget);
+ zVelTarget = fabsf(zVelTarget);
+
+ xVelTarget = CLAMP(xVelTarget, 0.0f, 30.0f) * xVelDirection;
+ zVelTarget = CLAMP(zVelTarget, 0.0f, 30.0f) * zVelDirection;
+
+ func_8088D5A0(this, targetPos, arg2);
+ Math_StepToF(&this->actor.velocity.x, xVelTarget, 1.5f);
+ Math_StepToF(&this->actor.velocity.z, zVelTarget, 1.5f);
+ Actor_ApplyMovement(&this->actor);
+}
+
+void func_8088D7F8(EnElf* this, Vec3f* targetPos) {
+ func_8088D5A0(this, targetPos, 0.2f);
+ this->actor.velocity.x = 0.0f;
+ this->actor.velocity.z = 0.0f;
+ Actor_ApplyMovement(&this->actor);
+ this->actor.world.pos.x = targetPos->x + this->unk_224.x;
+ this->actor.world.pos.z = targetPos->z + this->unk_224.z;
+}
+
+void func_8088D864(EnElf* this, Vec3f* targetPos) {
+ func_8088D5A0(this, targetPos, 0.2f);
+ this->actor.velocity.z = 0.0f;
+ this->actor.velocity.x = 0.0f;
+ Actor_ApplyMovement(&this->actor);
+ this->actor.world.pos.x = targetPos->x + this->unk_224.x;
+ this->actor.world.pos.z = targetPos->z + this->unk_224.z;
+}
+
+void func_8088D8D0(EnElf* this, Vec3f* arg1) {
+ f32 yVelTarget = (((Math_SinS(this->unk_246) * this->unk_250) + arg1->y) - this->actor.world.pos.y) * 0.2f;
+ f32 yVelAbs = fabsf(yVelTarget);
+ f32 yVelDirection = (yVelTarget >= 0.0f) ? 1.0f : -1.0f;
+
+ this->unk_246 += this->unk_24A;
+ yVelAbs = CLAMP(yVelAbs, 0.0f, 30.0f);
+
+ Math_StepToF(&this->actor.velocity.y, yVelAbs * yVelDirection, 1.5f);
+}
+
+void func_8088D9BC(EnElf* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+ Player* player = GET_PLAYER(globalCtx);
+ s16 targetYaw;
+ Vec3f* vec = &this->unk_224;
+
+ if (this->fairyFlags & 0x4000) {
+ Math_SmoothStepToF(&this->actor.speedXZ, 5.0f, 0.5f, 1.0f, 0.01f);
+ } else {
+ Math_SmoothStepToF(&this->actor.speedXZ, this->unk_254, 0.2f, 0.5f, 0.01f);
+ }
+
+ switch (this->unk_244) {
+ case 0:
+ targetYaw = Math_FAtan2F(-(this->actor.world.pos.z - vec->z), -(this->actor.world.pos.x - vec->x));
+ break;
+
+ case 3:
+ targetYaw = Math_FAtan2F(-(this->actor.world.pos.z - player->actor.world.pos.z),
+ -(this->actor.world.pos.x - player->actor.world.pos.x));
+ break;
+
+ case 2:
+ targetYaw = Math_FAtan2F(this->actor.world.pos.z - player->actor.world.pos.z,
+ this->actor.world.pos.x - player->actor.world.pos.x);
+ break;
+
+ default:
+ targetYaw = this->unk_24C;
+ break;
+ }
+
+ if (this->fairyFlags & 0x4000) {
+ Math_SmoothStepToS(&this->unk_258, targetYaw, 10, this->unk_248, 0x1000);
+ } else {
+ Math_SmoothStepToS(&this->unk_258, targetYaw, 10, this->unk_248, 0x20);
+ }
+
+ this->actor.world.rot.y = this->unk_258;
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+}
+
+void func_8088DB4C(EnElf* this, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4) {
+ f32 xVelTarget = ((arg1->x + this->unk_224.x) - this->actor.world.pos.x) * arg4;
+ f32 zVelTarget = ((arg1->z + this->unk_224.z) - this->actor.world.pos.z) * arg4;
+ f32 xzVelocity;
+ f32 clampedXZ;
+
+ arg4 += 0.3f;
+ arg3 += 30.0f;
+
+ func_8088D5A0(this, arg1, arg4);
+
+ xzVelocity = sqrtf(SQ(xVelTarget) + SQ(zVelTarget));
+ clampedXZ = CLAMP(xzVelocity, arg2, arg3);
+ this->actor.speedXZ = clampedXZ;
+
+ if ((xzVelocity != clampedXZ) && (xzVelocity != 0.0f)) {
+ xzVelocity = clampedXZ / xzVelocity;
+ xVelTarget *= xzVelocity;
+ zVelTarget *= xzVelocity;
+ }
+
+ Math_StepToF(&this->actor.velocity.x, xVelTarget, 5.0f);
+ Math_StepToF(&this->actor.velocity.z, zVelTarget, 5.0f);
+ Actor_ApplyMovement(&this->actor);
+}
+
+s32 func_8088DCA4(EnElf* this) {
+ if (this->disappearTimer > 0) {
+ this->disappearTimer--;
+ } else {
+ this->disappearTimer--;
+ if (this->disappearTimer > -10) {
+ Actor_SetScale(&this->actor, (this->disappearTimer + 10) * 0.008f * 0.1f);
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ return true;
+ }
+ }
+ return false;
+}
+
+void func_8088DD34(EnElf* this, GlobalContext* globalCtx) {
+ Player* refActor = GET_PLAYER(globalCtx);
+ s32 pad;
+ Player* player2 = GET_PLAYER(globalCtx);
+ f32 heightDiff;
+
+ SkelAnime_Update(&this->skelAnime);
+
+ if (Rand_ZeroOne() < 0.05f) {
+ this->unk_250 = Rand_ZeroFloat(10.0f) + 10.0f;
+ this->unk_24A = (s32)Rand_ZeroFloat(0x400) + 0x200;
+ }
+
+ func_8088CBAC(this, globalCtx);
+ if (this->fairyFlags & 0x800) {
+ this->unk_224.y = player2->bodyPartsPos[0].y;
+ }
+
+ func_8088D8D0(this, &this->unk_224);
+ func_8088D9BC(this, globalCtx);
+ if (Actor_HasParent(&this->actor, globalCtx)) {
+ if (this->fairyFlags & 0x400) {
+ Actor_SetCollectibleFlag(globalCtx, this->unk_260);
+ }
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ if (func_801233E4(globalCtx)) {
+ if ((this->fairyFlags & 0x4000) && (this->fairyFlags & 0x100) && func_8088DCA4(this)) {
+ return;
+ }
+ return;
+ }
+
+ heightDiff = this->actor.world.pos.y - refActor->actor.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_80115908(globalCtx, 0x80);
+ if (this->fairyFlags & 0x200) {
+ Parameter_AddMagic(globalCtx, ((void)0, gSaveContext.unk_3F30) + (gSaveContext.doubleMagic * 0x30) + 0x30);
+ }
+ gSaveContext.unk_1016 = 0;
+ this->unk_254 = 50.0f;
+ this->unk_248 = refActor->actor.shape.rot.y;
+ this->unk_24C = -0x1000;
+ this->unk_224.y = 30.0f;
+ this->unk_250 = 0.0f;
+ this->unk_246 = 0;
+ EnElf_SetupAction(this, func_8088E0F0);
+ if (this->fairyFlags & 0x400) {
+ Actor_SetCollectibleFlag(globalCtx, this->unk_260);
+ }
+ return;
+ }
+
+ if (this->fairyFlags & 0x100) {
+ if (func_8088DCA4(this)) {
+ return;
+ }
+ } else {
+ Actor_SetScale(&this->actor, 0.008f);
+ }
+
+ if (this->fairyFlags & 0x2000) {
+ func_800B8A1C(&this->actor, globalCtx, 0xBA, 80.0f, 60.0f);
+ }
+}
+
+void func_8088E018(EnElf* this, GlobalContext* globalCtx) {
+ Vec3f parentPos;
+ Actor* parent;
+
+ SkelAnime_Update(&this->skelAnime);
+ func_8088D3EC(this, globalCtx);
+ parent = this->actor.parent;
+
+ if ((parent != NULL) && (parent->update != NULL)) {
+ parentPos = this->actor.parent->world.pos;
+ parentPos.y += (1500.0f * this->actor.scale.y) + 40.0f;
+ func_8088D660(this, &parentPos, 0.2f);
+ } else {
+ Actor_MarkForDeath(&this->actor);
+ }
+ this->unk_258 = Math_FAtan2F(this->actor.velocity.z, this->actor.velocity.x);
+}
+
+void func_8088E0E0(EnElf* this, GlobalContext* globalCtx) {
+}
+
+void func_8088E0F0(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ SkelAnime_Update(&this->skelAnime);
+ Math_SmoothStepToF(&this->unk_254, 30.0f, 0.1f, 4.0f, 1.0f);
+
+ this->unk_224.x = Math_CosS(this->unk_248) * this->unk_254;
+ this->unk_224.y += this->unk_250;
+
+ switch (this->unk_246) {
+ case 0:
+ if (this->unk_250 < 2.0f) {
+ this->unk_250 += 0.1f;
+ } else {
+ gSaveContext.healthAccumulator = 160;
+ this->unk_246++;
+ }
+ break;
+
+ case 1:
+ if (this->unk_250 > -1.0f) {
+ this->unk_250 -= 0.2f;
+ }
+ break;
+ }
+
+ this->unk_224.z = Math_SinS(this->unk_248) * -this->unk_254;
+ this->unk_248 += this->unk_24C;
+ func_8088D660(this, &player->actor.world.pos, 0.2f);
+
+ if (this->unk_250 < 0.0f) {
+ if ((this->unk_224.y < 20.0f) && (this->unk_224.y > 0.0f)) {
+ Actor_SetScale(&this->actor, this->unk_224.y * 0.008f * 0.05f);
+ }
+ }
+
+ if (this->unk_224.y < -10.0f) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ this->unk_258 = Math_FAtan2F(this->actor.velocity.z, this->actor.velocity.x);
+ func_8088F5F4(this, globalCtx, 32);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+}
+
+void func_8088E304(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ SkelAnime_Update(&this->skelAnime);
+ if (this->unk_224.y > 200.0f) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ if (this->unk_24A >= 0x7E) {
+ this->unk_254 += 0.1f;
+ this->unk_250 += 0.5f;
+ this->unk_224.y += this->unk_250;
+ } else {
+ this->unk_24A++;
+ if (this->unk_254 < 30.0f) {
+ this->unk_254 += 0.5f;
+ }
+
+ if (this->unk_224.y > 0.0f) {
+ this->unk_224.y -= 0.7f;
+ }
+ }
+
+ this->unk_224.x = Math_CosS(this->unk_248) * this->unk_254;
+ this->unk_224.z = Math_SinS(this->unk_248) * -this->unk_254;
+ this->unk_248 += this->unk_24C;
+
+ func_8088D7F8(this, &player->bodyPartsPos[0]);
+ this->unk_258 = Math_FAtan2F(this->actor.velocity.z, this->actor.velocity.x);
+ func_8088F5F4(this, globalCtx, 0x20);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+}
+
+void func_8088E484(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ SkelAnime_Update(&this->skelAnime);
+
+ this->unk_224.z = 0.0f;
+ this->unk_224.x = 0.0f;
+ this->unk_224.y += this->unk_250;
+ this->unk_250 -= 0.35f;
+
+ if (this->unk_250 <= 0.0f) {
+ EnElf_SetupAction(this, func_8088E304);
+ this->unk_24C = 0x800;
+ this->unk_24A = 0;
+ this->unk_250 = 0.0f;
+ this->unk_254 = 1.0f;
+ }
+
+ func_8088D7F8(this, &player->bodyPartsPos[0]);
+ Actor_SetScale(&this->actor, (1.0f - (SQ(this->unk_250) * SQ(1.0f / 9.0f))) * 0.008f);
+ this->unk_258 = Math_FAtan2F(this->actor.velocity.z, this->actor.velocity.x);
+ func_8088F5F4(this, globalCtx, 32);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_FIATY_HEAL - SFX_FLAG);
+}
+
+void func_8088E5A8(EnElf* this, GlobalContext* globalCtx) {
+ if (this->fairyFlags & 4) {
+ func_8088EFA4(this, globalCtx);
+ }
+
+ SkelAnime_Update(&this->skelAnime);
+
+ this->unk_26C(this, globalCtx);
+}
+
+void func_8088E60C(EnElf* this, GlobalContext* globalCtx) {
+ s16 glowLightRadius;
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (player->stateFlags1 & 0x400) {
+ glowLightRadius = 200;
+ } else {
+ glowLightRadius = 100;
+ }
+
+ if ((this->unk_244 == 6) || (player->stateFlags1 & 2) || (this->fairyFlags & 0x8000)) {
+ glowLightRadius = 0;
+ }
+
+ if (func_800EE29C(globalCtx, 0xC9)) {
+ if (globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0xC9)]->unk0 == 6) {
+ glowLightRadius = 0;
+ }
+ }
+
+ if (this->fairyFlags & 0x20) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ Lights_PointNoGlowSetInfo(&this->lightInfoNoGlow, player->actor.world.pos.x, player->actor.world.pos.y + 60.0f,
+ player->actor.world.pos.z, 255, 255, 255, 200);
+ } else {
+ Lights_PointNoGlowSetInfo(&this->lightInfoNoGlow, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 255, 255, 255, -1);
+ }
+
+ Lights_PointGlowSetInfo(&this->lightInfoGlow, this->actor.world.pos.x, this->actor.world.pos.y,
+ this->actor.world.pos.z, 255, 255, 255, glowLightRadius);
+ this->unk_258 = Math_FAtan2F(this->actor.velocity.z, this->actor.velocity.x);
+ Actor_SetScale(&this->actor, this->actor.scale.x);
+}
+
+void func_8088E850(EnElf* this, GlobalContext* globalCtx) {
+ Vec3f nextPos;
+ Player* player = GET_PLAYER(globalCtx);
+ Actor* arrowPointedActor;
+ f32 xScale;
+ f32 distFromLinksHead;
+ u32 sp38;
+
+ func_8088F214(this, globalCtx);
+ func_8088E5A8(this, globalCtx);
+ xScale = 0.0f;
+
+ if (func_800EE29C(globalCtx, 0xC9)) {
+ sp38 = func_800EE200(globalCtx, 0xC9);
+ func_808908D0(&nextPos, globalCtx, sp38);
+ this->actor.shape.rot.y = globalCtx->csCtx.npcActions[sp38]->unk8;
+ this->actor.shape.rot.x = globalCtx->csCtx.npcActions[sp38]->unk6;
+ if (globalCtx->csCtx.npcActions[sp38]->unk0 == 5) {
+ func_8088F5F4(this, globalCtx, 16);
+ }
+
+ if (this->unk_244 == 8) {
+ func_8088D864(this, &nextPos);
+ } else {
+ func_8088D660(this, &nextPos, 0.2f);
+ }
+
+ if ((globalCtx->sceneNum == SCENE_CLOCKTOWER) && (gSaveContext.sceneSetupIndex == 0) &&
+ (globalCtx->csCtx.unk_12 == 0) &&
+ ((globalCtx->csCtx.frames == 0x95) || (globalCtx->csCtx.frames == 0x17D) ||
+ (globalCtx->csCtx.frames == 0x24F))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ }
+
+ if ((globalCtx->sceneNum == SCENE_SECOM) && (gSaveContext.sceneSetupIndex == 0) &&
+ (globalCtx->csCtx.unk_12 == 4) && (globalCtx->csCtx.frames == 0x5F)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
+ }
+ } else {
+ this->actor.shape.rot.x = 0;
+ distFromLinksHead = Math_Vec3f_DistXYZ(&player->bodyPartsPos[8], &this->actor.world.pos);
+ switch (this->unk_244) {
+ case 5:
+ func_8088D660(this, &player->bodyPartsPos[8], 1.0f - (this->unk_24A * 0.033333335f));
+ xScale = Math_Vec3f_DistXYZ(&player->bodyPartsPos[8], &this->actor.world.pos);
+
+ if (distFromLinksHead < 7.0f) {
+ this->unk_25C = 0;
+ xScale = 0;
+ } else if (distFromLinksHead < 25.0f) {
+ xScale = (xScale - 5.0f) * 0.05f;
+ xScale = 1.0f - xScale;
+ xScale = (1.0f - SQ(xScale)) * 0.008f;
+ } else {
+ xScale = 0.008f;
+ }
+ func_8088F5F4(this, globalCtx, 16);
+ break;
+
+ case 6:
+ func_8088D660(this, &player->bodyPartsPos[8], 0.2f);
+ this->actor.world.pos = player->bodyPartsPos[8];
+ break;
+
+ case 9:
+ nextPos = player->bodyPartsPos[8];
+ nextPos.y += 1500.0f * this->actor.scale.y;
+
+ func_8088D7F8(this, &nextPos);
+ func_8088F5F4(this, globalCtx, 16);
+
+ if (this->unk_254 <= 19.0f) {
+ this->unk_254 += 1.0f;
+ }
+
+ if (this->unk_254 >= 21.0f) {
+ this->unk_254 -= 1.0f;
+ }
+
+ if (this->unk_25C < 0x20) {
+ this->unk_24C = (this->unk_25C * 240) + 0x200;
+ }
+ break;
+
+ case 10:
+ nextPos = GET_ACTIVE_CAM(globalCtx)->eye;
+ nextPos.y += -2000.0f * this->actor.scale.y;
+ func_8088DB4C(this, &nextPos, 0.0f, 30.0f, 0.2f);
+ break;
+
+ default:
+ arrowPointedActor = globalCtx->actorCtx.targetContext.unk38;
+ if ((player->stateFlags1 & 0x40) && (player->targetActor != NULL)) {
+ Math_Vec3f_Copy(&nextPos, &player->targetActor->focus.pos);
+ } else {
+ Math_Vec3f_Copy(&nextPos, &globalCtx->actorCtx.targetContext.unk0);
+ }
+ nextPos.y += 1500.0f * this->actor.scale.y;
+
+ if (arrowPointedActor != NULL) {
+ func_8088DB4C(this, &nextPos, 0.0f, 30.0f, 0.2f);
+ if (this->actor.speedXZ >= 5.0f) {
+ func_8088F5F4(this, globalCtx, 0x10);
+ }
+ } else {
+ if ((this->timer % 32) == 0) {
+ this->unk_23C = Rand_ZeroFloat(7.0f) + 3.0f;
+ }
+
+ if (this->fairyFlags & 2) {
+ if (distFromLinksHead < 30.0f) {
+ this->fairyFlags ^= 2;
+ }
+ func_8088DB4C(this, &nextPos, 0.0f, 30.0f, 0.2f);
+ func_8088F5F4(this, globalCtx, 0x10);
+ } else {
+ if (distFromLinksHead > 100.0f) {
+ this->fairyFlags |= 2;
+ if (this->unk_269 == 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ }
+ this->unk_25C = 100;
+ }
+ func_8088DB4C(this, &nextPos, 0.0f, this->unk_23C, 0.2f);
+ }
+ }
+ break;
+ }
+ }
+
+ if (this->unk_244 == 5) {
+ this->actor.scale.x = xScale;
+ } else if (this->unk_244 == 6) {
+ this->actor.scale.x = 0.0f;
+ } else {
+ Math_SmoothStepToF(&this->actor.scale.x, 0.008f, 0.3f, 0.00080000004f, 0.000080000005f);
+ }
+
+ func_8088E60C(this, globalCtx);
+
+ if (!func_800EE29C(globalCtx, 0xC9)) {
+ this->actor.shape.rot.y = this->unk_258;
+ }
+}
+
+void func_8088EF18(Color_RGBAf* dest, Color_RGBAf* newColor, Color_RGBAf* curColor, f32 rate) {
+ Color_RGBAf rgbaDiff;
+
+ rgbaDiff.r = newColor->r - curColor->r;
+ rgbaDiff.g = newColor->g - curColor->g;
+ rgbaDiff.b = newColor->b - curColor->b;
+ rgbaDiff.a = newColor->a - curColor->a;
+
+ dest->r += rgbaDiff.r * rate;
+ dest->g += rgbaDiff.g * rate;
+ dest->b += rgbaDiff.b * rate;
+ dest->a += rgbaDiff.a * rate;
+}
+
+void func_8088EFA4(EnElf* this, GlobalContext* globalCtx) {
+ Actor* arrayPointerActor = globalCtx->actorCtx.targetContext.unk38;
+ Player* player = GET_PLAYER(globalCtx);
+ f32 transitionRate;
+
+ if (!(this->unk_264 & 8)) {
+ this->unk_264 &= ~0x10;
+ }
+
+ if (this->unk_264 & 8) {
+ if (this->unk_264 & 0x10) {
+ this->unk_238 = 1.0f;
+ this->unk_264 &= ~8;
+ this->unk_268 = 0;
+ this->unk_264 &= ~0x10;
+ } else {
+ this->innerColor.r = 255.0f;
+ this->innerColor.g = 0.0f;
+ this->innerColor.b = 0.0f;
+ this->innerColor.a = 255.0f;
+
+ this->outerColor.r = 200.0f;
+ this->outerColor.g = 80.0f;
+ this->outerColor.b = 80.0f;
+ this->outerColor.a = 0.0f;
+ }
+ } else if (globalCtx->actorCtx.targetContext.unk40 != 0.0f) {
+ this->unk_268 = 0;
+ this->unk_238 = 1.0f;
+ if (!this->unk_269) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ }
+ } else if (this->unk_268 == 0) {
+ if ((arrayPointerActor == NULL) ||
+ (Math_Vec3f_DistXYZ(&this->actor.world.pos, &globalCtx->actorCtx.targetContext.unk0) < 50.0f)) {
+ this->unk_268 = 1;
+ }
+ } else if (this->unk_238 != 0.0f) {
+ if (Math_StepToF(&this->unk_238, 0.0f, 0.25f)) {
+ this->innerColor = globalCtx->actorCtx.targetContext.unk18;
+ this->outerColor = globalCtx->actorCtx.targetContext.unk28;
+ } else {
+ transitionRate = 0.25f / this->unk_238;
+ func_8088EF18(&this->innerColor, &globalCtx->actorCtx.targetContext.unk18, &this->innerColor,
+ transitionRate);
+ func_8088EF18(&this->outerColor, &globalCtx->actorCtx.targetContext.unk28, &this->outerColor,
+ transitionRate);
+ }
+ }
+
+ if (this->fairyFlags & 1) {
+ if ((arrayPointerActor == NULL) || (player->unk_730 == NULL)) {
+ this->fairyFlags ^= 1;
+ }
+ } else if ((arrayPointerActor != NULL) && (player->unk_730 != NULL)) {
+ u8 temp = this->unk_269;
+ u16 targetSfxId = this->unk_269 == 0 ? NA_SE_PL_WALK_GROUND - SFX_FLAG : NA_SE_PL_WALK_GROUND - SFX_FLAG;
+
+ if (!temp) {
+ Audio_PlayActorSound2(&this->actor, targetSfxId);
+ }
+ this->fairyFlags |= 1;
+ }
+}
+
+void func_8088F214(EnElf* this, GlobalContext* globalCtx) {
+ s32 sp34;
+ Actor* arrowPointedActor;
+ Player* player = GET_PLAYER(globalCtx);
+ s32 pad;
+
+ if (globalCtx->csCtx.state != 0) {
+ if (func_800EE29C(globalCtx, 0xC9)) {
+ switch (globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0xC9)]->unk0) {
+ case 4:
+ sp34 = 7;
+ break;
+
+ case 3:
+ sp34 = 4;
+ break;
+
+ case 1:
+ sp34 = 8;
+ break;
+
+ default:
+ sp34 = 0;
+ break;
+ }
+ } else {
+ sp34 = 0;
+ this->unk_25C = 100;
+ }
+ } else if (this->unk_264 & 8) {
+ sp34 = 1;
+ func_800B9010(&this->actor, NA_SE_EV_BELL_ANGER - SFX_FLAG);
+ } else {
+ arrowPointedActor = globalCtx->actorCtx.targetContext.unk38;
+ if (player->stateFlags1 & 0x400) {
+ sp34 = 10;
+ this->unk_25C = 100;
+ } else if ((arrowPointedActor == NULL) || (arrowPointedActor->category == 4)) {
+ if (arrowPointedActor != NULL) {
+ this->unk_25C = 100;
+ player->stateFlags2 |= 0x100000;
+ sp34 = 0;
+ } else {
+ switch (this->unk_244) {
+ case 0:
+ if (this->unk_25C != 0) {
+ this->unk_25C--;
+ sp34 = 0;
+ } else if (!(player->stateFlags1 & 0x40)) {
+ if (this->unk_269 == 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_NAVY_VANISH);
+ }
+ sp34 = 5;
+ } else {
+ sp34 = 0;
+ }
+ break;
+
+ case 5:
+ if (this->unk_25C != 0) {
+ if (this->unk_24A > 0) {
+ this->unk_24A--;
+ sp34 = 5;
+ } else {
+ player->stateFlags2 |= 0x100000;
+ sp34 = 0;
+ }
+ } else {
+ sp34 = 6;
+ }
+ break;
+
+ case 6:
+ sp34 = 6;
+ break;
+
+ case 9:
+ sp34 = this->unk_244;
+ if (this->unk_25C > 0) {
+ this->unk_25C--;
+ } else {
+ sp34 = 0;
+ }
+ break;
+
+ default:
+ sp34 = 0;
+ break;
+ }
+ }
+ } else {
+ sp34 = 1;
+ }
+
+ switch (sp34) {
+ case 0:
+ if (!(player->stateFlags2 & 0x100000)) {
+ sp34 = 5;
+ if (this->unk_269 == 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_NAVY_VANISH);
+ }
+ }
+ break;
+
+ case 6:
+ if (player->stateFlags2 & 0x100000) {
+ sp34 = 9;
+ this->unk_25C = 0x2A;
+ if (this->unk_269 == 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_BELL_DASH_NORMAL);
+ }
+ } else if (player->stateFlags1 & 0x40) {
+ player->stateFlags2 |= 0x100000;
+ sp34 = 0;
+ this->unk_25C = 0;
+ }
+ break;
+
+ case 5:
+ player->stateFlags2 &= ~0x100000;
+ break;
+
+ default:
+ player->stateFlags2 |= 0x100000;
+ break;
+ }
+ }
+
+ if (sp34 != this->unk_244) {
+ func_8088C51C(this, sp34);
+ if (sp34 == 9) {
+ this->unk_254 = Math_Vec3f_DistXZ(&player->bodyPartsPos[8], &this->actor.world.pos);
+ this->unk_248 = Math_Vec3f_Yaw(&this->actor.world.pos, &player->bodyPartsPos[8]);
+ }
+ }
+}
+
+void func_8088F5F4(EnElf* this, GlobalContext* globalCtx, s32 sparkleLife) {
+ static Vec3f sparkleVelocity = { 0.0f, -0.05f, 0.0f };
+ static Vec3f sparkleAccel = { 0.0f, -0.025f, 0.0f };
+ s32 pad;
+ Vec3f sparklePos;
+ Color_RGBA8 primColor;
+ Color_RGBA8 envColor;
+
+ if (!(this->fairyFlags & 8)) {
+ sparklePos.x = randPlusMinusPoint5Scaled(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;
+
+ primColor.r = this->innerColor.r;
+ primColor.g = this->innerColor.g;
+ primColor.b = this->innerColor.b;
+
+ envColor.r = this->outerColor.r;
+ envColor.g = this->outerColor.g;
+ envColor.b = this->outerColor.b;
+
+ EffectSsKiraKira_SpawnDispersed(globalCtx, &sparklePos, &sparkleVelocity, &sparkleAccel, &primColor, &envColor,
+ 1000, sparkleLife);
+ }
+}
+
+void func_8088F9E4(Actor* thisx, GlobalContext* globalCtx) {
+ EnElf* this = THIS;
+ s32 bgId;
+
+ thisx->floorHeight = BgCheck_EntityRaycastFloor5_2(globalCtx, &globalCtx->colCtx, &thisx->floorPoly, &bgId,
+ &this->actor, &thisx->world.pos);
+ thisx->shape.shadowAlpha = 50;
+}
+
+void func_8088FA38(EnElf* this, GlobalContext* globalCtx) {
+ Vec3f refPos;
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (this->fairyFlags & 0x10) {
+ refPos = globalCtx->actorCtx.targetContext.unk0;
+
+ if (this->unk_234 != NULL) {
+ refPos = this->unk_234->world.pos;
+ } else {
+ if ((player->unk_730 == NULL) || (&player->actor == player->unk_730) || (&this->actor == player->unk_730) ||
+ (this->unk_264 & 4)) {
+ refPos.x = player->bodyPartsPos[7].x + (Math_SinS(player->actor.shape.rot.y) * 20.0f);
+ refPos.y = player->bodyPartsPos[7].y + 5.0f;
+ refPos.z = player->bodyPartsPos[7].z + (Math_CosS(player->actor.shape.rot.y) * 20.0f);
+ this->unk_264 &= ~4;
+ }
+ }
+ this->actor.focus.pos = refPos;
+ this->fairyFlags &= ~0x10;
+ }
+
+ func_8088E5A8(this, globalCtx);
+ refPos = this->actor.focus.pos;
+ func_8088DB4C(this, &refPos, 0, 30.0f, 0.2f);
+
+ if (this->actor.speedXZ >= 5.0f) {
+ func_8088F5F4(this, globalCtx, 0x10);
+ }
+
+ Math_SmoothStepToF(&this->actor.scale.x, 0.008f, 0.3f, 0.00080000004f, 0.000080000005f);
+ func_8088E60C(this, globalCtx);
+}
+
+void func_8088FC34(EnElf* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->unk_258, 5, 0x1000, 0x400);
+ this->timer++;
+
+ if (this->unk_234 == NULL) {
+ if (this->unk_264 & 0x20) {
+ this->unk_240 = 0.0f;
+ } else {
+ Math_StepToF(&this->unk_240, 1.0f, 0.05f);
+ }
+ func_800FD2B4(globalCtx, SQ(this->unk_240), player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f);
+ }
+}
+
+void func_8088FD04(EnElf* this) {
+ if (ActorCutscene_GetCurrentIndex() == this->actor.cutscene) {
+ this->unk_264 &= ~1;
+ this->unk_264 |= 2;
+ } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ ActorCutscene_Stop(0x7C);
+ ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ this->unk_264 |= 1;
+ } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
+ ActorCutscene_Start(this->actor.cutscene, &this->actor);
+ this->unk_264 &= ~1;
+ this->unk_264 |= 2;
+ } else {
+ ActorCutscene_SetIntentToPlay(this->actor.cutscene);
+ this->unk_264 |= 1;
+ }
+}
+
+void func_8088FDCC(EnElf* this) {
+ this->actor.update = func_8089010C;
+ func_8088C51C(this, 0);
+ this->fairyFlags &= ~0x20;
+ this->actor.focus.pos = this->actor.world.pos;
+ this->unk_234 = NULL;
+ if ((this->unk_264 & 2) && (this->actor.cutscene != 0x7C)) {
+ ActorCutscene_Stop(this->actor.cutscene);
+ }
+ this->unk_264 &= ~0x20;
+}
+
+void func_8088FE64(Actor* thisx, GlobalContext* globalCtx2) {
+ GlobalContext* globalCtx = globalCtx2;
+ EnElf* this = THIS;
+
+ func_8088FA38(this, globalCtx);
+
+ switch (func_80152498(&globalCtx->msgCtx)) {
+ case 4:
+ if (func_80147624(globalCtx)) {
+ if (globalCtx->msgCtx.unk11F04 == 0x202) {
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F230();
+ break;
+
+ case 1:
+ func_8019F208();
+ break;
+ }
+ }
+
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 - 1);
+ break;
+
+ case 1:
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 + 1);
+ break;
+ }
+ }
+ break;
+
+ case 5:
+ if (func_80147624(globalCtx)) {
+ switch (globalCtx->msgCtx.unk11F04) {
+ case 576:
+ func_80151938(globalCtx, 0x245);
+ break;
+
+ case 0x21D:
+ case 0x21E:
+ case 0x21F:
+ case 0x220:
+ case 0x221:
+ case 0x222:
+ case 0x223:
+ case 0x23F:
+ case 0x241:
+ case 0x242:
+ case 0x243:
+ case 0x244:
+ switch (CURRENT_DAY) {
+ case 1:
+ func_80151938(globalCtx, 0x246);
+ break;
+
+ case 2:
+ func_80151938(globalCtx, 0x247);
+ break;
+
+ case 3:
+ if (!gSaveContext.isNight) {
+ func_80151938(globalCtx, 0x248);
+ } else if ((gSaveContext.time < CLOCK_TIME(6, 0)) &&
+ (gSaveContext.weekEventReg[74] & 0x20)) {
+ func_80151938(globalCtx, 0x225);
+ } else {
+ func_80151938(globalCtx, 0x249);
+ }
+ break;
+ }
+ break;
+
+ default:
+ func_801477B4(globalCtx);
+ func_8088FDCC(this);
+ break;
+ }
+ }
+ break;
+
+ case 2:
+ func_8088FDCC(this);
+ break;
+ }
+
+ func_8088FC34(this, globalCtx);
+
+ if (this->unk_264 & 1) {
+ func_8088FD04(this);
+ }
+}
+
+void func_8089010C(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnElf* this = THIS;
+ Player* player = GET_PLAYER(globalCtx);
+ u16 temp_v0 = ElfMessage_GetFirstCycleHint(globalCtx);
+
+ if (temp_v0 != this->unk_266) {
+ this->unk_266 = temp_v0;
+ gSaveContext.tatlTimer = 0;
+ }
+
+ if ((player->tatlTextId == 0) && (player->unk_730 == NULL)) {
+ if ((gSaveContext.tatlTimer >= 600) && (gSaveContext.tatlTimer <= 3000)) {
+ player->tatlTextId = ElfMessage_GetFirstCycleHint(globalCtx);
+ }
+ }
+
+ if (player->tatlTextId < 0) {
+ thisx->flags |= 0x10000;
+ }
+
+ if (func_800B84D0(thisx, globalCtx)) {
+ func_8019FDC8(&D_801DB4A4, NA_SE_VO_NA_LISTEN, 0x20);
+ thisx->focus.pos = thisx->world.pos;
+
+ if (thisx->textId == ElfMessage_GetFirstCycleHint(globalCtx)) {
+ this->fairyFlags |= 0x80;
+ gSaveContext.tatlTimer = 3001;
+ }
+
+ this->fairyFlags |= 0x10;
+ this->fairyFlags |= 0x20;
+ thisx->update = func_8088FE64;
+ func_8088C51C(this, 3);
+ if (this->elfMsg != NULL) {
+ this->elfMsg->flags |= 0x100;
+ thisx->cutscene = this->elfMsg->cutscene;
+ if (thisx->cutscene != -1) {
+ func_8088FD04(this);
+ }
+ if (this->elfMsg->home.rot.x == -0x961) {
+ this->unk_234 = this->elfMsg;
+ func_800B86C8(thisx, globalCtx, this->elfMsg);
+ }
+ } else {
+ thisx->cutscene = -1;
+ }
+ thisx->flags &= ~0x10000;
+ } else if (this->unk_264 & 4) {
+ thisx->focus.pos = thisx->world.pos;
+ this->fairyFlags |= 0x10;
+ this->fairyFlags |= 0x20;
+ thisx->update = func_8088FE64;
+ func_8088C51C(this, 3);
+ } else {
+ this->actionFunc(this, globalCtx);
+
+ if (!func_801690CC(globalCtx)) {
+ if (gSaveContext.tatlTimer < 25800) {
+ gSaveContext.tatlTimer++;
+ } else if (!(this->fairyFlags & 0x80)) {
+ gSaveContext.tatlTimer = 0;
+ }
+ }
+ }
+
+ this->elfMsg = NULL;
+ this->timer++;
+
+ if ((this->unk_240 >= 0.0f) && func_800FD2B4(globalCtx, SQ(this->unk_240) * this->unk_240,
+ player->actor.projectedPos.z + 780.0f, 0.2f, 0.5f)) {
+ Math_StepToF(&this->unk_240, -0.05f, 0.05f);
+ }
+
+ if (this->unk_269 > 0) {
+ this->unk_269--;
+ }
+
+ if (!this->unk_269 && (globalCtx->csCtx.state != 0)) {
+ this->unk_269 = 1;
+ }
+}
+
+void EnElf_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnElf* this = THIS;
+
+ this->actionFunc(this, globalCtx);
+
+ thisx->shape.rot.y = this->unk_258;
+ this->timer++;
+
+ if (this->fairyFlags & 0x200) {
+ func_8088F9E4(thisx, globalCtx);
+ }
+}
+
+s32 EnElf_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
+ Gfx** gfx) {
+ static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
+ s32 pad;
+ EnElf* this = THIS;
+ Vec3f sp34;
+ f32 scale;
+
+ if (limbIndex == 6) {
+ scale = ((Math_SinS(this->timer * 4096) * 0.1f) + 1.0f) * 0.012f;
+ if (this->fairyFlags & 0x200) {
+ scale *= 2.0f;
+ }
+ scale *= this->actor.scale.x * 124.99999f;
+
+ Matrix_MultiplyVector3fByState(&zeroVec, &sp34);
+ Matrix_InsertTranslation(sp34.x, sp34.y, sp34.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ }
+
+ if ((this->fairyFlags & 0x200) &&
+ ((limbIndex == 4) || (limbIndex == 7) || (limbIndex == 11) || (limbIndex == 14))) {
+ *dList = NULL;
+ }
+ return false;
+}
+
+void EnElf_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ EnElf* this = THIS;
+ Player* player = GET_PLAYER(globalCtx);
+ s32 pad;
+ s32 pad2;
+
+ if (player->currentMask != PLAYER_MASK_GIANT) {
+ if (!(this->fairyFlags & 8) &&
+ (!func_800EE29C(globalCtx, 0xC9) ||
+ (globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0xC9)]->unk0 != 6)) &&
+ (!(player->stateFlags1 & 0x100000) || (kREG(90) < this->actor.projectedPos.z))) {
+ Gfx* dListHead = GRAPH_ALLOC(globalCtx->state.gfxCtx, sizeof(Gfx) * 4);
+ f32 alphaScale;
+ s32 envAlpha;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C94C(globalCtx->state.gfxCtx);
+
+ envAlpha = (this->timer * 50) & 0x1FF;
+ envAlpha = (envAlpha >= 0x100) ? 511 - envAlpha : envAlpha;
+
+ alphaScale = (this->disappearTimer < 0) ? (this->disappearTimer * 0.0011666666f) + 1.0f : 1.0f;
+
+ gSPSegment(POLY_XLU_DISP++, 0x08, dListHead);
+
+ gDPPipeSync(dListHead++);
+ gDPSetPrimColor(dListHead++, 0, 0x01, (u8)(s8)this->innerColor.r, (u8)(s8)this->innerColor.g,
+ (u8)(s8)this->innerColor.b, (u8)(s8)(this->innerColor.a * alphaScale));
+
+ if (this->fairyFlags & 4) {
+ gDPSetRenderMode(dListHead++, G_RM_PASS, G_RM_CLD_SURF2);
+ } else {
+ gDPSetRenderMode(dListHead++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
+ }
+
+ gSPEndDisplayList(dListHead);
+
+ gDPSetEnvColor(POLY_XLU_DISP++, (u8)(s8)this->outerColor.r, (u8)(s8)this->outerColor.g,
+ (u8)(s8)this->outerColor.b, (u8)(s8)(envAlpha * alphaScale));
+
+ POLY_XLU_DISP = SkelAnime_Draw(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ EnElf_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ }
+ }
+}
+
+void func_808908D0(Vec3f* vec, GlobalContext* globalCtx, u32 action) {
+ Vec3f startPos;
+ Vec3f endPos;
+ CsCmdActorAction* npcAction = globalCtx->csCtx.npcActions[action];
+ f32 lerp;
+
+ startPos.x = npcAction->unk0C.x;
+ startPos.y = npcAction->unk0C.y;
+ startPos.z = npcAction->unk0C.z;
+
+ endPos.x = npcAction->unk18.x;
+ endPos.y = npcAction->unk18.y;
+ endPos.z = npcAction->unk18.z;
+
+ lerp = func_800F5A8C(npcAction->endFrame, npcAction->startFrame, globalCtx->csCtx.frames, globalCtx);
+ VEC3F_LERPIMPDST(vec, &startPos, &endPos, lerp);
+}
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 0bc20043cc..52c5e2af17 100644
--- a/src/overlays/actors/ovl_En_Elf/z_en_elf.h
+++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.h
@@ -6,12 +6,46 @@
struct EnElf;
typedef void (*EnElfActionFunc)(struct EnElf*, GlobalContext*);
+typedef void (*EnElfUnkFunc)(struct EnElf*, GlobalContext*);
+
+#define ENELF_GET_F(thisx) ((thisx)->params & 0xF)
+#define ENELF_GET_FE00(thisx) (((thisx)->params & 0xFE00) >> 9)
typedef struct EnElf {
/* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x120];
- /* 0x0264 */ u16 unk264;
- /* 0x0266 */ char unk_266[0xA];
+ /* 0x0144 */ SkelAnime skelAnime;
+ /* 0x0188 */ Vec3s jointTable[7];
+ /* 0x01B2 */ Vec3s morphTable[7];
+ /* 0x01DC */ Color_RGBAf innerColor;
+ /* 0x01EC */ Color_RGBAf outerColor;
+ /* 0x01FC */ LightInfo lightInfoGlow;
+ /* 0x020C */ LightNode* lightNodeGlow;
+ /* 0x0210 */ LightInfo lightInfoNoGlow;
+ /* 0x0220 */ LightNode* lightNodeNoGlow;
+ /* 0x0224 */ Vec3f unk_224;
+ /* 0x0230 */ Actor* elfMsg;
+ /* 0x0234 */ Actor* unk_234;
+ /* 0x0238 */ f32 unk_238;
+ /* 0x023C */ f32 unk_23C;
+ /* 0x0240 */ f32 unk_240;
+ /* 0x0244 */ s16 unk_244;
+ /* 0x0246 */ s16 unk_246;
+ /* 0x0248 */ s16 unk_248;
+ /* 0x024A */ s16 unk_24A;
+ /* 0x024C */ s16 unk_24C;
+ /* 0x0250 */ f32 unk_250;
+ /* 0x0254 */ f32 unk_254;
+ /* 0x0258 */ s16 unk_258;
+ /* 0x025A */ u16 timer;
+ /* 0x025C */ s16 unk_25C;
+ /* 0x025E */ s16 disappearTimer;
+ /* 0x0260 */ s16 unk_260;
+ /* 0x0262 */ u16 fairyFlags;
+ /* 0x0264 */ u16 unk_264;
+ /* 0x0266 */ u16 unk_266;
+ /* 0x0268 */ u8 unk_268;
+ /* 0x0269 */ u8 unk_269;
+ /* 0x026C */ EnElfUnkFunc unk_26C;
/* 0x0270 */ EnElfActionFunc actionFunc;
} EnElf; // size = 0x274
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 f9dfa048d6..cd553b537f 100644
--- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
+++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c
@@ -1069,11 +1069,11 @@ void EnFish2_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
}
if (limbIndex == 14) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &this->unk_318);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &this->unk_318);
}
if (limbIndex == 17) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &this->unk_300);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &this->unk_300);
}
Collider_UpdateSpheres(limbIndex, &this->collider);
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 a1818b0950..f8b88f50a7 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -461,10 +461,10 @@ void func_808D14DC(EnFloormas* this, GlobalContext* globalCtx) {
sp28.x = Math_SinS(this->actor.shape.rot.y + 0x6000) * 7.0f;
sp28.z = Math_CosS(this->actor.shape.rot.y + 0x6000) * 7.0f;
- func_800B1210(globalCtx, &sp34, &sp28, &D_801D15B0, 0x1C2, 0x64);
+ func_800B1210(globalCtx, &sp34, &sp28, &gZeroVec3f, 0x1C2, 0x64);
sp28.x = Math_SinS(this->actor.shape.rot.y - 0x6000) * 7.0f;
sp28.z = Math_CosS(this->actor.shape.rot.y - 0x6000) * 7.0f;
- func_800B1210(globalCtx, &sp34, &sp28, &D_801D15B0, 0x1C2, 0x64);
+ func_800B1210(globalCtx, &sp34, &sp28, &gZeroVec3f, 0x1C2, 0x64);
func_800B9010(&this->actor, NA_SE_EN_FLOORMASTER_SLIDING - SFX_FLAG);
}
@@ -682,7 +682,7 @@ void func_808D1ED4(EnFloormas* this, GlobalContext* globalCtx) {
sp34.x = this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y + 15.0f;
sp34.z = this->actor.world.pos.z;
- func_800B3030(globalCtx, &sp34, &D_801D15B0, &D_801D15B0, 150, -10, 2);
+ func_800B3030(globalCtx, &sp34, &gZeroVec3f, &gZeroVec3f, 150, -10, 2);
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
this->actionFunc = func_808D1F7C;
}
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 e48b3d1696..e07abfbe9b 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.c
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.c
@@ -5,6 +5,9 @@
*/
#include "z_en_fz.h"
+#include "overlays/actors/ovl_En_Wiz/z_en_wiz.h"
+#include "objects/object_fz/object_fz.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000015
@@ -15,7 +18,37 @@ void EnFz_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnFz_Update(Actor* thisx, GlobalContext* globalCtx);
void EnFz_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
+void func_80932784(EnFz* this, GlobalContext* globalCtx);
+void func_80932AE8(EnFz* this);
+void func_80932AF4(EnFz* this);
+void func_80932BD4(EnFz* this);
+void func_809330D4(EnFz* this);
+void func_80933104(EnFz* this, GlobalContext* globalCtx);
+void func_80933184(EnFz* this);
+void func_809331F8(EnFz* this, GlobalContext* globalCtx);
+void func_80933248(EnFz* this);
+void func_80933274(EnFz* this, GlobalContext* globalCtx);
+void func_80933324(EnFz* this);
+void func_80933368(EnFz* this, GlobalContext* globalCtx);
+void func_809333A4(EnFz* this);
+void func_809333D8(EnFz* this, GlobalContext* globalCtx);
+void func_80933414(EnFz* this);
+void func_80933444(EnFz* this, GlobalContext* globalCtx);
+void func_80933480(EnFz* this, GlobalContext* globalCtx);
+void func_809334B8(EnFz* this, GlobalContext* globalCtx);
+void func_809336C0(EnFz* this, GlobalContext* globalCtx);
+void func_80933760(EnFz* this, GlobalContext* globalCtx);
+void func_80933790(EnFz* this);
+void func_809337D4(EnFz* this, GlobalContext* globalCtx);
+void func_8093389C(EnFz* this);
+void func_809338E0(EnFz* this, GlobalContext* globalCtx);
+void func_80933AF4(EnFz* this);
+void func_80933B38(EnFz* this, GlobalContext* globalCtx);
+void func_80934018(EnFz* this, Vec3f* a, Vec3f* b, Vec3f* c, f32 arg4);
+void func_809340BC(EnFz* this, Vec3f* a, Vec3f* b, Vec3f* c, f32 arg4, f32 arg5, s16 arg6, u8 arg7);
+void func_80934178(EnFz* this, GlobalContext* globalCtx);
+void func_80934464(EnFz* this, GlobalContext* globalCtx);
+
const ActorInit En_Fz_InitVars = {
ACTOR_EN_FZ,
ACTORCAT_ENEMY,
@@ -28,29 +61,66 @@ const ActorInit En_Fz_InitVars = {
(ActorFunc)EnFz_Draw,
};
-// static ColliderCylinderInitType1 sCylinderInit = {
-static ColliderCylinderInitType1 D_809346F8 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x00 }, { 0xF7CFEFDD, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+static s16 D_809346F0[] = { 0, 0x2000, 0x4000, 0 };
+
+static ColliderCylinderInitType1 sCylinderInit1 = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ { 0xF7CFEFDD, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 30, 80, 0, { 0, 0, 0 } },
};
-// static ColliderCylinderInitType1 sCylinderInit = {
-static ColliderCylinderInitType1 D_80934724 = {
- { COLTYPE_METAL, AT_NONE, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_NONE, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x00 }, { 0x00001022, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
+static ColliderCylinderInitType1 sCylinderInit2 = {
+ {
+ COLTYPE_METAL,
+ AT_NONE,
+ AC_ON | AC_HARD | AC_TYPE_PLAYER,
+ OC1_NONE,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ { 0x00001022, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_NONE,
+ },
{ 35, 80, 0, { 0, 0, 0 } },
};
-// static ColliderCylinderInitType1 sCylinderInit = {
-static ColliderCylinderInitType1 D_80934750 = {
- { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_NONE, OC1_NONE, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x20000000, 0x02, 0x04 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+static ColliderCylinderInitType1 sCylinderInit3 = {
+ {
+ COLTYPE_NONE,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_NONE,
+ OC1_NONE,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x20000000, 0x02, 0x04 },
+ { 0x00000000, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 20, 30, -15, { 0, 0, 0 } },
};
-// static DamageTable sDamageTable = {
-static DamageTable D_8093477C = {
+static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
/* Deku Stick */ DMG_ENTRY(0, 0xD),
/* Horse trample */ DMG_ENTRY(0, 0x0),
@@ -85,96 +155,870 @@ static DamageTable D_8093477C = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_8093479C[] = {
+static InitChainEntry sInitChain[] = {
ICHAIN_S8(hintId, 59, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1400, ICHAIN_CONTINUE),
ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP),
};
-#endif
+void EnFz_Init(Actor* thisx, GlobalContext* globalCtx) {
+ EnFz* this = THIS;
-extern ColliderCylinderInit D_809346F8;
-extern ColliderCylinderInit D_80934724;
-extern ColliderCylinderInit D_80934750;
-extern DamageTable D_8093477C;
-extern InitChainEntry D_8093479C[];
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->actor.colChkInfo.damageTable = &sDamageTable;
+ this->actor.colChkInfo.health = 3;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/EnFz_Init.s")
+ Collider_InitCylinder(globalCtx, &this->collider1);
+ Collider_SetCylinderType1(globalCtx, &this->collider1, &this->actor, &sCylinderInit1);
+ Collider_InitCylinder(globalCtx, &this->collider2);
+ Collider_SetCylinderType1(globalCtx, &this->collider2, &this->actor, &sCylinderInit2);
+ Collider_InitCylinder(globalCtx, &this->collider3);
+ Collider_SetCylinderType1(globalCtx, &this->collider3, &this->actor, &sCylinderInit3);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/EnFz_Destroy.s")
+ Actor_SetScale(&this->actor, 0.008f);
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+ this->actor.flags &= ~1;
+ this->unk_BC8 = 0;
+ this->unk_BCF = 0;
+ this->unk_BCC = 1;
+ this->unk_BCD = 0;
+ this->unk_BCE = 0;
+ this->unk_BD7 = 1;
+ this->unk_BD8 = 0;
+ this->actor.speedXZ = 0.0f;
+ this->actor.uncullZoneScale = 400.0f;
+ this->unk_BAC = this->actor.world.pos.y;
+ this->unk_BB4 = this->actor.world.pos.y;
+ this->unk_BA8 = this->actor.world.pos.x;
+ this->unk_BB0 = this->actor.world.pos.z;
+ this->actor.velocity.y = this->actor.gravity;
+ this->unk_BB8 = 135.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80932784.s")
+ if (ENFZ_GET_8000(&this->actor)) {
+ this->unk_BC0 = 0;
+ this->actor.scale.y = 0.0f;
+ func_80933184(this);
+ } else {
+ this->unk_BC0 = 255;
+ if (this->actor.shape.rot.z == 0) {
+ this->unk_BC6 = (s32)Rand_ZeroFloat(64.0f) + 192;
+ } else {
+ if (this->actor.shape.rot.z < 0) {
+ this->actor.shape.rot.z = 1;
+ } else if (this->actor.shape.rot.z > 0x10) {
+ this->actor.shape.rot.z = 0x10;
+ }
+ this->actor.shape.rot.z += -1;
+ this->unk_BC6 = this->actor.shape.rot.z * 0x10;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809328A4.s")
+ this->actor.shape.rot.z = 0;
+ if (ENFZ_GET_4000(&this->actor)) {
+ this->unk_BC0 = 0;
+ this->actor.scale.y = 0.0f;
+ func_80933184(this);
+ } else if (ENFZ_GET_F(&this->actor) == ENFZ_F_3) {
+ func_80933AF4(this);
+ } else {
+ func_8093389C(this);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809328F4.s")
+ this->unk_BA4 = 0;
+ this->unk_BA0 = 0.0f;
+ this->unk_B9C = 0.0f;
+ func_80932784(this, globalCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80932AE8.s")
+void EnFz_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnFz* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80932AF4.s")
+ Collider_DestroyCylinder(globalCtx, &this->collider1);
+ Collider_DestroyCylinder(globalCtx, &this->collider2);
+ Collider_DestroyCylinder(globalCtx, &this->collider3);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80932BD4.s")
+ if ((this->actor.parent != NULL) && (this->unk_BC4 == 0) && (this->actor.parent->id == ACTOR_EN_WIZ) &&
+ (this->actor.parent->update != NULL) && (((EnWiz*)this->actor.parent)->unk_448 != 0)) {
+ EnWiz* wiz = (EnWiz*)this->actor.parent;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80932C98.s")
+ wiz->unk_448 = 0;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933014.s")
+void func_80932784(EnFz* this, GlobalContext* globalCtx) {
+ Vec3f sp5C;
+ Vec3f sp50;
+ Vec3f sp44;
+ s32 sp40;
+ CollisionPoly* sp3C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809330D4.s")
+ sp5C.x = this->actor.world.pos.x;
+ sp5C.y = this->actor.world.pos.y + 20.0f;
+ sp5C.z = this->actor.world.pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933104.s")
+ Matrix_InsertTranslation(sp5C.x, sp5C.y, sp5C.z, MTXMODE_NEW);
+ Matrix_InsertRotation(this->actor.shape.rot.x, this->actor.shape.rot.y, this->actor.shape.rot.z, MTXMODE_APPLY);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933184.s")
+ sp44.x = sp44.y = 0.0f;
+ sp44.z = 440.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809331F8.s")
+ Matrix_MultiplyVector3fByState(&sp44, &this->unk_22C);
+ if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &sp5C, &this->unk_22C, &sp50, &sp3C, 1, 0, 0, 1, &sp40)) {
+ Math_Vec3f_Copy(&this->unk_22C, &sp50);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933248.s")
+ sp5C.x = this->actor.world.pos.x - this->unk_22C.x;
+ sp5C.z = this->actor.world.pos.z - this->unk_22C.z;
+ this->unk_238 = SQ(sp5C.x) + SQ(sp5C.z);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933274.s")
+s32 func_809328A4(EnFz* this, Vec3f* arg1) {
+ f32 temp_f0 = this->actor.world.pos.x - arg1->x;
+ f32 temp_f2 = this->actor.world.pos.z - arg1->z;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933324.s")
+ if (this->unk_238 <= (SQ(temp_f0) + SQ(temp_f2))) {
+ return true;
+ }
+ return false;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933368.s")
+void func_809328F4(EnFz* this, GlobalContext* globalCtx, Vec3f* arg2, s32 arg3, f32 arg4) {
+ s32 i;
+ Vec3f spA8;
+ Vec3f sp9C;
+ Vec3f sp90;
+ Color_RGBA8 sp8C;
+ Color_RGBA8 sp88;
+ f32 temp_f24;
+ s32 temp_s1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809333A4.s")
+ sp90.x = sp90.z = 0.0f;
+ sp90.y = -1.0f;
+ sp8C.r = 155;
+ sp8C.g = 255;
+ sp8C.b = 255;
+ sp8C.a = 255;
+ sp88.r = 200;
+ sp88.g = 200;
+ sp88.b = 200;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809333D8.s")
+ 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;
+ spA8.y = Rand_ZeroFloat(arg4) + arg2->y;
+ spA8.z = randPlusMinusPoint5Scaled(arg4) + arg2->z;
+ sp9C.x = randPlusMinusPoint5Scaled(10.0f);
+ sp9C.y = Rand_ZeroFloat(10.0f) + 2.0f;
+ sp9C.z = randPlusMinusPoint5Scaled(10.0f);
+ EffectSsEnIce_Spawn(globalCtx, &spA8, temp_f24, &sp9C, &sp90, &sp8C, &sp88, temp_s1);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933414.s")
+ CollisionCheck_SpawnShieldParticles(globalCtx, arg2);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933444.s")
+void func_80932AE8(EnFz* this) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933480.s")
+void func_80932AF4(EnFz* this) {
+ Vec3f sp44;
+ Vec3f sp38;
+ Vec3f sp2C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809334B8.s")
+ 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;
+ sp2C.x = sp2C.z = 0.0f;
+ sp2C.y = 0.1f;
+ sp38.x = sp38.y = sp38.z = 0.0f;
+ func_80934018(this, &sp44, &sp38, &sp2C, Rand_ZeroFloat(7.5f) + 15.0f);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809336C0.s")
+void func_80932BD4(EnFz* this) {
+ Vec3f sp44;
+ Vec3f sp38;
+ Vec3f sp2C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933760.s")
+ if (!(this->unk_BC6 & 3)) {
+ sp44.x = randPlusMinusPoint5Scaled(40.0f) + this->actor.world.pos.x;
+ sp44.y = this->unk_BB4;
+ sp44.z = randPlusMinusPoint5Scaled(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;
+ func_80934018(this, &sp44, &sp38, &sp2C, Rand_ZeroFloat(7.5f) + 15.0f);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933790.s")
+void func_80932C98(EnFz* this, GlobalContext* globalCtx) {
+ Vec3f sp3C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809337D4.s")
+ if (this->unk_BCD != 0) {
+ if ((this->actor.bgCheckFlags & 8) || !func_800BC4EC(&this->actor, globalCtx, 60.0f, this->actor.world.rot.y)) {
+ this->actor.bgCheckFlags &= ~0x8;
+ this->unk_BCD = 0;
+ this->unk_BBC = 0.0f;
+ this->actor.speedXZ = 0.0f;
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_8093389C.s")
+ if (this->actor.parent != NULL) {
+ if ((this->unk_BC4 != 5) && (this->actor.parent->id == ACTOR_EN_WIZ)) {
+ Actor* parent = this->actor.parent;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809338E0.s")
+ if ((parent->update == NULL) || (parent->colChkInfo.health <= 0)) {
+ this->actor.colChkInfo.health = 0;
+ this->unk_BC4 = 5;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_BROKEN);
+ sp3C.x = this->actor.world.pos.x;
+ sp3C.y = this->actor.world.pos.y;
+ sp3C.z = this->actor.world.pos.z;
+ func_809328F4(this, globalCtx, &sp3C, 30, 10.0f);
+ func_809336C0(this, globalCtx);
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933AF4.s")
+ if ((this->actor.colChkInfo.health != 0) && (this->unk_BC4 == 1)) {
+ this->actor.colChkInfo.health = 0;
+ this->unk_BC4 = 5;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_BROKEN);
+ sp3C.x = this->actor.world.pos.x;
+ sp3C.y = this->actor.world.pos.y;
+ sp3C.z = this->actor.world.pos.z;
+ func_809328F4(this, globalCtx, &sp3C, 30, 10.0f);
+ func_809336C0(this, globalCtx);
+ return;
+ }
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933B38.s")
+ if (this->unk_BCE != 0) {
+ if (ENFZ_GET_8000(&this->actor) && (this->collider1.base.atFlags & AC_HIT)) {
+ this->unk_BCD = 0;
+ this->unk_BBC = 0.0f;
+ this->collider1.base.acFlags &= ~AC_HIT;
+ this->actor.speedXZ = 0.0f;
+ this->unk_BCA = 10;
+ func_809330D4(this);
+ } else if (this->collider2.base.acFlags & AC_BOUNCED) {
+ this->collider2.base.acFlags &= ~AC_BOUNCED;
+ this->collider1.base.acFlags &= ~AC_HIT;
+ } else if (this->collider1.base.acFlags & AC_HIT) {
+ this->collider1.base.acFlags &= ~AC_HIT;
+ switch (this->actor.colChkInfo.damageEffect) {
+ case 4:
+ this->unk_BA4 = 0x28;
+ this->unk_B9C = 1.0f;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80933B48.s")
+ case 15:
+ Actor_ApplyDamage(&this->actor);
+ func_800BCB70(&this->actor, 0x4000, 0xFF, 0x2000, 8);
+ if (this->actor.colChkInfo.health != 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_FREEZAD_DAMAGE);
+ sp3C.x = this->actor.world.pos.x;
+ sp3C.y = this->actor.world.pos.y;
+ sp3C.z = this->actor.world.pos.z;
+ func_809328F4(this, globalCtx, &sp3C, 10, 0.0f);
+ this->unk_BCF++;
+ break;
+ }
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_BROKEN);
+ sp3C.x = this->actor.world.pos.x;
+ sp3C.y = this->actor.world.pos.y;
+ sp3C.z = this->actor.world.pos.z;
+ func_809328F4(this, globalCtx, &sp3C, 30, 10.0f);
+ func_809336C0(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/EnFz_Update.s")
+ case 2:
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_FREEZAD_DEAD);
+ func_80933790(this);
+ break;
+ }
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/EnFz_Draw.s")
+void func_80933014(EnFz* this) {
+ s16 temp_a1 = this->actor.yawTowardsPlayer;
+ s32 temp_a2 = ENFZ_GET_3000(&this->actor);
+ s16 temp;
+ s16 temp2;
+ s32 temp_v1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80934018.s")
+ if (!ENFZ_GET_8000(&this->actor)) {
+ temp_v1 = this->actor.home.rot.y;
+ if (temp_a2 != 3) {
+ temp2 = temp_a1 - temp_v1;
+ if (D_809346F0[temp_a2] < ABS_ALT(temp2)) {
+ temp = (temp2 > 0) ? D_809346F0[temp_a2] : -D_809346F0[temp_a2];
+ temp_a1 = this->actor.home.rot.y + temp;
+ }
+ }
+ }
+ Math_SmoothStepToS(&this->actor.shape.rot.y, temp_a1, 10, 2000, 0);
+ this->actor.world.rot.y = this->actor.shape.rot.y;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_809340BC.s")
+void func_809330D4(EnFz* this) {
+ this->unk_BD6 = 2;
+ this->unk_BCE = 0;
+ this->actor.flags &= ~1;
+ this->actionFunc = func_80933104;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80934178.s")
+void func_80933104(EnFz* this, GlobalContext* globalCtx) {
+ this->unk_BC0 -= 16;
+ if (this->unk_BC0 > 255) {
+ this->unk_BC0 = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fz/func_80934464.s")
+ if (Math_SmoothStepToF(&this->actor.scale.y, 0, 1.0f, 0.0005f, 0.0f) == 0.0f) {
+ func_80933184(this);
+ }
+}
+
+void func_80933184(EnFz* this) {
+ this->unk_BD6 = 0;
+ this->unk_BD2 = 0;
+ this->unk_BD0 = 0;
+ this->unk_BCA = 100;
+
+ this->actor.world.pos.x = this->unk_BA8;
+ this->actor.world.pos.y = this->unk_BAC;
+ this->actor.world.pos.z = this->unk_BB0;
+
+ if (ENFZ_GET_4000(&this->actor)) {
+ this->unk_BD6 = 2;
+ this->unk_BCA = 10;
+ this->unk_BD2 = 4000;
+ this->actionFunc = func_80933274;
+ } else {
+ this->actionFunc = func_809331F8;
+ }
+}
+
+void func_809331F8(EnFz* this, GlobalContext* globalCtx) {
+ if ((this->unk_BCA == 0) && (this->actor.xzDistToPlayer < 400.0f)) {
+ func_80933248(this);
+ }
+}
+
+void func_80933248(EnFz* this) {
+ this->unk_BD6 = 2;
+ this->unk_BCA = 20;
+ this->unk_BD2 = 4000;
+ this->actionFunc = func_80933274;
+}
+
+void func_80933274(EnFz* this, GlobalContext* globalCtx) {
+ if (this->unk_BCA == 0) {
+
+ this->unk_BC0 += 8;
+ if (this->unk_BC0 > 255) {
+ this->unk_BC0 = 255;
+ }
+
+ if (Math_SmoothStepToF(&this->actor.scale.y, 0.008f, 1.0f, 0.0005f, 0.0f) == 0.0f) {
+ if (ENFZ_GET_4000(&this->actor)) {
+ func_8093389C(this);
+ } else {
+ func_80933324(this);
+ }
+ }
+ }
+}
+
+void func_80933324(EnFz* this) {
+ this->unk_BD6 = 1;
+ this->unk_BCA = 40;
+ this->unk_BCC = 1;
+ this->unk_BCE = 1;
+ this->actor.flags |= 1;
+ this->actor.gravity = -1.0f;
+ this->actionFunc = func_80933368;
+}
+
+void func_80933368(EnFz* this, GlobalContext* globalCtx) {
+ func_80933014(this);
+ if (this->unk_BCA == 0) {
+ func_809333A4(this);
+ }
+}
+
+void func_809333A4(EnFz* this) {
+ this->unk_BD6 = 1;
+ this->unk_BCD = 1;
+ this->unk_BCA = 100;
+ this->unk_BBC = 4.0f;
+ this->actionFunc = func_809333D8;
+}
+
+void func_809333D8(EnFz* this, GlobalContext* globalCtx) {
+ if ((this->unk_BCA == 0) || (this->unk_BCD == 0)) {
+ func_80933414(this);
+ }
+}
+
+void func_80933414(EnFz* this) {
+ this->unk_BD6 = 1;
+ this->unk_BBC = 0.0f;
+ this->actor.speedXZ = 0.0f;
+ this->unk_BCA = 40;
+ this->actionFunc = func_80933444;
+}
+
+void func_80933444(EnFz* this, GlobalContext* globalCtx) {
+ func_80933014(this);
+ if (this->unk_BCA == 0) {
+ func_80933480(this, globalCtx);
+ }
+}
+
+void func_80933480(EnFz* this, GlobalContext* globalCtx) {
+ this->unk_BD6 = 1;
+ this->unk_BCA = 80;
+ this->actionFunc = func_809334B8;
+ func_80932784(this, globalCtx);
+}
+
+void func_809334B8(EnFz* this, GlobalContext* globalCtx) {
+ Vec3f sp64;
+ Vec3f sp58;
+ Vec3f sp4C;
+ Vec3f sp40;
+ u8 sp3F;
+ s16 sp3C;
+
+ if (this->unk_BCA == 0) {
+ func_809330D4(this);
+ return;
+ }
+
+ if (this->unk_BCA > 10) {
+ sp3F = 0;
+ sp3C = 150;
+ func_800B9010(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
+ if ((this->unk_BCA - 10) < 16) {
+ sp3C = (this->unk_BCA * 10) - 100;
+ }
+
+ sp40.x = sp40.z = 0.0f;
+ sp40.y = 0.6f;
+
+ sp58.x = this->actor.world.pos.x;
+ sp58.y = this->actor.world.pos.y + 20.0f;
+ sp58.z = this->actor.world.pos.z;
+
+ Matrix_RotateY(this->actor.shape.rot.y, 0);
+
+ sp64.x = 0.0f;
+ sp64.y = -2.0f;
+ sp64.z = ((ENFZ_GET_F(&this->actor) == ENFZ_F_1) ? 10.0f
+ : (ENFZ_GET_F(&this->actor) == ENFZ_F_2) ? 20.0f
+ : 0.0f) +
+ 20;
+
+ Matrix_MultiplyVector3fByState(&sp64, &sp4C);
+
+ if ((this->unk_BCA & 7) == 0) {
+ sp3F = 1;
+ }
+
+ func_809340BC(this, &sp58, &sp4C, &sp40, 2.0f, 25.0f, sp3C, sp3F);
+
+ sp58.x += sp4C.x * 0.5f;
+ sp58.y += sp4C.y * 0.5f;
+ sp58.z += sp4C.z * 0.5f;
+
+ func_809340BC(this, &sp58, &sp4C, &sp40, 2.0f, 25.0f, sp3C, 0);
+ }
+}
+
+void func_809336C0(EnFz* this, GlobalContext* globalCtx) {
+ this->unk_BD6 = 0;
+ this->unk_BBC = 0.0f;
+ this->actor.gravity = 0.0f;
+ this->actor.velocity.y = 0.0f;
+ this->actor.speedXZ = 0.0f;
+ this->unk_BCC = 1;
+ this->unk_BCE = 0;
+ this->unk_BD8 = 1;
+ this->actor.flags &= ~1;
+ this->unk_BD7 = 0;
+ this->unk_BCA = 60;
+ func_800BC154(globalCtx, &globalCtx->actorCtx, &this->actor, ACTORCAT_PROP);
+ Item_DropCollectibleRandom(globalCtx, &this->actor, &this->actor.world.pos, 0xA0);
+ this->actionFunc = func_80933760;
+}
+
+void func_80933760(EnFz* this, GlobalContext* globalCtx) {
+ if (this->unk_BCA == 0) {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void func_80933790(EnFz* this) {
+ this->unk_BD6 = 3;
+ this->unk_BCE = 0;
+ this->unk_BD8 = 1;
+ this->actor.flags &= ~1;
+ this->actor.speedXZ = 0.0f;
+ this->unk_BBC = 0.0f;
+ this->actionFunc = func_809337D4;
+}
+
+void func_809337D4(EnFz* this, GlobalContext* globalCtx) {
+ Math_StepToF(&this->actor.scale.y, 0.0006f, 0.0006f);
+
+ if (this->actor.scale.y < 0.006f) {
+ this->actor.scale.x += 0.001f;
+ this->actor.scale.z += 0.001f;
+ }
+
+ if (this->actor.scale.y < 0.004f) {
+ this->unk_BC0 -= 20;
+ if (this->unk_BC0 > 255) {
+ this->unk_BC0 = 0;
+ }
+ }
+
+ if (this->unk_BC0 == 0) {
+ func_809336C0(this, globalCtx);
+ }
+}
+
+void func_8093389C(EnFz* this) {
+ this->unk_BD6 = 1;
+ this->unk_BCA = 40;
+ this->unk_BCC = 1;
+ this->unk_BCE = 1;
+ this->actor.flags |= 1;
+ this->actor.gravity = -1.0f;
+ this->actionFunc = func_809338E0;
+}
+
+void func_809338E0(EnFz* this, GlobalContext* globalCtx) {
+ Vec3f sp64;
+ Vec3f sp58;
+ Vec3f sp4C;
+ Vec3f sp40;
+ u8 sp3F;
+ s16 sp3C;
+
+ if (this->unk_BC6 & (0x80 | 0x40)) {
+ func_80933014(this);
+ func_80932784(this, globalCtx);
+ return;
+ }
+
+ sp3F = 0;
+ sp3C = 150;
+ func_800B9010(&this->actor, NA_SE_EN_FREEZAD_BREATH - SFX_FLAG);
+
+ if ((this->unk_BC6 & 0x3F) >= 0x30) {
+ sp3C = 630 - ((this->unk_BC6 & 0x3F) * 10);
+ }
+
+ sp40.x = sp40.z = 0.0f;
+ sp40.y = 0.6f;
+
+ sp58.x = this->actor.world.pos.x;
+ sp58.y = this->actor.world.pos.y + 20.0f;
+ sp58.z = this->actor.world.pos.z;
+
+ Matrix_RotateY(this->actor.shape.rot.y, 0);
+
+ sp64.x = 0.0f;
+ sp64.y = -2.0f;
+ sp64.z = ((ENFZ_GET_F(&this->actor) == ENFZ_F_1) ? 10.0f
+ : (ENFZ_GET_F(&this->actor) == ENFZ_F_2) ? 20.0f
+ : 0.0f) +
+ 20;
+
+ Matrix_MultiplyVector3fByState(&sp64, &sp4C);
+
+ if (!(this->unk_BC6 & 7)) {
+ sp3F = 1;
+ }
+
+ func_809340BC(this, &sp58, &sp4C, &sp40, 2.0f, 25.0f, sp3C, sp3F);
+ sp58.x += sp4C.x * 0.5f;
+ sp58.y += sp4C.y * 0.5f;
+ sp58.z += sp4C.z * 0.5f;
+ func_809340BC(this, &sp58, &sp4C, &sp40, 2.0f, 25.0f, sp3C, 0);
+}
+
+void func_80933AF4(EnFz* this) {
+ this->unk_BD6 = 1;
+ this->unk_BCA = 40;
+ this->unk_BCC = 1;
+ this->unk_BCE = 1;
+ this->actor.flags |= 1;
+ this->actor.gravity = -1.0f;
+ this->actionFunc = func_80933B38;
+}
+
+void func_80933B38(EnFz* this, GlobalContext* globalCtx) {
+}
+
+void func_80933B48(EnFz* this, GlobalContext* globalCtx) {
+ if (this->unk_BA4 != 0) {
+ if (this->unk_BA4 > 0) {
+ this->unk_BA4--;
+ }
+
+ if (this->unk_BA4 < 20) {
+ Math_SmoothStepToF(&this->unk_BA0, 0.0f, 0.5f, 0.03f, 0.0f);
+ this->unk_B9C = this->unk_BA4 * 0.05f;
+ } else {
+ Math_SmoothStepToF(&this->unk_BA0, 0.5f, 0.1f, 0.02f, 0.0f);
+ }
+ }
+}
+
+void EnFz_Update(Actor* thisx, GlobalContext* globalCtx) {
+ static EnFzUnkFunc D_809347AC[] = { func_80932AE8, func_80932AF4, func_80932BD4, func_80932BD4 };
+ s32 pad;
+ EnFz* this = THIS;
+
+ this->unk_BC6++;
+ if (this->unk_BC8 != 0) {
+ this->unk_BC8--;
+ }
+
+ if (this->unk_BCA != 0) {
+ this->unk_BCA--;
+ }
+
+ if (this->unk_BD9 != 0) {
+ this->unk_BD9--;
+ }
+
+ Actor_SetHeight(&this->actor, 50.0f);
+ func_80932C98(this, globalCtx);
+
+ this->actionFunc(this, globalCtx);
+
+ if (this->unk_BD8 == 0) {
+ Collider_UpdateCylinder(&this->actor, &this->collider1);
+ Collider_UpdateCylinder(&this->actor, &this->collider2);
+ if (this->unk_BCE != 0) {
+ if (this->actor.colorFilterTimer == 0) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider1.base);
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider2.base);
+ }
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider1.base);
+ }
+ }
+
+ Math_StepToF(&this->actor.speedXZ, this->unk_BBC, 0.2f);
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ if (this->unk_BCC != 0) {
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 20.0f, 5);
+ }
+
+ D_809347AC[this->unk_BD6](this);
+ func_80933B48(this, globalCtx);
+ func_80934178(this, globalCtx);
+}
+
+void EnFz_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ static Gfx* D_809347BC[] = { object_fz_DL_001130, object_fz_DL_0021A0, object_fz_DL_002CA0 };
+ s32 pad;
+ EnFz* this = THIS;
+ s32 sp9C = 3 - this->actor.colChkInfo.health;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ if (this->actor.colChkInfo.health == 0) {
+ sp9C = 2;
+ }
+
+ if (this->unk_BD7 != 0) {
+ func_800B8118(&this->actor, globalCtx, 0);
+ func_8012C2DC(globalCtx->state.gfxCtx);
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, globalCtx->state.frames % 128, 0x20, 0x20, 1, 0,
+ (globalCtx->state.frames * 2) % 128, 0x20, 0x20));
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gDPSetCombineLERP(POLY_XLU_DISP++, TEXEL1, PRIMITIVE, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIMITIVE, TEXEL0,
+ PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, ENVIRONMENT, 0);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 155, 255, 255, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 200, 200, 200, this->unk_BC0);
+ gSPDisplayList(POLY_XLU_DISP++, D_809347BC[sp9C]);
+ }
+
+ func_80934464(this, globalCtx);
+
+ if (this->unk_BA4 > 0) {
+ s32 pad2[6];
+ Vec3f sp58;
+ Vec3f sp4C;
+ s32 pad3;
+
+ sp4C = this->actor.world.pos;
+ sp58 = this->actor.world.pos;
+ sp4C.y += 20.0f;
+ sp58.y += 40.0f;
+ func_800BE680(globalCtx, NULL, &sp4C, 2, this->unk_BA0 * 4.0f, 0.5f, this->unk_B9C, 20);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void func_80934018(EnFz* this, Vec3f* a, Vec3f* b, Vec3f* c, f32 arg4) {
+ s16 i;
+ EnFzStruct* ptr = &this->unk_23C[0];
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_23C); i++, ptr++) {
+ if (ptr->unk_00 == 0) {
+ ptr->unk_00 = 1;
+ ptr->unk_04 = *a;
+ ptr->unk_10 = *b;
+ ptr->unk_1C = *c;
+ ptr->unk_2E = 0;
+ ptr->unk_30 = arg4 / 1000.0f;
+ ptr->unk_2C = 0;
+ ptr->unk_01 = 0;
+ break;
+ }
+ }
+}
+
+void func_809340BC(EnFz* this, Vec3f* a, Vec3f* b, Vec3f* c, f32 arg4, f32 arg5, s16 arg6, u8 arg7) {
+ s16 i;
+ EnFzStruct* ptr = &this->unk_23C[0];
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_23C); i++, ptr++) {
+ if (ptr->unk_00 == 0) {
+ ptr->unk_00 = 2;
+ ptr->unk_04 = *a;
+ ptr->unk_10 = *b;
+ ptr->unk_1C = *c;
+ ptr->unk_2E = 0;
+ ptr->unk_30 = arg4 / 1000.0f;
+ ptr->unk_34 = arg5 / 1000.0f;
+ ptr->unk_2C = arg6;
+ ptr->unk_01 = 0;
+ ptr->unk_38 = arg7;
+ break;
+ }
+ }
+}
+
+void func_80934178(EnFz* this, GlobalContext* globalCtx) {
+ s16 i;
+ EnFzStruct* ptr = this->unk_23C;
+ Vec3f sp64;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_23C); i++, ptr++) {
+ if (ptr->unk_00 != 0) {
+ ptr->unk_04.x += ptr->unk_10.x;
+ ptr->unk_04.y += ptr->unk_10.y;
+ ptr->unk_04.z += ptr->unk_10.z;
+
+ ptr->unk_01++;
+
+ ptr->unk_10.x += ptr->unk_1C.x;
+ ptr->unk_10.y += ptr->unk_1C.y;
+ ptr->unk_10.z += ptr->unk_1C.z;
+
+ if (ptr->unk_00 == 1) {
+ if (ptr->unk_2E == 0) {
+ ptr->unk_2C += 10;
+ if (ptr->unk_2C >= 100) {
+ ptr->unk_2E++;
+ }
+ } else {
+ ptr->unk_2C -= 3;
+ if (ptr->unk_2C <= 0) {
+ ptr->unk_2C = 0;
+ ptr->unk_00 = 0;
+ }
+ }
+ } else if (ptr->unk_00 == 2) {
+ Math_ApproachF(&ptr->unk_30, ptr->unk_34, 0.1f, ptr->unk_34 / 10.0f);
+ if (ptr->unk_2E == 0) {
+ if (ptr->unk_01 >= 7) {
+ ptr->unk_2E++;
+ }
+ } else {
+ ptr->unk_10.x *= 0.75f;
+ ptr->unk_1C.y = 2.0f;
+ ptr->unk_10.z *= 0.75f;
+ ptr->unk_2C -= 17;
+ if (ptr->unk_2C <= 0) {
+ ptr->unk_2C = 0;
+ ptr->unk_00 = 0;
+ }
+ }
+
+ if ((this->unk_BD9 == 0) && (ptr->unk_2C > 100) && (ptr->unk_38 != 0)) {
+ this->collider3.dim.pos.x = ptr->unk_04.x;
+ this->collider3.dim.pos.y = ptr->unk_04.y;
+ this->collider3.dim.pos.z = ptr->unk_04.z;
+ CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider3.base);
+ }
+
+ sp64.x = ptr->unk_04.x;
+ sp64.y = ptr->unk_04.y + 10.0f;
+ sp64.z = ptr->unk_04.z;
+
+ if ((ptr->unk_2E != 2) && func_809328A4(this, &sp64)) {
+ ptr->unk_2E = 2;
+ ptr->unk_10.x = 0.0f;
+ ptr->unk_10.z = 0.0f;
+ }
+ }
+ }
+ }
+}
+
+void func_80934464(EnFz* this, GlobalContext* globalCtx) {
+ GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
+ s16 i;
+ u8 flag = 0;
+ EnFzStruct* ptr = this->unk_23C;
+
+ OPEN_DISPS(gfxCtx);
+
+ func_8012C2DC(globalCtx->state.gfxCtx);
+
+ gDPSetColorDither(POLY_XLU_DISP++, G_CD_BAYER);
+ gDPSetAlphaDither(POLY_XLU_DISP++, G_AD_PATTERN);
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_23C); i++, ptr++) {
+ if (ptr->unk_00 > 0) {
+ gDPPipeSync(POLY_XLU_DISP++);
+
+ if (flag == 0) {
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_051180);
+ flag++;
+ }
+
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, ptr->unk_2C);
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, (ptr->unk_01 + (i * 3)) * 3,
+ (ptr->unk_01 + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
+
+ Matrix_InsertTranslation(ptr->unk_04.x, ptr->unk_04.y, ptr->unk_04.z, MTXMODE_NEW);
+ Matrix_NormalizeXYZ(&globalCtx->billboardMtxF);
+ Matrix_Scale(ptr->unk_30, ptr->unk_30, 1.0f, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_051238);
+ }
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
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 7eb989cf36..5e76eadf9f 100644
--- a/src/overlays/actors/ovl_En_Fz/z_en_fz.h
+++ b/src/overlays/actors/ovl_En_Fz/z_en_fz.h
@@ -5,10 +5,70 @@
struct EnFz;
+typedef void (*EnFzActionFunc)(struct EnFz*, GlobalContext*);
+typedef void (*EnFzUnkFunc)(struct EnFz*);
+
+#define ENFZ_GET_F(thisx) ((thisx)->params & 0xF)
+#define ENFZ_GET_3000(thisx) (((thisx)->params & 0x3000) >> 0xC)
+#define ENFZ_GET_4000(thisx) ((thisx)->params & 0x4000)
+#define ENFZ_GET_8000(thisx) ((thisx)->params & 0x8000)
+
+enum {
+ /* 0 */ ENFZ_F_0,
+ /* 1 */ ENFZ_F_1,
+ /* 2 */ ENFZ_F_2,
+ /* 3 */ ENFZ_F_3,
+};
+
+typedef struct {
+ /* 0x00 */ u8 unk_00;
+ /* 0x01 */ u8 unk_01;
+ /* 0x04 */ Vec3f unk_04;
+ /* 0x10 */ Vec3f unk_10;
+ /* 0x1C */ Vec3f unk_1C;
+ /* 0x28 */ UNK_TYPE1 unk_28[0x4];
+ /* 0x2C */ s16 unk_2C;
+ /* 0x2E */ s16 unk_2E;
+ /* 0x30 */ f32 unk_30;
+ /* 0x34 */ f32 unk_34;
+ /* 0x38 */ u8 unk_38;
+} EnFzStruct; // size = 0x3C
+
typedef struct EnFz {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0xA98];
-} EnFz; // size = 0xBDC
+ /* 0x144 */ EnFzActionFunc actionFunc;
+ /* 0x148 */ ColliderCylinder collider1;
+ /* 0x194 */ ColliderCylinder collider2;
+ /* 0x1E0 */ ColliderCylinder collider3;
+ /* 0x22C */ Vec3f unk_22C;
+ /* 0x238 */ f32 unk_238;
+ /* 0x23C */ EnFzStruct unk_23C[40];
+ /* 0xB9C */ f32 unk_B9C;
+ /* 0xBA0 */ f32 unk_BA0;
+ /* 0xBA4 */ s16 unk_BA4;
+ /* 0xBA8 */ f32 unk_BA8;
+ /* 0xBAC */ f32 unk_BAC;
+ /* 0xBB0 */ f32 unk_BB0;
+ /* 0xBB4 */ f32 unk_BB4;
+ /* 0xBB8 */ f32 unk_BB8;
+ /* 0xBBC */ f32 unk_BBC;
+ /* 0xBC0 */ u32 unk_BC0;
+ /* 0xBC4 */ s16 unk_BC4;
+ /* 0xBC6 */ s16 unk_BC6;
+ /* 0xBC8 */ s16 unk_BC8;
+ /* 0xBCA */ s16 unk_BCA;
+ /* 0xBCC */ u8 unk_BCC;
+ /* 0xBCD */ u8 unk_BCD;
+ /* 0xBCE */ u8 unk_BCE;
+ /* 0xBCF */ u8 unk_BCF;
+ /* 0xBD0 */ s16 unk_BD0;
+ /* 0xBD2 */ s16 unk_BD2;
+ /* 0xBD4 */ UNK_TYPE1 unkBD4[2];
+ /* 0xBD6 */ u8 unk_BD6;
+ /* 0xBD7 */ u8 unk_BD7;
+ /* 0xBD8 */ u8 unk_BD8;
+ /* 0xBD9 */ u8 unk_BD9;
+} EnFz; /* size = 0xBDC */
extern const ActorInit En_Fz_InitVars;
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 ec6d56ef6d..547bfd8c63 100644
--- a/src/overlays/actors/ovl_En_Giant/z_en_giant.c
+++ b/src/overlays/actors/ovl_En_Giant/z_en_giant.c
@@ -352,9 +352,9 @@ void EnGiant_PlaySound(EnGiant* this) {
void EnGiant_UpdatePosition(EnGiant* this, GlobalContext* globalCtx, u32 actionIndex) {
CsCmdActorAction* actorAction = globalCtx->csCtx.npcActions[actionIndex];
- f32 floatUnk10 = actorAction->unk10;
+ f32 floatUnk10 = actorAction->unk0C.y;
s32 pad[2];
- f32 floatUnk1C = actorAction->unk1C;
+ f32 floatUnk1C = actorAction->unk18.y;
f32 functionTemp;
functionTemp = func_800F5A8C(actorAction->endFrame, actorAction->startFrame, globalCtx->csCtx.frames, globalCtx);
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 412bf7381a..5f3854a138 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -1408,7 +1408,7 @@ s32 func_8095097C(EnGm* this, GlobalContext* globalCtx) {
func_8013AF00(sp7C, 3, this->unk_234->count + 3);
if (!(this->unk_3A4 & 8)) {
- sp58 = D_801D15B0;
+ sp58 = gZeroVec3f;
func_8013B6B0(this->unk_234, &this->unk_244, &this->unk_254, this->unk_24C, this->unk_248, &this->unk_250, sp7C,
&sp58, this->unk_3C4);
func_8013B878(globalCtx, this->unk_234, this->unk_250, &sp58);
@@ -1427,7 +1427,7 @@ s32 func_8095097C(EnGm* this, GlobalContext* globalCtx) {
sp58 = this->actor.world.pos;
}
- this->unk_238 = D_801D15B0;
+ this->unk_238 = gZeroVec3f;
if (func_8013B6B0(this->unk_234, &this->unk_244, &this->unk_254, this->unk_24C, this->unk_248, &this->unk_250, sp7C,
&this->unk_238, this->unk_3C4)) {
@@ -1705,7 +1705,7 @@ void func_809514BC(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
CLOSE_DISPS(globalCtx->state.gfxCtx);
if (limbIndex == 9) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &sp30);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &sp30);
Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp30);
}
}
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 92a2270197..3a74a8a5f5 100644
--- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
+++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
@@ -1481,7 +1481,7 @@ void EnGoroiwa_Update(Actor* thisx, GlobalContext* globalCtx) {
sp50.y = this->actor.floorHeight;
sp50.z = this->actor.world.pos.z;
sp4C = (((Rand_ZeroOne() * 36.0f) + 250.0f) * this->actor.scale.x) + 10.0f;
- func_800AE930(&globalCtx->colCtx, Effect_GetParams(this->unk_248), &sp50, sp4C,
+ func_800AE930(&globalCtx->colCtx, Effect_GetByIndex(this->unk_248), &sp50, sp4C,
this->actor.world.rot.y, this->actor.floorPoly, this->actor.floorBgId);
}
sp48 = false;
@@ -1491,7 +1491,7 @@ void EnGoroiwa_Update(Actor* thisx, GlobalContext* globalCtx) {
}
if (sp48) {
- func_800AEF44(Effect_GetParams(this->unk_248));
+ func_800AEF44(Effect_GetByIndex(this->unk_248));
}
this->actionFunc(this, globalCtx);
diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
index b71a44a342..94a360df8c 100644
--- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
+++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c
@@ -221,7 +221,6 @@ extern Gfx D_06000720[];
extern Gfx D_06000080[];
extern s32 D_801BDA9C;
-extern Vec3s D_801D15BC;
const ActorInit En_Invadepoh_InitVars = {
ACTOR_EN_INVADEPOH,
@@ -2568,7 +2567,7 @@ void func_80B48620(Actor* thisx, GlobalContext* globalCtx) {
this->actor.update = func_80B4873C;
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06013928, &D_06009E58, this->jointTable, this->morphTable,
23);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &D_801D15BC, 5000, 0.05f, 0.3f, 0.12f);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 5000, 0.05f, 0.3f, 0.12f);
Animation_PlayLoop(&this->skelAnime, &D_06009E58);
func_80B482D4(this);
}
@@ -2636,7 +2635,7 @@ void func_80B48948(EnInvadepoh* this) {
this->actionTimer = Rand_S16Offset(150, 150);
if (rand < 0.5f) {
this->rand = 0;
- Math_Vec3s_Copy(&substruct->unk26, &D_801D15BC);
+ Math_Vec3s_Copy(&substruct->unk26, &gZeroVec3s);
substruct->unk30 = 0.1f;
substruct->unk2C = 1000;
} else if (rand < 0.75f) {
@@ -2702,7 +2701,7 @@ void func_80B48AD4(EnInvadepoh* this, GlobalContext* globalCtx) {
if (temp_v1_3 != this->rand) {
this->rand = temp_v1_3;
if (this->rand == 0) {
- Math_Vec3s_Copy(&substruct->unk26, &D_801D15BC);
+ Math_Vec3s_Copy(&substruct->unk26, &gZeroVec3s);
substruct->unk30 = 0.07f;
} else if (this->rand == 1) {
substruct->unk26.x = Rand_S16Offset(1000, 1000);
@@ -2772,7 +2771,7 @@ void func_80B48FB0(Actor* thisx, GlobalContext* globalCtx) {
this->actor.textId = 0x3330;
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06013928, &D_06009E58, this->jointTable, this->morphTable,
23);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &D_801D15BC, 100, 0.03, 0.3, 0.03);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 6, D_80B4EB00, 2, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
func_80B444F4(this, globalCtx);
EnInvadepoh_SetPathPointToWorldPos(this, 0);
func_800B4AEC(globalCtx, &this->actor, 50.0f);
@@ -3124,7 +3123,7 @@ void func_80B49F88(Actor* thisx, GlobalContext* globalCtx) {
func_80B44F58();
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06013928, &D_06014088, this->jointTable, this->morphTable,
23);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &D_801D15BC, 100, 0.03, 0.3, 0.03);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03, 0.3, 0.03);
func_80B44540(this, globalCtx);
func_80B44570(this);
func_80B44C24(this, globalCtx);
@@ -3355,7 +3354,7 @@ void func_80B4A9C8(Actor* thisx, GlobalContext* globalCtx) {
func_80B44F58();
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06013928, &D_06014088, this->jointTable, this->morphTable,
23);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &D_801D15BC, 100, 0.03f, 0.3f, 0.03f);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 1, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
func_80B44620(this, globalCtx);
if ((sp38 < CLOCK_TIME(2, 15)) || (sp38 >= CLOCK_TIME(6, 0))) {
this->pathIndex = 0;
@@ -3532,7 +3531,7 @@ void func_80B4B0C4(Actor* thisx, GlobalContext* globalCtx) {
23);
Animation_MorphToLoop(&this->skelAnime, &D_06009E58, 0.0f);
substruct = &this->behaviorInfo;
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &D_801D15BC, 2000, 0.08f, 0.3f, 0.03f);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 2000, 0.08f, 0.3f, 0.03f);
substruct->unk30 = 0.08f;
substruct->unk2C = 0x7D0;
func_800B4AEC(globalCtx, &this->actor, 50.0f);
@@ -3685,7 +3684,7 @@ void func_80B4B8BC(Actor* thisx, GlobalContext* globalCtx) {
Actor_SetObjectSegment(globalCtx, &this->actor);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_060080F0, &D_060021C8, this->jointTable, this->morphTable,
13);
- func_80B45C04(&this->behaviorInfo, 0, 0, 0, 0, &D_801D15BC, 3000, 0.1f, 0.0f, 0.0f);
+ func_80B45C04(&this->behaviorInfo, 0, 0, 0, 0, &gZeroVec3s, 3000, 0.1f, 0.0f, 0.0f);
func_80B44664(this, globalCtx);
EnInvadepoh_SetPathPointToWorldPos(this, 0);
func_800B4AEC(globalCtx, &this->actor, 50.0f);
@@ -3919,7 +3918,7 @@ void func_80B4C3A0(Actor* thisx, GlobalContext* globalCtx) {
func_80B44FEC();
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06015C28, &D_06016720, this->jointTable, this->morphTable,
22);
- func_80B45C04(&this->behaviorInfo, D_80B4EBDC, 1, D_80B4EC08, 0, &D_801D15BC, 100, 0.03f, 0.3f, 0.03f);
+ func_80B45C04(&this->behaviorInfo, D_80B4EBDC, 1, D_80B4EC08, 0, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
this->actor.textId = 0x33CD;
if (currentTime < 0xD5A0) {
this->unk304 = -0x8000;
@@ -4140,7 +4139,7 @@ void func_80B4CE54(Actor* thisx, GlobalContext* globalCtx) {
func_80B44F58();
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06013928, &D_06014088, this->jointTable, this->morphTable,
23);
- func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &D_801D15BC, 100, 0.03f, 0.3f, 0.03f);
+ func_80B45C04(&this->behaviorInfo, D_80B4EA90, 1, D_80B4EB00, 3, &gZeroVec3s, 100, 0.03f, 0.3f, 0.03f);
func_80B446D0(this, globalCtx);
this->actor.world.rot.y = this->actor.shape.rot.y;
func_80B44700(this);
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 631fc26e59..be3fe843d2 100644
--- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
+++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c
@@ -1157,8 +1157,7 @@ void EnKakasi_LimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec
EnKakasi* this = (EnKakasi*)actor;
if (limbIndex == 4) {
- // what is D_801D15B0 ? we didn't have to define it, we store the output though
- Matrix_MultiplyVector3fByState(&D_801D15B0, &this->unk1BC);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &this->unk1BC);
}
}
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 be9d78aed2..db4363228d 100644
--- a/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
+++ b/src/overlays/actors/ovl_En_Kgy/z_en_kgy.c
@@ -401,7 +401,7 @@ s32 func_80B41528(GlobalContext* globalCtx) {
}
void func_80B415A8(GlobalContext* globalCtx, Vec3f* arg1) {
- static EffShieldParticleInit D_80B43298 = {
+ static EffectShieldParticleInit D_80B43298 = {
16,
{ 0, 0, 0 },
{ 0, 200, 255, 255 },
@@ -426,7 +426,7 @@ void func_80B415A8(GlobalContext* globalCtx, Vec3f* arg1) {
D_80B43298.lightPoint.y = D_80B43298.position.y;
D_80B43298.lightPoint.z = D_80B43298.position.z;
- Effect_Add(globalCtx, &effectIndex, 3, 0, 1, &D_80B43298);
+ Effect_Add(globalCtx, &effectIndex, EFFECT_SHIELD_PARTICLE, 0, 1, &D_80B43298);
}
void func_80B4163C(EnKgy* this, GlobalContext* globalCtx) {
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 831e6a4b91..bb7fd235e1 100644
--- a/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
+++ b/src/overlays/actors/ovl_En_Minislime/z_en_minislime.c
@@ -215,7 +215,7 @@ void EnMinislime_AddIceSmokeEffect(EnMinislime* this, GlobalContext* globalCtx)
vel.x = randPlusMinusPoint5Scaled(1.5f);
vel.z = randPlusMinusPoint5Scaled(1.5f);
vel.y = 2.0f;
- EffectSsIceSmoke_Spawn(globalCtx, &pos, &vel, &D_801D15B0, 500);
+ EffectSsIceSmoke_Spawn(globalCtx, &pos, &vel, &gZeroVec3f, 500);
}
void EnMinislime_SetupDisappear(EnMinislime* this) {
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 b2792ec129..70945999f3 100644
--- a/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
+++ b/src/overlays/actors/ovl_En_Mushi2/z_en_mushi2.c
@@ -219,7 +219,7 @@ s32 func_80A68C5C(Vec3f* arg0, Vec3f* arg1) {
f32 temp_f0 = Math3D_Vec3fMagnitude(arg0);
if (temp_f0 < 0.005f) {
- Math_Vec3f_Copy(arg0, &D_801D15B0);
+ Math_Vec3f_Copy(arg0, &gZeroVec3f);
return false;
} else {
arg1->x = arg0->x * (1.0f / temp_f0);
@@ -1095,7 +1095,7 @@ void func_80A6B0D8(EnMushi2* this, GlobalContext* globalCtx) {
sp48.x = (this->unk_328.x * -0.6f) + (this->unk_31C.x * 0.1f);
sp48.y = (this->unk_328.y * -0.6f) + (this->unk_31C.y * 0.1f);
sp48.z = (this->unk_328.z * -0.6f) + (this->unk_31C.z * 0.1f);
- func_800B0E48(globalCtx, &this->actor.world.pos, &sp48, &D_801D15B0, &D_80A6B984[sp44], &D_80A6B98C[sp44],
+ func_800B0E48(globalCtx, &this->actor.world.pos, &sp48, &gZeroVec3f, &D_80A6B984[sp44], &D_80A6B98C[sp44],
(Rand_ZeroOne() * 5.0f) + 8.0f, (Rand_ZeroOne() * 5.0f) + 8.0f);
}
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 9d15d2df31..cb796119a0 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c
@@ -7,6 +7,7 @@
#include "z_en_pametfrog.h"
#include "overlays/actors/ovl_En_Bigpamet/z_en_bigpamet.h"
#include "overlays/effects/ovl_Effect_Ss_Hahen/z_eff_ss_hahen.h"
+#include "objects/object_bigslime/object_bigslime.h"
#define FLAGS 0x00000035
@@ -65,28 +66,6 @@ void EnPametfrog_SnapperSpawn(EnPametfrog* this, GlobalContext* globalCtx);
void EnPametfrog_SetupTransitionGekkoSnapper(EnPametfrog* this, GlobalContext* globalCtx);
void EnPametfrog_TransitionGekkoSnapper(EnPametfrog* this, GlobalContext* globalCtx);
-extern AnimationHeader D_06000994; // Begin Rear on Snapper
-extern AnimationHeader D_06001B08; // Call Snapper
-extern AnimationHeader D_06001E14; // Crawl on Wall
-extern AnimationHeader D_06001F20; // Falling
-extern AnimationHeader D_060030E4; // Get up from Back
-extern AnimationHeader D_0600347C; // Jab Punch
-extern AnimationHeader D_060039C4; // Jump on Ground
-extern AnimationHeader D_06003F28; // Kick
-extern AnimationHeader D_06004298; // Fall on Back
-extern AnimationHeader D_06004680; // Idle
-extern AnimationHeader D_06004894; // Jump on Snapper
-extern AnimationHeader D_06004D50; // Continue Rear on Snapper
-extern AnimationHeader D_060050B8; // Squeeze Body
-extern AnimationHeader D_060052EC; // Land on Snapper
-extern AnimationHeader D_06005694; // Wiggle
-extern AnimationHeader D_06005D54; // Head Knockback
-extern AnimationHeader D_060066B4; // Look Around
-extern AnimationHeader D_060070C4; // Hook Punch
-extern FlexSkeletonHeader D_0600DF98;
-extern AnimationHeader D_0600F048; // Windup Punch
-extern AnimationHeader D_0600F990; // Melee Ready Stance
-
const ActorInit En_Pametfrog_InitVars = {
ACTOR_EN_PAMETFROG,
ACTORCAT_BOSS,
@@ -207,7 +186,8 @@ void EnPametfrog_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 55.0f);
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInit);
- SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_0600DF98, &D_0600F990, this->jointTable, this->morphTable, 24);
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGekkoSkel, &gGekkoBoxingStanceAnim, this->jointTable,
+ this->morphTable, GEKKO_LIMB_MAX);
Collider_InitAndSetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, this->colElement);
this->params = CLAMP(this->actor.params, 1, 4);
if (Actor_GetRoomCleared(globalCtx, globalCtx->roomCtx.currRoom.num)) {
@@ -250,7 +230,7 @@ u8 EnPametfrog_Vec3fNormalize(Vec3f* vec) {
}
}
-void EnPametfrog_ChangeColliderFreeze(EnPametfrog* this) {
+void EnPametfrog_Freeze(EnPametfrog* this) {
this->drawEffect = GEKKO_DRAW_EFFECT_FROZEN;
this->collider.base.colType = COLTYPE_HIT3;
this->collider.elements->info.elemType = ELEMTYPE_UNK0;
@@ -259,14 +239,14 @@ void EnPametfrog_ChangeColliderFreeze(EnPametfrog* this) {
this->unk_2C4 = 1.0f;
}
-void EnPametfrog_ChangeColliderThaw(EnPametfrog* this, GlobalContext* globalCtx) {
+void EnPametfrog_Thaw(EnPametfrog* this, GlobalContext* globalCtx) {
this->freezeTimer = 0;
if (this->drawEffect == GEKKO_DRAW_EFFECT_FROZEN) {
- this->drawEffect = GEKKO_DRAW_EFFECT_NONE;
+ this->drawEffect = GEKKO_DRAW_EFFECT_THAW;
this->collider.base.colType = COLTYPE_HIT6;
this->collider.elements->info.elemType = ELEMTYPE_UNK1;
this->unk_2C4 = 0.0f;
- func_800BF7CC(globalCtx, &this->actor, this->limbPos, 12, 2, 0.3f, 0.2f);
+ func_800BF7CC(globalCtx, &this->actor, this->limbPos, ARRAY_COUNT(this->limbPos), 2, 0.3f, 0.2f);
}
}
@@ -407,7 +387,7 @@ void EnPametfrog_JumpOnGround(EnPametfrog* this, GlobalContext* globalCtx) {
void EnPametfrog_ApplyMagicArrowEffects(EnPametfrog* this, GlobalContext* globalCtx) {
if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_FIRE) {
- this->drawEffect = GEKKO_DRAW_EFFECT_NONE;
+ this->drawEffect = GEKKO_DRAW_EFFECT_THAW;
this->unk_2C4 = 3.0f;
this->unk_2C8 = 0.75f;
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_LIGHT) {
@@ -418,7 +398,7 @@ void EnPametfrog_ApplyMagicArrowEffects(EnPametfrog* this, GlobalContext* global
this->collider.elements[0].info.bumper.hitPos.x, this->collider.elements[0].info.bumper.hitPos.y,
this->collider.elements[0].info.bumper.hitPos.z, 0, 0, 0, CLEAR_TAG_LARGE_LIGHT_RAYS);
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_ICE) {
- EnPametfrog_ChangeColliderFreeze(this);
+ EnPametfrog_Freeze(this);
}
}
@@ -439,11 +419,11 @@ void EnPametfrog_ApplyStun(EnPametfrog* this) {
void EnPametfrog_SetupRearOnSnapper(EnPametfrog* this) {
if (this->actionFunc == EnPametfrog_RearOnSnapperRise) {
- Animation_PlayOnce(&this->skelAnime, &D_06005694);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoWiggleAnim);
} else if (this->actionFunc == EnPametfrog_RearOnSnapperWave) {
- Animation_PlayOnce(&this->skelAnime, &D_060052EC);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoLandOnSnapperAnim);
} else {
- Animation_PlayOnce(&this->skelAnime, &D_06004680);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoStandingIdleAnim);
}
this->actor.flags &= ~1;
@@ -458,9 +438,9 @@ void EnPametfrog_RearOnSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
if (Rand_ZeroOne() < 0.5f) {
- Animation_PlayOnce(&this->skelAnime, &D_06004D50);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoQuickFistPumpAnim);
} else {
- Animation_PlayOnce(&this->skelAnime, &D_06004680);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoStandingIdleAnim);
}
}
@@ -478,7 +458,7 @@ void EnPametfrog_RearOnSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupRearOnSnapperWave(EnPametfrog* this) {
- Animation_PlayOnce(&this->skelAnime, &D_06004894);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoJumpOnSnapperAnim);
this->timer = 15;
this->actionFunc = EnPametfrog_RearOnSnapperWave;
}
@@ -493,7 +473,7 @@ void EnPametfrog_RearOnSnapperWave(EnPametfrog* this, GlobalContext* globalCtx)
}
void EnPametfrog_SetupRearOnSnapperRise(EnPametfrog* this) {
- Animation_PlayOnce(&this->skelAnime, &D_060050B8);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoSqueezeAnim);
this->timer = 10;
this->actor.params = GEKKO_REAR_ON_SNAPPER;
this->actor.shape.rot.x = 0;
@@ -517,7 +497,7 @@ void EnPametfrog_SetupFallOffSnapper(EnPametfrog* this, GlobalContext* globalCtx
Vec3f eye;
s16 yaw;
- Animation_PlayOnce(&this->skelAnime, &D_06001F20);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoFallInAirAnim);
this->actor.params = GEKKO_FALL_OFF_SNAPPER;
this->actor.speedXZ = 7.0f;
this->actor.velocity.y = 15.0f;
@@ -554,7 +534,7 @@ void EnPametfrog_FallOffSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupJumpToWall(EnPametfrog* this) {
- Animation_Change(&this->skelAnime, &D_060039C4, 2.0f, 0.0f, 0.0f, 0, -2.0f);
+ Animation_Change(&this->skelAnime, &gGekkoJumpForwardAnim, 2.0f, 0.0f, 0.0f, 0, -2.0f);
this->actor.shape.rot.x = 0;
this->actor.shape.rot.z = 0;
this->actor.bgCheckFlags &= ~8;
@@ -578,14 +558,14 @@ void EnPametfrog_JumpToWall(EnPametfrog* this, GlobalContext* globalCtx) {
void EnPametfrog_SetupWallCrawl(EnPametfrog* this) {
if (this->actionFunc == EnPametfrog_JumpToWall) {
- Animation_PlayLoop(&this->skelAnime, &D_06001E14);
+ Animation_PlayLoop(&this->skelAnime, &gGekkoCrawlAnim);
this->collider.base.acFlags |= AC_ON;
this->unk_2D0.x = 0.0f;
this->unk_2D0.z = 0.0f;
this->actor.gravity = 0.0f;
this->actor.world.pos.y = this->actor.focus.pos.y;
this->unk_2D0.y = 1.0f;
- Math_Vec3f_Copy(&this->actor.colChkInfo.displacement, &D_801D15B0);
+ Math_Vec3f_Copy(&this->actor.colChkInfo.displacement, &gZeroVec3f);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->unk_2DC.x = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.x);
this->unk_2DC.y = COLPOLY_GET_NORMAL(this->actor.wallPoly->normal.y);
@@ -721,7 +701,8 @@ void EnPametfrog_WallPause(EnPametfrog* this, GlobalContext* globalCtx) {
void EnPametfrog_SetupClimbDownWall(EnPametfrog* this) {
s16 yaw;
- Animation_Change(&this->skelAnime, &D_060039C4, 0.0f, 0.0f, Animation_GetLastFrame(&D_060039C4), 2, 0.0f);
+ Animation_Change(&this->skelAnime, &gGekkoJumpForwardAnim, 0.0f, 0.0f,
+ Animation_GetLastFrame(&gGekkoJumpForwardAnim), 2, 0.0f);
this->actor.shape.rot.y = Actor_YawBetweenActors(&this->actor, this->actor.child);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.shape.rot.x = 0;
@@ -755,7 +736,7 @@ void EnPametfrog_ClimbDownWall(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupRunToSnapper(EnPametfrog* this) {
- Animation_Change(&this->skelAnime, &D_060039C4, 2.0f, 0.0f, 0.0f, 0, -2.0f);
+ Animation_Change(&this->skelAnime, &gGekkoJumpForwardAnim, 2.0f, 0.0f, 0.0f, 0, -2.0f);
this->actor.params = GEKKO_RETURN_TO_SNAPPER;
this->actionFunc = EnPametfrog_RunToSnapper;
}
@@ -778,7 +759,7 @@ void EnPametfrog_RunToSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupJumpOnSnapper(EnPametfrog* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &D_06004680, 6.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoStandingIdleAnim, 6.0f);
this->timer = 6;
this->collider.base.ocFlags1 &= ~OC1_ON;
this->collider.base.acFlags &= ~AC_ON;
@@ -810,7 +791,7 @@ void EnPametfrog_JumpOnSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupLandOnSnapper(EnPametfrog* this) {
- Animation_PlayOnce(&this->skelAnime, &D_06000994);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoFullFistPumpAnim);
this->actor.shape.rot.y = this->actor.child->shape.rot.y;
this->actor.params = GEKKO_ON_SNAPPER;
this->actionFunc = EnPametfrog_LandOnSnapper;
@@ -828,7 +809,7 @@ void EnPametfrog_SetupFallInAir(EnPametfrog* this, GlobalContext* globalCtx) {
Vec3f eye;
f32 xzDist;
- Animation_PlayOnce(&this->skelAnime, &D_06001F20);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoFallInAirAnim);
if (this->actor.colChkInfo.health > 0) {
this->actor.params = GEKKO_RETURN_TO_SNAPPER;
}
@@ -889,13 +870,13 @@ void EnPametfrog_FallInAir(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupFallOnGround(EnPametfrog* this, GlobalContext* globalCtx) {
- Animation_PlayOnce(&this->skelAnime, &D_06004298);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoFallOnGroundAnim);
this->actor.shape.rot.x = 0;
this->actor.shape.rot.y += this->spinYaw;
this->actor.shape.rot.z = 0;
this->spinYaw = 0;
this->timer = 5;
- EnPametfrog_ChangeColliderThaw(this, globalCtx);
+ EnPametfrog_Thaw(this, globalCtx);
EnPametfrog_JumpWaterEffects(this, globalCtx);
Audio_PlayActorSound2(&this->actor, NA_SE_EV_WALK_WATER);
this->actionFunc = EnPametfrog_FallOnGround;
@@ -903,14 +884,14 @@ void EnPametfrog_SetupFallOnGround(EnPametfrog* this, GlobalContext* globalCtx)
void EnPametfrog_FallOnGround(EnPametfrog* this, GlobalContext* globalCtx) {
if (SkelAnime_Update(&this->skelAnime)) {
- if (this->skelAnime.animation == &D_06004298) {
+ if (this->skelAnime.animation == &gGekkoFallOnGroundAnim) {
if (this->actor.colChkInfo.health == 0) {
this->timer--;
if (this->timer == 0) {
EnPametfrog_SetupDefeatGekko(this, globalCtx);
}
} else {
- Animation_PlayOnce(&this->skelAnime, &D_060030E4);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoRecoverAnim);
}
} else {
EnPametfrog_SetupRunToSnapper(this);
@@ -982,7 +963,7 @@ void EnPametfrog_SetupSpawnFrog(EnPametfrog* this, GlobalContext* globalCtx) {
vec1.y = this->actor.world.pos.y + 25.0f;
vec1.z = (Math_CosS(yaw) * 20.0f) + this->actor.world.pos.z;
this->collider.base.ocFlags1 &= ~OC1_ON;
- func_800B0DE0(globalCtx, &vec1, &D_801D15B0, &D_801D15B0, &primColor, &envColor, 800, 50);
+ func_800B0DE0(globalCtx, &vec1, &gZeroVec3f, &gZeroVec3f, &primColor, &envColor, 800, 50);
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_NPC_APPEAR);
Actor_SetRoomClearedTemp(globalCtx, globalCtx->roomCtx.currRoom.num);
@@ -1043,7 +1024,7 @@ void EnPametfrog_PlayCutscene(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupLookAround(EnPametfrog* this) {
- Animation_PlayOnce(&this->skelAnime, &D_060066B4);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoLookAroundAnim);
this->collider.base.atFlags &= ~AT_ON;
this->actor.speedXZ = 0.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
@@ -1064,7 +1045,7 @@ void EnPametfrog_LookAround(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupJumpToLink(EnPametfrog* this) {
- Animation_PlayLoop(&this->skelAnime, &D_060039C4);
+ Animation_PlayLoop(&this->skelAnime, &gGekkoJumpForwardAnim);
this->collider.base.acFlags |= AC_ON;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = EnPametfrog_JumpToLink;
@@ -1089,17 +1070,17 @@ void EnPametfrog_JumpToLink(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupMeleeAttack(EnPametfrog* this) {
- Animation_PlayOnce(&this->skelAnime, &D_0600F990);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoBoxingStanceAnim);
this->timer = 7;
this->actor.speedXZ = 0.0f;
this->actionFunc = EnPametfrog_MeleeAttack;
}
static AnimationHeader* sAttackAnimations[] = {
- &D_0600347C, // Jab Punch
- &D_060070C4, // Hook Punch
- &D_06003F28, // Kick
- &D_0600F048, // Windup Punch
+ &gGekkoJabPunchAnim,
+ &gGekkoHookPunchAnim,
+ &gGekkoKickAnim,
+ &gGekkoWindupPunchAnim,
};
void EnPametfrog_MeleeAttack(EnPametfrog* this, GlobalContext* globalCtx) {
@@ -1109,18 +1090,18 @@ void EnPametfrog_MeleeAttack(EnPametfrog* this, GlobalContext* globalCtx) {
if (this->timer == 0) {
EnPametfrog_SetupLookAround(this);
} else if (this->timer == 6) {
- Animation_PlayOnce(&this->skelAnime, &D_0600F990);
+ Animation_PlayOnce(&this->skelAnime, &gGekkoBoxingStanceAnim);
} else {
Animation_PlayOnce(&this->skelAnime, sAttackAnimations[(s32)Rand_ZeroFloat(4.0f) % 4]);
}
}
- if ((this->skelAnime.animation == &D_0600347C && Animation_OnFrame(&this->skelAnime, 2.0f)) ||
- (this->skelAnime.animation == &D_060070C4 && Animation_OnFrame(&this->skelAnime, 9.0f)) ||
- (this->skelAnime.animation == &D_06003F28 && Animation_OnFrame(&this->skelAnime, 2.0f)) ||
- ((this->skelAnime.animation == &D_0600F048) && Animation_OnFrame(&this->skelAnime, 27.0f))) {
+ if ((this->skelAnime.animation == &gGekkoJabPunchAnim && Animation_OnFrame(&this->skelAnime, 2.0f)) ||
+ (this->skelAnime.animation == &gGekkoHookPunchAnim && Animation_OnFrame(&this->skelAnime, 9.0f)) ||
+ (this->skelAnime.animation == &gGekkoKickAnim && Animation_OnFrame(&this->skelAnime, 2.0f)) ||
+ ((this->skelAnime.animation == &gGekkoWindupPunchAnim) && Animation_OnFrame(&this->skelAnime, 27.0f))) {
this->collider.base.atFlags |= AT_ON;
- if (this->skelAnime.animation == &D_06003F28) {
+ if (this->skelAnime.animation == &gGekkoKickAnim) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_FROG_KICK);
} else {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_FROG_PUNCH1);
@@ -1131,7 +1112,7 @@ void EnPametfrog_MeleeAttack(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupDamage(EnPametfrog* this) {
- Animation_MorphToPlayOnce(&this->skelAnime, &D_06005D54, -3.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoKnockbackAnim, -3.0f);
this->timer = 20;
this->collider.base.atFlags &= ~AT_ON;
this->collider.base.acFlags &= ~AC_ON;
@@ -1157,7 +1138,7 @@ void EnPametfrog_Damage(EnPametfrog* this, GlobalContext* globalCtx) {
}
void EnPametfrog_SetupStun(EnPametfrog* this) {
- if (this->skelAnime.animation == &D_060039C4) {
+ if (this->skelAnime.animation == &gGekkoJumpForwardAnim) {
this->skelAnime.curFrame = 0.0f;
SkelAnime_Update(&this->skelAnime);
}
@@ -1175,10 +1156,10 @@ void EnPametfrog_SetupStun(EnPametfrog* this) {
void EnPametfrog_Stun(EnPametfrog* this, GlobalContext* globalCtx) {
this->freezeTimer--;
if (this->freezeTimer == 0) {
- EnPametfrog_ChangeColliderThaw(this, globalCtx);
+ EnPametfrog_Thaw(this, globalCtx);
EnPametfrog_SetupJumpToLink(this);
} else if (this->freezeTimer == 78) {
- EnPametfrog_ChangeColliderThaw(this, globalCtx);
+ EnPametfrog_Thaw(this, globalCtx);
this->actor.colorFilterTimer = 0;
EnPametfrog_SetupCutscene(this);
}
@@ -1189,7 +1170,7 @@ void EnPametfrog_SetupCallSnapper(EnPametfrog* this, GlobalContext* globalCtx) {
Vec3f at;
s16 yawDiff;
- Animation_MorphToPlayOnce(&this->skelAnime, &D_06001B08, 3.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoCallAnim, 3.0f);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_FROG_GREET);
this->actor.flags &= ~1;
this->actor.colChkInfo.health = 6;
@@ -1298,14 +1279,14 @@ void EnPametfrog_ApplyDamageEffect(EnPametfrog* this, GlobalContext* globalCtx)
EnPametfrog_ApplyStun(this);
EnPametfrog_SetupStun(this);
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_ICE) {
- EnPametfrog_ChangeColliderFreeze(this);
+ EnPametfrog_Freeze(this);
this->freezeTimer = 80;
func_800BCB70(&this->actor, 0x4000, 0xFF, 0, 0x50);
EnPametfrog_SetupStun(this);
} else {
- EnPametfrog_ChangeColliderThaw(this, globalCtx);
+ EnPametfrog_Thaw(this, globalCtx);
if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_FIRE) {
- this->drawEffect = GEKKO_DRAW_EFFECT_NONE;
+ this->drawEffect = GEKKO_DRAW_EFFECT_THAW;
this->unk_2C8 = 0.75f;
this->unk_2C4 = 4.0f;
} else if (this->actor.colChkInfo.damageEffect == GEKKO_DMGEFF_LIGHT) {
@@ -1388,19 +1369,19 @@ void EnPametfrog_Update(Actor* thisx, GlobalContext* globalCtx) {
}
}
-/* index -1: Limb Not used
- * index 0: GEKKO_LIMB_WAIST
- * index 1: GEKKO_LIMB_L_SHIN
- * index 2: GEKKO_LIMB_L_FOOT
- * index 3: GEKKO_LIMB_R_SHIN
- * index 4: GEKKO_LIMB_R_FOOT
- * index 5: GEKKO_LIMB_L_UPPER_ARM
- * index 6: GEKKO_LIMB_L_FOREARM
- * index 7: GEKKO_LIMB_L_HAND
- * index 8: GEKKO_LIMB_R_UPPER_ARM
- * index 9: GEKKO_LIMB_R_FOREARM
- * index 10: GEKKO_LIMB_R_HAND
- * index 11: GEKKO_LIMB_JAW
+/* value -1: Limb Not used
+ * value 0: GEKKO_LIMB_WAIST
+ * value 1: GEKKO_LIMB_L_SHIN
+ * value 2: GEKKO_LIMB_L_FOOT
+ * value 3: GEKKO_LIMB_R_SHIN
+ * value 4: GEKKO_LIMB_R_FOOT
+ * value 5: GEKKO_LIMB_L_UPPER_ARM
+ * value 6: GEKKO_LIMB_L_FOREARM
+ * value 7: GEKKO_LIMB_L_HAND
+ * value 8: GEKKO_LIMB_R_UPPER_ARM
+ * value 9: GEKKO_LIMB_R_FOREARM
+ * value 10: GEKKO_LIMB_R_HAND
+ * value 11: GEKKO_LIMB_JAW
*/
static s8 limbPosIndex[] = {
-1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, 6, -1, 7, 8, 9, -1, 10, -1, 11, -1, -1,
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 f00acecb5e..957a46cfc4 100644
--- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
+++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.h
@@ -21,7 +21,7 @@ typedef enum {
} EnPametfrogState;
typedef enum {
- /* 00 */ GEKKO_DRAW_EFFECT_NONE, // May be GEKKO_DRAW_EFFECT_THAW
+ /* 00 */ GEKKO_DRAW_EFFECT_THAW,
/* 10 */ GEKKO_DRAW_EFFECT_FROZEN = 10,
/* 20 */ GEKKO_DRAW_EFFECT_LIGHT_ORBS = 20,
/* 30 */ GEKKO_DRAW_EFFECT_ELECTRIC_STUN = 30,
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 5cb68e3df7..5993ab3664 100644
--- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c
+++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c
@@ -1449,7 +1449,7 @@ s32 func_80AF9E7C(EnPm* this, GlobalContext* globalCtx) {
func_8013AF00(sp7C, 3, this->unk_234->count + 3);
if (!(this->unk_356 & 8)) {
- sp58 = D_801D15B0;
+ sp58 = gZeroVec3f;
func_8013B6B0(this->unk_234, &this->unk_244, &this->unk_254, this->unk_24C, this->unk_248, &this->unk_250, sp7C,
&sp58, this->unk_374);
func_8013B878(globalCtx, this->unk_234, this->unk_250, &sp58);
@@ -1468,7 +1468,7 @@ s32 func_80AF9E7C(EnPm* this, GlobalContext* globalCtx) {
sp58 = this->actor.world.pos;
}
- this->unk_238 = D_801D15B0;
+ this->unk_238 = gZeroVec3f;
if (func_8013B6B0(this->unk_234, &this->unk_244, &this->unk_254, this->unk_24C, this->unk_248, &this->unk_250, sp7C,
&this->unk_238, this->unk_374)) {
@@ -1827,7 +1827,7 @@ void func_80AFAA44(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
switch (limbIndex) {
case 15:
if (ActorCutscene_GetCurrentIndex() == -1) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &this->actor.focus.pos);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
if ((this->unk_356 & 0x8000) && !(gSaveContext.weekEventReg[90] & 4)) {
@@ -1843,10 +1843,10 @@ void func_80AFAA44(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
case 8:
if ((this->unk_258 == 9) || (this->unk_258 == 20) || (this->unk_258 == 21) || (this->unk_258 == 22)) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &sp2C);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &sp2C);
Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp2C);
} else if (this->unk_258 == 24) {
- Matrix_MultiplyVector3fByState(&D_801D15B0, &sp2C);
+ Matrix_MultiplyVector3fByState(&gZeroVec3f, &sp2C);
Math_Vec3f_ToVec3s(&this->colliderSphere.dim.worldSphere.center, &sp2C);
}
func_80AF8890(this, gfx, 2);
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 1bb44aa022..6f267771b3 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
@@ -5,6 +5,7 @@
*/
#include "z_en_po_sisters.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00005015
@@ -725,7 +726,7 @@ void func_80B1BE4C(EnPoSisters* this, s32 arg1) {
sp34.x = this->actor.world.pos.x;
sp34.y = this->actor.world.pos.y + 45.0f;
sp34.z = this->actor.world.pos.z;
- func_800B3030(arg1, &sp34, &D_801D15B0, &D_801D15B0, 150, 0, 3);
+ func_800B3030(arg1, &sp34, &gZeroVec3f, &gZeroVec3f, 150, 0, 3);
}
Lights_PointSetColorAndRadius(&this->lightInfo, 0, 0, 0, 0);
this->actionFunc = func_80B1BF2C;
@@ -1189,7 +1190,7 @@ void EnPoSisters_Draw(Actor* thisx, GlobalContext* globalCtx) {
Matrix_Scale(phi_f20, phi_f20, phi_f20, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_0407D590);
+ gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL);
}
func_800BE680(globalCtx, &this->actor, this->unk_28C, ARRAY_COUNT(this->unk_28C),
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 4042aecac7..f9dc6ddf44 100644
--- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -203,7 +203,7 @@ void func_80B2C910(Vec3f* vec, GlobalContext* globalCtx) {
}
Math_Vec3f_ScaleAndStore(&sp20, temp_f0, vec);
} else {
- Math_Vec3f_Copy(vec, &D_801D15B0);
+ Math_Vec3f_Copy(vec, &gZeroVec3f);
}
}
@@ -426,13 +426,13 @@ void func_80B2D300(EnPoh* this, GlobalContext* globalCtx) {
sp44.z = (Math_CosS(sp38) * 23.0f) + this->actor.world.pos.z;
}
sp36 = (this->unk_18E * 10) + 80;
- func_800B3030(globalCtx, &sp44, &D_80B2F710, &D_801D15B0, sp36, 0, 2);
+ func_800B3030(globalCtx, &sp44, &D_80B2F710, &gZeroVec3f, sp36, 0, 2);
sp44.x = (2.0f * this->actor.world.pos.x) - sp44.x;
sp44.z = (2.0f * this->actor.world.pos.z) - sp44.z;
- func_800B3030(globalCtx, &sp44, &D_80B2F710, &D_801D15B0, sp36, 0, 2);
+ func_800B3030(globalCtx, &sp44, &D_80B2F710, &gZeroVec3f, sp36, 0, 2);
sp44.x = this->actor.world.pos.x;
sp44.z = this->actor.world.pos.z;
- func_800B3030(globalCtx, &sp44, &D_80B2F710, &D_801D15B0, sp36, 0, 2);
+ func_800B3030(globalCtx, &sp44, &D_80B2F710, &gZeroVec3f, sp36, 0, 2);
} else if (this->unk_18E == 28) {
func_80B2DC50(this, globalCtx);
} else if (this->unk_18E > 18) {
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 a4b721f5de..4008ba4e15 100644
--- a/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
+++ b/src/overlays/actors/ovl_En_Racedog/z_en_racedog.h
@@ -10,7 +10,14 @@ typedef void (*EnRacedogActionFunc)(struct EnRacedog*, GlobalContext*);
typedef struct EnRacedog {
/* 0x0000 */ Actor actor;
/* 0x0144 */ EnRacedogActionFunc actionFunc;
- /* 0x0148 */ char unk_148[0x180];
+ /* 0x0148 */ char unk_148[0xA0];
+ /* 0x01E8 */ s32 unk_1E8;
+ /* 0x01EC */ char unk_1EC[0xA4];
+ /* 0x0290 */ s16 unk_290;
+ /* 0x0292 */ s16 unk_292;
+ /* 0x0294 */ char unk_294[0x8];
+ /* 0x029C */ s16 unk_29C;
+ /* 0x029E */ char unk_29E[0x2A];
} EnRacedog; // size = 0x2C8
extern const ActorInit En_Racedog_InitVars;
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 a1a88ecbd1..280c898cef 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
@@ -4,7 +4,9 @@
* Description: Ikana Graveyard - Circle of Stalchildren
*/
+#include "overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h"
#include "z_en_rail_skb.h"
+#include "objects/object_skb/object_skb.h"
#define FLAGS 0x00000015
@@ -15,23 +17,39 @@ void EnRailSkb_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnRailSkb_Update(Actor* thisx, GlobalContext* globalCtx);
void EnRailSkb_Draw(Actor* thisx, GlobalContext* globalCtx);
+void func_80B70FA0(EnRailSkb* this);
void func_80B70FF8(EnRailSkb* this, GlobalContext* globalCtx);
void func_80B710E4(EnRailSkb* this, GlobalContext* globalCtx);
void func_80B7114C(EnRailSkb* this, GlobalContext* globalCtx);
void func_80B7123C(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B712FC(EnRailSkb* this);
void func_80B71314(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71354(EnRailSkb* this);
void func_80B713A4(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71488(EnRailSkb* this);
void func_80B714D8(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B7151C(EnRailSkb* this);
void func_80B715AC(EnRailSkb* this, GlobalContext* globalCtx);
void func_80B716A8(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B717C8(EnRailSkb* this);
void func_80B717E0(EnRailSkb* this, GlobalContext* globalCtx);
void func_80B718C4(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71910(EnRailSkb* this);
void func_80B71954(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71A08(EnRailSkb* this);
void func_80B71A58(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71B6C(EnRailSkb* this);
void func_80B71BB8(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71D8C(EnRailSkb* this, GlobalContext* globalCtx, EnRailSkbUnkFunc unkFunc);
void func_80B71EA8(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B71F3C(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B72100(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B723F8(EnRailSkb* this);
+void func_80B72430(EnRailSkb* this, GlobalContext* globalCtx, s32 arg2);
+void func_80B726B4(EnRailSkb* this, GlobalContext* globalCtx);
+void func_80B72830(EnRailSkb* this, s16 arg1);
+s32 func_80B7285C(EnRailSkb* this);
-#if 0
const ActorInit En_Rail_Skb_InitVars = {
ACTOR_EN_RAIL_SKB,
ACTORCAT_ENEMY,
@@ -44,29 +62,57 @@ const ActorInit En_Rail_Skb_InitVars = {
(ActorFunc)EnRailSkb_Draw,
};
-// static ColliderJntSphElementInit sJntSphElementsInit[2] = {
-static ColliderJntSphElementInit D_80B73408[2] = {
+static ActorAnimationEntry sAnimations[] = {
+ { &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, 0, -4.0f }, { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -1.0f },
+ { &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, 3, 4.0f }, { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, 2, -4.0f },
+ { &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, 2, -4.0f }, { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, 0, -4.0f },
+ { &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, 0, -4.0f }, { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, 0, -4.0f },
+ { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -8.0f }, { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -16.0f },
+ { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, 2, -8.0f }, { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, 2, -8.0f },
+ { &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, 0, -8.0f },
+};
+
+static ColliderJntSphElementInit sJntSphElementsInit[2] = {
{
- { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x04 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
+ {
+ ELEMTYPE_UNK0,
+ { 0xF7CFFFFF, 0x00, 0x04 },
+ { 0x00000000, 0x00, 0x00 },
+ TOUCH_ON | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_NONE,
+ },
{ 15, { { 0, 0, 0 }, 10 }, 100 },
},
{
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON | BUMP_HOOKABLE,
+ OCELEM_ON,
+ },
{ 1, { { 0, 0, 0 }, 20 }, 100 },
},
};
-// static ColliderJntSphInit sJntSphInit = {
-static ColliderJntSphInit D_80B73450 = {
- { COLTYPE_HIT6, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
- 2, D_80B73408, // sJntSphElementsInit,
+static ColliderJntSphInit sJntSphInit = {
+ {
+ COLTYPE_HIT6,
+ AT_ON | AT_TYPE_ENEMY,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_JNTSPH,
+ },
+ 2,
+ sJntSphElementsInit,
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_80B73460 = { 2, 0, 0, 0, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 2, 0, 0, 0, MASS_IMMOVABLE };
-// static DamageTable sDamageTable = {
-static DamageTable D_80B7346C = {
+static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x1),
/* Deku Stick */ DMG_ENTRY(1, 0xD),
/* Horse trample */ DMG_ENTRY(0, 0x0),
@@ -101,122 +147,1004 @@ static DamageTable D_80B7346C = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80B73490[] = {
+void func_80B708C0(EnRailSkb* this, GlobalContext* globalCtx) {
+ static s32 D_80B7348C = 0;
+ Path* path = &globalCtx->setupPathList[ENRAILSKB_GET_FF00(&this->actor)];
+ Vec3f sp70;
+ s32 phi_a3;
+
+ this->unk_230 = Lib_SegmentedToVirtual(path->points);
+ this->unk_2E0 = D_80B7348C;
+ this->unk_2E8 = path->count;
+
+ if (D_80B7348C == 0) {
+ s32 i;
+
+ for (i = 1; (i < this->unk_2E8) && (i < 10); i++) {
+ D_80B7348C++;
+ Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_RAIL_SKB, 0.0f, 0.0f, 0.0f, 0, 0,
+ 0, this->actor.params);
+ }
+ D_80B7348C = 0;
+ }
+
+ this->actor.world.pos.x = this->unk_230[this->unk_2E0].x;
+ this->actor.world.pos.y = this->unk_230[this->unk_2E0].y;
+ this->actor.world.pos.z = this->unk_230[this->unk_2E0].z;
+
+ if (this->unk_2E0 < (this->unk_2E8 - 1)) {
+ phi_a3 = this->unk_2E0 + 1;
+ } else {
+ phi_a3 = 0;
+ }
+
+ sp70.x = this->unk_230[phi_a3].x;
+ sp70.y = this->unk_230[phi_a3].y;
+ sp70.z = this->unk_230[phi_a3].z;
+
+ this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &sp70);
+}
+
+s32 func_80B70AB4(Vec2f arg0, Vec2f arg1) {
+ s32 phi_v1;
+
+ if ((arg1.x * arg0.y) < (arg0.x * arg1.y)) {
+ phi_v1 = 1;
+ } else {
+ phi_v1 = -1;
+ }
+ return phi_v1;
+}
+
+s32 func_80B70B04(EnRailSkb* this, Vec3f pos) {
+ s32 pad;
+ s32 temp_s3;
+ Vec2f sp60;
+ Vec2f sp58;
+ s32 ret = true;
+ s32 pad2;
+ s32 i = 0;
+ s32 j;
+
+ sp60.x = this->unk_230[0].z - pos.z;
+ sp60.y = this->unk_230[0].x - pos.x;
+ sp58.x = this->unk_230[1].z - pos.z;
+ sp58.y = this->unk_230[1].x - pos.x;
+ j = 1;
+ temp_s3 = func_80B70AB4(sp60, sp58);
+
+ while (j != 0) {
+ i++;
+
+ if (j < (this->unk_2E8 - 1)) {
+ j++;
+ } else {
+ j = 0;
+ }
+
+ sp60.x = this->unk_230[i].z - pos.z;
+ sp60.y = this->unk_230[i].x - pos.x;
+ sp58.x = this->unk_230[j].z - pos.z;
+ sp58.y = this->unk_230[j].x - pos.x;
+
+ if (func_80B70AB4(sp60, sp58) != temp_s3) {
+ ret = false;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+void func_80B70D24(EnRailSkb* this, GlobalContext* globalCtx) {
+ Actor* actor = globalCtx->actorCtx.actorList[ACTORCAT_PROP].first;
+
+ while (actor != NULL) {
+ if ((actor->id == ACTOR_OBJ_HAKAISI) && func_80B70B04(this, actor->world.pos)) {
+ if (Flags_GetSwitch(globalCtx, (actor->params & 0xFF00) >> 8)) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+ this->unk_22C = (ObjHakaisi*)actor;
+ return;
+ }
+ actor = actor->next;
+ }
+ Actor_MarkForDeath(&this->actor);
+}
+
+static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_STOP),
};
-#endif
+void EnRailSkb_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnRailSkb* this = THIS;
-extern ColliderJntSphElementInit D_80B73408[2];
-extern ColliderJntSphInit D_80B73450;
-extern CollisionCheckInfoInit2 D_80B73460;
-extern DamageTable D_80B7346C;
-extern InitChainEntry D_80B73490[];
+ func_80B708C0(this, globalCtx);
+ ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 36.0f);
+ SkelAnime_Init(globalCtx, &this->skelAnime, &object_skb_Skel_005EF8, &object_skb_Anim_0064E0, this->jointTable,
+ this->morphTable, 20);
+ Collider_InitJntSph(globalCtx, &this->collider);
+ Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
-extern UNK_TYPE D_060064E0;
+ if (Flags_GetSwitch(globalCtx, ENRAILSKB_GET_FF(&this->actor))) {
+ Actor_MarkForDeath(&this->actor);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B708C0.s")
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+ this->actor.speedXZ = 1.6f;
+ this->actor.hintId = 0x55;
+ this->unk_3F2 = 0;
+ this->unk_2E4 = -1;
+ this->unk_3FC = 0;
+ this->unk_3FA = 0;
+ this->unk_403 = 0;
+ this->unk_3FE = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B70AB4.s")
+ if (this->actor.parent == NULL) {
+ this->unk_3F4 = 1;
+ this->unk_3F6 = 1;
+ this->unk_3F8 = 0;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B70B04.s")
+ if ((globalCtx->sceneNum == SCENE_BOTI) && (gSaveContext.sceneSetupIndex == 1) && (globalCtx->csCtx.unk_12 == 0)) {
+ this->actor.flags |= 0x100000;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B70D24.s")
+ func_80B70FA0(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/EnRailSkb_Init.s")
+void EnRailSkb_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnRailSkb* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/EnRailSkb_Destroy.s")
+ Collider_DestroyJntSph(globalCtx, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B70FA0.s")
+void func_80B70FA0(EnRailSkb* this) {
+ this->unk_3F2 = 0;
+ if (this->actionFunc != func_80B716A8) {
+ func_800BDC5C(&this->skelAnime, sAnimations, 0);
+ }
+ this->actionFunc = func_80B70FF8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B70FF8.s")
+void func_80B70FF8(EnRailSkb* this, GlobalContext* globalCtx) {
+ s16 temp_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B710AC.s")
+ if (this->actor.xzDistToPlayer < 65.0f) {
+ if ((ABS_ALT(temp_v0) < 0x2AAA) && (this->unk_3F2 >= 6)) {
+ func_80B71354(this);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B710E4.s")
+ if (this->unk_3F2 < 6) {
+ this->unk_3F2++;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71114.s")
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x71C, 0xB6);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B7114C.s")
+void func_80B710AC(EnRailSkb* this) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ this->actionFunc = func_80B710E4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71228.s")
+void func_80B710E4(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->actor.colorFilterTimer == 0) {
+ func_80B70FA0(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B7123C.s")
+void func_80B71114(EnRailSkb* this) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_COMMON_FREEZE);
+ this->actionFunc = func_80B7114C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B712FC.s")
+void func_80B7114C(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->unk_3F0 == 0) {
+ this->unk_3F0 = 0;
+ this->unk_2F0 = 0.0f;
+ this->unk_2EC = 0.0f;
+ if (this->actor.colChkInfo.health != 0) {
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ func_800BDC5C(&this->skelAnime, sAnimations, 3);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ this->unk_402 |= 1;
+ func_80B712FC(this);
+ } else {
+ Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
+ func_80B71488(this);
+ }
+ } else if (this->unk_3F0 == 1) {
+ func_80B726B4(this, globalCtx);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71314.s")
+void func_80B71228(EnRailSkb* this) {
+ this->actionFunc = func_80B7123C;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71354.s")
+void func_80B7123C(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->unk_3F0 == 0) {
+ this->unk_3F0 = 0;
+ this->unk_2F0 = 0.0f;
+ this->unk_2EC = 0.0f;
+ if (this->actor.colChkInfo.health != 0) {
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ func_800BDC5C(&this->skelAnime, sAnimations, 3);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ this->unk_402 |= 1;
+ func_80B712FC(this);
+ } else {
+ Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
+ func_80B71488(this);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B713A4.s")
+void func_80B712FC(EnRailSkb* this) {
+ this->unk_3F2 = 0;
+ this->actionFunc = func_80B71314;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71488.s")
+void func_80B71314(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->unk_3F2 >= 6) {
+ func_80B70FA0(this);
+ } else {
+ this->unk_3F2++;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B714D8.s")
+void func_80B71354(EnRailSkb* this) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ func_800BDC5C(&this->skelAnime, sAnimations, 2);
+ this->actionFunc = func_80B713A4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B7151C.s")
+void func_80B713A4(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ if ((this->actor.xzDistToPlayer > 65.0f) || (Player_GetMask(globalCtx) == PLAYER_MASK_CAPTAIN)) {
+ func_80B70FA0(this);
+ } else {
+ func_800BDC5C(&this->skelAnime, sAnimations, 2);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B715AC.s")
+ if (this->actor.xzDistToPlayer > 65.0f) {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x71C, 0xB6);
+ } else {
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 2, 0xAAA, 0xB6);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71650.s")
+void func_80B71488(EnRailSkb* this) {
+ this->unk_402 |= 0x40;
+ this->actor.flags &= ~1;
+ if (this->unk_2E0 != 0) {
+ this->unk_2E4 = this->unk_2E0 - 1;
+ } else {
+ this->unk_2E4 = this->unk_2E8 - 1;
+ }
+ this->actionFunc = func_80B714D8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B716A8.s")
+void func_80B714D8(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->actor.draw != NULL) {
+ this->actor.draw = NULL;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B717C8.s")
+ if (this->unk_2E0 == this->unk_2E4) {
+ func_80B7151C(this);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B717E0.s")
+void func_80B7151C(EnRailSkb* this) {
+ this->actor.shape.yOffset = -5000.0f;
+ this->actor.colChkInfo.health = 2;
+ this->unk_402 = 0;
+ this->actor.flags |= 1;
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_APPEAR);
+ this->actor.draw = EnRailSkb_Draw;
+ this->actor.shape.shadowAlpha = 0;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ func_800BDC5C(&this->skelAnime, sAnimations, 1);
+ this->actionFunc = func_80B715AC;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B718B0.s")
+void func_80B715AC(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 0.5f, 500.0f, 10.0f) == 0.0f) {
+ func_80B70FA0(this);
+ } else {
+ func_80B72430(this, globalCtx, 1);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B718C4.s")
+ if (this->actor.shape.shadowAlpha != 255) {
+ if (this->actor.shape.shadowAlpha >= 235) {
+ this->actor.shape.shadowAlpha = 255;
+ } else {
+ this->actor.shape.shadowAlpha += 20;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71910.s")
+void func_80B71650(EnRailSkb* this) {
+ this->unk_3FE = 0;
+ if (this->actionFunc != func_80B70FF8) {
+ func_800BDC5C(&this->skelAnime, sAnimations, 0);
+ }
+ this->actionFunc = func_80B716A8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71954.s")
+void func_80B716A8(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_3FE = 1;
+ func_80B71D8C(this, globalCtx, func_80B723F8);
+ if (!func_80B7285C(this)) {
+ func_801518B0(globalCtx, 0x13EC, &this->actor);
+ this->unk_400 = 0x13EC;
+ func_80B72830(this, 1);
+ } else {
+ func_801518B0(globalCtx, 0x13F5, &this->actor);
+ this->unk_400 = 0x13F5;
+ }
+ func_800BDC5C(&this->skelAnime, sAnimations, 12);
+ func_80B717C8(this);
+ } else if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.acFlags & AC_HIT)) {
+ func_800B8614(&this->actor, globalCtx, 100.0f);
+ }
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.world.rot.y, 1, 0x71C, 0xB6);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71A08.s")
+void func_80B717C8(EnRailSkb* this) {
+ this->unk_3F2 = 0;
+ this->actionFunc = func_80B717E0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71A58.s")
+void func_80B717E0(EnRailSkb* this, GlobalContext* globalCtx) {
+ this->unk_3FA = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71B6C.s")
+ switch (func_80152498(&globalCtx->msgCtx)) {
+ case 0:
+ case 1:
+ case 2:
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71BB8.s")
+ case 3:
+ if ((globalCtx->gameplayFrames % 2) != 0) {
+ this->unk_3FA = 1;
+ }
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71D8C.s")
+ case 4:
+ func_80B72100(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71DF0.s")
+ case 5:
+ func_80B71F3C(this, globalCtx);
+ break;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71EA8.s")
+ case 6:
+ if (func_80147624(globalCtx)) {
+ func_80B71650(this);
+ }
+ break;
+ }
+ Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 0x71C, 0xB6);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B71F3C.s")
+void func_80B718B0(EnRailSkb* this) {
+ this->actionFunc = func_80B718C4;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72100.s")
+void func_80B718C4(EnRailSkb* this, GlobalContext* globalCtx) {
+ func_80B70D24(this, globalCtx);
+ if (this->actor.parent == NULL) {
+ if (this->unk_22C != NULL) {
+ ObjHakaisi* hakasi = this->unk_22C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72190.s")
+ hakasi->unk_198 = 1;
+ }
+ }
+ func_80B71910(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B723F8.s")
+void func_80B71910(EnRailSkb* this) {
+ func_800BDC5C(&this->skelAnime, sAnimations, 0);
+ this->actionFunc = func_80B71954;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72430.s")
+void func_80B71954(EnRailSkb* this, GlobalContext* globalCtx) {
+ s16 sp36 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C->actor.world.pos);
+ f32 sp30 = Math_Vec3f_DistXZ(&this->actor.world.pos, &this->unk_22C->actor.world.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B725C0.s")
+ Math_SmoothStepToS(&this->actor.shape.rot.y, sp36, 1, 0x71C, 0xB6);
+ this->actor.world.rot = this->actor.shape.rot;
+ if (sp30 < 80.0f) {
+ func_80B71A08(this);
+ }
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B726B4.s")
+void func_80B71A08(EnRailSkb* this) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ func_800BDC5C(&this->skelAnime, sAnimations, 2);
+ this->actionFunc = func_80B71A58;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72830.s")
+void func_80B71A58(EnRailSkb* this, GlobalContext* globalCtx) {
+ s16 sp36 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C->actor.world.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B7285C.s")
+ if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ func_800BDC5C(&this->skelAnime, sAnimations, 2);
+ if (this->unk_2E8 < this->unk_22C->actor.colChkInfo.health) {
+ this->unk_22C->actor.colChkInfo.health--;
+ } else {
+ this->unk_22C->actor.colChkInfo.health--;
+ func_80B71B6C(this);
+ }
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72880.s")
+ if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
+ if (this->unk_2E8 < this->unk_22C->actor.colChkInfo.health) {
+ this->unk_22C->actor.colChkInfo.health--;
+ } else {
+ this->unk_22C->actor.colChkInfo.health--;
+ func_80B71B6C(this);
+ }
+ }
+ Math_SmoothStepToS(&this->actor.shape.rot.y, sp36, 1, 0x71C, 0xB6);
+ this->actor.world.rot = this->actor.shape.rot;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72970.s")
+void func_80B71B6C(EnRailSkb* this) {
+ this->unk_3F2 = 10;
+ func_800BDC5C(&this->skelAnime, sAnimations, 0);
+ this->actionFunc = func_80B71BB8;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/EnRailSkb_Update.s")
+void func_80B71BB8(EnRailSkb* this, GlobalContext* globalCtx) {
+ s32 pad;
+ s32 i;
+ f32 sp34 = Math_Vec3f_DistXZ(&this->actor.world.pos, &this->unk_22C->actor.world.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B72E88.s")
+ if (this->unk_3F2 > 0) {
+ this->unk_3F2--;
+ return;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/func_80B7302C.s")
+ Math_SmoothStepToS(&this->actor.shape.rot.y,
+ Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C->actor.world.pos), 1, 0x71C, 0xB6);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Rail_Skb/EnRailSkb_Draw.s")
+ if ((this->actor.bgCheckFlags & 1) && (this->unk_22C->actor.colChkInfo.health == 0)) {
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ } else {
+ this->actor.velocity.y += this->actor.gravity;
+ this->actor.world.pos.y += this->actor.velocity.y;
+ Math_SmoothStepToF(&this->actor.world.pos.x, this->unk_22C->actor.world.pos.x, 0.6f, 1.6f, 0.1f);
+ Math_SmoothStepToF(&this->actor.world.pos.z, this->unk_22C->actor.world.pos.z, 0.6f, 1.6f, 0.1f);
+ }
+
+ if (this->actor.bgCheckFlags & 2) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ if ((sp34 < 50.0f) && (this->actor.bgCheckFlags & 1)) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_ATTACK);
+ func_800BDC5C(&this->skelAnime, sAnimations, 9);
+ this->actor.velocity.y = 10.0f;
+
+ for (i = 0; i < 4; i++) {
+ func_80B72430(this, globalCtx, 0);
+ }
+ }
+}
+
+void func_80B71D8C(EnRailSkb* this, GlobalContext* globalCtx, EnRailSkbUnkFunc unkFunc) {
+ Actor* actor = globalCtx->actorCtx.actorList[ACTORCAT_ENEMY].first;
+
+ while (actor != NULL) {
+ if (actor->id == ACTOR_EN_RAIL_SKB) {
+ unkFunc((EnRailSkb*)actor);
+ }
+ actor = actor->next;
+ }
+}
+
+void func_80B71DF0(EnRailSkb* this) {
+ if (this->actionFunc == func_80B714D8) {
+ this->actor.shape.yOffset = -5000.0f;
+ this->actor.colChkInfo.health = 2;
+ this->unk_402 = 0;
+ this->actor.flags |= 1;
+ this->actor.draw = EnRailSkb_Draw;
+ this->actor.shape.shadowAlpha = 0;
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ } else if ((this->actionFunc == func_80B7114C) && (this->unk_3F0 >= 2)) {
+ this->unk_3F0 = 0;
+ }
+
+ func_800BDC5C(&this->skelAnime, sAnimations, 11);
+ this->actionFunc = func_80B71EA8;
+}
+
+void func_80B71EA8(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (Math_SmoothStepToF(&this->actor.shape.yOffset, 0.0f, 0.5f, 500.0f, 10.0f) != 0.0f) {
+ func_80B72430(this, globalCtx, 1);
+ }
+
+ if (this->actor.shape.shadowAlpha != 255) {
+ if (this->actor.shape.shadowAlpha >= 235) {
+ this->actor.shape.shadowAlpha = 255;
+ } else {
+ this->actor.shape.shadowAlpha += 20;
+ }
+ }
+}
+
+void func_80B71F3C(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (((this->unk_400 == 0x13ED) || (this->unk_400 == 0x13F5)) && (this->unk_3F2 != 1)) {
+ func_80B71D8C(this, globalCtx, func_80B71DF0);
+ func_80B717C8(this);
+ this->unk_3F2 = 1;
+ }
+
+ if (func_80147624(globalCtx)) {
+ switch (this->unk_400) {
+ case 0x13EC:
+ func_801518B0(globalCtx, 0x13ED, &this->actor);
+ this->unk_400 = 0x13ED;
+ break;
+
+ case 0x13ED:
+ func_801518B0(globalCtx, 0x13EE, &this->actor);
+ this->unk_400 = 0x13EE;
+ break;
+
+ case 0x13EE:
+ func_801518B0(globalCtx, 0x13EF, &this->actor);
+ this->unk_400 = 0x13EF;
+ break;
+
+ case 0x13EF:
+ case 0x13F5:
+ func_801518B0(globalCtx, 0x13F0, &this->actor);
+ this->unk_400 = 0x13F0;
+ break;
+
+ case 0x13F1:
+ func_801518B0(globalCtx, 0x13F2, &this->actor);
+ this->unk_400 = 0x13F2;
+ break;
+
+ case 0x13F2:
+ if (this->unk_3FC == 1) {
+ func_801518B0(globalCtx, 0x13F4, &this->actor);
+ this->unk_400 = 0x13F4;
+ } else {
+ func_801477B4(globalCtx);
+ func_80B71D8C(this, globalCtx, func_80B71650);
+ }
+ break;
+
+ case 0x13F3:
+ func_801518B0(globalCtx, 0x13F2, &this->actor);
+ this->unk_400 = 0x13F2;
+ this->unk_3FC = 1;
+ break;
+
+ case 0x13F4:
+ func_801477B4(globalCtx);
+ func_80B71D8C(this, globalCtx, func_80B718B0);
+ break;
+ }
+ }
+}
+
+void func_80B72100(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (func_80147624(globalCtx)) {
+ if (globalCtx->msgCtx.choiceIndex == 0) {
+ func_8019F208();
+ func_801518B0(globalCtx, 0x13F1, &this->actor);
+ this->unk_400 = 0x13F1;
+ } else {
+ func_8019F208();
+ func_801518B0(globalCtx, 0x13F3, &this->actor);
+ this->unk_400 = 0x13F3;
+ }
+ }
+}
+
+void func_80B72190(EnRailSkb* this, GlobalContext* globalCtx) {
+ EnRailSkb* parent;
+ Vec3f sp38;
+ s32 pad;
+ s16 sp32;
+
+ if ((this->actionFunc != func_80B714D8) &&
+ (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 15.0f))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_WALK);
+ }
+
+ if (this->actor.parent == NULL) {
+ this->unk_3F4 = this->unk_3F6;
+ this->unk_3F6 = 1;
+
+ if ((this->actionFunc == func_80B713A4) || (this->actionFunc == func_80B710E4) ||
+ (this->actionFunc == func_80B7114C) || (this->actionFunc == func_80B7123C) ||
+ (this->actionFunc == func_80B717E0)) {
+ this->unk_3F6 = 0;
+ }
+
+ if (this->unk_3F4 == 0) {
+ return;
+ }
+ } else {
+ parent = (EnRailSkb*)this->actor.parent;
+
+ if ((this->actionFunc == func_80B713A4) || (this->actionFunc == func_80B710E4) ||
+ (this->actionFunc == func_80B7114C) || (this->actionFunc == func_80B7123C) ||
+ (this->actionFunc == func_80B717E0)) {
+ parent->unk_3F6 = 0;
+ }
+
+ if (parent->unk_3F4 == 0) {
+ return;
+ }
+ }
+
+ if ((this->actionFunc != func_80B71EA8) && (this->actionFunc != func_80B71954) &&
+ (this->actionFunc != func_80B71A58) && (this->actionFunc != func_80B71BB8)) {
+ sp38.x = this->unk_230[this->unk_2E0].x;
+ sp38.y = this->unk_230[this->unk_2E0].y;
+ sp38.z = this->unk_230[this->unk_2E0].z;
+ sp32 = Math_Vec3f_Yaw(&this->actor.world.pos, &sp38);
+
+ if (Math_Vec3f_DistXZ(&this->actor.world.pos, &sp38) > 100.0f) {
+ Math_SmoothStepToS(&this->actor.world.rot.y, sp32, 10, 0x3000, 0x100);
+ } else if (this->unk_2E0 < (this->unk_2E8 - 1)) {
+ this->unk_2E0++;
+ } else {
+ this->unk_2E0 = 0;
+ }
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ }
+}
+
+void func_80B723F8(EnRailSkb* this) {
+ this->actor.flags &= ~(4 | 1);
+ this->actor.flags |= (8 | 1);
+ this->actor.flags |= 0x100000;
+ this->actor.hintId = 0xFF;
+ this->actor.textId = 0;
+}
+
+void func_80B72430(EnRailSkb* this, GlobalContext* globalCtx, s32 arg2) {
+ Vec3f sp5C = this->actor.world.pos;
+ Vec3f sp50 = { 0.0f, 8.0f, 0.0f };
+ Vec3f sp44 = { 0.0f, -1.5f, 0.0f };
+ s16 sp42;
+ s32 pad;
+
+ if ((globalCtx->gameplayFrames & arg2) == 0) {
+ sp42 = Rand_Next();
+
+ sp5C.x += 15.0f * Math_SinS(sp42);
+ sp5C.y = this->actor.floorHeight;
+ sp5C.z += 15.0f * Math_CosS(sp42);
+
+ sp44.x = Rand_Centered();
+ sp44.z = Rand_Centered();
+
+ sp50.y += Rand_Centered() * 4.0f;
+
+ EffectSsHahen_Spawn(globalCtx, &sp5C, &sp50, &sp44, 0, (Rand_Next() & 7) + 10, -1, 10, NULL);
+ func_800BBFB0(globalCtx, &sp5C, 10.0f, 1, 150, 0, 1);
+ }
+}
+
+void func_80B725C0(EnRailSkb* this, GlobalContext* globalCtx) {
+ if (this->unk_3F0 > 0) {
+ this->unk_3F0--;
+ }
+
+ if (this->actionFunc != func_80B7114C) {
+ if (this->unk_3F0 < 20) {
+ if (this->actionFunc == func_80B7123C) {
+ Math_SmoothStepToF(&this->unk_2F0, 0.0f, 0.5f, 0.03f, 0.0f);
+ } else {
+ Math_SmoothStepToF(&this->unk_2F0, 0.0f, 0.5f, 0.01f, 0.0f);
+ }
+ this->unk_2EC = this->unk_3F0 * 0.05f;
+ } else {
+ Math_SmoothStepToF(&this->unk_2F0, 0.5f, 0.1f, 0.02f, 0.0f);
+ }
+ }
+}
+
+void func_80B726B4(EnRailSkb* this, GlobalContext* globalCtx) {
+ static Color_RGBA8 D_80B734B0 = { 170, 255, 255, 255 };
+ static Color_RGBA8 D_80B734B4 = { 200, 200, 255, 255 };
+ static Vec3f D_80B734B8 = { 0.0f, -1.0f, 0.0f };
+ Vec3f sp84;
+ s32 i;
+ s32 end;
+ s16 yaw;
+
+ if (this->unk_402 & 2) {
+ end = ARRAY_COUNT(this->unk_234) - 1;
+ } else {
+ end = ARRAY_COUNT(this->unk_234);
+ }
+
+ Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
+
+ for (i = 0; i < end; i++) {
+ yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_234[i]);
+
+ sp84.x = Math_SinS(yaw) * 3.0f;
+ sp84.z = Math_CosS(yaw) * 3.0f;
+ sp84.y = (Rand_ZeroOne() * 4.0f) + 4.0f;
+
+ EffectSsEnIce_Spawn(globalCtx, &this->unk_234[i], 0.6f, &sp84, &D_80B734B8, &D_80B734B0, &D_80B734B4, 30);
+ }
+}
+
+void func_80B72830(EnRailSkb* this, s16 arg1) {
+ if (this->actor.parent == NULL) {
+ this->unk_3F8 = arg1;
+ } else {
+ ((EnRailSkb*)this->actor.parent)->unk_3F8 = arg1;
+ }
+}
+
+s32 func_80B7285C(EnRailSkb* this) {
+ s32 phi_v1;
+
+ if (this->actor.parent == NULL) {
+ phi_v1 = this->unk_3F8;
+ } else {
+ phi_v1 = ((EnRailSkb*)this->actor.parent)->unk_3F8;
+ }
+ return phi_v1;
+}
+
+void func_80B72880(EnRailSkb* this, GlobalContext* globalCtx) {
+ if ((this->actionFunc == func_80B70FF8) || (this->actionFunc == func_80B716A8)) {
+ if (this->actionFunc != func_80B716A8) {
+ if (Player_GetMask(globalCtx) == PLAYER_MASK_CAPTAIN) {
+ this->actor.flags &= ~(4 | 1);
+ this->actor.flags |= (8 | 1);
+ this->actor.flags |= 0x100000;
+ this->actor.hintId = 0xFF;
+ this->actor.textId = 0;
+ func_80B71650(this);
+ }
+ } else if (Player_GetMask(globalCtx) != PLAYER_MASK_CAPTAIN) {
+ this->actor.flags &= ~(8 | 1);
+ this->actor.flags &= ~0x100000;
+ this->actor.flags |= 5;
+ this->actor.hintId = 0x55;
+ this->actor.textId = 0;
+ func_80B70FA0(this);
+ }
+ }
+}
+
+void func_80B72970(EnRailSkb* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+ s32 pad;
+
+ if ((this->actionFunc == func_80B714D8) || (this->actionFunc == func_80B7123C) ||
+ (this->actionFunc == func_80B715AC) || (this->actionFunc == func_80B71954) ||
+ (this->actionFunc == func_80B71A58) || (this->actionFunc == func_80B71BB8) || (this->unk_3FE == 1)) {
+ return;
+ }
+
+ if (this->collider.base.acFlags & AC_HIT) {
+ this->collider.base.acFlags &= ~AC_HIT;
+ if (this->actionFunc == func_80B7114C) {
+ switch (this->actor.colChkInfo.damageEffect) {
+ case 1:
+ case 3:
+ case 4:
+ case 12:
+ case 13:
+ return;
+
+ default:
+ if (this->unk_3F0 >= 2) {
+ func_80B726B4(this, globalCtx);
+ }
+ this->unk_3F0 = 0;
+ break;
+ }
+ }
+
+ if ((Actor_ApplyDamage(&this->actor) == 0) && (this->actor.colChkInfo.damageEffect != 3) &&
+ (this->actor.colChkInfo.damageEffect != 4)) {
+ Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
+ func_80B71488(this);
+ return;
+ }
+
+ switch (this->actor.colChkInfo.damageEffect) {
+ case 11:
+ this->unk_3F0 = 40;
+ this->unk_403 = 30;
+ this->unk_2EC = 1.0f;
+ this->unk_2F0 = 0.0f;
+ func_800BCB70(&this->actor, 0, 120, 0, 40);
+ func_80B710AC(this);
+ break;
+
+ case 1:
+ func_800BCB70(&this->actor, 0, 120, 0, 40);
+ func_80B710AC(this);
+ break;
+
+ case 2:
+ this->unk_3F0 = 80;
+ this->unk_403 = 0;
+ this->unk_2EC = 1.0f;
+ this->unk_2F0 = 0.0f;
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ func_800BDC5C(&this->skelAnime, sAnimations, 3);
+ this->unk_402 |= 1;
+ func_80B712FC(this);
+ break;
+
+ case 3:
+ if (this->actor.colChkInfo.health != 0) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ this->unk_3F0 = 80;
+ } else {
+ this->unk_3F0 = 3;
+ }
+ this->unk_403 = 11;
+ this->unk_2EC = 1.0f;
+ this->unk_2F0 = 0.5f;
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ func_80B71114(this);
+ break;
+
+ case 4:
+ this->unk_3F0 = 40;
+ this->unk_403 = 20;
+ this->unk_2EC = 1.0f;
+ this->unk_2F0 = 0.5f;
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ func_800BDC5C(&this->skelAnime, sAnimations, 3);
+ func_80B71228(this);
+ break;
+
+ case 12:
+ case 14:
+ this->unk_402 |= 1;
+
+ case 15:
+ if ((player->swordAnimation == 4) || (player->swordAnimation == 11) || (player->swordAnimation == 22) ||
+ (player->swordAnimation == 23)) {
+ this->unk_402 |= 1;
+ }
+
+ case 13:
+ func_800BCB70(&this->actor, 0x4000, 255, 0, 8);
+ Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALKID_DAMAGE);
+ func_800BDC5C(&this->skelAnime, sAnimations, 3);
+ func_80B712FC(this);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (this->actionFunc == func_80B713A4) {
+ CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+
+ if (this->actionFunc != func_80B71314) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+}
+
+void EnRailSkb_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnRailSkb* this = THIS;
+
+ this->actionFunc(this, globalCtx);
+
+ func_80B72190(this, globalCtx);
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 15.0f, 30.0f, 60.0f, 5);
+ func_80B72970(this, globalCtx);
+
+ if ((this->actionFunc != func_80B710E4) && (this->actionFunc != func_80B7114C) &&
+ (this->actionFunc != func_80B7123C)) {
+ SkelAnime_Update(&this->skelAnime);
+ }
+
+ func_80B72880(this, globalCtx);
+ func_80B725C0(this, globalCtx);
+}
+
+s32 EnRailSkb_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
+ Actor* thisx) {
+ EnRailSkb* this = THIS;
+ s16 abs;
+
+ if (limbIndex == 11) {
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ abs = fabsf(Math_SinS(globalCtx->state.frames * 6000) * 95.0f) + 160.0f;
+
+ gDPPipeSync(POLY_OPA_DISP++);
+ gDPSetEnvColor(POLY_OPA_DISP++, abs, abs, abs, 255);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ } else if (limbIndex == 10) {
+ Vec3f sp24 = { 0.0f, 1000.0f, 0.0f };
+
+ Matrix_MultiplyVector3fByState(&sp24, &this->actor.focus.pos);
+ } else if ((limbIndex == 12) && (this->unk_3FA == 1)) {
+ Matrix_InsertZRotation_s(1820, MTXMODE_APPLY);
+ }
+
+ if (((limbIndex == 11) || (limbIndex == 12)) && (this->unk_402 & 2)) {
+ *dList = NULL;
+ }
+
+ return false;
+}
+
+void EnRailSkb_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f D_80B734D0 = { 800.0f, 1200.0f, 0.0f };
+ EnRailSkb* this = THIS;
+
+ if (!(this->unk_402 & 0x80)) {
+ Collider_UpdateSpheres(limbIndex, &this->collider);
+
+ if ((limbIndex == 11) && (this->unk_402 & 1) && !(this->unk_402 & 2)) {
+ func_800BBCEC(&this->actor, globalCtx, 1, dList);
+ this->unk_402 |= 2;
+ } else if ((this->unk_402 & 0x40) && ((limbIndex != 11) || !(this->unk_402 & 1)) && (limbIndex != 12)) {
+ func_800BBCEC(&this->actor, globalCtx, 1, dList);
+ }
+
+ if (this->unk_3F0 != 0) {
+ if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) ||
+ (limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) ||
+ (limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) {
+ Matrix_GetStateTranslation(&this->unk_234[this->unk_2DC]);
+ this->unk_2DC++;
+ } else if ((limbIndex == 11) && !(this->unk_402 & 2)) {
+ Matrix_MultiplyVector3fByState(&D_80B734D0, &this->unk_234[this->unk_2DC]);
+ this->unk_2DC++;
+ }
+ }
+ }
+}
+
+void EnRailSkb_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ EnRailSkb* this = THIS;
+
+ this->unk_2DC = 0;
+ func_8012C28C(globalCtx->state.gfxCtx);
+ SkelAnime_DrawOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, EnRailSkb_OverrideLimbDraw,
+ EnRailSkb_PostLimbDraw, &this->actor);
+ if (this->unk_3F0 > 0) {
+ func_800BE680(globalCtx, &this->actor, this->unk_234, this->unk_2DC, this->unk_2F0, 0.5f, this->unk_2EC,
+ this->unk_403);
+ }
+
+ if ((this->unk_402 & 0x40) && !(this->unk_402 & 0x80)) {
+ this->unk_402 |= 0x80;
+ }
+}
diff --git a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
index 90569ea826..23202ef199 100644
--- a/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
+++ b/src/overlays/actors/ovl_En_Rail_Skb/z_en_rail_skb.h
@@ -6,12 +6,40 @@
struct EnRailSkb;
typedef void (*EnRailSkbActionFunc)(struct EnRailSkb*, GlobalContext*);
+typedef void (*EnRailSkbUnkFunc)(struct EnRailSkb*);
+
+#define ENRAILSKB_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
+#define ENRAILSKB_GET_FF(thisx) ((thisx)->params & 0xFF)
typedef struct EnRailSkb {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0xE4];
- /* 0x0228 */ EnRailSkbActionFunc actionFunc;
- /* 0x022C */ char unk_22C[0x1D8];
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ ColliderJntSph collider;
+ /* 0x164 */ ColliderJntSphElement colliderElements[2];
+ /* 0x1E4 */ SkelAnime skelAnime;
+ /* 0x228 */ EnRailSkbActionFunc actionFunc;
+ /* 0x22C */ ObjHakaisi* unk_22C;
+ /* 0x230 */ Vec3s* unk_230;
+ /* 0x234 */ Vec3f unk_234[14];
+ /* 0x2DC */ s32 unk_2DC;
+ /* 0x2E0 */ s32 unk_2E0;
+ /* 0x2E4 */ s32 unk_2E4;
+ /* 0x2E8 */ s32 unk_2E8;
+ /* 0x2EC */ f32 unk_2EC;
+ /* 0x2F0 */ f32 unk_2F0;
+ /* 0x2F4 */ Vec3s jointTable[20];
+ /* 0x36C */ Vec3s morphTable[20];
+ /* 0x3E4 */ UNK_TYPE1 unk3E4[0xC];
+ /* 0x3F0 */ s16 unk_3F0;
+ /* 0x3F2 */ s16 unk_3F2;
+ /* 0x3F4 */ s16 unk_3F4;
+ /* 0x3F6 */ s16 unk_3F6;
+ /* 0x3F8 */ s16 unk_3F8;
+ /* 0x3FA */ s16 unk_3FA;
+ /* 0x3FC */ s16 unk_3FC;
+ /* 0x3FE */ s16 unk_3FE;
+ /* 0x400 */ u16 unk_400;
+ /* 0x402 */ u8 unk_402;
+ /* 0x403 */ u8 unk_403;
} EnRailSkb; // size = 0x404
extern const ActorInit En_Rail_Skb_InitVars;
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 6b1d57ea80..de64df7dfd 100644
--- a/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
+++ b/src/overlays/actors/ovl_En_Railgibud/z_en_railgibud.c
@@ -611,7 +611,7 @@ void func_80BA6800(EnRailgibud* this, GlobalContext* globalCtx, s32 arg2) {
void func_80BA6974(GlobalContext* globalCtx, Vec3f* vec, f32 arg2, s32 arg3, s16 arg4, s16 arg5) {
Vec3f sp8C;
Vec3f sp80 = { 0.0f, 0.3f, 0.0f };
- Vec3f sp74 = D_801D15B0;
+ Vec3f sp74 = gZeroVec3f;
s32 i;
s32 pad;
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 96e688bb4c..f012353277 100644
--- a/src/overlays/actors/ovl_En_Rr/z_en_rr.c
+++ b/src/overlays/actors/ovl_En_Rr/z_en_rr.c
@@ -720,7 +720,7 @@ void func_808FB42C(EnRr* this, GlobalContext* globalCtx) {
sp74.x = this->actor.world.pos.x;
sp74.y = this->actor.world.pos.y + 20.0f;
sp74.z = this->actor.world.pos.z;
- func_800B3030(globalCtx, &sp74, &D_801D15B0, &D_801D15B0, 100, 0, 0);
+ func_800B3030(globalCtx, &sp74, &gZeroVec3f, &gZeroVec3f, 100, 0, 0);
Audio_PlaySoundAtPosition(globalCtx, &sp74, 11, NA_SE_EN_EXTINCT);
} else {
temp_f20 = this->actor.scale.y * 66.66667f;
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 0e6b20f3dd..9cc8897a2e 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -331,7 +331,7 @@ void func_80BAAB78(EnSuttari* this, GlobalContext* globalCtx) {
case 0:
if (gSaveContext.weekEventReg[0x51] & 1) {
this->textId = 0x1455;
- ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk264 |= 8;
+ ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk_264 |= 8;
this->flags2 |= 1;
} else {
this->textId = 0x1450;
@@ -353,7 +353,7 @@ void func_80BAAB78(EnSuttari* this, GlobalContext* globalCtx) {
case 0x1453:
this->flags1 |= 0x400;
gSaveContext.weekEventReg[0x51] |= 1;
- ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk264 |= 8;
+ ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk_264 |= 8;
this->flags2 |= 1;
this->textId = 0x1454;
break;
@@ -411,7 +411,7 @@ void func_80BAAFDC(EnSuttari* this, GlobalContext* globalCtx) {
Matrix_MultiplyVector3fByState(&effectVelOffset, &effectVel);
Matrix_StatePop();
if (this->unk3F0 == 0) {
- EffectSsSolderSrchBall_Spawn(globalCtx, &effectPos, &effectVel, &D_801D15B0, 50, &this->unk3F0, 1);
+ EffectSsSolderSrchBall_Spawn(globalCtx, &effectPos, &effectVel, &gZeroVec3f, 50, &this->unk3F0, 1);
}
if (this->unk3F0 == 1) {
play_sound(NA_SE_SY_FOUND);
@@ -443,7 +443,7 @@ void func_80BAB1A0(EnSuttari* this, GlobalContext* globalCtx) {
Matrix_MultiplyVector3fByState(&effectVelOffset, &effectVel);
Matrix_StatePop();
if (this->unk3F0 == 0) {
- EffectSsSolderSrchBall_Spawn(globalCtx, &effectPos, &effectVel, &D_801D15B0, 50, &this->unk3F0, 1);
+ EffectSsSolderSrchBall_Spawn(globalCtx, &effectPos, &effectVel, &gZeroVec3f, 50, &this->unk3F0, 1);
}
if (this->unk3F0 == 1) {
play_sound(NA_SE_SY_FOUND);
@@ -755,7 +755,7 @@ s32 func_80BABFD4(EnSuttari* this, GlobalContext* globalCtx) {
func_8013AF00(sp7C, 3, this->unk404->count + 3);
if (this->unk42C == 0) {
- sp58 = D_801D15B0;
+ sp58 = gZeroVec3f;
func_8013B6B0(this->unk404, &this->unk414, &this->unk424, this->unk41C, this->unk418, &this->unk420, sp7C,
&sp58, this->unk42A);
func_8013B878(globalCtx, this->unk404, this->unk420, &sp58);
@@ -771,7 +771,7 @@ s32 func_80BABFD4(EnSuttari* this, GlobalContext* globalCtx) {
sp50 = this->unk420;
sp58 = this->actor.world.pos;
}
- this->unk408 = D_801D15B0;
+ this->unk408 = gZeroVec3f;
if (func_8013B6B0(this->unk404, &this->unk414, &this->unk424, this->unk41C, this->unk418, &this->unk420, sp7C,
&this->unk408, this->unk42A)) {
this->unk430 = 1;
@@ -1318,7 +1318,7 @@ void func_80BADA9C(EnSuttari* this, GlobalContext* globalCtx) {
}
this->flags1 &= ~0x400;
if (this->flags2 & 1) {
- ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk264 |= 0x10;
+ ((EnElf*)GET_PLAYER(globalCtx)->tatlActor)->unk_264 |= 0x10;
this->flags2 &= ~1;
}
globalCtx->msgCtx.unk11F22 = 0x43;
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 221de85014..204d251d19 100644
--- a/src/overlays/actors/ovl_En_Sw/z_en_sw.c
+++ b/src/overlays/actors/ovl_En_Sw/z_en_sw.c
@@ -174,11 +174,11 @@ void func_808D8940(EnSw* this, GlobalContext* globalCtx) {
sp94.x = 0.0f;
sp94.y = (Rand_ZeroOne() * 0.2f) + 0.1f;
sp94.z = Rand_ZeroOne() + 1.0f;
- Lib_Vec3f_TranslateAndRotateY(&D_801D15B0, temp_s0, &sp94, &spAC);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, temp_s0, &sp94, &spAC);
sp94.x = 0.0f;
sp94.y = 0.7f;
sp94.z = 2.0f;
- Lib_Vec3f_TranslateAndRotateY(&D_801D15B0, temp_s0, &sp94, &spB8);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, temp_s0, &sp94, &spB8);
spA0.x = this->actor.world.pos.x + (2.0f * spB8.x);
spA0.z = this->actor.world.pos.z + (2.0f * spB8.z);
func_800B0EB0(globalCtx, &spA0, &spB8, &spAC, &D_808DBAA4, &D_808DBAA8, 60, 30, temp_f4);
@@ -1148,7 +1148,7 @@ void func_808DB2E0(EnSw* this, GlobalContext* globalCtx) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_STALTURA_BOUND);
} else {
func_800BC154(globalCtx, &globalCtx->actorCtx, &this->actor, 5);
- Math_Vec3f_Copy(&this->actor.velocity, &D_801D15B0);
+ Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
this->unk_410 &= ~(0x10 | 0x1);
this->actionFunc = func_808DB100;
}
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 2d054f808f..d85e293dca 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.c
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.c
@@ -13,11 +13,9 @@
void EnTalk_Init(Actor* thisx, GlobalContext* globalCtx);
void EnTalk_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnTalk_Update(Actor* thisx, GlobalContext* globalCtx);
-
void func_80BDE058(EnTalk* this, GlobalContext* globalCtx);
void func_80BDE090(EnTalk* this, GlobalContext* globalCtx);
-#if 0
const ActorInit En_Talk_InitVars = {
ACTOR_EN_TALK,
ACTORCAT_ITEMACTION,
@@ -30,14 +28,42 @@ const ActorInit En_Talk_InitVars = {
(ActorFunc)NULL,
};
-#endif
+void EnTalk_Init(Actor* thisx, GlobalContext* globalCtx) {
+ EnTalk* this = THIS;
+ s8 targetMode = this->actor.home.rot.x - 0x1;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Talk/EnTalk_Init.s")
+ if (targetMode >= 0 && targetMode < 7) {
+ this->actor.targetMode = targetMode;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Talk/EnTalk_Destroy.s")
+ Actor_SetScale(&this->actor, 1.0f);
+ this->actionFunc = func_80BDE090;
+ this->actor.textId = ENTALK_GET_TEXT_ID(&this->actor);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Talk/func_80BDE058.s")
+void EnTalk_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Talk/func_80BDE090.s")
+void func_80BDE058(EnTalk* this, GlobalContext* globalCtx) {
+ if (func_800B867C(&this->actor, globalCtx)) {
+ this->actionFunc = func_80BDE090;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Talk/EnTalk_Update.s")
+void func_80BDE090(EnTalk* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->actionFunc = func_80BDE058;
+ return;
+ }
+
+ if ((this->actor.xzDistToPlayer < 40.0f && Actor_IsLinkFacingActor(&this->actor, 0x3000, globalCtx)) ||
+ this->actor.isTargeted) {
+ func_800B8614(&this->actor, globalCtx, 120.0f);
+ }
+}
+
+void EnTalk_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnTalk* this = THIS;
+
+ this->actionFunc(this, globalCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Talk/z_en_talk.h b/src/overlays/actors/ovl_En_Talk/z_en_talk.h
index 764127f760..629a5c0e27 100644
--- a/src/overlays/actors/ovl_En_Talk/z_en_talk.h
+++ b/src/overlays/actors/ovl_En_Talk/z_en_talk.h
@@ -3,6 +3,8 @@
#include "global.h"
+#define ENTALK_GET_TEXT_ID(thisx) (((thisx)->params & 0x3F) + 0x1C00)
+
struct EnTalk;
typedef void (*EnTalkActionFunc)(struct EnTalk*, GlobalContext*);
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 4da30599cb..f1ec4e817e 100644
--- a/src/overlays/actors/ovl_En_Test5/z_en_test5.c
+++ b/src/overlays/actors/ovl_En_Test5/z_en_test5.c
@@ -102,7 +102,7 @@ void EnTest5_Update(Actor* thisx, GlobalContext* globalCtx2) {
steamVel.x = 0.0f;
steamVel.z = 0.0f;
- EffectSsIceSmoke_Spawn(globalCtx, &steamPos, &steamVel, &D_801D15B0,
+ EffectSsIceSmoke_Spawn(globalCtx, &steamPos, &steamVel, &gZeroVec3f,
(s16)((-200) - (s32)(Rand_ZeroOne() * 50.0f)));
}
}
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 89973ff694..cb33c2621a 100644
--- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
+++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c
@@ -658,7 +658,7 @@ void func_80C11DF0(EnThiefbird* this, GlobalContext* globalCtx) {
if ((this->actor.bgCheckFlags & 1) || (this->actor.floorHeight == BGCHECK_Y_MIN)) {
for (i = 0; i < ARRAY_COUNT(this->unk_350); i++) {
- func_800B3030(globalCtx, &this->unk_350[i], &D_801D15B0, &D_801D15B0, 0x8C, 0, 0);
+ func_800B3030(globalCtx, &this->unk_350[i], &gZeroVec3f, &gZeroVec3f, 0x8C, 0, 0);
}
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 11, NA_SE_EN_EXTINCT);
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 61a12cfb0a..bcf8547eff 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -266,7 +266,7 @@ void func_80893BCC(EnTite* this, GlobalContext* globalCtx) {
sp7C.x = ptr->x + randPlusMinusPoint5Scaled(1.0f);
sp7C.y = ptr->y + randPlusMinusPoint5Scaled(1.0f);
sp7C.z = ptr->z + randPlusMinusPoint5Scaled(1.0f);
- func_800B0DE0(globalCtx, &sp7C, &D_801D15B0, &D_80896B64, &D_80896B3C, &D_80896B40,
+ func_800B0DE0(globalCtx, &sp7C, &gZeroVec3f, &D_80896B64, &D_80896B3C, &D_80896B40,
(s32)Rand_ZeroFloat(16.0f) + 80, 15);
}
}
@@ -677,7 +677,7 @@ void func_808951B8(EnTite* this, GlobalContext* globalCtx) {
if (this->unk_2BC == 0) {
for (i = 0; i < ARRAY_COUNT(this->unk_2D0); i++) {
- func_800B3030(globalCtx, &this->unk_2D0[i], &D_801D15B0, &D_801D15B0, 40, 7, 1);
+ func_800B3030(globalCtx, &this->unk_2D0[i], &gZeroVec3f, &gZeroVec3f, 40, 7, 1);
Audio_PlaySoundAtPosition(globalCtx, &this->unk_2D0[i], 11, NA_SE_EN_EXTINCT);
}
Actor_MarkForDeath(&this->actor);
@@ -816,7 +816,7 @@ void func_8089595C(EnTite* this, GlobalContext* globalCtx) {
sp2C.x = randPlusMinusPoint5Scaled(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;
- func_800B0DE0(globalCtx, &sp2C, &D_801D15B0, &D_80896B44, &D_80896B3C, &D_80896B40, 500, 50);
+ func_800B0DE0(globalCtx, &sp2C, &gZeroVec3f, &D_80896B44, &D_80896B3C, &D_80896B40, 500, 50);
}
void func_80895A10(EnTite* this) {
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 07bf625d21..74577c188b 100644
--- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c
+++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c
@@ -405,7 +405,7 @@ s32 func_80AECE60(EnTk* this, GlobalContext* globalCtx) {
func_8013AF00(spA0, 3, this->unk_3C8->count + 3);
if (!(this->unk_3CE & 4)) {
- sp7C = D_801D15B0;
+ sp7C = gZeroVec3f;
func_8013B6B0(this->unk_3C8, &this->unk_3E0, &this->unk_3F0, this->unk_3E8, this->unk_3E4, &this->unk_3EC, spA0,
&sp7C, this->unk_3D0);
func_8013B878(globalCtx, this->unk_3C8, this->unk_3EC, &sp7C);
@@ -428,7 +428,7 @@ s32 func_80AECE60(EnTk* this, GlobalContext* globalCtx) {
sp7C = this->actor.world.pos;
}
- this->unk_3D4 = D_801D15B0;
+ this->unk_3D4 = gZeroVec3f;
if (func_8013B6B0(this->unk_3C8, &this->unk_3E0, &this->unk_3F0, this->unk_3E8, this->unk_3E4, &this->unk_3EC, spA0,
&this->unk_3D4, this->unk_3D0)) {
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 a03072c529..e6cd134b5e 100644
--- a/src/overlays/actors/ovl_En_Trt/z_en_trt.c
+++ b/src/overlays/actors/ovl_En_Trt/z_en_trt.c
@@ -1712,11 +1712,11 @@ void EnTrt_UpdateHeadYawAndPitch(EnTrt* this, GlobalContext* globalCtx) {
void EnTrt_UpdateHeadPosAndRot(s16 pitch, s16 yaw, Vec3f* pos, Vec3s* rot, s32 isFullyAwake) {
Vec3f newPos;
- Vec3f D_801D15B0tmp = D_801D15B0;
+ Vec3f zeroVec = gZeroVec3f;
Vec3s newRot;
MtxF currentState;
- Matrix_MultiplyVector3fByState(&D_801D15B0tmp, &newPos);
+ Matrix_MultiplyVector3fByState(&zeroVec, &newPos);
Matrix_CopyCurrentState(¤tState);
func_8018219C(¤tState, &newRot, MTXMODE_NEW);
*pos = newPos;
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 4874ac2496..cbb31ebc35 100644
--- a/src/overlays/actors/ovl_En_Tru/z_en_tru.c
+++ b/src/overlays/actors/ovl_En_Tru/z_en_tru.c
@@ -130,7 +130,7 @@ void func_80A85620(EnTruUnkStruct* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 ar
arg0->unk_01 = arg0->unk_02;
arg0->unk_00 = 1;
arg0->unk_04 = *arg1;
- arg0->unk_1C = D_801D15B0;
+ arg0->unk_1C = gZeroVec3f;
arg0->unk_10 = D_80A8B250;
arg0->unk_28 = arg2;
arg0->unk_2C = arg3;
@@ -190,8 +190,8 @@ void func_80A85AA4(EnTruUnkStruct* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 ar
arg0->unk_01 = arg0->unk_02;
arg0->unk_00 = 2;
arg0->unk_04 = *arg1;
- arg0->unk_1C = D_801D15B0;
- arg0->unk_10 = D_801D15B0;
+ arg0->unk_1C = gZeroVec3f;
+ arg0->unk_10 = gZeroVec3f;
arg0->unk_28 = arg2;
arg0->unk_2C = arg3;
break;
@@ -350,23 +350,23 @@ s32 func_80A86460(EnTru* this) {
f32 temp_f6;
s16 phi_s1;
- Math_Vec3f_Copy(&spB0, &D_801D15B0);
- Math_Vec3f_Copy(&sp8C, &D_801D15B0);
- Math_Vec3f_Copy(&spA4, &D_801D15B0);
- Math_Vec3f_Copy(&sp98, &D_801D15B0);
+ Math_Vec3f_Copy(&spB0, &gZeroVec3f);
+ Math_Vec3f_Copy(&sp8C, &gZeroVec3f);
+ Math_Vec3f_Copy(&spA4, &gZeroVec3f);
+ Math_Vec3f_Copy(&sp98, &gZeroVec3f);
phi_s1 = (Rand_ZeroOne() * 360.0f) * 182.0f;
spB0.z = 20.0f;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.world.rot.y, &spB0, &sp8C);
for (i = 0; i < 8; i++, phi_s1 += 0x1FFE) {
- Math_Vec3f_Copy(&spB0, &D_801D15B0);
+ Math_Vec3f_Copy(&spB0, &gZeroVec3f);
spB0.y = 1.0f;
spB0.z = Rand_ZeroOne() + 3.0f;
- Lib_Vec3f_TranslateAndRotateY(&D_801D15B0, phi_s1, &spB0, &sp98);
- Math_Vec3f_Copy(&spB0, &D_801D15B0);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, phi_s1, &spB0, &sp98);
+ Math_Vec3f_Copy(&spB0, &gZeroVec3f);
spB0.z = (Rand_ZeroOne() * 4.0f) + 12.0f;
Lib_Vec3f_TranslateAndRotateY(&sp8C, phi_s1, &spB0, &spA4);
- func_80A85E2C(this->unk_394, &spA4, &D_801D15B0, &sp98, 0.4f, 0.06f, 12.0f, 4);
+ func_80A85E2C(this->unk_394, &spA4, &gZeroVec3f, &sp98, 0.4f, 0.06f, 12.0f, 4);
}
return false;
@@ -378,7 +378,7 @@ s32 func_80A86674(EnTru* this) {
Vec3f sp34;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.world.rot.y, &D_80A8B3D8, &sp40);
- Lib_Vec3f_TranslateAndRotateY(&D_801D15B0, this->actor.world.rot.y, &D_80A8B3E4, &sp34);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, this->actor.world.rot.y, &D_80A8B3E4, &sp34);
if (this->unk_390 == 1) {
func_80A85E2C(this->unk_394, &sp40, &D_80A8B3F0, &sp34, 0.2f, 0.1f, 12.0f, 3);
} else if (this->unk_390 == 2) {
@@ -396,12 +396,12 @@ s32 func_80A86770(EnTru* this) {
s16 phi_s0 = Rand_ZeroOne() * 360.0f * 182.0f;
for (i = 0; i < 4; i++, phi_s0 += 0x3FFC) {
- Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, phi_s0, &D_801D15B0, &sp98);
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, phi_s0, &gZeroVec3f, &sp98);
sp98.y = this->actor.floorHeight + 1.0f;
sp8C.x = Rand_ZeroOne() - 0.5f;
sp8C.z = Rand_ZeroOne() - 0.5f;
sp8C.y = Rand_ZeroOne() * 0.2f;
- func_80A85E2C(this->unk_394, &sp98, &sp8C, &D_801D15B0, 1.0f, 0.04f, 28.0f, 4);
+ func_80A85E2C(this->unk_394, &sp98, &sp8C, &gZeroVec3f, 1.0f, 0.04f, 28.0f, 4);
}
return false;
@@ -931,7 +931,7 @@ s32 func_80A87B48(Actor* thisx, GlobalContext* globalCtx) {
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
sp3E = BINANG_ROT180(func_800DFCDC(GET_ACTIVE_CAM(globalCtx)));
- Math_Vec3f_Copy(&sp4C, &D_801D15B0);
+ Math_Vec3f_Copy(&sp4C, &gZeroVec3f);
sp4C.z = 40.0f;
Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, sp3E, &sp4C, &sp40);
func_80A85620(this->unk_394, &sp40, 2.0f, 0.08f, 60.0f);
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 fac66b679a..931d283e47 100644
--- a/src/overlays/actors/ovl_En_Wf/z_en_wf.c
+++ b/src/overlays/actors/ovl_En_Wf/z_en_wf.c
@@ -508,7 +508,7 @@ void func_80990C6C(EnWf* this, GlobalContext* globalCtx, s32 arg2) {
sp88.x = randPlusMinusPoint5Scaled(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;
- func_800B0F18(globalCtx, &sp88, &D_801D15B0, &D_809942DC, phi_s1, phi_s1, phi_s6, 5,
+ func_800B0F18(globalCtx, &sp88, &gZeroVec3f, &D_809942DC, phi_s1, phi_s1, phi_s6, 5,
Rand_ZeroFloat(5.0f) + 14.0f);
}
}
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 822ceadd9a..5bbf270296 100644
--- a/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
+++ b/src/overlays/actors/ovl_En_Wiz/z_en_wiz.h
@@ -11,7 +11,9 @@ typedef struct EnWiz {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x268];
/* 0x03AC */ EnWizActionFunc actionFunc;
- /* 0x03B0 */ char unk_3B0[0x9D0];
+ /* 0x03B0 */ char unk_3B0[0x98];
+ /* 0x0448 */ s32 unk_448;
+ /* 0x044C */ char unk_44C[0x934];
} EnWiz; // size = 0xD80
extern const ActorInit En_Wiz_InitVars;
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 a4c63543c3..a8a10008be 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c
@@ -5,6 +5,7 @@
*/
#include "z_en_zog.h"
+#include "objects/object_zog/object_zog.h"
#define FLAGS 0x00000009
@@ -30,7 +31,8 @@ void func_80B94E34(EnZog* this, GlobalContext* globalCtx);
void func_80B95128(EnZog* this, GlobalContext* globalCtx);
void func_80B95240(EnZog* this, GlobalContext* globalCtx);
-#if 0
+static u8 D_80B95E10;
+
const ActorInit En_Zog_InitVars = {
ACTOR_EN_ZOG,
ACTORCAT_NPC,
@@ -43,78 +45,1041 @@ const ActorInit En_Zog_InitVars = {
(ActorFunc)EnZog_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80B95880 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_ENEMY, OC1_ON | OC1_TYPE_PLAYER, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_ENEMY,
+ OC1_ON | OC1_TYPE_PLAYER,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0xF7CFFFFF, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 30, 40, 0, { 0, 0, 0 } },
};
-#endif
+static TexturePtr D_80B958AC[] = { &object_zog_Tex_024750, &object_zog_Tex_024F50, &object_zog_Tex_025750 };
-extern ColliderCylinderInit D_80B95880;
+static TexturePtr D_80B958B8[] = { &object_zog_Tex_025F50, &object_zog_Tex_026750 };
-extern UNK_TYPE D_0600FC0C;
-extern UNK_TYPE D_060280A8;
+static AnimationHeader* D_80B958C0[] = {
+ &object_zog_Anim_00FC0C, &object_zog_Anim_0106B0, &object_zog_Anim_0166F4, &object_zog_Anim_017170,
+ &object_zog_Anim_014B10, &object_zog_Anim_018600, &object_zog_Anim_01A06C,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93310.s")
+static AnimationHeader* D_80B958DC[] = { &object_zog_Anim_00CA94, &object_zog_Anim_00F110 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93468.s")
+static AnimationHeader* D_80B958E4[] = { &object_zog_Anim_01579C, &object_zog_Anim_015B80, &object_zog_Anim_00ECBC };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/EnZog_Init.s")
+static AnimationHeader* D_80B958F0[] = { &object_zog_Anim_008EB8, &object_zog_Anim_0099A4 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/EnZog_Destroy.s")
+static AnimationHeader* D_80B958F8[] = { &object_zog_Anim_00931C, &object_zog_Anim_009EC4, &object_zog_Anim_00B01C };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B939C0.s")
+static AnimationHeader* D_80B95904[] = {
+ &object_zog_Anim_00BF38, &object_zog_Anim_01A990, &object_zog_Anim_01AD58,
+ &object_zog_Anim_01B72C, &object_zog_Anim_01BC88,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93A48.s")
+static AnimationHeader* D_80B95918 = &object_zog_Anim_001000;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93B44.s")
+static AnimationHeader* D_80B9591C = &object_zog_Anim_001970;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93BA8.s")
+static AnimationHeader* D_80B95920 = &object_zog_Anim_002344;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93BE0.s")
+static AnimationHeader* D_80B95924 = &object_zog_Anim_002894;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93D2C.s")
+static AnimationHeader* D_80B95928 = &object_zog_Anim_0030E0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93DE8.s")
+static AnimationHeader* D_80B9592C = &object_zog_Anim_0037F8;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B93EA0.s")
+static AnimationHeader* D_80B95930 = &object_zog_Anim_0041D0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B943A0.s")
+static AnimationHeader* D_80B95934 = &object_zog_Anim_004BDC;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B943C0.s")
+static AnimationHeader* D_80B95938 = &object_zog_Anim_0055B4;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B943EC.s")
+static s16 D_80B9593C[] = { 0, 1, 2, 3 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B94470.s")
+static s16 D_80B95944[] = { 4, 5 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B9451C.s")
+static s16 D_80B95948[] = { 5, 6, 7, 0 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B9461C.s")
+static s16 D_80B95950[] = { 7, 8, 9, 10, 7, 11, 12, 13, 14, 15, 12, 13, 14, 15, 12, 16, 17, 0 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B946B4.s")
+static s16* D_80B95974[] = { D_80B9593C, D_80B95944, D_80B95948, D_80B95950 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B946FC.s")
+static s16 D_80B95984[] = { 4, 2, 3, 17 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B948A8.s")
+static Vec3f D_80B9598C = { 0.0f, -0.05f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B94A00.s")
+static Vec3f D_80B95998 = { 0.0f, -0.025f, 0.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B94C5C.s")
+static Color_RGBA8 D_80B959A4 = { 220, 220, 255, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B94D0C.s")
+static Color_RGBA8 D_80B959A8 = { 80, 80, 220, 255 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B94E34.s")
+static Vec3f D_80B959AC = { 0.0f, 0.0f, 15.0f };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B95128.s")
+void func_80B93310(Actor* thisx, Lights* mapper, GlobalContext* globalCtx) {
+ Vec3f sp34;
+ EnZog* this = THIS;
+ f32 sp2C;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B95240.s")
+ if (this->unk_322 > 0) {
+ if (this->unk_30A & 8) {
+ this->actor.shape.shadowAlpha = this->unk_322;
+ } else {
+ this->actor.shape.shadowAlpha = 255;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/EnZog_Update.s")
+ Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B954C4.s")
+ sp2C = sqrtf(SQ(this->actor.focus.pos.x - this->unk_2F0.x) + SQ(this->actor.focus.pos.z - this->unk_2F0.z));
+ if (sp2C < 12.0f) {
+ sp2C = 12.0f;
+ } else if (sp2C > 60.0f) {
+ sp2C = 60.0f;
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/func_80B95598.s")
+ Math_Vec3f_Copy(&this->actor.world.pos, &this->unk_2F0);
+ func_800B4AEC(globalCtx, &this->actor, 50.0f);
+ if (sp34.y < this->actor.floorHeight) {
+ this->actor.world.pos.y = this->actor.floorHeight;
+ } else {
+ this->actor.world.pos.y = sp34.y;
+ }
+ this->actor.scale.z *= sp2C * (1 / 12.0f);
+ func_800B3FC0(&this->actor, mapper, globalCtx);
+ this->actor.scale.z = this->actor.scale.x;
+ Math_Vec3f_Copy(&this->actor.world.pos, &sp34);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Zog/EnZog_Draw.s")
+void func_80B93468(EnZog* this, GlobalContext* globalCtx) {
+ Vec3s* points;
+
+ this->unk_2E8 = &globalCtx->setupPathList[ENZOG_GET_FC00(&this->actor)];
+ if (this->unk_2E8 != NULL) {
+ points = &((Vec3s*)Lib_SegmentedToVirtual(this->unk_2E8->points))[this->unk_2EC];
+ points++;
+
+ this->actor.world.pos.x = points[-1].x;
+ this->actor.world.pos.z = points[-1].z;
+ this->actor.world.rot.y = Math_Atan2S(points->x - this->actor.world.pos.x, points->z - this->actor.world.pos.z);
+ this->actor.speedXZ = 0.0f;
+ }
+}
+
+void EnZog_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnZog* this = THIS;
+ s32 i;
+ s16 cs;
+
+ if (!D_80B95E10) {
+ for (i = 0; i < ARRAY_COUNT(D_80B958AC); i++) {
+ D_80B958AC[i] = Lib_SegmentedToVirtual(D_80B958AC[i]);
+ }
+
+ for (i = 0; i < ARRAY_COUNT(D_80B958B8); i++) {
+ D_80B958B8[i] = Lib_SegmentedToVirtual(D_80B958B8[i]);
+ }
+
+ D_80B95E10 = true;
+ }
+
+ ActorShape_Init(&this->actor.shape, 0.0f, func_80B93310, 24.0f);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actionFunc = func_80B95128;
+ this->actor.textId = 0x1004;
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_zog_Skel_029170, &object_zog_Anim_00FC0C, this->jointTable,
+ this->morphTable, 23);
+ Animation_PlayOnce(&this->skelAnime, &object_zog_Anim_00FC0C);
+ Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ this->actor.colChkInfo.mass = MASS_IMMOVABLE;
+
+ if ((ENZOG_GET_F(&this->actor) != ENZOG_F_2) && (INV_CONTENT(ITEM_MASK_ZORA) == ITEM_MASK_ZORA) &&
+ ((globalCtx->csCtx.unk_12 != 2) || (gSaveContext.sceneSetupIndex != 0) ||
+ (globalCtx->sceneNum != SCENE_30GYOSON))) {
+ Actor_MarkForDeath(&this->actor);
+ return;
+ }
+
+ this->actor.minVelocityY = -4.0f;
+ this->actor.gravity = -1.0f;
+ this->actor.uncullZoneScale = 3000.0f;
+ this->actor.shape.yOffset = 1000.0f;
+ this->unk_308 = 0;
+ this->unk_30A = 0;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ this->unk_31A = -1;
+ this->unk_322 = 100;
+
+ Math_Vec3f_Copy(&this->unk_2F0, &this->actor.world.pos);
+
+ if (ENZOG_GET_F(&this->actor) == ENZOG_F_2) {
+ this->actionFunc = func_80B95240;
+ this->unk_322 = 255;
+ this->unk_31C = 0;
+ this->unk_31E = 0;
+ this->actor.shape.yOffset = 0.0f;
+ }
+
+ this->unk_2EC = 0;
+ if (ENZOG_GET_FC00(&this->actor) != ENZOG_FC00_63) {
+ func_80B93468(this, globalCtx);
+ } else {
+ this->unk_2E8 = NULL;
+ }
+
+ this->unk_2FC = 0;
+ this->unk_302 = 0;
+ this->unk_2EC++;
+ this->unk_304 = 0;
+ this->unk_2FE = this->unk_2FC;
+ this->unk_300 = this->unk_302;
+ cs = this->actor.cutscene;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_30C); i++) {
+ this->unk_30C[i] = cs;
+ if (cs != -1) {
+ this->actor.cutscene = cs;
+ cs = ActorCutscene_GetAdditionalCutscene(this->actor.cutscene);
+ }
+ }
+
+ this->actor.flags |= 0x10000;
+ this->actor.home.rot.z = 0;
+ if (ENZOG_GET_F(&this->actor) != ENZOG_F_2) {
+ for (i = 0; i < 5; i++) {
+ Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_TANRON4, this->actor.world.pos.x,
+ this->actor.world.pos.y + 500.0f, this->actor.world.pos.z, 0, 0, 0, 100);
+ }
+ }
+
+ if ((ENZOG_GET_F(&this->actor) != ENZOG_F_2) && (gSaveContext.weekEventReg[88] & 0x10)) {
+ this->unk_302 = this->unk_300 = 0;
+ this->unk_2FC = this->unk_2FE = 3;
+ this->actor.flags |= 0x2000000;
+ this->actor.flags &= ~0x10000;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+
+ Animation_PlayLoop(&this->skelAnime, D_80B958DC[0]);
+ this->actor.textId = 0x1009;
+ if (gSaveContext.weekEventReg[91] & 2) {
+ this->actor.textId = 0x103C;
+ this->actionFunc = func_80B9451C;
+ } else {
+ this->actionFunc = func_80B948A8;
+ }
+ this->actor.shape.rot.y = 0x4000;
+ this->actor.world.rot.y = 0x4000;
+ this->actor.world.pos.x = -376.0f;
+ this->actor.world.pos.y = 80.0f;
+ this->actor.world.pos.z = 4793.0f;
+ this->actor.shape.yOffset = 0.0f;
+ }
+}
+
+void EnZog_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnZog* this = THIS;
+
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
+
+void func_80B939C0(EnZog* this, s16 arg1, u8 arg2) {
+ Animation_Change(&this->skelAnime, D_80B958C0[arg1], 1.0f, 0.0f, Animation_GetLastFrame(D_80B958C0[arg1]), arg2,
+ -5.0f);
+ this->unk_304 = arg1;
+}
+
+void func_80B93A48(EnZog* this, GlobalContext* globalCtx) {
+ s16* table;
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ if (this->unk_302 != this->unk_300) {
+ this->unk_302++;
+ } else if (this->unk_302 == 0) {
+ if (this->unk_2FC != this->unk_2FE) {
+ this->unk_2FC = this->unk_2FE;
+ }
+ }
+
+ if (this->unk_302 >= D_80B95984[this->unk_2FC]) {
+ this->unk_302 = 0;
+ this->unk_300 = 0;
+ if (this->unk_2FC != this->unk_2FE) {
+ this->unk_2FC = this->unk_2FE;
+ }
+ }
+
+ table = D_80B95974[this->unk_2FC];
+
+ this->unk_304 = table[this->unk_302];
+ Animation_PlayOnce(&this->skelAnime, D_80B958C0[this->unk_304]);
+ SkelAnime_Update(&this->skelAnime);
+ }
+}
+
+void func_80B93B44(EnZog* this) {
+ if (!(this->unk_30A & 4)) {
+ if (this->unk_31A != -1) {
+ ActorCutscene_Stop(this->unk_30C[this->unk_31A]);
+ }
+ }
+ this->unk_31A = -1;
+ this->unk_30A &= ~4;
+}
+
+void func_80B93BA8(EnZog* this, s16 arg1) {
+ func_80B93B44(this);
+ this->unk_31A = arg1;
+ this->unk_30A |= 4;
+}
+
+s32 func_80B93BE0(EnZog* this, GlobalContext* globalCtx) {
+ Path* path = this->unk_2E8;
+ s16 temp_v0;
+ Vec3s* points;
+
+ if (this->unk_2E8 == 0) {
+ return false;
+ }
+
+ points = &((Vec3s*)Lib_SegmentedToVirtual(path->points))[this->unk_2EC];
+
+ if (this->unk_30A & 1) {
+ this->actor.world.pos.x = points->x;
+ this->actor.world.pos.z = points->z;
+ return true;
+ }
+
+ points++;
+ temp_v0 = Math_Atan2S(points->x - this->actor.world.pos.x, points->z - this->actor.world.pos.z);
+
+ if (ABS_ALT(temp_v0 - this->actor.world.rot.y) > 0x4000) {
+ this->unk_2EC++;
+ func_80B93468(this, globalCtx);
+ if ((this->unk_2EC + 1) >= this->unk_2E8->count) {
+ this->unk_30A |= 1;
+ return true;
+ }
+ } else {
+ this->actor.world.rot.y = temp_v0;
+ }
+
+ return false;
+}
+
+void func_80B93D2C(EnZog* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Vec3f sp28 = this->actor.world.pos;
+
+ sp28.y += this->actor.depthInWater;
+ this->actor.world.pos.y += (this->actor.depthInWater - 10.0f) + (2.0f * Math_SinS(this->unk_308));
+ this->unk_308 += 0x200;
+ if ((globalCtx->gameplayFrames % 16) == 0) {
+ EffectSsGRipple_Spawn(globalCtx, &sp28, 150, 500, 0);
+ }
+}
+
+void func_80B93DE8(Vec3f* arg0, GlobalContext* globalCtx, s32 arg2) {
+ Vec3f sp2C;
+
+ sp2C.x = randPlusMinusPoint5Scaled(30.0f) + arg0->x;
+ sp2C.y = arg0->y + 3.0f;
+ sp2C.z = randPlusMinusPoint5Scaled(30.0f) + arg0->z;
+ EffectSsKiraKira_SpawnDispersed(globalCtx, &sp2C, &D_80B9598C, &D_80B95998, &D_80B959A4, &D_80B959A8, 1000, arg2);
+}
+
+s32 func_80B93EA0(EnZog* this, GlobalContext* globalCtx) {
+ s16 sp3E;
+
+ if (SkelAnime_Update(&this->skelAnime)) {
+ switch (this->unk_306) {
+ case 2:
+ case 3:
+ Animation_PlayLoop(&this->skelAnime, *D_80B958F0);
+ this->unk_31C = 0;
+ this->unk_31E = 1;
+ break;
+
+ case 4:
+ Animation_PlayLoop(&this->skelAnime, *D_80B958F8);
+ this->unk_31C = 2;
+ this->unk_31E = 1;
+ break;
+
+ case 5:
+ switch (this->unk_304) {
+ case 16:
+ Animation_PlayOnce(&this->skelAnime, *D_80B95904);
+ this->unk_304 = 17;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ break;
+
+ case 17:
+ Animation_Change(&this->skelAnime, *D_80B958DC, 0.0f, 0.0f, 0.0f, 0, 0.0f);
+ break;
+ }
+ break;
+
+ case 6:
+ Animation_PlayLoop(&this->skelAnime, *D_80B958E4);
+ this->unk_31C = 1;
+ this->unk_31E = 1;
+ break;
+
+ case 12:
+ Animation_PlayLoop(&this->skelAnime, D_80B95930);
+ break;
+
+ case 13:
+ Animation_PlayLoop(&this->skelAnime, D_80B95938);
+ break;
+
+ case 14:
+ Animation_PlayLoop(&this->skelAnime, D_80B95928);
+ break;
+
+ case 15:
+ Animation_PlayLoop(&this->skelAnime, D_80B9591C);
+ break;
+ }
+ SkelAnime_Update(&this->skelAnime);
+ }
+
+ if (func_800EE29C(globalCtx, 0x1D7)) {
+ sp3E = globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0x1D7)]->unk0;
+ func_800EDF24(&this->actor, globalCtx, func_800EE200(globalCtx, 0x1D7));
+
+ switch (this->unk_306) {
+ case 2:
+ if (globalCtx->csCtx.frames == 60) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_JUMP_SAND);
+ }
+ break;
+
+ case 8:
+ if (this->unk_322 > 4) {
+ this->unk_322 -= 4;
+ } else {
+ this->unk_322 = 0;
+ }
+
+ if (this->unk_322 > 0) {
+ func_80B93DE8(&this->unk_2F0, globalCtx, 20);
+ func_80B93DE8(&this->actor.world.pos, globalCtx, 20);
+ func_80B93DE8(&this->actor.focus.pos, globalCtx, 20);
+ }
+ break;
+
+ case 9:
+ case 10:
+ if (this->unk_322 < 150) {
+ this->unk_322 += 15;
+ } else {
+ this->unk_322 = 150;
+ }
+ break;
+
+ default:
+ this->unk_30A &= ~8;
+ break;
+ }
+
+ if (this->unk_306 != sp3E) {
+ this->unk_306 = sp3E;
+
+ switch (this->unk_306) {
+ case 1:
+ func_80B939C0(this, 7, 0);
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ break;
+
+ case 2:
+ func_80B939C0(this, 11, 2);
+ this->unk_31C = 1;
+ this->unk_31E = 0;
+ break;
+
+ case 3:
+ func_80B939C0(this, 15, 2);
+ this->unk_31C = 0;
+ this->unk_31E = 1;
+ break;
+
+ case 4:
+ func_80B939C0(this, 13, 2);
+ this->unk_31C = 2;
+ this->unk_31E = 1;
+ break;
+
+ case 5:
+ func_80B939C0(this, 16, 2);
+ this->unk_31C = 2;
+ this->unk_31E = 1;
+ break;
+
+ case 6:
+ func_80B939C0(this, 8, 2);
+ this->unk_31C = 1;
+ this->unk_31E = 0;
+ break;
+
+ case 8:
+ this->unk_322 = 0xFA;
+ this->unk_30A |= 8;
+ break;
+
+ case 9:
+ this->unk_322 = 0;
+ this->unk_30A |= 8;
+ func_80B939C0(this, 18, 0);
+ this->unk_31C = 0;
+ this->unk_31E = 0;
+ this->unk_30A &= ~2;
+ break;
+
+ case 10:
+ func_80B939C0(this, 14, 0);
+ this->unk_31C = 0;
+ this->unk_30A |= 2;
+ this->unk_31E = 1;
+ break;
+
+ case 11:
+ Animation_PlayLoop(&this->skelAnime, D_80B95920);
+ break;
+
+ case 12:
+ Animation_PlayOnce(&this->skelAnime, D_80B9592C);
+ break;
+
+ case 13:
+ Animation_PlayOnce(&this->skelAnime, D_80B95934);
+ break;
+
+ case 14:
+ this->unk_30A |= 2;
+ Animation_PlayOnce(&this->skelAnime, D_80B95924);
+ break;
+
+ case 15:
+ Animation_PlayOnce(&this->skelAnime, D_80B95918);
+ break;
+ }
+ }
+ return true;
+ }
+
+ return false;
+}
+
+void func_80B943A0(EnZog* this, GlobalContext* globalCtx) {
+ func_80B93EA0(this, globalCtx);
+}
+
+void func_80B943C0(EnZog* this, GlobalContext* globalCtx) {
+ if (!(this->unk_30A & 4)) {
+ this->actionFunc = func_80B943A0;
+ this->unk_306 = -1;
+ }
+}
+
+void func_80B943EC(EnZog* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ if (this->unk_30A & 0x10) {
+ if (!(player->stateFlags2 & 0x8000000)) {
+ this->unk_30A &= ~0x10;
+ }
+ } else if ((player->stateFlags2 & 0x8000000) && (this->actor.xzDistToPlayer < 120.0f)) {
+ this->unk_30A |= 0x10;
+ Audio_PlayActorSound2(&this->actor, NA_SE_SY_TRE_BOX_APPEAR);
+ }
+}
+
+void func_80B94470(EnZog* this, GlobalContext* globalCtx) {
+ if (func_80152498(&globalCtx->msgCtx) == 5) {
+ if (func_80147624(globalCtx) && (globalCtx->msgCtx.unk11F04 == 0x103C)) {
+ func_801477B4(globalCtx);
+ this->actionFunc = func_80B9451C;
+ this->unk_300 = this->unk_302 = 0;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ }
+ }
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B9451C(EnZog* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_300 = 2;
+ this->actionFunc = func_80B94470;
+ } else if ((globalCtx->msgCtx.unk1202A == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
+ if ((globalCtx->msgCtx.unk1202E == 7) && (gSaveContext.playerForm == PLAYER_FORM_HUMAN)) {
+ func_80B93BA8(this, 2);
+ this->actionFunc = func_80B943C0;
+ this->actor.shape.shadowDraw = NULL;
+ }
+ } else if (this->actor.xzDistToPlayer < 120.0f) {
+ func_800B8614(&this->actor, globalCtx, 150.0f);
+ }
+ func_80B943EC(this, globalCtx);
+}
+
+void func_80B9461C(EnZog* this, GlobalContext* globalCtx) {
+ if (!func_80B93EA0(this, globalCtx)) {
+ this->actor.textId = 0x103C;
+ this->actionFunc = func_80B9451C;
+ this->actor.flags |= 0x2000000;
+ gSaveContext.weekEventReg[91] |= 2;
+ }
+
+ if ((this->unk_304 == 11) && ((s32)this->skelAnime.curFrame >= 55)) {
+ this->unk_30A |= 2;
+ }
+}
+
+void func_80B946B4(EnZog* this, GlobalContext* globalCtx) {
+ func_80B93A48(this, globalCtx);
+ if (!(this->unk_30A & 4)) {
+ this->actionFunc = func_80B9461C;
+ this->unk_306 = -1;
+ }
+}
+
+void func_80B946FC(EnZog* this, GlobalContext* globalCtx) {
+ switch (func_80152498(&globalCtx->msgCtx)) {
+ case 4:
+ if (func_80147624(globalCtx)) {
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ globalCtx->msgCtx.unk11F10 = 0;
+ this->actionFunc = func_80B946B4;
+ func_80B93BA8(this, 1);
+ break;
+
+ case 1:
+ func_8019F230();
+ func_80151938(globalCtx, 0x1014);
+ break;
+ }
+ }
+ break;
+
+ case 5:
+ if (func_80147624(globalCtx)) {
+ switch (globalCtx->msgCtx.unk11F04) {
+ case 0x1008:
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 + 1);
+ break;
+
+ case 0x1009:
+ this->unk_300 = 4;
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 + 1);
+ break;
+
+ case 0x1014:
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 + 1);
+ break;
+
+ case 0x1015:
+ func_801477B4(globalCtx);
+ this->actionFunc = func_80B948A8;
+ this->unk_300 = this->unk_302 = 0;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ return;
+ }
+ }
+ break;
+ }
+
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B948A8(EnZog* this, GlobalContext* globalCtx) {
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->unk_300 = 2;
+ this->actionFunc = func_80B946FC;
+ } else if ((globalCtx->msgCtx.unk1202A == 3) && (this->actor.xzDistToPlayer < 120.0f)) {
+ if ((globalCtx->msgCtx.unk1202E == 7) && (gSaveContext.playerForm == PLAYER_FORM_HUMAN)) {
+ func_80B93BA8(this, 2);
+ this->actionFunc = func_80B943C0;
+ this->actor.shape.shadowDraw = NULL;
+ }
+ return;
+ } else {
+ if ((this->unk_302 == 2) && (this->unk_2FC == 2)) {
+ this->unk_300 = 0;
+ this->unk_2FE = 3;
+ this->unk_302 = this->unk_300;
+ this->unk_2FC = this->unk_2FE;
+ func_80B93B44(this);
+ }
+
+ if ((this->unk_302 == 0) && (this->actor.xzDistToPlayer < 120.0f)) {
+ func_800B8614(&this->actor, globalCtx, 150.0f);
+ }
+ }
+ func_80B93A48(this, globalCtx);
+ func_80B943EC(this, globalCtx);
+}
+
+void func_80B94A00(EnZog* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Vec3f sp30;
+
+ if (func_80B93BE0(this, globalCtx)) {
+ this->actionFunc = func_80B948A8;
+ this->actor.flags |= 0x2000000;
+ if (gSaveContext.weekEventReg[29] & 0x20) {
+ this->actor.textId = 0x1009;
+ } else {
+ this->actor.textId = 0x1008;
+ gSaveContext.weekEventReg[29] |= 0x20;
+ }
+ this->unk_300 = 2;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ return;
+ }
+
+ if ((this->skelAnime.curFrame >= 35.0f) ||
+ ((this->skelAnime.curFrame >= 10.0f) && (this->skelAnime.curFrame <= 24.0f))) {
+ this->actor.speedXZ = 0.0f;
+ } else {
+ this->actor.speedXZ = 1.5f;
+ }
+
+ if ((this->actor.depthInWater > 0.0f) && ((globalCtx->gameplayFrames % 8) == 0)) {
+ sp30 = this->actor.world.pos;
+ sp30.y += this->actor.depthInWater;
+ EffectSsGRipple_Spawn(globalCtx, &sp30, 150, 500, 0);
+ }
+
+ if (this->actor.shape.yOffset > 0.0f) {
+ this->actor.shape.yOffset -= 20.0f;
+ }
+
+ func_80B93A48(this, globalCtx);
+
+ if ((this->unk_304 == 4) &&
+ (Animation_OnFrame(&this->skelAnime, 136.0f) || Animation_OnFrame(&this->skelAnime, 155.0f))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_PL_WALK_WATER0);
+ }
+
+ if ((this->unk_304 == 5) &&
+ (Animation_OnFrame(&this->skelAnime, 12.0f) || Animation_OnFrame(&this->skelAnime, 37.0f))) {
+ if (this->actor.depthInWater > 0.0f) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_PL_WALK_WATER0);
+ } else {
+ Audio_PlayActorSound2(&this->actor, NA_SE_PL_WALK_SAND);
+ }
+ }
+}
+
+void func_80B94C5C(EnZog* this, GlobalContext* globalCtx) {
+ this->actor.speedXZ = 0.0f;
+ if (this->unk_304 != 0) {
+ if (this->actor.shape.yOffset > 0.0f) {
+ this->actor.shape.yOffset -= 20.0f;
+ }
+ this->actor.velocity.y = -1.0f;
+ this->actor.minVelocityY = -1.0f;
+ }
+
+ if ((this->unk_2FC == 1) && (this->unk_302 == 0)) {
+ this->unk_2FE = 2;
+ this->unk_300 = 2;
+ }
+
+ if (this->unk_304 == 5) {
+ this->actionFunc = func_80B94A00;
+ }
+
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B94D0C(EnZog* this, GlobalContext* globalCtx) {
+ func_80B93D2C(this, globalCtx);
+ this->actor.speedXZ = 0.0f;
+ if (this->unk_320 > 0) {
+ this->unk_320--;
+ this->unk_31C = 1;
+ this->unk_31E = 1;
+ } else {
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ }
+
+ if ((func_80152498(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
+ this->unk_320 = 5;
+ switch (globalCtx->msgCtx.unk11F04) {
+ case 0x1004:
+ case 0x1005:
+ case 0x1006:
+ func_80151938(globalCtx, globalCtx->msgCtx.unk11F04 + 1);
+ break;
+
+ case 0x1007:
+ func_801477B4(globalCtx);
+ this->actionFunc = func_80B94E34;
+ this->unk_300 = 5;
+ this->unk_320 = 0;
+ this->unk_31C = 2;
+ this->unk_31E = 0;
+ func_80B93B44(this);
+ break;
+ }
+ }
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B94E34(EnZog* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Player* player = GET_PLAYER(globalCtx);
+
+ func_80B93D2C(this, globalCtx);
+ func_80B93BE0(this, globalCtx);
+ if (this->actor.speedXZ < 0.1f) {
+ this->actor.speedXZ = 0.0f;
+ } else {
+ if (this->actor.speedXZ > 0.1f) {
+ WaterBox* sp44;
+ Vec3f sp38;
+
+ Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80B959AC, &sp38);
+ sp38.x += randPlusMinusPoint5Scaled(30.0f);
+ sp38.y += 20.0f;
+ sp38.z += randPlusMinusPoint5Scaled(30.0f);
+ if (WaterBox_GetSurface1(globalCtx, &globalCtx->colCtx, sp38.x, sp38.z, &sp38.y, &sp44) &&
+ (this->actor.world.pos.y < sp38.y)) {
+ EffectSsGSplash_Spawn(globalCtx, &sp38, NULL, NULL, 1,
+ Rand_ZeroFloat(this->actor.speedXZ * 40.0f) + (this->actor.speedXZ * 60.0f));
+ }
+
+ if ((player->actor.speedXZ > 3.0f) && (this->unk_324 == 0)) {
+ this->unk_324 = 25;
+ func_800B8E58(&player->actor, player->ageProperties->unk_92 + 0x6818);
+ }
+ }
+ this->actor.speedXZ *= 0.3f;
+ }
+
+ if (ABS_ALT(this->actor.yawTowardsPlayer - this->actor.world.rot.y) > 0x5000) {
+ func_800B8A1C(&this->actor, globalCtx, 0, 60.0f, 40.0f);
+ }
+
+ if (this->unk_324 > 0) {
+ this->unk_324--;
+ }
+
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->actionFunc = func_80B94D0C;
+ this->actor.speedXZ = 0.0f;
+ this->unk_300 = 2;
+ } else if (this->actor.bgCheckFlags & 1) {
+ this->actor.home.rot.z = 1;
+ this->actionFunc = func_80B94C5C;
+ this->actor.speedXZ = 0.0f;
+ this->unk_2FE = 1;
+ this->actor.velocity.y = 0.0f;
+ this->actor.minVelocityY = 0.0f;
+ this->actor.gravity = 0.0f;
+ this->unk_31C = 1;
+ this->unk_31E = 0;
+ func_80B93BA8(this, 0);
+ gSaveContext.weekEventReg[88] |= 0x10;
+ } else if ((this->actor.yawTowardsPlayer > 16000) && (this->actor.yawTowardsPlayer < 32000) &&
+ (this->unk_302 == 0)) {
+ func_800B8614(&this->actor, globalCtx, 150.0f);
+ }
+
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B95128(EnZog* this, GlobalContext* globalCtx) {
+ func_80B93D2C(this, globalCtx);
+ func_80B93BE0(this, globalCtx);
+
+ if (func_800B84D0(&this->actor, globalCtx)) {
+ this->actionFunc = func_80B94D0C;
+ this->unk_300 = 2;
+ this->actor.speedXZ = 0.0f;
+
+ switch (CURRENT_DAY) {
+ case 1:
+ func_80B93BA8(this, 4);
+ break;
+
+ case 2:
+ func_80B93BA8(this, 5);
+ break;
+
+ default:
+ func_80B93BA8(this, 6);
+ break;
+ }
+
+ this->actor.flags &= ~0x10000;
+ gSaveContext.weekEventReg[91] |= 1;
+ } else {
+ func_800B8614(&this->actor, globalCtx, 150.0f);
+ }
+ this->actor.shape.rot.y = this->actor.world.rot.y;
+ func_80B93A48(this, globalCtx);
+}
+
+void func_80B95240(EnZog* this, GlobalContext* globalCtx) {
+ func_80B93EA0(this, globalCtx);
+}
+
+void EnZog_Update(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ EnZog* this = THIS;
+
+ Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
+ Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 10.0f, 10.0f, 10.0f, 5);
+ if (func_800EE29C(globalCtx, 0x1D7) && (ENZOG_GET_F(&this->actor) != ENZOG_F_2)) {
+ this->actionFunc = func_80B9461C;
+ this->actor.shape.yOffset = 0.0f;
+ }
+
+ this->actionFunc(this, globalCtx);
+
+ if (((this->unk_304 == 6) && Animation_OnFrame(&this->skelAnime, 43.0f)) ||
+ ((this->unk_304 == 17) && Animation_OnFrame(&this->skelAnime, 14.0f))) {
+ Audio_PlayActorSound2(&this->actor, NA_SE_EV_LAND_SAND);
+ }
+
+ if (this->unk_30A & 1) {
+ this->collider.dim.pos.x = this->unk_2F0.x;
+ this->collider.dim.pos.y = this->actor.world.pos.y;
+ this->collider.dim.pos.z = this->unk_2F0.z;
+ } else {
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ }
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+
+ this->actor.focus.pos = this->actor.world.pos;
+ this->actor.focus.pos.y += 30.0f;
+
+ if (this->unk_30A & 4) {
+ if (this->unk_31A == -1) {
+ this->unk_30A &= ~4;
+ } else if (this->unk_30C[this->unk_31A] == -1) {
+ this->unk_30A &= ~4;
+ } else if (ActorCutscene_GetCurrentIndex() == 0x7C) {
+ ActorCutscene_Stop(0x7C);
+ ActorCutscene_SetIntentToPlay(this->unk_30C[this->unk_31A]);
+ } else if (ActorCutscene_GetCanPlayNext(this->unk_30C[this->unk_31A])) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->unk_30C[this->unk_31A], &this->actor);
+ this->unk_30A &= ~4;
+ } else {
+ ActorCutscene_SetIntentToPlay(this->unk_30C[this->unk_31A]);
+ }
+ }
+}
+
+void func_80B954C4(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ static Vec3f D_80B959B8 = { 0.0f, 0.0f, 0.0f };
+ EnZog* this = THIS;
+
+ D_80B959B8.y = 1000.0f;
+ if (limbIndex == 9) {
+ Matrix_MultiplyVector3fByState(&D_80B959B8, &this->actor.focus.pos);
+ }
+ D_80B959B8.y = 0.0f;
+
+ if (limbIndex == 1) {
+ Matrix_MultiplyVector3fByState(&D_80B959B8, &this->unk_2F0);
+ }
+
+ if ((this->unk_30A & 2) && (limbIndex == 17)) {
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ gSPDisplayList(POLY_OPA_DISP++, object_zog_DL_0280A8);
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ }
+}
+
+void func_80B95598(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
+ static Vec3f D_80B959C4 = { 0.0f, 0.0f, 0.0f };
+ EnZog* this = THIS;
+
+ D_80B959C4.y = 1000.0f;
+ if (limbIndex == 9) {
+ Matrix_MultiplyVector3fByState(&D_80B959C4, &this->actor.focus.pos);
+ }
+ D_80B959C4.y = 0.0f;
+
+ if (limbIndex == 1) {
+ Matrix_MultiplyVector3fByState(&D_80B959C4, &this->unk_2F0);
+ }
+
+ if ((this->unk_30A & 2) && (limbIndex == 17)) {
+ gSPDisplayList((*gfx)++, object_zog_DL_0280A8);
+ }
+}
+
+void EnZog_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ EnZog* this = THIS;
+ Gfx* gfx;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ if (this->unk_30A & 8) {
+ if (this->unk_322 > 128) {
+ gfx = POLY_XLU_DISP++;
+ func_8012C2B4(gfx);
+ Scene_SetRenderModeXlu(globalCtx, 2, 2);
+ } else {
+ gfx = POLY_XLU_DISP++;
+ func_8012C304(gfx);
+ Scene_SetRenderModeXlu(globalCtx, 1, 2);
+ }
+
+ gfx = POLY_XLU_DISP;
+
+ gSPSegment(&gfx[0], 0x08, Lib_SegmentedToVirtual(D_80B958AC[this->unk_31C]));
+ gSPSegment(&gfx[1], 0x09, Lib_SegmentedToVirtual(D_80B958B8[this->unk_31E]));
+ gDPSetEnvColor(&gfx[2], 0, 0, 0, this->unk_322);
+
+ POLY_XLU_DISP = &gfx[3];
+ POLY_XLU_DISP =
+ SkelAnime_DrawFlex(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ this->skelAnime.dListCount, NULL, func_80B95598, &this->actor, POLY_XLU_DISP);
+ } else {
+ func_8012C28C(globalCtx->state.gfxCtx);
+ Scene_SetRenderModeXlu(globalCtx, 0, 1);
+
+ gfx = POLY_OPA_DISP;
+
+ gSPSegment(&gfx[0], 0x08, Lib_SegmentedToVirtual(D_80B958AC[this->unk_31C]));
+ gSPSegment(&gfx[1], 0x09, Lib_SegmentedToVirtual(D_80B958B8[this->unk_31E]));
+ gDPSetEnvColor(&gfx[2], 0, 0, 0, 255);
+
+ POLY_OPA_DISP = &gfx[3];
+ SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ this->skelAnime.dListCount, NULL, func_80B954C4, &this->actor);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.h b/src/overlays/actors/ovl_En_Zog/z_en_zog.h
index 48600b3f76..7dba946d58 100644
--- a/src/overlays/actors/ovl_En_Zog/z_en_zog.h
+++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.h
@@ -7,10 +7,37 @@ struct EnZog;
typedef void (*EnZogActionFunc)(struct EnZog*, GlobalContext*);
+#define ENZOG_GET_F(thisx) ((thisx)->params & 0xF)
+#define ENZOG_GET_FC00(thisx) (((thisx)->params & 0xFC00) >> 0xA)
+
+#define ENZOG_F_2 2
+#define ENZOG_FC00_63 63
+
typedef struct EnZog {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x1E4];
- /* 0x0328 */ EnZogActionFunc actionFunc;
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ ColliderCylinder collider;
+ /* 0x190 */ SkelAnime skelAnime;
+ /* 0x1D4 */ Vec3s jointTable[23];
+ /* 0x25E */ Vec3s morphTable[23];
+ /* 0x2E8 */ Path* unk_2E8;
+ /* 0x2EC */ s32 unk_2EC;
+ /* 0x2F0 */ Vec3f unk_2F0;
+ /* 0x2FC */ s16 unk_2FC;
+ /* 0x2FE */ s16 unk_2FE;
+ /* 0x300 */ s16 unk_300;
+ /* 0x302 */ s16 unk_302;
+ /* 0x304 */ s16 unk_304;
+ /* 0x306 */ s16 unk_306;
+ /* 0x308 */ s16 unk_308;
+ /* 0x30A */ u16 unk_30A;
+ /* 0x30C */ s16 unk_30C[7];
+ /* 0x31A */ s16 unk_31A;
+ /* 0x31C */ s16 unk_31C;
+ /* 0x31E */ s16 unk_31E;
+ /* 0x320 */ s16 unk_320;
+ /* 0x322 */ s16 unk_322;
+ /* 0x324 */ s16 unk_324;
+ /* 0x328 */ EnZogActionFunc actionFunc;
} EnZog; // size = 0x32C
extern const ActorInit En_Zog_InitVars;
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 a3073a7e0e..acef9d1ab6 100644
--- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
+++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_aqua.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000010
@@ -66,8 +67,6 @@ Vec3f D_80ACC308 = { 1.0f / 1000.0f, 7.0f / 10000.0f, 1.0f / 1000.0f };
Vec3f D_80ACC314 = { 8.6f / 1000.0f, 8.0f / 10000.0f, 8.6f / 1000.0f };
Vec3f D_80ACC320 = { 1.0f / 100.0f, 2.6f / 1000.0f, 1.0f / 100.0f };
-extern Gfx D_0407D590[];
-
void func_80ACB6A0(ObjAqua* this, GlobalContext* globalCtx) {
s32 pad;
Vec3f sp58;
@@ -115,7 +114,7 @@ void func_80ACB940(ObjAqua* this, GlobalContext* globalCtx) {
effectPos.x = this->actor.world.pos.x + (effectVel.x * 40.0f);
effectPos.y = this->actor.world.pos.y;
effectPos.z = this->actor.world.pos.z + (effectVel.z * 40.0f);
- EffectSsIceSmoke_Spawn(globalCtx, &effectPos, &effectVel, &D_801D15B0, (s32)(Rand_ZeroOne() * 24.0f) + 70);
+ EffectSsIceSmoke_Spawn(globalCtx, &effectPos, &effectVel, &gZeroVec3f, (s32)(Rand_ZeroOne() * 24.0f) + 70);
}
void func_80ACBA10(ObjAqua* this) {
@@ -292,6 +291,6 @@ void ObjAqua_Draw(Actor* thisx, GlobalContext* globalCtx) {
}
Matrix_RotateY(yaw, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_0407D590);
+ gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
index 22a38fef1e..5c6f1a64ae 100644
--- a/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
+++ b/src/overlays/actors/ovl_Obj_Hakaisi/z_obj_hakaisi.h
@@ -11,7 +11,9 @@ typedef struct ObjHakaisi {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x18];
/* 0x015C */ ObjHakaisiActionFunc actionFunc;
- /* 0x0160 */ char unk_160[0x40];
+ /* 0x0160 */ char unk_160[0x38];
+ /* 0x0198 */ s16 unk_198;
+ /* 0x019A */ char unk_19A[0x6];
} ObjHakaisi; // size = 0x1A0
extern const ActorInit Obj_Hakaisi_InitVars;
diff --git a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
index cca1b99224..d7001bed0f 100644
--- a/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
+++ b/src/overlays/actors/ovl_Obj_HsStump/z_obj_hsstump.c
@@ -116,7 +116,7 @@ void ObjHsStump_Appear(ObjHsStump* this, GlobalContext* globalCtx) {
offsetAngle = i * angleBinary;
Lib_Vec3f_TranslateAndRotateY(&this->dyna.actor.world.pos, offsetAngle, &iceSmokePosOffset,
&iceSmokePos);
- Lib_Vec3f_TranslateAndRotateY(&D_801D15B0, offsetAngle, &iceSmokeVelOffset, &iceSmokeVel);
+ Lib_Vec3f_TranslateAndRotateY(&gZeroVec3f, offsetAngle, &iceSmokeVelOffset, &iceSmokeVel);
EffectSsIceSmoke_Spawn(globalCtx, &iceSmokePos, &iceSmokeVel, &iceSmokeAccel, 100);
}
}
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 bbeb4da26a..f623ca4f88 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_iceblock.h"
+#include "objects/object_ice_block/object_ice_block.h"
#define FLAGS 0x00000010
@@ -15,7 +16,35 @@ void ObjIceblock_Destroy(Actor* thisx, GlobalContext* globalCtx);
void ObjIceblock_Update(Actor* thisx, GlobalContext* globalCtx);
void ObjIceblock_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
+void func_80A257A0(ObjIceblock* this);
+void func_80A257B4(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25824(ObjIceblock* this);
+void func_80A2586C(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25978(ObjIceblock* this);
+void func_80A25994(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25A8C(ObjIceblock* this);
+void func_80A25AA8(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25BA0(ObjIceblock* this);
+void func_80A25BBC(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25C5C(ObjIceblock* this);
+void func_80A25C70(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25CF4(ObjIceblock* this);
+void func_80A25D28(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25E3C(ObjIceblock* this);
+void func_80A25E50(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A25FA0(ObjIceblock* this);
+void func_80A25FD4(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A260E8(ObjIceblock* this);
+void func_80A26144(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A262BC(ObjIceblock* this);
+void func_80A262EC(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A26574(ObjIceblock* this);
+void func_80A265C0(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A266E0(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A26B64(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A26B74(ObjIceblock* this, GlobalContext* globalCtx);
+void func_80A26BF8(ObjIceblock* this, GlobalContext* globalCtx);
+
const ActorInit Obj_Iceblock_InitVars = {
ACTOR_OBJ_ICEBLOCK,
ACTORCAT_BG,
@@ -28,158 +57,1501 @@ const ActorInit Obj_Iceblock_InitVars = {
(ActorFunc)ObjIceblock_Draw,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80A26E50 = {
- { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_NO_PUSH | OC1_TYPE_PLAYER, OC2_TYPE_2, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00000800, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_NONE,
+ AT_NONE,
+ AC_ON | AC_TYPE_PLAYER,
+ OC1_ON | OC1_NO_PUSH | OC1_TYPE_PLAYER,
+ OC2_TYPE_2,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK0,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000800, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_ON,
+ OCELEM_ON,
+ },
{ 44, 62, -31, { 0, 0, 0 } },
};
-// static InitChainEntry sInitChain[] = {
-static InitChainEntry D_80A26FA4[] = {
- ICHAIN_F32_DIV1000(speedXZ, 16000, ICHAIN_CONTINUE),
- ICHAIN_F32_DIV1000(gravity, -1800, ICHAIN_CONTINUE),
- ICHAIN_F32_DIV1000(minVelocityY, -26000, ICHAIN_CONTINUE),
- ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
- ICHAIN_F32(uncullZoneScale, 150, ICHAIN_CONTINUE),
+static AnimatedMaterial* D_80A26E7C = NULL;
+
+s16 func_80A23090(s16 arg0, s16 arg1, s16 arg2) {
+ if (arg0 >= 0) {
+ if (arg2 < arg0) {
+ return arg2;
+ } else if (arg0 < arg1) {
+ return arg1;
+ }
+ } else if (arg0 < -arg2) {
+ return -arg2;
+ } else if (-arg1 < arg0) {
+ return -arg1;
+ }
+
+ return arg0;
+}
+
+void func_80A2311C(Vec3f* arg0, Vec3f* arg1, s16 arg2) {
+ f32 sp1C = Math_SinS(arg2);
+ f32 sp18 = Math_CosS(arg2);
+
+ arg0->x = (arg1->z * sp1C) + (arg1->x * sp18);
+ arg0->y = arg1->y;
+ arg0->z = (arg1->z * sp18) - (arg1->x * sp1C);
+}
+
+void func_80A2319C(ObjIceblock* this, f32 arg1) {
+ s32 i;
+ s16 temp_s1 = (u32)Rand_Next() >> 0x10;
+ s16 temp_s2 = (u32)Rand_Next() >> 0x10;
+ ObjIceBlockUnkStruct* ptr;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_1B4); i++) {
+ ptr = &this->unk_1B4[i];
+ temp_s1 += Rand_S16Offset(2700, 10000);
+ temp_s2 += Rand_S16Offset(2700, 10000);
+ ptr->unk_00 = temp_s1;
+ ptr->unk_02 = temp_s2;
+ ptr->unk_04 = ((Rand_ZeroOne() * 0.2f) + 0.9f) * arg1;
+ ptr->unk_08 = ((Rand_ZeroOne() * 0.2f) + 0.9f) * arg1;
+ ptr->unk_0C = ((Rand_ZeroOne() * 0.2f) + 0.9f) * arg1;
+ }
+}
+
+void func_80A232C4(ObjIceblock* this, s32 arg1) {
+ static s16 D_80A26E80[] = { 1, -1, 0, 0 };
+ static s16 D_80A26E88[] = { 0, 0, 1, -1 };
+
+ this->unk_276 += D_80A26E80[arg1];
+ this->unk_278 += D_80A26E88[arg1];
+
+ if ((arg1 == 0) || (arg1 == 1)) {
+ this->unk_264 = &this->dyna.actor.world.pos.x;
+ this->unk_268 = this->dyna.actor.home.pos.x + (this->unk_276 * 60);
+ } else {
+ this->unk_264 = &this->dyna.actor.world.pos.z;
+ this->unk_268 = this->dyna.actor.home.pos.z + (this->unk_278 * 60);
+ }
+ this->unk_26C = arg1;
+}
+
+void func_80A23370(ObjIceblock* this, s32 arg1) {
+ if ((arg1 == 0) || (arg1 == 1)) {
+ this->unk_264 = &this->dyna.actor.world.pos.x;
+ } else {
+ this->unk_264 = &this->dyna.actor.world.pos.z;
+ }
+ this->unk_26C = arg1;
+}
+
+void func_80A2339C(GlobalContext* globalCtx, Vec3f* arg1, f32 arg2, f32 arg3, s32 arg4) {
+ Vec3f spBC;
+ Vec3f spB0;
+ Vec3f spA4;
+ f32 temp_f20;
+ f32 temp_f22;
+ f32 temp_f24;
+ s32 i;
+ f32 sp88;
+ s16 temp_s4;
+ s16 phi_s0;
+ s16 temp;
+
+ spA4.z = 0.0f;
+ spA4.x = 0.0f;
+ temp_f24 = ((Rand_ZeroOne() * 0.1656f) + 0.3312f) * arg3;
+ sp88 = 10.0f * arg3;
+
+ for (i = 0, phi_s0 = 0; i < arg4; i++, phi_s0 += temp) {
+ temp = 0x10000 / arg4;
+
+ temp_f20 = ((Rand_ZeroOne() * 0.4f) + 0.6f) * (arg2 * 3.5f);
+ temp_s4 = temp_f20 * 100.0f;
+ temp_f22 = ((Rand_ZeroOne() * 0.7f) + 0.3f) * arg2 * 300.0f;
+
+ spBC.x = Math_SinS(Rand_S16Offset(phi_s0, temp)) * temp_f22;
+ spBC.y = (Rand_ZeroOne() - 0.5f) * (600.0f * arg2);
+ spBC.z = Math_CosS(Rand_S16Offset(phi_s0, temp)) * temp_f22;
+
+ spB0.x = spBC.x * temp_f24;
+ spB0.y = ((Rand_ZeroOne() * 1.2f) + 0.3f + (temp_f20 * 4.0f)) * sp88;
+ spB0.z = spBC.z * temp_f24;
+
+ spBC.x += arg1->x;
+ spBC.y += arg1->y;
+ spBC.z += arg1->z;
+
+ spA4.y = -0.8f - (temp_f20 * 18.0f);
+
+ EffectSsIceBlock_Spawn(globalCtx, &spBC, &spB0, &spA4, temp_s4);
+ }
+}
+
+void func_80A23690(ObjIceblock* this) {
+ this->dyna.actor.velocity.y += this->dyna.actor.gravity;
+ if (this->dyna.actor.velocity.y < this->dyna.actor.minVelocityY) {
+ this->dyna.actor.velocity.y = this->dyna.actor.minVelocityY;
+ }
+ this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y;
+}
+
+s32 func_80A236D4(ObjIceblock* this, Vec3f* arg1) {
+ f32 sp2C;
+ f32 sp28;
+ s16 sp26;
+ s32 sp20;
+
+ sp26 = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, arg1);
+ sp2C = Math_SinS(sp26) * this->dyna.actor.speedXZ;
+ sp2C = fabsf(sp2C) + 0.01f;
+
+ sp28 = Math_CosS(sp26) * this->dyna.actor.speedXZ;
+ sp28 = fabsf(sp28) + 0.01f;
+
+ sp20 = Math_StepToF(&this->dyna.actor.world.pos.x, arg1->x, sp2C);
+ sp20 &= 1;
+ sp20 &= Math_StepToF(&this->dyna.actor.world.pos.z, arg1->z, sp28);
+ return sp20;
+}
+
+void func_80A237A4(ObjIceblock* this) {
+ s32 pad[2];
+ ObjIceBlockUnkStruct4* ptr = &this->unk_27C;
+ f32 sp20;
+
+ ptr->unk_10 += ptr->unk_0C;
+ ptr->unk_12 += ptr->unk_0E;
+ Math_StepToF(&this->unk_27C.unk_08, this->unk_27C.unk_04, 0.08f);
+
+ if (this->unk_1B0 & 0x20) {
+ Math_StepToF(&ptr->unk_00, -5.0f, (Math_CosS(fabsf(ptr->unk_00) * 3276.8f) * 0.3f) + 0.02f);
+ } else {
+ Math_StepToF(&ptr->unk_00, 0.0f, (Math_SinS(fabsf(ptr->unk_00) * 3276.8f) * 0.3f) + 0.02f);
+ }
+
+ sp20 = Math_SinS(ptr->unk_10);
+ this->dyna.actor.world.pos.y =
+ (Math_SinS(ptr->unk_12) * ptr->unk_08 * 0.5f) +
+ ((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;
+
+ 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);
+ } else {
+ ObjIceBlockUnkStruct4* ptr = &this->unk_27C;
+ f32 phi_f0;
+ s16 temp;
+
+ if (this->unk_1B0 & 0x20) {
+ phi_f0 = 0.3f;
+ ptr->unk_14 = this->dyna.actor.yawTowardsPlayer;
+ } else {
+ phi_f0 = 0.08f;
+ }
+
+ Math_StepToF(&ptr->unk_1C, phi_f0, 0.04f);
+ ptr->unk_22 += (s16)(ptr->unk_20 * -0.02f);
+ ptr->unk_22 = func_80A23090(ptr->unk_22, 50, 800);
+ ptr->unk_20 += ptr->unk_22;
+
+ 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 = 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);
+
+ 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);
+ }
+}
+
+void func_80A23B88(ObjIceblock* this) {
+ f32 f4;
+ f32 f2;
+ f32 f14;
+ f32 f16;
+ f32 f6;
+
+ f14 = this->dyna.actor.world.pos.x - this->dyna.actor.home.pos.x;
+ f2 = (f14 >= 0.0f) ? (0.5f) : (-0.5f);
+ f4 = (((s32)(f2 + f14)) / 30) * 30;
+ f14 -= f4;
+ if (fabsf(f14) < 3.0f) {
+ this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x + f4;
+ }
+
+ f16 = this->dyna.actor.world.pos.z - this->dyna.actor.home.pos.z;
+ f2 = (f16 >= 0.0f) ? (0.5f) : (-0.5f);
+ f6 = (((s32)(f2 + f16)) / 30) * 30;
+ f16 -= f6;
+ if (fabsf(f16) < 3.0f) {
+ this->dyna.actor.world.pos.z = this->dyna.actor.home.pos.z + f6;
+ }
+}
+
+s32 func_80A23D08(ObjIceblock* this, GlobalContext* globalCtx) {
+ static ObjIceBlockUnkStruct3 D_80A26E90[] = {
+ { -300.0f, 300.0f }, { 300.0f, 300.0f }, { -300.0f, -300.0f }, { 300.0f, -300.0f }, { 0.0f, 0.0f },
+ };
+ static ObjIceBlockUnkStruct3 D_80A26EB8[] = {
+ { 0.5f, -0.5f }, { -0.5f, -0.5f }, { 0.5f, 0.5f }, { -0.5f, 0.5f }, { 0.0f, 0.0f },
+ };
+ s32 pad3;
+ ObjIceBlockUnkStruct2* ptr;
+ WaterBox* spC4;
+ s32 i;
+ s32 spBC;
+ s32 spB8;
+ s32 pad;
+ f32 phi_f20;
+ Vec3f spA4;
+ Vec3f sp98;
+ s32 sp94 = 0;
+ f32 phi_f22;
+
+ sp98.y = this->dyna.actor.world.pos.y + 40.0f;
+ spBC = spB8 = -1;
+ phi_f20 = BGCHECK_Y_MIN;
+ phi_f22 = BGCHECK_Y_MIN;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_1F4); i++) {
+ ptr = &this->unk_1F4[i];
+
+ ptr->unk_00 = NULL;
+ ptr->unk_04 = BGCHECK_Y_MIN;
+ ptr->unk_08 = 50;
+
+ sp98.x = (D_80A26E90[i].unk_00 * this->dyna.actor.scale.x) + D_80A26EB8[i].unk_00;
+ sp98.z = (D_80A26E90[i].unk_04 * this->dyna.actor.scale.z) + D_80A26EB8[i].unk_04;
+
+ func_80A2311C(&spA4, &sp98, this->dyna.actor.shape.rot.y);
+ spA4.x += this->dyna.actor.world.pos.x;
+ spA4.z += this->dyna.actor.world.pos.z;
+
+ ptr->unk_04 =
+ BgCheck_EntityRaycastFloor6(&globalCtx->colCtx, &ptr->unk_00, &ptr->unk_08, &this->dyna.actor, &spA4, 0.0f);
+ if (ptr->unk_04 > BGCHECK_Y_MIN + 1) {
+ sp94 = 1;
+ if (phi_f22 < ptr->unk_04) {
+ spBC = i;
+ phi_f22 = ptr->unk_04;
+ }
+ }
+
+ if (WaterBox_GetSurface1_2(globalCtx, &globalCtx->colCtx, spA4.x, spA4.z, &ptr->unk_0C, &spC4)) {
+ if (phi_f20 < ptr->unk_0C) {
+ spB8 = i;
+ phi_f20 = ptr->unk_0C;
+ }
+ } else {
+ ptr->unk_0C = BGCHECK_Y_MIN;
+ }
+ }
+
+ if (spBC >= 0) {
+ this->dyna.actor.floorPoly = this->unk_1F4[spBC].unk_00;
+ this->dyna.actor.floorHeight = this->unk_1F4[spBC].unk_04;
+ this->dyna.actor.floorBgId = this->unk_1F4[spBC].unk_08;
+ } else {
+ this->dyna.actor.floorPoly = NULL;
+ this->dyna.actor.floorHeight = BGCHECK_Y_MIN;
+ this->dyna.actor.floorBgId = BGCHECK_SCENE;
+ }
+
+ if (spB8 >= 0) {
+ this->unk_244 = this->unk_1F4[spB8].unk_0C;
+ } else {
+ this->unk_244 = BGCHECK_Y_MIN;
+ }
+
+ return sp94;
+}
+
+s32 func_80A23F90(ObjIceblock* this, GlobalContext* globalCtx) {
+ this->unk_1B0 &= ~4;
+
+ if (func_80A23D08(this, globalCtx)) {
+ f32 phi_f2 = BGCHECK_Y_MIN;
+ s32 ret = false;
+ s32 i;
+ ObjIceBlockUnkStruct2* ptr;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_1F4); i++) {
+ ptr = &this->unk_1F4[i];
+ if (((this->dyna.actor.world.pos.y - 10.0f) < ptr->unk_04) && (phi_f2 < ptr->unk_04)) {
+ phi_f2 = ptr->unk_04;
+ ret = true;
+ }
+ }
+
+ if (ret) {
+ this->dyna.actor.world.pos.y = phi_f2;
+ this->unk_1B0 |= 4;
+ this->dyna.actor.velocity.y = 0.0f;
+ }
+ return ret;
+ }
+ return false;
+}
+
+s32 func_80A24118(ObjIceblock* this, GlobalContext* globalCtx, f32 arg2, Vec3f* arg3) {
+ static ObjIceBlockUnkStruct3 D_80A26EE0[] = {
+ { -300.0f, -300.0f }, { 300.0f, -300.0f }, { -300.0f, 600.0f }, { 300.0f, 600.0f }, { 0.0f, 0.0f },
+ };
+ static ObjIceBlockUnkStruct3 D_80A26F08[] = {
+ { 1.0f, 1.0f }, { -1.0f, 1.0f }, { 1.0f, -1.0f }, { -1.0f, -1.0f }, { 0.0f, 0.0f },
+ };
+ f32 temp_f20;
+ f32 spF0;
+ f32 spEC;
+ f32 phi_f20;
+ Vec3f spDC;
+ Vec3f spD0;
+ Vec3f spC4;
+ Vec3f spB8;
+ s32 pad[2];
+ s32 spAC;
+ CollisionPoly* spA8;
+ s32 ret;
+ s32 i;
+ s16 sp9E;
+ f32 temp_f24;
+ f32 temp_f26;
+
+ sp9E = this->dyna.yRotation;
+ if (this->dyna.pushForce < 0.0f) {
+ sp9E -= 0x8000;
+ }
+
+ spF0 = Math_SinS(sp9E);
+ spEC = Math_CosS(sp9E);
+ temp_f20 = Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) +
+ (300.0f * this->dyna.actor.scale.z) + arg2;
+ temp_f24 = temp_f20 * spF0;
+ temp_f26 = temp_f20 * spEC;
+ ret = false;
+ phi_f20 = FLT_MAX;
+
+ for (i = 0; i < ARRAY_COUNT(D_80A26EE0); i++) {
+ spC4.x = (D_80A26EE0[i].unk_00 * this->dyna.actor.scale.x) + D_80A26F08[i].unk_00;
+ spC4.y = (D_80A26EE0[i].unk_04 * this->dyna.actor.scale.y) + D_80A26F08[i].unk_04 +
+ (this->dyna.actor.shape.yOffset * this->dyna.actor.scale.y);
+ spC4.z = 0.0f;
+
+ func_80A2311C(&spDC, &spC4, sp9E);
+
+ spDC.x += this->dyna.actor.prevPos.x;
+ spDC.y += this->dyna.actor.prevPos.y;
+ spDC.z += this->dyna.actor.prevPos.z;
+
+ spD0.x = temp_f24 + spDC.x;
+ spD0.y = spDC.y;
+ spD0.z = temp_f26 + spDC.z;
+
+ if (BgCheck_EntityLineTest3(&globalCtx->colCtx, &spDC, &spD0, &spB8, &spA8, 1, 0, 0, 1, &spAC,
+ &this->dyna.actor, 0.0f)) {
+ temp_f20 = Math3D_Vec3fDistSq(&spDC, &spB8);
+ if (temp_f20 < phi_f20) {
+ phi_f20 = temp_f20;
+ ret = true;
+ Math_Vec3f_Diff(&spB8, &spD0, arg3);
+ }
+ }
+ }
+ return ret;
+}
+
+s32 func_80A24384(ObjIceblock* this, GlobalContext* globalCtx) {
+ Vec3f sp1C;
+
+ if (func_80A24118(this, globalCtx, 0.0f, &sp1C)) {
+ this->dyna.actor.world.pos.x += sp1C.x;
+ this->dyna.actor.world.pos.z += sp1C.z;
+ return true;
+ }
+ return false;
+}
+
+s32 func_80A243E0(ObjIceblock* this, GlobalContext* globalCtx, Vec3f* arg0) {
+ static f32 D_80A26F30[] = { -300.0f, 300.0f };
+ static f32 D_80A26F38[] = { 1.0f, -1.0f };
+ s32 i;
+ f32 sp100;
+ f32 spFC;
+ f32 phi_f22;
+ Vec3f spEC;
+ Vec3f spE0;
+ Vec3f spD4;
+ Vec3f spC8;
+ s16 temp_s6;
+ f32 temp_f28;
+ s32 spBC;
+ CollisionPoly* spB8;
+ s32 ret;
+ f32 temp_f30;
+ f32 temp_f0;
+ f32 temp_f12;
+
+ temp_s6 = this->dyna.yRotation;
+ if (this->dyna.pushForce < 0.0f) {
+ temp_s6 -= 0x8000;
+ }
+
+ sp100 = Math_SinS(temp_s6);
+ spFC = Math_CosS(temp_s6);
+
+ temp_f0 = ((Math3D_Distance(&this->dyna.actor.world.pos, &this->dyna.actor.prevPos) +
+ (300.0f * this->dyna.actor.scale.z)) +
+ 2.0f);
+ temp_f12 = -temp_f0;
+ ret = false;
+ temp_f28 = temp_f12 * sp100;
+ temp_f30 = temp_f12 * spFC;
+ phi_f22 = FLT_MAX;
+
+ for (i = 0; i < ARRAY_COUNT(D_80A26F30); i++) {
+ spD4.x = (D_80A26F30[i] * this->dyna.actor.scale.x) + D_80A26F38[i];
+ spD4.y = -10.0f;
+ spD4.z = 0.0f;
+
+ func_80A2311C(&spEC, &spD4, temp_s6);
+
+ spEC.x += this->dyna.actor.world.pos.x;
+ spEC.y += this->dyna.actor.world.pos.y;
+ spEC.z += this->dyna.actor.world.pos.z;
+
+ spE0.x = temp_f28 + spEC.x;
+ spE0.y = spEC.y;
+ spE0.z = temp_f30 + spEC.z;
+
+ if (BgCheck_EntityLineTest3(&globalCtx->colCtx, &spEC, &spE0, &spC8, &spB8, 1, 0, 0, 1, &spBC,
+ &this->dyna.actor, 0.0f)) {
+ temp_f12 = Math3D_Vec3fDistSq(&spEC, &spC8);
+ if (temp_f12 < phi_f22) {
+ phi_f22 = temp_f12;
+ ret = true;
+ arg0->x = (spC8.x - spEC.x) + (300.0f * this->dyna.actor.scale.z * sp100);
+ arg0->y = 0.0f;
+ arg0->z = (spC8.z - spEC.z) + (300.0f * this->dyna.actor.scale.z * spFC);
+ }
+ }
+ }
+ return ret;
+}
+
+s32 func_80A24680(ObjIceblock* this, GlobalContext* globalCtx) {
+ Vec3f sp1C;
+
+ if (func_80A243E0(this, globalCtx, &sp1C)) {
+ this->dyna.actor.world.pos.x += sp1C.x;
+ this->dyna.actor.world.pos.z += sp1C.z;
+ return true;
+ }
+ return false;
+}
+
+s32 func_80A246D8(ObjIceblock* this, GlobalContext* globalCtx, Vec3f* arg2) {
+ static ObjIceBlockUnkStruct3 D_80A26F40[] = {
+ { -300.0f, -300.0f }, { 300.0f, -300.0f }, { -300.0f, 600.0f }, { 300.0f, 600.0f }, { 0.0f, 0.0f },
+ };
+ static ObjIceBlockUnkStruct3 D_80A26F68[] = {
+ { 1.0f, 1.0f }, { -1.0f, 1.0f }, { 1.0f, -1.0f }, { -1.0f, -1.0f }, { 0.0f, 0.0f },
+ };
+ s32 pad;
+ s32 i;
+ s32 j;
+ Vec3f spC0;
+ Vec3f spB4;
+ Vec3f spA8;
+ Vec3f sp9C;
+ s32 sp98;
+ CollisionPoly* sp94;
+ ObjIceblock* temp_v0;
+ f32 temp_f20 = (this->dyna.actor.scale.z * 300.0f) + 2.0f;
+ s16 phi_s3;
+ s32 ret = false;
+
+ for (i = 0, phi_s3 = 0; i < 4; i++, phi_s3 += 0x4000) {
+ for (j = 0; j < ARRAY_COUNT(D_80A26F40); j++) {
+ spA8.x = (D_80A26F40[j].unk_00 * this->dyna.actor.scale.x) + D_80A26F68[j].unk_00;
+ spA8.y = ((D_80A26F40[j].unk_04 * this->dyna.actor.scale.y) + D_80A26F68[j].unk_04) +
+ (this->dyna.actor.shape.yOffset * this->dyna.actor.scale.y);
+ spA8.z = 0.0f;
+
+ func_80A2311C(&spC0, &spA8, phi_s3);
+
+ spC0.x += arg2->x;
+ spC0.y += arg2->y;
+ spC0.z += arg2->z;
+
+ spB4.x = (Math_SinS(phi_s3) * temp_f20) + spC0.x;
+ spB4.y = spC0.y;
+ spB4.z = (Math_CosS(phi_s3) * temp_f20) + spC0.z;
+
+ if (BgCheck_EntityLineTest3(&globalCtx->colCtx, &spC0, &spB4, &sp9C, &sp94, 1, 0, 0, 1, &sp98,
+ &this->dyna.actor, 0.0f)) {
+ ret = true;
+ temp_v0 = (ObjIceblock*)DynaPoly_GetActor(&globalCtx->colCtx, sp98);
+ if ((temp_v0 != NULL) && (temp_v0->dyna.actor.id == ACTOR_OBJ_ICEBLOCK) && (temp_v0->unk_2B0 == 3)) {
+ temp_v0->unk_1B0 |= 0x80;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+void func_80A2491C(ObjIceblock* this) {
+ Math_Vec3f_Copy(&this->dyna.actor.home.pos, &this->dyna.actor.world.pos);
+ this->unk_278 = 0;
+ this->unk_276 = this->unk_278;
+}
+
+s32 func_80A24954(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+ s8 sp27 = this->unk_2B0;
+ f32 temp = (this->dyna.actor.scale.y * 600.0f) - 90.0f;
+
+ if ((this->unk_244 > BGCHECK_Y_MIN + 1) && (temp < (this->unk_244 - this->dyna.actor.world.pos.y))) {
+ func_80A262BC(this);
+ this->unk_2B0 = 3;
+ } else if (this->unk_1B0 & 4) {
+ if (func_800C99D4(&globalCtx->colCtx, this->dyna.actor.floorPoly, this->dyna.actor.floorBgId) == 5) {
+ func_80A25FA0(this);
+ this->unk_2B0 = 2;
+ } else {
+ func_80A25CF4(this);
+ this->unk_2B0 = 1;
+ }
+ }
+ return sp27 != this->unk_2B0;
+}
+
+void func_80A24A48(ObjIceblock* this, GlobalContext* globalCtx) {
+ if (!(this->unk_1B0 & 0x10) && !(this->collider.base.ocFlags1 & OC1_HIT)) {
+ func_800C6314(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ this->unk_1B0 |= 0x10;
+ }
+}
+
+void func_80A24AA8(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 i;
+ f32 x;
+ ObjIceblock* temp_v0;
+
+ if (this->unk_1B0 & 4) {
+ for (i = 0; i < ARRAY_COUNT(this->unk_1F4); i++) {
+ temp_v0 = (ObjIceblock*)DynaPoly_GetActor(&globalCtx->colCtx, ((void)0, this->unk_1F4[i]).unk_08);
+ if ((temp_v0 != NULL) && (temp_v0->dyna.actor.id == ACTOR_OBJ_ICEBLOCK)) {
+ x = this->dyna.actor.world.pos.y - this->unk_1F4[i].unk_04;
+
+ if (fabsf(x) < 0.1f) {
+ temp_v0->unk_1B0 |= 2;
+ }
+ }
+ }
+ }
+}
+
+void func_80A24B74(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Vec3f sp20;
+
+ if (this->dyna.actor.flags & 0x40) {
+ 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(globalCtx, &sp20, 480, 880, 0);
+ }
+}
+
+void func_80A24BDC(ObjIceblock* this, GlobalContext* globalCtx, f32 arg2, f32 arg3, s32 arg4) {
+ s32 i;
+ Vec3f sp88;
+ f32 temp_f20;
+ s16 temp_f22;
+ s16 phi_s0;
+ s32 phi_s1 = 0;
+
+ if (this->dyna.actor.flags & 0x40) {
+ sp88.y = this->unk_244;
+ temp_f22 = 0x10000 / arg4;
+
+ for (i = 0, phi_s0 = 0; i < arg4; i++, phi_s0 += temp_f22) {
+ temp_f20 = ((Rand_ZeroOne() * 5.0f) + 40.0f) * arg2;
+ sp88.x = (Math_SinS((s32)(Rand_ZeroOne() * temp_f22) + phi_s0) * temp_f20) + this->dyna.actor.world.pos.x;
+ sp88.z = (Math_CosS((s32)(Rand_ZeroOne() * temp_f22) + phi_s0) * temp_f20) + this->dyna.actor.world.pos.z;
+ EffectSsGSplash_Spawn(globalCtx, &sp88, NULL, NULL, 0, ((Rand_ZeroOne() * 60.0f) + 320.0f) * arg3);
+ }
+ }
+}
+
+void func_80A24DC4(ObjIceblock* this) {
+ this->unk_2A2 = 0;
+}
+
+void func_80A24DD0(ObjIceblock* this, GlobalContext* globalCtx) {
+ static Vec3f D_80A26F90 = { 0.0f, 0.3f, 0.0f };
+ static Color_RGBA8 D_80A26F9C = { 250, 250, 250, 255 };
+ static Color_RGBA8 D_80A26FA0 = { 180, 180, 180, 255 };
+ s32 pad;
+ Vec3f spA8;
+ Vec3f sp9C;
+ s32 i;
+ f32 temp_f20;
+ f32 phi_f22;
+ s32 pad2;
+ s16 sp8A;
+
+ sp8A = this->dyna.yRotation;
+ if (this->dyna.pushForce < 0.0f) {
+ sp8A -= 0x8000;
+ }
+
+ this->unk_2A2++;
+ if (this->dyna.actor.flags & 0x40) {
+ if (this->unk_2A2 >= 0x2E) {
+ phi_f22 = 1.0f;
+ } else {
+ phi_f22 = (this->unk_2A2 * 0.017777778f) + 0.2f;
+ }
+ sp9C.y = 12.0f;
+
+ for (i = 0; i < 2; i++) {
+ if (phi_f22 < (Rand_ZeroOne() * 1.2f)) {
+ continue;
+ }
+
+ this->unk_2A4 += Rand_ZeroOne();
+ if (this->unk_2A4 > 1.0f) {
+ this->unk_2A4 -= 1.0f;
+ }
+
+ sp9C.x = (this->unk_2A4 - 0.5f) * 600.0f * this->dyna.actor.scale.x;
+ sp9C.z = (this->dyna.actor.scale.z * -300.0f) + 4.0f;
+
+ func_80A2311C(&spA8, &sp9C, sp8A);
+
+ spA8.x += this->dyna.actor.world.pos.x;
+ spA8.y += this->dyna.actor.world.pos.y;
+ spA8.z += this->dyna.actor.world.pos.z;
+
+ temp_f20 = ((Rand_ZeroOne() * 800.0f) + (1600.0f * this->dyna.actor.scale.x)) * phi_f22;
+ func_800B0E48(globalCtx, &spA8, &gZeroVec3f, &D_80A26F90, &D_80A26F9C, &D_80A26FA0, temp_f20,
+ (Rand_ZeroOne() * 20.0f) + 30.0f);
+ }
+ }
+}
+
+void func_80A2508C(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Vec3f sp40;
+ Vec3f sp34;
+ f32 temp_f0;
+ s32 temp_v0;
+
+ if (this->dyna.actor.flags & 0x40) {
+ temp_v0 = (s32)(this->dyna.actor.scale.y * 130.0f) - 3;
+ if (temp_v0 > 0) {
+ this->unk_2AC += temp_v0;
+ }
+
+ if (this->unk_2AC >= 10) {
+ this->unk_2AC = 0;
+ sp34.x = (Rand_ZeroOne() * 600.0f) - 300.0f;
+ sp34.y = 600.0f;
+ sp34.z = (Rand_ZeroOne() * 600.0f) - 300.0f;
+
+ temp_f0 = sqrtf(this->dyna.actor.scale.y + 0.01f);
+ sp40.x = sp34.x * 0.006935f * temp_f0;
+ sp40.y = 2.0f;
+ sp40.z = sp34.z * 0.006935f * temp_f0;
+
+ sp34.x = (this->dyna.actor.scale.x * sp34.x) + this->dyna.actor.world.pos.x;
+ sp34.y = (this->dyna.actor.scale.y * sp34.y) + this->dyna.actor.world.pos.y;
+ sp34.z = (this->dyna.actor.scale.z * sp34.z) + this->dyna.actor.world.pos.z;
+
+ if ((this->unk_244 - 3.0f) < sp34.y) {
+ EffectSsIceSmoke_Spawn(globalCtx, &sp34, &sp40, &gZeroVec3f,
+ (s32)(this->dyna.actor.scale.y * 1300.0f) + 60);
+ }
+ }
+ }
+}
+
+s32 func_80A25238(ObjIceblock* this) {
+ s16 phi_v0;
+
+ if (fabsf(this->dyna.pushForce) > 0.1f) {
+ if (this->dyna.pushForce > 0.0f) {
+ phi_v0 = this->dyna.yRotation + 0x2000;
+ } else {
+ phi_v0 = this->dyna.yRotation - 0x6000;
+ }
+
+ if (phi_v0 < -0x4000) {
+ return 3;
+ }
+
+ if (phi_v0 < 0) {
+ return 1;
+ }
+
+ if (phi_v0 < 0x4000) {
+ return 2;
+ }
+ return 0;
+ }
+ return -1;
+}
+
+void func_80A252DC(ObjIceblock* this, s32 arg1) {
+ s32 phi_v0;
+ s32 i;
+
+ if (this->unk_2B0 == 1) {
+ phi_v0 = true;
+ } else if (this->unk_2B0 == 2) {
+ phi_v0 = (this->dyna.pushForce > 0.0f);
+ } else {
+ phi_v0 = false;
+ }
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_26E); i++) {
+ if ((arg1 == i) && phi_v0) {
+ this->unk_26E[i]++;
+ } else if (this->unk_26E[i] > 0) {
+ this->unk_26E[i]--;
+ }
+ }
+}
+
+void func_80A25404(ObjIceblock* this) {
+ this->unk_26E[1] = 0;
+ this->unk_26E[2] = 0;
+ this->unk_26E[3] = 0;
+ this->unk_26E[0] = 0;
+}
+
+void func_80A2541C(ObjIceblock* this, GlobalContext* globalCtx) {
+ Player* player = GET_PLAYER(globalCtx);
+
+ player->stateFlags2 &= ~0x10;
+ this->dyna.pushForce = 0.0f;
+}
+
+void func_80A25440(ObjIceblock* this) {
+ s32 pad[2];
+ MtxF sp40;
+ Vec3f sp34;
+ Vec3f sp28;
+ f32 sp24;
+ Actor* temp_s1 = this->dyna.actor.parent;
+
+ if (temp_s1 != NULL) {
+ if (this->unk_2B0 == 3) {
+ sp24 = this->dyna.actor.shape.yOffset * this->dyna.actor.scale.y;
+
+ Matrix_RotateY(this->dyna.actor.shape.rot.y, MTXMODE_NEW);
+ Matrix_InsertXRotation_s(this->dyna.actor.shape.rot.x, MTXMODE_APPLY);
+ Matrix_InsertZRotation_s(this->dyna.actor.shape.rot.z, MTXMODE_APPLY);
+
+ sp34.x = this->unk_248.x;
+ sp34.y = this->unk_248.y - sp24;
+ sp34.z = this->unk_248.z;
+
+ Matrix_MultiplyVector3fByState(&sp34, &sp28);
+
+ sp34.x = this->dyna.actor.world.pos.x;
+ sp34.y = this->dyna.actor.world.pos.y + sp24;
+ sp34.z = this->dyna.actor.world.pos.z;
+
+ Math_Vec3f_Sum(&sp34, &sp28, &temp_s1->world.pos);
+ Matrix_RotateY(this->unk_254.y + this->dyna.actor.home.rot.y, MTXMODE_APPLY);
+ Matrix_InsertXRotation_s(this->unk_254.x + this->dyna.actor.home.rot.x, MTXMODE_APPLY);
+ Matrix_InsertZRotation_s(this->unk_254.z + this->dyna.actor.home.rot.z, MTXMODE_APPLY);
+ Matrix_CopyCurrentState(&sp40);
+ func_8018219C(&sp40, &temp_s1->shape.rot, MTXMODE_APPLY);
+ } else {
+ Math_Vec3f_Sum(&this->dyna.actor.world.pos, &this->unk_248, &temp_s1->world.pos);
+ }
+ }
+}
+
+static InitChainEntry sInitChain[] = {
+ ICHAIN_F32_DIV1000(speedXZ, 16000, ICHAIN_CONTINUE), ICHAIN_F32_DIV1000(gravity, -1800, ICHAIN_CONTINUE),
+ ICHAIN_F32_DIV1000(minVelocityY, -26000, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE),
+ ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 150, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_STOP),
};
-#endif
-
-extern ColliderCylinderInit D_80A26E50;
-extern InitChainEntry D_80A26FA4[];
-
-extern UNK_TYPE D_060001A0;
-extern UNK_TYPE D_06000438;
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23090.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2311C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2319C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A232C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23370.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2339C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23690.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A236D4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A237A4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23938.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23B88.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23D08.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A23F90.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24118.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24384.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A243E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24680.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A246D8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2491C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24954.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24A48.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24AA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24B74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24BDC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24DC4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A24DD0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2508C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25238.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A252DC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25404.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2541C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25440.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/ObjIceblock_Init.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/ObjIceblock_Destroy.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A257A0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A257B4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25824.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A2586C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25978.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25994.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25A8C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25AA8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25BA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25BBC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25C5C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25C70.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25CF4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25D28.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25E3C.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25E50.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25FA0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A25FD4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A260E8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A26144.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A262BC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A262EC.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A26574.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A265C0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A266C4.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A266E0.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/ObjIceblock_Update.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A26B64.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A26B74.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/func_80A26BF8.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Iceblock/ObjIceblock_Draw.s")
+void ObjIceblock_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ ObjIceblock* this = THIS;
+ Actor* parent;
+ s32 pad2;
+
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ this->dyna.actor.shape.rot.x = 0;
+ this->dyna.actor.shape.rot.z = 0;
+ this->dyna.actor.world.rot.x = 0;
+ this->dyna.actor.world.rot.z = 0;
+ this->dyna.actor.home.rot.x = 0;
+ this->dyna.actor.home.rot.z = 0;
+ if (!OBJICEBLOCK_GET_2(&this->dyna.actor)) {
+ this->dyna.actor.shape.rot.y = (this->dyna.actor.shape.rot.y + 0x2000) & 0xC000;
+ this->dyna.actor.home.rot.y = this->dyna.actor.shape.rot.y;
+ this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y;
+ }
+
+ DynaPolyActor_Init(&this->dyna, 1);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_ice_block_Colheader_000438);
+ func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ Collider_InitCylinder(globalCtx, &this->collider);
+ Collider_SetCylinder(globalCtx, &this->collider, &this->dyna.actor, &sCylinderInit);
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->collider.dim.yShift = -100;
+ this->collider.dim.height = 126;
+ this->collider.dim.radius = 29;
+ }
+
+ if (D_80A26E7C == NULL) {
+ D_80A26E7C = Lib_SegmentedToVirtual(&object_ice_block_Matanimheader_000328);
+ }
+
+ if (!(this->unk_1B0 & 8)) {
+ parent = this->dyna.actor.parent;
+ if (parent != NULL) {
+ this->unk_1B0 |= 8;
+ Math_Vec3f_Diff(&parent->world.pos, &this->dyna.actor.world.pos, &this->unk_248);
+ this->unk_254.x = parent->shape.rot.x - this->dyna.actor.home.rot.x;
+ this->unk_254.y = parent->shape.rot.y - this->dyna.actor.home.rot.y;
+ this->unk_254.z = parent->shape.rot.z - this->dyna.actor.home.rot.z;
+ }
+ }
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->unk_2B4 = -1.0f;
+ }
+
+ this->unk_2B0 = 0;
+ this->unkFunc = func_80A26B64;
+ func_80A257A0(this);
+ this->unk_2AE = 450;
+}
+
+void ObjIceblock_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ ObjIceblock* this = THIS;
+
+ DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
+
+void func_80A257A0(ObjIceblock* this) {
+ this->actionFunc = func_80A257B4;
+}
+
+void func_80A257B4(ObjIceblock* this, GlobalContext* globalCtx) {
+ if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
+ ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
+ this->unkFunc = func_80A26BF8;
+ this->unk_2B1 = 80;
+ func_80A25824(this);
+ } else {
+ ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
+ }
+}
+
+void func_80A25824(ObjIceblock* this) {
+ this->actionFunc = func_80A2586C;
+ this->unk_2A0 = 2;
+ Actor_SetScale(&this->dyna.actor, 0.01f);
+ func_80A2319C(this, this->dyna.actor.scale.x);
+}
+
+void func_80A2586C(ObjIceblock* this, GlobalContext* globalCtx) {
+ func_80A236D4(this, &this->dyna.actor.home.pos);
+
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ return;
+ }
+
+ if (Math_StepToF(&this->dyna.actor.scale.x, 0.1f, 0.02f)) {
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->unk_2B4 = 0.05f;
+ }
+ func_80A25978(this);
+ } else {
+ Actor_SetScale(&this->dyna.actor, this->dyna.actor.scale.x);
+ this->unk_2A0 = 2;
+ }
+
+ func_80A2319C(this, this->dyna.actor.scale.x);
+
+ if (this->dyna.actor.flags & 0x40) {
+ func_80A2339C(globalCtx, &this->dyna.actor.world.pos, (this->dyna.actor.scale.x + 0.05f) * 0.6666666f, 1.0f, 3);
+ }
+}
+
+void func_80A25978(ObjIceblock* this) {
+ this->actionFunc = func_80A25994;
+ this->unk_2A0 = 4;
+}
+
+void func_80A25994(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ Vec3f sp30;
+
+ func_80A236D4(this, &this->dyna.actor.home.pos);
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ return;
+ }
+
+ if (this->dyna.actor.flags & 0x40) {
+ func_80A2339C(globalCtx, &this->dyna.actor.world.pos, this->dyna.actor.scale.x, 1.2f, 15);
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ sp30.x = this->dyna.actor.world.pos.x;
+ sp30.y = this->dyna.actor.world.pos.y - 30.0f;
+ sp30.z = this->dyna.actor.world.pos.z;
+ func_80A2339C(globalCtx, &sp30, this->dyna.actor.scale.x, 1.2f, 10);
+ }
+ }
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->unk_2B4 = 0.1f;
+ }
+
+ func_80A25A8C(this);
+ this->unkFunc = func_80A26B74;
+}
+
+void func_80A25A8C(ObjIceblock* this) {
+ this->actionFunc = func_80A25AA8;
+ this->unk_2A0 = 2;
+}
+
+void func_80A25AA8(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+ f32 sp24;
+ s32 temp = func_80A236D4(this, &this->dyna.actor.home.pos);
+
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ return;
+ }
+
+ if (temp) {
+ sp24 = this->dyna.actor.scale.y * 300.0f;
+ func_80A23D08(this, globalCtx);
+ if (sp24 < (this->dyna.actor.world.pos.y - this->dyna.actor.floorHeight)) {
+ func_80A25BA0(this);
+ } else {
+ func_80A25C5C(this);
+ }
+
+ this->dyna.actor.world.pos.y -= sp24;
+ this->dyna.actor.shape.yOffset = 300.0f;
+ this->unk_248.y += sp24;
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->collider.dim.yShift = -69;
+ } else {
+ this->collider.dim.yShift = 0;
+ }
+ this->unk_1B0 |= 0x100;
+ }
+}
+
+void func_80A25BA0(ObjIceblock* this) {
+ this->actionFunc = func_80A25BBC;
+ this->dyna.actor.velocity.y = 0.0f;
+}
+
+void func_80A25BBC(ObjIceblock* this, GlobalContext* globalCtx) {
+ if (func_80A25238(this) != -1) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ func_80A23690(this);
+
+ if (func_80A23F90(this, globalCtx)) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ }
+
+ if (func_80A24954(this, globalCtx)) {
+ func_80A2491C(this);
+ if (this->unk_2B0 == 3) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_DIVE_INTO_WATER_L);
+ }
+ }
+}
+
+void func_80A25C5C(ObjIceblock* this) {
+ this->actionFunc = func_80A25C70;
+}
+
+void func_80A25C70(ObjIceblock* this, GlobalContext* globalCtx) {
+ if (func_80A25238(this) != -1) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.floorHeight - 0.1f, 14.0f)) {
+ func_80A23F90(this, globalCtx);
+ func_80A24954(this, globalCtx);
+ }
+}
+
+void func_80A25CF4(ObjIceblock* this) {
+ func_80A25404(this);
+ this->actionFunc = func_80A25D28;
+}
+
+void func_80A25D28(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 sp34;
+ s32 sp30;
+ Vec3f sp24;
+
+ func_80A23690(this);
+ func_80A23F90(this, globalCtx);
+ sp30 = func_80A25238(this);
+ func_80A252DC(this, sp30);
+ sp34 = true;
+ if (sp30 == -1) {
+ sp34 = false;
+ } else if (!(this->unk_1B0 & 2) && (this->unk_26E[sp30] >= 11)) {
+ sp34 = true;
+ if (!func_80A24118(this, globalCtx, (this->dyna.pushForce > 0.0f) ? 59.9f : 89.9f, &sp24)) {
+ func_80A232C4(this, sp30);
+ func_80A25E3C(this);
+ sp34 = false;
+ }
+ }
+
+ if (sp34) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ func_80A24A48(this, globalCtx);
+}
+
+void func_80A25E3C(ObjIceblock* this) {
+ this->actionFunc = func_80A25E50;
+}
+
+void func_80A25E50(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ f32 temp_f0 = this->unk_268 - *this->unk_264;
+ f32 temp_f2 = (Math_SinS(fabsf(temp_f0) * 546.13336f) * 2.8f) + 1.2f;
+ s32 sp38 = Math_StepToF(this->unk_264, this->unk_268, CLAMP_MAX(temp_f2, 3.5f));
+ s32 pad2;
+ Vec3f sp28;
+
+ func_80A23690(this);
+ if (!func_80A23F90(this, globalCtx)) {
+ func_80A24680(this, globalCtx);
+ func_80A23B88(this);
+ func_80A2541C(this, globalCtx);
+ func_80A25BA0(this);
+ } else if (sp38) {
+ if (func_80A24118(this, globalCtx, 59.9f, &sp28)) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ }
+ func_80A2541C(this, globalCtx);
+ func_80A25CF4(this);
+ } else {
+ func_800B9010(&this->dyna.actor, 0xDF);
+ }
+}
+
+void func_80A25FA0(ObjIceblock* this) {
+ func_80A25404(this);
+ this->actionFunc = func_80A25FD4;
+}
+
+void func_80A25FD4(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ s32 sp30;
+ s32 sp2C;
+ Vec3f sp20;
+
+ func_80A23690(this);
+ func_80A23F90(this, globalCtx);
+ sp2C = func_80A25238(this);
+ func_80A252DC(this, sp2C);
+ sp30 = true;
+
+ if (sp2C == -1) {
+ sp30 = false;
+ } else if (!(this->unk_1B0 & 2) && (this->unk_26E[sp2C] >= 11) && !func_80A24118(this, globalCtx, 2.0f, &sp20) &&
+ !func_801233E4(globalCtx)) {
+ func_80A23370(this, sp2C);
+ func_80A260E8(this);
+ sp30 = false;
+ func_800B7298(globalCtx, &this->dyna.actor, 7);
+ this->unk_1B0 |= 1;
+ }
+
+ if (this) {}
+
+ if (sp30) {
+ func_80A2541C(this, globalCtx);
+ }
+ func_80A24A48(this, globalCtx);
+}
+
+void func_80A260E8(ObjIceblock* this) {
+ static f32 D_80A26FC0[] = { 14.0, -14.0, 14.0, -14.0 };
+
+ this->unk_260 = D_80A26FC0[this->unk_26C];
+ this->unk_25C = 0.0f;
+ this->dyna.actor.velocity.y = 0.0f;
+ this->unk_2A0 = 15;
+ func_80A24DC4(this);
+ this->actionFunc = func_80A26144;
+}
+
+void func_80A26144(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad2;
+ s32 sp28;
+ s32 isBool;
+ s32 sp24;
+
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ }
+
+ Math_StepToF(&this->unk_25C, this->unk_260, 0.75f);
+ *this->unk_264 += this->unk_25C;
+ sp28 = func_80A24384(this, globalCtx);
+ func_80A23690(this);
+ sp24 = func_80A23F90(this, globalCtx);
+ isBool = sp24 == 0;
+
+ if (isBool || sp28 || (this->unk_2A0 == 1)) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ if ((this->unk_1B0 & 1) && (isBool || sp28 || (this->dyna.actor.xzDistToPlayer > 400.0f))) {
+ this->unk_1B0 &= ~1;
+ func_800B7298(globalCtx, &this->dyna.actor, 6);
+ }
+
+ if (isBool) {
+ func_80A24680(this, globalCtx);
+ func_80A23B88(this);
+ func_80A25BA0(this);
+ } else if (sp28) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BLOCK_BOUND);
+ func_80A23B88(this);
+ func_80A25FA0(this);
+ } else {
+ func_800B9010(&this->dyna.actor, 0xDF);
+ }
+
+ func_80A24DD0(this, globalCtx);
+}
+
+void func_80A262BC(ObjIceblock* this) {
+ this->actionFunc = func_80A262EC;
+ this->dyna.actor.velocity.y *= 0.7f;
+ this->unk_2A0 = -1;
+}
+
+void func_80A262EC(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ f32 temp_f14;
+ f32 temp_f18;
+ Vec3f sp38;
+ f32 temp;
+
+ if (func_80A25238(this) != -1) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ }
+
+ if (this->unk_2A0 == -1) {
+ if ((this->dyna.actor.velocity.y < 0.0f) && (this->dyna.actor.world.pos.y < this->unk_244) &&
+ ((this->unk_244 - (600.0f * this->dyna.actor.scale.y)) <= this->dyna.actor.world.pos.y)) {
+ func_80A24BDC(this, globalCtx, 1.0f, 0.9f, 11);
+ func_80A24B74(this, globalCtx);
+ this->unk_2A0 = 3;
+ } else {
+ this->unk_2A0 = 0;
+ }
+ } else if (this->unk_2A0 == 1) {
+ func_80A24BDC(this, globalCtx, 0.7f, 1.3f, 6);
+ func_80A24B74(this, globalCtx);
+ }
+
+ this->dyna.actor.velocity.y += 5.0f;
+ if (this->dyna.actor.velocity.y > 3.0f) {
+ this->dyna.actor.velocity.y = 3.0f;
+ }
+
+ temp = this->dyna.actor.velocity.y;
+ this->dyna.actor.world.pos.y += temp;
+ temp_f14 = this->dyna.actor.world.pos.y + (600.0f * this->dyna.actor.scale.y);
+ if (this->unk_244 < (temp_f14 - 90.0f)) {
+ func_80A24B74(this, globalCtx);
+ func_80A26574(this);
+ } else {
+ if ((this->dyna.actor.velocity.y > 0.0f) && (temp_f14 < (this->unk_244 + 3.0f)) &&
+ (this->unk_244 <= temp_f14)) {
+ func_80A24BDC(this, globalCtx, 0.8f, 1.0f, 11);
+ func_80A24B74(this, globalCtx);
+ }
+
+ sp38.x = this->dyna.actor.world.pos.x;
+ sp38.y = (this->unk_244 - (600.0f * this->dyna.actor.scale.y)) + 90.0f;
+ sp38.z = this->dyna.actor.world.pos.z;
+
+ if (func_80A246D8(this, globalCtx, &sp38)) {
+ this->unk_1B0 |= 0x80;
+ }
+ }
+}
+
+void func_80A26574(ObjIceblock* this) {
+ this->actionFunc = func_80A265C0;
+ this->unk_27C.unk_10 = 0;
+ this->unk_27C.unk_12 = 0;
+ this->unk_27C.unk_0C = 2111;
+ this->unk_27C.unk_0E = 3000;
+ this->unk_27C.unk_18 = 500;
+ this->unk_27C.unk_22 = 500;
+ this->unk_27C.unk_08 = 7.0f;
+ this->unk_2A0 = 40;
+}
+
+void func_80A265C0(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad;
+ ObjIceBlockUnkStruct4* ptr;
+
+ if (func_80A25238(this) != -1) {
+ func_80A2541C(this, globalCtx);
+ }
+
+ if (this->unk_2A0 > 0) {
+ this->unk_2A0--;
+ } else {
+ ptr = &this->unk_27C;
+ this->unk_2A0 = Rand_S16Offset(30, 60);
+ ptr->unk_0C = Rand_S16Offset(300, 300);
+ ptr->unk_0E = Rand_S16Offset(900, 600);
+ ptr->unk_04 = (2.0f * Rand_ZeroOne()) + 1.0f;
+ ptr->unk_14 = (u32)Rand_Next() >> 0x10;
+ func_80A24B74(this, globalCtx);
+ }
+
+ func_80A237A4(this);
+ func_80A23938(this);
+
+ if (this->unk_1B0 & 0x40) {
+ func_80A24B74(this, globalCtx);
+ }
+
+ func_80A24A48(this, globalCtx);
+}
+
+void func_80A266C4(ObjIceblock* this) {
+ this->actionFunc = func_80A266E0;
+ this->unk_2A8 = 0.0f;
+}
+
+void func_80A266E0(ObjIceblock* this, GlobalContext* globalCtx) {
+ f32 temp;
+ s32 sp20;
+ Actor* actor = &this->dyna.actor;
+
+ Math_StepToF(&this->unk_2A8, (1.0f / 600.0f), (1.0f / 6000.0f));
+ sp20 = Math_StepToF(&actor->scale.y, 0.0f, this->unk_2A8);
+ temp = actor->scale.y * 10.0f * 300.0f;
+ actor->shape.yOffset = temp;
+
+ if (actor->scale.y < 0.075f) {
+ actor->scale.x = Math_SinS(actor->scale.y * 218453.33f) * 0.1f;
+ if (actor->scale.x < 0.0f) {
+ actor->scale.x = 0.0f;
+ }
+ actor->scale.z = actor->scale.x;
+ }
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor)) {
+ this->unk_2B4 = actor->scale.y;
+ this->collider.dim.height = (s32)(actor->scale.y * 1230.0f) + 1;
+ this->collider.dim.yShift = actor->scale.y * -1000.0f;
+ this->collider.dim.radius = actor->scale.x * 290.0f;
+ }
+
+ func_80A2508C(this, globalCtx);
+
+ if (sp20) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+}
+
+void ObjIceblock_Update(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ ObjIceblock* this = THIS;
+ Actor* parent = this->dyna.actor.parent;
+
+ if (parent != NULL) {
+ if ((parent->update == NULL) || (&this->dyna.actor != parent->child)) {
+ this->dyna.actor.parent = NULL;
+ parent = NULL;
+ }
+ }
+
+ if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) {
+ if (this->unk_1B0 & 0x20) {
+ this->unk_1B0 &= ~0x40;
+ } else {
+ this->unk_1B0 |= 0x40;
+ this->unk_1B0 |= 0x20;
+ }
+ } else if (this->unk_1B0 & 0x20) {
+ this->unk_1B0 |= 0x40;
+ this->unk_1B0 &= ~0x20;
+ } else {
+ this->unk_1B0 &= ~0x40;
+ }
+
+ if ((this->unk_2B0 == 1) || (this->unk_2B0 == 2) || (this->unk_2B0 == 3)) {
+ if (this->unk_2AE > 0) {
+ this->unk_2AE--;
+ }
+ }
+
+ if (((this->collider.base.acFlags & AC_HIT) && (this->collider.info.acHitInfo->toucher.dmgFlags & 0x800)) ||
+ (this->unk_2AE == 0)) {
+ this->unk_2AE = -1;
+ this->unk_2B0 = 4;
+ this->unk_1B0 &= ~0x100;
+ if (this->unk_1B0 & 1) {
+ this->unk_1B0 &= ~1;
+ func_800B7298(globalCtx, &this->dyna.actor, 6);
+ }
+ func_80A266C4(this);
+ }
+
+ if (this->unk_2B1 > 0) {
+ this->unk_2B1--;
+ if (this->unk_2B1 == 0) {
+ ActorCutscene_Stop(this->dyna.actor.cutscene);
+ }
+ }
+
+ this->actionFunc(this, globalCtx);
+ if (this->dyna.actor.update == NULL) {
+ if (parent != NULL) {
+ parent->child = NULL;
+ parent->shape.rot.x = this->unk_254.x + this->dyna.actor.home.rot.x;
+ parent->shape.rot.y = this->unk_254.y + this->dyna.actor.home.rot.y;
+ parent->shape.rot.z = this->unk_254.z + this->dyna.actor.home.rot.z;
+ this->dyna.actor.parent = NULL;
+ }
+ return;
+ }
+
+ this->collider.base.ocFlags1 &= ~OC1_HIT;
+ this->collider.base.acFlags &= ~AC_HIT;
+ Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
+
+ if (this->unk_1B0 & 0x10) {
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ this->collider.base.ocFlags1 &= ~OC1_NO_PUSH;
+ this->collider.base.ocFlags1 |= (OC1_TYPE_2 | OC1_TYPE_1 | OC1_TYPE_PLAYER);
+ this->collider.info.bumper.dmgFlags |=
+ (0x800000 | 0x400000 | 0x10000 | 0x2000 | 0x1000 | 0x800 | 0x200 | 0x100 | 0x80 | 0x20 | 0x10 | 0x2);
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+ } else {
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+
+ if (this->unk_1B0 & 0x100) {
+ CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+ }
+
+ func_80A25440(this);
+ Actor_SetHeight(&this->dyna.actor, this->dyna.actor.shape.yOffset * this->dyna.actor.scale.y);
+ this->unk_1B0 &= ~0x2;
+
+ if (parent) {}
+}
+
+void func_80A26B64(ObjIceblock* this, GlobalContext* globalCtx) {
+}
+
+void func_80A26B74(ObjIceblock* this, GlobalContext* globalCtx) {
+ func_800BE03C(globalCtx, object_ice_block_DL_0001A0);
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_ice_block_Matanimheader_0009D0));
+ func_800BE03C(globalCtx, object_ice_block_DL_0007F0);
+ }
+}
+
+void func_80A26BF8(ObjIceblock* this, GlobalContext* globalCtx) {
+ s32 pad[2];
+ ObjIceBlockUnkStruct* ptr;
+ s32 i;
+ Vec3s sp70;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ func_8012C2DC(globalCtx->state.gfxCtx);
+ sp70.z = 0;
+
+ for (i = 0; i < ARRAY_COUNT(this->unk_1B4); i++) {
+ ptr = &this->unk_1B4[i];
+ sp70.x = ptr->unk_00;
+ sp70.y = ptr->unk_02;
+ Matrix_SetStateRotationAndTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y,
+ this->dyna.actor.world.pos.z, &sp70);
+ Matrix_Scale(ptr->unk_04, ptr->unk_08, ptr->unk_0C, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_ice_block_DL_0001A0);
+ }
+
+ if (OBJICEBLOCK_GET_1(&this->dyna.actor) && (this->unk_2B4 > 0.0f)) {
+ AnimatedMat_Draw(globalCtx, Lib_SegmentedToVirtual(&object_ice_block_Matanimheader_0009D0));
+ Matrix_SetStateRotationAndTranslation(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y - 20.0f,
+ this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
+ Matrix_Scale(this->unk_2B4, this->unk_2B4, this->unk_2B4, MTXMODE_APPLY);
+
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, object_ice_block_DL_0007F0);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+}
+
+void ObjIceblock_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ ObjIceblock* this = THIS;
+
+ AnimatedMat_Draw(globalCtx, D_80A26E7C);
+ this->unkFunc(this, globalCtx);
+ func_80A24AA8(this, globalCtx);
+}
diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
index 4851a87638..6a4875bb31 100644
--- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
+++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.h
@@ -6,12 +6,76 @@
struct ObjIceblock;
typedef void (*ObjIceblockActionFunc)(struct ObjIceblock*, GlobalContext*);
+typedef void (*ObjIceblockUnkFunc)(struct ObjIceblock*, GlobalContext*);
+
+#define OBJICEBLOCK_GET_2(thisx) (((thisx)->params >> 1) & 1)
+#define OBJICEBLOCK_GET_1(thisx) ((thisx)->params & 1)
+
+typedef struct {
+ /* 0x00 */ s16 unk_00;
+ /* 0x02 */ s16 unk_02;
+ /* 0x04 */ f32 unk_04;
+ /* 0x08 */ f32 unk_08;
+ /* 0x0C */ f32 unk_0C;
+} ObjIceBlockUnkStruct; // size = 0x10
+
+typedef struct {
+ /* 0x00 */ CollisionPoly* unk_00;
+ /* 0x04 */ f32 unk_04;
+ /* 0x08 */ s32 unk_08;
+ /* 0x0C */ f32 unk_0C;
+} ObjIceBlockUnkStruct2; // size = 0x10
+
+typedef struct {
+ f32 unk_00;
+ f32 unk_04;
+} ObjIceBlockUnkStruct3; // size = 0x8
+
+typedef struct {
+ /* 0x00 */ f32 unk_00;
+ /* 0x04 */ f32 unk_04;
+ /* 0x08 */ f32 unk_08;
+ /* 0x0C */ s16 unk_0C;
+ /* 0x0E */ s16 unk_0E;
+ /* 0x10 */ s16 unk_10;
+ /* 0x12 */ s16 unk_12;
+ /* 0x14 */ s16 unk_14;
+ /* 0x14 */ s16 unk_16;
+ /* 0x18 */ s16 unk_18;
+ /* 0x1C */ f32 unk_1C;
+ /* 0x20 */ s16 unk_20;
+ /* 0x22 */ s16 unk_22;
+} ObjIceBlockUnkStruct4; // size = 0x24
typedef struct ObjIceblock {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x64];
+ /* 0x0000 */ DynaPolyActor dyna;
+ /* 0x015C */ ColliderCylinder collider;
/* 0x01A8 */ ObjIceblockActionFunc actionFunc;
- /* 0x01AC */ char unk_1AC[0x10C];
+ /* 0x01AC */ ObjIceblockUnkFunc unkFunc;
+ /* 0x01B0 */ s32 unk_1B0;
+ /* 0x01B4 */ ObjIceBlockUnkStruct unk_1B4[4];
+ /* 0x01F4 */ ObjIceBlockUnkStruct2 unk_1F4[5];
+ /* 0x0244 */ f32 unk_244;
+ /* 0x0248 */ Vec3f unk_248;
+ /* 0x0254 */ Vec3s unk_254;
+ /* 0x025C */ f32 unk_25C;
+ /* 0x0260 */ f32 unk_260;
+ /* 0x0264 */ f32* unk_264;
+ /* 0x0268 */ f32 unk_268;
+ /* 0x026C */ s16 unk_26C;
+ /* 0x026E */ s16 unk_26E[4];
+ /* 0x0276 */ s16 unk_276;
+ /* 0x0278 */ s16 unk_278;
+ /* 0x027C */ ObjIceBlockUnkStruct4 unk_27C;
+ /* 0x02A0 */ s16 unk_2A0;
+ /* 0x02A2 */ s16 unk_2A2;
+ /* 0x02A4 */ f32 unk_2A4;
+ /* 0x02A8 */ f32 unk_2A8;
+ /* 0x02AC */ s16 unk_2AC;
+ /* 0x02AE */ s16 unk_2AE;
+ /* 0x02B0 */ s8 unk_2B0;
+ /* 0x02B1 */ s8 unk_2B1;
+ /* 0x02B4 */ f32 unk_2B4;
} ObjIceblock; // size = 0x2B8
extern const ActorInit Obj_Iceblock_InitVars;
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 35c81daa91..eab5d8f1cf 100644
--- a/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
+++ b/src/overlays/actors/ovl_Obj_Lightswitch/z_obj_lightswitch.c
@@ -145,7 +145,7 @@ void ObjLightswitch_SpawnEffects(ObjLightswitch* this, GlobalContext* globalCtx)
effectPos.y = this->actor.world.pos.y + tempResultDiff + 10.0f;
effectPos.z = this->actor.world.pos.z + ((rand * cosResult) - (tempResult * sinResult));
- EffectSsDeadDb_Spawn(globalCtx, &effectPos, &D_801D15B0, &D_801D15B0, &sLightswitchEffectPrimColor,
+ EffectSsDeadDb_Spawn(globalCtx, &effectPos, &gZeroVec3f, &gZeroVec3f, &sLightswitchEffectPrimColor,
&sLightswitchEffectEnvColor, 100, 0, 9);
}
}
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 3eb50153be..b88dc23fae 100644
--- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
+++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c
@@ -5,6 +5,7 @@
*/
#include "z_obj_syokudai.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h"
#define FLAGS 0x00000410
@@ -314,7 +315,7 @@ void ObjSyokudai_Draw(Actor* thisx, GlobalContext* globalCtx) {
Matrix_RotateY(BINANG_ROT180(func_800DFCDC(GET_ACTIVE_CAM(globalCtx)) - thisx->shape.rot.y), MTXMODE_APPLY);
Matrix_Scale(flameScale, flameScale, flameScale, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, D_0407D590);
+ gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
diff --git a/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c b/src/overlays/actors/ovl_Obj_Tokei_Step/z_obj_tokei_step.c
index a62ce6cf6c..f7710909f6 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
@@ -5,6 +5,7 @@
*/
#include "z_obj_tokei_step.h"
+#include "objects/object_tokei_step/object_tokei_step.h"
#define FLAGS 0x00400010
@@ -37,11 +38,11 @@ const ActorInit Obj_Tokei_Step_InitVars = {
(ActorFunc)ObjTokeiStep_Draw,
};
-static f32 panelXOffsets[] = { -105.0f, -90.0f, -75.0f, -60.0f, -45.0f, -30.0f, -15.0f };
+static f32 sPanelXOffsets[] = { -105.0f, -90.0f, -75.0f, -60.0f, -45.0f, -30.0f, -15.0f };
-static f32 dustSpawnXOffsets[] = { -60.0f, -40.0f, -20.0f, 0.0f, 20.0f, 40.0f, 60.0f };
+static f32 sDustSpawnXOffsets[] = { -60.0f, -40.0f, -20.0f, 0.0f, 20.0f, 40.0f, 60.0f };
-static Vec3f dustEffectAccel = { 0.0f, 0.3f, 0.0f };
+static Vec3f sDustEffectAccel = { 0.0f, 0.3f, 0.0f };
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
@@ -50,27 +51,22 @@ static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
-extern Gfx D_06000088[];
-extern CollisionHeader D_06000968;
-
void ObjTokeiStep_SetSysMatrix(ObjTokeiStepPanel* panel) {
- MtxF* sysMatrix;
+ MtxF* mtx = Matrix_GetCurrentState();
- sysMatrix = Matrix_GetCurrentState();
- sysMatrix->wx = panel->pos.x;
- sysMatrix->wy = panel->pos.y;
- sysMatrix->wz = panel->pos.z;
+ mtx->wx = panel->pos.x;
+ mtx->wy = panel->pos.y;
+ mtx->wz = panel->pos.z;
}
void ObjTokeiStep_AddQuake(ObjTokeiStep* this, GlobalContext* globalCtx) {
s32 pad[2];
- s16 quake;
+ s16 quake = Quake_Add(GET_ACTIVE_CAM(globalCtx), 3);
- quake = Quake_Add(GET_ACTIVE_CAM(globalCtx), 3);
- Quake_SetSpeed(quake, 0x4E20);
+ Quake_SetSpeed(quake, 20000);
Quake_SetQuakeValues(quake, 1, 0, 0, 0);
Quake_SetCountdown(quake, 7);
- func_8013ECE0(this->dyna.actor.xyzDistToPlayerSq, 0x78, 0x14, 0xA);
+ func_8013ECE0(this->dyna.actor.xyzDistToPlayerSq, 120, 20, 10);
}
void ObjTokeiStep_SpawnDust(ObjTokeiStep* this, ObjTokeiStepPanel* panel, GlobalContext* globalCtx) {
@@ -84,12 +80,12 @@ void ObjTokeiStep_SpawnDust(ObjTokeiStep* this, ObjTokeiStepPanel* panel, Global
dustSpawnOffset.y = 115.0f;
dustSpawnOffset.z = -10.0f;
for (i = 0; i < 7; i++) {
- dustSpawnOffset.x = dustSpawnXOffsets[i];
+ dustSpawnOffset.x = sDustSpawnXOffsets[i];
Matrix_MultiplyVector3fByState(&dustSpawnOffset, &dustSpawnPos);
dustSpawnPos.x += panel->pos.x;
dustSpawnPos.y += panel->pos.y;
dustSpawnPos.z += panel->pos.z;
- func_800B1210(globalCtx, &dustSpawnPos, &D_801D15B0, &dustEffectAccel, (s32)((Rand_ZeroOne() * 40.0f) + 80.0f),
+ func_800B1210(globalCtx, &dustSpawnPos, &gZeroVec3f, &sDustEffectAccel, (s32)((Rand_ZeroOne() * 40.0f) + 80.0f),
(s32)((Rand_ZeroOne() * 20.0f) + 50.0f));
}
}
@@ -105,7 +101,7 @@ void ObjTokeiStep_InitSteps(ObjTokeiStep* this) {
panelOffset.x = 0.0f;
panelOffset.y = 0.0f;
- for (i = 0; i < 7; i++) {
+ for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
panelOffset.z = i * -20.0f;
Matrix_MultiplyVector3fByState(&panelOffset, &panel->pos);
@@ -123,9 +119,9 @@ void ObjTokeiStep_InitStepsOpen(ObjTokeiStep* this) {
this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot);
panelOffset.x = 0.0f;
- for (i = 0; i < 7; i++) {
+ for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
- panelOffset.y = panelXOffsets[i];
+ panelOffset.y = sPanelXOffsets[i];
panelOffset.z = i * -20.0f;
Matrix_MultiplyVector3fByState(&panelOffset, &panel->pos);
}
@@ -135,7 +131,7 @@ void ObjTokeiStep_InitTimers(ObjTokeiStep* this) {
s32 i;
this->panels[0].startFallingTimer = 0;
- for (i = 1; i < 7; i++) {
+ for (i = 1; i < ARRAY_COUNT(this->panels); i++) {
this->panels[i].startFallingTimer = 10;
}
}
@@ -145,17 +141,17 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, GlobalContext* globalCtx) {
s32 i;
ObjTokeiStepPanel* panel;
f32 finalPosY;
- s32 isOpen = 1;
- s32 prevBounced = 1;
+ s32 isOpen = true;
+ s32 hasPrevBounced = true;
- for (i = 0; i < 7; i++) {
+ for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
- if (prevBounced && panel->startFallingTimer > 0) {
+ if (hasPrevBounced && (panel->startFallingTimer > 0)) {
panel->startFallingTimer--;
- isOpen = 0;
+ isOpen = false;
}
- if (prevBounced && panel->numBounces < 3 && panel->startFallingTimer <= 0) {
- finalPosY = panelXOffsets[i] + this->dyna.actor.world.pos.y;
+ if (hasPrevBounced && (panel->numBounces < 3) && (panel->startFallingTimer <= 0)) {
+ finalPosY = sPanelXOffsets[i] + this->dyna.actor.world.pos.y;
if (!panel->hasSoundPlayed) {
Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_CLOCK_TOWER_STAIR_MOVE);
panel->hasSoundPlayed = true;
@@ -163,7 +159,7 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, GlobalContext* globalCtx) {
panel->posChangeY += -2.5f;
panel->posChangeY *= 0.83f;
panel->pos.y += panel->posChangeY;
- isOpen = 0;
+ isOpen = false;
if (panel->pos.y < finalPosY) {
panel->numBounces++;
if (panel->numBounces >= 3) {
@@ -186,7 +182,7 @@ s32 ObjTokeiStep_OpenProcess(ObjTokeiStep* this, GlobalContext* globalCtx) {
}
}
}
- prevBounced = panel->numBounces > 0;
+ hasPrevBounced = panel->numBounces > 0;
}
return isOpen;
}
@@ -196,16 +192,17 @@ void ObjTokeiStep_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyActor_Init(&this->dyna, 0);
- if ((globalCtx->sceneNum == 0x6F) && (gSaveContext.sceneSetupIndex == 2) && (globalCtx->csCtx.unk_12 == 0)) {
- DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06000968);
+ if ((globalCtx->sceneNum == SCENE_CLOCKTOWER) && (gSaveContext.sceneSetupIndex == 2) &&
+ (globalCtx->csCtx.unk_12 == 0)) {
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &gClocktowerPanelCol);
ObjTokeiStep_InitSteps(this);
ObjTokeiStep_SetupBeginOpen(this);
- } else if (!((CURRENT_DAY != 3) || (gSaveContext.time >= 0x4000)) || gSaveContext.day >= 4) {
+ } else if (((CURRENT_DAY == 3) && (gSaveContext.time < CLOCK_TIME(6, 0))) || (gSaveContext.day >= 4)) {
this->dyna.actor.draw = ObjTokeiStep_DrawOpen;
ObjTokeiStep_InitStepsOpen(this);
ObjTokeiStep_SetupDoNothingOpen(this);
} else {
- DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06000968);
+ DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &gClocktowerPanelCol);
ObjTokeiStep_InitSteps(this);
ObjTokeiStep_SetupDoNothing(this);
}
@@ -226,7 +223,7 @@ void ObjTokeiStep_BeginOpen(ObjTokeiStep* this, GlobalContext* globalCtx) {
if (func_800EE29C(globalCtx, 0x86)) {
action = globalCtx->csCtx.npcActions[func_800EE200(globalCtx, 0x86)];
- if ((globalCtx->csCtx.frames == (*action).startFrame) && action->unk0) {
+ if ((action->startFrame == globalCtx->csCtx.frames) && (action->unk0 != 0)) {
this->dyna.actor.draw = ObjTokeiStep_DrawOpen;
ObjTokeiStep_SetupOpen(this);
}
@@ -269,12 +266,12 @@ void ObjTokeiStep_Update(Actor* thisx, GlobalContext* globalCtx) {
void ObjTokeiStep_Draw(Actor* thisx, GlobalContext* globalCtx) {
ObjTokeiStep* this = THIS;
- func_800BDFC0(globalCtx, D_06000088);
+ func_800BDFC0(globalCtx, gClocktowerPanelDL);
}
void ObjTokeiStep_DrawOpen(Actor* thisx, GlobalContext* globalCtx) {
ObjTokeiStep* this = THIS;
- int i;
+ s32 i;
ObjTokeiStepPanel* panel;
Gfx* gfx;
@@ -282,11 +279,11 @@ void ObjTokeiStep_DrawOpen(Actor* thisx, GlobalContext* globalCtx) {
gfx = POLY_OPA_DISP;
gSPDisplayList(gfx++, &sSetupDL[6 * 0x19]);
- for (i = 0; i < 7; i++) {
+ for (i = 0; i < ARRAY_COUNT(this->panels); i++) {
panel = &this->panels[i];
ObjTokeiStep_SetSysMatrix(panel);
gSPMatrix(gfx++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(gfx++, D_06000088);
+ gSPDisplayList(gfx++, gClocktowerPanelDL);
}
POLY_OPA_DISP = gfx;
CLOSE_DISPS(globalCtx->state.gfxCtx);
diff --git a/src/overlays/actors/ovl_Player_Actor/overlay.cfg b/src/overlays/actors/ovl_Player_Actor/overlay.cfg
deleted file mode 100644
index 6dea57e3f1..0000000000
--- a/src/overlays/actors/ovl_Player_Actor/overlay.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-ovl_Player_Actor
-z_player.c
diff --git a/src/overlays/actors/ovl_Player_Actor/z_player.c b/src/overlays/actors/ovl_Player_Actor/z_player.c
deleted file mode 100644
index 2d5b3d59a7..0000000000
--- a/src/overlays/actors/ovl_Player_Actor/z_player.c
+++ /dev/null
@@ -1,1297 +0,0 @@
-/*
- * File: z_player.c
- * Overlay: ovl_Player_Actor
- * Description: Player
- */
-
-#include "global.h"
-
-#define THIS ((Player*)thisx)
-
-extern UNK_TYPE D_06008860;
-extern UNK_TYPE D_0600BDD8;
-extern UNK_TYPE D_060178D0;
-
-#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/func_80841AC4.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/func_808460B8.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/func_80846528.s")
-
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Player_Actor/func_808470D4.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")
diff --git a/src/overlays/actors/ovl_player_actor/overlay.cfg b/src/overlays/actors/ovl_player_actor/overlay.cfg
new file mode 100644
index 0000000000..2d48492357
--- /dev/null
+++ b/src/overlays/actors/ovl_player_actor/overlay.cfg
@@ -0,0 +1,2 @@
+ovl_player_actor
+z_player.c
diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c
new file mode 100644
index 0000000000..6a5fa04231
--- /dev/null
+++ b/src/overlays/actors/ovl_player_actor/z_player.c
@@ -0,0 +1,1297 @@
+/*
+ * File: z_player.c
+ * Overlay: ovl_player_actor
+ * Description: Player
+ */
+
+#include "global.h"
+
+#define THIS ((Player*)thisx)
+
+extern UNK_TYPE D_06008860;
+extern UNK_TYPE D_0600BDD8;
+extern UNK_TYPE D_060178D0;
+
+#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/func_80841AC4.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/func_808460B8.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/func_80846528.s")
+
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_player_actor/func_808470D4.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")
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 e2fdb18c4d..5573ecb119 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
@@ -60,10 +60,10 @@ extern UNK_TYPE D_0C006C00;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80827E08.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808283D8.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Draw.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_808286D8.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_80828788.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/func_8082895C.s")
+#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_kaleido_scope/KaleidoScope_Update.s")
diff --git a/tools/actorfixer.py b/tools/actorfixer.py
index 428c6dee5b..89d7364eae 100755
--- a/tools/actorfixer.py
+++ b/tools/actorfixer.py
@@ -301,6 +301,10 @@ animdict = {
"func_8017F9C0": "Math3D_XZInSphere",
"func_8017FA34": "Math3D_XYInSphere",
"func_8017FAA8": "Math3D_YZInSphere",
+ "func_800A81F0": "EffectBlure_AddVertex",
+ "func_800A8514": "EffectBlure_AddSpace",
+ "Effect_GetParams": "Effect_GetByIndex",
+ "D_0407D590": "gGameplayKeepDrawFlameDL"
"skelanime.unk03": "skelanime.taper",
@@ -341,6 +345,11 @@ animdict = {
"globalCtx->mf_187FC" : "globalCtx->billboardMtxF",
"globalCtx->projectionMatrix" : "globalCtx->viewProjectionMtxF",
+
+ "D_801D15B0" : "gZeroVec3f",
+ "D_801D15BC" : "gZeroVec3s",
+ "D_801D1DE0" : "gIdentityMtx",
+ "D_801D1E20" : "gIdentityMtxF",
}
def replace_anim(file):
diff --git a/tools/disasm/dma_filenames.txt b/tools/disasm/dma_filenames.txt
index ecd43c82be..e9a743615f 100644
--- a/tools/disasm/dma_filenames.txt
+++ b/tools/disasm/dma_filenames.txt
@@ -37,7 +37,7 @@
'ovl_file_choose',
'ovl_daytelop',
'ovl_kaleido_scope',
- 'ovl_Player_Actor',
+ 'ovl_player_actor',
'ovl_En_Test',
'ovl_En_GirlA',
'ovl_En_Part',
diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt
index 52d498397e..586c2653be 100644
--- a/tools/disasm/files.txt
+++ b/tools/disasm/files.txt
@@ -483,7 +483,7 @@
0x8018B0F0 : "audio_heap",
0x8018EB60 : "audio_load",
0x80192BE0 : "code_80192BE0",
- 0x80194710 : "code_80194710",
+ 0x80194710 : "audio_dcache",
0x80194790 : "code_80194790",
0x80194930 : "audio_playback",
0x80196A00 : "audio_effects",
@@ -678,6 +678,7 @@
# .bss section
0x801E3FA0 : "code_801E3FA0",
0x801E3FB0 : "z_effect",
+ 0x801ED890 : "flg_set",
0x801ED8A0 : "z_actor",
0x801ED930 : "z_actor_dlftbls",
0x801ED950 : "z_bgcheck",
@@ -740,7 +741,7 @@
['ovl_file_choose', 'baserom/', 'overlay', [], { 0x80804010 : "ovl_file_choose" }],
['ovl_daytelop', 'baserom/', 'overlay', [], { 0x80814EB0 : "ovl_daytelop" }],
['ovl_kaleido_scope', 'baserom/', 'overlay', [], { 0x808160A0 : "ovl_kaleido_scope" }],
- ['ovl_Player_Actor', 'baserom/', 'overlay', [], { 0x8082DA90 : "ovl_Player_Actor" }],
+ ['ovl_player_actor', 'baserom/', 'overlay', [], { 0x8082DA90 : "ovl_player_actor" }],
['ovl_En_Test', 'baserom/', 'overlay', [], { 0x80862B70 : "ovl_En_Test" }],
['ovl_En_GirlA', 'baserom/', 'overlay', [], { 0x80863870 : "ovl_En_GirlA" }],
['ovl_En_Part', 'baserom/', 'overlay', [], { 0x80865370 : "ovl_En_Part" }],
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index eb59c8aa87..60616c5a77 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -511,28 +511,28 @@
0x800A8150:("func_800A8150",),
0x800A817C:("func_800A817C",),
0x800A81A4:("func_800A81A4",),
- 0x800A81F0:("func_800A81F0",),
- 0x800A8514:("func_800A8514",),
- 0x800A8558:("EffectBlure_Initcommon",),
+ 0x800A81F0:("EffectBlure_AddVertex",),
+ 0x800A8514:("EffectBlure_AddSpace",),
+ 0x800A8558:("EffectBlure_InitElements",),
0x800A8610:("EffectBlure_Init1",),
0x800A8720:("EffectBlure_Init2",),
0x800A8854:("EffectBlure_Destroy",),
0x800A8860:("EffectBlure_Update",),
- 0x800A8C78:("func_800A8C78",),
- 0x800A8DE8:("func_800A8DE8",),
- 0x800A92FC:("func_800A92FC",),
- 0x800A9330:("func_800A9330",),
- 0x800A9804:("func_800A9804",),
- 0x800AA190:("func_800AA190",),
- 0x800AA460:("func_800AA460",),
- 0x800AA498:("func_800AA498",),
- 0x800AA700:("func_800AA700",),
- 0x800AABE0:("func_800AABE0",),
+ 0x800A8C78:("EffectBlure_UpdateFlags",),
+ 0x800A8DE8:("EffectBlure_GetComputedValues",),
+ 0x800A92FC:("EffectBlure_SetupSmooth",),
+ 0x800A9330:("EffectBlure_DrawElemNoInterpolation",),
+ 0x800A9804:("EffectBlure_DrawElemHermiteInterpolation",),
+ 0x800AA190:("EffectBlure_DrawSmooth",),
+ 0x800AA460:("EffectBlure_SetupSimple",),
+ 0x800AA498:("EffectBlure_SetupSimpleAlt",),
+ 0x800AA700:("EffectBlure_DrawSimpleVertices",),
+ 0x800AABE0:("EffectBlure_DrawSimple",),
0x800AB0EC:("EffectBlure_Draw",),
0x800AB5D0:("EffectShieldParticle_Init",),
0x800AB808:("EffectShieldParticle_Destroy",),
0x800AB894:("EffectShieldParticle_Update",),
- 0x800AB9F8:("EffectShieldParticle_CalculateColors",),
+ 0x800AB9F8:("EffectShieldParticle_GetColors",),
0x800AC718:("EffectShieldParticle_Draw",),
0x800ACBF0:("EffectSpark_Init",),
0x800ACFCC:("EffectSpark_Destroy",),
@@ -546,15 +546,15 @@
0x800AE8EC:("func_800AE8EC",),
0x800AE930:("func_800AE930",),
0x800AEF44:("func_800AEF44",),
- 0x800AEF70:("EffectTireMark_InitParticle",),
+ 0x800AEF70:("EffectTireMark_InitElement",),
0x800AEFA0:("EffectTireMark_Init",),
0x800AF044:("EffectTireMark_Destroy",),
0x800AF050:("EffectTireMark_Update",),
- 0x800AF284:("EffectTireMark_InitVertices",),
+ 0x800AF284:("EffectTireMark_SetVertices",),
0x800AF310:("EffectTireMark_Draw",),
- 0x800AF710:("Effect_GetContext",),
- 0x800AF720:("Effect_GetParams",),
- 0x800AF87C:("Effect_InitCommon",),
+ 0x800AF710:("Effect_GetGlobalCtx",),
+ 0x800AF720:("Effect_GetByIndex",),
+ 0x800AF87C:("Effect_InitStatus",),
0x800AF890:("Effect_Init",),
0x800AF960:("Effect_Add",),
0x800AFB24:("Effect_DrawAll",),
@@ -1700,8 +1700,8 @@
0x800F470C:("Jpeg_Decode",),
0x800F4A10:("func_800F4A10",),
0x800F4C0C:("func_800F4C0C",),
- 0x800F4E20:("func_800F4E20",),
- 0x800F4F28:("func_800F4F28",),
+ 0x800F4E20:("KaleidoSetup_Init",),
+ 0x800F4F28:("KaleidoSetup_Destroy",),
0x800F4F40:("Font_LoadChar",),
0x800F4F54:("Font_LoadCharNES",),
0x800F4FC0:("Font_LoadMessageBoxEndIcon",),
@@ -2925,17 +2925,17 @@
0x801631DC:("func_801631DC",),
0x80163334:("func_80163334",),
0x80163660:("func_80163660",),
- 0x80163700:("func_80163700",),
- 0x80163758:("func_80163758",),
- 0x801637B4:("func_801637B4",),
- 0x80163804:("func_80163804",),
- 0x8016388C:("func_8016388C",),
- 0x801638D8:("func_801638D8",),
- 0x801639A0:("func_801639A0",),
- 0x801639EC:("func_801639EC",),
- 0x80163A38:("func_80163A38",),
- 0x80163A58:("func_80163A58",),
- 0x80163C0C:("func_80163C0C",),
+ 0x80163700:("KaleidoManager_FaultAddrConvFunc",),
+ 0x80163758:("KaleidoManager_LoadOvl",),
+ 0x801637B4:("KaleidoManager_ClearOvl",),
+ 0x80163804:("KaleidoManager_Init",),
+ 0x8016388C:("KaleidoManager_Destroy",),
+ 0x801638D8:("KaleidoManager_GetRamAddr",),
+ 0x801639A0:("KaleidoScopeCall_LoadPlayer",),
+ 0x801639EC:("KaleidoScopeCall_Init",),
+ 0x80163A38:("KaleidoScopeCall_Destroy",),
+ 0x80163A58:("KaleidoScopeCall_Update",),
+ 0x80163C0C:("KaleidoScopeCall_Draw",),
0x80163C90:("func_80163C90",),
0x80163D80:("func_80163D80",),
0x80163DC0:("func_80163DC0",),
@@ -3720,8 +3720,8 @@
0x80194568:("func_80194568",),
0x80194668:("func_80194668",),
0x801946E4:("func_801946E4",),
- 0x80194710:("func_80194710",),
- 0x80194750:("func_80194750",),
+ 0x80194710:("Audio_InvalDCache",),
+ 0x80194750:("Audio_WritebackDCache",),
0x80194790:("func_80194790",),
0x80194804:("func_80194804",),
0x80194840:("func_80194840",),
@@ -4240,10 +4240,10 @@
0x808274DC:("func_808274DC",),
0x80827A8C:("func_80827A8C",),
0x80827E08:("func_80827E08",),
- 0x808283D8:("func_808283D8",),
+ 0x808283D8:("KaleidoScope_Draw",),
0x808286D8:("func_808286D8",),
0x80828788:("func_80828788",),
- 0x8082895C:("func_8082895C",),
+ 0x8082895C:("KaleidoScope_Update",),
0x8082DA90:("func_8082DA90",),
0x8082DABC:("func_8082DABC",),
0x8082DAD4:("func_8082DAD4",),
@@ -4991,8 +4991,8 @@
0x80869D90:("EnPametfrog_Init",),
0x80869F90:("EnPametfrog_Destroy",),
0x80869FBC:("EnPametfrog_Vec3fNormalize",),
- 0x8086A024:("EnPametfrog_ChangeColliderFreeze",),
- 0x8086A068:("EnPametfrog_ChangeColliderThaw",),
+ 0x8086A024:("EnPametfrog_Freeze",),
+ 0x8086A068:("EnPametfrog_Thaw",),
0x8086A0F4:("EnPametfrog_JumpWaterEffects",),
0x8086A1A0:("EnPametfrog_IdleWaterEffects",),
0x8086A238:("func_8086A238",),
@@ -5419,7 +5419,7 @@
0x8088FE64:("func_8088FE64",),
0x8089010C:("func_8089010C",),
0x80890438:("EnElf_Update",),
- 0x80890494:("func_80890494",),
+ 0x80890494:("EnElf_OverrideLimbDraw",),
0x808905B8:("EnElf_Draw",),
0x808908D0:("func_808908D0",),
0x80891060:("EnNiw_Init",),
@@ -6671,7 +6671,7 @@
0x808EC990:("func_808EC990",),
0x808ECD14:("func_808ECD14",),
0x808ED07C:("func_808ED07C",),
- 0x808ED138:("EnBigslime_Draw",),
+ 0x808ED138:("EnBigslime_DrawGekko",),
0x808ED3F4:("func_808ED3F4",),
0x808F1200:("EnKarebaba_Init",),
0x808F1334:("EnKarebaba_Destroy",),
@@ -9031,9 +9031,9 @@
0x809C3190:("EnAob01_Init",),
0x809C3350:("EnAob01_Destroy",),
0x809C339C:("EnAob01_Update",),
- 0x809C33D8:("func_809C33D8",),
- 0x809C35B4:("func_809C35B4",),
- 0x809C35F4:("func_809C35F4",),
+ 0x809C33D8:("EnAob01_OverrideLimbDraw",),
+ 0x809C35B4:("EnAob01_PostLimbDraw",),
+ 0x809C35F4:("EnAob01_UnkDraw",),
0x809C3608:("EnAob01_Draw",),
0x809C3D80:("EnBoj01_Init",),
0x809C3D90:("EnBoj01_Destroy",),
@@ -14161,7 +14161,7 @@
0x80B610B8:("ObjDora_Draw",),
0x80B615E0:("EnBigpo_Init",),
0x80B6186C:("EnBigpo_Destroy",),
- 0x80B61914:("func_80B61914",),
+ 0x80B61914:("EnBigpo_RotateSpawnCutsceneFires",),
0x80B619B4:("func_80B619B4",),
0x80B619FC:("func_80B619FC",),
0x80B61AC8:("EnBigPo_InitWellBigPo",),
@@ -14404,8 +14404,8 @@
0x80B72880:("func_80B72880",),
0x80B72970:("func_80B72970",),
0x80B72DBC:("EnRailSkb_Update",),
- 0x80B72E88:("func_80B72E88",),
- 0x80B7302C:("func_80B7302C",),
+ 0x80B72E88:("EnRailSkb_OverrideLimbDraw",),
+ 0x80B7302C:("EnRailSkb_PostLimbDraw",),
0x80B731EC:("EnRailSkb_Draw",),
0x80B73A90:("func_80B73A90",),
0x80B73AE4:("func_80B73AE4",),
@@ -16272,9 +16272,9 @@
0x80BEFD98:("EnAkindonuts_Init",),
0x80BEFF08:("EnAkindonuts_Destroy",),
0x80BEFF34:("EnAkindonuts_Update",),
- 0x80BEFFB4:("func_80BEFFB4",),
- 0x80BF0178:("func_80BF0178",),
- 0x80BF0190:("func_80BF0190",),
+ 0x80BEFFB4:("EnAkindonuts_OverrideLimbDraw",),
+ 0x80BF0178:("EnAkindonuts_PostLimbDraw",),
+ 0x80BF0190:("EnAkindonuts_UnkActorDraw",),
0x80BF0258:("EnAkindonuts_Draw",),
0x80BF0D90:("EffStk_Init",),
0x80BF0DD0:("EffStk_Destroy",),
@@ -16515,7 +16515,7 @@
0x80C02CA4:("func_80C02CA4",),
0x80C02DAC:("func_80C02DAC",),
0x80C02DC4:("EnBomjimb_Update",),
- 0x80C02FA8:("func_80C02FA8",),
+ 0x80C02FA8:("EnBomjimb_OverrideLimbDraw",),
0x80C03034:("EnBomjimb_Draw",),
0x80C03530:("EnBombers_Init",),
0x80C037F8:("EnBombers_Destroy",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index 8e75b9cbd4..44d1683d4f 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -397,7 +397,7 @@
0x801AE2CC:("D_801AE2CC","UNK_TYPE4","",0x4),
0x801AE2DC:("D_801AE2DC","UNK_TYPE4","",0x4),
0x801AE2F0:("sEffectShieldParticleVertices","F3DVertex","[4]",0x40),
- 0x801AE330:("sEffInfoTable","EffInfo","[5]",0x64),
+ 0x801AE330:("sEffectInfoTable","EffectInfo","[5]",0x64),
0x801AE3A0:("EffectSS2Info","EffectSsInfo","",0xc),
0x801AE3B0:("D_801AE3B0","Color_RGBA8","",0x4),
0x801AE3B4:("D_801AE3B4","Color_RGBA8","",0x4),
@@ -882,8 +882,8 @@
0x801BA484:("defaultColChkInfo","CollisionCheckInfo","",0x1c),
0x801BA4A0:("sApplyDamageFuncs","ColChkApplyFunc","",0x14),
0x801BA4B4:("sOCLineCheckFuncs","ColChkLineFunc","",0x14),
- 0x801BA4C8:("shieldParticleInitMetal","EffShieldParticleInit","",0x40),
- 0x801BA508:("shieldParticleInitWood","EffShieldParticleInit","",0x40),
+ 0x801BA4C8:("shieldParticleInitMetal","EffectShieldParticleInit","",0x40),
+ 0x801BA508:("shieldParticleInitWood","EffectShieldParticleInit","",0x40),
0x801BA550:("D_801BA550","UNK_TYPE1","",0x1),
0x801BA750:("D_801BA750","UNK_TYPE1","",0x1),
0x801BA790:("sDebugDisplay1DL","UNK_TYPE1","",0x1),
@@ -2169,9 +2169,9 @@
0x801D08E8:("D_801D08E8","UNK_TYPE1","",0x1),
0x801D0900:("D_801D0900","UNK_TYPE1","",0x1),
0x801D0B50:("Player_InitVars","ActorInit","",0x20),
- 0x801D0B70:("D_801D0B70","UNK_TYPE1","",0x38),
- 0x801D0BA8:("D_801D0BA8","UNK_TYPE4","",0x4),
- 0x801D0BAC:("D_801D0BAC","UNK_TYPE4","",0x4),
+ 0x801D0B70:("gKaleidoMgrOverlayTable","KaleidoMgrOverlay","",0x38),
+ 0x801D0BA8:("sKaleidoAreaPtr","void*","",0x4),
+ 0x801D0BAC:("gKaleidoMgrCurOvl","KaleidoMgrOverlay*","",0x4),
0x801D0BB0:("D_801D0BB0","UNK_TYPE4","",0x4),
0x801D0C80:("D_801D0C80","UNK_TYPE1","",0x1),
0x801D0CB0:("D_801D0CB0","UNK_TYPE1","",0x1),
@@ -2245,11 +2245,11 @@
0x801D1538:("D_801D1538","UNK_TYPE4","",0x4),
0x801D1540:("D_801D1540","UNK_PTR","",0x4),
0x801D1570:("D_801D1570","f32","[13]",0x34),
- 0x801D15B0:("D_801D15B0","Vec3f","",0xC),
- 0x801D15BC:("D_801D15BC","UNK_TYPE4","",0x4),
+ 0x801D15B0:("gZeroVec3f","Vec3f","",0xC),
+ 0x801D15BC:("gZeroVec3s","Vec3s","",0x6),
0x801D15D0:("sATan2Tbl","s16","[1025]",0x802),
- 0x801D1DE0:("D_801D1DE0","Mtx","",0x40),
- 0x801D1E20:("D_801D1E20","MtxF","",0x40),
+ 0x801D1DE0:("gIdentityMtx","Mtx","",0x40),
+ 0x801D1E20:("gIdentityMtxF","MtxF","",0x40),
0x801D1E60:("initialgspUcodeText","UNK_PTR","",0x4),
0x801D1E64:("initialgspUcodeData","UNK_PTR","",0x4),
0x801D1E70:("D_801D1E70","UNK_TYPE1","",0x1),
@@ -3887,7 +3887,7 @@
0x801E3BB0:("D_801E3BB0","UNK_TYPE1","",0x1),
0x801E3F40:("gJpegUCodeData","UNK_TYPE1","",0x1),
0x801E3FA0:("D_801E3FA0","UNK_TYPE1","",0x1),
- 0x801E3FB0:("sEffTable","EffTables","",0x98E0),
+ 0x801E3FB0:("sEffectContext","EffectContext","",0x98E0),
0x801ED890:("D_801ED890","UNK_TYPE1","",0x1),
0x801ED894:("D_801ED894","UNK_TYPE1","",0x1),
0x801ED8A0:("D_801ED8A0","UNK_TYPE1","",0x1),
@@ -3972,12 +3972,12 @@
0x801EE1D0:("D_801EE1D0","Vec3f","",0xc),
0x801EE1E0:("D_801EE1E0","Vec3f","",0xc),
0x801EE1F0:("D_801EE1F0","Vec3f","",0xc),
- 0x801EE200:("D_801EE200","EffSparkParams","",0x4c4),
+ 0x801EE200:("D_801EE200","EffectSparkInit","",0x4c4),
0x801EE6C8:("D_801EE6C8","TriNorm","",0x34),
0x801EE700:("D_801EE700","TriNorm","",0x34),
- 0x801EE738:("D_801EE738","EffSparkParams","",0x4c4),
- 0x801EEC00:("D_801EEC00","EffSparkParams","",0x4c4),
- 0x801EF0C8:("D_801EF0C8","EffSparkParams","",0x4c4),
+ 0x801EE738:("D_801EE738","EffectSparkInit","",0x4c4),
+ 0x801EEC00:("D_801EEC00","EffectSparkInit","",0x4c4),
+ 0x801EF0C8:("D_801EF0C8","EffectSparkInit","",0x4c4),
0x801EF590:("D_801EF590","UNK_TYPE1","",0x1),
0x801EF5C8:("D_801EF5C8","UNK_TYPE1","",0x1),
0x801EF600:("D_801EF600","TriNorm","",0x34),
@@ -4117,9 +4117,9 @@
0x801F6B44:("gShrinkWindowContextPtr","ShrinkWindowContext*","",0x4),
0x801F6B50:("D_801F6B50","UNK_TYPE4","",0x4),
0x801F6B58:("D_801F6B58","UNK_TYPE1","",0x1),
- 0x801F6BF0:("D_801F6BF0","UNK_TYPE1","",0x1),
- 0x801F6C00:("D_801F6C00","UNK_TYPE1","",0x1),
- 0x801F6C04:("D_801F6C04","UNK_TYPE1","",0x1),
+ 0x801F6BF0:("sKaleidoAreaFaultClient","FaultAddrConvClient","",0xC),
+ 0x801F6C00:("sKaleidoScopeUpdateFunc","void*","",0x4),
+ 0x801F6C04:("sKaleidoScopeDrawFunc","void*","",0x4),
0x801F6C10:("D_801F6C10","UNK_TYPE1","",0x1),
0x801F6C18:("D_801F6C18","Input","",0x18),
0x801F6C30:("D_801F6C30","UNK_TYPE1","",0x1),
@@ -5321,8 +5321,8 @@
0x8085D2C0:("D_8085D2C0","ActorInitVar","",0x4),
0x8085D2C4:("D_8085D2C4","UNK_TYPE4","",0x4),
0x8085D2CC:("D_8085D2CC","UNK_PTR","",0x4),
- 0x8085D30C:("D_8085D30C","EffBlureInit2","",0x24),
- 0x8085D330:("D_8085D330","EffTireMarkInit","",0x8),
+ 0x8085D30C:("D_8085D30C","EffectBlureInit2","",0x24),
+ 0x8085D330:("D_8085D330","EffectTireMarkInit","",0x8),
0x8085D338:("D_8085D338","UNK_TYPE4","",0x4),
0x8085D33C:("D_8085D33C","UNK_TYPE4","",0x4),
0x8085D340:("D_8085D340","UNK_TYPE1","",0x1),
@@ -5972,7 +5972,7 @@
0x808792D4:("D_808792D4","UNK_TYPE1","",0x1),
0x808792F4:("D_808792F4","UNK_TYPE1","",0x1),
0x808792FC:("D_808792FC","UNK_TYPE1","",0x1),
- 0x80879308:("D_80879308","EffBlureInit2","",0x24),
+ 0x80879308:("D_80879308","EffectBlureInit2","",0x24),
0x8087932C:("D_8087932C","UNK_TYPE1","",0x1),
0x80879330:("D_80879330","UNK_TYPE1","",0x1),
0x80879334:("D_80879334","UNK_TYPE1","",0x1),
@@ -6197,10 +6197,10 @@
0x8088C1C0:("En_Arrow_InitVars","UNK_TYPE1","",0x1),
0x8088C1E0:("D_8088C1E0","UNK_TYPE1","",0x1),
0x8088C230:("D_8088C230","UNK_TYPE1","",0x1),
- 0x8088C234:("D_8088C234","EffBlureInit2","",0x24),
- 0x8088C258:("D_8088C258","EffBlureInit2","",0x24),
- 0x8088C27C:("D_8088C27C","EffBlureInit2","",0x24),
- 0x8088C2A0:("D_8088C2A0","EffBlureInit2","",0x24),
+ 0x8088C234:("D_8088C234","EffectBlureInit2","",0x24),
+ 0x8088C258:("D_8088C258","EffectBlureInit2","",0x24),
+ 0x8088C27C:("D_8088C27C","EffectBlureInit2","",0x24),
+ 0x8088C2A0:("D_8088C2A0","EffectBlureInit2","",0x24),
0x8088C2C4:("D_8088C2C4","UNK_TYPE4","",0x4),
0x8088C2CC:("D_8088C2CC","UNK_TYPE1","",0x1),
0x8088C2D8:("D_8088C2D8","UNK_TYPE1","",0x1),
@@ -6409,7 +6409,7 @@
0x8089E350:("D_8089E350","UNK_TYPE4","",0x4),
0x8089E354:("D_8089E354","UNK_TYPE1","",0x1),
0x8089E364:("D_8089E364","UNK_TYPE4","",0x4),
- 0x8089E368:("D_8089E368","EffBlureInit2","",0x24),
+ 0x8089E368:("D_8089E368","EffectBlureInit2","",0x24),
0x8089E38C:("D_8089E38C","UNK_TYPE1","",0x1),
0x8089E398:("D_8089E398","UNK_TYPE1","",0x1),
0x8089E3A4:("D_8089E3A4","UNK_TYPE1","",0x1),
@@ -6735,10 +6735,8 @@
0x808BBB20:("Door_Warp1_InitVars","UNK_TYPE1","",0x1),
0x808BBB40:("D_808BBB40","UNK_TYPE1","",0x1),
0x808BBB50:("D_808BBB50","UNK_TYPE4","",0x4),
- 0x808BBB5C:("D_808BBB5C","f32","",0x4),
- 0x808BBB64:("D_808BBB64","f32","",0x4),
- 0x808BBB68:("D_808BBB68","UNK_TYPE1","",0x1),
- 0x808BBB6C:("D_808BBB6C","f32","",0x4),
+ 0x808BBB5C:("D_808BBB5C","Vec3f","",0xC),
+ 0x808BBB68:("D_808BBB68","Vec3f","",0xC),
0x808BBB80:("jtbl_808BBB80","UNK_PTR","",0x4),
0x808BBB98:("jtbl_808BBB98","UNK_PTR","",0x4),
0x808BBBB4:("D_808BBBB4","f32","",0x4),
@@ -6898,7 +6896,7 @@
0x808C99C0:("D_808C99C0","UNK_TYPE1","",0x1),
0x808C9A10:("D_808C9A10","UNK_TYPE1","",0x1),
0x808C9A30:("D_808C9A30","UNK_TYPE1","",0x1),
- 0x808C9A3C:("D_808C9A3C","EffBlureInit2","",0x24),
+ 0x808C9A3C:("D_808C9A3C","EffectBlureInit2","",0x24),
0x808C9A60:("D_808C9A60","UNK_TYPE1","",0x1),
0x808C9A70:("D_808C9A70","UNK_TYPE1","",0x1),
0x808C9A7C:("D_808C9A7C","UNK_TYPE1","",0x1),
@@ -7473,7 +7471,7 @@
0x808F88C0:("En_Bom_Chu_InitVars","UNK_TYPE1","",0x1),
0x808F88E0:("D_808F88E0","UNK_TYPE1","",0x1),
0x808F8908:("D_808F8908","UNK_TYPE2","",0x2),
- 0x808F8914:("D_808F8914","EffBlureInit2","",0x24),
+ 0x808F8914:("D_808F8914","EffectBlureInit2","",0x24),
0x808F8938:("D_808F8938","UNK_TYPE1","",0x1),
0x808F8944:("D_808F8944","UNK_TYPE1","",0x1),
0x808F8950:("D_808F8950","UNK_TYPE1","",0x1),
@@ -8282,7 +8280,7 @@
0x8092C140:("D_8092C140","UNK_TYPE1","",0x1),
0x8092C160:("D_8092C160","UNK_TYPE1","",0x1),
0x8092C168:("D_8092C168","UNK_TYPE1","",0x1),
- 0x8092C174:("D_8092C174","EffBlureInit2","",0x24),
+ 0x8092C174:("D_8092C174","EffectBlureInit2","",0x24),
0x8092C198:("D_8092C198","UNK_TYPE4","",0x4),
0x8092C19C:("D_8092C19C","UNK_TYPE1","",0x1),
0x8092C1A8:("D_8092C1A8","UNK_TYPE1","",0x1),
@@ -8594,7 +8592,7 @@
0x80942E60:("D_80942E60","UNK_TYPE1","",0x1),
0x80942E6C:("D_80942E6C","UNK_TYPE1","",0x1),
0x80942E78:("D_80942E78","UNK_TYPE1","",0x1),
- 0x80942E8C:("D_80942E8C","EffTireMarkInit","",0x8),
+ 0x80942E8C:("D_80942E8C","EffectTireMarkInit","",0x8),
0x80942E94:("D_80942E94","UNK_TYPE1","",0x1),
0x80942E9C:("D_80942E9C","UNK_TYPE1","",0x1),
0x80942EAC:("D_80942EAC","UNK_TYPE1","",0x1),
@@ -10700,8 +10698,8 @@
0x80A07F0C:("D_80A07F0C","UNK_TYPE1","",0x1),
0x80A07F3C:("D_80A07F3C","UNK_TYPE1","",0x1),
0x80A07F54:("D_80A07F54","UNK_TYPE2","",0x2),
- 0x80A07F5C:("D_80A07F5C","EffTireMarkInit","",0x8),
- 0x80A07F64:("D_80A07F64","EffTireMarkInit","",0x8),
+ 0x80A07F5C:("D_80A07F5C","EffectTireMarkInit","",0x8),
+ 0x80A07F64:("D_80A07F64","EffectTireMarkInit","",0x8),
0x80A07F6C:("D_80A07F6C","UNK_TYPE4","",0x4),
0x80A07FA8:("D_80A07FA8","UNK_TYPE4","",0x4),
0x80A07FB4:("D_80A07FB4","UNK_TYPE4","",0x4),
@@ -11024,7 +11022,7 @@
0x80A166B0:("D_80A166B0","UNK_TYPE1","",0x1),
0x80A166BC:("D_80A166BC","UNK_TYPE1","",0x1),
0x80A166D4:("D_80A166D4","UNK_TYPE1","",0x1),
- 0x80A166DC:("D_80A166DC","EffTireMarkInit","",0x8),
+ 0x80A166DC:("D_80A166DC","EffectTireMarkInit","",0x8),
0x80A166E4:("D_80A166E4","UNK_TYPE4","",0x4),
0x80A16704:("D_80A16704","UNK_TYPE1","",0x1),
0x80A1670C:("D_80A1670C","UNK_TYPE1","",0x1),
@@ -11685,8 +11683,8 @@
0x80A4169C:("D_80A4169C","UNK_PTR","",0x4),
0x80A416C0:("D_80A416C0","UNK_PTR","",0x4),
0x80A416E0:("D_80A416E0","UNK_TYPE1","",0x1),
- 0x80A417BC:("D_80A417BC","EffBlureInit2","",0x24),
- 0x80A417E0:("D_80A417E0","EffTireMarkInit","",0x8),
+ 0x80A417BC:("D_80A417BC","EffectBlureInit2","",0x24),
+ 0x80A417E0:("D_80A417E0","EffectTireMarkInit","",0x8),
0x80A417E8:("D_80A417E8","UNK_TYPE1","",0x1),
0x80A417EC:("D_80A417EC","UNK_PTR","",0x4),
0x80A41828:("D_80A41828","UNK_TYPE1","",0x1),
@@ -11992,7 +11990,7 @@
0x80A5844C:("D_80A5844C","UNK_TYPE1","",0x1),
0x80A58454:("D_80A58454","UNK_TYPE4","",0x4),
0x80A58464:("D_80A58464","UNK_TYPE1","",0x1),
- 0x80A58470:("D_80A58470","EffBlureInit2","",0x24),
+ 0x80A58470:("D_80A58470","EffectBlureInit2","",0x24),
0x80A58494:("D_80A58494","UNK_TYPE4","",0x4),
0x80A58498:("D_80A58498","UNK_TYPE1","",0x1),
0x80A584A4:("D_80A584A4","UNK_TYPE1","",0x1),
@@ -14585,7 +14583,7 @@
0x80B40780:("D_80B40780","UNK_TYPE1","",0x1),
0x80B43250:("En_Kgy_InitVars","UNK_TYPE1","",0x1),
0x80B43270:("D_80B43270","UNK_TYPE1","",0x1),
- 0x80B43298:("D_80B43298","EffShieldParticleInit","",0x40),
+ 0x80B43298:("D_80B43298","EffectShieldParticleInit","",0x40),
0x80B432C6:("D_80B432C6","UNK_TYPE1","",0x1),
0x80B432C8:("D_80B432C8","UNK_TYPE1","",0x1),
0x80B432CA:("D_80B432CA","UNK_TYPE1","",0x1),
@@ -15797,7 +15795,7 @@
0x80BB3ED4:("D_80BB3ED4","UNK_TYPE1","",0x1),
0x80BB3EF4:("D_80BB3EF4","UNK_TYPE1","",0x1),
0x80BB4044:("D_80BB4044","UNK_TYPE1","",0x1),
- 0x80BB405C:("D_80BB405C","EffTireMarkInit","",0x8),
+ 0x80BB405C:("D_80BB405C","EffectTireMarkInit","",0x8),
0x80BB4064:("D_80BB4064","UNK_TYPE4","",0x4),
0x80BB4070:("D_80BB4070","UNK_TYPE4","",0x4),
0x80BB407C:("D_80BB407C","UNK_TYPE1","",0x1),
@@ -16449,7 +16447,7 @@
0x80BF5954:("D_80BF5954","UNK_TYPE1","",0x1),
0x80BF5960:("D_80BF5960","UNK_TYPE1","",0x1),
0x80BF596C:("D_80BF596C","UNK_TYPE1","",0x1),
- 0x80BF59F0:("D_80BF59F0","EffTireMarkInit","",0x8),
+ 0x80BF59F0:("D_80BF59F0","EffectTireMarkInit","",0x8),
0x80BF59F8:("D_80BF59F8","UNK_TYPE1","",0x1),
0x80BF5A10:("D_80BF5A10","f32","",0x4),
0x80BF5A14:("D_80BF5A14","f32","",0x4),
diff --git a/tools/extract_baserom.py b/tools/extract_baserom.py
index a2734d9003..bf9829bcb3 100755
--- a/tools/extract_baserom.py
+++ b/tools/extract_baserom.py
@@ -44,7 +44,7 @@ FILE_NAMES = [
'ovl_file_choose',
'ovl_daytelop',
'ovl_kaleido_scope',
- 'ovl_Player_Actor',
+ 'ovl_player_actor',
'ovl_En_Test',
'ovl_En_GirlA',
'ovl_En_Part',
diff --git a/tools/filelists/mm.us.rev1/all.csv b/tools/filelists/mm.us.rev1/all.csv
index 836f6d1722..b76d241e19 100644
--- a/tools/filelists/mm.us.rev1/all.csv
+++ b/tools/filelists/mm.us.rev1/all.csv
@@ -36,7 +36,7 @@
35,ovl_file_choose
36,ovl_daytelop
37,ovl_kaleido_scope
-38,ovl_Player_Actor
+38,ovl_player_actor
39,ovl_En_Test
40,ovl_En_GirlA
41,ovl_En_Part
diff --git a/tools/filelists/mm.us.rev1/overlay.csv b/tools/filelists/mm.us.rev1/overlay.csv
index 84943c7942..a0ec8a58db 100644
--- a/tools/filelists/mm.us.rev1/overlay.csv
+++ b/tools/filelists/mm.us.rev1/overlay.csv
@@ -4,7 +4,7 @@
35,ovl_file_choose
36,ovl_daytelop
37,ovl_kaleido_scope
-38,ovl_Player_Actor
+38,ovl_player_actor
39,ovl_En_Test
40,ovl_En_GirlA
41,ovl_En_Part
diff --git a/tools/overlayhelpers/actor_symbols.py b/tools/overlayhelpers/actor_symbols.py
index 88aa8aa402..e3f079ad92 100755
--- a/tools/overlayhelpers/actor_symbols.py
+++ b/tools/overlayhelpers/actor_symbols.py
@@ -3,7 +3,7 @@
import argparse, os, struct
actor_names = [
- "ovl_Player_Actor",
+ "ovl_player_actor",
"ovl_En_Test",
"ovl_En_GirlA",
"ovl_En_Part",
@@ -719,7 +719,7 @@ def read_actor_ovl_tbl():
actortbl.append((actor_names[i], entry[0], entry[1], entry[2], entry[3]))
entry = as_word_list(codefile.read(0x20))
i += 1
- actortbl[0] = ['ovl_Player_Actor', 0xCA7F00, 0xCDCF60, 0x8082DA90, 0x80862B70 ]
+ actortbl[0] = ['ovl_player_actor', 0xCA7F00, 0xCDCF60, 0x8082DA90, 0x80862B70 ]
return actortbl
actor_tbl = read_actor_ovl_tbl()
diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv
index 8a0090f845..02830ae3be 100644
--- a/tools/sizes/code_functions.csv
+++ b/tools/sizes/code_functions.csv
@@ -25,28 +25,28 @@ asm/non_matchings/code/z_en_item00/Item_DropCollectibleRandom.s,Item_DropCollect
asm/non_matchings/code/z_en_item00/func_800A8150.s,func_800A8150,0x800A8150,0xB
asm/non_matchings/code/z_en_item00/func_800A817C.s,func_800A817C,0x800A817C,0xA
asm/non_matchings/code/z_en_item00/func_800A81A4.s,func_800A81A4,0x800A81A4,0x13
-asm/non_matchings/code/z_eff_blure/func_800A81F0.s,func_800A81F0,0x800A81F0,0xC9
-asm/non_matchings/code/z_eff_blure/func_800A8514.s,func_800A8514,0x800A8514,0x11
-asm/non_matchings/code/z_eff_blure/EffectBlure_Initcommon.s,EffectBlure_Initcommon,0x800A8558,0x2E
+asm/non_matchings/code/z_eff_blure/EffectBlure_AddVertex.s,EffectBlure_AddVertex,0x800A81F0,0xC9
+asm/non_matchings/code/z_eff_blure/EffectBlure_AddSpace.s,EffectBlure_AddSpace,0x800A8514,0x11
+asm/non_matchings/code/z_eff_blure/EffectBlure_InitElements.s,EffectBlure_InitElements,0x800A8558,0x2E
asm/non_matchings/code/z_eff_blure/EffectBlure_Init1.s,EffectBlure_Init1,0x800A8610,0x44
asm/non_matchings/code/z_eff_blure/EffectBlure_Init2.s,EffectBlure_Init2,0x800A8720,0x4D
asm/non_matchings/code/z_eff_blure/EffectBlure_Destroy.s,EffectBlure_Destroy,0x800A8854,0x3
asm/non_matchings/code/z_eff_blure/EffectBlure_Update.s,EffectBlure_Update,0x800A8860,0x106
-asm/non_matchings/code/z_eff_blure/func_800A8C78.s,func_800A8C78,0x800A8C78,0x5C
-asm/non_matchings/code/z_eff_blure/func_800A8DE8.s,func_800A8DE8,0x800A8DE8,0x145
-asm/non_matchings/code/z_eff_blure/func_800A92FC.s,func_800A92FC,0x800A92FC,0xD
-asm/non_matchings/code/z_eff_blure/func_800A9330.s,func_800A9330,0x800A9330,0x135
-asm/non_matchings/code/z_eff_blure/func_800A9804.s,func_800A9804,0x800A9804,0x263
-asm/non_matchings/code/z_eff_blure/func_800AA190.s,func_800AA190,0x800AA190,0xB4
-asm/non_matchings/code/z_eff_blure/func_800AA460.s,func_800AA460,0x800AA460,0xE
-asm/non_matchings/code/z_eff_blure/func_800AA498.s,func_800AA498,0x800AA498,0x9A
-asm/non_matchings/code/z_eff_blure/func_800AA700.s,func_800AA700,0x800AA700,0x138
-asm/non_matchings/code/z_eff_blure/func_800AABE0.s,func_800AABE0,0x800AABE0,0x143
+asm/non_matchings/code/z_eff_blure/EffectBlure_UpdateFlags.s,EffectBlure_UpdateFlags,0x800A8C78,0x5C
+asm/non_matchings/code/z_eff_blure/EffectBlure_GetComputedValues.s,EffectBlure_GetComputedValues,0x800A8DE8,0x145
+asm/non_matchings/code/z_eff_blure/EffectBlure_SetupSmooth.s,EffectBlure_SetupSmooth,0x800A92FC,0xD
+asm/non_matchings/code/z_eff_blure/EffectBlure_DrawElemNoInterpolation.s,EffectBlure_DrawElemNoInterpolation,0x800A9330,0x135
+asm/non_matchings/code/z_eff_blure/EffectBlure_DrawElemHermiteInterpolation.s,EffectBlure_DrawElemHermiteInterpolation,0x800A9804,0x263
+asm/non_matchings/code/z_eff_blure/EffectBlure_DrawSmooth.s,EffectBlure_DrawSmooth,0x800AA190,0xB4
+asm/non_matchings/code/z_eff_blure/EffectBlure_SetupSimple.s,EffectBlure_SetupSimple,0x800AA460,0xE
+asm/non_matchings/code/z_eff_blure/EffectBlure_SetupSimpleAlt.s,EffectBlure_SetupSimpleAlt,0x800AA498,0x9A
+asm/non_matchings/code/z_eff_blure/EffectBlure_DrawSimpleVertices.s,EffectBlure_DrawSimpleVertices,0x800AA700,0x138
+asm/non_matchings/code/z_eff_blure/EffectBlure_DrawSimple.s,EffectBlure_DrawSimple,0x800AABE0,0x143
asm/non_matchings/code/z_eff_blure/EffectBlure_Draw.s,EffectBlure_Draw,0x800AB0EC,0x139
asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Init.s,EffectShieldParticle_Init,0x800AB5D0,0x8E
asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Destroy.s,EffectShieldParticle_Destroy,0x800AB808,0x23
asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Update.s,EffectShieldParticle_Update,0x800AB894,0x59
-asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_CalculateColors.s,EffectShieldParticle_CalculateColors,0x800AB9F8,0x348
+asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_GetColors.s,EffectShieldParticle_GetColors,0x800AB9F8,0x348
asm/non_matchings/code/z_eff_shield_particle/EffectShieldParticle_Draw.s,EffectShieldParticle_Draw,0x800AC718,0x136
asm/non_matchings/code/z_eff_spark/EffectSpark_Init.s,EffectSpark_Init,0x800ACBF0,0xF7
asm/non_matchings/code/z_eff_spark/EffectSpark_Destroy.s,EffectSpark_Destroy,0x800ACFCC,0x3
@@ -60,15 +60,15 @@ asm/non_matchings/code/z_eff_ss_dead/func_800AE778.s,func_800AE778,0x800AE778,0x
asm/non_matchings/code/z_eff_ss_dead/func_800AE8EC.s,func_800AE8EC,0x800AE8EC,0x11
asm/non_matchings/code/z_eff_tire_mark/func_800AE930.s,func_800AE930,0x800AE930,0x185
asm/non_matchings/code/z_eff_tire_mark/func_800AEF44.s,func_800AEF44,0x800AEF44,0xB
-asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_InitParticle.s,EffectTireMark_InitParticle,0x800AEF70,0xC
+asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_InitElement.s,EffectTireMark_InitElement,0x800AEF70,0xC
asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Init.s,EffectTireMark_Init,0x800AEFA0,0x29
asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Destroy.s,EffectTireMark_Destroy,0x800AF044,0x3
asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Update.s,EffectTireMark_Update,0x800AF050,0x8D
-asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_InitVertices.s,EffectTireMark_InitVertices,0x800AF284,0x23
+asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_SetVertices.s,EffectTireMark_SetVertices,0x800AF284,0x23
asm/non_matchings/code/z_eff_tire_mark/EffectTireMark_Draw.s,EffectTireMark_Draw,0x800AF310,0x100
-asm/non_matchings/code/z_effect/Effect_GetContext.s,Effect_GetContext,0x800AF710,0x4
-asm/non_matchings/code/z_effect/Effect_GetParams.s,Effect_GetParams,0x800AF720,0x57
-asm/non_matchings/code/z_effect/Effect_InitCommon.s,Effect_InitCommon,0x800AF87C,0x5
+asm/non_matchings/code/z_effect/Effect_GetGlobalCtx.s,Effect_GetGlobalCtx,0x800AF710,0x4
+asm/non_matchings/code/z_effect/Effect_GetByIndex.s,Effect_GetByIndex,0x800AF720,0x57
+asm/non_matchings/code/z_effect/Effect_InitStatus.s,Effect_InitStatus,0x800AF87C,0x5
asm/non_matchings/code/z_effect/Effect_Init.s,Effect_Init,0x800AF890,0x34
asm/non_matchings/code/z_effect/Effect_Add.s,Effect_Add,0x800AF960,0x71
asm/non_matchings/code/z_effect/Effect_DrawAll.s,Effect_DrawAll,0x800AFB24,0x4F
@@ -3238,8 +3238,8 @@ asm/non_matchings/code/code_80192BE0/func_80194548.s,func_80194548,0x80194548,0x
asm/non_matchings/code/code_80192BE0/func_80194568.s,func_80194568,0x80194568,0x40
asm/non_matchings/code/code_80192BE0/func_80194668.s,func_80194668,0x80194668,0x1F
asm/non_matchings/code/code_80192BE0/func_801946E4.s,func_801946E4,0x801946E4,0xB
-asm/non_matchings/code/code_80194710/func_80194710.s,func_80194710,0x80194710,0x10
-asm/non_matchings/code/code_80194710/func_80194750.s,func_80194750,0x80194750,0x10
+asm/non_matchings/code/code_80194710/Audio_InvalDCache.s,Audio_InvalDCache,0x80194710,0x10
+asm/non_matchings/code/code_80194710/Audio_WritebackDCache.s,Audio_WritebackDCache,0x80194750,0x10
asm/non_matchings/code/code_80194710/func_80194790.s,func_80194790,0x80194790,0x1D
asm/non_matchings/code/code_80194710/func_80194804.s,func_80194804,0x80194804,0xF
asm/non_matchings/code/code_80194710/func_80194840.s,func_80194840,0x80194840,0x1C
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 441c2bcf21..ac2c75b358 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -881,6 +881,15 @@ D_06013058 = 0x06013058;
D_060006B0 = 0x060006B0;
D_060016DC = 0x060016DC;
+// ovl_Bg_Inibs_Movebg
+
+D_06001C10 = 0x06001C10;
+D_06001DC0 = 0x06001DC0;
+D_06002598 = 0x06002598;
+D_06006140 = 0x06006140;
+D_060062D8 = 0x060062D8;
+D_06006858 = 0x06006858;
+
// ovl_Bg_Keikoku_Saku
D_06001640 = 0x06001640;
@@ -1479,17 +1488,11 @@ D_06013EA8 = 0x06013EA8;
// ovl_Door_Warp1
-D_060001A0 = 0x060001A0;
-D_06001374 = 0x06001374;
-D_06002CA8 = 0x06002CA8;
-D_06003230 = 0x06003230;
D_060044D8 = 0x060044D8;
D_06004690 = 0x06004690;
D_060057D8 = 0x060057D8;
D_060058C8 = 0x060058C8;
D_06007238 = 0x06007238;
-D_060076C0 = 0x060076C0;
-D_06008BD4 = 0x06008BD4;
// ovl_Effect_En_Ice_Block
@@ -1537,13 +1540,6 @@ D_06000F38 = 0x06000F38;
D_06009E70 = 0x06009E70;
-// ovl_En_Akindonuts
-
-D_06001350 = 0x06001350;
-D_06005488 = 0x06005488;
-D_06008290 = 0x06008290;
-D_0600AC70 = 0x0600AC70;
-
// ovl_En_Al
D_0600A0D8 = 0x0600A0D8;
@@ -1579,11 +1575,6 @@ D_060028A0 = 0x060028A0;
D_06009220 = 0x06009220;
D_06009D34 = 0x06009D34;
-// ovl_En_Aob_01
-
-D_06000180 = 0x06000180;
-D_06003D18 = 0x06003D18;
-
// ovl_En_Attack_Niw
D_060000E8 = 0x060000E8;
@@ -1603,13 +1594,6 @@ D_06005EF0 = 0x06005EF0;
D_06006B10 = 0x06006B10;
D_060092A0 = 0x060092A0;
-// ovl_En_Baguo
-
-D_060014C8 = 0x060014C8;
-D_060018C8 = 0x060018C8;
-D_06001CC8 = 0x06001CC8;
-D_060020E8 = 0x060020E8;
-
// ovl_En_Baisen
D_060008B4 = 0x060008B4;
@@ -1676,49 +1660,6 @@ D_06004210 = 0x06004210;
D_06007C70 = 0x06007C70;
D_0600823C = 0x0600823C;
-// ovl_En_Bigpo
-
-D_06000454 = 0x06000454;
-D_06000924 = 0x06000924;
-D_06001360 = 0x06001360;
-D_06001BB0 = 0x06001BB0;
-D_060041A0 = 0x060041A0;
-D_060042C8 = 0x060042C8;
-D_060043F8 = 0x060043F8;
-D_060058B8 = 0x060058B8;
-D_06005C18 = 0x06005C18;
-
-// ovl_En_Bigslime
-
-D_060010F4 = 0x060010F4;
-D_06001B08 = 0x06001B08;
-D_0600276C = 0x0600276C;
-D_06002E0C = 0x06002E0C;
-D_0600347C = 0x0600347C;
-D_060039C4 = 0x060039C4;
-D_06003F28 = 0x06003F28;
-D_060066B4 = 0x060066B4;
-D_060069FC = 0x060069FC;
-D_060070C4 = 0x060070C4;
-D_06007790 = 0x06007790;
-D_0600DF98 = 0x0600DF98;
-D_0600F048 = 0x0600F048;
-D_0600F3F0 = 0x0600F3F0;
-D_0600F990 = 0x0600F990;
-D_0600F9D0 = 0x0600F9D0;
-D_0600FB40 = 0x0600FB40;
-D_06010530 = 0x06010530;
-D_060105E8 = 0x060105E8;
-D_06010B80 = 0x06010B80;
-D_06010C48 = 0x06010C48;
-D_06010DB0 = 0x06010DB0;
-D_06010EC8 = 0x06010EC8;
-D_06010F20 = 0x06010F20;
-D_06010FE0 = 0x06010FE0;
-D_06011008 = 0x06011008;
-D_06011050 = 0x06011050;
-D_060113B0 = 0x060113B0;
-
// ovl_En_Bji_01
D_0600066C = 0x0600066C;
@@ -1760,11 +1701,6 @@ D_06000530 = 0x06000530;
D_060064B8 = 0x060064B8;
D_0600F82C = 0x0600F82C;
-// ovl_En_Bomjimb
-
-D_060064B8 = 0x060064B8;
-D_0600F82C = 0x0600F82C;
-
// ovl_En_Bom_Bowl_Man
D_060064B8 = 0x060064B8;
@@ -3261,30 +3197,6 @@ D_06006EE8 = 0x06006EE8;
D_060072E8 = 0x060072E8;
D_060073E8 = 0x060073E8;
-// ovl_En_Pametfrog
-
-D_06000994 = 0x06000994;
-D_06001B08 = 0x06001B08;
-D_06001E14 = 0x06001E14;
-D_06001F20 = 0x06001F20;
-D_060030E4 = 0x060030E4;
-D_0600347C = 0x0600347C;
-D_060039C4 = 0x060039C4;
-D_06003F28 = 0x06003F28;
-D_06004298 = 0x06004298;
-D_06004680 = 0x06004680;
-D_06004894 = 0x06004894;
-D_06004D50 = 0x06004D50;
-D_060050B8 = 0x060050B8;
-D_060052EC = 0x060052EC;
-D_06005694 = 0x06005694;
-D_06005D54 = 0x06005D54;
-D_060066B4 = 0x060066B4;
-D_060070C4 = 0x060070C4;
-D_0600DF98 = 0x0600DF98;
-D_0600F048 = 0x0600F048;
-D_0600F990 = 0x0600F990;
-
// ovl_En_Paper
D_0600D5A0 = 0x0600D5A0;
@@ -3430,11 +3342,6 @@ D_06001600 = 0x06001600;
D_060009C4 = 0x060009C4;
D_06000F1C = 0x06000F1C;
-// ovl_En_Rail_Skb
-
-D_06005EF8 = 0x06005EF8;
-D_060064E0 = 0x060064E0;
-
// ovl_En_Rat
D_06000174 = 0x06000174;
@@ -3870,27 +3777,8 @@ D_0600FEF0 = 0x0600FEF0;
// ovl_En_Tru
-D_06001F90 = 0x06001F90;
-D_060020C8 = 0x060020C8;
-D_06002BD8 = 0x06002BD8;
-D_06003698 = 0x06003698;
-D_0600446C = 0x0600446C;
-D_06007FA0 = 0x06007FA0;
-D_06009348 = 0x06009348;
-D_0600EEDC = 0x0600EEDC;
-D_0600F9A0 = 0x0600F9A0;
-D_060108AC = 0x060108AC;
-D_06011F88 = 0x06011F88;
-D_06014728 = 0x06014728;
-D_06015CA0 = 0x06015CA0;
-D_06016B4C = 0x06016B4C;
-D_06018FA0 = 0x06018FA0;
-D_060197A0 = 0x060197A0;
-D_06019FA0 = 0x06019FA0;
D_0601A820 = 0x0601A820;
D_0601A830 = 0x0601A830;
-D_0601AA60 = 0x0601AA60;
-D_0601B5C4 = 0x0601B5C4;
// ovl_En_Tru_Mt
@@ -4033,12 +3921,6 @@ D_06000D94 = 0x06000D94;
D_06007650 = 0x06007650;
D_0600D658 = 0x0600D658;
-// ovl_En_Zog
-
-D_0600FC0C = 0x0600FC0C;
-D_060280A8 = 0x060280A8;
-D_06029170 = 0x06029170;
-
// ovl_En_Zoraegg
D_060005D4 = 0x060005D4;
@@ -4275,14 +4157,6 @@ D_06000C74 = 0x06000C74;
D_06000EC0 = 0x06000EC0;
D_06001888 = 0x06001888;
-// ovl_Obj_Iceblock
-
-D_060001A0 = 0x060001A0;
-D_06000328 = 0x06000328;
-D_06000438 = 0x06000438;
-D_060007F0 = 0x060007F0;
-D_060009D0 = 0x060009D0;
-
// ovl_Obj_Jgame_Light
D_060003A0 = 0x060003A0;
@@ -4421,11 +4295,6 @@ D_06001CB0 = 0x06001CB0;
D_06001400 = 0x06001400;
-// ovl_Obj_Tokei_Step
-
-D_06000088 = 0x06000088;
-D_06000968 = 0x06000968;
-
// ovl_Obj_Tokei_Turret
D_06002508 = 0x06002508;
@@ -4484,7 +4353,7 @@ D_060012E8 = 0x060012E8;
D_06000360 = 0x06000360;
D_06001428 = 0x06001428;
-// ovl_Player_Actor
+// ovl_player_actor
D_06008860 = 0x06008860;
D_0600BDD8 = 0x0600BDD8;