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;