From 85da42216892fd0040cd5dc8cef559760d4e7691 Mon Sep 17 00:00:00 2001 From: petrie911 <69443847+petrie911@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:05:17 -0600 Subject: [PATCH] fox_aq decomped, some type cleanup (#112) * stuff * stuff * temps * matched * so complete * merge and clean * format * graphics macros * aq * more stuff * oh god the clam * limbdraw * headers? * format, name changes * enums * merge and format --- .vscode/settings.json | 4 +- include/assets.h | 70 +- include/functions.h | 9 +- include/gfx.h | 18 +- include/i5.h | 2 +- include/macros.h | 1 + linker_scripts/us/symbol_addrs_overlays.txt | 2 +- src/main/fox_demo.c | 34 +- src/main/fox_effect.c | 17 +- src/main/fox_play.c | 6 +- src/main/fox_std_lib.c | 14 +- src/overlays/ovl_i1/fox_co.c | 18 +- src/overlays/ovl_i1/sf_ve1.c | 8 +- src/overlays/ovl_i2/fox_sx.c | 30 +- src/overlays/ovl_i3/fox_a6.c | 2 +- src/overlays/ovl_i3/fox_aq.c | 6184 +++++++++++++++++++ src/overlays/ovl_i3/fox_zo.c | 41 +- src/overlays/ovl_i3/sf_aq.c | 1108 ---- src/overlays/ovl_i4/fox_fo.c | 6 +- src/overlays/ovl_i5/fox_ma.c | 107 +- src/overlays/ovl_i6/fox_andross.c | 64 +- src/overlays/ovl_i6/fox_sy.c | 22 +- src/overlays/ovl_i6/fox_ve2.c | 2 +- src/overlays/ovl_menu/fox_map.c | 198 +- src/overlays/ovl_menu/fox_title.c | 38 +- yamls/us/overlays.yaml | 8 +- 26 files changed, 6473 insertions(+), 1540 deletions(-) create mode 100644 src/overlays/ovl_i3/fox_aq.c delete mode 100644 src/overlays/ovl_i3/sf_aq.c diff --git a/.vscode/settings.json b/.vscode/settings.json index a0b894af..910a3c8f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -49,7 +49,9 @@ "prevent_bss_reordering.h": "c", "fox_map.h": "c", "sf64level.h": "c", - "prevent_bss_reordering2.h": "c" + "prevent_bss_reordering2.h": "c", + "ast_aq.h": "c", + "ast_8e1f80.h": "c" }, "C_Cpp_Runner.msvcBatchPath": "" } \ No newline at end of file diff --git a/include/assets.h b/include/assets.h index 63ea7ed1..96486184 100644 --- a/include/assets.h +++ b/include/assets.h @@ -187,10 +187,10 @@ extern Gfx D_3014BF0[]; extern Gfx D_3015120[]; extern Gfx D_30155E0[]; extern Gfx D_3015740[]; -extern AnimationHeader D_3015AF4; -extern AnimationHeader D_3015C28; +extern Animation D_3015AF4; +extern Animation D_3015C28; extern Gfx D_3015D80[]; -extern AnimationHeader D_30163C4; +extern Animation D_30163C4; extern Limb* D_3016610[]; extern Gfx D_3016660[]; extern Gfx D_30160A0[]; @@ -206,13 +206,13 @@ extern Gfx D_3018800[]; extern Gfx D_30194E0[]; extern Gfx D_301B080[]; extern Gfx D_301B6E0[]; -extern AnimationHeader D_301C3A8; +extern Animation D_301C3A8; extern Limb* D_301C614[]; -extern AnimationHeader D_301CFEC; +extern Animation D_301CFEC; extern Limb* D_301D258[]; -extern AnimationHeader D_301D888; +extern Animation D_301D888; extern Limb* D_301DB94[]; -extern AnimationHeader D_301E19C; +extern Animation D_301E19C; extern Limb* D_301E3E8[]; extern Gfx D_301E570[]; extern Gfx D_301F140[]; @@ -251,18 +251,18 @@ extern Triangle D_302F044[]; extern Vec3f D_302F098[]; // ast_918430, ast_922730 -extern AnimationHeader D_4000080; +extern Animation D_4000080; extern Limb* D_400014C[]; -extern AnimationHeader D_40001A4; +extern Animation D_40001A4; extern Limb* D_4000270[]; extern Gfx D_40018A0[]; extern Gfx D_4003BD0[]; -extern AnimationHeader D_40057AC; +extern Animation D_40057AC; extern Limb* D_40058B8[]; extern Gfx D_40068F0[]; extern Gfx D_4007870[]; extern Gfx D_4007AF0[]; -extern AnimationHeader D_400A30C; +extern Animation D_400A30C; extern Limb* D_400A398[]; extern Gfx D_400B390[]; @@ -353,7 +353,7 @@ extern Gfx D_6006140[]; extern Gfx D_6006310[]; extern u16* D_600631C[]; extern u8 D_6006320[]; -extern AnimationHeader D_600636C; +extern Animation D_600636C; extern f32 D_60064AC[]; extern f32 D_60064C8[]; extern f32 D_60064FC[]; @@ -394,8 +394,8 @@ extern Gfx D_6006A80[]; extern Gfx D_6006BE0[]; extern f32 D_6006BF0[]; extern f32 D_6006C44[]; -extern AnimationHeader D_6006D64; -extern Limb *D_6006E50[]; +extern Animation D_6006D64; +extern Limb* D_6006E50[]; extern EnvSettings D_6006E70; extern u8 D_6006E80[]; extern u16 D_6006EA0[]; @@ -427,7 +427,7 @@ extern u16* D_6009B34[]; extern u16 D_6009BB8[]; extern f32 D_6009CC4[]; extern f32 D_6009CFC[]; -extern AnimationHeader D_6009D30; +extern Animation D_6009D30; extern Gfx D_6009E30[]; extern Vtx D_6009ED0[]; extern Gfx D_6009F90[]; @@ -439,7 +439,7 @@ extern u16 D_600AB68[]; extern u8 D_600AD30[]; extern Gfx D_600AF40[]; extern Gfx D_600B0E0[]; -extern AnimationHeader D_600B1B4; +extern Animation D_600B1B4; extern Gfx D_600B4B0[]; extern Gfx D_600B8B0[]; extern u8 D_600B9B0[]; @@ -447,9 +447,9 @@ extern Gfx D_600BAF0[]; extern u16 D_600BEA0[]; extern Gfx D_600BF80[]; extern Gfx D_600C130[]; -extern AnimationHeader D_600C15C; -extern AnimationHeader D_600C200; -extern Limb *D_600C2AC[]; +extern Animation D_600C15C; +extern Animation D_600C200; +extern Limb* D_600C2AC[]; extern u16 D_600C6A0[]; extern Gfx D_600C740[]; extern Vtx D_600C780[]; @@ -457,7 +457,7 @@ extern Gfx D_600CAA0[]; extern u16 D_600CBD8[]; extern u8 D_600CC10[]; extern Gfx D_600D190[]; -extern AnimationHeader D_600D3DC; +extern Animation D_600D3DC; extern u16 D_600D5C0[]; extern Gfx D_600D730[]; extern u16 D_600D990[]; @@ -470,10 +470,10 @@ extern Gfx D_600DDF0[]; extern Gfx D_600E050[]; extern Gfx D_600E0C0[]; extern u8 D_600E210[]; -extern AnimationHeader D_600E2C4; +extern Animation D_600E2C4; extern u8 D_600E360[]; -extern Limb *D_600E470[]; -extern AnimationHeader D_600E5EC; +extern Limb* D_600E470[]; +extern Animation D_600E5EC; extern Gfx D_600E820[]; extern u8 D_600E980[]; extern EnvSettings D_600EA90; @@ -497,7 +497,7 @@ extern CollisionPoly D_600F60C[]; extern Gfx D_600F670[]; extern Gfx D_600F6C0[]; extern Gfx D_600F6C0[]; -extern AnimationHeader D_600F744; +extern Animation D_600F744; extern Gfx D_600F8A0[]; extern u8 D_600F940[]; extern Gfx D_600F9B0[]; @@ -544,14 +544,14 @@ extern Gfx D_60120F0[]; extern u8 D_6012310[]; extern u8 D_60123F0[]; extern Gfx D_6012C00_Gfx[]; -extern AnimationHeader D_6012C00_Anim; +extern Animation D_6012C00_Anim; extern u8 D_60131A0[]; extern Gfx D_60132B0[]; extern u8 D_6013470[]; extern Gfx D_6013480[]; extern Gfx D_60137B0[]; -extern AnimationHeader D_6013820; -extern AnimationHeader D_601388C; +extern Animation D_6013820; +extern Animation D_601388C; extern Limb* D_601390C[]; extern Gfx D_6013960[]; extern u8 D_60139E0[]; @@ -561,7 +561,7 @@ extern u8 D_6014360[]; extern Gfx D_60143E0[]; extern Gfx D_6014500[]; extern u16 D_6014510[]; -extern AnimationHeader D_6014658; +extern Animation D_6014658; extern Gfx D_6014670[]; extern u16 D_60147C0[]; extern u8 D_60147E0[]; @@ -595,7 +595,7 @@ extern u8 D_6017640[]; extern u8 D_6018280[]; extern Gfx D_6018450[]; extern Gfx D_60188D0[]; -extern AnimationHeader D_6018994; +extern Animation D_6018994; extern Limb* D_6018BA0[]; extern Gfx D_6018BF0[]; extern Gfx D_6018C00[]; // possible collision @@ -656,7 +656,7 @@ extern Gfx D_601DE60[]; extern Gfx D_601DE80[]; extern Gfx D_601E150[]; extern u16 D_601E1E8[]; -extern AnimationHeader D_601E8C4; +extern Animation D_601E8C4; extern Limb* D_601E9D0[]; extern Gfx D_601EAA0[]; extern Gfx D_601F1D0[]; @@ -664,7 +664,7 @@ extern EnvSettings D_601F1F0; extern Gfx D_601F500[]; extern Gfx D_601F5A0[]; extern Gfx D_601F6B0[]; -extern AnimationHeader D_601F874; +extern Animation D_601F874; extern Limb* D_601F920[]; extern Gfx D_601FCB0[]; extern u8 D_601FF40[]; @@ -678,7 +678,7 @@ extern Gfx D_6020E60[]; extern u16 D_6020F60[]; extern u16 D_6020FB0[]; extern u16 D_6021ED0[]; -extern AnimationHeader D_602201C; +extern Animation D_602201C; extern Limb* D_60220E8[]; extern Gfx D_6022110[]; extern u16 D_6022340[]; @@ -711,7 +711,7 @@ extern u16 D_6026C90[]; extern u8 D_6026D70[]; extern Gfx D_60270E0[]; extern Gfx D_6027180[]; -extern AnimationHeader D_6027320; +extern Animation D_6027320; extern u16 D_6027340[]; extern Limb* D_602742C[]; extern Gfx D_6027900[]; @@ -724,7 +724,7 @@ extern u16* D_60289FC[]; extern u16 D_6028A60[]; extern u16 D_6029170[]; extern u8 D_6029220[]; -extern AnimationHeader D_6029528; +extern Animation D_6029528; extern Limb* D_6029674[]; extern Gfx D_6029890[]; extern EnvSettings D_602A120; @@ -979,7 +979,7 @@ extern Gfx D_7007350[]; extern Gfx D_700AB70[]; extern Gfx D_700BB10[]; extern Gfx D_700BE00[]; -extern AnimationHeader D_700CAF4; +extern Animation D_700CAF4; extern Limb* D_700CB60[]; extern u16 D_700E9A0[]; extern u8 D_70118E0[]; diff --git a/include/functions.h b/include/functions.h index 9eb96984..62562fa7 100644 --- a/include/functions.h +++ b/include/functions.h @@ -429,10 +429,10 @@ void func_8007E45C(Effect*); void func_8007E5CC(Effect*); void func_8007E648(Effect*); void func_8007E93C(Effect* effect, u32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg5); -void func_8007EE68(s32 objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, f32 scale2); -void func_8007F04C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, f32 unkZ, f32 xVel, f32 yVel, f32 zVel, f32 scale2); -void func_8007F11C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4); -void func_8007F20C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4); +void func_8007EE68(ObjectId objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, f32 scale2); +void func_8007F04C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, f32 unkZ, f32 xVel, f32 yVel, f32 zVel, f32 scale2); +void func_8007F11C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4); +void func_8007F20C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4); void func_8007F438(Effect*); void func_8007F6B0(Effect*); void func_8007F958(Effect*); @@ -452,6 +452,7 @@ void func_80081A8C(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 arg4); void func_80081BEC(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 arg4); void func_80081C5C(Effect*); void func_80082F78(Effect*); +void func_8008377C(f32, f32, f32, f32, f32); void func_800837EC(Effect*); void func_80083B8C(Effect*); void func_80083C70(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 arg7, s32 arg8); diff --git a/include/gfx.h b/include/gfx.h index 2aa8983e..75766d5c 100644 --- a/include/gfx.h +++ b/include/gfx.h @@ -52,7 +52,7 @@ typedef struct { /* 0x02 */ s16 limbCount; /* 0x04 */ u16* frameData; /* 0x08 */ JointKey* jointKey; -} AnimationHeader; // size = 0xC +} Animation; // size = 0xC typedef struct Limb { /* 0x000 */ Gfx* dList; @@ -62,14 +62,6 @@ typedef struct Limb { /* 0x01C */ struct Limb* child; } Limb; // size = 0x20 -typedef Limb* SkelAnime; - -typedef struct { - /* 0x00 */ AnimationHeader* unk_0; - /* 0x04 */ AnimationHeader* unk_4; - /* 0x08 */ SkelAnime* skelanime; -} Animation; // size = 0x0C - void Lights_SetOneLight(Gfx** dList, s32 dirX, s32 dirY, s32 dirZ, s32 colR, s32 colG, s32 colB, s32 ambR, s32 ambG, s32 ambB); void Lights_SetTwoLights(Gfx** dList, s32 dir1x, s32 dir1y, s32 dir1z, s32 dir2x, s32 dir2y, s32 dir2z, s32 col1r, s32 col1g, s32 col1b, s32 col2r, s32 col2g, s32 col2b, s32 ambR, s32 ambG, s32 ambB); @@ -79,13 +71,13 @@ s32 Graphics_Printf(const char *fmt, ...); void Texture_Scroll(void *texture, s32 width, s32 height, u8 mode); void Texture_Mottle(void *dst, void *src, u8 mode); s32 Animation_GetLimbIndex(Limb* limb, Limb** skeleton); -void Animation_DrawLimb(s32 mode, Limb * limb, Limb* *skeleton, Vec3f* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, void* data); +void Animation_DrawLimb(s32 mode, Limb* limb, Limb* *skeleton, Vec3f* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, void* data); void Animation_DrawSkeleton(s32 mode, Limb** skeletonSegment, Vec3f* jointTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, void* data, Matrix* transform); -s16 Animation_GetFrameData(AnimationHeader *animationSegmemt, s32 frame, Vec3f *frameTable); -s16 Animation_GetFrameCount(AnimationHeader *animationSegment); +s16 Animation_GetFrameData(Animation *animationSegmemt, s32 frame, Vec3f *frameTable); +s16 Animation_GetFrameCount(Animation *animationSegment); void Animation_FindBoundingBox(Gfx* dList, s32 len, Vec3f *min, Vec3f *max, s32 *vtxFound, s32 *vtxCount, Vtx* *vtxList); void Animation_GetDListBoundingBox(Gfx *dList, s32 len, Vec3f *min, Vec3f *max); -void Animation_GetSkeletonBoundingBox(Limb **skeletonSegment, AnimationHeader *animationSegment, s32 frame, Vec3f *min, Vec3f* max); +void Animation_GetSkeletonBoundingBox(Limb** skeletonSegment, Animation *animationSegment, s32 frame, Vec3f *min, Vec3f* max); void TextureRect_4bCI(Gfx **gfxPtr, void* texture, void* palette, u32 width, u32 height, f32 xPos, f32 yPos, f32 xScale, f32 yScale); void TextureRect_4bCI_Flip(Gfx **gfxPtr, void* texture, void* palette, u32 width, u32 height, f32 xPos, f32 yPos, f32 xScale, f32 yScale); void TextureRect_4bCI_MirX(Gfx **gfxPtr, void* texture, void* palette, u32 width, u32 height, f32 xPos, f32 yPos, f32 xScale, f32 yScale); diff --git a/include/i5.h b/include/i5.h index 73f1eb32..1bece2d7 100644 --- a/include/i5.h +++ b/include/i5.h @@ -45,7 +45,7 @@ void func_i5_801A5E2C(Actor *); void func_i5_801A6134(Actor *); void func_i5_801A65E0(Object_80 *); void func_i5_801A7D98(Actor *); -void func_i5_801ACFBC(); +void func_i5_801ACFBC(void); void func_i5_801AD080(void); void func_i5_801B5110(f32, f32, f32); void func_i5_801B58AC(Gfx **, f32); diff --git a/include/macros.h b/include/macros.h index edea8627..1df9889c 100644 --- a/include/macros.h +++ b/include/macros.h @@ -7,6 +7,7 @@ #define RAND_FLOAT(max) (Rand_ZeroOne()*(max)) #define RAND_INT(max) ((s32)(Rand_ZeroOne()*(max))) #define RAND_FLOAT_CENTERED(width) ((Rand_ZeroOne()-0.5f)*(width)) +#define RAND_RANGE(min, max) (((max) - (min)) * (Rand_ZeroOne() - (min) / ((min) - (max)))) #define RAND_FLOAT_SEEDED(max) (Rand_ZeroOneSeeded()*(max)) #define RAND_INT_SEEDED(max) ((s32)(Rand_ZeroOneSeeded()*(max))) diff --git a/linker_scripts/us/symbol_addrs_overlays.txt b/linker_scripts/us/symbol_addrs_overlays.txt index d5d8318e..c78b3a5a 100644 --- a/linker_scripts/us/symbol_addrs_overlays.txt +++ b/linker_scripts/us/symbol_addrs_overlays.txt @@ -78,7 +78,7 @@ D_i3_801C27C8 = 0x801C27C8; //segment:ovl_i3 size:0x12C0 D_i3_801C3A88 = 0x801C3A88; //segment:ovl_i3 size:0x700 D_i3_801C4190 = 0x801C4190; //segment:ovl_i3 size:0x28 D_i3_801C41B8 = 0x801C41B8; //segment:ovl_i3 size:0x78 -D_i3_801C4230 = 0x801C4230; //segment:ovl_i3 size:0x70 +sBossAQlimbTimers = 0x801C4230; //segment:ovl_i3 size:0x70 D_i3_801C42A0 = 0x801C42A0; //segment:ovl_i3 size:0x68 D_i3_801C4308 = 0x801C4308; //segment:ovl_i3 size:0x148 D_i3_801C0060 = 0x801C0060; //segment:ovl_i3 type:f32 diff --git a/src/main/fox_demo.c b/src/main/fox_demo.c index 071a8989..af07757a 100644 --- a/src/main/fox_demo.c +++ b/src/main/fox_demo.c @@ -9,17 +9,17 @@ extern Gfx D_1024AC0[]; extern Gfx D_60320E0[]; extern Gfx D_7010970[]; -extern Gfx* D_E000000; -extern Gfx* D_E003AB0; +extern Gfx D_E000000[]; +extern Gfx D_E003AB0[]; extern s32 D_800C9E90[]; -extern AnimationHeader D_60265B4[]; -extern AnimationHeader D_602B8DC[]; -extern AnimationHeader D_60034C4[]; -extern AnimationHeader D_602A2CC[]; -extern AnimationHeader D_602CEB4[]; -extern AnimationHeader D_602B778[]; +extern Animation D_60265B4[]; +extern Animation D_602B8DC[]; +extern Animation D_60034C4[]; +extern Animation D_602A2CC[]; +extern Animation D_602CEB4[]; +extern Animation D_602B778[]; extern f32 D_80178454; extern f32 D_80178458; @@ -36,9 +36,9 @@ extern Gfx D_60132B0[]; extern Gfx D_6014A40[]; extern Gfx D_6020810[]; -extern AnimationHeader D_6020A40; -extern Limb* D_6020C6C; -extern Limb* D_602D140; +extern Animation D_6020A40; +extern Limb* D_6020C6C[]; +extern Limb* D_602D140[]; Vec3f D_800C9F60[] = { { 2000.0f, 2000.0f, 2000.0f }, @@ -127,8 +127,8 @@ f32 D_800CA1D4[] = { 1.5f, 0.87f, 0.83f, 0.75f, 0.7f, 0.6f, 0.4f, 0.1f, }; -AnimationHeader* D_800CA1F4[] = { - D_60265B4, D_602B8DC, D_60034C4, D_602A2CC, D_602CEB4, D_602B778, (AnimationHeader*) 0x0601F3B8, +Animation* D_800CA1F4[] = { + D_60265B4, D_602B8DC, D_60034C4, D_602A2CC, D_602CEB4, D_602B778, (Animation*) 0x0601F3B8, }; void func_80048AC0(s32 teamId) { @@ -2801,7 +2801,7 @@ void func_8004FEC0(Actor* actor) { Math_SmoothStepToVec3fArray(sp144, actor->vwork, 1, animFrameData, actor->fwork[2], 100.0f, .0f); RCP_SetupDL_30(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); gDPSetPrimColor(gMasterDisp++, 0, 0, 150, 255, 150, 255); - Animation_DrawSkeleton(1, &D_602D140, actor->vwork, 0, 0, actor, &gIdentityMatrix); + Animation_DrawSkeleton(1, D_602D140, actor->vwork, 0, 0, actor, &gIdentityMatrix); if (actor->fwork[0] != 0.0f) { RCP_SetupDL_49(); @@ -2895,7 +2895,7 @@ void func_8004FEC0(Actor* actor) { case 44: Animation_GetFrameData(&D_6020A40, actor->iwork[0], actor->vwork); gSPClearGeometryMode(gMasterDisp++, 0x00002000); - Animation_DrawSkeleton(1, &D_6020C6C, actor->vwork, 0, 0, &actor->index, &gIdentityMatrix); + Animation_DrawSkeleton(1, D_6020C6C, actor->vwork, 0, 0, &actor->index, &gIdentityMatrix); gSPSetGeometryMode(gMasterDisp++, 0x00002000); break; @@ -2939,9 +2939,9 @@ void func_800515C4(void) { } if (D_80177B8C != 0) { - gSPDisplayList(gMasterDisp++, &D_E000000); + gSPDisplayList(gMasterDisp++, D_E000000); } else { - gSPDisplayList(gMasterDisp++, &D_E003AB0); + gSPDisplayList(gMasterDisp++, D_E003AB0); } if ((gCurrentLevel != LEVEL_AQUAS) && diff --git a/src/main/fox_effect.c b/src/main/fox_effect.c index eb35f1d3..d363f64e 100644 --- a/src/main/fox_effect.c +++ b/src/main/fox_effect.c @@ -2496,7 +2496,8 @@ void func_8007E93C(Effect* effect, u32 objId, f32 xPos, f32 yPos, f32 zPos, f32 Audio_PlaySfx(0x29002002, effect->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); } -void func_8007EBB8(Effect* effect, s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2) { +void func_8007EBB8(Effect* effect, ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, + f32 scale2) { Effect_Initialize(effect); effect->obj.status = OBJ_INIT; effect->obj.id = objId; @@ -2520,7 +2521,7 @@ void func_8007EBB8(Effect* effect, s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 Object_SetInfo(&effect->info, effect->obj.id); } -void func_8007ECB4(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2) { +void func_8007ECB4(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2) { s32 i; for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { @@ -2531,7 +2532,7 @@ void func_8007ECB4(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, } } -void func_8007ED54(Effect* effect, s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, +void func_8007ED54(Effect* effect, ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, f32 unkZ, f32 xVel, f32 yVel, f32 zVel, f32 scale2) { Effect_Initialize(effect); effect->obj.status = OBJ_INIT; @@ -2565,7 +2566,7 @@ void func_8007ED54(Effect* effect, s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 Object_SetInfo(&effect->info, effect->obj.id); } -void func_8007EE68(s32 objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, f32 scale2) { +void func_8007EE68(ObjectId objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, f32 scale2) { s32 i; Vec3f sp68; @@ -2587,8 +2588,8 @@ void func_8007EE68(s32 objId, Vec3f* pos, Vec3f* rot, Vec3f* arg3, Vec3f* arg4, } } -void func_8007F04C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, f32 unkZ, - f32 xVel, f32 yVel, f32 zVel, f32 scale2) { +void func_8007F04C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 unkX, f32 unkY, + f32 unkZ, f32 xVel, f32 yVel, f32 zVel, f32 scale2) { s32 i; for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { @@ -2600,7 +2601,7 @@ void func_8007F04C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, } } -void func_8007F11C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4) { +void func_8007F11C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4) { s32 i; if ((fabsf(zPos - gPlayer[0].unk_138) > 300.0f) || (fabsf(xPos - gPlayer[0].pos.x) > 300.0f)) { @@ -2615,7 +2616,7 @@ void func_8007F11C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4) { } } -void func_8007F20C(s32 objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4) { +void func_8007F20C(ObjectId objId, f32 xPos, f32 yPos, f32 zPos, f32 arg4) { s32 i; if ((fabsf(zPos - gPlayer[0].camEye.z) > 300.0f) || (fabsf(xPos - gPlayer[0].camEye.x) > 300.0f)) { diff --git a/src/main/fox_play.c b/src/main/fox_play.c index ae8b3c88..8ea0cf39 100644 --- a/src/main/fox_play.c +++ b/src/main/fox_play.c @@ -3850,10 +3850,10 @@ void func_800B0194(Player* player) { player->unk_17C = RAND_FLOAT_CENTERED(100.0f); } if (((gGameFrameCount & 0xF) == 3) && (Rand_ZeroOne() < 0.5f)) { - player->unk_174 = (Rand_ZeroOne() - 0.2f) * 50.0f; + player->unk_174 = RAND_RANGE(-10.0f, 40.0f); } if (((gGameFrameCount & 0xF) == 10) && (Rand_ZeroOne() < 0.5f)) { - player->unk_178 = (Rand_ZeroOne() - 0.2f) * 50.0f; + player->unk_178 = RAND_RANGE(-10.0f, 40.0f); } Math_SmoothStepToF(&player->unk_15C, player->unk_17C, 0.15f, 10.0f, 0.00001f); Math_SmoothStepToF(&player->unk_164, player->unk_174, 0.1f, 10.0f, 0.00001f); @@ -5148,7 +5148,7 @@ void func_800B44C4(Player* player) { break; case FORM_BLUE_MARINE: func_i3_801BEC80(player); - return; + break; case FORM_ON_FOOT: func_800B00C0(player); func_800B0194(player); diff --git a/src/main/fox_std_lib.c b/src/main/fox_std_lib.c index 4e18fac8..bf6d8ec6 100644 --- a/src/main/fox_std_lib.c +++ b/src/main/fox_std_lib.c @@ -248,8 +248,8 @@ void Animation_DrawSkeleton(s32 mode, Limb** skeletonSegment, Vec3f* jointTable, } } -s16 Animation_GetFrameData(AnimationHeader* animationSegmemt, s32 frame, Vec3f* frameTable) { - AnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSegmemt); +s16 Animation_GetFrameData(Animation* animationSegmemt, s32 frame, Vec3f* frameTable) { + Animation* animation = SEGMENTED_TO_VIRTUAL(animationSegmemt); u16 var4 = animation->limbCount; JointKey* key = SEGMENTED_TO_VIRTUAL(animation->jointKey); u16* frameData = SEGMENTED_TO_VIRTUAL(animation->frameData); @@ -275,8 +275,8 @@ s16 Animation_GetFrameData(AnimationHeader* animationSegmemt, s32 frame, Vec3f* return var4 + 1; } -s16 Animation_GetFrameCount(AnimationHeader* animationSegment) { - AnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSegment); +s16 Animation_GetFrameCount(Animation* animationSegment) { + Animation* animation = SEGMENTED_TO_VIRTUAL(animationSegment); return animation->frameCount; } @@ -335,11 +335,11 @@ void Animation_GetDListBoundingBox(Gfx* dList, s32 len, Vec3f* min, Vec3f* max) Animation_FindBoundingBox(dList, len, min, max, &vtxFound, &vtxCount, &vtxList); } -void Animation_GetSkeletonBoundingBox(Limb** skeletonSegment, AnimationHeader* animationSegment, s32 frame, Vec3f* min, +void Animation_GetSkeletonBoundingBox(Limb** skeletonSegment, Animation* animationSegment, s32 frame, Vec3f* min, Vec3f* max) { JointKey* key; u16* frameData; - AnimationHeader* animation; + Animation* animation; Limb* limb; u16 var_t6; s32 vtxFound; @@ -351,7 +351,7 @@ void Animation_GetSkeletonBoundingBox(Limb** skeletonSegment, AnimationHeader* a Limb** skeleton = (Limb**) SEGMENTED_TO_VIRTUAL(skeletonSegment); limb = (Limb*) SEGMENTED_TO_VIRTUAL(skeleton[0]); - animation = (AnimationHeader*) SEGMENTED_TO_VIRTUAL(animationSegment); + animation = (Animation*) SEGMENTED_TO_VIRTUAL(animationSegment); key = (JointKey*) SEGMENTED_TO_VIRTUAL(animation->jointKey); frameData = (u16*) SEGMENTED_TO_VIRTUAL(animation->frameData); diff --git a/src/overlays/ovl_i1/fox_co.c b/src/overlays/ovl_i1/fox_co.c index 04b4ff39..97f92a43 100644 --- a/src/overlays/ovl_i1/fox_co.c +++ b/src/overlays/ovl_i1/fox_co.c @@ -526,8 +526,8 @@ void func_i1_80188D50(Boss* boss) { } } -extern AnimationHeader D_602BC18; -extern AnimationHeader D_602C0D0; +extern Animation D_602BC18; +extern Animation D_602C0D0; void func_i1_80189058(Boss* boss) { Vec3f sp21C = { 0.0f, 0.0f, 0.0f }; @@ -1154,7 +1154,7 @@ void func_i1_8018ACE0(Actor* actor) { } } -extern AnimationHeader D_602991C; +extern Animation D_602991C; extern Gfx D_60329C0[]; void func_i1_8018AED0(Actor* actor) { @@ -1222,7 +1222,7 @@ void func_i1_8018B0B4(Actor* actor) { } } -extern AnimationHeader D_602AA04; +extern Animation D_602AA04; void func_i1_8018B15C(Actor* actor) { Vec3f sp60[20]; @@ -1288,7 +1288,7 @@ void func_i1_8018B15C(Actor* actor) { 1.0f, 1.0f); } -extern AnimationHeader D_602A520; +extern Animation D_602A520; void func_i1_8018B418(Actor* actor) { s32 pad; @@ -2328,7 +2328,7 @@ s32 func_i1_8018EC54(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d return false; } -extern AnimationHeader D_602D400; +extern Animation D_602D400; extern Limb* D_602D5AC[]; void func_i1_8018ECAC(Boss* boss) { @@ -2442,7 +2442,7 @@ s32 func_i1_8018F1C8(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d return 0; } -extern AnimationHeader D_602AA7C; +extern Animation D_602AA7C; extern Limb* D_602AB48[]; void func_i1_8018F31C(Object_80* obj80) { @@ -2494,13 +2494,13 @@ void func_i1_8018F55C(Effect* effect) { Effect_Initialize(effect); effect->obj.status = OBJ_INIT; effect->obj.pos.x = gPlayer[0].camEye.x + RAND_FLOAT_CENTERED(500.0f); - effect->obj.pos.y = gPlayer[0].camEye.y + ((Rand_ZeroOne() - 0.8f) * 350.0f); + effect->obj.pos.y = gPlayer[0].camEye.y + RAND_RANGE(-280.0f, 70.0f); effect->obj.id = OBJ_EFFECT_352; effect->timer_50 = 80; effect->unk_46 = 0x90; effect->obj.pos.z = -4000.0f; effect->vel.z = 60.0f; - effect->scale2 = RAND_FLOAT(15.0f) + 10.0f; + effect->scale2 = 10.0f + RAND_FLOAT(15.0f); if (Rand_ZeroOne() < 0.5f) { effect->obj.rot.z = 180.0f; } diff --git a/src/overlays/ovl_i1/sf_ve1.c b/src/overlays/ovl_i1/sf_ve1.c index e08f7d7e..1ab30105 100644 --- a/src/overlays/ovl_i1/sf_ve1.c +++ b/src/overlays/ovl_i1/sf_ve1.c @@ -7,8 +7,8 @@ extern s32 D_i1_8019C0B8; extern s32 D_i1_8019C0BC; extern s32 D_i1_8019C0C0; extern Vec3f D_i1_80199FFC; -extern Limb* D_900D164; -extern Limb* D_901C0F4; +extern Limb* D_900D164[]; +extern Limb* D_901C0F4[]; const char D_i1_8019B2B0[] = "--アタックオフ!!\n"; const char D_i1_8019B2C4[] = "--レベルアップ!!\n"; @@ -351,7 +351,7 @@ void func_i1_801933B4(Actor* arg0) { void func_i1_801934D0(Actor* actor) { Matrix_Translate(gGfxMatrix, 0.0f, -488.0f, 0.0f, 1U); - Animation_DrawSkeleton(0, &D_900D164, actor->vwork, NULL, NULL, actor, &gIdentityMatrix); + Animation_DrawSkeleton(0, D_900D164, actor->vwork, NULL, NULL, actor, &gIdentityMatrix); } void func_i1_80193540(Object_80* arg0) { @@ -383,7 +383,7 @@ void func_i1_80198594(Boss* boss) { void func_i1_801985E4(Boss* boss) { if (boss->swork[26] == 0) { - Animation_DrawSkeleton(0, &D_901C0F4, boss->vwork, func_i1_801937F4, func_i1_80193D64, boss, &gIdentityMatrix); + Animation_DrawSkeleton(0, D_901C0F4, boss->vwork, func_i1_801937F4, func_i1_80193D64, boss, &gIdentityMatrix); } boss->state = boss->swork[9]; } diff --git a/src/overlays/ovl_i2/fox_sx.c b/src/overlays/ovl_i2/fox_sx.c index 5c05152b..72993424 100644 --- a/src/overlays/ovl_i2/fox_sx.c +++ b/src/overlays/ovl_i2/fox_sx.c @@ -13,17 +13,17 @@ Vec3f D_i2_80195668 = { 90.0f, 0.0f, 0.0f }; extern Gfx D_60010C0[]; extern Gfx D_6006810[]; extern Gfx D_6009C30[]; -extern AnimationHeader D_6009FF8; -extern AnimationHeader D_600A2D4; -extern AnimationHeader D_600F890; -extern AnimationHeader D_60123BC; -extern AnimationHeader D_6013798; -extern AnimationHeader D_60158C4; -extern AnimationHeader D_6016E28; -extern AnimationHeader D_601AA28; -extern AnimationHeader D_601C690; -extern AnimationHeader D_60206DC; -extern Limb* D_6020C68; +extern Animation D_6009FF8; +extern Animation D_600A2D4; +extern Animation D_600F890; +extern Animation D_60123BC; +extern Animation D_6013798; +extern Animation D_60158C4; +extern Animation D_6016E28; +extern Animation D_601AA28; +extern Animation D_601C690; +extern Animation D_60206DC; +extern Limb* D_6020C68[]; extern Gfx D_6020D20[]; extern Gfx D_603265C[]; extern Gfx D_6032768[]; @@ -312,7 +312,7 @@ bool func_i2_8018FF40(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* } void func_i2_8018FF84(Boss* boss) { - Animation_DrawSkeleton(3, &D_6020C68, boss->vwork, func_i2_8018FF40, func_i2_80193208, boss, gCalcMatrix); + Animation_DrawSkeleton(3, D_6020C68, boss->vwork, func_i2_8018FF40, func_i2_80193208, boss, gCalcMatrix); } bool func_i2_8018FFDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* data) { @@ -324,7 +324,7 @@ bool func_i2_8018FFDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* } void func_i2_80190020(Boss* boss) { - Animation_DrawSkeleton(3, &D_6020C68, boss->vwork, func_i2_8018FFDC, func_i2_80193208, boss, gCalcMatrix); + Animation_DrawSkeleton(3, D_6020C68, boss->vwork, func_i2_8018FFDC, func_i2_80193208, boss, gCalcMatrix); } void func_i2_80190078(Boss* boss) { @@ -1106,7 +1106,7 @@ void func_i2_80190078(Boss* boss) { D_i2_80195640 = 1; - Animation_DrawSkeleton(1, &D_6020C68, boss->vwork, func_i2_80192AF0, func_i2_80193208, boss, &gIdentityMatrix); + Animation_DrawSkeleton(1, D_6020C68, boss->vwork, func_i2_80192AF0, func_i2_80193208, boss, &gIdentityMatrix); if (((boss->swork[1] != 0) && (boss->swork[3] > 0)) && ((boss->fwork[4] < 45.0f) || (boss->fwork[4] > 315.0f))) { boss->swork[1]++; @@ -1364,7 +1364,7 @@ void func_i2_80193434(Boss* boss) { if (boss->swork[5] == 0) { D_i2_80195640 = 0; - Animation_DrawSkeleton(3, &D_6020C68, boss->vwork, func_i2_80192AF0, 0, boss, gCalcMatrix); + Animation_DrawSkeleton(3, D_6020C68, boss->vwork, func_i2_80192AF0, 0, boss, gCalcMatrix); RCP_SetupDL_64(); gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 96); diff --git a/src/overlays/ovl_i3/fox_a6.c b/src/overlays/ovl_i3/fox_a6.c index fbceb5dc..6d09d92d 100644 --- a/src/overlays/ovl_i3/fox_a6.c +++ b/src/overlays/ovl_i3/fox_a6.c @@ -1415,7 +1415,7 @@ void func_i3_8018A464(Boss* bossA6, s32 arg1) { } } else { bossA6->swork[A6_SWK_11] = 30; - D_i3_801BF100[0].x = (Rand_ZeroOne() - 0.4f) * 30.0f; + D_i3_801BF100[0].x = RAND_RANGE(-12.0f, 18.0f); } D_i3_801BF394[0] = D_i3_801BF100[0].x; } else if (!(bossA6->swork[A6_SWK_11] & 7)) { diff --git a/src/overlays/ovl_i3/fox_aq.c b/src/overlays/ovl_i3/fox_aq.c new file mode 100644 index 00000000..76e2270d --- /dev/null +++ b/src/overlays/ovl_i3/fox_aq.c @@ -0,0 +1,6184 @@ +// #include "prevent_bss_reordering.h" +#include "global.h" + +const char D_i3_801C1A30[] = "プレイヤーのすべてをクリア \n"; +const char D_i3_801C1A50[] = "i %d\n"; + +// /* 0x3 */ ROM_SEGMENT(ast_8E1F80), +extern Gfx D_3000130[]; +extern Gfx D_3000470[]; +extern Gfx D_3000AF0[]; +extern Gfx D_3000C70[]; +extern Gfx D_3006AF0[]; +extern Gfx D_3006C70[]; +extern Gfx D_3006DE0[]; + +// /* 0x6 */ ROM_SEGMENT(ast_A58F60), +extern Animation D_6000AE4; +extern Limb* D_6000DB0[]; +extern Animation D_6002628; +extern Limb* D_6002874[]; +extern Gfx D_6002C10[]; +extern Animation D_6005954; +extern Limb* D_6005A80[]; +extern u8 D_6008EC8[]; +extern u8 D_6008FC8[]; +extern Vtx D_6011A78[]; +extern Animation D_60135E0; +extern Limb* D_60136CC[]; +extern Limb* D_60137CC[]; +extern Gfx D_60137F0[]; +extern Gfx D_6014030[]; +extern Animation D_6014438; +extern Limb* D_6014504[]; +extern Gfx D_6014520[]; +extern Gfx D_6014FD0[]; +extern Vtx D_6018878[]; +extern Vtx D_6018C78[]; +extern Vtx D_6019078[]; +extern u8 D_6019238[]; +extern u8 D_6019338[]; +extern Gfx D_60194D0[]; +extern Gfx D_6019880[]; +extern Gfx D_6019E80[]; +extern Animation D_601DE50; +extern Animation D_601EC68; +extern Limb* D_601EDB4[]; +extern Animation D_6020A40; +extern Limb* D_6020C6C[]; +extern Animation D_6023780; +extern Limb* D_602390C[]; +extern Gfx D_6024A50[]; +extern Animation D_6024F80; +extern Limb* D_602512C[]; +extern Animation D_60260EC; +extern Limb* D_60263F8[]; +extern Animation D_602AC28; +extern Limb* D_602BD60[]; +extern f32 D_6030D3C[]; +extern f32 D_6030D58[]; +extern f32 D_60314AC[]; +extern f32 D_60314E4[]; +extern f32 D_603151C[]; +extern Vtx D_6031D90[]; + +typedef enum { + /* 0 */ AQ_LIMB_0, + /* 1 */ AQ_LIMB_1, + /* 2 */ AQ_LIMB_2, + /* 3 */ AQ_LIMB_3, + /* 4 */ AQ_LIMB_4, + /* 5 */ AQ_LIMB_5, + /* 6 */ AQ_LIMB_6, + /* 7 */ AQ_LIMB_7, + /* 8 */ AQ_LIMB_8, + /* 9 */ AQ_LIMB_9, + /* 10 */ AQ_LIMB_10, + /* 11 */ AQ_LIMB_11, + /* 12 */ AQ_LIMB_12, + /* 13 */ AQ_LIMB_13, + /* 14 */ AQ_LIMB_14, + /* 15 */ AQ_LIMB_15, + /* 16 */ AQ_LIMB_16, + /* 17 */ AQ_LIMB_17, + /* 18 */ AQ_LIMB_18, + /* 19 */ AQ_LIMB_19, + /* 20 */ AQ_LIMB_20, + /* 21 */ AQ_LIMB_21, + /* 22 */ AQ_LIMB_22, + /* 23 */ AQ_LIMB_23, + /* 24 */ AQ_LIMB_24, + /* 25 */ AQ_LIMB_25, + /* 26 */ AQ_LIMB_26, + /* 27 */ AQ_LIMB_27, + /* 28 */ AQ_LIMB_MAX, +} BossAQLimbs; + +typedef enum { + /* 0 */ AQ_SWK_0, + /* 1 */ AQ_SWK_1, + /* 2 */ AQ_SWK_2, + /* 3 */ AQ_SWK_3, + /* 4 */ AQ_SWK_4, + /* 5 */ AQ_SWK_5, + /* 6 */ AQ_SWK_6, + /* 7 */ AQ_SWK_7, + /* 8 */ AQ_SWK_8, + /* 9 */ AQ_SWK_9, + /* 10 */ AQ_SWK_10, + /* 11 */ AQ_SWK_11, + /* 12 */ AQ_SWK_12, + /* 13 */ AQ_SWK_13, + /* 14 */ AQ_SWK_14, + /* 15 */ AQ_SWK_15, + /* 16 */ AQ_SWK_16, + /* 17 */ AQ_SWK_17, + /* 18 */ AQ_SWK_18, + /* 19 */ AQ_SWK_19, + /* 20 */ AQ_SWK_20, + /* 21 */ AQ_SWK_21, + /* 22 */ AQ_SWK_22, + /* 23 */ AQ_SWK_23, + /* 24 */ AQ_SWK_24, + /* 25 */ AQ_SWK_25, + /* 26 */ AQ_SWK_26, + /* 27 */ AQ_SWK_27, + /* 28 */ AQ_SWK_28, + /* 29 */ AQ_SWK_29, + /* 30 */ AQ_SWK_30, + /* 31 */ AQ_SWK_31, + /* 32 */ AQ_SWK_32, + /* 33 */ AQ_SWK_33, + /* 34 */ AQ_SWK_34, + /* 35 */ AQ_SWK_35, + /* 36 */ AQ_SWK_36, + /* 37 */ AQ_SWK_37, + /* 38 */ AQ_SWK_38, + /* 39 */ AQ_SWK_39, + /* 40 */ AQ_SWK_MAX, +} BossAQswork; + +typedef enum { + /* 0 */ AQ_FWK_0, + /* 1 */ AQ_FWK_1, + /* 2 */ AQ_FWK_2, + /* 3 */ AQ_FWK_3, + /* 4 */ AQ_FWK_4, + /* 5 */ AQ_FWK_5, + /* 6 */ AQ_FWK_6, + /* 7 */ AQ_FWK_7, + /* 8 */ AQ_FWK_8, + /* 9 */ AQ_FWK_9, + /* 10 */ AQ_FWK_10, + /* 11 */ AQ_FWK_11, + /* 12 */ AQ_FWK_12, + /* 13 */ AQ_FWK_13, + /* 14 */ AQ_FWK_14, + /* 15 */ AQ_FWK_15, + /* 16 */ AQ_FWK_16, + /* 17 */ AQ_FWK_17, + /* 18 */ AQ_FWK_18, + /* 19 */ AQ_FWK_19, + /* 20 */ AQ_FWK_20, + /* 21 */ AQ_FWK_21, + /* 22 */ AQ_FWK_22, + /* 23 */ AQ_FWK_23, + /* 24 */ AQ_FWK_24, + /* 25 */ AQ_FWK_25, + /* 26 */ AQ_FWK_26, + /* 27 */ AQ_FWK_27, + /* 28 */ AQ_FWK_28, + /* 29 */ AQ_FWK_29, + /* 30 */ AQ_FWK_30, + /* 31 */ AQ_FWK_31, + /* 32 */ AQ_FWK_32, + /* 33 */ AQ_FWK_33, + /* 34 */ AQ_FWK_34, + /* 35 */ AQ_FWK_35, + /* 36 */ AQ_FWK_36, + /* 37 */ AQ_FWK_37, + /* 38 */ AQ_FWK_38, + /* 39 */ AQ_FWK_39, + /* 40 */ AQ_FWK_40, + /* 41 */ AQ_FWK_41, + /* 42 */ AQ_FWK_42, + /* 43 */ AQ_FWK_43, + /* 44 */ AQ_FWK_44, + /* 45 */ AQ_FWK_45, + /* 46 */ AQ_FWK_46, + /* 47 */ AQ_FWK_47, + /* 48 */ AQ_FWK_48, + /* 49 */ AQ_FWK_49, + /* 50 */ AQ_FWK_MAX, +} BossAQfwork; + +typedef enum { + /* 0 */ AQ_VWK_0, + /* 1 */ AQ_VWK_1, + /* 2 */ AQ_VWK_2, + /* 3 */ AQ_VWK_3, + /* 4 */ AQ_VWK_4, + /* 5 */ AQ_VWK_5, + /* 6 */ AQ_VWK_6, + /* 7 */ AQ_VWK_7, + /* 8 */ AQ_VWK_8, + /* 9 */ AQ_VWK_9, + /* 10 */ AQ_VWK_10, + /* 11 */ AQ_VWK_11, + /* 12 */ AQ_VWK_12, + /* 13 */ AQ_VWK_13, + /* 14 */ AQ_VWK_14, + /* 15 */ AQ_VWK_15, + /* 16 */ AQ_VWK_16, + /* 17 */ AQ_VWK_17, + /* 18 */ AQ_VWK_18, + /* 19 */ AQ_VWK_19, + /* 20 */ AQ_VWK_20, + /* 21 */ AQ_VWK_21, + /* 22 */ AQ_VWK_22, + /* 23 */ AQ_VWK_23, + /* 24 */ AQ_VWK_24, + /* 25 */ AQ_VWK_25, + /* 26 */ AQ_VWK_26, + /* 27 */ AQ_VWK_27, + /* 28 */ AQ_VWK_28, + /* 29 */ AQ_VWK_29, + /* 30 */ AQ_VWK_30, + /* 31 */ AQ_VWK_31, + /* 32 */ AQ_VWK_32, + /* 33 */ AQ_VWK_33, + /* 34 */ AQ_VWK_34, + /* 35 */ AQ_VWK_35, + /* 36 */ AQ_VWK_36, + /* 37 */ AQ_VWK_37, + /* 38 */ AQ_VWK_38, + /* 39 */ AQ_VWK_39, + /* 40 */ AQ_VWK_40, + /* 41 */ AQ_VWK_41, + /* 42 */ AQ_VWK_42, + /* 43 */ AQ_VWK_43, + /* 44 */ AQ_VWK_44, + /* 45 */ AQ_VWK_45, + /* 46 */ AQ_VWK_46, + /* 47 */ AQ_VWK_47, + /* 48 */ AQ_VWK_48, + /* 49 */ AQ_VWK_49, + /* 50 */ AQ_VWK_MAX, +} BossAQvwork; + +f32 D_i3_801BFB60 = 0.0f; +s32 D_i3_801BFB64[11] = { + 0, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, +}; +u8 D_i3_801BFB90[12] = { + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, +}; +Gfx* D_i3_801BFB9C[3] = { D_6015FF0, D_6022110, D_6015DD0 }; +f32 D_i3_801BFBA8[2] = { 40.0f, -40.0f }; +f32 D_i3_801BFBB0[3] = { 20.0f, 10.0f, 15.0f }; +f32 D_i3_801BFBBC[3] = { 8.0f, 27.0f, 42.0f }; +f32 D_i3_801BFBC8[3] = { 15.0f, 6.0f, 7.0f }; +f32 D_i3_801BFBD4[3] = { 358.0f, 12.0f, 352.0f }; +f32 D_i3_801BFBE0[3][4] = { + { 1.3f, 0.1f, 1.0f, 777.0f }, + { 0.7f, 0.5f, 5.0f, 777.0f }, + { 1.0f, 0.2f, 2.0f, 777.0f }, +}; +f32 D_i3_801BFC10[3][4] = { + { 0.6f, 0.1f, 1.0f, 777.0f }, + { 1.5f, 0.5f, 5.0f, 777.0f }, + { 1.0f, 0.2f, 2.0f, 777.0f }, +}; +f32 D_i3_801BFC40[3][4] = { + { 1.3f, 0.1f, 1.0f, 777.0f }, + { 0.7f, 0.5f, 5.0f, 777.0f }, + { 1.0f, 0.2f, 2.0f, 777.0f }, +}; +s32 D_i3_801BFC70[3] = { 18, 22, 45 }; +f32 D_i3_801BFC7C[3] = { 20.0f, 10.0f, 0.0f }; +f32 D_i3_801BFC88[3] = { 10.0f, 320.0f, 30.0f }; +Vec3f D_i3_801BFC94[6 * 4] = { + { 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, + { 0.9f, 0.9f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f }, + { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.9f, 1.0f, 0.9f }, { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 0.9f, 1.0f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.8f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, +}; +s32 D_i3_801BFDB4[6 * 4] = { + 1, 5, 15, 100000, 1, 5, 15, 100000, 1, 5, 15, 100000, 1, 10, 20, 100000, 1, 10, 20, 100000, 1, 10, 20, 100000, +}; +s32 D_i3_801BFE14 = 0; +Vec3f D_i3_801BFE18[6 * 4] = { + { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, + { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, + { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.2f, 0.2f, 0.2f }, { 0.3f, 0.3f, 0.3f }, { 0.2f, 0.2f, 0.2f }, + { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, + { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, +}; +Vec3f D_i3_801BFF38[6 * 4] = { + { 1.0f, 1.0f, 1.0f }, { 5.0f, 5.0f, 5.0f }, { 10.0f, 10.0f, 10.0f }, { 5.0f, 5.0f, 5.0f }, { 1.0f, 1.0f, 1.0f }, + { 5.0f, 5.0f, 5.0f }, { 10.0f, 10.0f, 10.0f }, { 5.0f, 5.0f, 5.0f }, { 1.0f, 1.0f, 1.0f }, { 3.0f, 3.0f, 3.0f }, + { 2.0f, 2.0f, 2.0f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 3.0f, 1.0f, 3.0f }, { 2.0f, 1.0f, 2.0f }, + { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, { 3.0f, 1.0f, 3.0f }, { 2.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, { 1.0f, 4.0f, 3.0f }, { 1.0f, 3.0f, 2.0f }, { 1.0f, 1.0f, 1.0f }, +}; +f32 D_i3_801C0058 = 191.0f; +f32 D_i3_801C005C = 63.0f; +f32 D_i3_801C0060[7 * 2] = { + 50.0f, 8.0f, 50.0f, 8.0f, 10.0f, 1.0f, 20.0f, 2.0f, 20.0f, 2.0f, 20.0f, 2.0f, 50.0f, 2.0f, +}; +Vec3f D_i3_801C0098[2] = { + { 370.0f, -53.0f, 1085.0f }, + { -370.0f, -53.0f, 1085.0f }, +}; +f32 D_i3_801C00B0[3][4] = { + { 1.0f, 1.2f, 0.8f, 1.0f }, + { 1.0f, 1.2f, 0.9f, 1.0f }, + { 1.0f, 0.7f, 1.4f, 1.0f }, +}; +s32 D_i3_801C00E0[4] = { 1, 5, 8, 40 }; +f32 D_i3_801C00F0[3][4] = { + { 0.3f, 0.3f, 0.3f, 0.3f }, + { 0.3f, 0.3f, 0.3f, 0.3f }, + { 0.5f, 0.5f, 0.5f, 0.5f }, +}; +f32 D_i3_801C0120[3][4] = { + { 1.0f, 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f, 1.0f }, + { 2.0f, 2.0f, 2.0f, 2.0f }, +}; +f32 D_i3_801C0150[4][4] = { + { 0.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, -25.5f, 0.0f, 0.0f }, + { -25.5f, 25.5f, -25.5f, 0.0f }, + { 25.5f, 0.0f, 25.5f, 0.0f }, +}; +f32 D_i3_801C0190[5] = { + 0.0f, -30.0f, 30.0f, -30.0f, 30.0f, +}; + +PosRot* D_i3_801C27C0; +PosRot D_i3_801C27C8[4 * 50]; +Vtx D_i3_801C3A88[2][2][28]; +f32 D_i3_801C4188; +s32 D_i3_801C4190[10]; +f32 D_i3_801C41B8[30]; +s32 sBossAQlimbTimers[AQ_LIMB_MAX]; +s32 D_i3_801C42A0[25]; +f32 D_i3_801C4308[82]; +s32 D_i3_801C4450; +s32 D_i3_801C4454; +f32 D_i3_801C4458; +f32 D_i3_801C445C; + +void func_i3_801A8E30(void) { + s32 i; + f32 spA8[17]; + f32 sp64[17]; + s32 j; + Vtx* sp5C = SEGMENTED_TO_VIRTUAL(D_6031D90); + Vtx* sp58 = SEGMENTED_TO_VIRTUAL(D_6011A78); + + for (i = 0; i < 17; i++) { + if ((i == 0) || (i == 16)) { + spA8[i] = 0.0f; + sp64[i] = 0.0f; + } else { + spA8[i] = RAND_FLOAT_CENTERED(70.0f); + sp64[i] = RAND_FLOAT_CENTERED(70.0f); + } + } + for (i = 0; i < 34; i++) { + j = (sp5C[i].v.ob[2] + 200) / 25; + sp58[i].v.ob[0] = sp5C[i].v.ob[0] + spA8[j]; + sp58[i].v.ob[1] = sp5C[i].v.ob[1] + sp64[j]; + } +} + +void func_i3_801A92EC(Actor* actor, f32 xUnk, f32 yUnk, f32 zUnk, s32 index, s32 mode) { + gUnkEntities30[index].mode = mode; + gUnkEntities30[index].unk_28 = 10.0f; + gUnkEntities30[index].unk_04.x = actor->obj.pos.x; + gUnkEntities30[index].unk_04.y = actor->obj.pos.y; + gUnkEntities30[index].unk_04.z = actor->obj.pos.z; + gUnkEntities30[index].unk_10.x = xUnk; + gUnkEntities30[index].unk_10.y = yUnk; + gUnkEntities30[index].unk_10.z = zUnk; + gUnkEntities30[index].unk_2C = gUnkEntities30[index].unk_2D = gUnkEntities30[index].unk_2E = + gUnkEntities30[index].unk_2F = 255; + gUnkEntities30[index].timer = 3; +} + +void func_i3_801A9374(Actor* actor, Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 state, f32 scale, + s32 timerBC, s32 unk48) { + Actor_Initialize(actor); + actor->obj.status = OBJ_ACTIVE; + actor->obj.id = OBJ_ACTOR_189; + actor->state = state; + actor->scale = scale; + actor->unk_048 = unk48; + actor->obj.pos = *pos; + actor->obj.rot = *rot; + actor->vel.x = xVel; + actor->vel.y = yVel; + actor->vel.z = zVel; + actor->timer_0BC = timerBC; + actor->gravity = 0.5f; + Object_SetInfo(&actor->info, actor->obj.id); +} + +void func_i3_801A9448(Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, s32 timerBC, + s32 unk48) { + s32 i; + + for (i = 59; i >= 0; i--) { + if (gActors[i].obj.status == OBJ_FREE) { + func_i3_801A9374(&gActors[i], pos, rot, xVel, yVel, zVel, unkB8, scale, timerBC, unk48); + break; + } + } +} + +void func_i3_801A94EC(Vec3f* pos, ObjectId objId) { + Item* sp18; + Item* item; + s32 i; + + for (i = 0, item = gItems; i < ARRAY_COUNT(gItems); i++, item++) { + if (item->obj.status == OBJ_FREE) { + Item_Initialize(item); + item->obj.status = OBJ_INIT; + item->obj.id = objId; + item->obj.pos.x = pos->x; + item->obj.pos.y = pos->y; + item->obj.pos.z = pos->z; + item->timer_4A = 2; + Object_SetInfo(&item->info, item->obj.id); + break; + } + } +} + +f32 func_i3_801A958C(s32 arg0, f32 arg1) { + f32 var_fv1 = arg0 / 2.0f; + + var_fv1 = MIN(arg1, var_fv1); + + return var_fv1; +} + +void func_i3_801A95C8(void) { + Math_SmoothStepToF(&gPlayer[0].camEye.x, D_80177978, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camEye.y, D_80177980, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camEye.z, D_80177988, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camAt.x, D_801779A0, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camAt.y, D_801779B8, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camAt.z, D_801779C0, 0.1f, 50.0f, 0.0001f); +} + +void func_i3_801A96DC(Actor* actor) { + actor->obj.rot.y = RAD_TO_DEG(-gPlayer[0].unk_058); + actor->obj.rot.x = RAD_TO_DEG(gPlayer[0].unk_05C); +} + +void func_i3_801A9728(Actor* actor, f32 radius, f32 scale, s32 spread) { + f32 temp_fs0; + f32 temp_fs1; + f32 temp; + s32 i; + + for (i = 0; i < 36; i += spread) { + temp_fs1 = SIN_DEG(i * 10.0f) * radius; + temp_fs0 = COS_DEG(i * 10.0f) * radius; + temp = gGroundLevel + 30.0f; + func_8007B8F8(actor->obj.pos.x + temp_fs1, temp, actor->obj.pos.z + temp_fs0, scale); + } +} + +void func_i3_801A9824(void) { + s32 i; + f32* var_v0; + f32* var_v0_4; + s32* var_a0; + s32* var_v0_2; + s32* var_v0_3; + + gTeamShields[1] = gTeamShields[2] = gTeamShields[3] = 255; + for (i = 0; i < ARRAY_COUNT(D_i3_801C4190); i++) { + D_i3_801C4190[i] = 0; + } + for (i = 0; i < ARRAY_COUNT(D_i3_801C41B8); i++) { + D_i3_801C41B8[i] = 0.0f; + } + for (i = 0; i < AQ_LIMB_MAX; i++) { + sBossAQlimbTimers[i] = 0; + } + for (i = 0; i < ARRAY_COUNT(D_i3_801C42A0); i++) { + D_i3_801C42A0[i] = 0; + } + for (i = 0; i < ARRAY_COUNT(D_i3_801C4308); i++) { + D_i3_801C4308[i] = 0; + } + D_i3_801C4458 = D_i3_801C445C = 0.0f; + D_i3_801C4450 = D_i3_801C4454 = 0; + D_i3_801C41B8[12] = 40.0f; + D_i3_801C41B8[13] = 100.0f; + D_i3_801C41B8[14] = 120.0f; + D_i3_801C41B8[15] = 20.0f; + D_i3_801C41B8[16] = 30.0f; + D_i3_801C41B8[17] = 50.0f; + if (D_80177CA0 != 0) { + D_i3_801C41B8[12] = 0.0f; + D_i3_801C41B8[13] = 3.0f; + D_i3_801C41B8[14] = 5.0f; + D_i3_801C41B8[15] = 0.0f; + D_i3_801C41B8[16] = 0.0f; + D_i3_801C41B8[17] = 0.0f; + } + D_i3_801C4190[5] = 0; + D_i3_801C41B8[25] = D_8015F970; + D_i3_801C41B8[26] = 128.0f; +} + +void func_i3_801A99D4(Player* player) { + s32 sp24 = fabsf(player->unk_138 / 1000.0f); + + Math_SmoothStepToF(&D_8015F970, D_i3_801C41B8[25], 1.0f, 10.0f, 0.00001f); + Math_SmoothStepToF(&D_i3_801C4188, D_i3_801C41B8[26], 0.1f, 10.0f, 0.00001f); + if ((D_i3_801C4190[8] < sp24) && (D_i3_801C41B8[25] < 4600.0f)) { + D_i3_801C4190[8] = sp24; + D_i3_801C41B8[25] += 150.0f; + D_i3_801C41B8[26] = D_i3_801C4188 - 6.0f; + if (D_i3_801C41B8[26] < 0.0f) { + D_i3_801C41B8[26] = 0.0f; + } + if (D_i3_801C41B8[25] > 4600.0f) { + D_i3_801C41B8[25] = 4600.0f; + } + D_i3_801C41B8[12] -= 2.0f; + if (D_i3_801C41B8[12] < 0.0f) { + D_i3_801C41B8[12] = 0.0f; + } + D_i3_801C41B8[13] -= 6.0f; + if (D_i3_801C41B8[13] < 3.0f) { + D_i3_801C41B8[13] = 3.0f; + } + D_i3_801C41B8[14] -= 6.0f; + if (D_i3_801C41B8[14] < 5.0f) { + D_i3_801C41B8[14] = 5.0f; + } + D_i3_801C41B8[15] -= 1.0f; + if (D_i3_801C41B8[15] < 0.0f) { + D_i3_801C41B8[15] = 0.0f; + } + D_i3_801C41B8[16] -= 1.5f; + if (D_i3_801C41B8[16] < 0.0f) { + D_i3_801C41B8[16] = 0.0f; + } + D_i3_801C41B8[17] -= 2.5f; + if (D_i3_801C41B8[17] < 0.0f) { + D_i3_801C41B8[17] = 0.0f; + } + gLight1R = D_i3_801C41B8[12]; + gLight1G = D_i3_801C41B8[13]; + gLight1B = D_i3_801C41B8[14]; + gAmbientR = D_i3_801C41B8[15]; + gAmbientG = D_i3_801C41B8[16]; + gAmbientB = D_i3_801C41B8[17]; + } +} + +void func_i3_801A9C98(Player* player) { + Actor* actor; + s32 i; + s32 var_v0; + + if ((D_i3_801C4190[0] != 777) && (D_i3_801C4190[0] > 0)) { + i = D_i3_801C4190[0] - 1; + actor = &gActors[i]; + if ((actor->obj.status != OBJ_ACTIVE) || ((player->unk_138 - 300.0f) <= actor->obj.pos.z) || + (actor->obj.pos.z <= (player->unk_138 - 7000.0f)) || (actor->obj.id != D_i3_801C4190[1]) || + (actor->health == 0)) { + D_i3_801C4190[0] = D_i3_801C4190[3] = D_i3_801C4190[5] = + + D_i3_801C4190[1] = 0; + } else { + var_v0 = 1; + if (actor->info.hitbox[1] == 200000.0f) { + var_v0 = 5; + } + D_i3_801C41B8[2] = actor->obj.pos.z + actor->info.hitbox[var_v0 + 0] + actor->info.hitbox[var_v0 + 1]; + D_i3_801C41B8[1] = actor->obj.pos.y + actor->info.hitbox[var_v0 + 2]; + D_i3_801C41B8[0] = actor->obj.pos.x + actor->info.hitbox[var_v0 + 4]; + } + } +} + +void func_i3_801A9DE4(Player* player) { + s32 i; + + if (D_i3_801C4190[0] == 777) { + if ((gBosses[0].obj.status != OBJ_ACTIVE) || (gBosses[0].health == 0) || (fabsf(D_i3_801C4308[10]) <= 6.0f) || + ((D_i3_801C4190[4] == 121) && (gBosses[0].swork[AQ_SWK_12] == 0))) { + D_i3_801C4190[0] = D_i3_801C4190[4] = D_i3_801C4190[3] = D_i3_801C4190[5] = D_i3_801C4190[1] = 0; + } else { + i = D_i3_801C4190[4] - 2; + + D_i3_801C41B8[2] = gBosses[0].obj.pos.z + gBosses[0].info.hitbox[i + 0] + gBosses[0].info.hitbox[i + 1]; + D_i3_801C41B8[1] = gBosses[0].obj.pos.y + gBosses[0].info.hitbox[i + 2]; + D_i3_801C41B8[0] = gBosses[0].obj.pos.x + gBosses[0].info.hitbox[i + 4]; + } + } +} + +// Loop looks really fake. optimized out index? +void func_i3_801A9ED0(Player* player) { + s32 j; + s32 i; + s32 sp8C; + f32 temp_fa0; + f32 temp_fa1; + f32 temp_fv0; + f32 temp_fv1; + Vec3f sp70; + Vec3f sp64; + f32* tempy; + + Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp70.x = 0.0f; + sp70.y = 0.0f; + sp70.z = -1200.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp70, &sp64); + if (D_i3_801C4190[3] == 0) { + sp8C = D_i3_801C4190[4]; + + if ((fabsf(D_i3_801C4308[10]) >= 6.0f) && (gBosses[0].state >= 10) && (gBosses[0].obj.status == OBJ_ACTIVE) && + (gBosses[0].health != 0)) { + for (j = 119, i = 121; j < 199; j += 10, i += 10) { + if ((j == 119) || (j == 129) || (j == 139) || (j == 169)) { + tempy = &gBosses[0].info.hitbox[i]; + + temp_fv0 = gBosses[0].obj.pos.y + tempy[0] + tempy[1] + 200.0f; + temp_fa0 = gBosses[0].obj.pos.y + tempy[0] - tempy[1] - 200.0f; + temp_fv1 = gBosses[0].obj.pos.x + tempy[2] + tempy[3] + 200.0f; + temp_fa1 = gBosses[0].obj.pos.x + tempy[2] - tempy[3] - 200.0f; + if ((gBosses[0].state >= 10) && ((player->pos.y + sp64.y) <= temp_fv0) && + (temp_fa0 <= (player->pos.y + sp64.y)) && ((player->pos.x + sp64.x) <= temp_fv1) && + (temp_fa1 <= (player->pos.x + sp64.x))) { + if (D_i3_801C41B8[11] >= + fabsf(player->unk_138 - gBosses[0].obj.pos.z - gBosses[0].info.hitbox[j])) { + D_i3_801C41B8[11] = + fabsf(player->unk_138 - gBosses[0].obj.pos.z - gBosses[0].info.hitbox[j]); + D_i3_801C4190[0] = 777; + D_i3_801C4190[4] = i; + D_i3_801C4190[1] = OBJ_BOSS_AQ; + } + if (((j == 129) && (gBosses[0].swork[AQ_SWK_8] == 0)) || + ((j == 139) && (gBosses[0].swork[AQ_SWK_9] == 0)) || + ((j == 119) && (gBosses[0].swork[AQ_SWK_12] == 0))) { + D_i3_801C4190[0] = D_i3_801C4190[4] = D_i3_801C4190[3] = D_i3_801C4190[5] = + D_i3_801C4190[1] = 0; + } + } + } + } + if ((sp8C != D_i3_801C4190[4]) && (D_i3_801C41B8[5] == 3.0f)) { + Audio_PlaySfx(0x4900001B, D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_i3_801C41B8[5] = 20.0f; + } + } + } + func_i3_801A9DE4(player); +} + +void func_i3_801AA20C(void) { + f32 var_fs1; + f32 var_fs2; + s32 i; + + if (gPlayer[0].unk_234 != 0) { + Matrix_Push(&gGfxMatrix); + Math_SmoothStepToF(&D_i3_801C41B8[5], 3.0f, 1.0f, 4.0f, 0.0001f); + RCP_SetupDL(&gMasterDisp, 0x3D); + if (D_i3_801C4190[3] == 0) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); + var_fs1 = -10.0f; + var_fs2 = 10.0f; + if (D_i3_801C4190[0] != 0) { + var_fs1 = var_fs2 = 0.0f; + } + Matrix_Translate(gGfxMatrix, D_i3_801C41B8[0] + var_fs1, D_i3_801C41B8[1] + var_fs2, + D_i3_801C41B8[2] + gPlayer[0].unk_144, 1); + Matrix_Scale(gGfxMatrix, D_i3_801C41B8[5], D_i3_801C41B8[5], D_i3_801C41B8[5], 1); + for (i = 0; i < 4; i++) { + Matrix_RotateZ(gGfxMatrix, M_PI / 2, 1); + Matrix_Translate(gGfxMatrix, var_fs1, var_fs2, 0.0f, 1); + Matrix_Push(&gGfxMatrix); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3000470); + Matrix_Pop(&gGfxMatrix); + } + } else { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + Matrix_Translate(gGfxMatrix, D_i3_801C41B8[0], D_i3_801C41B8[1], D_i3_801C41B8[2] + gPlayer[0].unk_144, 1); + Matrix_Scale(gGfxMatrix, D_i3_801C41B8[5], D_i3_801C41B8[5], D_i3_801C41B8[5], 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3000130); + } + Matrix_Pop(&gGfxMatrix); + } +} + +void func_i3_801AA4BC(Player* player) { + f32 sp3C; + f32 sp38; + + if (player->unk_230 == 0) { + sp3C = 0.0f; + sp38 = 0.1f; + if ((gInputHold->button & Z_TRIG) && !(gInputHold->button & R_TRIG)) { + sp3C = 90.0f; + sp38 = 0.2f; + if (player->unk_12C < 70.0f) { + Math_SmoothStepToF(&player->wings.unk_04, -70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_08, -70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_0C, 70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_10, 70.0f, 0.3f, 100.0f, 0); + } + } + if ((gInputHold->button & R_TRIG) && !(gInputHold->button & Z_TRIG)) { + sp3C = -90.0f; + sp38 = 0.2f; + if (player->unk_12C > -70.0f) { + Math_SmoothStepToF(&player->wings.unk_04, 70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_08, 70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_0C, -70.0f, 0.3f, 100.0f, 0); + Math_SmoothStepToF(&player->wings.unk_10, -70.0f, 0.3f, 100.0f, 0); + } + } + Math_SmoothStepToF(&player->unk_12C, sp3C, sp38, 10.0f, 0); + } + if ((gInputPress->button & Z_TRIG) && (player->unk_230 == 0)) { + player->unk_48C = 1; + if (player->timer_1E0 != 0) { + player->unk_1DC = 1; + player->timer_1E8 = 10; + player->unk_1EC = player->unk_1F0 = 30; + player->unk_494 = 1; + } else { + player->timer_1E0 = 10; + } + } + if ((gInputPress->button & R_TRIG) && (player->unk_230 == 0)) { + player->unk_48C = 1; + if (player->timer_1E4 != 0) { + player->unk_1DC = 1; + player->timer_1E8 = 10; + player->unk_1EC = player->unk_1F0 = -30; + player->unk_494 = 1; + } else { + player->timer_1E4 = 10; + } + } + Math_SmoothStepToF(&player->unk_150, 1.0f, 0.05f, 10.0f, 0.0001f); + player->unk_130 = Math_ModF(player->unk_130, 360.0f); + if (player->unk_280 > 0) { + player->unk_280 -= 30; + if (player->unk_280 <= 0) { + player->unk_280 = 0; + } + } + if (player->unk_1DC == 0) { + Math_SmoothStepToF(&player->unk_130, 0.0f, 0.1f, 10.0f, 0.00001f); + } + if (player->timer_1E0 != 0) { + player->timer_1E0--; + } + if (player->timer_1E4 != 0) { + player->timer_1E4--; + } + if (player->timer_214 != 0) { + player->timer_214--; + } + if (player->timer_218 != 0) { + player->timer_218--; + } + if (player->timer_1E8 != 0) { + player->timer_1E8--; + } + if (player->unk_1DC != 0) { + player->timer_1E0 = player->timer_1E4 = 0; + player->unk_150 = 1.5f; + player->unk_130 += player->unk_1EC; + if (player->timer_1E8 == 0) { + if (player->unk_1EC > 0) { + player->unk_1EC -= 5; + } + if (player->unk_1EC < 0) { + player->unk_1EC += 5; + } + if (player->unk_1EC == 0) { + player->unk_1DC = 0; + } + } else { + if (player->unk_280 < 180) { + player->unk_280 += 60; + if (player->unk_280 > 180) { + player->unk_280 = 180; + } + } + } + } +} + +void func_i3_801AA8E8(Player* player) { + f32 var_fv0 = gInputPress->stick_x; + f32 var_fv1 = -gInputPress->stick_y; + f32 temp; + + if (player->state_1C8 != PLAYERSTATE_1C8_3) { + var_fv0 = var_fv1 = 0.0f; + } + Math_SmoothStepToF(&player->unk_030, var_fv0, 0.05f, 1.0f, 0.05f); + if (player->pos.y < (gGroundLevel + 50.0f)) { + Math_SmoothStepToF(&player->unk_02C, var_fv1 * 0.3f, 0.05f, 1.0f, 0.05f); + } else { + Math_SmoothStepToF(&player->unk_02C, var_fv1, 0.05f, 2.0f, 0.05f); + } + D_80177978 = (player->pos.x - player->unk_0AC) * (600.0f / player->unk_09C); + D_80177978 -= player->unk_030 * 1.5f; + D_80177978 += player->unk_0AC + D_i3_801C41B8[9]; + D_80177980 = player->pos.y * (740.0f / player->unk_0A0); + D_80177980 -= player->unk_02C - 50.0f; + D_80177980 += player->unk_0B0; + D_801779A0 = (player->pos.x - player->unk_0AC - D_i3_801C41B8[9]) * (600.0f / player->unk_09C); + D_801779A0 += player->unk_084 * -2.0f; + D_801779A0 -= player->unk_030 * 0.5f; + D_801779A0 += player->unk_0AC; + D_801779B8 = (player->pos.y - player->unk_0B0) * (750.0f / player->unk_0A0); + D_801779B8 += player->unk_060 * 10.0f; + D_801779B8 -= player->unk_02C * -0.55f; + D_801779B8 += player->unk_0B0 + D_i3_801C41B8[10]; + if (D_801779B8 < 20.0f) { + D_801779B8 = 20.0f; + } + D_80177988 = 240.0f; + D_801779C0 = player->unk_138 + (D_80177D20 - 1.0f); + Math_SmoothStepToF(&player->camEye.x, D_80177978, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->camEye.y, D_80177980, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->camEye.z, D_80177988, 0.2f, 30.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->unk_014, 1.0f, 1.0f, 0.05f, 0.0f); + temp = -player->unk_0EC; + Math_SmoothStepToF(&player->unk_034, temp * 0.3f, 0.1f, 1.5f, 0.0f); +} + +void func_i3_801AACF8(Player* player) { + Vec3f sp8C; + Vec3f sp80; + Vec3f sp74; + Vec3f sp68; + f32 sp64; + f32 sp60; + f32 sp5C; + f32 sp58; + f32 var_fa0; + f32 var_fa1; + f32 var_fv1_2; + s32 pad; + + func_i3_801AA4BC(player); + func_i3_801A99D4(player); + func_i3_801A8E30(); + sp64 = -gInputPress->stick_x; + sp5C = gInputPress->stick_y; + D_80177970 = 0.68f; + Math_SmoothStepToF(&player->unk_180, sp64 * D_80177970, 1.0f, 10.0f, 0.0001f); + var_fa0 = fabsf(player->unk_180 * 0.5f); + if (var_fa0 > 2.0f) { + var_fa0 = 2.0f; + } + if (player->unk_180 < 0.0f) { + if (D_i3_801C41B8[3] > player->unk_180) { + D_i3_801C41B8[3] -= var_fa0; + } + } else { + if (D_i3_801C41B8[3] < player->unk_180) { + D_i3_801C41B8[3] += var_fa0; + } + } + Math_SmoothStepToF(&D_i3_801C41B8[3], player->unk_180, 0.1f, 2.0f, 0.00001f); + sp60 = D_i3_801C41B8[3]; + D_80177968 = 7.0f; + if ((player->pos.x < (-player->unk_09C + player->unk_0AC + 10.0f)) && (sp60 >= 20.0f)) { + D_80177968 = 2.0f; + Math_SmoothStepToF(&D_i3_801C41B8[9], 30.0f, 0.1f, 10.0f, 0.0001f); + } + if ((player->pos.x > (player->unk_09C + player->unk_0AC - 10.0f)) && (sp60 <= -20.0f)) { + D_80177968 = 2.0f; + Math_SmoothStepToF(&D_i3_801C41B8[9], -30.0f, 0.1f, 10.0f, 0.0001f); + } + Math_SmoothStepToF(&player->unk_0E8, sp60, 0.3f, D_80177968, 0.00001f); + if (D_80177968 != 2.0f) { + Math_SmoothStepToF(&D_i3_801C41B8[9], 0.0f, 0.1f, 20.0f, 0.0001f); + } + Math_SmoothStepToF(&player->unk_17C, sp5C * D_80177970, 1.0f, 7.0f, 0.0001f); + var_fa1 = fabsf(player->unk_17C * 0.05f); + if (var_fa1 > 2.0f) { + var_fa1 = 2.0f; + } + if (player->unk_17C * -1.0f < 0.0f) { + if (D_i3_801C41B8[4] > player->unk_17C) { + D_i3_801C41B8[4] -= var_fa1; + } + } else { + if (D_i3_801C41B8[4] < player->unk_17C) { + D_i3_801C41B8[4] += var_fa1; + } + } + Math_SmoothStepToF(&D_i3_801C41B8[4], player->unk_17C * -1.0f, 0.1f, 3.0f, 0.00001f); + sp58 = D_i3_801C41B8[4] * 0.8f; + D_80177968 = 10.0f; + if (player->pos.y < (gGroundLevel + 50.0f)) { + if (sp58 <= 0.0f) { + sp58 = 0.0f; + D_80177968 = 2.0f; + if (D_i3_801C4190[7] == 0) { + Audio_PlaySfx(0x9404028, player->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_i3_801C4190[7] = 1; + } + } + } else { + D_i3_801C4190[7] = 0; + } + if ((player->unk_0A0 - 50.0f) <= player->pos.y) { + if (sp58 >= 0.0f) { + Math_SmoothStepToF(&D_i3_801C41B8[10], 30.0f, 1.0f, 1.0f, 0.00001f); + } + } else { + Math_SmoothStepToF(&D_i3_801C41B8[10], 0.0f, 0.1f, 1.0f, 0.00001f); + } + Math_SmoothStepToF(&player->unk_0E4, sp58, 1.0f, D_80177968, 0.00001f); + var_fv1_2 = 2.0f; + if (sp64 == 0.0f) { + var_fv1_2 = 1.0f; + } + Math_SmoothStepToF(&player->unk_0EC, player->unk_180 * 0.7f, 0.08f, var_fv1_2, 0.0001f); + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8 + 180.0f) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -((player->unk_120 + player->unk_0E4 + player->unk_4D8) * M_DTOR), 1); + sp8C.x = sp8C.y = 0.0f; + sp8C.z = player->unk_0D0; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp68); + sp68.x *= 1.4f; + sp68.y *= 1.4f; + Matrix_RotateY(gCalcMatrix, player->unk_114 * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, player->unk_120 * M_DTOR, 1); + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp68, &sp80); + sp8C.x = sp8C.y = 0.0f; + sp8C.z = -player->unk_110; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp74); + player->vel.x = (sp80.x + sp74.x) * player->unk_150; + player->vel.y = (sp80.y + sp74.y) * player->unk_150; + player->vel.z = sp80.z + sp74.z; + player->pos.x += player->vel.x; + if (player->pos.x > player->unk_09C + player->unk_0AC) { + player->pos.x = player->unk_09C + player->unk_0AC; + player->vel.x = 0.0f; + } + if (player->pos.x < player->unk_0AC - player->unk_09C) { + player->pos.x = player->unk_0AC - player->unk_09C; + player->vel.x = 0.0f; + } + player->pos.y += player->vel.y; + if (player->pos.y > player->unk_0A0) { + player->pos.y = player->unk_0A0; + player->vel.y = 0.0f; + } + if (player->pos.y < player->unk_0A4) { + player->pos.y = player->unk_0A4; + player->vel.y = 0.0f; + } + if (player->pos.x > (player->unk_0AC + (player->unk_09C - 100.0f))) { + player->unk_228 = 1; + } + if (player->pos.x < (player->unk_0AC - (player->unk_09C - 100.0f))) { + player->unk_228 = 2; + } + if (player->pos.y > (player->unk_0B0 + (player->unk_0A0 - 100.0f))) { + player->unk_228 = 8; + } + if (player->pos.y <= (gGroundLevel + 100)) { + player->unk_228 = 4; + } + if (D_i3_801C4190[6] != 0) { + player->unk_0D0 = 20.0f; + Math_SmoothStepToF(&D_i3_801BFB60, -40.0f, 0.01f, 0.1f, 0.0f); + player->vel.z += D_i3_801BFB60; + if (player->vel.z <= 0.0f) { + player->vel.z = 0.0f; + } + } + player->pos.z += player->vel.z; + player->unk_138 = player->pos.z; + player->unk_060 = SIN_DEG(player->unk_0F4 * 0.7f) * 0.5f; + player->unk_088 += 10.0f; + player->unk_0F4 += 8.0f + D_i3_801C41B8[24]; + player->unk_080 = -SIN_DEG(player->unk_088) * 0.5f; + player->unk_0F0 = SIN_DEG(player->unk_0F4) * 1.5f; + if (player->pos.y < (D_80177CC0 + 50.0f)) { + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp8C.x = sp8C.y = 0.0f; + sp8C.z = 70.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp80); + if (player->unk_110 > 1.0f) { + player->unk_178 -= 30.0f; + func_i3_801AC8A8(player->pos.x + RAND_FLOAT_CENTERED(10.0f) + sp80.x, + player->pos.y + RAND_FLOAT_CENTERED(10.0f) + sp80.y, + player->unk_138 + RAND_FLOAT_CENTERED(10.0f) + (sp80.z * -1.0f), 0.4f, 1); + } else { + player->unk_178 -= 10.0f; + if (!(gGameFrameCount & 7)) { + func_i3_801AC8A8(player->pos.x + RAND_FLOAT_CENTERED(10.0f) + sp80.x, + player->pos.y + RAND_FLOAT_CENTERED(10.0f) + sp80.y, + player->unk_138 + RAND_FLOAT_CENTERED(20.0f) + sp80.z, 0.4f, 0); + } + } + } +} + +void func_i3_801AB9B0(Player* player) { + func_8007D0E0(player->pos.x, player->pos.y, player->unk_138, 6.0f); + func_8007B344(player->pos.x, player->pos.y, player->unk_138, 3.0f, 5); + func_8007BFFC(player->pos.x, player->pos.y, player->unk_138, 0.0f, 0.0f, 0.0f, 3.0f, 80); + func_8004D440(player); +} + +void func_i3_801ABA40(PlayerShot* shot) { + f32 sp7C; + f32 sp78; + f32 sp74; + f32 sp70; + f32 sp6C; + Vec3f sp60; + Vec3f sp54; + + D_i3_801C41B8[21] = shot->obj.pos.x; + D_i3_801C41B8[22] = shot->obj.pos.y; + D_i3_801C41B8[23] = shot->obj.pos.z; + if ((fabsf(shot->obj.pos.z - (gPlayer[0].camEye.z - D_80177D20)) > 10000.0f) || + (fabsf(shot->obj.pos.y - gPlayer[0].camEye.y) > 1500.0f) || + ((fabsf(shot->obj.pos.x - gPlayer[0].camEye.x) > 4000.0f) && (shot->unk_5C != 0))) { + shot->unk_64 = 0; + } + if (shot->obj.pos.y < gGroundLevel) { + shot->obj.pos.y = gGroundLevel + 2.0f; + func_800365E4(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z, 0.0f, 0.0f, 0.0f, 0.0f, 90.0f, 2.0f, 0, 0); + func_8007CF30(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z, 1.2f); + D_i3_801C4190[5] = D_i3_801C4190[3] = 0; + func_80036318(shot); + } else if (((shot->unk_64 == 0) || (D_i3_801C4454 == 0)) && (shot->unk_5C != 0)) { + func_8007CF30(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z, 1.2f); + D_i3_801C41B8[21] = D_i3_801C41B8[22] = D_i3_801C41B8[23] = 0.0f; + D_i3_801C4190[5] = D_i3_801C4190[3] = 0; + func_80036318(shot); + } else { + Math_SmoothStepToF(&shot->unk_48, 50.0f, 0.2f, 10.0f, 0.00001f); + shot->obj.rot.z += shot->unk_48; + if (!(gGameFrameCount & 1)) { + func_80035DEC(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z); + } + func_80038140(shot); + shot->unk_2C = (shot->obj.pos.y * 0.01f) + 1.2f; + shot->unk_30 = (shot->obj.pos.y * 0.003f) + 0.6f; + shot->unk_34 = (shot->obj.pos.y * 0.001f) + 0.6f; + shot->unk_58 = (shot->obj.pos.y * -0.24f) + 150.0f; + if (shot->unk_58 < 30) { + shot->unk_58 = 30; + } + switch (shot->unk_5C) { + case 0: + shot->unk_64 = 50; + shot->obj.rot.y = gPlayer[0].unk_0E8; + shot->obj.rot.x = gPlayer[0].unk_0E4; + shot->unk_5C++; + break; + case 1: + if (D_i3_801C4190[3] != 0) { + sp7C = shot->obj.pos.x - D_i3_801C41B8[0]; + sp78 = shot->obj.pos.y - D_i3_801C41B8[1]; + sp74 = shot->obj.pos.z - D_i3_801C41B8[2]; + sp6C = Math_RadToDeg(Math_Atan2F(sp7C, sp74)); + sp70 = Math_RadToDeg(-Math_Atan2F(sp78, sqrtf(SQ(sp7C) + SQ(sp74)))); + Math_SmoothStepToAngle(&shot->obj.rot.y, sp6C, 1.0f, 100.0f, 0.00001f); + Math_SmoothStepToAngle(&shot->obj.rot.x, sp70, 1.0f, 100.0f, 0.00001f); + if (shot->unk_64 < 2) { + if (D_i3_801C4458 < -30.0f) { + D_i3_801C4458 += 20.0f; + } + if (D_i3_801C445C < 1.0f) { + D_i3_801C445C += 0.25f; + } + shot->unk_64 = 10; + } + } + if (shot->unk_54 == 0) { + shot->unk_54 = -30.0f; + } + if (!(gGameFrameCount & 3)) { + Math_SmoothStepToF(&shot->unk_54, D_i3_801C4458, 0.1f, 50.0f, 0.0001f); + } + Matrix_RotateY(gCalcMatrix, shot->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, shot->obj.rot.x * M_DTOR, 1); + sp60.x = sp60.y = 0.0f; + sp60.z = shot->unk_54; + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp54); + shot->vel.x = sp54.x; + shot->vel.y = sp54.y; + shot->vel.z = sp54.z; + if ((shot->obj.pos.y < (gGroundLevel + 30.0f)) && (shot->vel.y < 0.0f) && (D_i3_801C4190[3] != 0)) { + shot->vel.y = 0.0f; + } + break; + } + if (D_i3_801C4454 < 297) { + D_80178370 = shot->obj.pos.x; + D_80178374 = shot->obj.pos.y; + D_80178378 = shot->obj.pos.z; + D_80178360 = 255; + D_80178364 = 200; + D_80178368 = 150; + Math_SmoothStepToF(&D_8017836C, 0.8f, 1.0f, 0.08f, 0.001f); + } + if (D_i3_801C4454 != 0) { + D_i3_801C4454--; + } + } +} + +void func_i3_801AC09C(Player* player) { + s32 i; + PlayerShot* shot; + + for (i = 15, shot = &gPlayerShots[15]; i < 16; i++, shot++) { + if (shot->obj.status == OBJ_FREE) { + func_800AC290(player, shot, 0.0f, 0.0f, PLAYERSHOT_8, 50.0f); + Audio_PlaySfx(0x1000025, shot->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_i3_801C4190[5] = i + 1; + D_i3_801C4454 = 300; + D_i3_801C4458 = -100.0f; + D_i3_801C445C = 0.1f; + D_8017836C = 1.0f; + break; + } + } +} + +void func_i3_801AC18C(Player* player) { + s32 i; + + for (i = 0; i < 3; i++) { + if (gPlayerShots[i].obj.status == OBJ_FREE) { + func_800AC290(player, &gPlayerShots[i], 0.0f, -10.0f, PLAYERSHOT_0, 120.0f); + if (gLaserStrength[gPlayerNum] == LASERS_SINGLE) { + Audio_PlaySfx(0x9400021, gPlayerShots[i].sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else { + Audio_PlaySfx(0x9400027, gPlayerShots[i].sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + } + } +} + +void func_i3_801AC274(Player* player) { + s32 temp; + s32 i; + f32 tempy1; + f32 tempy2; + f32 tempx1; + f32 tempx2; + s32 var_v1; + Vec3f sp68; + Vec3f sp5C; + Actor* actor; + + if ((gPlayerShots[D_i3_801C4190[5] - 1].obj.status == OBJ_FREE) && (D_i3_801C4190[5] != 0)) { + D_i3_801C41B8[21] = D_i3_801C41B8[22] = D_i3_801C41B8[23] = 0.0f; + D_i3_801C4190[5] = D_i3_801C4190[3] = 0; + } + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp68.x = 0.0f; + sp68.y = 0.0f; + sp68.z = -1200.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp68, &sp5C); + D_i3_801C41B8[6] = player->pos.x + sp5C.x; + D_i3_801C41B8[7] = player->pos.y + sp5C.y; + D_i3_801C41B8[8] = player->unk_138 + sp5C.z; + if (D_i3_801C4190[3] == 0) { + + if (D_i3_801C4190[0] == 0) { + D_i3_801C41B8[0] = player->pos.x + sp5C.x; + D_i3_801C41B8[1] = player->pos.y + sp5C.y; + D_i3_801C41B8[2] = player->unk_138 + sp5C.z; + D_i3_801C41B8[5] = 3.0f; + } + D_i3_801C41B8[11] = 10000.0f; + temp = D_i3_801C4190[0]; + for (i = 0, actor = gActors; i < 60; i++, actor++) { + if ((actor->obj.status == OBJ_ACTIVE) && (actor->obj.id != OBJ_ACTOR_189)) { + var_v1 = 1; + if (actor->info.hitbox[1] == HITBOX_UNK_2) { + var_v1 = 5; + } + tempy1 = actor->obj.pos.y + actor->info.hitbox[var_v1 + 2] + actor->info.hitbox[var_v1 + 3] + 200.0f; + tempy2 = actor->obj.pos.y + actor->info.hitbox[var_v1 + 2] - actor->info.hitbox[var_v1 + 3] - 200.0f; + tempx1 = actor->obj.pos.x + actor->info.hitbox[var_v1 + 4] + actor->info.hitbox[var_v1 + 5] + 200.0f; + tempx2 = actor->obj.pos.x + actor->info.hitbox[var_v1 + 4] - actor->info.hitbox[var_v1 + 5] - 200.0f; + if ((actor->health > 0) && (actor->timer_0C2 < 5) && (actor->obj.pos.z <= (player->unk_138 - 300.0f)) && + ((player->unk_138 - 7000.0f) <= actor->obj.pos.z) && (player->pos.y + sp5C.y <= tempy1) && + (tempy2 <= player->pos.y + sp5C.y) && (player->pos.x + sp5C.x <= tempx1) && + (tempx2 <= player->pos.x + sp5C.x) && + (fabsf(player->unk_138 - actor->obj.pos.z - actor->info.hitbox[var_v1 + 0]) < D_i3_801C41B8[11])) { + D_i3_801C41B8[11] = fabsf(player->unk_138 - actor->obj.pos.z - actor->info.hitbox[var_v1 + 0]); + D_i3_801C4190[0] = actor->index + 1; + D_i3_801C4190[1] = actor->obj.id; + } + } + } + + if ((D_i3_801C4190[0] != temp) && (D_i3_801C41B8[5] == 3.0f)) { + Audio_PlaySfx(0x4900001B, D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_i3_801C41B8[5] = 20.0f; + } + if (D_i3_801C4190[0] != 0) { + func_i3_801A9C98(player); + } + if (gBosses[0].health != 0) { + func_i3_801A9ED0(player); + } + } else { + func_i3_801A9C98(player); + func_i3_801A9DE4(player); + } + if (gInputPress->button & A_BUTTON) { + func_i3_801AC18C(player); + } + if (gInputPress->button & B_BUTTON) { + func_i3_801AC09C(player); + if (D_i3_801C4190[0] != 0) { + D_i3_801C4190[3] = 1; + } + } + if (D_i3_801C4190[5] == 0) { + D_80178370 = player->pos.x; + D_80178374 = player->pos.y - 5.0f; + D_80178378 = player->unk_138 - 60.0f; + + D_80178360 += 4; + D_80178364 += 3; + D_80178368 += 2; + if (D_80178360 >= 255) { + D_80178360 = 255; + } + if (D_80178364 > 200) { + D_80178364 = 200; + } + if (D_80178368 > 150) { + D_80178368 = 150; + } + Math_SmoothStepToF(&D_8017836C, 0.2f, 1.0f, 0.04f, 0.001f); + } +} + +void func_i3_801AC7C8(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 state) { + Effect_Initialize(effect); + effect->obj.status = OBJ_INIT; + effect->obj.id = OBJ_EFFECT_366; + effect->obj.pos.x = xPos; + effect->obj.pos.y = yPos; + effect->obj.pos.z = zPos; + effect->scale1 = RAND_FLOAT(360.0f); + effect->state = state; + effect->unk_4A = 40; + effect->scale2 = scale2 * 0.2f; + effect->unk_46 = 50; + effect->unk_60.y = gPlayer[0].unk_0E8 + gPlayer[0].unk_114; + if (effect->state == 2) { + effect->unk_46 = 100; + } + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i3_801AC8A8(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 unk4E) { + s32 i; + + for (i = 0; i < 95; i++) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_801AC7C8(&gEffects[i], xPos, yPos, zPos, scale2, unk4E); + break; + } + } +} + +// OBJ_EFFECT_366 action +void func_i3_801AC918(Effect* effect) { + f32 temp_fs0; + + if (effect->unk_46 != 0) { + effect->unk_46--; + } + switch (effect->state) { + case 0: + if (effect->vel.y < 5.0f) { + effect->vel.y += 0.1f; + } + if (effect->unk_46 == 0) { + Object_Kill(&effect->obj, effect->sfxPos); + } + effect->scale1 += 33.0f; + temp_fs0 = COS_DEG(effect->scale1) * 1.5f; + effect->vel.x = __cosf(gPlayer[0].unk_058) * temp_fs0; + effect->vel.z = __sinf(gPlayer[0].unk_058) * temp_fs0; + break; + case 1: + if (effect->unk_46 == 0) { + Object_Kill(&effect->obj, effect->sfxPos); + } + effect->unk_60.x += 0.07f; + effect->scale1 += 33.0f; + + effect->vel.y = effect->unk_60.x + (SIN_DEG(effect->scale1) * 3.0f); + temp_fs0 = COS_DEG(effect->scale1) * 3.0f; + effect->vel.x = COS_DEG(effect->unk_60.y) * temp_fs0; + effect->vel.z = -SIN_DEG(effect->unk_60.y) * temp_fs0; + break; + case 2: + if (effect->vel.y < 10.0f) { + effect->vel.y += 0.2f; + } + if (effect->unk_46 == 0) { + Object_Kill(&effect->obj, effect->sfxPos); + } + effect->scale1 += 55.0f; + temp_fs0 = COS_DEG(effect->scale1) * 2.5f; + effect->vel.x = __cosf(gPlayer[0].unk_058) * temp_fs0; + effect->vel.z = __sinf(gPlayer[0].unk_058) * temp_fs0; + break; + } +} + +void func_i3_801ACBB4(Player* player) { + Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, -40.0f, 1); + Matrix_RotateY(gGfxMatrix, M_PI, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3000C70); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, -4.5f, 1.2f, 1); + Matrix_RotateZ(gGfxMatrix, player->unk_178 * M_DTOR, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3006DE0); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 2.0f, 40.0f, 1); + Matrix_RotateY(gGfxMatrix, -player->unk_180 * M_DTOR, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3006C70); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, -19.0f, -3.6f, 1.2f, 1); + Matrix_RotateX(gGfxMatrix, player->unk_17C * M_DTOR, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3000AF0); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 19.0f, -3.6f, 1.2f, 1); + Matrix_RotateX(gGfxMatrix, player->unk_17C * M_DTOR, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_3006AF0); + Matrix_Pop(&gGfxMatrix); +} + +void func_i3_801ACE50(Player* player) { + f32 pad; + f32 pad2; + Vec3f sp54; + Vec3f sp48; + + player->boost = 0; + if (player->timer_27C != 0) { + player->timer_27C--; + player->unk_110 += 0.3f; + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp54.x = sp54.y = 0.0f; + sp54.z = 70.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); + func_i3_801AC8A8(player->pos.x + RAND_FLOAT_CENTERED(10.0f) + sp48.x, + player->pos.y + RAND_FLOAT_CENTERED(10.0f) + sp48.y, + player->unk_138 + RAND_FLOAT_CENTERED(10.0f) + (sp48.z * -1.0f), 0.4f, 1); + Math_SmoothStepToF(&player->unk_08C, -130.0f, 0.1f, 10.0f, 0.00001f); + player->unk_130 -= player->unk_258; + player->unk_258 += 0.2f; + if (player->unk_258 > 50.0f) { + player->unk_258 = 50.0f; + } + if (!(gGameFrameCount & 1) && (gBlurAlpha > 64)) { + gBlurAlpha -= 1; + } + } else { + player->unk_258 = 0.0f; + if (gBlurAlpha < 255) { + gBlurAlpha += 4; + if (gBlurAlpha >= 252) { + gBlurAlpha = 255; + } + } + if (!(gBrakeButton[player->num] & gInputHold->button) && !(gBoostButton[player->num] & gInputHold->button)) { + player->unk_2B4 = 1; + if (player->unk_2BC == 0.0f) { + player->unk_2B4 = 0; + } + } + if ((gBoostButton[player->num] & gInputHold->button) && (player->unk_230 == 0) && + (player->state_1C8 != PLAYERSTATE_1C8_5) && (player->unk_2B4 == 0)) { + if (player->unk_2BC == 0) { + Audio_PlaySfx(0x9004030, player->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + player->unk_2BC += 3.0f; + if (player->unk_2BC > 90.0f) { + player->unk_2BC = 90.0f; + player->unk_2B4 = 1; + } + player->unk_110 += 2.0f; + if (player->unk_110 > 10.0f) { + player->unk_110 = 10.0f; + } + Math_SmoothStepToF(&D_i3_801C41B8[27], 10.0f, 0.1f, 2.0f, 0.00001f); + Math_SmoothStepToF(&player->unk_08C, -200.0f, 0.1f, D_i3_801C41B8[27], 0.00001f); + player->boost = 1; + Math_SmoothStepToF(&D_801779A8[0], 50.0f, 1.0f, 10.0f, 0.0f); + } else { + D_i3_801C41B8[27] = 0.0f; + if (player->unk_2BC > 0.0f) { + player->unk_2BC -= 0.50f; + if (player->unk_2BC <= 0.0f) { + player->unk_2BC = 0.0f; + player->unk_2B4 = 0; + } + } + if (player->unk_110 > 0.0f) { + player->unk_110 -= 1.0f; + if (player->unk_110 < 0.0f) { + player->unk_110 = 0.0f; + } + } + } + } + Math_SmoothStepToF(&player->unk_08C, 0.0f, 0.1f, 2.0f, 0.0f); +} + +void func_i3_801AD328(Player* player) { + player->brake = 0; + if ((gBrakeButton[player->num] & gInputHold->button) && (player->unk_230 == 0) && + (player->state_1C8 != PLAYERSTATE_1C8_5) && (player->unk_2B4 == 0)) { + if (player->unk_2BC == 0) { + Audio_PlaySfx(0x9004031, player->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + player->unk_2BC += 3.0f; + if (player->unk_2BC > 90.0f) { + player->unk_2BC = 90.0f; + player->unk_2B4 = 1; + } + player->unk_110 -= 1.0f; + if (player->unk_110 < -20.0f) { + player->unk_110 = -20.0f; + } + Math_SmoothStepToF(&D_i3_801C41B8[28], 10.0f, 1.0f, 2.0f, 0.00001f); + Math_SmoothStepToF(&player->unk_08C, 180.0f, 0.1f, D_i3_801C41B8[28], 0.0f); + player->brake = 1; + Math_SmoothStepToF(&D_801779A8[0], 25.0f, 1.0f, 5.0f, 0.0f); + } else { + if (player->unk_2BC > 0.0f) { + player->unk_2BC -= 0.5f; + if (player->unk_2BC <= 0.0f) { + player->unk_2BC = 0.0f; + player->unk_2B4 = 0; + D_i3_801C41B8[28] = 0.0f; + } + Math_SmoothStepToF(&D_i3_801C41B8[28], 0.0f, 1.0f, 1.0f, 0.0001f); + if (player->unk_110 < 0.0f) { + player->unk_110 += 0.5f; + if (player->unk_110 > 0.0f) { + player->unk_110 = 0.0f; + } + } + } + } + Math_SmoothStepToF(&player->unk_08C, 0.0f, 0.1f, 2.0f, 0.0f); +} + +void func_i3_801AD598(Actor* actor) { + s32 i; + + D_i3_801C27C0 = &D_i3_801C27C8[50 * actor->iwork[0]]; + for (i = 50 * actor->iwork[0]; i < 50 * actor->iwork[0] + 50; i++, D_i3_801C27C0++) { + D_i3_801C27C0->pos.x = actor->obj.pos.x; + D_i3_801C27C0->pos.y = actor->obj.pos.y; + D_i3_801C27C0->pos.z = actor->obj.pos.z; + D_i3_801C27C0->rot.x = actor->obj.rot.x; + D_i3_801C27C0->rot.y = actor->obj.rot.y; + D_i3_801C27C0->rot.z = actor->obj.rot.z; + D_i3_801C27C0->rot.x = actor->unk_0F4.x; + D_i3_801C27C0->rot.y = actor->unk_0F4.y; + D_i3_801C27C0->rot.z = actor->unk_0F4.z; + } +} + +void func_i3_801AD688(Actor* actor) { + func_i3_801AD598(actor); + actor->iwork[1] = 10; + actor->scale = 1.0f; +} + +// OBJ_ACTOR_255 action +void func_i3_801AD6C0(Actor* actor) { + s32 var_v0; + f32 sp80; + f32 sp7C; + f32 sp78; + f32 sp74; + f32 sp70; + f32 sp6C; + f32 sp68; + Vec3f sp5C; + Vec3f sp50; + Vec3f sp44; + + var_v0 = actor->iwork[2] - 1; + if ((D_i3_801C42A0[23] == 0) || (gActors[var_v0].state >= 4)) { + actor->timer_0C2 = 30000; + actor->state = 2; + actor->vel.y = 0.0f; + actor->vel.x = 0.0f; + actor->vel.z = 0.0f; + } + if ((gPlayer[0].unk_138 + 500.0f) <= actor->obj.pos.z) { + Object_Kill(&actor->obj, actor->sfxPos); + } + actor->unk_04E++; + if (actor->unk_04E >= 50) { + actor->unk_04E = 0; + } + switch (actor->state) { + case 0: + if (actor->timer_0BC != 0) { + actor->unk_0F4.x += D_i3_801C4308[10]; + actor->unk_0F4.z += 10.0f; + actor->unk_0F4.z = Math_ModF(actor->unk_0F4.z, 360.0f); + } else { + actor->health = 30; + Audio_PlaySfx(0x31000047, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->state++; + } + break; + case 1: + if (actor->unk_0D0 != 0) { + if (actor->health > 0) { + actor->unk_0D0 = 0; + actor->timer_0C6 = 15; + actor->health -= actor->damage; + Audio_PlaySfx(0x29034045, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->health <= 0) { + actor->timer_0C2 = 30000; + actor->state = 2; + actor->vel.y = 0.0f; + actor->vel.x = 0.0f; + actor->vel.z = 0.0f; + Audio_PlaySfx(0x2902A046, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + } + if (actor->obj.pos.z <= (gPlayer[0].unk_138 - 200.0f)) { + actor->fwork[7] = sp80 = gPlayer[0].pos.x + RAND_FLOAT_CENTERED(100.0f) - actor->obj.pos.x; + actor->fwork[8] = sp7C = gPlayer[0].pos.y - 30.0f - actor->obj.pos.y; + actor->fwork[9] = sp78 = gPlayer[0].unk_138 - actor->obj.pos.z; + } else { + sp80 = actor->fwork[7]; + sp7C = actor->fwork[8]; + sp78 = actor->fwork[9] + 600.0f; + } + Math_RadToDeg(Math_Atan2F(sp80, sp78)); + sp70 = sqrtf(SQ(sp80) + SQ(sp78)); + Math_RadToDeg(-Math_Atan2F(sp7C, sp70)); + actor->fwork[0] += (actor->iwork[0] + 1) * 5.0f; + actor->fwork[1] += 10.0f + (actor->iwork[0] + 1) * 5.0f; + actor->fwork[5] = (actor->iwork[0] + 1) * 0.2f; + actor->fwork[6] = (actor->iwork[0] + 1) * 0.2f; + sp7C = SIN_DEG(actor->fwork[0]) * sp70 * actor->fwork[5]; + sp74 = COS_DEG(actor->fwork[1]) * sp70 * actor->fwork[6]; + sp80 = COS_DEG(actor->unk_0F4.y) * sp74; + sp78 = -SIN_DEG(actor->unk_0F4.y) * sp74; + if (sp7C < 20.0f) { + sp7C = 20.0f; + } + if ((Rand_ZeroOne() < 0.7) && (actor->obj.rot.z == 0.0f)) { + actor->fwork[2] = 360.0f; + } + Math_SmoothStepToF(&actor->unk_0F4.z, actor->fwork[2], 0.1f, 10.0f, 0.001f); + if (actor->unk_0F4.z >= 360.0f) { + actor->unk_0F4.z = 0.0f; + actor->fwork[2] = 0.0f; + } + sp68 = Math_RadToDeg(Math_Atan2F(gPlayer[0].pos.x + sp80 + RAND_FLOAT_CENTERED(200.0f) - actor->obj.pos.x, + gPlayer[0].unk_138 + sp78 - actor->obj.pos.z)); + sp6C = Math_RadToDeg(-Math_Atan2F(gPlayer[0].pos.y - 30.0f + sp7C - actor->obj.pos.y, sp70)); + if (gPlayer[0].unk_138 <= actor->obj.pos.z) { + sp68 = actor->unk_0F4.y; + sp6C = actor->unk_0F4.x; + } + Math_SmoothStepToAngle(&actor->unk_0F4.y, sp68, 1.0f, 5.0f, 0.001f); + Math_SmoothStepToAngle(&actor->unk_0F4.x, sp6C, 1.0f, 5.0f, 0.001f); + Matrix_RotateY(gCalcMatrix, actor->unk_0F4.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->unk_0F4.x * M_DTOR, 1); + sp5C.x = 0.0f; + sp5C.y = 0.0f; + sp5C.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp5C, &sp50); + sp5C.z = 10.0f + (actor->iwork[0] + 1) * RAND_FLOAT(10.0f); + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp5C, &sp44); + actor->vel.x = sp50.x; + actor->vel.y = sp50.y; + actor->vel.z = sp44.z; + break; + case 2: + if (actor->timer_0C6 == 0) { + actor->timer_0C6 = 15; + } + if (actor->timer_0BC == 0) { + var_v0 = actor->iwork[0] * 50 + actor->unk_04E - D_i3_801BFB64[actor->iwork[1]]; + if (var_v0 < actor->iwork[0] * 50) { + if (var_v0 > 0) { + var_v0 -= actor->iwork[0] * 50; + } + var_v0 = var_v0 + (actor->iwork[0] + 1) * 50; + } + D_i3_801C27C0 = &D_i3_801C27C8[var_v0]; + func_800815DC(); + actor->iwork[1]--; + if (actor->iwork[1] <= 0) { + actor->unk_044 = 0; + actor->unk_0D4 = 2; + func_80066254(actor); + Object_Kill(&actor->obj, actor->sfxPos); + } + actor->timer_0BC = 4; + func_8007D0E0(D_i3_801C27C0->pos.x, D_i3_801C27C0->pos.y, D_i3_801C27C0->pos.z, 3.0f); + Audio_PlaySfx(0x29018049, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + } + D_i3_801C27C0 = &D_i3_801C27C8[50 * actor->iwork[0] + actor->unk_04E]; + D_i3_801C27C0->pos.x = actor->obj.pos.x; + D_i3_801C27C0->pos.y = actor->obj.pos.y; + D_i3_801C27C0->pos.z = actor->obj.pos.z; + D_i3_801C27C0->rot.x = actor->unk_0F4.x; + D_i3_801C27C0->rot.y = actor->unk_0F4.y; + D_i3_801C27C0->rot.z = actor->unk_0F4.z; +} + +void func_i3_801ADF7C(f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, u8 type, s32 flag, f32 scale, + s32 index) { + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, xPos, yPos, zPos + D_80177D20, 1); + Matrix_RotateY(gGfxMatrix, M_DTOR * yRot, 1); + Matrix_RotateX(gGfxMatrix, M_DTOR * xRot, 1); + Matrix_RotateZ(gGfxMatrix, M_DTOR * zRot, 1); + Graphics_SetScaleMtx(scale); + if (index < 2) { + if (!flag) { + RCP_SetupDL(&gMasterDisp, 0x39); + } else { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + } else { + if (!flag) { + RCP_SetupDL(&gMasterDisp, 0x39); + } else { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + } + gSPDisplayList(gMasterDisp++, D_i3_801BFB9C[type]); + Matrix_Pop(&gGfxMatrix); +} + +// OBJ_ACTOR_255 draw +#ifdef NON_MATCHING +// float calculation acts oddly. seems to depend on how many references there are to static vars. +void func_i3_801AE168(Actor* actor) { + f32 xz; + f32 yRot; + f32 xRot; + s32 i; + s32 index; + + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + + for (i = 0; i <= actor->iwork[1]; i++) { + if ((actor->iwork[1] != 10) && (i == 0)) { + i = 1; + } + index = actor->iwork[0] * 50 + actor->unk_04E - D_i3_801BFB64[actor->iwork[1]]; + if (index < actor->iwork[0] * 50) { + if (index > 0) { + index -= actor->iwork[0] * 50; + } + index = index + (actor->iwork[0] + 1) * 50; + } + D_i3_801C27C0 = &D_i3_801C27C8[index]; + xRot = D_i3_801C27C0->rot.x; + yRot = D_i3_801C27C0->rot.y; + if (i >= 2) { + yRot = RAD_TO_DEG(Math_Atan2F(gPlayer[0].camEye.x - D_i3_801C27C0->pos.x, + gPlayer[0].camEye.z - (D_i3_801C27C0->pos.z + D_80177D20))); + xz = sqrtf(SQ(gPlayer[0].camEye.x - D_i3_801C27C0->pos.x) + + SQ(gPlayer[0].camEye.z - (D_i3_801C27C0->pos.z + D_80177D20))); + xRot = RAD_TO_DEG(-Math_Atan2F(gPlayer[0].camEye.y - D_i3_801C27C0->pos.y, xz)); + } + func_i3_801ADF7C(D_i3_801C27C0->pos.x, D_i3_801C27C0->pos.y, D_i3_801C27C0->pos.z, xRot, yRot, + D_i3_801C27C0->rot.z, D_i3_801BFB90[i], actor->timer_0C6 & 1, actor->scale, i); + } +} +#else +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801AE168.s") +#endif + +void func_i3_801AE3AC(Actor* actor) { + actor->fwork[1] = 1.0f; + actor->obj.rot.x = 336.0f; + actor->scale = 0.5f; +} + +// OBJ_ACTOR_256 action +void func_i3_801AE3D8(Actor* actor) { + s32 i; + + switch (actor->state) { + case 0: + actor->obj.pos.y = fabsf(D_i3_801C4308[10] * 15.0f) + 347.0f; + if (actor->obj.pos.y >= 757.0f) { + actor->obj.pos.y = 757.0f; + } + if (actor->obj.pos.y <= 347.0f) { + actor->obj.pos.y = 347.0f; + } + actor->scale = fabsf(D_i3_801C4308[10] / -28.0f) + 0.5f; + if (actor->scale > 1.3f) { + actor->scale = 1.3f; + } + if (actor->scale <= 0.5f) { + actor->scale = 0.5f; + } + if (gBosses[0].timer_052 == 0) { + actor->health = 0; + if (actor->info.hitbox[10] != 116.0f) { + actor->info.hitbox[10] = 116.0f; + } + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if ((fabsf(D_i3_801C4308[10]) >= 6.0f) && (gBosses[0].state >= 10) && + (gBosses[0].swork[AQ_SWK_0] < 2)) { + actor->timer_0C6 = 30; + actor->iwork[1] = 0; + D_i3_801C4308[79] -= 5.0f; + Audio_PlaySfx(0x29036050, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (D_i3_801C4308[79] <= -28.0f) { + D_i3_801C4308[79] = -28.0f; + } + if (D_i3_801C4308[10] <= -23.0f) { + if (gBosses[0].timer_052 == 0) { + gBosses[0].timer_052 = 72; + actor->health = 10; + for (i = 0; i < 60; i++) { + if ((gActors[i].obj.id == OBJ_ACTOR_256) && (actor->index != gActors[i].index)) { + gActors[i].health = 10; + } + } + } else { + actor->iwork[1] = 0; + actor->timer_0C6 = 0; + } + if (gBosses[0].swork[AQ_SWK_0] == 0) { + gBosses[0].swork[AQ_SWK_0] = 1; + actor->info.hitbox[10] = 300.0f; + if (actor->iwork[23] == 0) { + Radio_PlayMessage(gMsg_ID_15120, RCID_SLIPPY); + } + actor->iwork[23]++; + actor->iwork[23] &= 1; + } else if (actor->damage == 31) { + actor->health -= actor->damage; + Radio_PlayMessage(gMsg_ID_15130, RCID_FALCO); + if (actor->health <= 0) { + gBosses[0].swork[AQ_SWK_0] = 2; + actor->health = 0; + actor->timer_0C6 = 300; + actor->fwork[2] = actor->scale; + Audio_PlaySfx(0x19000033, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->state++; + } + } + } + } + } + break; + case 1: + if (!(gGameFrameCount & 1)) { + func_8007C120(actor->obj.pos.x, actor->fwork[0] + actor->obj.pos.y, actor->obj.pos.z, actor->vel.x, + actor->vel.y, actor->vel.z, 0.1f, 10); + func_8007C120(actor->obj.pos.x, actor->obj.pos.y + (actor->fwork[0] * -1.0f), actor->obj.pos.z + 200.0f, + actor->vel.x, actor->vel.y, actor->vel.z, 0.1f, 10); + actor->fwork[0] += 40.0f; + } + if ((actor->fwork[2] * 400.0f) <= actor->fwork[0]) { + actor->timer_0BC = 20; + actor->state++; + } + break; + case 2: + if (actor->timer_0BC == 0) { + for (i = 0; i < 6; i++) { + func_8007B8F8(actor->obj.pos.x, actor->obj.pos.y + 450.0f, actor->obj.pos.z + 50.0f, 50.0f); + func_8007B8F8(actor->obj.pos.x, actor->obj.pos.y - 420.0f, actor->obj.pos.z + 300.0f, 50.0f); + } + actor->fwork[3] = 0.7f; + actor->timer_0BC = 10; + + actor->state++; + } + break; + case 3: + if (actor->timer_0BC == 0) { + Math_SmoothStepToF(&actor->fwork[3], 0.0f, 0.1f, 2.0f, 0); + Math_SmoothStepToF(&actor->scale, 0.0f, actor->fwork[3], 10.0f, 0); + if (actor->scale <= 0.2f) { + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); + Object_Kill(&actor->obj, actor->sfxPos); + D_i3_801C42A0[23]--; + gBosses[0].swork[AQ_SWK_0] = 3; + gBosses[0].swork[AQ_SWK_19] = 30; + D_i3_801C4308[79] = 0.0f; + if (D_i3_801C42A0[23] == 0) { + D_i3_801C4308[79] = -180.0f; + for (i = 0; i < 60; i++) { + func_i3_801AC8A8(gBosses[0].obj.pos.x + RAND_FLOAT_CENTERED(1800.0f), + gBosses[0].obj.pos.y + 400.0f + RAND_FLOAT_CENTERED(1000.0f), + gBosses[0].obj.pos.z + 700.0f + RAND_FLOAT_CENTERED(1000.0f), 7.0f, 2); + } + gBosses[0].timer_052 = 0; + gBosses[0].timer_056 = 60; + gBosses[0].state = 14; + } + D_i3_801C4308[80] += D_i3_801BFBA8[actor->iwork[0]]; + } + } + break; + } +} + +// OBJ_ACTOR_256 draw +void func_i3_801AEB44(Actor* actor) { + f32 var_fv0; + u8 var_t1; + u8 i; + Vtx* var_t5; + Vtx* temp_v1_2; + + if ((actor->timer_0C6 != 0) && (actor->state == 0) && (D_80177854 != 100)) { + actor->iwork[1]++; + actor->iwork[1] %= 8; + } + temp_v1_2 = SEGMENTED_TO_VIRTUAL(D_6019078); + if (actor->iwork[1] < 4) { + var_t5 = SEGMENTED_TO_VIRTUAL(D_6018C78); + } else { + var_t5 = SEGMENTED_TO_VIRTUAL(D_6018878); + } + var_t1 = actor->iwork[1] % 4; + if (var_t1 >= 3) { + var_t1 = 4 - var_t1; + } + var_fv0 = actor->timer_0C6 / 60.0f; + if (var_fv0 < 0.1f) { + var_fv0 = 0.1f; + } + for (i = 0; i < 28; i += 1) { + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.ob[0] = + temp_v1_2[i].v.ob[0] + (s16) ((((var_t5[i].n.ob[0] - temp_v1_2[i].n.ob[0]) * var_t1) / 2) * var_fv0); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.ob[1] = + temp_v1_2[i].n.ob[1] + (((var_t5[i].n.ob[1] - temp_v1_2[i].n.ob[1]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.ob[2] = + temp_v1_2[i].n.ob[2] + (((var_t5[i].n.ob[2] - temp_v1_2[i].n.ob[2]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.flag = temp_v1_2[i].n.flag; + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.tc[0] = + temp_v1_2[i].n.tc[0] + (((var_t5[i].n.tc[0] - temp_v1_2[i].n.tc[0]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.tc[1] = + temp_v1_2[i].n.tc[1] + (((var_t5[i].n.tc[1] - temp_v1_2[i].n.tc[1]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.n[0] = + temp_v1_2[i].n.n[0] + (((var_t5[i].n.n[0] - temp_v1_2[i].n.n[0]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.n[1] = + temp_v1_2[i].n.n[1] + (((var_t5[i].n.n[1] - temp_v1_2[i].n.n[1]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.n[2] = + temp_v1_2[i].n.n[2] + (((var_t5[i].n.n[2] - temp_v1_2[i].n.n[2]) * var_t1) / 2); + D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.a = temp_v1_2[i].n.a; + } + Matrix_Scale(gGfxMatrix, actor->fwork[1] - 0.25f + ((1.5f - actor->scale) * 0.5f), actor->scale, actor->fwork[1], + 1); + if (actor->state != 0) { + RCP_SetupDL(&gMasterDisp, 0x20); + } else if (gBosses[0].swork[AQ_SWK_0] == 1) { + RCP_SetupDL(&gMasterDisp, 4); + } else if (!(actor->timer_0C6 & 1)) { + RCP_SetupDL(&gMasterDisp, 0x1D); + } else { + RCP_SetupDL(&gMasterDisp, 0x16); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + Matrix_SetGfxMtx(&gMasterDisp); + gDPSetTextureLUT(gMasterDisp++, G_TT_RGBA16); + gDPLoadTLUT_pal256(gMasterDisp++, D_6008FC8); + gDPLoadTextureBlock(gMasterDisp++, D_6008EC8, G_IM_FMT_CI, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSPVertex(gMasterDisp++, D_i3_801C3A88[actor->iwork[0]][gSysFrameCount & 1], 14, 0); + gSP1Triangle(gMasterDisp++, 0, 1, 2, 0); + gSP1Triangle(gMasterDisp++, 3, 1, 0, 0); + gSP1Triangle(gMasterDisp++, 4, 5, 0, 0); + gSP1Triangle(gMasterDisp++, 0, 6, 7, 0); + gSP1Triangle(gMasterDisp++, 2, 6, 0, 0); + gSP1Triangle(gMasterDisp++, 0, 5, 3, 0); + gSP1Triangle(gMasterDisp++, 0, 8, 4, 0); + gSP1Triangle(gMasterDisp++, 7, 8, 0, 0); + gSP1Triangle(gMasterDisp++, 9, 4, 8, 0); + gSP1Triangle(gMasterDisp++, 8, 7, 10, 0); + gSP1Triangle(gMasterDisp++, 8, 11, 9, 0); + gSP1Triangle(gMasterDisp++, 10, 11, 8, 0); + gSP1Triangle(gMasterDisp++, 12, 4, 9, 0); + gSP1Triangle(gMasterDisp++, 13, 5, 4, 0); + gSP1Triangle(gMasterDisp++, 4, 12, 13, 0); + gSP1Triangle(gMasterDisp++, 3, 5, 13, 0); + gSP1Triangle(gMasterDisp++, 13, 6, 2, 0); + gSP1Triangle(gMasterDisp++, 7, 6, 13, 0); + gSP1Triangle(gMasterDisp++, 13, 12, 7, 0); + gSP1Triangle(gMasterDisp++, 10, 7, 12, 0); + gSPVertex(gMasterDisp++, &D_i3_801C3A88[actor->iwork[0]][gSysFrameCount & 1][1], 3, 0); + gSPVertex(gMasterDisp++, &D_i3_801C3A88[actor->iwork[0]][gSysFrameCount & 1][9], 2, 3); + gSPVertex(gMasterDisp++, &D_i3_801C3A88[actor->iwork[0]][gSysFrameCount & 1][12], 8, 5); + gSP1Triangle(gMasterDisp++, 0, 2, 7, 0); + gSP1Triangle(gMasterDisp++, 7, 2, 8, 0); + gSP1Triangle(gMasterDisp++, 6, 8, 2, 0); + gSP1Triangle(gMasterDisp++, 8, 1, 9, 0); + gSP1Triangle(gMasterDisp++, 1, 8, 6, 0); + gSP1Triangle(gMasterDisp++, 5, 10, 4, 0); + gSP1Triangle(gMasterDisp++, 3, 10, 5, 0); + gSP1Triangle(gMasterDisp++, 8, 12, 7, 0); + gSP1Triangle(gMasterDisp++, 7, 11, 0, 0); + gSP1Triangle(gMasterDisp++, 0, 11, 9, 0); + gSP1Triangle(gMasterDisp++, 9, 1, 0, 0); + gSP1Triangle(gMasterDisp++, 9, 12, 8, 0); + gDPLoadTLUT_pal256(gMasterDisp++, D_6019338); + gDPLoadTextureBlock(gMasterDisp++, D_6019238, G_IM_FMT_CI, G_IM_SIZ_8b, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + gSPVertex(gMasterDisp++, &D_i3_801C3A88[actor->iwork[0]][gSysFrameCount & 1][20], 8, 0); + gSP1Triangle(gMasterDisp++, 0, 1, 2, 0); + gSP1Triangle(gMasterDisp++, 2, 3, 0, 0); + gSP1Triangle(gMasterDisp++, 4, 5, 6, 0); + gSP1Triangle(gMasterDisp++, 6, 7, 4, 0); + gDPPipeSync(gMasterDisp++); + gDPSetTextureLUT(gMasterDisp++, G_TT_NONE); +} + +void func_i3_801AF9FC(Actor* actor) { + s32 temp = actor->iwork[0]; + + actor->fwork[0] = actor->fwork[1] = actor->fwork[2] = 1.0f; + actor->obj.pos.x = D_i3_801C4308[1 + temp]; + actor->obj.pos.y = D_i3_801C4308[4 + temp]; + actor->obj.pos.z = D_i3_801C4308[7 + temp]; + actor->obj.rot.x = D_i3_801BFBBC[temp] + D_i3_801C4308[10]; +} + +#ifdef NON_MATCHING +// saved register use at start of case 3 +void func_i3_801AFA5C(Actor* actor) { + s32 i; + f32 sp70; + f32 sp6C; + f32 sp68; + f32 pad64; + Vec3f sp58; + Vec3f sp4C; + Actor* sp48; + + if (actor->state < 4) { + i = actor->iwork[0]; + actor->obj.pos.x = D_i3_801C4308[1 + i]; + actor->obj.pos.y = D_i3_801C4308[4 + i]; + actor->obj.pos.z = D_i3_801C4308[7 + i]; + actor->obj.rot.x = D_i3_801BFBBC[i] + D_i3_801C4308[10]; + if (actor->obj.rot.x < 0.0f) { + actor->obj.rot.x += 359.0f; + } + if (actor->obj.rot.x >= 360.0f) { + actor->obj.rot.x -= 360.0f; + } + actor->obj.rot.y = D_i3_801BFBC8[i]; + actor->obj.rot.z = D_i3_801BFBD4[i]; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if ((gBosses[0].state >= 10) && (actor->health != 0) && (actor->damage == 31)) { + actor->timer_0BE = 70; + actor->health -= actor->damage; + Audio_PlaySfx(0x2903604CU, actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->timer_0C6 == 0) { + actor->timer_0C6 = 70; + } + if (actor->health <= 0) { + actor->health = actor->timer_0BE = 0; + BonusText_Display(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 200.0f, 3); + gHitCount += 4; + D_80177850 = 15; + actor->info.bonus = 0; + actor->state = 4; + } + } + } + if (D_i3_801C42A0[23] == 0) { + Object_Kill(&actor->obj, actor->sfxPos); + } + if (actor->timer_0C6 & 1) { + func_8007C120(actor->obj.pos.x, actor->obj.pos.y + 100.0f, actor->obj.pos.z + RAND_FLOAT(500.0f), actor->vel.x, + actor->vel.y, actor->vel.z, actor->scale * 0.2f, 10); + } + switch (actor->state) { + case 0: + if (gBosses[0].state >= 10) { + actor->timer_0BC = D_i3_801BFBB0[actor->iwork[0]] + RAND_FLOAT(20.0f); + actor->health = 90; + actor->state++; + } + break; + case 1: + if ((actor->timer_0BC == 0) && (fabsf(D_i3_801C4308[10]) < 5.0f) && (actor->timer_0C6 == 0)) { + i = actor->iwork[3] - 1; + if (i >= 0) { + if (!((gActors[i].obj.status == OBJ_ACTIVE) && (gActors[i].obj.id == OBJ_ACTOR_255) && + (gActors[i].iwork[0] == actor->iwork[0]))) { + actor->iwork[3] = 0; + actor->state = 2; + } + } else { + actor->iwork[3] = 0; + actor->state = 2; + } + } + break; + case 2: + Math_SmoothStepToF(&actor->fwork[0], 1.0f, 0.2f, 0.5f, 0.01f); + actor->fwork[2] = actor->fwork[1] = actor->fwork[0]; + if (actor->fwork[0] == 1.0f) { + actor->state = 3; + } + break; + case 3: + i = actor->iwork[2]; + Math_SmoothStepToF(&actor->fwork[0], D_i3_801BFBE0[i][0], D_i3_801BFBE0[i][1], D_i3_801BFBE0[i][2], + 0.00001f); + Math_SmoothStepToF(&actor->fwork[1], D_i3_801BFC10[i][0], D_i3_801BFC10[i][1], D_i3_801BFC10[i][2], + 0.00001f); + Math_SmoothStepToF(&actor->fwork[2], D_i3_801BFC40[i][0], D_i3_801BFC40[i][1], D_i3_801BFC40[i][2], + 0.00001f); + actor->iwork[1]++; + i = actor->iwork[3] - 1; + + if ((i >= 0) && !((gActors[i].obj.status == OBJ_ACTIVE) && (gActors[i].obj.id == OBJ_ACTOR_255) && + (gActors[i].iwork[0] == actor->iwork[0]))) { + actor->iwork[3] = 0; + i = -1; + } + if ((actor->iwork[1] == 13) && (i < 0)) { + Audio_PlaySfx(0x29022048U, actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + for (i = 0, sp48 = gActors; i < 60; i++, sp48++) { + if (sp48->obj.status == OBJ_FREE) { + Actor_Initialize(sp48); + sp48->obj.status = OBJ_INIT; + sp48->obj.id = OBJ_ACTOR_255; + sp48->obj.pos.x = actor->obj.pos.x; + sp48->obj.pos.y = actor->obj.pos.y; + sp48->obj.pos.z = actor->obj.pos.z; + sp48->obj.rot.x = sp48->unk_0F4.x = + Math_ModF(actor->obj.rot.x + 270.0f + D_i3_801BFC7C[actor->iwork[0]], 360.0f); + sp48->obj.rot.y = sp48->unk_0F4.y = + Math_ModF(actor->obj.rot.y + D_i3_801BFC88[actor->iwork[0]], 360.0f); + sp48->unk_0F4.z = actor->obj.rot.z; + sp48->obj.rot.z = actor->obj.rot.z; + sp48->timer_0BC = 10; + Object_SetInfo(&sp48->info, sp48->obj.id); + actor->iwork[3] = i + 1; + sp48->iwork[0] = actor->iwork[0]; + sp48->iwork[2] = actor->index + 1; + Matrix_RotateY(gCalcMatrix, sp48->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, sp48->obj.rot.x * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, sp48->obj.rot.z * M_DTOR, 1); + sp58.x = sp58.y = 0.0f; + sp58.z = 60.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp58, &sp4C); + sp48->vel.x = sp4C.x; + sp48->vel.y = sp4C.y; + sp48->vel.z = sp4C.z; + break; + } + } + if (i >= 60) { + actor->iwork[3] = 0; + sp48->obj.status = OBJ_FREE; + } + } + if (actor->iwork[1] == D_i3_801BFC70[actor->iwork[2]]) { + actor->iwork[2]++; + if (actor->iwork[2] >= 3) { + actor->iwork[1] = actor->iwork[2] = 0; + actor->state = 1; + actor->fwork[0] = actor->fwork[1] = actor->fwork[2] = 1.0f; + actor->timer_0BC = D_i3_801BFBB0[actor->iwork[0]] + 70.0f - RAND_FLOAT_CENTERED(30.0f); + } + } + break; + case 4: + actor->state = 5; + actor->vel.y = 10.0f; + actor->vel.z = 5.0f; + Audio_PlaySfx(0x1902102FU, actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + case 5: + if (actor->obj.pos.y > (gGroundLevel + 70.0f)) { + Math_SmoothStepToF(actor->fwork, 1.0f, 0.1f, 0.2f, 0.0001f); + Math_SmoothStepToF(&actor->fwork[1], 1.0f, 0.1f, 0.2f, 0.0001f); + Math_SmoothStepToF(&actor->fwork[2], 1.0f, 0.1f, 0.2f, 0.0001f); + Math_SmoothStepToF(&actor->vel.y, -10.0f, 0.1f, 1.0f, 0.001f); + Math_SmoothStepToAngle(&actor->obj.rot.x, 80.0f, 0.1f, 1.0f, 0.001f); + if (!(gGameFrameCount & 1)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(300.0f), + actor->obj.pos.y + RAND_FLOAT_CENTERED(200.0f), actor->obj.pos.z, 4.0f, 2); + } + if (actor->timer_0C6 == 0) { + actor->timer_0C6 = 70; + } + actor->fwork[6] = 10.0f; + actor->timer_0C0 = 20; + } else { + Math_SmoothStepToF(&actor->fwork[6], 30.0f, 0.1f, 12.0f, 0.1f); + sp70 = RAND_FLOAT(30.0f); + if (!(gGameFrameCount & 3)) { + for (i = 0; i < 36; i += 2) { + sp6C = __sinf(sp70 + (i * 10.0f * M_DTOR)) * actor->fwork[6] * 10.0f; + sp68 = __cosf(sp70 + (i * 10.0f * M_DTOR)) * actor->fwork[6] * 10.0f; + pad64 = gGroundLevel + 30.0f; + func_8007B8F8(actor->obj.pos.x + sp6C, pad64, actor->obj.pos.z + sp68, 20.0f); + } + } + if (actor->vel.z != 0) { + actor->vel.y = actor->vel.z = 0.0f; + Audio_PlaySfx(0x19402031U, actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (actor->timer_0C0 == 1) { + Audio_PlaySfx(0x19003030U, actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (actor->timer_0C0 == 0) { + if (actor->timer_0BE == 0) { + actor->timer_0BE = 10; + } + Math_SmoothStepToF(actor->fwork, 0.0f, 0.05f, 0.1f, 0.001f); + Math_SmoothStepToF(&actor->fwork[1], 0.0f, 0.05f, 0.1f, 0.001f); + Math_SmoothStepToF(&actor->fwork[2], 0.0f, 0.05f, 0.1f, 0.001f); + Math_SmoothStepToF(&actor->obj.pos.y, -300.0f, 0.1f, 1.0f, 0.001f); + if (actor->fwork[0] <= 0.2f) { + for (i = 0; i < 5; i++) { + func_8007BC7C(actor->obj.pos.x, gGroundLevel + 50.0f, actor->obj.pos.z, 20.0f); + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(300.0f), gGroundLevel + (i * 20.0f), + actor->obj.pos.z, 5.0f, 2); + } + if (gBosses[0].state < 13) { + gBosses[0].state++; + if (gBosses[0].state == 13) { + gBosses[0].swork[AQ_SWK_19] = 30; + } + } + Object_Kill(&actor->obj, actor->sfxPos); + } + } + } + break; + } + if (actor->timer_0BE != 0) { + actor->fwork[3] = SIN_DEG(actor->timer_0BE * 20.0f) * func_i3_801A958C(actor->timer_0BE, 20.0f); + actor->fwork[4] = SIN_DEG(actor->timer_0BE * 20.0f) * func_i3_801A958C(actor->timer_0BE, 20.0f); + actor->fwork[5] = SIN_DEG(actor->timer_0BE * 20.0f) * func_i3_801A958C(actor->timer_0BE, 20.0f); + } +} +#else +// OBJ_ACTOR_257 action +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801AFA5C.s") +#endif + +// OBJ_ACTOR_257 draw +void func_i3_801B099C(Actor* actor) { + Matrix_RotateY(gGfxMatrix, (actor->obj.rot.x + actor->fwork[3]) * M_DTOR, 1); + Matrix_RotateX(gGfxMatrix, (actor->obj.rot.y + actor->fwork[4]) * M_DTOR, 1); + Matrix_RotateZ(gGfxMatrix, (actor->obj.rot.z + actor->fwork[5]) * M_DTOR, 1); + Matrix_Scale(gGfxMatrix, actor->fwork[0], actor->fwork[1], actor->fwork[2], 1); + Matrix_SetGfxMtx(&gMasterDisp); + if (!(actor->timer_0C6 & 1)) { + RCP_SetupDL(&gMasterDisp, 0x39); + } else { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + switch (actor->iwork[0]) { + case 0: + gSPDisplayList(gMasterDisp++, D_6019E80); + break; + case 1: + gSPDisplayList(gMasterDisp++, D_60194D0); + break; + case 2: + gSPDisplayList(gMasterDisp++, D_6019880); + break; + } +} + +// OBJ_ACTOR_258 action +void func_i3_801B0B60(Actor* actor) { + Vec3f sp44; + Vec3f sp38; + + if ((actor->unk_0D0 != 0) || (gBosses[0].state >= 16)) { + actor->state = 3; + } + switch (actor->state) { + case 0: + if (actor->timer_0BC == 0) { + Matrix_RotateY(gCalcMatrix, actor->fwork[2] * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->fwork[1] * M_DTOR, 1); + sp44.x = sp44.y = 0.0f; + sp44.z = 50.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38); + actor->vel.x = sp38.x; + actor->vel.y = sp38.y; + actor->vel.z = sp38.z; + actor->timer_0BE = 5; + actor->iwork[1] = 255; + actor->iwork[2] = 255; + actor->iwork[3] = 255; + actor->state++; + } + break; + case 1: + if (actor->timer_0BE == 0) { + Matrix_RotateY(gCalcMatrix, actor->fwork[4] * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->fwork[3] * M_DTOR, 1); + sp44.x = sp44.y = 0.0f; + sp44.z = 30.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38); + actor->vel.x = sp38.x; + actor->vel.y = sp38.y; + actor->vel.z = sp38.z; + actor->timer_0C0 = 10; + actor->state++; + } + break; + case 2: + if (actor->timer_0C0 == 0) { + actor->iwork[1] -= 20; + actor->iwork[2] -= 20; + actor->iwork[3] -= 20; + if (actor->iwork[1] < 5) { + actor->iwork[1] = actor->iwork[2] = actor->iwork[3] = 5; + } + } + break; + case 3: + if (Rand_ZeroOne() < 0.1) { + actor->unk_044 = 22; + actor->unk_0D4 = 2; + func_80066254(actor); + } + Object_Kill(&actor->obj, actor->sfxPos); + func_800815DC(); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 50.0f, 5.0f); + func_8007A6F0(&actor->obj.pos, 0x29018049); + break; + } + if (!(gGameFrameCount & 0xF)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(10.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(10.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(10.0f), 2.0f, 1); + } + func_i3_801A96DC(actor); +} + +// OBJ_ACTOR_258 draw +void func_i3_801B0EC0(Actor* actor) { + if (actor->timer_0BC == 0) { + Graphics_SetScaleMtx(0.8f); + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, actor->iwork[1], actor->iwork[2], actor->iwork[3], 255); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_6024A50); + } +} + +void func_i3_801B0F88(Boss* bossAQ) { + if ((D_i3_801C42A0[23] != 0) && (bossAQ->swork[AQ_SWK_0] < 2)) { + bossAQ->swork[AQ_SWK_19] = 30; + D_i3_801C4308[79] = 0.0f; + bossAQ->swork[AQ_SWK_0] = 3; + } +} + +void func_i3_801B0FCC(Boss* bossAQ) { + D_i3_801C4308[54] = D_i3_801C4308[61] = D_i3_801C4308[68] = 0.1f; + bossAQ->swork[AQ_SWK_19] = 500; + D_i3_801C4308[79] = -28.0f; +} + +void func_i3_801B1008(Boss* bossAQ, s32 timer) { + if ((bossAQ->swork[AQ_SWK_19] == 0) && (fabsf(D_i3_801C4308[10]) <= 1.0f) && (bossAQ->swork[AQ_SWK_0] == 0)) { + D_i3_801C4308[79] = -28.0f; + bossAQ->swork[AQ_SWK_19] = timer; + bossAQ->swork[AQ_SWK_0] = 0; + if (bossAQ->swork[AQ_SWK_22] == 0) { + Radio_PlayMessage(gMsg_ID_15110, RCID_PEPPY); + } + bossAQ->swork[AQ_SWK_22]++; + bossAQ->swork[AQ_SWK_22] &= 3; + } + if ((fabsf(D_i3_801C4308[10]) >= 15.0f) && (bossAQ->timer_056 == 0)) { + bossAQ->swork[AQ_SWK_2] = bossAQ->swork[AQ_SWK_3] = 1; + bossAQ->timer_056 = 60; + } +} + +// OBJ_BOSS_AQ init +void func_i3_801B10F8(Boss* bossAQ) { + s32 i; + Actor* actor; + + gBossActive = 1; + gBossFrameCount = 0; + bossAQ->health = 150; + for (i = 0, actor = gActors; i < 2; actor++) { + if (actor->obj.status == OBJ_FREE) { + Actor_Initialize(actor); + actor->obj.status = OBJ_INIT; + actor->obj.id = OBJ_ACTOR_256; + actor->obj.pos.x = bossAQ->obj.pos.x + D_i3_801C0098[i].x; + actor->obj.pos.y = bossAQ->obj.pos.y + D_i3_801C0098[i].y; + actor->obj.pos.z = bossAQ->obj.pos.z + D_i3_801C0098[i].z; + actor->iwork[0] = i; + i++; + Object_SetInfo(&actor->info, actor->obj.id); + } + } + D_i3_801C42A0[23] = 2; + D_i3_801C42A0[0] = 255; + D_i3_801C42A0[9] = D_i3_801C0058; + D_i3_801C42A0[11] = 9; + D_i3_801C42A0[10] = 10; + D_i3_801C42A0[13] = 6; + D_i3_801C42A0[14] = 11; + + bossAQ->fwork[AQ_FWK_1] = 10.0f; + D_i3_801C4308[79] = D_i3_801C4308[10] = D_i3_801C4308[80] = D_i3_801C4308[11] = 0.0f; + D_i3_801C4308[58] = D_i3_801C4308[65] = D_i3_801C4308[72] = 1.0f; + bossAQ->fwork[AQ_FWK_8] = bossAQ->fwork[AQ_FWK_9] = bossAQ->fwork[AQ_FWK_10] = 1.0f; + bossAQ->swork[AQ_SWK_14] = bossAQ->swork[AQ_SWK_15] = bossAQ->swork[AQ_SWK_16] = 255; + bossAQ->swork[AQ_SWK_17] = 10; + D_i3_801C42A0[1] = D_i3_801C42A0[2] = D_i3_801C42A0[4] = D_i3_801C42A0[5] = + (D_i3_801C42A0[6] = D_i3_801C42A0[7] = 0) ^ 0; // fake + for (i = 0; i < AQ_LIMB_MAX; i++) { + sBossAQlimbTimers[i] = 0; + } + bossAQ->obj.pos.y += 400.0f; + bossAQ->info.hitbox[119] = 1028.0f; + bossAQ->info.hitbox[169] = 800.0f; + bossAQ->swork[AQ_SWK_8] = bossAQ->swork[AQ_SWK_9] = 2; + Audio_PlaySfx(0x3140904D, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +// OBJ_BOSS_AQ action +#ifdef NON_MATCHING +// lots of float stuff, and unclear how to use the 4 indices +void func_i3_801B134C(Boss* bossAQ) { + s32 i; + s32 i2; + s32 i3; + s32 i7; + Actor* actor; + f32 sp110; + f32 var_fs3; + f32 var_fs0; + f32 sp104; + f32 sp100; + f32 spFC; + f32 spF8; + f32 spF4; + f32 spF0; + f32 spEC; + f32 spE8; + f32 spE4; + f32 spE0; + Vec3f spD4; + f32 temp3; + f32 var_fs1; + + gBossFrameCount++; + + switch (bossAQ->state) { + case 0: + if (bossAQ->swork[AQ_SWK_21] == 0) { + for (i2 = 0, actor = gActors; i2 < 3; actor++) { + if (actor->obj.status == OBJ_FREE) { + Actor_Initialize(actor); + actor->obj.status = OBJ_INIT; + actor->obj.id = OBJ_ACTOR_257; + actor->iwork[0] = i2; + Object_SetInfo(&actor->info, actor->obj.id); + i2++; + } + } + bossAQ->swork[AQ_SWK_21] = 1; + func_800182F4(0x102800FF); + func_800182F4(0x112800FF); + Radio_PlayMessage(gMsg_ID_15100, RCID_FOX); + } + if (fabsf(bossAQ->obj.pos.z - gPlayer[0].unk_138) <= 3000.0f) { + D_i3_801C4190[6] = 1; + bossAQ->timer_056 = 20; + func_8001D444(0, 32798, 0, 1); + bossAQ->state = 1; + } + break; + case 1: + if (bossAQ->timer_056 == 0) { + D_i3_801C4308[14] = 80.0f; + D_i3_801C4308[12] = D_i3_801C4308[13] = 0.0f; + bossAQ->timer_056 = 20; + bossAQ->state = 2; + Audio_PlaySfx(0x1900002E, bossAQ->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + case 2: + func_i3_801B0FCC(bossAQ); + if (!(bossAQ->timer_056 & 1)) { + for (i3 = 0; i3 < 30; i3++) { + func_i3_801AC8A8(gBosses[0].obj.pos.x + RAND_FLOAT_CENTERED(1800.0f), + gBosses[0].obj.pos.y + RAND_FLOAT_CENTERED(500.0f), + gBosses[0].obj.pos.z + 700.0f + RAND_FLOAT_CENTERED(1000.0f), 7.0f, 2); + } + } + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 40; + bossAQ->state = 3; + } + break; + case 3: + func_i3_801B0FCC(bossAQ); + Math_SmoothStepToF(&D_i3_801C4308[12], -45.0f, 0.5f, 1.0f, 0.01f); + Math_SmoothStepToF(&D_i3_801C4308[13], 30.0f, 0.5f, 1.0f, 0.01f); + Math_SmoothStepToAngle(&D_i3_801C4308[14], 0.0f, 1.0f, 2.0f, 0.0f); + Math_SmoothStepToAngle(&D_i3_801C4308[15], D_i3_801C0190[bossAQ->swork[AQ_SWK_20]], 1.0f, 10, 0.0f); + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 10; + bossAQ->swork[AQ_SWK_20]++; + if (bossAQ->swork[AQ_SWK_20] >= 5) { + bossAQ->state = 4; + } + } + break; + case 4: + func_i3_801B0FCC(bossAQ); + Math_SmoothStepToF(&D_i3_801C4308[58], 0.25f, 0.3f, 1.0f, 0.0f); + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 20; + bossAQ->state = 5; + } + break; + case 5: + func_i3_801B0FCC(bossAQ); + Math_SmoothStepToF(&D_i3_801C4308[58], 0.25f, 0.3f, 1.0f, 0.0f); + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 30; + bossAQ->state = 6; + } + break; + case 6: + func_i3_801B0FCC(bossAQ); + if (bossAQ->timer_056 == 0) { + bossAQ->state = 7; + } + break; + case 7: + bossAQ->swork[AQ_SWK_19] = 500; + D_i3_801C4308[79] = -28.0f; + Math_SmoothStepToF(&D_i3_801C4308[54], 1.0f, 0.001f, 0.01f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[61], 1.0f, 0.001f, 0.01f, 0.0f); + if (D_i3_801C4308[54] >= 0.9f) { + bossAQ->timer_056 = 20; + D_i3_801C4308[79] = 0.0f; + bossAQ->swork[AQ_SWK_0] = 3; + bossAQ->state = 8; + } + break; + case 8: + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 20; + bossAQ->swork[AQ_SWK_12] = 10; + D_i3_801C42A0[3] = 0; + Radio_PlayMessage(gMsg_ID_2225, RCID_SLIPPY); + bossAQ->swork[AQ_SWK_26] = gBossFrameCount + 156; + bossAQ->state = 9; + } + break; + case 9: + if (bossAQ->timer_056 == 0) { + bossAQ->state = 10; + } + break; + case 10: + case 11: + case 12: + func_i3_801B1008(bossAQ, 500); + break; + case 13: + func_i3_801B1008(bossAQ, 60); + break; + case 14: + if (bossAQ->timer_056 == 58) { + Audio_PlaySfx(0x29408055, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if ((bossAQ->timer_056 == 0) && (D_i3_801C4308[12] <= -44.0f)) { + bossAQ->swork[AQ_SWK_2] = bossAQ->swork[AQ_SWK_3] = 20; + bossAQ->state = 15; + } + if (bossAQ->timer_056 == 40) { + Radio_PlayMessage(gMsg_ID_15140, RCID_PEPPY); + } + break; + case 15: + if (bossAQ->swork[AQ_SWK_2] == 0) { + bossAQ->swork[AQ_SWK_2] = 100 + RAND_INT(50.0f); + } + if (bossAQ->swork[AQ_SWK_3] == 0) { + bossAQ->swork[AQ_SWK_3] = 100 + RAND_INT(50.0f); + } + break; + case 16: + D_801779A8[0] = 20.0f; + if (D_80178480 == 0) { + + D_80178340 = D_80178348 = D_80178350 = D_80178354 = D_80178358 = 255; + + D_80178358 = 0; + D_8017835C = 25; + D_80178480 = 20 + RAND_FLOAT(20); + } + if (D_80178480 == 29) { + D_80178348 = D_80178350 = D_80178354 = D_80178340 = 0; + } + Math_SmoothStepToF(&D_i3_801C41B8[25], D_8015F970, 1.0f, 100, 0.f); + Math_SmoothStepToF(&D_i3_801C41B8[26], 128.0f, 1.0f, 100, 0.f); + for (i3 = 0; i3 < AQ_LIMB_MAX; i3++) { + if (sBossAQlimbTimers[i3] == 0) { + sBossAQlimbTimers[i3] = 100; + } + } + + if (D_i3_801C42A0[7] == 0) { + D_i3_801C42A0[1] = D_i3_801C42A0[2] = D_i3_801C42A0[4] = D_i3_801C42A0[5] = D_i3_801C42A0[6] = + D_i3_801C42A0[7] = 50; + } + if (!(gGameFrameCount & 1)) { + func_8007C120(bossAQ->obj.pos.x + RAND_FLOAT_CENTERED(1200.0f), + bossAQ->obj.pos.y + 400.0f + RAND_FLOAT_CENTERED(400.0f), + bossAQ->obj.pos.z + 1000.0f + RAND_FLOAT_CENTERED(800.0f), bossAQ->vel.x, bossAQ->vel.y, + bossAQ->vel.z, 0.5f, 10); + func_8007D0E0(bossAQ->obj.pos.x + RAND_FLOAT_CENTERED(1200.0f), + bossAQ->obj.pos.y + 200.0f + RAND_FLOAT_CENTERED(400.0f), + bossAQ->obj.pos.z + 1000.0f + RAND_FLOAT_CENTERED(800.0f), 10.0f); + } + if (i3 && i3) {} + for (i3 = 0; i3 < 3; i3++) { + func_80081A8C(bossAQ->obj.pos.x + RAND_FLOAT_CENTERED(1200.0f), + bossAQ->obj.pos.y + 200.0f + RAND_FLOAT_CENTERED(200.0f), + bossAQ->obj.pos.z + 1000.0f + RAND_FLOAT_CENTERED(800.0f), 3.0f + RAND_FLOAT(3.0f), 5); + } + if (bossAQ->timer_056 == 0) { + gEffects[98].obj.status = OBJ_FREE; + gEffects[99].obj.status = OBJ_FREE; + func_8007A568(bossAQ->obj.pos.x, bossAQ->obj.pos.y, bossAQ->obj.pos.z + 600.0f, 40.0f); + bossAQ->timer_056 = 50; + for (i3 = 0; i3 < AQ_LIMB_MAX; i3++) { + sBossAQlimbTimers[i3] = 100; + } + D_80178348 = D_80178350 = D_80178354 = D_80178340 = 0; + bossAQ->state = 17; + } + break; + case 17: + if (bossAQ->timer_056 == 20) { + gEffects[96].obj.status = OBJ_FREE; + gEffects[97].obj.status = OBJ_FREE; + func_8007A568(bossAQ->obj.pos.x, bossAQ->obj.pos.y, bossAQ->obj.pos.z + 600.0f, 80.0f); + } + D_i3_801C42A0[0] -= 4; + if (D_i3_801C42A0[0] < 0) { + D_i3_801C42A0[0] = 0; + } + for (i3 = 0; i3 < 21; i3++) { + Math_SmoothStepToF(&D_i3_801C4308[52 + i3], 0.1f, 0.1f, 1.0f, 0.0f); + } + Math_SmoothStepToF(&bossAQ->fwork[AQ_FWK_8], 0.1f, 0.1f, 1.0f, 0.0f); + Math_SmoothStepToF(&bossAQ->fwork[AQ_FWK_9], 0.1f, 0.1f, 1.0f, 0.0f); + Math_SmoothStepToF(&bossAQ->fwork[AQ_FWK_10], 0.1f, 0.1f, 1.0f, 0.0f); + if (!(gGameFrameCount & 1)) { + func_8007C120(bossAQ->obj.pos.x + RAND_FLOAT_CENTERED(1200.0f), + bossAQ->obj.pos.y + 400.0f + RAND_FLOAT_CENTERED(400.0f), + bossAQ->obj.pos.z + 1000.0f + RAND_FLOAT_CENTERED(800.0f), bossAQ->vel.x, bossAQ->vel.y, + bossAQ->vel.z, 0.7f, 15); + } + if (bossAQ->timer_056 == 1) { + for (i3 = 0; i3 < AQ_LIMB_MAX; i3++) { + if (i3 != AQ_LIMB_27) { + sBossAQlimbTimers[i3] = 1000; + } + } + } + if (bossAQ->timer_056 == 0) { + bossAQ->timer_056 = 300; + bossAQ->state = 18; + } + break; + case 18: + if (bossAQ->timer_056 != 0) { + for (i3 = 0; i3 < 30; i3++) { + func_i3_801AC8A8(gBosses[0].obj.pos.x + RAND_FLOAT_CENTERED(1800.0f), + gBosses[0].obj.pos.y + RAND_FLOAT_CENTERED(500.0f), + gBosses[0].obj.pos.z + 700.0f + RAND_FLOAT_CENTERED(1000.0f), 7.0f, 2); + } + } + break; + } + switch (bossAQ->swork[AQ_SWK_0]) { + case 0: + if (D_i3_801C42A0[23] == 0) { + D_i3_801C4308[79] = -180.0f; + } else { + Math_SmoothStepToF(&D_i3_801C4308[79], 0.0f, 0.05f, 0.2f, 0.0f); + } + Math_SmoothStepToF(&D_i3_801C4308[10], D_i3_801C4308[79], 0.05f, 0.3f, 0.0f); + break; + case 1: + Math_SmoothStepToF(&D_i3_801C4308[10], -28.0f, 0.05f, 0.3f, 0.0f); + if (bossAQ->timer_052 < 3) { + func_i3_801B0F88(bossAQ); + } + break; + case 2: + break; + case 3: + Math_SmoothStepToF(&D_i3_801C4308[10], D_i3_801C4308[79], 0.5f, 10.0f, 0.0f); + if (fabsf(D_i3_801C4308[10]) <= 5.0f) { + bossAQ->swork[AQ_SWK_0] = 0; + bossAQ->timer_052 = 0; + bossAQ->swork[AQ_SWK_19] = 500; + D_i3_801C4308[79] = 0.0f; + Audio_PlaySfx(0x29408054, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (bossAQ->state < 14) { + for (i3 = 0, actor = gActors; i3 < 60; i3++, actor++) { + if ((actor->obj.id == OBJ_ACTOR_260) && (actor->obj.status == OBJ_ACTIVE)) { + actor->iwork[0] = 1; + } + } + bossAQ->timer_058 = 30; + bossAQ->swork[AQ_SWK_0] = 4; + D_80178480 = 50; + Audio_PlaySfx(0x1900002D, bossAQ->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + func_80062B60(bossAQ->obj.pos.x, bossAQ->obj.pos.z + 800.0f, 0, 100.0f); + var_fs3 = 80.0f; + for (i2 = 0; i2 < 3; i2++, var_fs3 += 10.0f) { + for (i3 = 0; i3 < 9; i3++) { + var_fs0 = SIN_DEG((27 + 2 * i3) * (10.0f + 3 * i2)) * var_fs3 * 10.0f; + var_fs1 = COS_DEG((27 + 2 * i3) * (10.0f + 3 * i2)) * var_fs3 * 10.0f; + temp3 = gGroundLevel + 30.0f; + func_8007B8F8(bossAQ->obj.pos.x + var_fs0, temp3, bossAQ->obj.pos.z + 1000.0f + var_fs1, + 20.0f); + } + } + } + } + break; + case 4: + bossAQ->swork[AQ_SWK_19] = 50; + Math_SmoothStepToF(&D_i3_801C4308[10], D_i3_801C4308[79], 0.5f, 5.0f, 0.0f); + if (bossAQ->timer_058 > 10) { + Math_SmoothStepToF(D_801779A8, 20.0f, 1.0f, 5.0f, 0.0f); + } + if (bossAQ->timer_058 != 0) { + gPlayer[0].unk_2B4 = 1; + Math_SmoothStepToF(&D_i3_801C41B8[24], 20.0f, 0.1f, 1.0f, 0.0f); + Math_SmoothStepToF(&gPlayer[0].unk_08C, 180.0f, 0.4f, 20.0f, 0.0f); + } else { + Math_SmoothStepToF(&D_i3_801C41B8[24], 0.0f, 0.01f, 0.1f, 0.0f); + Math_SmoothStepToF(&gPlayer[0].unk_08C, 0.0f, 0.1f, 2.0f, 0.0f); + if (gPlayer[0].unk_08C < 0.1f) { + gPlayer[0].unk_2B4 = 0; + gPlayer[0].unk_08C = D_i3_801C41B8[24] = 0.0f; + bossAQ->swork[AQ_SWK_0] = 0; + } + } + break; + } + Math_SmoothStepToF(&D_i3_801C4308[80], 0.0f, 1.0f, 2.0f, 0); + Math_SmoothStepToF(&D_i3_801C4308[11], D_i3_801C4308[80], 0.1f, 2.0f, 0); + if (bossAQ->dmgType != 0) { + bossAQ->dmgType = 0; + if (fabsf(D_i3_801C4308[10]) >= 5.0f) { + switch (bossAQ->dmgPart) { + case 13: + if ((bossAQ->swork[AQ_SWK_12] != 0) && (bossAQ->state >= 15)) { + if (D_i3_801C42A0[23] == 0) { + sBossAQlimbTimers[AQ_LIMB_9] = D_i3_801C42A0[3] = 50; + D_i3_801C42A0[22] = 0; + bossAQ->swork[AQ_SWK_12]--; + bossAQ->swork[AQ_SWK_13] = 70; + Audio_PlaySfx(0x2940604C, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else if (bossAQ->state >= 10) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + case 14: + if (bossAQ->damage == 31) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if ((bossAQ->state >= 15) && (bossAQ->swork[AQ_SWK_8] != 0)) { + D_i3_801C42A0[1] = 50; + sBossAQlimbTimers[AQ_LIMB_7] = 50; + bossAQ->swork[AQ_SWK_8]--; + Audio_PlaySfx(0x2903604C, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (bossAQ->swork[AQ_SWK_8] == 0) { + spD4.x = D_i3_801C4308[73]; + spD4.y = D_i3_801C4308[74]; + spD4.z = D_i3_801C4308[75]; // 74? + func_8007A6F0(&spD4, 0x19000033); + bossAQ->swork[AQ_SWK_10] = 250.0f + RAND_FLOAT(50.0f); + } + } + } + break; + case 15: + if (bossAQ->damage == 31) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if ((bossAQ->state >= 15) && (bossAQ->swork[AQ_SWK_9] != 0)) { + D_i3_801C42A0[2] = 50; + sBossAQlimbTimers[AQ_LIMB_8] = 50; + bossAQ->swork[AQ_SWK_9]--; + Audio_PlaySfx(0x2903604C, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (bossAQ->swork[AQ_SWK_9] == 0) { + spD4.x = D_i3_801C4308[76]; + spD4.y = D_i3_801C4308[77]; // 76? + spD4.z = D_i3_801C4308[78]; + func_8007A6F0(&spD4, 0x19000033); + bossAQ->swork[AQ_SWK_11] = 250.0f + RAND_FLOAT(50.0f); + } + } + } + break; + case 16: + if (bossAQ->damage == 31) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if (bossAQ->state >= 15) { + D_i3_801C42A0[4] = 75; + } + } + break; + case 17: + if (bossAQ->damage == 31) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if (bossAQ->state >= 15) { + D_i3_801C42A0[5] = 75; + } + } + break; + case 18: + if ((bossAQ->damage == 31) && (bossAQ->swork[AQ_SWK_1] != 2) && (bossAQ->swork[AQ_SWK_12] == 0) && + (bossAQ->state == 15) && (bossAQ->health != 0)) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else { + for (i7 = 0; i7 < AQ_LIMB_MAX; i7++) { + sBossAQlimbTimers[i7] = 50; + } + D_i3_801C42A0[1] = D_i3_801C42A0[2] = D_i3_801C42A0[4] = D_i3_801C42A0[5] = + D_i3_801C42A0[6] = D_i3_801C42A0[7] = 50; + + bossAQ->swork[AQ_SWK_13] = 40; + bossAQ->swork[AQ_SWK_1] = 2; + Audio_PlaySfx(0x2940804E, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossAQ->health -= bossAQ->damage; + if ((bossAQ->swork[AQ_SWK_25] == 0) || (bossAQ->swork[AQ_SWK_25] == 2)) { + Radio_PlayMessage(gMsg_ID_7086, RCID_SLIPPY); + } + bossAQ->swork[AQ_SWK_25]++; + if (bossAQ->health <= 0) { + func_800182F4(0x102800FF); + func_800182F4(0x112800FF); + func_80042EC0(bossAQ); + Radio_PlayMessage(gMsg_ID_15252, RCID_SLIPPY); + D_8017796C = -1; + if ((gPlayer[0].state_1C8 == PLAYERSTATE_1C8_3) || + (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_5)) { + gPlayer[0].state_1C8 = PLAYERSTATE_1C8_7; + gPlayer[0].unk_1D0 = 0; + } + D_i3_801C4190[1] = 0; + D_i3_801C4190[5] = 0; + D_i3_801C4190[3] = 0; + D_i3_801C4190[4] = 0; + D_i3_801C4190[0] = 0; + bossAQ->health = 0; + bossAQ->swork[AQ_SWK_13] = 40; + bossAQ->swork[AQ_SWK_1] = 2; + bossAQ->timer_056 = 50; + Audio_PlaySfx(0x2940A04F, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + gShowBossHealth = false; + bossAQ->state = 16; + } + } + } + break; + case 19: + case 20: + if (bossAQ->damage == 31) { + if (D_i3_801C42A0[23] != 0) { + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if (bossAQ->state >= 15) { + D_i3_801C42A0[6] = 50; + } + } + break; + default: + Audio_PlaySfx(0x29121007, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + } + } + if (bossAQ->state >= 15) { + switch (bossAQ->swork[AQ_SWK_1]) { + case 0: + Math_SmoothStepToF(&D_i3_801C4308[12], -45.0f, 1.0f, bossAQ->fwork[AQ_FWK_1], 0.01f); + Math_SmoothStepToF(&D_i3_801C4308[13], 30.0f, 1.0f, bossAQ->fwork[AQ_FWK_1], 0.01f); + if ((bossAQ->timer_050 == 0) && (*(&D_i3_801C4308[12]) == -45.0f)) { + bossAQ->timer_050 = 7; + bossAQ->swork[AQ_SWK_1]++; + } + break; + case 1: + var_fs0 = 2.0f * bossAQ->fwork[AQ_FWK_1]; + Math_SmoothStepToF(&D_i3_801C4308[12], 0.0f, 1.0f, var_fs0, 0.0001f); + Math_SmoothStepToF(&D_i3_801C4308[13], 0.0f, 1.0f, var_fs0, 0.0001f); + if (bossAQ->timer_050 == 0) { + bossAQ->swork[AQ_SWK_1] = 0; + bossAQ->timer_050 = 40.0f - ((bossAQ->health - 150) / 5.0f); + } + break; + case 2: + if (D_i3_801C42A0[7] != 0) { + Math_SmoothStepToF(&D_i3_801C4308[12], -80.0f, 1.0f, 10.0f, 0.0001f); + Math_SmoothStepToF(&D_i3_801C4308[13], 30.0f, 1.0f, 10.0f, 0.0001f); + } else { + bossAQ->timer_050 = 50; + bossAQ->swork[AQ_SWK_1] = 0; + } + break; + } + } + bossAQ->swork[AQ_SWK_14] += D_i3_801C0150[bossAQ->swork[AQ_SWK_18]][0]; + bossAQ->swork[AQ_SWK_15] += D_i3_801C0150[bossAQ->swork[AQ_SWK_18]][1]; + bossAQ->swork[AQ_SWK_16] += D_i3_801C0150[bossAQ->swork[AQ_SWK_18]][2]; + if (bossAQ->swork[AQ_SWK_14] < 0) { + bossAQ->swork[AQ_SWK_14] = 0; + } + if (bossAQ->swork[AQ_SWK_15] < 0) { + bossAQ->swork[AQ_SWK_15] = 0; + } + if (bossAQ->swork[AQ_SWK_16] < 0) { + bossAQ->swork[AQ_SWK_16] = 0; + } + if (bossAQ->swork[AQ_SWK_17] == 0) { + bossAQ->swork[AQ_SWK_17] = 10; + bossAQ->swork[AQ_SWK_18] += 1; + bossAQ->swork[AQ_SWK_18] &= 3; + } + if ((bossAQ->state >= 4) && (bossAQ->state < 16)) { + sp104 = gPlayer[0].pos.x - bossAQ->obj.pos.x; + sp100 = gPlayer[0].pos.y - bossAQ->obj.pos.y; + spFC = gPlayer[0].unk_138 - bossAQ->obj.pos.z; + spE8 = Math_RadToDeg(Math_Atan2F(sp104, spFC)); + // spEC = sqrtf(SQ(sp104) + SQ(spFC)); + spE4 = Math_RadToDeg(-Math_Atan2F(sp100, sqrtf(SQ(sp104) + SQ(spFC)))); + if ((spE8 <= 40.0f) || (spE8 >= 320.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[15], spE8, 1.0f, 5.0f, 0.001f); + } + if ((spE4 <= 30.0f) || (spE4 >= 330.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[14], spE4, 1.0f, 5.0f, 0.001f); + } + } + for (i3 = 0; i3 < 6; i3++) { + if ((D_i3_801C42A0[i3 + 1] == 0) && (bossAQ->state < 17)) { + if ((i3 + 1 != bossAQ->swork[AQ_SWK_6]) && (i3 + 1 != bossAQ->swork[AQ_SWK_7])) { + i2 = D_i3_801C42A0[i3 + 16]; + Math_SmoothStepToF(&D_i3_801C4308[52 + i3], D_i3_801BFC94[4 * i3 + i2].x, D_i3_801BFE18[4 * i3 + i2].x, + D_i3_801BFF38[4 * i3 + i2].x, 0.00001f); + Math_SmoothStepToF(&D_i3_801C4308[59 + i3], D_i3_801BFC94[4 * i3 + i2].y, D_i3_801BFE18[4 * i3 + i2].y, + D_i3_801BFF38[4 * i3 + i2].y, 0.00001f); + Math_SmoothStepToF(&D_i3_801C4308[66 + i3], D_i3_801BFC94[4 * i3 + i2].z, D_i3_801BFE18[4 * i3 + i2].z, + D_i3_801BFF38[4 * i3 + i2].z, 0.00001f); + D_i3_801C42A0[i3 + 10]++; + if (D_i3_801C42A0[i3 + 10] >= D_i3_801BFDB4[4 * i3 + i2]) { + D_i3_801C42A0[i3 + 16]++; + if ((D_i3_801C42A0[i3 + 16] >= 4) || (D_i3_801BFDB4[4 * i3 + D_i3_801C42A0[i3 + 16]] == 10000)) { + D_i3_801C42A0[i3 + 10] = 0; + D_i3_801C42A0[i3 + 16] = 0; + } + } + } + } + } + + spF4 = gPlayer[0].pos.y - D_i3_801C4308[77]; + spF8 = gPlayer[0].pos.x - D_i3_801C4308[76]; + spF0 = gPlayer[0].unk_138 - D_i3_801C4308[78]; + sp104 = gPlayer[0].pos.x - D_i3_801C4308[73]; + sp100 = gPlayer[0].pos.y - D_i3_801C4308[74]; + spFC = gPlayer[0].unk_138 - D_i3_801C4308[75]; + + spE8 = Math_RadToDeg(Math_Atan2F(sp104, spFC)); + spE0 = Math_RadToDeg(Math_Atan2F(spF8, spF0)); + spFC = sqrtf(SQ(sp104) + SQ(spFC)); + spF0 = sqrtf(SQ(spF8) + SQ(spF0)); + spE4 = Math_RadToDeg(-Math_Atan2F(sp100, spFC)); + spEC = Math_RadToDeg(-Math_Atan2F(spF4, spF0)); + if ((spE8 <= 15.0f) || (spE8 >= 310.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[18], spE8, 1.0f, 5.0f, 0.001f); + } + if ((spE4 <= 12.0f) || (spE4 >= 330.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[16], spE4, 1.0f, 5.0f, 0.001f); + } + if ((spE0 <= 20.0f) || (spE0 >= 315.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[19], spE0, 1.0f, 5.0f, 0.001f); + } + if ((spEC <= 12.0f) || (spEC >= 330.0f)) { + Math_SmoothStepToAngle(&D_i3_801C4308[17], spEC, 1.0f, 5.0f, 0.001f); + } + if ((bossAQ->swork[AQ_SWK_2] == 1) && (bossAQ->swork[AQ_SWK_8] != 0) && (bossAQ->health != 0) && + (bossAQ->swork[AQ_SWK_6] == 0)) { + D_i3_801C42A0[10] = D_i3_801C42A0[16] = 0; + bossAQ->swork[AQ_SWK_6] = 1; + } + if ((bossAQ->swork[AQ_SWK_3] == 1) && (bossAQ->swork[AQ_SWK_9] != 0) && (bossAQ->health != 0) && + (bossAQ->swork[AQ_SWK_7] == 0)) { + D_i3_801C42A0[11] = D_i3_801C42A0[17] = 0; + bossAQ->swork[AQ_SWK_7] = 2; + } + if (bossAQ->health != 0) { + for (i7 = 0; i7 < 2; i7++) { + if (bossAQ->swork[AQ_SWK_6 + i7] != 0) { + i2 = bossAQ->swork[AQ_SWK_4 + i7]; + Math_SmoothStepToF(&D_i3_801C4308[52 + i7], D_i3_801C00B0[0][i2], D_i3_801C00F0[0][i2], + D_i3_801C0120[0][i2], 0.00001f); + Math_SmoothStepToF(&D_i3_801C4308[59 + i7], D_i3_801C00B0[1][i2], D_i3_801C00F0[1][i2], + D_i3_801C0120[1][i2], 0.00001f); + Math_SmoothStepToF(&D_i3_801C4308[66 + i7], D_i3_801C00B0[2][i2], D_i3_801C00F0[2][i2], + D_i3_801C0120[2][i2], 0.00001f); + D_i3_801C42A0[i7 + 10]++; + if (D_i3_801C42A0[i7 + 10] >= D_i3_801C00E0[i2]) { + bossAQ->swork[AQ_SWK_4 + i7]++; + if (bossAQ->swork[AQ_SWK_4 + i7] == 2) { + i = 4; + if (D_i3_801C42A0[23] == 0) { + + i = ((160 - bossAQ->health) / 10) + 10; + if (bossAQ->health < 31) { + i += 10; + } + if (i > 40) { + i = 40; + } + } + spD4.x = D_i3_801C4308[73 + 3 * i7]; + spD4.y = D_i3_801C4308[74 + 3 * i7]; + spD4.z = D_i3_801C4308[75 + 3 * i7]; + func_8007A6F0(&spD4, 0x2903404B); + i2 = 0; + for (i3 = 0; i2 <= i && i3 < 60; i3++) { + if ((gActors[i3].obj.status == OBJ_FREE) && (i3 < 60)) { + Actor_Initialize(&gActors[i3]); + + gActors[i3].obj.status = OBJ_INIT; + gActors[i3].obj.id = OBJ_ACTOR_258; + gActors[i3].obj.pos.x = D_i3_801C4308[73 + 3 * i7]; + gActors[i3].obj.pos.y = D_i3_801C4308[74 + 3 * i7] + 30.0f; + gActors[i3].obj.pos.z = D_i3_801C4308[75 + 3 * i7] + 150.0f; + if (Rand_ZeroOne() < 0.5f) { + var_fs1 = Math_ModF(D_i3_801C4308[i7 + 16] + RAND_FLOAT_CENTERED(60.0f), 360.0f); + var_fs0 = Math_ModF(D_i3_801C4308[i7 + 18] + RAND_FLOAT_CENTERED(60.0f), 360.0f); + if (bossAQ->health < 61) { + if (i7 == 0) { + var_fs1 = + Math_ModF(D_i3_801C4308[i7 + 16] + RAND_FLOAT_CENTERED(30.0f), 360.0f); + var_fs0 = Math_ModF( + D_i3_801C4308[i7 + 18] - 30.0f + RAND_FLOAT_CENTERED(20.0f), 360.0f); + } else { + var_fs1 = + Math_ModF(D_i3_801C4308[i7 + 16] + RAND_FLOAT_CENTERED(30.0f), 360.0f); + var_fs0 = Math_ModF( + D_i3_801C4308[i7 + 18] + 30.0f + RAND_FLOAT_CENTERED(20.0f), 360.0f); + } + } + } else { + var_fs1 = Math_ModF(D_i3_801C4308[i7 + 16] + RAND_FLOAT_CENTERED(30.0f), 360.0f); + var_fs0 = Math_ModF(D_i3_801C4308[i7 + 18] + RAND_FLOAT_CENTERED(30.0f), 360.0f); + } + gActors[i3].fwork[3] = var_fs1; + gActors[i3].fwork[4] = var_fs0; + // gActors[i3].timer_0BC = i2 * 3; + gActors[i3].timer_0BC = i2; + gActors[i3].timer_0BC *= 3; // nonmatching, but helps elsewhere + gActors[i3].fwork[1] = D_i3_801C4308[i7 + 16]; + gActors[i3].fwork[2] = D_i3_801C4308[i7 + 18]; + Object_SetInfo(&gActors[i3].info, gActors[i3].obj.id); + if (i3 >= 60) { + gActors[i3].obj.status = OBJ_FREE; + } + i2++; + } + } + } + if (bossAQ->swork[AQ_SWK_4 + i7] >= 4) { + D_i3_801C42A0[10 + i7] = bossAQ->swork[AQ_SWK_6 + i7] = bossAQ->swork[AQ_SWK_4 + i7] = 0; + } + } + } + } + } + for (i7 = 26; i7 < 107; i7 += 10) { + var_fs0 = D_i3_801C4308[10] - 10; + if (fabsf(D_i3_801C4308[10]) <= 5.0f) { + var_fs0 = 0.0f; + } + bossAQ->info.hitbox[i7] = var_fs0; + } + if (bossAQ->state >= 10) { + sp110 = D_i3_801C42A0[9]; + i2 = (gGameFrameCount & 0x1F); + if (sBossAQlimbTimers[AQ_LIMB_9] != 0) { + Math_SmoothStepToF(&sp110, 255.0f, 1.0f, 10, 0.0001f); + } else if (!(i2 & 0x10)) { + Math_SmoothStepToF(&sp110, D_i3_801C005C, 1.0f, 10, 0.0001f); + } else { + Math_SmoothStepToF(&sp110, D_i3_801C0058, 1.0f, 10, 0.0001f); + } + D_i3_801C42A0[9] = sp110; + } + if (D_i3_801C42A0[7] != 0) { + Math_SmoothStepToF(&D_801779A8[0], 20.0f, 1.0f, 5.0f, 0); + } + for (i2 = 45, i3 = 1, i7 = 0; i7 < 14; i3++, i2++, i7 += 2) { + if (D_i3_801C42A0[i3] != 0) { + D_i3_801C4308[i2] = SIN_DEG(D_i3_801C0060[i7 + 0] * D_i3_801C42A0[i3]) * + func_i3_801A958C(D_i3_801C42A0[i3], D_i3_801C0060[i7 + 1]); + D_i3_801C42A0[i3]--; + } + } + if (bossAQ->swork[AQ_SWK_12] != 0) { + if (D_i3_801C42A0[3] != 0) { + var_fs3 = 1.0f; + if (D_i3_801C42A0[22] < 4) { + var_fs3 = 1.2f; + } + Math_SmoothStepToF(&D_i3_801C4308[54], var_fs3, 0.3f, 1.0f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[61], var_fs3, 0.3f, 1.0f, 0.0f); + D_i3_801C42A0[22]++; + if (D_i3_801C42A0[22] >= 9) { + D_i3_801C42A0[22] = 0; + } + } + } else { + D_i3_801C42A0[3] = 10; + if (bossAQ->swork[AQ_SWK_13] != 0) { + Math_SmoothStepToF(&D_i3_801C4308[54], 0.0f, 0.3f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[61], 0.0f, 0.3f, 0.5f, 0.0f); + bossAQ->info.hitbox[119] = -10000.0f; + if (bossAQ->swork[AQ_SWK_13] == 1) { + Audio_PlaySfx(0x29409051, bossAQ->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else if ((bossAQ->health != 0) || (bossAQ->state < 16)) { + Math_SmoothStepToF(&D_i3_801C4308[54], 1.0f, 0.3f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[61], 1.0f, 0.3f, 0.5f, 0.0f); + if (D_i3_801C4308[61] >= 0.9f) { + bossAQ->swork[AQ_SWK_12] = 10; + bossAQ->info.hitbox[119] = 1028.0f; + } + } else { + Math_SmoothStepToF(&D_i3_801C4308[54], 0, 0.1f, 10, 0); + Math_SmoothStepToF(&D_i3_801C4308[61], 0, 0.1f, 10.0f, 0); + D_i3_801C42A0[9] -= 5; + if (D_i3_801C42A0[9] < 0) { + D_i3_801C42A0[9] = 0; + } + } + } + if ((D_i3_801C42A0[7] != 0) || (bossAQ->state >= 16)) { + var_fs3 = 0.25f; + } else { + var_fs3 = 1.0f; + } + Math_SmoothStepToF(&D_i3_801C4308[58], var_fs3, 0.3f, 1.0f, 0); + for (i3 = 0; i3 < 2; i3++) { + if (bossAQ->swork[AQ_SWK_8 + i3] == 0) { + if (bossAQ->swork[AQ_SWK_10 + i3] == 1) { + spD4.x = D_i3_801C4308[73 + 3 * i3]; + spD4.y = D_i3_801C4308[74 + 3 * i3]; + spD4.z = D_i3_801C4308[75 + 3 * i3]; + func_8007A6F0(&spD4, 0x29400052); + } + if ((fabsf(D_i3_801C4308[10]) <= 3.0f) || (bossAQ->swork[AQ_SWK_10 + i3] == 0)) { + Math_SmoothStepToF(&D_i3_801C4308[52 + i3], 1.0f, 0.1f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[59 + i3], 1.0f, 0.1f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[66 + i3], 1.0f, 0.1f, 0.5f, 0.0f); + if (D_i3_801C4308[i3 + 66] >= 0.9f) { + for (i = 0; i < 3; i++) { + spD4.x = D_i3_801C4308[73 + 3 * i3] + RAND_FLOAT(i * 200.0f); + spD4.y = D_i3_801C4308[74 + 3 * i3] + RAND_FLOAT(i * 200.0f); + spD4.z = D_i3_801C4308[75 + 3 * i3] + RAND_FLOAT(i * 400.0f); + func_i3_801A94EC(&spD4, OBJ_ITEM_SILVER_RING); + } + bossAQ->swork[AQ_SWK_8 + i3] = 2; + } + } else { + Math_SmoothStepToF(&D_i3_801C4308[52 + i3], 0, 0.1f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[59 + i3], 0, 0.1f, 0.5f, 0.0f); + Math_SmoothStepToF(&D_i3_801C4308[66 + i3], 0, 0.1f, 0.5f, 0.0f); + D_i3_801C42A0[i3 + 1] = 50; + } + } + } + if (bossAQ->swork[AQ_SWK_2] != 0) { + bossAQ->swork[AQ_SWK_2]--; + } + if (bossAQ->swork[AQ_SWK_3] != 0) { + bossAQ->swork[AQ_SWK_3]--; + } + if (bossAQ->swork[AQ_SWK_10] != 0) { + bossAQ->swork[AQ_SWK_10]--; + } + if (bossAQ->swork[AQ_SWK_11] != 0) { + bossAQ->swork[AQ_SWK_11]--; + } + if (bossAQ->swork[AQ_SWK_13] != 0) { + bossAQ->swork[AQ_SWK_13]--; + } + if (bossAQ->swork[AQ_SWK_17] != 0) { + bossAQ->swork[AQ_SWK_17]--; + } + if (bossAQ->swork[AQ_SWK_19] != 0) { + bossAQ->swork[AQ_SWK_19]--; + } + if (bossAQ->swork[AQ_SWK_26] == gBossFrameCount) { + gShowBossHealth = true; + } + if (bossAQ->swork[AQ_SWK_26] < gBossFrameCount) { + gBossHealthBar = (bossAQ->health / 150.0f) * 255.0f; + } +} +#else +void func_i3_801B134C(Boss* bossAQ); +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801B134C.s") +#endif + +bool func_i3_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + Vec3f sp6C = { 0.0f, 0.0f, 0.0f }; + Vec3f sp60; + f32 sp5C = 0.0f; + f32 sp58 = 0.0f; + f32 sp54 = 0.0f; + s32 sp50 = false; + Boss* this = thisx; + + if (sBossAQlimbTimers[limbIndex] >= 1000) { + *dList = NULL; + } else if ((sBossAQlimbTimers[limbIndex] != 0) && (D_80177854 != 100)) { + sBossAQlimbTimers[limbIndex]--; + } + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); + if ((D_i3_801C42A0[0] != 255) && (limbIndex != 27)) { + RCP_SetupDL(&gMasterDisp, 0x3A); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, D_i3_801C42A0[0]); + } else if (!(sBossAQlimbTimers[limbIndex] & 1)) { + RCP_SetupDL(&gMasterDisp, 0x39); + } else { + sp50 = true; + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + switch (limbIndex) { + case AQ_LIMB_4: + rot->x = D_i3_801C4308[13]; + sp5C = this->fwork[AQ_FWK_8]; + sp58 = this->fwork[AQ_FWK_9]; + sp54 = this->fwork[AQ_FWK_10]; + break; + case AQ_LIMB_5: + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, gBosses[0].swork[AQ_SWK_14], gBosses[0].swork[AQ_SWK_15], + gBosses[0].swork[AQ_SWK_16], 255); + rot->x = D_i3_801C4308[14]; + rot->y = D_i3_801C4308[15]; + pos->z = 40.0f; + sp5C = D_i3_801C4308[58]; + sp58 = D_i3_801C4308[65]; + sp54 = D_i3_801C4308[72]; + break; + case AQ_LIMB_6: + rot->x = D_i3_801C4308[12]; + sp5C = this->fwork[AQ_FWK_8]; + sp58 = this->fwork[AQ_FWK_9]; + sp54 = this->fwork[AQ_FWK_10]; + break; + case AQ_LIMB_7: + rot->x = D_i3_801C4308[16]; + rot->y = D_i3_801C4308[18]; + rot->x += D_i3_801C4308[45]; + rot->y += D_i3_801C4308[45]; + rot->z += D_i3_801C4308[45]; + sp5C = D_i3_801C4308[52]; + sp58 = D_i3_801C4308[59]; + sp54 = D_i3_801C4308[66]; + break; + case AQ_LIMB_8: + rot->x = D_i3_801C4308[17]; + rot->y = D_i3_801C4308[19]; + rot->x += D_i3_801C4308[46]; + rot->y += D_i3_801C4308[46]; + rot->z += D_i3_801C4308[46]; + sp5C = D_i3_801C4308[53]; + sp58 = D_i3_801C4308[60]; + sp54 = D_i3_801C4308[67]; + break; + case AQ_LIMB_9: + rot->x += D_i3_801C4308[47]; + rot->y += D_i3_801C4308[47]; + rot->z += D_i3_801C4308[47]; + sp5C = D_i3_801C4308[54]; + sp58 = D_i3_801C4308[61]; + sp54 = D_i3_801C4308[68]; + if (sp50) { + RCP_SetupDL(&gMasterDisp, 0x3D); + if (gBosses[0].health != 0) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } else { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + } + break; + case AQ_LIMB_10: + rot->x += D_i3_801C4308[48]; + rot->y += D_i3_801C4308[48]; + rot->z += D_i3_801C4308[48]; + sp5C = D_i3_801C4308[55]; + sp58 = D_i3_801C4308[62]; + sp54 = D_i3_801C4308[69]; + break; + case AQ_LIMB_12: + rot->x = D_i3_801C4308[14]; + rot->y = D_i3_801C4308[15]; + sp5C = this->fwork[AQ_FWK_8]; + sp58 = this->fwork[AQ_FWK_9]; + sp54 = this->fwork[AQ_FWK_10]; + break; + case AQ_LIMB_15: + rot->x += D_i3_801C4308[49]; + rot->y += D_i3_801C4308[49]; + rot->z += D_i3_801C4308[49]; + sp5C = D_i3_801C4308[56]; + sp58 = D_i3_801C4308[63]; + sp54 = D_i3_801C4308[70]; + break; + case AQ_LIMB_18: + rot->y += D_i3_801C4308[50]; + rot->z += D_i3_801C4308[50]; + sp5C = D_i3_801C4308[57]; + sp58 = D_i3_801C4308[64]; + sp54 = D_i3_801C4308[71]; + break; + case AQ_LIMB_22: + rot->x += D_i3_801C4308[51]; + rot->y += D_i3_801C4308[51]; + rot->z += D_i3_801C4308[51]; + sp5C = this->fwork[AQ_FWK_8]; + sp58 = this->fwork[AQ_FWK_9]; + sp54 = this->fwork[AQ_FWK_10]; + break; + case AQ_LIMB_24: + rot->x = D_i3_801C4308[10]; + rot->z = D_i3_801C4308[11]; + break; + case AQ_LIMB_27: + break; + } + if (sp5C > 0.0f) { + Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); + Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, rot->y * M_DTOR, 1); + Matrix_RotateX(gCalcMatrix, rot->x * M_DTOR, 1); + if (*dList != NULL) { + Matrix_MultVec3f(gCalcMatrix, &sp6C, &sp60); + func_8005F670(&sp60); + Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); + Matrix_Push(&gGfxMatrix); + Matrix_Scale(gGfxMatrix, sp5C, sp58, sp54, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, *dList); + Matrix_Pop(&gGfxMatrix); + } + return true; + } + return false; +} + +void func_i3_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp6C; + Vec3f sp60 = { 0.0f, 0.0f, 0.0f }; + Vec3f sp54 = { 340.0f, 600.0f, 1480.0f }; + Vec3f sp48 = { -640.0f, 380.0f, 1520.0f }; + Vec3f sp3C = { 760.0f, 340.0f, 1560.0f }; + Vec3f sp30 = { 130.0f, 350.0f, 130.0f }; + Vec3f sp24 = { -130.0f, 350.0f, 130.0f }; + + switch (limbIndex) { + case AQ_LIMB_5: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[21] = sp6C.x; + D_i3_801C4308[22] = sp6C.y; + D_i3_801C4308[23] = sp6C.z; + break; + case AQ_LIMB_7: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[24] = sp6C.x; + D_i3_801C4308[25] = sp6C.y; + D_i3_801C4308[26] = sp6C.z; + Matrix_MultVec3f(gCalcMatrix, &sp30, &sp6C); + D_i3_801C4308[73] = sp6C.x; + D_i3_801C4308[74] = sp6C.y; + D_i3_801C4308[75] = sp6C.z; + break; + case AQ_LIMB_8: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[27] = sp6C.x; + D_i3_801C4308[28] = sp6C.y; + D_i3_801C4308[29] = sp6C.z; + Matrix_MultVec3f(gCalcMatrix, &sp24, &sp6C); + D_i3_801C4308[76] = sp6C.x; + D_i3_801C4308[77] = sp6C.y; + D_i3_801C4308[78] = sp6C.z; + break; + case AQ_LIMB_9: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[30] = sp6C.x; + D_i3_801C4308[31] = sp6C.y; + D_i3_801C4308[32] = sp6C.z; + break; + case AQ_LIMB_10: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[33] = sp6C.x; + D_i3_801C4308[34] = sp6C.y; + D_i3_801C4308[35] = sp6C.z; + break; + case AQ_LIMB_15: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[36] = sp6C.x; + D_i3_801C4308[37] = sp6C.y; + D_i3_801C4308[38] = sp6C.z; + break; + case AQ_LIMB_18: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[39] = sp6C.x; + D_i3_801C4308[40] = sp6C.y; + D_i3_801C4308[41] = sp6C.z; + break; + case AQ_LIMB_22: + Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); + D_i3_801C4308[42] = sp6C.x; + D_i3_801C4308[43] = sp6C.y; + D_i3_801C4308[44] = sp6C.z; + break; + case AQ_LIMB_24: + Matrix_MultVec3f(gCalcMatrix, &sp54, &sp6C); + D_i3_801C4308[1] = sp6C.x; + D_i3_801C4308[4] = sp6C.y; + D_i3_801C4308[7] = sp6C.z; + Matrix_MultVec3f(gCalcMatrix, &sp48, &sp6C); + D_i3_801C4308[2] = sp6C.x; + D_i3_801C4308[5] = sp6C.y; + D_i3_801C4308[8] = sp6C.z; + Matrix_MultVec3f(gCalcMatrix, &sp3C, &sp6C); + D_i3_801C4308[3] = sp6C.x; + D_i3_801C4308[6] = sp6C.y; + D_i3_801C4308[9] = sp6C.z; + break; + case AQ_LIMB_27: + break; + } +} + +// OBJ_BOSS_AQ draw +void func_i3_801B4D84(Boss* bossAQ) { + Animation_DrawSkeleton(3, D_602BD60, bossAQ->vwork, func_i3_801B42AC, func_i3_801B49DC, bossAQ, gCalcMatrix); +} + +f32 D_i3_801C01F8[11] = { + 400.0f, 430.0f, 460.0f, 490.0f, 520.0f, 550.0f, 580.0f, 610.0f, 640.0f, 670.0f, 700.0f, +}; +f32 D_i3_801C0224[11] = { + 6.0f, 6.0f, 8.0f, 8.0f, 8.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, +}; +Vec3f D_i3_801C0250 = { 0.0f, 0.0f, 0.0f }; + +s32 func_i3_801B4DDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + Actor* this = thisx; + + if (!(this->timer_0C6 & 1)) { + RCP_SetupDL(&gMasterDisp, 0x39); + if ((limbIndex > 0) && (limbIndex < 5)) { + RCP_SetupDL(&gMasterDisp, 0x3C); + } + } else { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + return false; +} + +void func_i3_801B4E94(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp24 = D_i3_801C0250; + Actor* this = thisx; + + if (this->health == 0) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp24, this->vwork); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[8]); + break; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[9]); + break; + case 3: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[10]); + break; + case 4: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[11]); + break; + case 5: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[12]); + break; + case 6: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[5]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[13]); + break; + case 7: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[6]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); + break; + case 8: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[7]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); + break; + } + } +} + +// OBJ_ACTOR_261 draw +void func_i3_801B504C(Actor* actor) { + Vec3f sp30[30]; + + Matrix_Scale(gCalcMatrix, actor->scale, actor->scale, actor->scale, 1); + Animation_GetFrameData(&D_6005954, actor->unk_0B6, sp30); + Animation_DrawSkeleton(3, D_6005A80, sp30, func_i3_801B4DDC, func_i3_801B4E94, actor, gCalcMatrix); +} + +f32 D_i3_801C025C[2] = { 120.0f, 0.0f }; +s32 D_i3_801C0264[19] = { + 0, 0, 3, 4, 0, 5, 6, 7, 1, 2, 0, 0, 0, 0, 0, 0, 8, 9, 0, +}; + +// OBJ_ACTOR_261 action +void func_i3_801B50E8(Actor* actor) { + s32 i; + Vec3f sp88; + Vec3f sp7C; + Vec3f sp70; + Actor* var_v0; + + if ((actor->health == 0) && (actor->state != 0)) { + for (i = 0; i < 5; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), + actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 0.4f + RAND_FLOAT(0.4f), 7); + } + actor->health = 0; + actor->state = 7; + func_8007A6F0(&actor->obj.pos, 0x29038090); + } + switch (actor->state) { + case 0: + for (i = 0; i < 8; i++) { + actor->vwork[i].x = actor->obj.pos.x; + actor->vwork[i].y = actor->obj.pos.y; + actor->vwork[i].z = actor->obj.pos.z; + actor->vwork[8 + i].x = actor->obj.rot.x; + actor->vwork[8 + i].y = actor->obj.rot.y; + actor->vwork[8 + i].z = actor->obj.rot.z; + } + actor->info.bonus = 0; + actor->health = 10; + actor->fwork[4] = 1000.0f + RAND_FLOAT_CENTERED(400.0f); + actor->state++; + break; + case 2: + Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138, 1.0f, 10.0f, 0); + if (fabsf(actor->obj.pos.z - gPlayer[0].unk_138) < actor->fwork[4]) { + func_i3_801A9728(actor, 50.0f, 10.0f, 8); + actor->state = 3; + actor->vel.y = 30.0f; + } else if (!(gGameFrameCount & 0xF)) { + func_8007B8F8(actor->obj.pos.x, gGroundLevel + 30.0f, actor->obj.pos.z, 10.0f); + } + break; + case 3: + Math_SmoothStepToAngle(&actor->obj.rot.x, 270.0f, 1.0f, 100.0f, 0.0001f); + if (actor->obj.rot.x == 270.0f) { + actor->iwork[1] = RAND_FLOAT(10.0f); + actor->fwork[0] = D_i3_801C01F8[actor->iwork[1]]; + actor->state = 4; + } + break; + case 4: + Math_SmoothStepToF(&actor->vel.y, 0.0f, 1.0f, 4.0f, 0.0001f); + actor->vel.z = gPlayer[0].vel.z; + Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138 - actor->fwork[4], 0.1f, 100.0f, 0); + Math_SmoothStepToF(&actor->obj.pos.y, actor->fwork[0], 1.0f, D_i3_801C0224[actor->iwork[1]], 0); + actor->fwork[1] += 10.0f; + actor->vel.x = COS_DEG(actor->fwork[1]) * actor->iwork[1] * 0.1f; + if ((actor->fwork[0] - 1.0f) <= actor->obj.pos.y) { + actor->state = 5; + } + if (!(gGameFrameCount & 7)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.y + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 1); + } + break; + case 5: + actor->vel.z = gPlayer[0].vel.z; + Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138 - 1000.0f, 0.1f, 100.0f, 0); + Math_SmoothStepToF(&actor->vel.x, 0.0f, 1.0f, 2.0f, 0.001f); + Math_SmoothStepToAngle(&actor->obj.rot.x, D_i3_801C025C[actor->iwork[0]], 1.0f, 20.0f, 0); + if (actor->obj.rot.x == D_i3_801C025C[actor->iwork[0]]) { + actor->iwork[0]++; + if (actor->iwork[0] >= 2) { + sp88.x = gPlayer[0].pos.x - actor->obj.pos.x; + sp88.y = gPlayer[0].pos.y - actor->obj.pos.y; + sp88.z = gPlayer[0].unk_138 - actor->obj.pos.z; + actor->fwork[2] = Math_RadToDeg(Math_Atan2F(sp88.x, sp88.z)); + actor->fwork[3] = Math_RadToDeg(-Math_Atan2F(sp88.y, sqrtf(SQ(sp88.x) + SQ(sp88.z)))); + Matrix_RotateY(gCalcMatrix, actor->fwork[2] * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->fwork[3] * M_DTOR, 1); + sp7C.x = sp7C.y = 0.0f; + sp7C.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp7C, &sp70); + actor->vel.x = sp70.x; + actor->vel.y = sp70.y; + actor->vel.z = sp70.z; + actor->state = 6; + } + } + break; + case 6: + Math_SmoothStepToAngle(&actor->obj.rot.x, actor->fwork[3], 1.0f, 5.0f, 0); + Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[2], 1.0f, 5.0f, 0); + if (!(gGameFrameCount & 3)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.y + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 1); + } + break; + case 7: + for (i = 0; i < 8; i++) { + func_i3_801A9448(&actor->vwork[i], &actor->vwork[8 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 49, actor->scale, 200, i); + func_8007BC7C(actor->vwork[i].x, actor->vwork[i].y, actor->vwork[i].z + 100.0f, 6.0f); + } + actor->unk_044 = 0; + func_80066254(actor); + func_800815DC(); + Object_Kill(&actor->obj, actor->sfxPos); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 6.0f); + break; + } + if (actor->state >= 2) { + if (actor->state < 3) { + actor->unk_0B6++; + } else { + actor->unk_0B6 += 3; + } + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6005954)) { + actor->unk_0B6 = 0; + } + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if (actor->health != 0) { + if (actor->damage == 31) { + actor->info.bonus = 1; + actor->health -= actor->damage; + if (actor->health <= 0) { + actor->health = 0; + } + } else if (actor->damage == 30) { + for (i = 0, var_v0 = gActors; i < 60; i++, var_v0++) { + if ((var_v0->obj.status == OBJ_ACTIVE) && (var_v0->obj.id == OBJ_ACTOR_261) && + (var_v0->state == 1) && (i != actor->index) && + (fabsf(var_v0->obj.pos.x - actor->obj.pos.x) <= 300.0f) && + (fabsf(var_v0->obj.pos.z - actor->obj.pos.z) <= 300.0f)) { + var_v0->state = 2; + } + } + } else if ((actor->state >= 3) && (actor->state < 5)) { + actor->info.bonus = 1; + actor->timer_0C6 = 15; + actor->health -= actor->damage; + if (actor->health <= 0) { + actor->health = 0; + } + } + } + } +} + +s32 func_i3_801B5C18(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + f32 sp6C = 1.0f; + f32 sp68 = 1.0f; + f32 sp64 = 1.0f; + Vec3f sp58; + Vec3f sp4C = { 0.0f, 0.0f, 0.0f }; + Actor* this = thisx; + + if (!(this->timer_0C6 & 1)) { + RCP_SetupDL(&gMasterDisp, 0x39); + } else if ((limbIndex < 7) || (limbIndex >= 9)) { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + switch (limbIndex) { + case 7: + RCP_SetupDL(&gMasterDisp, 0x40); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, (s32) this->fwork[4]); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + sp6C = this->fwork[1]; + sp68 = this->fwork[2]; + sp64 = this->fwork[3]; + break; + case 8: + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, (s32) this->fwork[4]); + break; + } + if (sp6C != 1.0f) { + Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); + Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, rot->y * M_DTOR, 1); + Matrix_RotateX(gCalcMatrix, rot->x * M_DTOR, 1); + if (*dList != NULL) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &sp58); + func_8005F670(&sp58); + Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); + Matrix_Push(&gGfxMatrix); + Matrix_Scale(gGfxMatrix, sp6C, sp68, sp64, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, *dList); + Matrix_Pop(&gGfxMatrix); + } + return true; + } + return false; +} + +void func_i3_801B5F68(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp3C = { 0.0f, 0.0f, 0.0f }; + Vec3f sp30; + Vec3f sp24; + Actor* this = thisx; + + if ((this->health == 0) || (limbIndex == 7)) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[9]); + break; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[10]); + break; + case 3: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[11]); + break; + case 4: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[12]); + break; + case 5: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[13]); + break; + case 6: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[5]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); + break; + case 7: + sp30.x = this->fwork[11]; + sp30.y = 0.0f; + sp30.z = 0.0f; + Matrix_MultVec3f(gCalcMatrix, &sp30, &sp24); + this->fwork[8] = sp24.x; + this->fwork[9] = gGroundLevel; + this->fwork[10] = sp24.z; + break; + case 8: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[6]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); + break; + case 9: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[7]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); + break; + case 16: + Matrix_MultVec3f(gCalcMatrix, &sp3C, &this->vwork[8]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); + break; + } + } +} + +f32 D_i3_801C02C8[2] = { 255.0f, 68.0f }; +s32 D_i3_801C02D0[2] = { 70, 100 }; + +// OBJ_ACTOR_259 draw +void func_i3_801B619C(Actor* actor) { + Vec3f sp40[30]; + + Matrix_Push(&gCalcMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Scale(gCalcMatrix, actor->scale, actor->scale, actor->scale, 1); + Animation_GetFrameData(&D_6002628, actor->unk_0B6, sp40); + Animation_DrawSkeleton(3, D_6002874, sp40, func_i3_801B5C18, func_i3_801B5F68, actor, gCalcMatrix); + Matrix_Pop(&gGfxMatrix); + Matrix_Pop(&gCalcMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, actor->fwork[8], actor->fwork[9], actor->fwork[10], 1); + Matrix_Scale(gGfxMatrix, actor->fwork[5], actor->fwork[6], actor->fwork[7], 1); + RCP_SetupDL(&gMasterDisp, 0x31); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, (s32) actor->iwork[12]); + gDPSetEnvColor(gMasterDisp++, 127, 127, 0, (s32) actor->iwork[12]); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_1024AC0); + Matrix_Pop(&gGfxMatrix); +} + +void func_i3_801B6344(Actor* actor) { + actor->health = 200; + actor->iwork[13] = actor->fwork[4] = 255.0f; + actor->fwork[12] = actor->obj.rot.y; + actor->iwork[14] = actor->iwork[16] = actor->obj.rot.z; +} + +#ifdef NON_MATCHING +// annoying float reg swap around 3880 +void func_i3_801B638C(Actor* actor) { + Actor* var_v0; + s32 i; + f32 spB4; + f32 temp_dz; + f32 temp_fscc; + f32 temp_ryr; + f32 temp_fsc; + f32 temp2; + f32 temp_dx; + + f32 sp98; + Vec3f sp8C; + Vec3f sp80; + f32 var_rxd; + + if (actor->health == 0) { + for (i = 0; i < 9; i++) { + func_i3_801A9448(&actor->vwork[i], &actor->vwork[9 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 48, actor->scale, 200, i); + func_8007BC7C(actor->vwork[i].x, actor->vwork[i].y, actor->vwork[i].z, 10.0f); + } + func_800815DC(); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); + for (i = 0; i < 5; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), + actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 1.0f + RAND_FLOAT(1.0f), 7); + } + actor->unk_044 = 2; + if (actor->iwork[16] != 0) { + actor->unk_044 = 14; + } + func_80066254(actor); + Object_Kill(&actor->obj, actor->sfxPos); + Audio_PlaySfx(0x1903001D, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + func_8007A6F0(&actor->obj.pos, 0x29038090); + } + actor->fwork[5] = (actor->obj.pos.y * 0.01f) + 2.5f; + actor->fwork[6] = (actor->obj.pos.y * 0.003f) + 0.8f; + actor->fwork[7] = (actor->obj.pos.y * 0.001f) + 0.8f; + actor->iwork[12] = (actor->obj.pos.y * -0.24f) + 150.0f; + if (actor->iwork[12] < 30.0f) { + actor->iwork[12] = 30; + } + + actor->fwork[1] = (actor->obj.pos.y * 0.0032f) + 1.0f; + actor->fwork[2] = (actor->obj.pos.y * 0.0032f) + 1.5f; + actor->fwork[3] = (actor->obj.pos.y * 0.0032f) + 2.0f; + actor->fwork[11] = actor->obj.pos.y + 300.0f; + if (actor->fwork[11] > 1200.0f) { + actor->fwork[11] = 1200.0f; + } + actor->unk_0B6++; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6002628)) { + actor->unk_0B6 = 0; + } + switch (actor->state) { + case 0: + for (i = 0; i < 9; i++) { + actor->vwork[0 + i].x = actor->obj.pos.x; + actor->vwork[0 + i].y = actor->obj.pos.y; + actor->vwork[0 + i].z = actor->obj.pos.z; + actor->vwork[9 + i].x = actor->obj.rot.x; + actor->vwork[9 + i].y = actor->obj.rot.y; + actor->vwork[9 + i].z = actor->obj.rot.z; + } + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + sp8C.x = sp8C.y = 0.0f; + sp8C.z = -1400.0f; + if (actor->iwork[14] != 0) { + sp8C.z = -5000.0f; + } + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp80); + actor->fwork[15] = actor->obj.pos.x + sp80.x; + actor->fwork[16] = actor->obj.pos.z + sp80.z; + actor->state = 1; + + break; + case 1: + if (actor->timer_0BC == 1) { + actor->iwork[15] = 1; + } + if (actor->iwork[15] != 0) { + if ((gPlayer[0].unk_138 + 300.0f) < actor->obj.pos.z) { + Object_Kill(&actor->obj, actor->sfxPos); + } + } else { + if (!(gGameFrameCount & 1)) { + for (i = 0, var_v0 = gActors; i < 60; i++, var_v0++) { + if ((var_v0->obj.status == OBJ_ACTIVE) && (var_v0->obj.id == OBJ_ACTOR_261) && + (var_v0->state == 1) && + (fabsf(var_v0->obj.pos.x - actor->fwork[8]) <= (actor->fwork[5] * 48.0f)) && + (var_v0->obj.pos.y <= (actor->obj.pos.y + 50.0f)) && + (fabsf(var_v0->obj.pos.z - actor->fwork[10]) <= (actor->fwork[7] * 125.0f))) { + var_v0->state = 2; + } + } + } + temp_dx = actor->obj.pos.x - actor->fwork[15]; + temp_dz = actor->obj.pos.z - actor->fwork[16]; + sp98 = sqrtf(SQ(temp_dx) + SQ(temp_dz)); + actor->fwork[13] -= 20.0f; + actor->fwork[14] += 5.0f; + spB4 = SIN_DEG(actor->fwork[13]) * sp98 * 0.1f; + temp_fsc = COS_DEG(actor->fwork[14]) * sp98 * 0.8f; + temp_fscc = COS_DEG(actor->obj.rot.y) * temp_fsc; + temp2 = -SIN_DEG(actor->obj.rot.y) * temp_fsc; + temp_ryr = Math_Atan2F(actor->obj.pos.x - actor->fwork[15] + temp_fscc, + actor->obj.pos.z - actor->fwork[16] + temp2); + temp_fscc = actor->obj.pos.y - spB4; + var_rxd = -Math_Atan2F(temp_fscc, sp98); + temp_ryr = Math_RadToDeg(temp_ryr); + Math_SmoothStepToAngle(&actor->obj.rot.y, temp_ryr, 0.1f, 100.0f, 0.001f); + var_rxd = Math_RadToDeg(var_rxd); + if (actor->obj.pos.y >= 1000.0f) { + var_rxd = 0.0f; + } + Math_SmoothStepToAngle(&actor->obj.rot.x, var_rxd, 0.1f, 100.0f, 0.001f); + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + sp8C.x = sp8C.y = 0.0f; + sp8C.z = 10.0f; + if (actor->iwork[14] != 0) { + sp8C.z = 30.0f; + } + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp80); + actor->vel.x = sp80.x; + actor->vel.y = sp80.y; + actor->vel.z = sp80.z; + if (actor->iwork[15] != 0) { + actor->vel.x = actor->vel.y = actor->vel.z = 0.0f; + } + if ((actor->iwork[14] != 0) && (actor->obj.pos.z < (gPlayer[0].unk_138 - 2000.0f))) { + actor->iwork[14] = 0; + actor->timer_0BC = 500; + } + } + break; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if ((actor->health != 0) && (actor->unk_0D2 == 0)) { + actor->health -= actor->damage; + actor->timer_0C6 = 30; + Audio_PlaySfx(0x2903408F, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->health <= 0) { + actor->health = 0; + BonusText_Display(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 200.0f, 3); + gHitCount += 4; + D_80177850 = 15; + } + } + } +} +#else +// OBJ_ACTOR_259 action +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801B638C.s") +#endif + +void func_i3_801B6E54(Actor* actor) { + s32 i; + + for (i = 0; i < 15; i++) { + actor->vwork[0 + i].x = actor->obj.pos.x; + actor->vwork[0 + i].y = actor->obj.pos.y; + actor->vwork[0 + i].z = actor->obj.pos.z; + actor->vwork[15 + i].x = actor->obj.rot.x; + actor->vwork[15 + i].y = actor->obj.rot.y; + actor->vwork[15 + i].z = actor->obj.rot.z; + } + actor->health = 0; + if (actor->obj.rot.z != 0) { + actor->obj.rot.z = 0.0f; + actor->state = 1; + } + actor->fwork[4] = actor->obj.pos.z; +} + +// OBJ_ACTOR_262 action +#ifdef NON_MATCHING +// annoying float reg swaps around 4000 +void func_i3_801B6FF8(Actor* actor) { + s32 i; + f32 temp_dx; + f32 temp_dy; + f32 temp_dz; + f32 temp_fs2_2; + f32 spA8; + Vec3f sp9C; + Vec3f sp90; + f32 var_fs0; + + if (actor->health == -100) { + actor->unk_044 = 2; + func_80066254(actor); + for (i = 0; i < 15; i++) { + func_i3_801A9448(&actor->vwork[i], &actor->vwork[15 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 51, actor->scale, 200, i); + func_800815DC(); + func_8007D0E0(actor->vwork[i].x, actor->vwork[i].y, actor->vwork[i].z + 100.0f, 6.0f); + } + Object_Kill(&actor->obj, actor->sfxPos); + func_8007A6F0(&actor->obj.pos, 0x29038090); + } + switch (actor->state) { + case 0: + if (actor->timer_0BC == 0) { + actor->timer_0BC = 200; + actor->fwork[1] = gPlayer[0].pos.x + RAND_FLOAT_CENTERED(800.0f); + actor->fwork[2] = gPlayer[0].pos.y + 50.0f + RAND_FLOAT(100.0f); + actor->fwork[3] = gPlayer[0].unk_138 - 1500.0f; + if (actor->fwork[1] > 700.0f) { + actor->fwork[1] = 700.0f; + } + if (actor->fwork[1] < -700.0f) { + actor->fwork[1] = -700.0f; + } + if (Rand_ZeroOne() < 0.2f) { + actor->fwork[3] = gPlayer[0].unk_138 - 800.0f; + actor->fwork[1] = gPlayer[0].pos.x; + actor->fwork[2] = gPlayer[0].pos.y + 50.0f; + } + if (fabsf(actor->fwork[4] - actor->obj.pos.z) >= 20000.0f) { + actor->fwork[3] = -10000.0f; + } + } + actor->fwork[3] += gPlayer[0].vel.z; + temp_dx = actor->fwork[1] - actor->obj.pos.x; + temp_dy = actor->fwork[2] - actor->obj.pos.y; + temp_dz = actor->fwork[3] - actor->obj.pos.z; + spA8 = Math_RadToDeg(Math_Atan2F(temp_dx, temp_dz)); + var_fs0 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(temp_dx) + SQ(temp_dz)))); + temp_fs2_2 = Math_SmoothStepToAngle(&actor->obj.rot.y, spA8, 0.1f, 1.0f, 0); + + Math_SmoothStepToAngle(&actor->obj.rot.x, var_fs0, 0.1f, 1.0f, 0); + var_fs0 = 340.0f; + if (temp_fs2_2 < 0.0f) { + var_fs0 = 20.0f; + } + Math_SmoothStepToAngle(&actor->obj.rot.z, var_fs0, 0.1f, 1.0f, 0.f); + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + sp9C.x = sp9C.y = 0.0f; + sp9C.z = 10.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp9C, &sp90); + actor->vel.x = sp90.x; + actor->vel.y = sp90.y; + actor->vel.z = sp90.z - 20.0f; + break; + case 1: + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + sp9C.x = 0.0f; + sp9C.y = 0.0f; + sp9C.z = 19.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp9C, &sp90); + actor->vel.x = sp90.x; + actor->vel.y = sp90.y; + actor->vel.z = sp90.z; + break; + } + if (!(gGameFrameCount & 3)) { + for (i = 0; i < 3; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(70.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(70.0f), 1.0f, 1); + } + } + actor->unk_0B6++; + if (Animation_GetFrameCount(&D_60260EC) < actor->unk_0B6) { + actor->unk_0B6 = 0; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if (actor->health > -100) { + actor->timer_0C6 = 15; + actor->health -= actor->damage; + for (i = 0; i < 10; i++) { + func_80081A8C(actor->unk_0D8.x + RAND_FLOAT_CENTERED(70.0f), + actor->unk_0D8.y + RAND_FLOAT_CENTERED(70.0f), + actor->unk_0D8.z + RAND_FLOAT_CENTERED(70.0f), 1.0f, 1); + } + Audio_PlaySfx(0x2903408F, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->health <= -100) { + actor->health = -100; + BonusText_Display(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 200.0f, 3); + gHitCount += 4; + D_80177850 = 15; + } + } + } +} +#else +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801B6FF8.s") +#endif + +s32 func_i3_801B76EC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); + if ((limbIndex >= 4) && (limbIndex < 14)) { + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + } + return false; +} + +void func_i3_801B7754(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp24 = { 0.0f, 0.0f, 0.0f }; + Actor* this = thisx; + + if (this->health == -100) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); + return; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); + return; + case 3: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); + return; + case 4: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[18]); + return; + case 5: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[19]); + return; + case 6: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[5]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[20]); + return; + case 7: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[6]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[21]); + return; + case 8: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[7]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[22]); + return; + case 9: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[8]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[23]); + return; + case 10: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[9]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[24]); + return; + case 11: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[10]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[25]); + return; + case 12: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[11]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[26]); + return; + case 13: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[12]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[27]); + return; + case 22: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[13]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[28]); + return; + case 23: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[14]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[29]); + break; + } + } +} + +// OBJ_ACTOR_262 draw +void func_i3_801B7A24(Actor* actor) { + Vec3f sp30[30]; + + RCP_SetupDL(&gMasterDisp, 0x39); + if (actor->timer_0C6 & 1) { + RCP_SetupDL(&gMasterDisp, 0x3D); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + Animation_GetFrameData(&D_60260EC, actor->unk_0B6, sp30); + Animation_DrawSkeleton(3, D_60263F8, sp30, func_i3_801B76EC, func_i3_801B7754, actor, gCalcMatrix); +} + +void func_i3_801B7AF0(Actor* actor) { + s32 i; + + actor->fwork[4] = 10.0f; + actor->fwork[3] = -1000.0f; + actor->fwork[2] = 30.0f; + actor->obj.pos.y = 150.0f; + actor->fwork[5] = 20.0f; + actor->fwork[6] = 20.0f; + actor->health = 60; + for (i = 0; i < 10; i++) { + actor->vwork[0 + i].x = actor->obj.pos.x; + actor->vwork[0 + i].y = actor->obj.pos.y; + actor->vwork[0 + i].z = actor->obj.pos.z; + actor->vwork[10 + i].x = actor->obj.rot.x; + actor->vwork[10 + i].y = actor->obj.rot.y; + actor->vwork[10 + i].z = actor->obj.rot.z; + } +} + +// OBJ_ACTOR_260 action +void func_i3_801B7C78(Actor* actor) { + s32 i; + s32 j; + f32 spAC; + f32 temp_dz; + f32 temp_dy; + f32 temp_fs2; + f32 temp1; + Vec3f sp90; + Vec3f sp84; + Effect* effect; + + if (actor->health == 0) { + for (i = 0; i < 10; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), + actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 1.0f + RAND_FLOAT(0.5f), 7); + } + for (i = 0; i < 10; i++) { + func_i3_801A9448(&actor->vwork[0 + i], &actor->vwork[10 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 52, actor->scale, 200, i); + func_8007BC7C(actor->vwork[0 + i].x, actor->vwork[0 + i].y, actor->vwork[0 + i].z + 100.0f, 6.0f); + } + + for (i = 0; i < 2; i++) { + if (actor->iwork[2 + i] != 0) { + j = actor->iwork[2 + i] - 1; + effect = &gEffects[j]; + if ((effect->obj.id == OBJ_EFFECT_395) && (effect->state == 2) && (effect->timer_50 != 0)) { + effect->unk_44 = 3; + actor->iwork[2 + i] = 0; + } + } + } + func_800815DC(); + func_8007D0E0(actor->vwork[7].x, actor->vwork[7].y, actor->vwork[7].z, 5.0f); + actor->unk_044 = 4; + func_80066254(actor); + Object_Kill(&actor->obj, actor->sfxPos); + func_8007A6F0(&actor->obj.pos, 0x29038090); + } + if (actor->state != 6) { + spAC = gPlayer[0].pos.x - actor->obj.pos.x; + Math_SmoothStepToAngle(&actor->obj.rot.y, + Math_RadToDeg(Math_Atan2F(spAC, gPlayer[0].unk_138 - actor->obj.pos.z)), 1.0f, 5.0f, + 0.001f); + } + if (((actor->state >= 2) && (actor->state < 4)) || (actor->state >= 5)) { + Math_SmoothStepToF(&actor->fwork[4], 10.0f, 0.2f, 20.0f, 0); + Math_SmoothStepToF(&actor->fwork[5], 20.0f, 0.2f, 20.0f, 0); + Math_SmoothStepToF(&actor->fwork[6], 20.0f, 0.2f, 20.0f, 0); + } + if ((actor->state >= 4) && (actor->state < 5)) { + Math_SmoothStepToF(&actor->fwork[4], 159.0f, 0.1f, 10.0f, 0); + Math_SmoothStepToF(&actor->fwork[5], 159.0f, 0.1f, 10.0f, 0); + Math_SmoothStepToF(&actor->fwork[6], 255.0f, 0.1f, 10.0f, 0); + } + if (((actor->state < 5) || (actor->state == 7)) && (actor->health != 0) && !(gGameFrameCount & 0xF)) { + func_8007B8F8(actor->vwork[22].x, gGroundLevel, actor->vwork[22].z, 5.0f); + } + Math_SmoothStepToF(&actor->fwork[1], actor->fwork[2], 0.1f, 2.0f, 0.00001f); + Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].camEye.z - D_80177D20 + actor->fwork[3], 0.1f, actor->fwork[1], + 0.00001); + if ((actor->state == 1) && (fabsf(actor->fwork[7] - actor->obj.pos.z) >= 10000.0f)) { + actor->timer_0C0 = 20; + actor->state = 5; + } + switch (actor->state) { + case 0: + actor->timer_0BE = (s32) (100.0f + RAND_FLOAT(150.0f)); + actor->state = 1; + actor->fwork[7] = actor->obj.pos.z; + break; + case 1: + if (actor->timer_0BC != 0) { + Math_SmoothStepToF(&actor->fwork[4], 255.0f, 0.1f, 50.0f, 0); + Math_SmoothStepToF(&actor->fwork[5], 255.0f, 0.1f, 50.0f, 0); + Math_SmoothStepToF(&actor->fwork[6], 0.0f, 0.1f, 50.0f, 0); + } else { + Math_SmoothStepToF(&actor->fwork[4], 10.0f, 0.2f, 20.0f, 0); + Math_SmoothStepToF(&actor->fwork[5], 20.0f, 0.2f, 20.0f, 0); + Math_SmoothStepToF(&actor->fwork[6], 20.0f, 0.2f, 20.0f, 0); + if (actor->timer_0BE == 0) { + actor->iwork[1] = 1; + actor->state = 2; + } + } + if (!(gGameFrameCount & 3)) { + func_i3_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), + actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), + actor->vwork[7].z + 100.0f + RAND_FLOAT_CENTERED(100.0f), 1.0f, 0); + } + break; + case 2: + actor->unk_0B6 += actor->iwork[1]; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6024F80)) { + actor->unk_0B6 = 0; + actor->timer_0BE = 0; + if (actor->iwork[1] >= 2) { + actor->timer_0BE = 30; + } + for (i = 0; i < 10; i++) { + func_i3_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), + actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), + actor->vwork[7].z + 100.0f + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); + } + actor->state = 3; + } + break; + case 3: + if (actor->timer_0BE == 0) { + for (i = 0; i < 2; i++) { + actor->iwork[2 + i] = + func_80081B24(actor->vwork[20 + i].x, actor->vwork[20 + i].y, actor->vwork[20 + i].z, 0.1f) + 1; + } + actor->timer_0C0 = 10; + Audio_PlaySfx(0x2900208D, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->state = 4; + } + break; + case 4: + actor->iwork[5]++; + if (actor->timer_0C0 == 0) { + Audio_KillSfx(actor->sfxPos); + actor->unk_0B6++; + if (Animation_GetFrameCount(&D_602AC28) < actor->unk_0B6) { + actor->unk_0B6 = Animation_GetFrameCount(&D_6024F80) - 1; + actor->state = 7; + } + } + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + if ((actor->unk_0B6 < 21) && (actor->state == 4) && (actor->iwork[3] != 0)) { + j = actor->iwork[3] - 1; + effect = &gEffects[j]; + if (actor->unk_0B6 == 20) { + spAC = gPlayer[0].pos.x - effect->obj.pos.x; + temp_dy = gPlayer[0].pos.y - effect->obj.pos.y; + temp_dz = gPlayer[0].unk_138 - 50.0f - effect->obj.pos.z; + + temp_fs2 = Math_RadToDeg(Math_Atan2F(spAC, temp_dz)); + temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); + Matrix_RotateY(gCalcMatrix, M_DTOR * temp_fs2, 0); + Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; + sp90.z = 30.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + effect->vel.x = sp84.x; + effect->vel.y = sp84.y; + effect->vel.z = sp84.z; + effect->unk_44 = 2; + effect->timer_50 = 100; + actor->iwork[3] = 0; + Audio_PlaySfx(0x2900308C, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else { + effect->obj.pos.x = actor->vwork[21].x; + effect->obj.pos.y = actor->vwork[21].y; + effect->obj.pos.z = actor->vwork[21].z; + } + } + if ((actor->unk_0B6 < 58) && (actor->state == 4) && (actor->iwork[2] != 0)) { + j = actor->iwork[2] - 1; + effect = &gEffects[j]; + if (actor->unk_0B6 == 57) { + spAC = gPlayer[0].pos.x - effect->obj.pos.x; + temp_dy = gPlayer[0].pos.y - effect->obj.pos.y; + temp_dz = gPlayer[0].unk_138 - 50.0f - effect->obj.pos.z; + temp_fs2 = Math_RadToDeg(Math_Atan2F(spAC, temp_dz)); + temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); + Matrix_RotateY(gCalcMatrix, M_DTOR * temp_fs2, 0); + Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; + sp90.z = 50.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + effect->vel.x = sp84.x; + effect->vel.y = sp84.y; + effect->vel.z = sp84.z; + effect->unk_44 = 2; + effect->timer_50 = 100; + actor->iwork[2] = 0; + } else { + effect->obj.pos.x = actor->vwork[20].x; + effect->obj.pos.y = actor->vwork[20].y; + effect->obj.pos.z = actor->vwork[20].z; + } + } + break; + case 5: + Math_SmoothStepToAngle(&actor->obj.rot.x, 40.0f, 0.1f, 10.0f, 0); + actor->unk_0B6++; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6024F80)) { + actor->unk_0B6 = Animation_GetFrameCount(&D_6024F80) - 1; + } + if (actor->timer_0C0 == 0) { + temp_dy = gPlayer[0].pos.y - 50.0f - actor->obj.pos.y; + temp_dz = gPlayer[0].unk_138 - actor->obj.pos.z; + temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; + sp90.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + actor->vel.x = sp84.x; + actor->vel.y = sp84.y; + actor->vel.z = sp84.z; + actor->state = 6; + } + break; + case 6: + actor->unk_0B6++; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6024F80)) { + actor->unk_0B6 = Animation_GetFrameCount(&D_6024F80) - 1; + } + Math_SmoothStepToAngle(&actor->obj.rot.x, 30.0f, 0.1f, 10.0f, 0); + if (!(gGameFrameCount & 1)) { + func_i3_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), + actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), + actor->vwork[7].z + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); + } + break; + case 7: + actor->unk_0B6--; + if (actor->unk_0B6 <= 0) { + actor->unk_0B6 = 0; + actor->timer_0BE = (s32) (100.0f + RAND_FLOAT(150.0f)); + actor->state = 1; + } + break; + } + if (actor->iwork[0] != 0) { + actor->health = 0; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if (actor->health != 0) { + actor->info.bonus = 0; + if (actor->damage == 31) { + if (actor->state >= 2) { + actor->info.bonus = 1; + actor->timer_0C6 = 30; + actor->health -= actor->damage; + } + if (actor->state == 1) { + actor->info.bonus = 1; + actor->iwork[1] = 7; + actor->state = 2; + } + } else if (actor->state >= 2) { + actor->info.bonus = 1; + actor->timer_0C6 = 30; + actor->health -= actor->damage; + Audio_PlaySfx(0x2903408F, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else { + actor->timer_0BC = 50; + } + if (actor->health <= 0) { + actor->health = 0; + } + } + } +} + +s32 func_i3_801B8C50(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + Actor* this = thisx; + + RCP_SetupDL(&gMasterDisp, 0x3A); + if (this->timer_0C6 & 1) { + RCP_SetupDL(&gMasterDisp, 0x22); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } + if ((this->timer_0C6 == 0) && ((this->fwork[6] <= 254.0f) || (this->state >= 4))) { + RCP_SetupDL(&gMasterDisp, 0x22); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[4], (s32) this->fwork[5], (s32) this->fwork[6], + 255); + } + return false; +} + +void func_i3_801B8D7C(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp4C = { 0.0f, 0.0f, 0.0f }; + Vec3f sp40 = { 108.0f, 0.0f, 24.0f }; + Vec3f sp34 = { 102.0f, 14.0f, -21.0f }; + Vec3f sp28 = { 0.0f, 0.0f, 0.0f }; + Actor* this = thisx; + + switch (limbIndex) { + case 1: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[10]); + } else { + Matrix_MultVec3f(gCalcMatrix, &sp40, &this->vwork[20]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[23]); + } + break; + case 2: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[11]); + } + break; + case 3: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[12]); + } + break; + case 4: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[13]); + } else { + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[21]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[24]); + } + break; + case 5: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); + } + break; + case 6: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[5]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); + } + break; + case 9: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[6]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); + } + break; + case 10: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[7]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); + } + break; + case 11: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[8]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[18]); + } + break; + case 12: + if (this->health == 0) { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[9]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[19]); + } else { + Matrix_MultVec3f(gCalcMatrix, &sp28, &this->vwork[22]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[25]); + } + break; + } +} + +// OBJ_ACTOR_260 draw +void func_i3_801B90DC(Actor* actor) { + Vec3f sp30[30]; + + if ((actor->state >= 3) && (actor->state < 5)) { + Animation_GetFrameData(&D_602AC28, actor->unk_0B6, sp30); + } else { + Animation_GetFrameData(&D_6024F80, actor->unk_0B6, sp30); + } + Matrix_Translate(gCalcMatrix, 0.0f, -150.0f, 100.0f, 1); + Animation_DrawSkeleton(3, D_602512C, sp30, func_i3_801B8C50, func_i3_801B8D7C, actor, gCalcMatrix); +} + +// OBJ_ACTOR_263 action +#ifdef NON_MATCHING +// BonusText_Display has a return? +void func_i3_801B91A4(Actor* actor) { + Vec3f spDC = { 0.0f, 0.0f, 50.0f }; + Vec3f spD0; + Vec3f spC4; + Vec3f spB8; + Vec3f spAC; + s32 i; + f32 spfA4; + f32 spA0; + f32 spf9C; + f32 spf98; + f32 sp94; + + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + if ((actor->health == 0) && (actor->state > 0)) { + actor->unk_044 = 0; + func_80066254(actor); + for (i = 0; i < 5; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), + actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 0.5f + RAND_FLOAT(0.3f), 7); + } + for (i = RAND_INT(10.0f); i < 13; i++) { + func_i3_801A9448(&actor->vwork[0 + i], &actor->vwork[13 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 53, actor->scale, 200, i); + func_8007BC7C(actor->vwork[0 + i].x, actor->vwork[0 + i].y, actor->vwork[0 + i].z + 100.0f, 6.0f); + } + Object_Kill(&actor->obj, actor->sfxPos); + func_800815DC(); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 5.0f); + func_8007A6F0(&actor->obj.pos, 0x29038090); + } + switch (actor->state) { + case 0: + for (i = 0; i < 13; i++) { + actor->vwork[0 + i].x = actor->obj.pos.x; + actor->vwork[0 + i].y = actor->obj.pos.y; + actor->vwork[0 + i].z = actor->obj.pos.z; + actor->vwork[13 + i].x = actor->obj.rot.x; + actor->vwork[13 + i].y = actor->obj.rot.y; + actor->vwork[13 + i].z = actor->obj.rot.z; + } + actor->health = 30; + actor->unk_0B6 = 19; + actor->fwork[1] = actor->obj.pos.z; + if (actor->obj.rot.z >= 4.0f) { + actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_60314AC); + actor->health = 200; + actor->info.bonus = 1; + actor->state = 2; + actor->obj.rot.x = actor->obj.rot.y = actor->obj.rot.z = 0.0f; + actor->fwork[7] = actor->obj.pos.y; + actor->scale = 2.0f; + } else { + if (actor->obj.rot.z >= 2.0f) { + actor->iwork[1] = 1; + } + spC4.x = spC4.y = 0.0f; + spC4.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &spC4, &spB8); + actor->fwork[4] = spB8.x; + actor->fwork[5] = spB8.y; + actor->fwork[6] = spB8.z; + actor->state = 1; + actor->obj.rot.z = 0.0f; + } + break; + case 1: + actor->unk_0B6++; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6000AE4)) { + actor->unk_0B6 = 0; + } + if (actor->unk_0B6 == 36) { + actor->vel.x = actor->fwork[4]; + actor->vel.y = actor->fwork[5]; + actor->vel.z = actor->fwork[6]; + } + Math_SmoothStepToF(&actor->vel.x, 0.0f, 0.1f, 1.0f, 0.00001f); + Math_SmoothStepToF(&actor->vel.y, 0.0f, 0.1f, 1.0f, 0.00001f); + Math_SmoothStepToF(&actor->vel.z, 0.0f, 0.1f, 1.0f, 0.00001f); + i = 0; + if (actor->iwork[1] != 0) { + if (!(actor->unk_0B6 & 7)) { + i = 1; + } + } else { + if (!(actor->unk_0B6 & 1)) { + i = 1; + } + } + if ((actor->unk_0B6 > 36) && (i != 0) && (fabsf(gPlayer[0].unk_138 - actor->obj.pos.z) > 1000.0f)) { + spfA4 = gPlayer[0].pos.x + RAND_FLOAT_CENTERED(200.0f) - actor->vwork[26].x; + spA0 = gPlayer[0].pos.y + RAND_FLOAT_CENTERED(200.0f) - actor->vwork[26].y; + spf9C = gPlayer[0].unk_138 + RAND_FLOAT_CENTERED(200.0f) - actor->vwork[26].z; + sp94 = Math_RadToDeg(Math_Atan2F(spfA4, spf9C)); + spf98 = Math_RadToDeg(-Math_Atan2F(spA0, sqrtf(SQ(spfA4) + SQ(spf9C)))); + Matrix_RotateY(gCalcMatrix, M_DTOR * sp94, 0); + Matrix_RotateX(gCalcMatrix, M_DTOR * spf98, 1); + spC4.x = spC4.y = 0.0f; + spC4.z = 70.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &spC4, &spAC); + func_8007F04C(353, actor->vwork[26].x + RAND_FLOAT_CENTERED(200.0f), + actor->vwork[26].y + RAND_FLOAT_CENTERED(200.0f), actor->vwork[26].z, spf98, sp94, 0.0f, + 0.0f, 0.0f, 0.0f, spAC.x, spAC.y, spAC.z, 1.0f); + } + break; + case 2: + actor->unk_0B6++; + if ((actor->unk_0B6 >= Animation_GetFrameCount(&D_6000AE4)) && (actor->fwork[8] < 1.0f)) { + actor->unk_0B6 = 0; + } + if (actor->unk_0B6 == 40) { + actor->fwork[8] = 700.0f; + func_i3_801A9728(actor, 50.0f, 10.0f, 8); + } + Math_SmoothStepToF(&actor->obj.pos.y, actor->fwork[7] + actor->fwork[8], 0.1f, 10.0f, 0.00001f); + Math_SmoothStepToF(&actor->fwork[8], 0.0f, 0.1f, 10.0f, 0.0001f); + if (actor->unk_0B6 >= 40) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), + actor->obj.pos.y - 50.0f + RAND_FLOAT_CENTERED(50.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 0); + } + if (actor->unk_0B6 >= 37) { + actor->obj.rot.y += 20.0f; + actor->fwork[2] += 20.0f; + if (!(gGameFrameCount & 3)) { + Matrix_RotateY(gCalcMatrix, actor->fwork[2] * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->vwork[27].x * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, actor->vwork[27].z * M_DTOR, 1); + func_i3_801AC8A8(actor->vwork[11].x + RAND_FLOAT_CENTERED(120.0f), + actor->vwork[11].y + RAND_FLOAT_CENTERED(50.0f), + actor->vwork[11].z + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); + Matrix_MultVec3fNoTranslate(gCalcMatrix, &spDC, &spD0); + func_8007F04C(353, actor->vwork[26].x + spD0.x, actor->vwork[26].y + spD0.y, + actor->vwork[26].z + spD0.z, actor->vwork[27].x, actor->fwork[2], actor->vwork[27].z, + 0.0f, 0.0f, 0.0f, spD0.x, spD0.y, spD0.z, 1.0f); + } + } + break; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if ((actor->health != 0) && (actor->state != 0)) { + actor->timer_0C6 = 15; + actor->health -= actor->damage; + Audio_PlaySfx(0x2903408F, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->health <= 0) { + actor->health = 0; + if (actor->scale > 1.0f) { + BonusText_Display(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 200.0f, 2); + gHitCount += 2; + D_80177850 = 15; + } + } + } + } +} +#else +Vec3f D_i3_801C0314 = { 0.0f, 0.0f, 50.0f }; +#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/fox_aq/func_i3_801B91A4.s") +#endif + +void func_i3_801B9DB0(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp34 = { 0.0f, 0.0f, 0.0f }; + Vec3f sp28 = { -27.0f, 7.0f, 5.0f }; + Actor* this = thisx; + + if ((this->health == 0) || (limbIndex == 12)) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[13]); + return; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); + return; + case 3: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); + return; + case 4: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); + return; + case 5: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); + return; + case 6: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[5]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[18]); + return; + case 7: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[6]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[19]); + return; + case 8: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[7]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[20]); + return; + case 9: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[8]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[21]); + return; + case 10: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[9]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[22]); + return; + case 11: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[10]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[23]); + return; + case 12: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[11]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[24]); + Matrix_Push(&gCalcMatrix); + switch (gGameFrameCount & 3) { + case 0: + break; + case 1: + Matrix_RotateX(gCalcMatrix, M_PI / 2, 1); + break; + case 2: + Matrix_RotateX(gCalcMatrix, M_PI, 1); + break; + case 3: + Matrix_RotateX(gCalcMatrix, 3 * M_PI / 2, 1); + break; + } + Matrix_MultVec3f(gCalcMatrix, &sp28, &this->vwork[26]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[27]); + Matrix_Pop(&gCalcMatrix); + return; + case 21: + Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[12]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[25]); + break; + } + } +} + +// OBJ_ACTOR_263 draw +void func_i3_801BA108(Actor* actor) { + Vec3f sp40[30]; + + RCP_SetupDL(&gMasterDisp, 0x1D); + if (actor->timer_0C6 & 1) { + RCP_SetupDL(&gMasterDisp, 0x1E); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); + } else if (actor->state == 2) { + RCP_SetupDL(&gMasterDisp, 0x1E); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 95, 31, 255); + } + Matrix_Scale(gCalcMatrix, actor->scale, actor->scale, actor->scale, 1); + if (actor->state == 1) { + Matrix_RotateX(gCalcMatrix, (actor->obj.rot.x + 90.0f) * M_DTOR, 1); + } + Animation_GetFrameData(&D_6000AE4, actor->unk_0B6, sp40); + Animation_DrawSkeleton(3, D_6000DB0, sp40, NULL, func_i3_801B9DB0, actor, gCalcMatrix); +} + +// OBJ_ACTOR_264 action +void func_i3_801BA26C(Actor* actor) { + Vec3f sp40[30]; + u16 sp3E; + + switch (actor->state) { + case 0: + actor->unk_0B6 = RAND_INT(50.0f); + actor->state++; + /* fallthrough */ + case 1: + actor->unk_0B6 += 2; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6020A40)) { + actor->unk_0B6 = 0; + } + sp3E = Animation_GetFrameData(&D_6020A40, actor->unk_0B6, sp40); + if ((fabsf(actor->obj.pos.x - gPlayer[0].pos.x) < 150.0f) && + (fabsf(actor->obj.pos.y - gPlayer[0].pos.y) < 500.0f) && + (fabsf(actor->obj.pos.z - gPlayer[0].unk_138) < 700.0f)) { + actor->state = 2; + actor->fwork[0] = 0.0f; + } + break; + case 2: + actor->unk_0B6 += 2; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_601DE50)) { + actor->unk_0B6 = 0; + } + sp3E = Animation_GetFrameData(&D_601DE50, actor->unk_0B6, sp40); + if ((fabsf(actor->obj.pos.x - gPlayer[0].pos.x) > 150.0f) || + (fabsf(actor->obj.pos.y - gPlayer[0].pos.y) > 500.0f) || + (fabsf(actor->obj.pos.z - gPlayer[0].unk_138) > 700.0f)) { + actor->state = 1; + actor->fwork[0] = 0.0f; + } + break; + } + Math_SmoothStepToVec3fArray(sp40, actor->vwork, 1, sp3E, actor->fwork[0], 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[0], 0.5f, 1.0f, 0.008f, 0.0f); +} + +// OBJ_ACTOR_264 draw +void func_i3_801BA4E4(Actor* actor) { + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + Animation_DrawSkeleton(1, D_6020C6C, actor->vwork, NULL, NULL, &actor->index, &gIdentityMatrix); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); +} + +void func_i3_801BA57C(Actor* actor) { + if (actor->state == 0) { + actor->scale = 1.0f; + actor->gravity = 0.3f; + actor->health = 10; + actor->fwork[2] = RAND_FLOAT_CENTERED((actor->index & 7) + 3.0f); + } else { + actor->info.bonus = 0; + actor->scale = 0.5f; + actor->gravity = 0.1f; + actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_603151C); + actor->fwork[2] = RAND_FLOAT_CENTERED((actor->index & 3) + 1.0f); + } + actor->fwork[1] = RAND_FLOAT(50.0f); +} + +// OBJ_ACTOR_265 action +void func_i3_801BA6A4(Actor* actor) { + s32 i; + s32 var_s2; + Actor* var_s0; + + switch (actor->state) { + case 0: + if (actor->iwork[1] == 0) { + actor->obj.rot.z += actor->fwork[2]; + if (!(gGameFrameCount & 1)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(120.0f), + actor->obj.pos.y + RAND_FLOAT_CENTERED(50.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); + } + actor->fwork[1] += 10.0f; + actor->vel.x = SIN_DEG(actor->fwork[1]) * 10.0f; + if (actor->obj.pos.y < (gGroundLevel + 30.0f)) { + Audio_PlaySfx(0x19400007, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->iwork[1] = 1; + actor->vel.x = actor->vel.y = actor->vel.z = 0.0f; + actor->gravity = 0.0f; + func_8007B8F8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 100.0f, actor->scale * 30.0f); + func_8007B8F8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 100.0f, actor->scale * 30.0f); + } + } + break; + case 1: + if (actor->iwork[1] == 0) { + actor->obj.rot.z += actor->fwork[2]; + if (!(gGameFrameCount & 3)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), + actor->obj.pos.y + RAND_FLOAT_CENTERED(50.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(50.0f), 1.0f, 0); + } + Math_SmoothStepToF(&actor->vel.y, -7.0f, 0.1f, 1.0f, 0.0001f); + if (actor->obj.pos.y < (gGroundLevel + 20.0f)) { + actor->gravity = 0.0f; + if (actor->vel.y < 0.0f) { + actor->vel.y = 0.0f; + } + actor->iwork[1] = 1; + Audio_PlaySfx(0x19400007, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + func_8007B8F8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 100.0f, actor->scale * 30.0f); + } + } else { + Math_SmoothStepToF(&actor->vel.y, 0.0f, 0.1f, 1.0f, 0.0001f); + } + Math_SmoothStepToF(&actor->vel.x, 0.0f, 0.1f, 1.0f, 0.0001f); + Math_SmoothStepToF(&actor->vel.z, 0.0f, 0.1f, 1.0f, 0.0001f); + break; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + actor->health -= actor->damage; + if (actor->health <= 0) { + actor->health = actor->unk_044 = 0; + func_80066254(actor); + if (actor->state == 0) { + for (i = 0, var_s2 = 0, var_s0 = gActors; i < 60 && var_s2 < 4; i++, var_s0++) { + if (var_s0->obj.status == OBJ_FREE) { + Actor_Initialize(var_s0); + var_s0->obj.status = OBJ_INIT; + var_s0->obj.id = OBJ_ACTOR_265; + var_s0->obj.pos.x = actor->obj.pos.x; + var_s0->obj.pos.y = actor->obj.pos.y + 20.0f; + var_s0->obj.pos.z = actor->obj.pos.z; + var_s0->vel.x = RAND_FLOAT_CENTERED(50.0f); + var_s0->vel.y = RAND_FLOAT(5.0f); + var_s0->vel.z = RAND_FLOAT_CENTERED(50.0f); + var_s0->state = 1; + + Object_SetInfo(&var_s0->info, var_s0->obj.id); + var_s2++; + } + } + if (i >= 60) { + var_s0->obj.status = OBJ_FREE; + } + } else { + for (i = 0; i < 4; i++) { + func_i3_801A9448(&actor->obj.pos, &actor->obj.rot, RAND_FLOAT_CENTERED(30.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 54, 0.1f, 200, i); + } + } + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 130.0f, actor->scale * 30.0f); + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 130.0f, actor->scale * 30.0f); + func_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 130.0f, actor->scale * 30.0f); + Object_Kill(&actor->obj, actor->sfxPos); + func_8007A6F0(&actor->obj.pos, 0x2903A008); + } + } +} + +// OBJ_ACTOR_265 draw +void func_i3_801BAD7C(Actor* actor) { + Matrix_Scale(gGfxMatrix, actor->scale, actor->scale, actor->scale, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_6014FD0); +} + +// OBJ_ACTOR_266 action +void func_i3_801BADF8(Actor* actor) { + s32 i; + + switch (actor->state) { + case 0: + for (i = 0; i < 5; i++) { + actor->vwork[0 + i].x = actor->obj.pos.x; + actor->vwork[0 + i].y = actor->obj.pos.y; + actor->vwork[0 + i].z = actor->obj.pos.z; + actor->vwork[5 + i].x = actor->obj.rot.x; + actor->vwork[5 + i].y = actor->obj.rot.y; + actor->vwork[5 + i].z = actor->obj.rot.z; + } + actor->state++; + break; + case 1: + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if (actor->damage == 0) { + gPlayer[0].unk_1F4 = 6; + gPlayer[0].unk_21C = 0; + } + actor->state++; + } + break; + case 2: + for (i = 0; i < 5; i++) { + func_i3_801A9448(&actor->vwork[0 + i], &actor->vwork[5 + i], RAND_FLOAT_CENTERED(20.0f), + RAND_FLOAT(5.0f), RAND_FLOAT_CENTERED(10.0f), 55, actor->scale, 200, i); + func_8007BC7C(actor->vwork[0 + i].x, actor->vwork[0 + i].y, actor->vwork[0 + i].z + 100.0f, 6.0f); + } + Object_Kill(&actor->obj, actor->sfxPos); + break; + } +} + +void func_i3_801BB0C4(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp24 = { 0.0f, 0.0f, 0.0f }; + Actor* this = thisx; + + if (this->state != 0) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[5]); + break; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[6]); + break; + case 3: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[2]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[7]); + break; + case 4: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[3]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[8]); + break; + case 9: + Matrix_MultVec3f(gCalcMatrix, &sp24, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[9]); + break; + } + } +} + +// OBJ_ACTOR_266 draw +void func_i3_801BB204(Actor* actor) { + Vec3f sp28[30]; + + Animation_GetFrameData(&D_601EC68, 0, sp28); + Animation_DrawSkeleton(3, D_601EDB4, sp28, NULL, func_i3_801BB0C4, actor, gCalcMatrix); +} + +Vec3f D_i3_801C0344[4] = { + { -6.4f, -4.6f, -7.8f }, + { 6.4f, 4.6f, 7.8f }, + { -5.9f, -7.8f, -7.0f }, + { 5.9f, 7.8f, 7.0f }, +}; +f32 D_i3_801C0374[51] = { + // Structured as f32[4 + 4 + 9][3] + 1.0f, 1.0f, 1.0f, 1.3f, 0.8f, 1.3f, 1.0f, 1.2f, 1.0f, 1.3f, 0.8f, 1.3f, 1.0f, 1.0f, 1.0f, 1.3f, 1.0f, + 1.3f, 1.0f, 1.0f, 1.0f, 1.3f, 1.0f, 1.3f, 1.0f, 1.0f, 1.0f, 0.85f, 0.95f, 0.85f, 0.85f, 0.95f, 0.85f, 0.85f, + 0.95f, 0.85f, 1.0f, 1.05f, 1.0f, 0.85f, 0.95f, 0.85f, 0.85f, 0.95f, 0.85f, 0.85f, 0.95f, 0.85f, 0.85f, 0.95f, 0.85f, +}; +s32 D_i3_801C0440[24] = { + 0, 30, 60, 90, 0, 0, 0, 0, 0, 15, 30, 45, 0, 0, 0, 0, 0, 15, 30, 45, 60, 75, 90, 105, +}; +s32 D_i3_801C04A0[6] = { + 15, -15, 10, -10, 7, -7, +}; + +void func_i3_801BB26C(Actor* actor) { + s32 sp64; + s32 sp60; + Vec3f sp54; + Vec3f sp48; + Actor* sp44; + Actor* sp40; + + actor->fwork[1] = RAND_FLOAT(100.0f); + actor->timer_0BC = RAND_INT(50.0f); + actor->iwork[3] = RAND_INT(10.0f) & 1; + actor->fwork[11] = actor->fwork[14] = actor->fwork[17] = actor->fwork[12] = actor->fwork[15] = actor->fwork[18] = + actor->fwork[13] = actor->fwork[16] = actor->fwork[19] = 1.0f; + actor->fwork[2] = 213.0f; + actor->fwork[3] = 160.0f; + actor->fwork[4] = 255.0f; + actor->fwork[8] = 255.0f; + actor->fwork[7] = 255.0f; + actor->fwork[6] = 197.0f; + actor->fwork[5] = 197.0f; + actor->fwork[10] = 231.0f; + actor->fwork[9] = 231.0f; + actor->fwork[22] = actor->obj.pos.x; + actor->fwork[23] = actor->obj.pos.y; + actor->fwork[24] = actor->obj.pos.z; + actor->iwork[4] = RAND_INT(60.0f); + actor->iwork[5] = 15 + RAND_INT(45.0f); + actor->iwork[6] = 45 + RAND_INT(15.0f); + actor->iwork[7] = RAND_INT(120.0f); + actor->iwork[8] = RAND_INT(120.0f); + actor->iwork[9] = RAND_INT(120.0f); + actor->unk_0B6 = RAND_INT(Animation_GetFrameCount(&D_6023780)); + if (actor->iwork[2] == 0) { + actor->iwork[18] = fabsf(actor->obj.rot.y / 10.0f); + if ((actor->iwork[18] == 0) || (actor->iwork[18] == 2)) { + actor->iwork[19] = 1; + } + actor->iwork[13] = D_i3_801C4450 * 3; + Matrix_RotateZ(gCalcMatrix, actor->obj.rot.z * M_DTOR, 0); + sp54.x = 0.0f; + sp54.y = actor->obj.rot.x * 10.0f; + sp54.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); + for (sp64 = 0, sp44 = gActors; sp64 < 60; sp64++, sp44++) { + if (sp44->obj.status == OBJ_FREE) { + Actor_Initialize(sp44); + sp44->obj.status = OBJ_INIT; + sp44->obj.id = OBJ_ACTOR_267; + sp44->obj.pos.x = actor->obj.pos.x + sp48.x; + sp44->obj.pos.y = actor->obj.pos.y + sp48.y; + sp44->obj.pos.z = actor->obj.pos.z; + sp44->iwork[0] = actor->index + 1; + sp44->iwork[2] = 1; + sp44->iwork[13] = actor->iwork[13]; + sp44->iwork[18] = actor->iwork[18]; + sp44->iwork[19] = actor->iwork[19]; + actor->iwork[0] = sp64 + 1; + Object_SetInfo(&sp44->info, sp44->obj.id); + break; + } + } + Matrix_RotateZ(gCalcMatrix, (actor->obj.rot.z + 90.0f) * M_DTOR, 0); + sp54.x = 0.0f; + sp54.y = actor->obj.rot.x * 10.0f; + sp54.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); + for (sp60 = 0, sp40 = gActors; sp60 < 60; sp60++, sp40++) { + if (sp40->obj.status == OBJ_FREE) { + Actor_Initialize(sp40); + sp40->obj.status = OBJ_INIT; + sp40->obj.id = OBJ_ACTOR_267; + sp40->obj.pos.x = actor->obj.pos.x + sp48.x; + sp40->obj.pos.y = actor->obj.pos.y + sp48.y; + sp40->obj.pos.z = actor->obj.pos.z; + sp40->iwork[0] = actor->index + 1; + sp40->iwork[1] = sp44->index + 1; + sp40->iwork[2] = 2; + sp40->iwork[13] = actor->iwork[13]; + sp40->iwork[18] = actor->iwork[18]; + sp40->iwork[19] = actor->iwork[19]; + sp44->iwork[1] = sp60 + 1; + actor->iwork[1] = sp60 + 1; + Object_SetInfo(&sp40->info, sp40->obj.id); + break; + } + } + actor->fwork[21] = actor->obj.rot.x * 10.0f; + actor->iwork[17] = fabsf(Math_ModF(actor->obj.rot.y, 10.0f)); + actor->fwork[20] = actor->obj.rot.z; + + actor->obj.rot.x = actor->obj.rot.y = actor->obj.rot.z = 0.0f; + D_i3_801C4450++; + if (D_i3_801C4450 > 20) { + D_i3_801C4450 = 0; + } + } +} + +// OBJ_ACTOR_267 action +void func_i3_801BB79C(Actor* actor) { + s32 i; + s32 it0; + s32 it1; + Vec3f sp80; + Vec3f sp74; + Actor* sp70; + Actor* sp6C; + Object_80* sp68; + + if (actor->timer_0C0 == 0) { + switch (actor->iwork[18]) { + case 1: + case 2: + i = actor->iwork[19] + (actor->iwork[2] * 2); + actor->vel.x = D_i3_801C04A0[i]; + if (!(gGameFrameCount & 3)) { + if (fabsf(actor->fwork[22] - actor->obj.pos.x) >= 100.0f) { + if (actor->iwork[20] == 0) { + actor->iwork[19]++; + actor->iwork[19] &= 1; + actor->iwork[20] = 50; + } + } else { + for (i = 0, sp68 = gObjects80; i < 50; i++, sp68++) { + if ((sp68->obj.status == OBJ_ACTIVE) && (sp68->obj.id == OBJ_80_122) && + func_80062DBC(&actor->obj.pos, sp68->info.hitbox, &sp68->obj, 0.0f, 0.0f, 0.0f) && + (actor->iwork[20] == 0)) { + actor->iwork[20] = 50; + actor->iwork[19]++; + actor->iwork[19] &= 1; + } + } + } + } + break; + case 3: + case 4: + i = actor->iwork[19] + (actor->iwork[2] * 2); + actor->vel.y = D_i3_801C04A0[i]; + if (!(gGameFrameCount & 3)) { + if (fabsf(actor->fwork[23] - actor->obj.pos.y) >= 100.0f) { + if (actor->iwork[20] == 0) { + actor->iwork[19]++; + actor->iwork[19] &= 1; + actor->iwork[20] = 50; + } + } else { + for (i = 0, sp68 = gObjects80; i < 50; i++, sp68++) { + if ((sp68->obj.status == OBJ_ACTIVE) && (sp68->obj.id == OBJ_80_122) && + (func_80062DBC(&actor->obj.pos, sp68->info.hitbox, &sp68->obj, 0.0f, 0.0f, 0.0f) || + (actor->obj.pos.y < (gGroundLevel + 30.0f))) && + (actor->iwork[20] == 0)) { + actor->iwork[20] = 50; + actor->iwork[19]++; + actor->iwork[19] &= 1; + } + } + } + } + break; + } + } else { + actor->vel.x = actor->vel.y = 0.0f; + } + if (actor->iwork[2] == 0) { + sp70 = &gActors[actor->iwork[0] - 1]; + sp6C = &gActors[actor->iwork[1] - 1]; + Math_SmoothStepToF(&actor->fwork[21], 200.0f, 0.1f, 2.0f, 0.0001f); + if ((actor->iwork[13] == sp70->iwork[13]) && (actor->iwork[14] == 0)) { + i = 1; + if (!((sp70->obj.id == OBJ_ACTOR_267) && (sp70->obj.status == OBJ_ACTIVE))) { + actor->iwork[14] = 1; + i = 0; + } + if (i != 0) { + if (!actor->timer_0C0 && sp70->timer_0C0 >= 2) { + actor->timer_0C0 = sp70->timer_0C0; + actor->timer_0C6 = sp70->timer_0C6; + } + if (actor->timer_0C0 && !sp70->timer_0C0 >= 2) { + sp70->timer_0C0 = actor->timer_0C0; + sp70->timer_0C6 = actor->timer_0C6; + } + } + if (!(gGameFrameCount & 7)) { + func_8007A6F0(&sp70->obj.pos, 0x3100208E); + } + func_i3_801A92EC(actor, sp70->obj.pos.x, sp70->obj.pos.y, sp70->obj.pos.z, actor->iwork[13], i); + if ((actor->fwork[21] > 200.0f) && (actor->iwork[17] != 0)) { + Matrix_RotateZ(gCalcMatrix, actor->fwork[20] * M_DTOR, 0); + sp80.x = 0.0f; + sp80.y = actor->fwork[21]; + sp80.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp80, &sp74); + sp70->obj.pos.x = actor->obj.pos.x + sp74.x; + sp70->obj.pos.y = actor->obj.pos.y + sp74.y; + sp70->obj.pos.z = actor->obj.pos.z; + } + } + if ((actor->iwork[13] == sp6C->iwork[13]) && (actor->iwork[15] == 0)) { + i = 1; + if (!((sp6C->obj.id == OBJ_ACTOR_267) && (sp6C->obj.status == OBJ_ACTIVE))) { + actor->iwork[15] = 1; + i = 0; + } + if (i != 0) { + if (!actor->timer_0C0 && sp6C->timer_0C0 >= 2) { + actor->timer_0C0 = sp6C->timer_0C0; + actor->timer_0C6 = sp6C->timer_0C6; + } + if (actor->timer_0C0 && !sp6C->timer_0C0 >= 2) { + sp6C->timer_0C0 = actor->timer_0C0; + sp6C->timer_0C6 = actor->timer_0C6; + } + } + if (!(gGameFrameCount & 3)) { + func_8007A6F0(&sp6C->obj.pos, 0x3100208E); + } + func_i3_801A92EC(actor, sp6C->obj.pos.x, sp6C->obj.pos.y, sp6C->obj.pos.z, actor->iwork[13] + 1, i); + if ((actor->fwork[21] > 200.0f) && (actor->iwork[17] != 0)) { + Matrix_RotateZ(gCalcMatrix, (actor->fwork[20] + 90.0f) * M_DTOR, 0); + sp80.x = 0.0f; + sp80.y = actor->fwork[21]; + sp80.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp80, &sp74); + sp6C->obj.pos.x = actor->obj.pos.x + sp74.x; + sp6C->obj.pos.y = actor->obj.pos.y + sp74.y; + sp6C->obj.pos.z = actor->obj.pos.z; + } + } + } else if (actor->iwork[2] == 1) { + sp70 = &gActors[actor->iwork[1] - 1]; + if ((actor->iwork[13] == sp70->iwork[13]) && (actor->iwork[16] == 0)) { + i = 1; + if (!((sp70->obj.id == OBJ_ACTOR_267) && (sp70->obj.status == OBJ_ACTIVE))) { + actor->iwork[16] = 1; + i = 0; + } + if (i != 0) { + if (!actor->timer_0C0 && sp70->timer_0C0 >= 2) { + actor->timer_0C0 = sp70->timer_0C0; + actor->timer_0C6 = sp70->timer_0C6; + } + if (actor->timer_0C0 && !sp70->timer_0C0 >= 2) { + sp70->timer_0C0 = actor->timer_0C0; + sp70->timer_0C6 = actor->timer_0C6; + } + } + if (!(gGameFrameCount & 0xF)) { + func_8007A6F0(&sp70->obj.pos, 0x3100208E); + } + func_i3_801A92EC(actor, sp70->obj.pos.x, sp70->obj.pos.y, sp70->obj.pos.z, actor->iwork[13] + 2, i); + } + } + if (!(gGameFrameCount & 3)) { + func_8007C120(actor->obj.pos.x + RAND_FLOAT_CENTERED(100.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(50.0f), actor->vel.x, actor->vel.y, actor->vel.z, + 0.05f + RAND_FLOAT(0.03f), 10); + } + if (actor->timer_0BE == 0) { + D_i3_801C41B8[18] = 255.0f; + D_i3_801C41B8[19] = 255.0f; + D_i3_801C41B8[20] = 255.0f; + actor->timer_0BE = 10; + } + if (actor->iwork[3] == 0) { + Math_SmoothStepToF(&actor->fwork[1], 30.0f, 0.1f, 1.0f, 0.00001f); + } else { + Math_SmoothStepToF(&actor->fwork[1], 100.0f, 0.1f, 1.0f, 0.00001f); + } + if (actor->timer_0BC == 0) { + actor->timer_0BC = 100; + actor->iwork[3]++; + actor->iwork[3] &= 1; + } + actor->unk_0B6 += 2; + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_6023780)) { + actor->unk_0B6 = 0; + } + if (actor->iwork[4] < 30) { + actor->fwork[2] += D_i3_801C0344[0].x; + actor->fwork[3] += D_i3_801C0344[0].y; + actor->fwork[4] += D_i3_801C0344[0].z; + if (actor->fwork[2] < 0.0f) { + actor->fwork[2] = actor->fwork[3] = actor->fwork[4] = 0.0f; + } + } else { + actor->fwork[2] += D_i3_801C0344[1].x; + actor->fwork[3] += D_i3_801C0344[1].y; + actor->fwork[4] += D_i3_801C0344[1].z; + if (actor->fwork[3] >= 160.0f) { + actor->fwork[2] = 213.0f; + actor->fwork[3] = 160.0f; + actor->fwork[4] = 255.0f; + } + } + for (i = 0; i < 2; i++) { + if (actor->iwork[i + 5] < 30) { + actor->fwork[i + 5] += D_i3_801C0344[2].x; + actor->fwork[i + 7] += D_i3_801C0344[2].y; + actor->fwork[i + 9] += D_i3_801C0344[2].z; + if (actor->fwork[i + 7] < 0.0f) { + actor->fwork[i + 5] = actor->fwork[i + 7] = actor->fwork[i + 9] = 0.0f; + } + } else { + actor->fwork[i + 5] += D_i3_801C0344[3].x; + actor->fwork[i + 7] += D_i3_801C0344[3].y; + actor->fwork[i + 9] += D_i3_801C0344[3].z; + if (actor->fwork[i + 7] >= 255.0f) { + actor->fwork[i + 5] = 197.0f; + actor->fwork[i + 7] = 255.0f; + actor->fwork[i + 9] = 231.0f; + } + } + } + for (i = 0; i < 3; i++) { + it0 = i * 12 + 3 * actor->iwork[10 + i]; + Math_SmoothStepToF(&actor->fwork[11 + i], D_i3_801C0374[it0 + 0], 0.1f, 5.0f, 0.000001f); + Math_SmoothStepToF(&actor->fwork[14 + i], D_i3_801C0374[it0 + 1], 0.1f, 5.0f, 0.000001f); + Math_SmoothStepToF(&actor->fwork[17 + i], D_i3_801C0374[it0 + 2], 0.1f, 5.0f, 0.000001f); + + it0 = 8 * i + actor->iwork[10 + i]; + if (actor->iwork[7 + i] == D_i3_801C0440[it0]) { + actor->iwork[10 + i]++; + } + } + actor->iwork[4]++; + if (actor->iwork[4] >= 60) { + actor->iwork[4] = 0; + } + actor->iwork[5]++; + if (actor->iwork[5] >= 60) { + actor->iwork[5] = 0; + } + actor->iwork[6]++; + if (actor->iwork[6] >= 60) { + actor->iwork[6] = 0; + } + actor->iwork[7]++; + if (actor->iwork[7] >= 120) { + actor->iwork[7] = actor->iwork[10] = 0; + } + actor->iwork[8]++; + if (actor->iwork[8] >= 60) { + actor->iwork[8] = actor->iwork[11] = 0; + } + actor->iwork[9]++; + if (actor->iwork[9] >= 120) { + actor->iwork[9] = actor->iwork[12] = 0; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + Audio_PlaySfx(0x2903408F, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->damage != 31) { + actor->timer_0C0 = actor->timer_0C6 = 40; + } else { + actor->timer_0C0 = actor->timer_0C6 = 80; + } + } + if (actor->iwork[20] != 0) { + actor->iwork[20]--; + } + func_i3_801A96DC(actor); +} + +s32 func_i3_801BC530(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + Vec3f sp64 = { 0.0f, 0.0f, 0.0f }; + Vec3f sp58; + f32 sp54 = 0.0f; + f32 sp50 = 0.0f; + f32 sp4C = 0.0f; + Actor* this = thisx; + + RCP_SetupDL(&gMasterDisp, 0x29); + if (!(this->timer_0C6 & 1)) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 191, 255, 223, (s32) this->fwork[1]); + } else { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 0, 255); + } + switch (limbIndex) { + case 1: + sp54 = this->fwork[12]; + sp50 = this->fwork[15]; + sp4C = this->fwork[18]; + break; + case 2: + sp54 = this->fwork[13]; + sp50 = this->fwork[16]; + sp4C = this->fwork[19]; + break; + case 3: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[5], (s32) this->fwork[7], (s32) this->fwork[9], + 255); + break; + case 4: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[2], (s32) this->fwork[3], (s32) this->fwork[4], + 255); + break; + case 5: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[6], (s32) this->fwork[8], + (s32) this->fwork[10], 255); + break; + case 11: + sp54 = this->fwork[11]; + sp50 = this->fwork[14]; + sp4C = this->fwork[17]; + } + if (sp54 > 0.0f) { + Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); + Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, rot->y * M_DTOR, 1); + Matrix_RotateX(gCalcMatrix, rot->x * M_DTOR, 1); + if (*dList != NULL) { + Matrix_MultVec3f(gCalcMatrix, &sp64, &sp58); + func_8005F670(&sp58); + Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); + Matrix_Push(&gGfxMatrix); + Matrix_Scale(gGfxMatrix, sp54, sp50, sp4C, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, *dList); + Matrix_Pop(&gGfxMatrix); + } + return true; + } + return false; +} + +void func_i3_801BC91C(s32 limbIndex, Vec3f* rot, void* thisx) { +} + +// OBJ_ACTOR_267 draw +void func_i3_801BC930(Actor* actor) { + Vec3f sp28[30]; + + Animation_GetFrameData(&D_6023780, actor->unk_0B6, sp28); + Animation_DrawSkeleton(3, D_602390C, sp28, func_i3_801BC530, func_i3_801BC91C, actor, gCalcMatrix); +} + +s32 D_i3_801C04C4[9] = { + 1, 5, 9, 14, 15, 16, 17, 0, 13, +}; + +// OBJ_ACTOR_269 action +void func_i3_801BC9A0(Actor* actor) { + s32 j; + s32 i; + Vec3f spA4; + Vec3f sp98; + Actor* var_s0; + + switch (actor->state) { + case 0: + actor->vwork[0].x = actor->obj.pos.x; + actor->vwork[0].y = actor->obj.pos.y; + actor->vwork[0].z = actor->obj.pos.z; + actor->vwork[1].x = actor->obj.pos.x; + actor->vwork[1].y = actor->obj.pos.y; + actor->vwork[1].z = actor->obj.pos.z; + actor->vwork[4].x = actor->obj.pos.x; + actor->vwork[4].y = actor->obj.pos.y; + actor->vwork[4].z = actor->obj.pos.z; + actor->iwork[1] = actor->obj.rot.z; + if (actor->iwork[1] >= 9) { + actor->iwork[1] = 7; + } + if (actor->obj.rot.y != 0) { + actor->health = 7650; + actor->iwork[3] = 1; + actor->state = 2; + } else { + actor->health = 10; + actor->info.drawType = 2; + actor->info.bonus = 1; + actor->state++; + } + actor->obj.rot.y = actor->obj.rot.z = 0.0f; + break; + case 1: + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if ((actor->health != 0) && (actor->iwork[3] == 0) && (actor->damage == 31)) { + actor->health -= actor->damage; + Audio_PlaySfx(0x2903B009, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (actor->health <= 0) { + actor->health = 0; + actor->state = 3; + } + } + } + break; + case 3: + for (i = 0; i < 2; i++) { + for (j = 0; j < 60; j++) { + if ((gActors[j].obj.status == OBJ_ACTIVE) && (gActors[j].obj.id == OBJ_ACTOR_189) && + (gActors[j].state == 58)) { + Object_Kill(&gActors[j].obj, gActors[j].sfxPos); + break; + } + } + } + for (i = 0; i < 2; i++) { + for (j = 0, var_s0 = gActors; j < 60; j++, var_s0++) { + if (var_s0->obj.status == OBJ_FREE) { + Actor_Initialize(var_s0); + var_s0->obj.status = OBJ_INIT; + var_s0->obj.id = OBJ_ACTOR_269; + var_s0->obj.pos.x = actor->vwork[i].x; + var_s0->obj.pos.y = actor->vwork[i].y; + var_s0->obj.pos.z = actor->vwork[i].z; + var_s0->iwork[0] = i + 1; + Object_SetInfo(&var_s0->info, var_s0->obj.id); + if (i == 0) { + var_s0->fwork[0] = RAND_FLOAT(360.0f); + Matrix_RotateY(gCalcMatrix, var_s0->fwork[0] * M_DTOR, 0); + spA4.x = spA4.y = spA4.z = 5.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &spA4, &sp98); + var_s0->vel.x = sp98.x; + var_s0->vel.z = sp98.z; + var_s0->gravity = 0.4f; + var_s0->state = 5; + var_s0->info.hitbox = SEGMENTED_TO_VIRTUAL(D_6030D3C); + } else { + var_s0->state = 2; + var_s0->info.hitbox = SEGMENTED_TO_VIRTUAL(D_6030D58); + } + break; + } + } + } + for (j = 0; j < 10; j++) { + func_i3_801A9448(&actor->vwork[4], &actor->vwork[5], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), + RAND_FLOAT_CENTERED(10.0f), 58, 0.2f + RAND_FLOAT(1.0f), 200, 0); + func_8007BC7C(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z + 50.0f, 6.0f); + } + func_800815DC(); + func_8007D0E0(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z, 10.0f); + for (j = 0; j < 20; j++) { + func_i3_801AC8A8(actor->vwork[4].x + RAND_FLOAT_CENTERED(100.0f), + actor->vwork[4].y + RAND_FLOAT_CENTERED(200.0f), + actor->vwork[4].z + 100.0f + RAND_FLOAT_CENTERED(200.0f), 6.0f, 2); + } + func_800815DC(); + func_8007D0E0(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z + 150.0f, 10.0f); + actor->timer_0BC = 4; + actor->state = 4; + break; + case 4: + if (actor->timer_0BC == 0) { + actor->obj.pos.x = actor->vwork[4].x; + actor->obj.pos.y = actor->vwork[4].y; + actor->obj.pos.z = actor->vwork[4].z; + actor->unk_044 = D_i3_801C04C4[actor->iwork[1]]; + func_80066254(actor); + Object_Kill(&actor->obj, actor->sfxPos); + func_8007A6F0(&actor->obj.pos, 0x19021078); + } + break; + case 5: + Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[0], 0.1f, 10.0f, 0.0001f); + Math_SmoothStepToAngle(&actor->obj.rot.x, 90.0f, 0.1f, 1.0f, 0.0001f); + if (!(gGameFrameCount & 1) && (actor->iwork[2] == 0)) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(200.0f), + actor->obj.pos.y + RAND_RANGE(-45.0f, 105.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(200.0f), 6.0f, 2); + } + if ((actor->obj.pos.y < (gGroundLevel + 30.0f)) && (actor->iwork[2] == 0)) { + actor->iwork[2] = 1; + actor->vel.x = actor->vel.y = actor->vel.z = actor->gravity = 0.0f; + func_8007A6F0(&actor->obj.pos, 0x19400007); + for (j = 0; j < 6; j++) { + func_8007B8F8(actor->obj.pos.x + RAND_FLOAT_CENTERED(100.0f), + actor->obj.pos.y + RAND_RANGE(-9.0f, 21.0f), + actor->obj.pos.z + RAND_FLOAT_CENTERED(200.0f), 20.0f); + } + } + break; + } +} + +void func_i3_801BD17C(s32 limbIndex, Vec3f* rot, void* thisx) { + Vec3f sp2C = { 0.0f, 0.0f, 0.0f }; + Actor* this = thisx; + + if (this->state == 3) { + switch (limbIndex) { + case 1: + Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[4]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[5]); + return; + case 2: + Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[0]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[2]); + return; + case 5: + Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[1]); + Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[3]); + break; + } + } +} + +// OBJ_ACTOR_269 draw +void func_i3_801BD264(Actor* actor) { + Vec3f sp40[30]; + + if (actor->state != 0) { + RCP_SetupDL(&gMasterDisp, 0x37); + switch (actor->iwork[0]) { + case 0: + if (actor->state != 0) { + if ((actor->iwork[3] == 0) && (actor->info.drawType == 2)) { + Animation_GetFrameData(&D_6014438, 0, sp40); + Animation_DrawSkeleton(3, D_6014504, sp40, NULL, func_i3_801BD17C, actor, gCalcMatrix); + } else { + gSPDisplayList(gMasterDisp++, D_6014520); + } + } + break; + case 1: + gSPDisplayList(gMasterDisp++, D_60137F0); + break; + case 2: + gSPDisplayList(gMasterDisp++, D_6014030); + break; + } + } +} + +void func_i3_801BD3B0(Actor* actor, f32 x, f32 y, f32 z) { + f32 temp; + Vec3f sp38; + Vec3f sp2C; + + Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[6], 0.1f, 100.0f, 0.00001f); + Math_SmoothStepToAngle(&actor->obj.rot.x, actor->fwork[7], 0.1f, 100.0f, 0.00001f); + if (!(gGameFrameCount & 3)) { + actor->fwork[6] = Math_RadToDeg(Math_Atan2F(x, z)); + temp = sqrtf(SQ(x) + SQ(z)); + actor->fwork[7] = Math_RadToDeg(-Math_Atan2F(y, temp)); + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + Math_SmoothStepToF(&actor->fwork[4], 5.0f, 0.1f, 10.0f, 0); + sp38.z = actor->fwork[4]; + if (actor->iwork[2] != 0) { + sp38.z = 50.0f; + } + sp38.x = sp38.y = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp38, &sp2C); + actor->vel.x = sp2C.x; + actor->vel.y = sp2C.y; + actor->vel.z = sp2C.z; + } +} + +f32 D_i3_801C04F4[4] = { 700.0f, 300.0f, 600.0f, 400.0f }; +// OBJ_ACTOR_268 action +void func_i3_801BD54C(Actor* actor) { + s32 sp6C; + s32 sp68; + s32 sp64; + f32 var_fs0; + f32 sp5C; + f32 sp58; + f32 sp54; + Actor* var_s0; + + if (actor->state == 2) { + var_fs0 = (actor->iwork[3] != 0) ? 2800.0f : 9000.0f; + if (fabsf(actor->fwork[5] - actor->obj.pos.z) >= var_fs0) { + actor->state = 3; + if (actor->iwork[0] == 0) { + Audio_PlaySfx(0x19400077, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else { + // needed to match + } + } + switch (actor->state) { + case 0: + if (actor->obj.rot.z != 0) { + actor->iwork[3] = 1; + actor->obj.rot.z = 0.0f; + } + actor->state = 1; + actor->fwork[5] = actor->obj.pos.z; + break; + case 1: + sp64 = actor->index; + for (sp68 = 0; sp68 < 15; sp68++) { + for (sp6C = 0, var_s0 = gActors; sp6C < 60; sp6C++, var_s0++) { + if (var_s0->obj.status == OBJ_FREE) { + Actor_Initialize(var_s0); + var_s0->obj.status = OBJ_INIT; + var_s0->obj.id = OBJ_ACTOR_268; + var_s0->iwork[4] = sp64; + var_s0->iwork[0] = sp68 + 1; + var_s0->iwork[3] = actor->iwork[3]; + sp64 = sp6C; + var_fs0 = 100.0f; + if (Rand_ZeroOne() < 0.5f) { + var_fs0 = -100.0f; + } + var_s0->obj.pos.x = actor->obj.pos.x + ((sp68 & 7) * var_fs0) + RAND_FLOAT(50.0f); + var_s0->obj.pos.y = actor->obj.pos.y + ((sp68 & 7) * (var_fs0 / 2.0f)) + RAND_FLOAT(30.0f); + var_s0->obj.pos.z = actor->obj.pos.z + (sp68 * 20.0f) + RAND_FLOAT(-18.0f); + var_s0->unk_0B6 = RAND_FLOAT(20.0f); + var_s0->fwork[5] = actor->fwork[5]; + var_s0->state = 2; + Object_SetInfo(&var_s0->info, var_s0->obj.id); + break; + } + } + } + actor->state = 2; + break; + case 2: + if (actor->obj.pos.y < gGroundLevel + 30.0f) { + actor->obj.pos.y = gGroundLevel + 30.0f; + } + if ((actor->iwork[2] != 0) || (actor->timer_0BE != 0)) { + actor->timer_0BC = 0; + } else { + Math_SmoothStepToF(&actor->fwork[3], D_i3_801C04F4[actor->iwork[1]], 0.1f, 30.0f, 0.0001f); + Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].camEye.z - D_80177D20 - actor->fwork[3], 0.1f, 30.0f, + 0.00001f); + } + if ((actor->timer_0BC == 0) && (actor->iwork[2] == 0) && (actor->timer_0BE == 0)) { + actor->timer_0BC = 60; + actor->fwork[1] = RAND_FLOAT_CENTERED(300.0f); + actor->fwork[2] = 50.0f + RAND_FLOAT_CENTERED(100.0f); + if (actor->fwork[2] < gGroundLevel + 30.0f) { + actor->fwork[2] = gGroundLevel + 30.0f; + } + actor->iwork[1]++; + actor->iwork[1] &= 3; + } + sp5C = gPlayer[0].pos.x - actor->obj.pos.x; + sp58 = gPlayer[0].pos.y - actor->obj.pos.y; + sp54 = gPlayer[0].unk_138 - actor->obj.pos.z; + if (actor->timer_0BE == 0) { + actor->iwork[2] = 0; + if (actor->iwork[0] == 0) { + if (D_i3_801C4190[5] == 0) { + sp5C = gPlayer[0].pos.x + actor->fwork[1] - actor->obj.pos.x; + sp58 = gPlayer[0].pos.y - 100.0f + actor->fwork[2] - actor->obj.pos.y; + sp54 = gPlayer[0].unk_138 - actor->fwork[3] - actor->obj.pos.z; + } else if ((D_i3_801C41B8[21] != 0) && (D_i3_801C41B8[22] != 0) && (D_i3_801C41B8[23] != 0)) { + sp5C = D_i3_801C41B8[21] - actor->obj.pos.x; + sp58 = D_i3_801C41B8[22] - actor->obj.pos.y; + sp54 = D_i3_801C41B8[23] - actor->obj.pos.z; + actor->iwork[2] = 1; + } + } else if (D_i3_801C4190[5] == 0) { + var_s0 = &gActors[actor->iwork[4]]; + if ((actor->iwork[0] - 1 == var_s0->iwork[0]) && (var_s0->obj.status != OBJ_FREE) && + (var_s0->obj.id == OBJ_ACTOR_268)) { + sp5C = var_s0->obj.pos.x + (actor->fwork[1] / 2.0f) - actor->obj.pos.x; + sp58 = var_s0->obj.pos.y + (actor->fwork[2] / 2.0f) - actor->obj.pos.y; + sp54 = var_s0->obj.pos.z - actor->obj.pos.z; + } else { + actor->iwork[0]--; + sp5C = gPlayer[0].pos.x + actor->fwork[1] - actor->obj.pos.x; + sp58 = gPlayer[0].pos.y + actor->fwork[2] - actor->obj.pos.y; + sp54 = gPlayer[0].unk_138 - actor->fwork[3] - actor->obj.pos.z; + if (actor->iwork[0] < 0) { + actor->iwork[0] = 0; + } + } + } else if ((D_i3_801C41B8[21] != 0) && (D_i3_801C41B8[22] != 0) && (D_i3_801C41B8[23] != 0)) { + sp68 = actor->iwork[0]; + var_fs0 = 50.0f; + if (Rand_ZeroOne() < 0.5f) { + var_fs0 = -50.0f; + } + + sp5C = D_i3_801C41B8[21] + ((sp68 & 7) * var_fs0) + RAND_FLOAT(50.0f) - actor->obj.pos.x; + sp58 = D_i3_801C41B8[22] + ((sp68 & 7) * (var_fs0 / 2.0f)) + RAND_FLOAT(50.0f) - actor->obj.pos.y; + sp54 = D_i3_801C41B8[23] + RAND_FLOAT(50.0f) - actor->obj.pos.z; + actor->iwork[2] = 1; + } + if (1) {} + } + if ((actor->iwork[2] != 0) && (D_i3_801C4190[5] == 0)) { + actor->iwork[2] = 0; + actor->fwork[4] = 40.0f; + actor->timer_0BE = 20; + } + func_i3_801BD3B0(actor, sp5C, sp58, sp54); + break; + case 3: + sp5C = gPlayer[0].pos.x + actor->fwork[1] - actor->obj.pos.x; + sp58 = gPlayer[0].pos.y + actor->fwork[2] - actor->obj.pos.y; + sp54 = gPlayer[0].unk_138 + 10000.0f - actor->fwork[3] - actor->obj.pos.z; + actor->iwork[2] = 1; + func_i3_801BD3B0(actor, sp5C, sp58, sp54); + if ((gPlayer[0].unk_138 + 1000.0f) < actor->obj.pos.z) { + Object_Kill(&actor->obj, actor->sfxPos); + } + break; + } + actor->unk_0B6++; + if (Animation_GetFrameCount(&D_60135E0) < actor->unk_0B6) { + actor->unk_0B6 = 0; + } +} + +s32 func_i3_801BDDFC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); + if ((limbIndex == 1) || (limbIndex == 2) || (limbIndex == 5)) { + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + } + return false; +} + +// OBJ_ACTOR_268 draw +void func_i3_801BDE6C(Actor* actor) { + Animation_GetFrameData(&D_60135E0, actor->unk_0B6, actor->vwork); + if (actor->iwork[3] == 0) { + Animation_DrawSkeleton(1, D_60136CC, actor->vwork, func_i3_801BDDFC, NULL, actor, &gIdentityMatrix); + } else { + Animation_DrawSkeleton(1, D_60137CC, actor->vwork, func_i3_801BDDFC, NULL, actor, &gIdentityMatrix); + } +} + +Vec3f D_i3_801C0504[50] = { + { 416.0f, 440.0f, -4182.0f }, { 437.0f, 440.0f, -4178.0f }, { 510.0f, 420.0f, -4156.0f }, + { 168.0f, 361.0f, -4168.0f }, { 434.0f, 440.0f, -4162.0f }, { 465.0f, 465.0f, -4146.0f }, + { 464.0f, 493.0f, -4124.0f }, { 426.0f, 395.0f, -4136.0f }, { 457.0f, 440.0f, -4112.0f }, + { 480.0f, 487.0f, -4110.0f }, { 454.0f, 440.0f, -4256.0f }, { 179.0f, 507.0f, -4272.0f }, + { 442.0f, 392.0f, -4242.0f }, { 450.0f, 481.0f, -4248.0f }, { 474.0f, 420.0f, -4232.0f }, + { 376.0f, 440.0f, -4196.0f }, { 463.0f, 507.0f, -4190.0f }, { 467.0f, 424.0f, -4208.0f }, + { 394.0f, 404.0f, -4186.0f }, { 256.0f, 440.0f, -3680.0f }, { 243.0f, 515.0f, -3648.0f }, + { 277.0f, 390.0f, -3662.0f }, { 234.0f, 457.0f, -3664.0f }, { 561.0f, 440.0f, -4332.0f }, + { 550.0f, 514.0f, -4346.0f }, { 568.0f, 404.0f, -4304.0f }, { 580.0f, 545.0f, -4350.0f }, + { 552.0f, 382.0f, -4292.0f }, { 528.0f, 462.0f, -4322.0f }, { 558.0f, 440.0f, -4294.0f }, + { 396.0f, 440.0f, -4284.0f }, { 391.0f, 363.0f, -4254.0f }, { 379.0f, 501.0f, -4254.0f }, + { 428.0f, 440.0f, -4246.0f }, { 374.0f, 440.0f, -4282.0f }, { 373.0f, 342.0f, -4290.0f }, + { 353.0f, 570.0f, -4266.0f }, { 359.0f, 440.0f, -4232.0f }, { 399.0f, 216.0f, -4246.0f }, + { 406.0f, 251.0f, -4222.0f }, { 380.0f, 189.0f, -4248.0f }, { 370.0f, 278.0f, -4214.0f }, + { 383.0f, 237.0f, -4266.0f }, { 360.0f, 299.0f, -4320.0f }, { 359.0f, 266.0f, -4280.0f }, + { 354.0f, 211.0f, -4256.0f }, { 391.0f, 238.0f, -4192.0f }, { 340.0f, 294.0f, -4216.0f }, + { 423.0f, 242.0f, -4200.0f }, { 429.0f, 311.0f, -4138.0f }, +}; +f32 D_i3_801C075C[51] = { + 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, + 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 320.0f, 320.0f, 320.0f, 320.0f, 40.0f, 40.0f, 40.0f, + 40.0f, 40.0f, 40.0f, 40.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, + 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 10.0f, 28.0f, 28.0f, +}; +f32 D_i3_801C0828[51] = { + 210.0f, 250.0f, 170.0f, 200.0f, 225.0f, 240.0f, 220.0f, 180.0f, 210.0f, 230.0f, 355.0f, 349.0f, 357.0f, + 12.0f, 357.0f, 65.0f, 256.0f, 250.0f, 88.0f, 0.0f, 0.0f, 0.0f, 9.0f, 14.0f, 35.0f, 40.0f, + 5.0f, 92.0f, 56.0f, 71.0f, 355.0f, 326.0f, 30.0f, 5.0f, 30.0f, 30.0f, 60.0f, 69.0f, 1.0f, + 346.0f, 30.0f, 97.0f, 30.0f, 30.0f, 30.0f, 30.0f, 162.0f, 98.0f, 10.0f, 213.0f, 30.0f, +}; + +void func_i3_801BDF14(void) { + Actor* var_s0 = &gActors[1]; + s32 i; + + for (i = 0; i < 50; i++, var_s0++) { + Actor_Initialize(var_s0); + var_s0->obj.status = OBJ_INIT; + var_s0->obj.id = OBJ_ACTOR_195; + var_s0->obj.pos.x = D_i3_801C0504[i].x; + var_s0->obj.pos.y = D_i3_801C0504[i].y; + var_s0->obj.pos.z = D_i3_801C0504[i].z; + var_s0->unk_0F4.y = D_i3_801C075C[i]; + var_s0->unk_0B6 = 41; + var_s0->iwork[0] = RAND_INT(20.0f); + var_s0->iwork[2] = i; + var_s0->timer_0BC = 231; + var_s0->fwork[0] = 4.5f; + Object_SetInfo(&var_s0->info, var_s0->obj.id); + } +} + +void func_i3_801BE034(Actor* actor) { + f32 temp; + + if (actor->timer_0BC == 0) { + actor->fwork[0] = 10.0f; + temp = D_i3_801C0828[actor->iwork[2]]; + Math_SmoothStepToAngle(&actor->unk_0F4.y, temp, 1.0f, 100.0f, 0.00001f); + } + actor->iwork[0]++; + if (actor->iwork[0] >= Animation_GetFrameCount(&D_60135E0)) { + actor->iwork[0] = 0; + } + if (gPlayer->unk_1D0 >= 5) { + Object_Kill(&actor->obj, actor->sfxPos); + } +} + +void func_i3_801BE0F0(Actor* actor) { + RCP_SetupDL(&gMasterDisp, 0x3D); + Matrix_Scale(gGfxMatrix, 0.5f, 0.5f, 0.5f, 1); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 255, 255, 255); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + Matrix_SetGfxMtx(&gMasterDisp); + Animation_GetFrameData(&D_60135E0, actor->iwork[0], actor->vwork); + Animation_DrawSkeleton(1, D_60136CC, actor->vwork, NULL, NULL, actor, &gIdentityMatrix); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); +} + +// OBJ_80_126 draw +void func_i3_801BE1FC(Object_80* obj80) { + Matrix_Scale(gGfxMatrix, 0.5f, 0.5f, 0.5f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_600EEF0); +} + +void func_i3_801BE274(Actor* actor, f32 yRot, f32 xRot) { + Vec3f sp64; + Vec3f sp58; + Vec3f sp4C = { 0.0f, 0.0f, 0.0f }; + Vec3f sp40; + + Matrix_RotateY(gCalcMatrix, 0.017453292f * yRot, 0); + Matrix_RotateX(gCalcMatrix, 0.017453292f * xRot, 1); + sp40.x = sp40.y = 0.0f; + sp40.z = 50.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp40, &sp64); + sp64.x += actor->obj.pos.x; + sp64.y += actor->obj.pos.y + 8.0f; + sp64.z = actor->obj.pos.z; + sp40.x = sp40.y = 0.0f; + sp40.z = 80.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp40, &sp58); + func_8007F04C(355, sp64.x, sp64.y, sp64.z, xRot, yRot, 0.0f, 0.0f, 0.0f, 0.0f, sp58.x, sp58.y, sp58.z, 1.0f); +} + +// OBJ_ACTOR_270 action +void func_i3_801BE3F8(Actor* actor) { + s32 i; + f32 sp68; + f32 sp64; + f32 sp60; + f32 sp5C; + f32 sp58; + + switch (actor->state) { + case 0: + actor->health = 30; + actor->fwork[0] = 1.0f; + actor->fwork[1] = 0.9f; + actor->fwork[2] = 0.8f; + actor->state++; + break; + case 1: + if (fabsf(gPlayer->pos.z - actor->obj.pos.z) <= 3000.0f) { + actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_60314E4); + actor->info.damage = 0; + actor->info.bonus = 1; + actor->timer_0BC = 40.0f + RAND_FLOAT(30.0f); + actor->state++; + } + break; + case 2: + actor->unk_0B6++; + if (actor->unk_0B6 == 10) { + for (i = 0; i < 10; i++) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(200.0f), + actor->obj.pos.y + 50.0f + RAND_FLOAT_CENTERED(70.0f), actor->obj.pos.z + 100.0f, + 3.0f, 2); + } + } + if ((actor->unk_0B6 == 18) && (actor->health != 0)) { + actor->unk_0B6 = 17; + if ((fabsf(actor->obj.pos.z - gPlayer->unk_138) > 1000.0f) && (actor->timer_0BC < 20) && + !(actor->timer_0BC & 3)) { + sp68 = gPlayer->pos.x + RAND_FLOAT_CENTERED(200.0f) - actor->obj.pos.x; + sp64 = gPlayer->pos.y + RAND_FLOAT_CENTERED(200.0f) - actor->obj.pos.y; + sp60 = gPlayer->unk_138 - actor->obj.pos.z; + sp58 = Math_RadToDeg(Math_Atan2F(sp68, sp60)); + sp5C = Math_RadToDeg(-Math_Atan2F(sp64, sqrtf(SQ(sp68) + SQ(sp60)))); + func_i3_801BE274(actor, sp58, sp5C); + if (actor->timer_0BC == 0) { + actor->timer_0BC = 40.0f + RAND_FLOAT(30.0f); + } + } + } + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_602201C)) { + actor->info.bonus = 0; + actor->unk_0B6 = Animation_GetFrameCount(&D_602201C) - 1; + actor->state++; + } + break; + case 3: + break; + } + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + if (actor->health != 0) { + if (actor->state == 2) { + actor->health -= actor->damage; + if (actor->health <= 0) { + actor->health = actor->unk_044 = 0; + func_80066254(actor); + for (i = 0; i < 10; i++) { + func_i3_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(200.0f), + actor->obj.pos.y + 50.0f + RAND_FLOAT_CENTERED(70.0f), + actor->obj.pos.z + 100.0f, 3.0f, 2); + } + for (i = 0; i < 3; i++) { + func_80081A8C(actor->obj.pos.x + RAND_FLOAT(15.0f), actor->obj.pos.y + RAND_FLOAT(3.0f), + actor->obj.pos.z + RAND_FLOAT(5.0f), 1.0f + RAND_FLOAT(0.5f), 7); + } + func_800815DC(); + func_8007CF30(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 51.0f, 10.0f); + } + } + if (actor->state == 1) { + actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_60314E4); + actor->info.damage = 0; + actor->info.bonus = 1; + actor->state = 2; + } + } + } +} + +// OBJ_ACTOR_270 draw +void func_i3_801BEB1C(Actor* actor) { + Graphics_SetScaleMtx(3.0f); + RCP_SetupDL(&gMasterDisp, 0x38); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 143, 143, 255); + Animation_GetFrameData(&D_602201C, actor->unk_0B6, actor->vwork); + Animation_DrawSkeleton(1, D_60220E8, actor->vwork, NULL, NULL, &actor->index, &gIdentityMatrix); + if (actor->health != 0) { + RCP_SetupDL(&gMasterDisp, 0x37); + Matrix_Scale(gGfxMatrix, actor->fwork[0], actor->fwork[1], actor->fwork[2], 1); + Matrix_Translate(gGfxMatrix, 0.0f, -8.0f, 51.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_6002C10); + } +} + +// OBJ_BOSS_301 action +void func_i3_801BEC50(Boss* boss301) { +} + +// OBJ_BOSS_301 draw +void func_i3_801BEC5C(Boss* boss301) { +} + +// OBJ_ACTOR_188 action +void func_i3_801BEC68(Actor* actor) { +} + +// OBJ_ACTOR_188 draw +void func_i3_801BEC74(Actor* actor) { +} + +void func_i3_801BEC80(Player* player) { +} + +void func_i3_801BEC8C(void* arg0) { +} diff --git a/src/overlays/ovl_i3/fox_zo.c b/src/overlays/ovl_i3/fox_zo.c index a8943098..a6901c5e 100644 --- a/src/overlays/ovl_i3/fox_zo.c +++ b/src/overlays/ovl_i3/fox_zo.c @@ -46,7 +46,6 @@ typedef struct { #define ZO_HIT_10(bossZO, index) ((Hitbox*) ((f32*) (ZO_HIT_8(bossZO, 0) + 2) + 6 * (index))) #define ZO_HIT_12(bossZO) ((Hitbox*) (ZO_HIT_10(bossZO, 0) + 2)) -void func_8007EE68(s32, Vec3f*, Vec3f*, Vec3f*, Vec3f*, f32); void func_80081BEC(f32, f32, f32, f32, s32); void func_8008377C(f32, f32, f32, f32, f32); void func_i3_801A7750(void); @@ -62,6 +61,20 @@ void func_i3_80199394(Boss* bossZO, s32 arg1); void func_i3_80199470(Boss* bossZO, s32 arg1); void func_i3_8019962C(Boss* bossZO, f32 arg1); +// /* 0x1 */ ROM_SEGMENT(ast_873CB0), +// /* 0x2 */ ROM_SEGMENT(ast_8AE0A0), +// /* 0x3 */ ROM_SEGMENT(ast_8BFC00), +// /* 0x4 */ ROM_SEGMENT(ast_918430), +// /* 0x5 */ ROM_SEGMENT(ast_CD2410), +// /* 0x6 */ ROM_SEGMENT(ast_B84560), +// /* 0x7 */ NO_SEGMENT, +// /* 0x8 */ NO_SEGMENT, +// /* 0x9 */ NO_SEGMENT, +// /* 0xA */ NO_SEGMENT, +// /* 0xB */ NO_SEGMENT, +// /* 0xC */ NO_SEGMENT, +// /* 0xD */ ROM_SEGMENT(ast_955270), + extern Gfx D_6002E10[]; extern Gfx D_6004380[]; extern Gfx D_6006360[]; @@ -69,25 +82,25 @@ extern Limb* D_600E7D8[]; extern Gfx D_6013330[]; extern Gfx D_6017950[]; extern Gfx D_60181E0[]; -extern AnimationHeader D_6018550; +extern Animation D_6018550; extern Limb* D_601863C[]; extern Gfx D_6018660[]; -extern AnimationHeader D_60195EC; +extern Animation D_60195EC; extern Limb* D_6019738[]; -extern AnimationHeader D_601996C; +extern Animation D_601996C; extern Limb* D_6019E18[]; extern Gfx D_6019EB0[]; extern Gfx D_601A340[]; -extern AnimationHeader D_601AA48; +extern Animation D_601AA48; extern Limb* D_601AB14[]; -extern AnimationHeader D_601AFB8; +extern Animation D_601AFB8; extern Limb* D_601B184[]; extern Gfx D_601BCC0[]; extern Gfx D_601C590[]; extern Gfx D_601D680[]; -extern AnimationHeader D_601FBC4; +extern Animation D_601FBC4; extern Limb* D_601FC90[]; -extern AnimationHeader D_6021ABC; +extern Animation D_6021ABC; extern Limb* D_6021B88[]; extern Gfx D_6023D50[]; extern Gfx D_6025E60[]; @@ -177,7 +190,7 @@ typedef enum { /* 38 */ ZO_LIMB_38, /* 39 */ ZO_LIMB_39, /* 40 */ ZO_LIMB_MAX, -} ZoLimbs; +} BossZOLimbs; typedef enum { /* 0 */ ZO_BSF_0, @@ -2509,8 +2522,8 @@ void func_i3_80194A84(Boss* bossZO) { } func_8007C120(sZoFwork[ZO_BSF_55_X], sZoFwork[ZO_BSF_55_Y], sZoFwork[ZO_BSF_55_Z], bossZO->vel.x, bossZO->vel.y, bossZO->vel.z, 0.2f, 10); - func_8007D0E0(RAND_FLOAT_CENTERED(200.0f) + sZoFwork[ZO_BSF_55_X], - ((Rand_ZeroOne() - 0.2f) * 800.0f) + sZoFwork[ZO_BSF_55_Y], sZoFwork[ZO_BSF_55_Z], 10.0f); + func_8007D0E0(sZoFwork[ZO_BSF_55_X] + RAND_FLOAT_CENTERED(200.0f), + sZoFwork[ZO_BSF_55_Y] + RAND_RANGE(-160.0f, 640.0f), sZoFwork[ZO_BSF_55_Z], 10.0f); if (bossZO->timer_050 == 30) { Radio_PlayMessage(gMsg_ID_6079, RCID_BOSS_ZONESS); } @@ -2596,8 +2609,8 @@ void func_i3_80194A84(Boss* bossZO) { } if ((bossZO->timer_050 == 0) && (sZoSwork[ZO_BSS_26] != 0)) { bossZO->timer_050 = 50; - sZoFwork[ZO_BSF_37_X] = (Rand_ZeroOne() - 0.3f) * 1100.0f; - sZoFwork[ZO_BSF_40_X] = (Rand_ZeroOne() - 0.7f) * 800.0f; + sZoFwork[ZO_BSF_37_X] = RAND_RANGE(-330.0f, 770.0f); + sZoFwork[ZO_BSF_40_X] = RAND_RANGE(-560.0f, 240.0f); func_i3_801989FC(bossZO); } } else { @@ -3253,7 +3266,7 @@ void func_i3_80198F3C(Boss* bossZO, s32 arg1, s32 arg2) { sZoLimbTimers[ZO_LIMB_22 + 2 * arg1] = 15; } func_8007D0E0(sZoFwork[ZO_BSF_0 + arg2] + RAND_FLOAT_CENTERED(400.0f), - sZoFwork[ZO_BSF_1 + arg2] + (Rand_ZeroOne() - 0.2f) * 800.0f, sZoFwork[ZO_BSF_2 + arg2], 7.0f); + sZoFwork[ZO_BSF_1 + arg2] + RAND_RANGE(-160.0f, 640.0f), sZoFwork[ZO_BSF_2 + arg2], 7.0f); if (!(gGameFrameCount & 1)) { func_8007C120(sZoFwork[ZO_BSF_0 + arg2], sZoFwork[ZO_BSF_1 + arg2], sZoFwork[ZO_BSF_2 + arg2], bossZO->vel.x, bossZO->vel.y, bossZO->vel.z, 0.2f, 10); diff --git a/src/overlays/ovl_i3/sf_aq.c b/src/overlays/ovl_i3/sf_aq.c deleted file mode 100644 index da02cf47..00000000 --- a/src/overlays/ovl_i3/sf_aq.c +++ /dev/null @@ -1,1108 +0,0 @@ -#include "prevent_bss_reordering.h" -#include "global.h" - -void func_i3_801AC918(Effect*); -void func_i3_801AD6C0(Actor*); -void func_i3_801AE168(Actor*); -void func_i3_801AE3D8(Actor*); -void func_i3_801AEB44(Actor*); -void func_i3_801AFA5C(Actor*); -void func_i3_801B099C(Actor*); -void func_i3_801B0B60(Actor*); -void func_i3_801B0EC0(Actor*); -void func_i3_801B504C(Actor*); -void func_i3_801B50E8(Actor*); -void func_i3_801B619C(Actor*); -void func_i3_801B638C(Actor*); -void func_i3_801B6FF8(Actor*); -void func_i3_801B7A24(Actor*); -void func_i3_801B7C78(Actor*); -void func_i3_801B90DC(Actor*); -void func_i3_801B91A4(Actor*); -void func_i3_801BA108(Actor*); -void func_i3_801BA26C(Actor*); -void func_i3_801BA4E4(Actor*); -void func_i3_801BA6A4(Actor*); -void func_i3_801BAD7C(Actor*); -void func_i3_801BADF8(Actor*); -void func_i3_801BB204(Actor*); -void func_i3_801BB79C(Actor*); -void func_i3_801BC930(Actor*); -void func_i3_801BC9A0(Actor*); -void func_i3_801BD264(Actor*); -void func_i3_801BD54C(Actor*); -void func_i3_801BDE6C(Actor*); -void func_i3_801BE1FC(Object_80*); -void func_i3_801BE3F8(Actor*); -void func_i3_801BEB1C(Actor*); -void func_i3_801BEC68(Actor*); -void func_i3_801BEC74(Actor*); - -typedef enum { - /* 0 */ AQ_SWK_0, - /* 1 */ AQ_SWK_1, - /* 2 */ AQ_SWK_2, - /* 3 */ AQ_SWK_3, - /* 4 */ AQ_SWK_4, - /* 5 */ AQ_SWK_5, - /* 6 */ AQ_SWK_6, - /* 7 */ AQ_SWK_7, - /* 8 */ AQ_SWK_8, - /* 9 */ AQ_SWK_9, - /* 10 */ AQ_SWK_10, - /* 11 */ AQ_SWK_11, - /* 12 */ AQ_SWK_12, - /* 13 */ AQ_SWK_13, - /* 14 */ AQ_SWK_14, - /* 15 */ AQ_SWK_15, - /* 16 */ AQ_SWK_16, - /* 17 */ AQ_SWK_17, - /* 18 */ AQ_SWK_18, - /* 19 */ AQ_SWK_19, - /* 20 */ AQ_SWK_20, - /* 21 */ AQ_SWK_21, - /* 22 */ AQ_SWK_22, - /* 23 */ AQ_SWK_23, - /* 24 */ AQ_SWK_24, - /* 25 */ AQ_SWK_25, - /* 26 */ AQ_SWK_26, - /* 27 */ AQ_SWK_27, - /* 28 */ AQ_SWK_28, - /* 29 */ AQ_SWK_29, - /* 30 */ AQ_SWK_30, - /* 31 */ AQ_SWK_31, - /* 32 */ AQ_SWK_32, - /* 33 */ AQ_SWK_33, - /* 34 */ AQ_SWK_34, - /* 35 */ AQ_SWK_35, - /* 36 */ AQ_SWK_36, - /* 37 */ AQ_SWK_37, - /* 38 */ AQ_SWK_38, - /* 39 */ AQ_SWK_39, - /* 40 */ AQ_SWK_MAX, -} BossAQswork; - -typedef enum { - /* 0 */ AQ_FWK_0, - /* 1 */ AQ_FWK_1, - /* 2 */ AQ_FWK_2, - /* 3 */ AQ_FWK_3, - /* 4 */ AQ_FWK_4, - /* 5 */ AQ_FWK_5, - /* 6 */ AQ_FWK_6, - /* 7 */ AQ_FWK_7, - /* 8 */ AQ_FWK_8, - /* 9 */ AQ_FWK_9, - /* 10 */ AQ_FWK_10, - /* 11 */ AQ_FWK_11, - /* 12 */ AQ_FWK_12, - /* 13 */ AQ_FWK_13, - /* 14 */ AQ_FWK_14, - /* 15 */ AQ_FWK_15, - /* 16 */ AQ_FWK_16, - /* 17 */ AQ_FWK_17, - /* 18 */ AQ_FWK_18, - /* 19 */ AQ_FWK_19, - /* 20 */ AQ_FWK_20, - /* 21 */ AQ_FWK_21, - /* 22 */ AQ_FWK_22, - /* 23 */ AQ_FWK_23, - /* 24 */ AQ_FWK_24, - /* 25 */ AQ_FWK_25, - /* 26 */ AQ_FWK_26, - /* 27 */ AQ_FWK_27, - /* 28 */ AQ_FWK_28, - /* 29 */ AQ_FWK_29, - /* 30 */ AQ_FWK_30, - /* 31 */ AQ_FWK_31, - /* 32 */ AQ_FWK_32, - /* 33 */ AQ_FWK_33, - /* 34 */ AQ_FWK_34, - /* 35 */ AQ_FWK_35, - /* 36 */ AQ_FWK_36, - /* 37 */ AQ_FWK_37, - /* 38 */ AQ_FWK_38, - /* 39 */ AQ_FWK_39, - /* 40 */ AQ_FWK_40, - /* 41 */ AQ_FWK_41, - /* 42 */ AQ_FWK_42, - /* 43 */ AQ_FWK_43, - /* 44 */ AQ_FWK_44, - /* 45 */ AQ_FWK_45, - /* 46 */ AQ_FWK_46, - /* 47 */ AQ_FWK_47, - /* 48 */ AQ_FWK_48, - /* 49 */ AQ_FWK_49, - /* 50 */ AQ_FWK_MAX, -} BossAQfwork; - -typedef enum { - /* 0 */ AQ_VWK_0, - /* 1 */ AQ_VWK_1, - /* 2 */ AQ_VWK_2, - /* 3 */ AQ_VWK_3, - /* 4 */ AQ_VWK_4, - /* 5 */ AQ_VWK_5, - /* 6 */ AQ_VWK_6, - /* 7 */ AQ_VWK_7, - /* 8 */ AQ_VWK_8, - /* 9 */ AQ_VWK_9, - /* 10 */ AQ_VWK_10, - /* 11 */ AQ_VWK_11, - /* 12 */ AQ_VWK_12, - /* 13 */ AQ_VWK_13, - /* 14 */ AQ_VWK_14, - /* 15 */ AQ_VWK_15, - /* 16 */ AQ_VWK_16, - /* 17 */ AQ_VWK_17, - /* 18 */ AQ_VWK_18, - /* 19 */ AQ_VWK_19, - /* 20 */ AQ_VWK_20, - /* 21 */ AQ_VWK_21, - /* 22 */ AQ_VWK_22, - /* 23 */ AQ_VWK_23, - /* 24 */ AQ_VWK_24, - /* 25 */ AQ_VWK_25, - /* 26 */ AQ_VWK_26, - /* 27 */ AQ_VWK_27, - /* 28 */ AQ_VWK_28, - /* 29 */ AQ_VWK_29, - /* 30 */ AQ_VWK_30, - /* 31 */ AQ_VWK_31, - /* 32 */ AQ_VWK_32, - /* 33 */ AQ_VWK_33, - /* 34 */ AQ_VWK_34, - /* 35 */ AQ_VWK_35, - /* 36 */ AQ_VWK_36, - /* 37 */ AQ_VWK_37, - /* 38 */ AQ_VWK_38, - /* 39 */ AQ_VWK_39, - /* 40 */ AQ_VWK_40, - /* 41 */ AQ_VWK_41, - /* 42 */ AQ_VWK_42, - /* 43 */ AQ_VWK_43, - /* 44 */ AQ_VWK_44, - /* 45 */ AQ_VWK_45, - /* 46 */ AQ_VWK_46, - /* 47 */ AQ_VWK_47, - /* 48 */ AQ_VWK_48, - /* 49 */ AQ_VWK_49, - /* 50 */ AQ_VWK_MAX, -} BossAQvwork; - -f32 D_i3_801BFB60 = 0.0f; -s32 D_i3_801BFB64[11] = { - 0, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, -}; -u8 D_i3_801BFB90[12] = { - 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, -}; -Gfx* D_i3_801BFB9C[3] = { D_6015FF0, D_6022110, D_6015DD0 }; -f32 D_i3_801BFBA8[2] = { 40.0f, -40.0f }; -f32 D_i3_801BFBB0[3] = { 20.0f, 10.0f, 15.0f }; -f32 D_i3_801BFBBC[3] = { 8.0f, 27.0f, 42.0f }; -f32 D_i3_801BFBC8[3] = { 15.0f, 6.0f, 7.0f }; -f32 D_i3_801BFBD4[3] = { 358.0f, 12.0f, 352.0f }; -f32 D_i3_801BFBE0[3][4] = { - { 1.3f, 0.1f, 1.0f, 777.0f }, - { 0.7f, 0.5f, 5.0f, 777.0f }, - { 1.0f, 0.2f, 2.0f, 777.0f }, -}; -f32 D_i3_801BFC10[3][4] = { - { 0.6f, 0.1f, 1.0f, 777.0f }, - { 1.5f, 0.5f, 5.0f, 777.0f }, - { 1.0f, 0.2f, 2.0f, 777.0f }, -}; -f32 D_i3_801BFC40[3][4] = { - { 1.3f, 0.1f, 1.0f, 777.0f }, - { 0.7f, 0.5f, 5.0f, 777.0f }, - { 1.0f, 0.2f, 2.0f, 777.0f }, -}; -s32 D_i3_801BFC70[3] = { 18, 22, 45 }; -f32 D_i3_801BFC7C[3] = { 20.0f, 10.0f, 0.0f }; -f32 D_i3_801BFC88[3] = { 10.0f, 320.0f, 30.0f }; -Vec3f D_i3_801BFC94[6][4] = { - { { 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 0.9f, 1.0f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 0.9f, 1.0f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.8f, 0.9f }, { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f } }, -}; -s32 D_i3_801BFDB4[6][4] = { - { 1, 5, 15, 100000 }, { 1, 5, 15, 100000 }, { 1, 5, 15, 100000 }, - { 1, 10, 20, 100000 }, { 1, 10, 20, 100000 }, { 1, 10, 20, 100000 }, -}; -s32 D_i3_801BFE14 = 0; -Vec3f D_i3_801BFE18[6][4] = { - { { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f } }, - { { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f } }, - { { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f }, { 0.4f, 0.4f, 0.4f } }, - { { 0.2f, 0.2f, 0.2f }, { 0.3f, 0.3f, 0.3f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f } }, - { { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f } }, - { { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f }, { 0.2f, 0.2f, 0.2f } }, -}; -Vec3f D_i3_801BFF38[6][4] = { - { { 1.0f, 1.0f, 1.0f }, { 5.0f, 5.0f, 5.0f }, { 10.0f, 10.0f, 10.0f }, { 5.0f, 5.0f, 5.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 5.0f, 5.0f, 5.0f }, { 10.0f, 10.0f, 10.0f }, { 5.0f, 5.0f, 5.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 3.0f, 3.0f, 3.0f }, { 2.0f, 2.0f, 2.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 3.0f, 1.0f, 3.0f }, { 2.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 3.0f, 1.0f, 3.0f }, { 2.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 1.0f } }, - { { 1.0f, 1.0f, 1.0f }, { 1.0f, 4.0f, 3.0f }, { 1.0f, 3.0f, 2.0f }, { 1.0f, 1.0f, 1.0f } }, -}; -f32 D_i3_801C0058 = 191.0f; -f32 D_i3_801C005C = 63.0f; -f32 D_i3_801C0060[14] = { - 50.0f, 8.0f, 50.0f, 8.0f, 10.0f, 1.0f, 20.0f, 2.0f, 20.0f, 2.0f, 20.0f, 2.0f, 50.0f, 2.0f, -}; -Vec3f D_i3_801C0098[2] = { - { 370.0f, -53.0f, 1085.0f }, - { -370.0f, -53.0f, 1085.0f }, -}; -f32 D_i3_801C00B0[3][4] = { - { 1.0f, 1.2f, 0.8f, 1.0f }, - { 1.0f, 1.2f, 0.9f, 1.0f }, - { 1.0f, 0.7f, 1.4f, 1.0f }, -}; -s32 D_i3_801C00E0[4] = { 1, 5, 8, 40 }; -f32 D_i3_801C00F0[3][4] = { - { 0.3f, 0.3f, 0.3f, 0.3f }, - { 0.3f, 0.3f, 0.3f, 0.3f }, - { 0.5f, 0.5f, 0.5f, 0.5f }, -}; -f32 D_i3_801C0120[3][4] = { - { 1.0f, 1.0f, 1.0f, 1.0f }, - { 1.0f, 1.0f, 1.0f, 1.0f }, - { 2.0f, 2.0f, 2.0f, 2.0f }, -}; -f32 D_i3_801C0150[4][4] = { - { 0.0f, 0.0f, 0.0f, 0.0f }, - { 0.0f, -25.5f, 0.0f, 0.0f }, - { -25.5f, 25.5f, -25.5f, 0.0f }, - { 25.5f, 0.0f, 25.5f, 0.0f }, -}; -f32 D_i3_801C0190[5] = { - 0.0f, -30.0f, 30.0f, -30.0f, 30.0f, -}; -Vec3f D_i3_801C01A4 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C01B0 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C01BC = { 340.0f, 600.0f, 1480.0f }; -Vec3f D_i3_801C01C8 = { -640.0f, 380.0f, 1520.0f }; -Vec3f D_i3_801C01D4 = { 760.0f, 340.0f, 1560.0f }; -Vec3f D_i3_801C01E0 = { 130.0f, 350.0f, 130.0f }; -Vec3f D_i3_801C01EC = { -130.0f, 350.0f, 130.0f }; -f32 D_i3_801C01F8[11] = { - 400.0f, 430.0f, 460.0f, 490.0f, 520.0f, 550.0f, 580.0f, 610.0f, 640.0f, 670.0f, 700.0f, -}; -f32 D_i3_801C0224[11] = { - 6.0f, 6.0f, 8.0f, 8.0f, 8.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, -}; -Vec3f D_i3_801C0250 = { 0.0f, 0.0f, 0.0f }; -f32 D_i3_801C025C[2] = { 120.0f, 0.0f }; -s32 D_i3_801C0264[19] = { - 0, 0, 3, 4, 0, 5, 6, 7, 1, 2, 0, 0, 0, 0, 0, 0, 8, 9, 0, -}; -Vec3f D_i3_801C02B0 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C02BC = { 0.0f, 0.0f, 0.0f }; -f32 D_i3_801C02C8[2] = { 255.0f, 68.0f }; -s32 D_i3_801C02D0[2] = { 70, 100 }; -Vec3f D_i3_801C02D8 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C02E4 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C02F0 = { 108.0f, 0.0f, 24.0f }; -Vec3f D_i3_801C02FC = { 102.0f, 14.0f, -21.0f }; -Vec3f D_i3_801C0308 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C0314 = { 0.0f, 0.0f, 50.0f }; -Vec3f D_i3_801C0320 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C032C = { -27.0f, 7.0f, 5.0f }; -Vec3f D_i3_801C0338 = { 0.0f, 0.0f, 0.0f }; -Vec3f D_i3_801C0344[4] = { - { -6.4f, -4.6f, -7.8f }, - { 6.4f, 4.6f, 7.8f }, - { -5.9f, -7.8f, -7.0f }, - { 5.9f, 7.8f, 7.0f }, -}; -Vec3f D_i3_801C0374[17] = { - { 1.0f, 1.0f, 1.0f }, { 1.3f, 0.8f, 1.3f }, { 1.0f, 1.2f, 1.0f }, { 1.3f, 0.8f, 1.3f }, - { 1.0f, 1.0f, 1.0f }, { 1.3f, 1.0f, 1.3f }, { 1.0f, 1.0f, 1.0f }, { 1.3f, 1.0f, 1.3f }, - { 1.0f, 1.0f, 1.0f }, { 0.85f, 0.95f, 0.85f }, { 0.85f, 0.95f, 0.85f }, { 0.85f, 0.95f, 0.85f }, - { 1.0f, 1.05f, 1.0f }, { 0.85f, 0.95f, 0.85f }, { 0.85f, 0.95f, 0.85f }, { 0.85f, 0.95f, 0.85f }, - { 0.85f, 0.95f, 0.85f }, -}; -s32 D_i3_801C0440[24] = { - 0, 30, 60, 90, 0, 0, 0, 0, 0, 15, 30, 45, 0, 0, 0, 0, 0, 15, 30, 45, 60, 75, 90, 105, -}; -s32 D_i3_801C04A0[6] = { - 15, -15, 10, -10, 7, -7, -}; -Vec3f D_i3_801C04B8 = { 0.0f, 0.0f, 0.0f }; -s32 D_i3_801C04C4[9] = { - 1, 5, 9, 14, 15, 16, 17, 0, 13, -}; -Vec3f D_i3_801C04E8 = { 0.0f, 0.0f, 0.0f }; -f32 D_i3_801C04F4[4] = { 700.0f, 300.0f, 600.0f, 400.0f }; -Vec3f D_i3_801C0504[50] = { - { 416.0f, 440.0f, -4182.0f }, { 437.0f, 440.0f, -4178.0f }, { 510.0f, 420.0f, -4156.0f }, - { 168.0f, 361.0f, -4168.0f }, { 434.0f, 440.0f, -4162.0f }, { 465.0f, 465.0f, -4146.0f }, - { 464.0f, 493.0f, -4124.0f }, { 426.0f, 395.0f, -4136.0f }, { 457.0f, 440.0f, -4112.0f }, - { 480.0f, 487.0f, -4110.0f }, { 454.0f, 440.0f, -4256.0f }, { 179.0f, 507.0f, -4272.0f }, - { 442.0f, 392.0f, -4242.0f }, { 450.0f, 481.0f, -4248.0f }, { 474.0f, 420.0f, -4232.0f }, - { 376.0f, 440.0f, -4196.0f }, { 463.0f, 507.0f, -4190.0f }, { 467.0f, 424.0f, -4208.0f }, - { 394.0f, 404.0f, -4186.0f }, { 256.0f, 440.0f, -3680.0f }, { 243.0f, 515.0f, -3648.0f }, - { 277.0f, 390.0f, -3662.0f }, { 234.0f, 457.0f, -3664.0f }, { 561.0f, 440.0f, -4332.0f }, - { 550.0f, 514.0f, -4346.0f }, { 568.0f, 404.0f, -4304.0f }, { 580.0f, 545.0f, -4350.0f }, - { 552.0f, 382.0f, -4292.0f }, { 528.0f, 462.0f, -4322.0f }, { 558.0f, 440.0f, -4294.0f }, - { 396.0f, 440.0f, -4284.0f }, { 391.0f, 363.0f, -4254.0f }, { 379.0f, 501.0f, -4254.0f }, - { 428.0f, 440.0f, -4246.0f }, { 374.0f, 440.0f, -4282.0f }, { 373.0f, 342.0f, -4290.0f }, - { 353.0f, 570.0f, -4266.0f }, { 359.0f, 440.0f, -4232.0f }, { 399.0f, 216.0f, -4246.0f }, - { 406.0f, 251.0f, -4222.0f }, { 380.0f, 189.0f, -4248.0f }, { 370.0f, 278.0f, -4214.0f }, - { 383.0f, 237.0f, -4266.0f }, { 360.0f, 299.0f, -4320.0f }, { 359.0f, 266.0f, -4280.0f }, - { 354.0f, 211.0f, -4256.0f }, { 391.0f, 238.0f, -4192.0f }, { 340.0f, 294.0f, -4216.0f }, - { 423.0f, 242.0f, -4200.0f }, { 429.0f, 311.0f, -4138.0f }, -}; -f32 D_i3_801C075C[51] = { - 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, - 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 320.0f, 320.0f, 320.0f, 320.0f, 40.0f, 40.0f, 40.0f, - 40.0f, 40.0f, 40.0f, 40.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, - 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 28.0f, 10.0f, 28.0f, 28.0f, -}; -f32 D_i3_801C0828[51] = { - 210.0f, 250.0f, 170.0f, 200.0f, 225.0f, 240.0f, 220.0f, 180.0f, 210.0f, 230.0f, 355.0f, 349.0f, 357.0f, - 12.0f, 357.0f, 65.0f, 256.0f, 250.0f, 88.0f, 0.0f, 0.0f, 0.0f, 9.0f, 14.0f, 35.0f, 40.0f, - 5.0f, 92.0f, 56.0f, 71.0f, 355.0f, 326.0f, 30.0f, 5.0f, 30.0f, 30.0f, 60.0f, 69.0f, 1.0f, - 346.0f, 30.0f, 97.0f, 30.0f, 30.0f, 30.0f, 30.0f, 162.0f, 98.0f, 10.0f, 213.0f, 30.0f, -}; -Vec3f D_i3_801C08F4 = { 0.0f, 0.0f, 0.0f }; - -PosRot* D_i3_801C27C0; -PosRot D_i3_801C27C8[4][50]; -Vtx D_i3_801C3A88[2][2][28]; -f32 D_i3_801C4188; -s32 D_i3_801C4190[10]; -f32 D_i3_801C41B8[30]; -s32 D_i3_801C4230[28]; -s32 D_i3_801C42A0[25]; -f32 D_i3_801C4308[82]; -s32 D_i3_801C4450; -s32 D_i3_801C4454; -f32 D_i3_801C4458; -f32 D_i3_801C445C; - -extern Gfx D_3000130[]; -extern Gfx D_3000470[]; -extern Gfx D_3000AF0[]; -extern Gfx D_3000C70[]; -extern Gfx D_3006AF0[]; -extern Gfx D_3006C70[]; -extern Gfx D_3006DE0[]; -extern AnimationHeader D_6000AE4; -extern Limb* D_6000DB0[]; -extern AnimationHeader D_6002628; -extern Limb* D_6002874[]; -extern Gfx D_6002C10[]; -extern AnimationHeader D_6005954; -extern Limb* D_6005A80[]; -extern u8 D_6008EC8[]; -extern u8 D_6008FC8[]; -extern Vtx D_6011A78[]; -extern AnimationHeader D_60135E0; -extern Limb* D_60136CC; -extern Limb* D_60137CC; -extern Gfx D_60137F0[]; -extern Gfx D_6014030[]; -extern AnimationHeader D_6014438; -extern Limb* D_6014504[]; -extern Gfx D_6014520[]; -extern Gfx D_6014FD0[]; -extern Vtx D_6018878[]; -extern Vtx D_6018C78[]; -extern Vtx D_6019078[]; -extern u8 D_6019238[]; -extern u8 D_6019338[]; -extern Gfx D_60194D0[]; -extern Gfx D_6019880[]; -extern Gfx D_6019E80[]; -extern AnimationHeader D_601DE50; -extern AnimationHeader D_601EC68; -extern Limb* D_601EDB4[]; -extern AnimationHeader D_6020A40; -extern Limb* D_6020C6C[]; -extern AnimationHeader D_6023780; -extern Limb* D_602390C[]; -extern Gfx D_6024A50[]; -extern AnimationHeader D_6024F80; -extern Limb* D_602512C; -extern AnimationHeader D_60260EC; -extern Limb* D_60263F8[]; -extern AnimationHeader D_602AC28; -extern Limb* D_602BD60[]; -extern f32 D_6030D3C[]; -extern f32 D_6030D58[]; -extern f32 D_60314AC[]; -extern f32 D_60314E4[]; -extern f32 D_603151C[]; -extern Vtx D_6031D90[]; - -void func_i3_801A8E30(void); -void func_i3_801A92EC(Actor* actor, f32 xUnk, f32 yUnk, f32 zUnk, s32 index, s32 mode); -void func_i3_801A9374(Actor* actor, Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, - s32 timerBC, s32 unk48); -void func_i3_801A9448(Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, s32 timerBC, - s32 unk48); -void func_i3_801A94EC(Vec3f* pos, ObjectId objId); -f32 func_i3_801A958C(s32 arg0, f32 arg1); -void func_i3_801A95C8(void); -void func_i3_801A96DC(Actor* actor); -void func_i3_801A9728(Actor* actor, f32 radius, f32 scale, s32 spread); -void func_i3_801A9824(void); -void func_i3_801A99D4(Player* player); -void func_i3_801A9C98(Player* player); -void func_i3_801A9DE4(Player* player); -void func_i3_801A9ED0(Player* player); -void func_i3_801AA20C(void); -void func_i3_801AA4BC(Player* player); -void func_i3_801AA8E8(Player* player); -void func_i3_801AACF8(Player* player); -void func_i3_801AB9B0(Player* player); -void func_i3_801ABA40(PlayerShot* shot); -void func_i3_801AC09C(Player* player); -void func_i3_801AC18C(Player* player); -void func_i3_801AC274(Player* player); -void func_i3_801AC7C8(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 unk4E); -void func_i3_801AC8A8(f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 unk4E); -void func_i3_801AC918(Effect* effect); -void func_i3_801ACBB4(Player* player); -void func_i3_801ACE50(Player* player); -void func_i3_801AD328(Player* player); -void func_i3_801AD598(Actor* actor); -void func_i3_801AD688(Actor* actor); -void func_i3_801AD6C0(Actor* actor); -void func_i3_801AE168(Actor* actor); -void func_i3_801AE3AC(Actor* actor); -void func_i3_801AE3D8(Actor* actor); -void func_i3_801AEB44(Actor* actor); -void func_i3_801AF9FC(Actor* actor); -void func_i3_801AFA5C(Actor* actor); -void func_i3_801B099C(Actor* actor); -void func_i3_801B0B60(Actor* actor); -void func_i3_801B0EC0(Actor* actor); -void func_i3_801B0F88(Boss* bossAQ); -void func_i3_801B0FCC(Boss* bossAQ); -void func_i3_801B1008(Boss* bossAQ, s16 timer); -void func_i3_801B10F8(Boss* bossAQ); -void func_i3_801B134C(Boss* bossAQ); -bool func_i3_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801B4D84(Boss* bossAQ); -bool func_i3_801B4DDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801B4E94(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801B504C(Actor* actor); -void func_i3_801B50E8(Actor* actor); -bool func_i3_801B5C18(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801B5F68(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801B619C(Actor* actor); -void func_i3_801B6344(Actor* actor); -void func_i3_801B638C(Actor* actor); -void func_i3_801B6E54(Actor* actor); -void func_i3_801B6FF8(Actor* actor); -bool func_i3_801B76EC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801B7754(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801B7A24(Actor* actor); -void func_i3_801B7AF0(Actor* actor); -void func_i3_801B7C78(Actor* actor); -bool func_i3_801B8C50(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801B8D7C(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801B90DC(Actor* actor); -void func_i3_801B91A4(Actor* actor); -void func_i3_801B9DB0(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801BA108(Actor* actor); -void func_i3_801BA26C(Actor* actor); -void func_i3_801BA4E4(Actor* actor); -void func_i3_801BA57C(Actor* actor); -void func_i3_801BA6A4(Actor* actor); -void func_i3_801BAD7C(Actor* actor); -void func_i3_801BADF8(Actor* actor); -void func_i3_801BB0C4(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801BB204(Actor* actor); -void func_i3_801BB26C(Actor* actor); -void func_i3_801BB79C(Actor* actor); -bool func_i3_801BC530(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801BC91C(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801BC930(Actor* actor); -void func_i3_801BC9A0(Actor* actor); -void func_i3_801BD17C(s32 limbIndex, Vec3f* rot, void* thisx); -void func_i3_801BD264(Actor* actor); -void func_i3_801BD3B0(Actor* actor, f32 x, f32 y, f32 z); -void func_i3_801BD54C(Actor* actor); -bool func_i3_801BDDFC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx); -void func_i3_801BDE6C(Actor* actor); -void func_i3_801BDF14(void); -void func_i3_801BE034(Actor* actor); -void func_i3_801BE0F0(Actor* actor); -void func_i3_801BE1FC(Object_80* obj80); -void func_i3_801BE274(Actor* actor, f32 yRot, f32 xRot); -void func_i3_801BE3F8(Actor* actor); -void func_i3_801BEB1C(Actor* actor); -void func_i3_801BEC68(Actor* actor); -void func_i3_801BEC74(Actor* actor); -void func_i3_801BEC80(Player* player); -void func_i3_801BEC8C(UNK_TYPE arg0); - -void func_i3_801A8E30(void) { - s32 i; - f32 spA8[17]; - f32 sp64[17]; - s32 j; - Vtx* sp5C = SEGMENTED_TO_VIRTUAL(D_6031D90); - Vtx* sp58 = SEGMENTED_TO_VIRTUAL(D_6011A78); - - for (i = 0; i < 17; i++) { - if ((i == 0) || (i == 16)) { - spA8[i] = 0.0f; - sp64[i] = 0.0f; - } else { - spA8[i] = RAND_FLOAT_CENTERED(70.0f); - sp64[i] = RAND_FLOAT_CENTERED(70.0f); - } - } - for (i = 0; i < 34; i++) { - j = (sp5C[i].v.ob[2] + 200) / 25; - sp58[i].v.ob[0] = sp5C[i].v.ob[0] + spA8[j]; - sp58[i].v.ob[1] = sp5C[i].v.ob[1] + sp64[j]; - } -} - -void func_i3_801A92EC(Actor* actor, f32 xUnk, f32 yUnk, f32 zUnk, s32 index, s32 mode) { - gUnkEntities30[index].mode = mode; - gUnkEntities30[index].unk_28 = 10.0f; - gUnkEntities30[index].unk_04.x = actor->obj.pos.x; - gUnkEntities30[index].unk_04.y = actor->obj.pos.y; - gUnkEntities30[index].unk_04.z = actor->obj.pos.z; - gUnkEntities30[index].unk_10.x = xUnk; - gUnkEntities30[index].unk_10.y = yUnk; - gUnkEntities30[index].unk_10.z = zUnk; - gUnkEntities30[index].unk_2C = gUnkEntities30[index].unk_2D = gUnkEntities30[index].unk_2E = - gUnkEntities30[index].unk_2F = 255; - gUnkEntities30[index].timer = 3; -} - -void func_i3_801A9374(Actor* actor, Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, - s32 timerBC, s32 unk48) { - Actor_Initialize(actor); - actor->obj.status = 2; - actor->obj.id = 189; - actor->state = unkB8; - actor->scale = scale; - actor->unk_048 = unk48; - actor->obj.pos = *pos; - actor->obj.rot = *rot; - actor->vel.x = xVel; - actor->vel.y = yVel; - actor->vel.z = zVel; - actor->timer_0BC = timerBC; - actor->gravity = 0.5f; - Object_SetInfo(&actor->info, actor->obj.id); -} - -void func_i3_801A9448(Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, s32 timerBC, - s32 unk48) { - s32 i; - - for (i = 59; i >= 0; i--) { - if (gActors[i].obj.status == 0) { - func_i3_801A9374(&gActors[i], pos, rot, xVel, yVel, zVel, unkB8, scale, timerBC, unk48); - break; - } - } -} - -void func_i3_801A94EC(Vec3f* pos, ObjectId objId) { - Item* sp18; - Item* item; - s32 i; - - for (i = 0, item = gItems; i < ARRAY_COUNT(gItems); i++, item++) { - if (item->obj.status == 0) { - Item_Initialize(item); - item->obj.status = 1; - item->obj.id = objId; - item->obj.pos.x = pos->x; - item->obj.pos.y = pos->y; - item->obj.pos.z = pos->z; - item->timer_4A = 2; - Object_SetInfo(&item->info, item->obj.id); - break; - } - } -} - -f32 func_i3_801A958C(s32 arg0, f32 arg1) { - f32 var_fv1 = arg0 / 2.0f; - - var_fv1 = MIN(arg1, var_fv1); - - return var_fv1; -} - -void func_i3_801A95C8(void) { - Math_SmoothStepToF(&gPlayer[0].camEye.x, D_80177978, 0.1f, 50.0f, 0.0001f); - Math_SmoothStepToF(&gPlayer[0].camEye.y, D_80177980, 0.1f, 50.0f, 0.0001f); - Math_SmoothStepToF(&gPlayer[0].camEye.z, D_80177988, 0.1f, 50.0f, 0.0001f); - Math_SmoothStepToF(&gPlayer[0].camAt.x, D_801779A0, 0.1f, 50.0f, 0.0001f); - Math_SmoothStepToF(&gPlayer[0].camAt.y, D_801779B8, 0.1f, 50.0f, 0.0001f); - Math_SmoothStepToF(&gPlayer[0].camAt.z, D_801779C0, 0.1f, 50.0f, 0.0001f); -} - -void func_i3_801A96DC(Actor* actor) { - actor->obj.rot.y = RAD_TO_DEG(-gPlayer->unk_058); - actor->obj.rot.x = RAD_TO_DEG(gPlayer->unk_05C); -} - -void func_i3_801A9728(Actor* actor, f32 radius, f32 scale, s32 spread) { - f32 temp_fs0; - f32 temp_fs1; - f32 temp; - s32 i; - - for (i = 0; i < 36; i += spread) { - temp_fs1 = SIN_DEG(i * 10.0f) * radius; - temp_fs0 = COS_DEG(i * 10.0f) * radius; - temp = gGroundLevel + 30.0f; - func_8007B8F8(actor->obj.pos.x + temp_fs1, temp, actor->obj.pos.z + temp_fs0, scale); - } -} - -void func_i3_801A9824(void) { - s32 i; - f32* var_v0; - f32* var_v0_4; - s32* var_a0; - s32* var_v0_2; - s32* var_v0_3; - - gTeamShields[1] = gTeamShields[2] = gTeamShields[3] = 0xFF; - for (i = 0; i < ARRAY_COUNT(D_i3_801C4190); i++) { - D_i3_801C4190[i] = 0; - } - for (i = 0; i < ARRAY_COUNT(D_i3_801C41B8); i++) { - D_i3_801C41B8[i] = 0.0f; - } - for (i = 0; i < ARRAY_COUNT(D_i3_801C4230); i++) { - D_i3_801C4230[i] = 0; - } - for (i = 0; i < ARRAY_COUNT(D_i3_801C42A0); i++) { - D_i3_801C42A0[i] = 0; - } - for (i = 0; i < ARRAY_COUNT(D_i3_801C4308); i++) { - D_i3_801C4308[i] = 0; - } - D_i3_801C4458 = D_i3_801C445C = 0.0f; - D_i3_801C4450 = D_i3_801C4454 = 0; - D_i3_801C41B8[12] = 40.0f; - D_i3_801C41B8[13] = 100.0f; - D_i3_801C41B8[14] = 120.0f; - D_i3_801C41B8[15] = 20.0f; - D_i3_801C41B8[16] = 30.0f; - D_i3_801C41B8[17] = 50.0f; - if (D_80177CA0 != 0) { - D_i3_801C41B8[12] = 0.0f; - D_i3_801C41B8[13] = 3.0f; - D_i3_801C41B8[14] = 5.0f; - D_i3_801C41B8[15] = 0.0f; - D_i3_801C41B8[16] = 0.0f; - D_i3_801C41B8[17] = 0.0f; - } - D_i3_801C4190[5] = 0; - D_i3_801C41B8[25] = D_8015F970; - D_i3_801C41B8[26] = 128.0f; -} - -void func_i3_801A99D4(Player* player) { - s32 sp24 = fabsf(player->unk_138 / 1000.0f); - - Math_SmoothStepToF(&D_8015F970, D_i3_801C41B8[25], 1.0f, 10.0f, 0.00001f); - Math_SmoothStepToF(&D_i3_801C4188, D_i3_801C41B8[26], 0.1f, 10.0f, 0.00001f); - if ((D_i3_801C4190[8] < sp24) && (D_i3_801C41B8[25] < 4600.0f)) { - D_i3_801C4190[8] = sp24; - D_i3_801C41B8[25] += 150.0f; - D_i3_801C41B8[26] = D_i3_801C4188 - 6.0f; - if (D_i3_801C41B8[26] < 0.0f) { - D_i3_801C41B8[26] = 0.0f; - } - if (D_i3_801C41B8[25] > 4600.0f) { - D_i3_801C41B8[25] = 4600.0f; - } - D_i3_801C41B8[12] -= 2.0f; - if (D_i3_801C41B8[12] < 0.0f) { - D_i3_801C41B8[12] = 0.0f; - } - D_i3_801C41B8[13] -= 6.0f; - if (D_i3_801C41B8[13] < 3.0f) { - D_i3_801C41B8[13] = 3.0f; - } - D_i3_801C41B8[14] -= 6.0f; - if (D_i3_801C41B8[14] < 5.0f) { - D_i3_801C41B8[14] = 5.0f; - } - D_i3_801C41B8[15] -= 1.0f; - if (D_i3_801C41B8[15] < 0.0f) { - D_i3_801C41B8[15] = 0.0f; - } - D_i3_801C41B8[16] -= 1.5f; - if (D_i3_801C41B8[16] < 0.0f) { - D_i3_801C41B8[16] = 0.0f; - } - D_i3_801C41B8[17] -= 2.5f; - if (D_i3_801C41B8[17] < 0.0f) { - D_i3_801C41B8[17] = 0.0f; - } - gLight1R = D_i3_801C41B8[12]; - gLight1G = D_i3_801C41B8[13]; - gLight1B = D_i3_801C41B8[14]; - gAmbientR = D_i3_801C41B8[15]; - gAmbientG = D_i3_801C41B8[16]; - gAmbientB = D_i3_801C41B8[17]; - } -} - -void func_i3_801A9C98(Player* player) { - Actor* actor; - s32 i; - s32 var_v0; - - if ((D_i3_801C4190[0] != 777) && (D_i3_801C4190[0] > 0)) { - i = D_i3_801C4190[0] - 1; - actor = &gActors[i]; - if ((actor->obj.status != 2) || ((player->unk_138 - 300.0f) <= actor->obj.pos.z) || - (actor->obj.pos.z <= (player->unk_138 - 7000.0f)) || (actor->obj.id != D_i3_801C4190[1]) || - (actor->health == 0)) { - D_i3_801C4190[1] = 0; - D_i3_801C4190[5] = 0; - D_i3_801C4190[3] = 0; - D_i3_801C4190[0] = 0; - } else { - var_v0 = 1; - if (actor->info.hitbox[1] == 200000.0f) { - var_v0 = 5; - } - D_i3_801C41B8[2] = actor->obj.pos.z + actor->info.hitbox[var_v0 + 0] + actor->info.hitbox[var_v0 + 1]; - D_i3_801C41B8[1] = actor->obj.pos.y + actor->info.hitbox[var_v0 + 2]; - D_i3_801C41B8[0] = actor->obj.pos.x + actor->info.hitbox[var_v0 + 4]; - } - } -} - -void func_i3_801A9DE4(Player* player) { - s32 i; - - if (D_i3_801C4190[0] == 777) { - if ((gBosses[0].obj.status != OBJ_ACTIVE) || (gBosses[0].health == 0) || (fabsf(D_i3_801C4308[10]) <= 6.0f) || - ((D_i3_801C4190[4] == 0x79) && (gBosses[0].swork[0xC] == 0))) { - D_i3_801C4190[1] = 0; - D_i3_801C4190[5] = 0; - D_i3_801C4190[3] = 0; - D_i3_801C4190[4] = 0; - D_i3_801C4190[0] = 0; - } else { - i = D_i3_801C4190[4] - 2; - - D_i3_801C41B8[2] = gBosses[0].obj.pos.z + gBosses[0].info.hitbox[i + 0] + gBosses[0].info.hitbox[i + 1]; - D_i3_801C41B8[1] = gBosses[0].obj.pos.y + gBosses[0].info.hitbox[i + 2]; - D_i3_801C41B8[0] = gBosses[0].obj.pos.x + gBosses[0].info.hitbox[i + 4]; - } - } -} - -// Loop looks really fake. optimized out index? -void func_i3_801A9ED0(Player* player) { - s32 j; - s32 i; - s32 sp8C; - f32 temp_fa0; - f32 temp_fa1; - f32 temp_fv0; - f32 temp_fv1; - Vec3f sp70; - Vec3f sp64; - f32* tempx; - f32* tempy; - f32* tempz; - - Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8) * M_DTOR, 0); - Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); - sp70.x = 0.0f; - sp70.y = 0.0f; - sp70.z = -1200.0f; - Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp70, &sp64); - if (D_i3_801C4190[3] == 0) { - sp8C = D_i3_801C4190[4]; - - if ((fabsf(D_i3_801C4308[10]) >= 6.0f) && (gBosses[0].state >= 10) && (gBosses[0].obj.status == 2) && - (gBosses[0].health != 0)) { - for (j = 119, i = 121; j < 199; j += 10, i += 10) { - if ((j == 119) || (j == 129) || (j == 139) || (j == 169)) { - tempy = &gBosses[0].info.hitbox[i]; - - temp_fv0 = gBosses[0].obj.pos.y + tempy[0] + tempy[1] + 200.0f; - temp_fa0 = gBosses[0].obj.pos.y + tempy[0] - tempy[1] - 200.0f; - temp_fv1 = gBosses[0].obj.pos.x + tempy[2] + tempy[3] + 200.0f; - temp_fa1 = gBosses[0].obj.pos.x + tempy[2] - tempy[3] - 200.0f; - if ((gBosses[0].state >= 10) && ((player->pos.y + sp64.y) <= temp_fv0) && - (temp_fa0 <= (player->pos.y + sp64.y)) && ((player->pos.x + sp64.x) <= temp_fv1) && - (temp_fa1 <= (player->pos.x + sp64.x))) { - if (D_i3_801C41B8[11] >= - fabsf(player->unk_138 - gBosses[0].obj.pos.z - gBosses[0].info.hitbox[j])) { - D_i3_801C41B8[11] = - fabsf(player->unk_138 - gBosses[0].obj.pos.z - gBosses[0].info.hitbox[j]); - D_i3_801C4190[0] = 777; - D_i3_801C4190[4] = i; - D_i3_801C4190[1] = 318; - } - if (((j == 129) && (gBosses[0].swork[8] == 0)) || ((j == 139) && (gBosses[0].swork[9] == 0)) || - ((j == 119) && (gBosses[0].swork[0xC] == 0))) { - D_i3_801C4190[1] = 0; - D_i3_801C4190[5] = 0; - D_i3_801C4190[3] = 0; - D_i3_801C4190[4] = 0; - D_i3_801C4190[0] = 0; - } - } - } - } - if ((sp8C != D_i3_801C4190[4]) && (D_i3_801C41B8[5] == 3.0f)) { - Audio_PlaySfx(0x4900001B, D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); - D_i3_801C41B8[5] = 20.0f; - } - } - } - func_i3_801A9DE4(player); -} - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AA20C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AA4BC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AA8E8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AACF8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AB9B0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801ABA40.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC09C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC18C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC274.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC7C8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC8A8.s") - -// OBJ_EFFECT_366 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AC918.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801ACBB4.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801ACE50.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AD328.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AD598.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AD688.s") - -// OBJ_ACTOR_255 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AD6C0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801ADF7C.s") - -// OBJ_ACTOR_255 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AE168.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AE3AC.s") - -// OBJ_ACTOR_256 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AE3D8.s") - -// OBJ_ACTOR_256 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AEB44.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AF9FC.s") - -// OBJ_ACTOR_257 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801AFA5C.s") - -// OBJ_ACTOR_257 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B099C.s") - -// OBJ_ACTOR_258 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B0B60.s") - -// OBJ_ACTOR_258 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B0EC0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B0F88.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B0FCC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B1008.s") - -// OBJ_BOSS_AQ init -void func_i3_801B10F8(Boss* bossAQ); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B10F8.s") - -// OBJ_BOSS_AQ action -void func_i3_801B134C(Boss* bossAQ); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B134C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B42AC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B49DC.s") - -// OBJ_BOSS_AQ draw -void func_i3_801B4D84(Boss* bossAQ); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B4D84.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B4DDC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B4E94.s") - -// OBJ_ACTOR_261 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B504C.s") - -// OBJ_ACTOR_261 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B50E8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B5C18.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B5F68.s") - -// OBJ_ACTOR_259 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B619C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B6344.s") - -// OBJ_ACTOR_259 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B638C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B6E54.s") - -// OBJ_ACTOR_262 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B6FF8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B76EC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B7754.s") - -// OBJ_ACTOR_262 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B7A24.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B7AF0.s") - -// OBJ_ACTOR_260 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B7C78.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B8C50.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B8D7C.s") - -// OBJ_ACTOR_260 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B90DC.s") - -// OBJ_ACTOR_263 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B91A4.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801B9DB0.s") - -// OBJ_ACTOR_263 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BA108.s") - -// OBJ_ACTOR_264 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BA26C.s") - -// OBJ_ACTOR_264 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BA4E4.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BA57C.s") - -// OBJ_ACTOR_265 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BA6A4.s") - -// OBJ_ACTOR_265 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BAD7C.s") - -// OBJ_ACTOR_266 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BADF8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BB0C4.s") - -// OBJ_ACTOR_266 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BB204.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BB26C.s") - -// OBJ_ACTOR_267 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BB79C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BC530.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BC91C.s") - -// OBJ_ACTOR_267 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BC930.s") - -// OBJ_ACTOR_269 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BC9A0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BD17C.s") - -// OBJ_ACTOR_269 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BD264.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BD3B0.s") - -// OBJ_ACTOR_268 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BD54C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BDDFC.s") - -// OBJ_ACTOR_268 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BDE6C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BDF14.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BE034.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BE0F0.s") - -// OBJ_80_126 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BE1FC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BE274.s") - -// OBJ_ACTOR_270 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BE3F8.s") - -// OBJ_ACTOR_270 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BEB1C.s") - -// OBJ_BOSS_301 action -void func_i3_801BEC50(Boss* boss301) { -} - -// OBJ_BOSS_301 draw -void func_i3_801BEC5C(Boss* boss301) { -} - -// OBJ_ACTOR_188 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BEC68.s") - -// OBJ_ACTOR_188 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BEC74.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BEC80.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801BEC8C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/D_i3_801C1A30.s") diff --git a/src/overlays/ovl_i4/fox_fo.c b/src/overlays/ovl_i4/fox_fo.c index 5e390e7f..67692299 100644 --- a/src/overlays/ovl_i4/fox_fo.c +++ b/src/overlays/ovl_i4/fox_fo.c @@ -1,7 +1,7 @@ #include "global.h" -extern AnimationHeader D_6007854; -extern Limb* D_6007980; +extern Animation D_6007854; +extern Limb* D_6007980[]; extern u8 D_600FF64[]; s32 func_80090200(Boss* boss); @@ -576,7 +576,7 @@ void func_i4_80188FE4(Actor* actor) { Vec3f vec[20]; Animation_GetFrameData(&D_6007854, 0, vec); - Animation_DrawSkeleton(3, &D_6007980, vec, func_i4_80188F08, func_i4_80188DA0, actor, gCalcMatrix); + Animation_DrawSkeleton(3, D_6007980, vec, func_i4_80188F08, func_i4_80188DA0, actor, gCalcMatrix); if (actor->state == 1) { actor->state = 2; diff --git a/src/overlays/ovl_i5/fox_ma.c b/src/overlays/ovl_i5/fox_ma.c index 9b1252a0..99b5e8a1 100644 --- a/src/overlays/ovl_i5/fox_ma.c +++ b/src/overlays/ovl_i5/fox_ma.c @@ -14,32 +14,32 @@ extern f32 D_603605C[]; extern Gfx D_6010470[]; extern Gfx D_6003370[]; extern Gfx D_6004440[]; -extern AnimationHeader D_600FEC4; -extern AnimationHeader D_6010144; -extern AnimationHeader D_6010220; +extern Animation D_600FEC4; +extern Animation D_6010144; +extern Animation D_6010220; extern Limb* D_601042C[]; extern Gfx D_6017720[]; extern Gfx D_601BE90[]; -extern AnimationHeader D_601EAB0; +extern Animation D_601EAB0; extern Limb* D_601EBBC; extern Gfx D_6022200[]; extern Gfx D_60227F0[]; extern Gfx D_60239D0[]; extern Gfx D_6024670[]; extern Gfx D_60269E0[]; -extern AnimationHeader D_6027A04; +extern Animation D_6027A04; extern Limb* D_6027AF0[]; extern Gfx D_6027BF0[]; extern Gfx D_6027D40[]; extern Gfx D_6027EB0[]; extern Gfx D_60288A0[]; -extern AnimationHeader D_602EA0C; +extern Animation D_602EA0C; extern Limb* D_602EBB8[]; extern Gfx D_6001180[]; extern Gfx D_60014A0[]; extern Gfx D_601C170[]; extern Gfx D_6022610[]; -extern AnimationHeader D_6025CA0; +extern Animation D_6025CA0; extern Limb* D_6025DAC[]; extern Gfx D_6026860[]; extern Gfx D_602D380[]; @@ -62,18 +62,18 @@ extern Gfx D_600A4D0[]; extern Gfx D_600A7D0[]; extern Gfx D_600AA70[]; extern Gfx D_600AD50[]; -extern AnimationHeader D_600C4D0; +extern Animation D_600C4D0; extern Limb* D_600C65C[]; extern f32 D_603648C[]; extern Gfx D_602F380[]; -extern AnimationHeader D_602FEB4; +extern Animation D_602FEB4; extern Limb* D_602FFA0[]; extern Gfx D_602FFC0[]; extern Gfx D_601A2B0[]; extern f32 D_6036520[]; -extern AnimationHeader D_602F098; +extern Animation D_602F098; extern Limb* D_602F264[]; -extern AnimationHeader D_602F2E0; +extern Animation D_602F2E0; extern Limb* D_602F36C[]; extern Gfx D_601A840[]; extern Gfx D_6012A60[]; @@ -82,16 +82,16 @@ extern Gfx D_6025850[]; extern Gfx D_60257B0[]; extern Gfx D_601F270[]; extern u16 D_6012C98[]; -extern AnimationHeader D_600CD18; -extern AnimationHeader D_6015C24; -extern AnimationHeader D_6016040; -extern AnimationHeader D_60163F0; -extern AnimationHeader D_6016B2C; -extern AnimationHeader D_6017714; -extern AnimationHeader D_601D188; +extern Animation D_600CD18; +extern Animation D_6015C24; +extern Animation D_6016040; +extern Animation D_60163F0; +extern Animation D_6016B2C; +extern Animation D_6017714; +extern Animation D_601D188; extern f32 D_6036818[]; extern Limb* D_600D1E4[]; -extern AnimationHeader D_601EA28; +extern Animation D_601EA28; extern f32 D_6035A94[]; extern ObjectInit D_6035678[]; extern ObjectInit D_60357CC[]; @@ -340,7 +340,7 @@ void func_i5_80199920(void) { D_i5_801BE250[6] = 0.0f; D_i5_801BE250[16] = 0.0f; D_i5_801BE250[20] = 0.0f; - D_i5_801BA1E8 = 0x62; + D_i5_801BA1E8 = 98; D_i5_801BA1E0 = 1e7f; D_i5_801BE310 = 999; D_i5_801BE312 = 0; @@ -515,7 +515,7 @@ void func_i5_80199F8C(Actor* actor) { void func_i5_8019A128(void) { func_i5_80199C20(D_6023228, 16, 16, 0, 8); - func_i5_80199A40(D_6023388, D_Unk_800DB4B8, (f32) gGameFrameCount * -20.0f); + func_i5_80199A40(D_6023388, D_Unk_800DB4B8, gGameFrameCount * -20.0f); } void func_i5_8019A198(Actor* actor) { @@ -531,7 +531,7 @@ void func_i5_8019A198(Actor* actor) { func_8001CFA8(actor->vel.z); } func_8001D10C(actor->sfxPos, 0x31078085); - D_i5_801BE310 = (s16) actor->iwork[5]; + D_i5_801BE310 = actor->iwork[5]; } D_i5_801BA1E0 = actor->obj.pos.z; if (D_i5_801BE313 != 0) { @@ -2046,14 +2046,15 @@ void func_i5_801A0BD8(Object_80* obj80) { break; } if (obj80->timer_4C != 0) { - obj80->vel.z = Rand_ZeroOne() + 2.0f; + obj80->vel.z = 2.0f + RAND_FLOAT(1.0f); } else { - obj80->vel.z = Rand_ZeroOne() + 1.0f; + obj80->vel.z = 1.0f + RAND_FLOAT(1.0f); } } bool func_i5_801A0DD8(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* data) { Object_80* obj80 = (Object_80*) data; + if (limbIndex == 5) { rot->y += obj80->vel.y; } @@ -2973,7 +2974,7 @@ void func_i5_801A46A0(Actor* actor) { } actor->fwork[0] /= 1.2f + Rand_ZeroOne() / 2; - actor->unk_046 -= 1; + actor->unk_046--; actor->vel.z /= 1.5f; if (actor->unk_046 == 0) { actor->timer_0BE = RAND_INT(30.0f); @@ -3503,7 +3504,7 @@ void func_i5_801A68F8(Actor* actor, s16 arg1, f32 arg2, f32 arg3, f32 arg4, f32 gUnkEntities30[arg1].unk_04.y = arg3; gUnkEntities30[arg1].unk_28 = 5.0f; gUnkEntities30[arg1].unk_2C = gUnkEntities30[arg1].unk_2D = gUnkEntities30[arg1].unk_2E = - gUnkEntities30[arg1].unk_2F = 0xFF; + gUnkEntities30[arg1].unk_2F = 255; gUnkEntities30[arg1].timer = 3; gUnkEntities30[arg1].unk_04.z = arg4; gUnkEntities30[arg1].unk_10.x = arg5; @@ -3512,23 +3513,22 @@ void func_i5_801A68F8(Actor* actor, s16 arg1, f32 arg2, f32 arg3, f32 arg4, f32 } void func_i5_801A6984(Actor* actor) { + s16 var_s3; f32 temp_fa0; - f32 temp_fa1; f32 temp_fs0; - f32 temp_fs1; - f32 temp_fs2_2; + f32 temp_fa1; f32 temp_fs3; + s32 var_s4; + f32 temp_fs2_2; f32 temp_fs3_2; f32 temp_fs4; - f32 var_fs5; f32 spA8; - f32 temp; + f32 var_fs5; f32 spA0; f32 sp9C; - f32 sp78; - s16 temp_a1; - s16 var_s3; - s32 var_s4; + f32 temp; + s32 pad1; + s32 pad2; s32 i; f32 sp88; f32 sp84; @@ -3546,14 +3546,11 @@ void func_i5_801A6984(Actor* actor) { if (var_s4 == 0) { var_s4 = 1; } - - sp78 = (f32) var_s4; spA8 = (180.0f / var_s4) + 1.0f; var_fs5 = actor->obj.pos.x; - spA0 = actor->obj.pos.y; - sp9C = actor->obj.pos.z; + sp88 = (D_i5_801BE368[4] - actor->obj.pos.x) / var_s4; sp84 = (D_i5_801BE368[5] - actor->obj.pos.y) / var_s4; sp80 = (D_i5_801BE368[6] - actor->obj.pos.z) / var_s4; @@ -3563,13 +3560,11 @@ void func_i5_801A6984(Actor* actor) { } else { Math_SmoothStepToF(&D_i5_801BE368[7], 100.0f, 0.01f, 0.01f, 0.01f); } - - temp = SIN_DEG(i * spA8) * (-(D_i5_801BE368[7] * 3.0f) * (1.0f - (i / sp78))); - temp_a1 = var_s3++; + temp = SIN_DEG(i * spA8) * (-(D_i5_801BE368[7] * 3.0f) * (1.0f - ((f32) i / var_s4))); temp_fs2_2 = actor->obj.pos.x + (sp88 * i); temp_fs3_2 = actor->obj.pos.y + (sp84 * i) + temp; temp_fs4 = actor->obj.pos.z + (sp80 * i); - func_i5_801A68F8(actor, temp_a1, var_fs5, spA0, sp9C, temp_fs2_2, temp_fs3_2, temp_fs4); + func_i5_801A68F8(actor, var_s3++, var_fs5, spA0, sp9C, temp_fs2_2, temp_fs3_2, temp_fs4); var_fs5 = temp_fs2_2; spA0 = temp_fs3_2; sp9C = temp_fs4; @@ -4360,12 +4355,12 @@ void func_i5_801A7E7C(Actor* actor) { spC6 = RAND_INT(5.0f); for (i = 0; i < 10; i++) { func_i5_801AE610(actor->vwork[0].x, actor->vwork[0].y + 100.0f, actor->vwork[0].z, - RAND_FLOAT_CENTERED(35.0f), RAND_FLOAT(80.0f) + 90.0f, - (Rand_ZeroOne() - 0.9f) * 80.0f, spC6); + RAND_FLOAT_CENTERED(35.0f), RAND_FLOAT(80) + 90.0f, RAND_RANGE(-72.0f, 8.0f), + spC6); } for (i = 0; i < 20; i++) { - func_i5_801AD624(actor->vwork[0].x, (actor->vwork[0].y + 50.0f) + RAND_FLOAT(50.0f), + func_i5_801AD624(actor->vwork[0].x, actor->vwork[0].y + 50.0f + RAND_FLOAT(50.0f), actor->vwork[0].z, RAND_FLOAT_CENTERED(10.0f), RAND_FLOAT(5.0f), actor->vel.z + 2.0f, RAND_FLOAT(360.0f), RAND_FLOAT(360.0f), RAND_FLOAT(360.0f), RAND_FLOAT_CENTERED(30.0f), RAND_FLOAT_CENTERED(30.0f), RAND_FLOAT_CENTERED(30.0f), @@ -4419,7 +4414,7 @@ void func_i5_801A7E7C(Actor* actor) { sp360.z = RAND_FLOAT(200.0f) + 100.0f; Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp360, &sp354); D_i5_801BE368[23] = 1.0f; - func_i5_801AE800((actor->vwork[2].x + sp354.x) - 50.0f, actor->vwork[2].y + sp354.y + 100.0f, + func_i5_801AE800(actor->vwork[2].x + sp354.x - 50.0f, actor->vwork[2].y + sp354.y + 100.0f, actor->vwork[2].z + sp354.z, actor->vwork[2].x, actor->vwork[2].y, actor->vwork[2].z); D_i5_801BE368[23] = 2.0f; func_i5_801AE800(actor->vwork[4].x + sp354.x + 50.0f, actor->vwork[4].y + sp354.y + 100.0f, @@ -4453,7 +4448,7 @@ void func_i5_801A7E7C(Actor* actor) { Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138 - 250.0f, 0.1f, 15.0f, 0.01f); Math_SmoothStepToF(&actor->obj.pos.y, 250.0f, 0.1f, 10.0f, 0.01f); if (D_i5_801BE320[3] < (Animation_GetFrameCount(&D_6015C24) - 1)) { - D_i5_801BE320[3] = (s16) (D_i5_801BE320[3] + 1); + D_i5_801BE320[3]++; } func_i5_8019A198(actor); func_i5_801A6984(actor); @@ -4476,14 +4471,14 @@ void func_i5_801A7E7C(Actor* actor) { actor->vwork[6].z += actor->vel.z; actor->vwork[7].z += actor->vel.z; sp348.x = actor->vwork[6].x - actor->vwork[2].x; - sp348.y = (actor->vwork[6].y - actor->vwork[2].y) + 25.0f; + sp348.y = actor->vwork[6].y - actor->vwork[2].y + 25.0f; sp348.z = actor->vwork[6].z - actor->vwork[2].z; Matrix_RotateZ(gCalcMatrix, -actor->vwork[3].z * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, -actor->vwork[3].x * M_DTOR, 1); Matrix_RotateY(gCalcMatrix, -actor->vwork[3].y * M_DTOR, 1); Matrix_MultVec3f(gCalcMatrix, &sp348, &sp354); D_i5_801BE368[14] = Math_RadToDeg(Math_Atan2F(sp354.x, sp354.z)); - temp = sqrtf((sp354.x * sp354.x) + (sp354.z * sp354.z)); + temp = sqrtf(SQ(sp354.x) + SQ(sp354.z)); D_i5_801BE368[13] = Math_RadToDeg(-Math_Atan2F(sp354.y, temp)); Matrix_RotateY(gCalcMatrix, actor->vwork[3].y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, actor->vwork[3].x * M_DTOR, 1); @@ -4500,7 +4495,7 @@ void func_i5_801A7E7C(Actor* actor) { sp330.z = actor->vwork[3].z; func_8007EE68(OBJ_EFFECT_380, &sp348, &sp33C, &sp330, &D_i5_801BA750, 5.0f); sp348.x = actor->vwork[7].x - actor->vwork[4].x; - sp348.y = (actor->vwork[7].y - actor->vwork[4].y) + 25.0f; + sp348.y = actor->vwork[7].y - actor->vwork[4].y + 25.0f; sp348.z = actor->vwork[7].z - actor->vwork[4].z; Matrix_RotateZ(gCalcMatrix, -actor->vwork[5].z * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, -actor->vwork[5].x * M_DTOR, 1); @@ -4543,7 +4538,7 @@ void func_i5_801A7E7C(Actor* actor) { func_i5_801A0308(actor, actor->obj.pos.z, actor->obj.rot.y, 0); Math_SmoothStepToF(&actor->obj.pos.x, gPlayer[0].pos.x, 0.1f, 10.0f, 0.01f); Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138 - 1200.0f, 0.1f, 35.0f, 0.01f); - Math_SmoothStepToF(&actor->obj.pos.y, (actor->fwork[5] + 600.0f) + D_i5_801BE368[3], 0.1f, 20.0f, 10.0f); + Math_SmoothStepToF(&actor->obj.pos.y, actor->fwork[5] + 600.0f + D_i5_801BE368[3], 0.1f, 20.0f, 10.0f); if (D_i5_801BE368[3] < ((gPlayer[0].unk_138 - actor->obj.pos.z) / 5.0f)) { Math_SmoothStepToF(&D_i5_801BE368[2], 15.0f, 0.2f, 2.0f, 0.01f); D_i5_801BE368[3] += D_i5_801BE368[2]; @@ -4617,7 +4612,7 @@ void func_i5_801A7E7C(Actor* actor) { Audio_PlaySfx(0x2903300E, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); actor->iwork[7] = 15; D_i5_801BE320[9] -= actor->damage; - func_i5_801AD624(actor->obj.pos.x, actor->obj.pos.y + 80.0f, actor->obj.pos.z + 50.0f, + func_i5_801AD624(actor->obj.pos.x, actor->obj.pos.y + 80, actor->obj.pos.z + 50.0f, RAND_FLOAT_CENTERED(10.0f), RAND_FLOAT(5.0f), RAND_FLOAT_CENTERED(3.0f), RAND_FLOAT(360.0f), RAND_FLOAT(360.0f), RAND_FLOAT(360.0f), RAND_FLOAT_CENTERED(30.0f), RAND_FLOAT_CENTERED(30.0f), RAND_FLOAT_CENTERED(30.0f), (s32) (RAND_FLOAT(50.0f) + 70.0f), @@ -4687,9 +4682,9 @@ void func_i5_801A7E7C(Actor* actor) { Radio_PlayMessage(gMsg_ID_2225, RCID_SLIPPY); } else if (gBossFrameCount > 155) { gShowBossHealth = 1; - gBossHealthBar = (s32) (((f32) D_i5_801BE320[29] / 250) * 85.0f); - gBossHealthBar += (s32) (((f32) D_i5_801BE320[9] / 200) * 85.0f); - gBossHealthBar += (s32) (((f32) D_i5_801BE320[10] / 250) * 85.0f); + gBossHealthBar = (s32) ((D_i5_801BE320[29] / 250.f) * 85.0f); + gBossHealthBar += (s32) ((D_i5_801BE320[9] / 200.f) * 85.0f); + gBossHealthBar += (s32) ((D_i5_801BE320[10] / 250.f) * 85.0f); } gBossFrameCount++; } diff --git a/src/overlays/ovl_i6/fox_andross.c b/src/overlays/ovl_i6/fox_andross.c index 413939ec..9632b7e8 100644 --- a/src/overlays/ovl_i6/fox_andross.c +++ b/src/overlays/ovl_i6/fox_andross.c @@ -344,7 +344,7 @@ void func_i6_80188528(Actor* actor) { actor->unk_0F4.z += actor->fwork[0]; } -extern Gfx* D_6009300; +extern Gfx D_6009300[]; void func_i6_80188660(Actor* actor) { RCP_SetupDL(&gMasterDisp, 0x3D); @@ -355,7 +355,7 @@ void func_i6_80188660(Actor* actor) { Matrix_Scale(gGfxMatrix, 1.1f, 0.9f, 1.0f, 1); Matrix_Scale(gGfxMatrix, 3.0f, 3.0f, 1.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - gSPDisplayList(gMasterDisp++, &D_6009300); + gSPDisplayList(gMasterDisp++, D_6009300); } void func_i6_801887B0(Actor* actor, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { @@ -469,7 +469,7 @@ void func_i6_80188A4C(Boss* boss) { } } -extern AnimationHeader D_600C038; +extern Animation D_600C038; void func_i6_80188CB8(Boss* boss) { s32 i; @@ -1214,8 +1214,8 @@ s32 func_i6_8018B47C(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d } extern Limb* D_600C0A4[]; -extern Gfx* D_600C2D0; -extern Gfx* D_600C560; +extern Gfx D_600C2D0[]; +extern Gfx D_600C560[]; void func_i6_8018B8C0(Boss* boss) { s32 j; @@ -1262,9 +1262,9 @@ void func_i6_8018B8C0(Boss* boss) { Matrix_Translate(gGfxMatrix, 0.0f, -5.0f, 0.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); if (j == 9) { - gSPDisplayList(gMasterDisp++, &D_600C2D0); + gSPDisplayList(gMasterDisp++, D_600C2D0); } else { - gSPDisplayList(gMasterDisp++, &D_600C560); + gSPDisplayList(gMasterDisp++, D_600C560); } Matrix_Pop(&gGfxMatrix); } @@ -1554,7 +1554,7 @@ void func_i6_8018CAD4(Effect* effect) { } } -extern Gfx* D_2010A30; +extern Gfx D_2010A30[]; static Gfx* D_i6_801A6790[10] = { D_C001880, D_C001880, D_C001880, D_C001880, D_C001880, D_C001880, D_C001880, D_C001880, D_3016660, D_3015D80, }; @@ -1565,7 +1565,7 @@ void func_i6_8018CF98(Effect* effect) { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, effect->unk_44); Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2, 1); Matrix_SetGfxMtx(&gMasterDisp); - gSPDisplayList(gMasterDisp++, &D_2010A30); + gSPDisplayList(gMasterDisp++, D_2010A30); } else { RCP_SetupDL(&gMasterDisp, 0x1D); if (effect->unk_4C < 8) { @@ -1789,24 +1789,24 @@ void func_i6_8018DA94(Boss* boss, Vec3f* arg1) { Audio_PlaySfx(0x2903B009, boss->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); } -extern AnimationHeader D_C00208C; -extern AnimationHeader D_C002654; -extern AnimationHeader D_C002B08; -extern AnimationHeader D_C006F08; -extern AnimationHeader D_C00DE48; -extern AnimationHeader D_C00E598; -extern AnimationHeader D_C017050; -extern AnimationHeader D_C017430; -extern AnimationHeader D_C018BC4; -extern AnimationHeader D_C023B54; -extern AnimationHeader D_C0240D0; -extern AnimationHeader D_C025C00; -extern AnimationHeader D_C029F74; -extern AnimationHeader D_C02E494; -extern AnimationHeader D_C02EDA0; -extern AnimationHeader D_C030244; -extern AnimationHeader D_C033780; -extern AnimationHeader D_C033D98; +extern Animation D_C00208C; +extern Animation D_C002654; +extern Animation D_C002B08; +extern Animation D_C006F08; +extern Animation D_C00DE48; +extern Animation D_C00E598; +extern Animation D_C017050; +extern Animation D_C017430; +extern Animation D_C018BC4; +extern Animation D_C023B54; +extern Animation D_C0240D0; +extern Animation D_C025C00; +extern Animation D_C029F74; +extern Animation D_C02E494; +extern Animation D_C02EDA0; +extern Animation D_C030244; +extern Animation D_C033780; +extern Animation D_C033D98; static f32 D_i6_801A67B8[] = { 0.0f, 0.0f, 0.0f }; @@ -3172,7 +3172,7 @@ void func_i6_801924B4(s32 limbIndex, Vec3f* rot, void* data) { } } -extern Limb* D_C01CC3C; +extern Limb* D_C01CC3C[]; void func_i6_801928C8(Boss* boss) { @@ -3185,7 +3185,7 @@ void func_i6_801928C8(Boss* boss) { D_i6_801A7F74, D_i6_801A7F7C, D_i6_801A8430); } Matrix_Scale(gCalcMatrix, 10.0f, 10.0f, 10.0f, 1); - Animation_DrawSkeleton(2, &D_C01CC3C, D_i6_801A7F80, func_i6_801917F0, func_i6_801924B4, boss, gCalcMatrix); + Animation_DrawSkeleton(2, D_C01CC3C, D_i6_801A7F80, func_i6_801917F0, func_i6_801924B4, boss, gCalcMatrix); Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); if (boss->fwork[20] > 0.05f) { @@ -3303,11 +3303,11 @@ void func_i6_80192E94(Actor* actor) { } } -extern Gfx* D_6007E20; +extern Gfx D_6007E20[]; void func_i6_80193244(Actor* actor) { - gSPDisplayList(gMasterDisp++, &D_6007E20); + gSPDisplayList(gMasterDisp++, D_6007E20); if (actor->timer_0BC != 0) { f32 scale; u8 alpha; @@ -3328,7 +3328,7 @@ void func_i6_80193244(Actor* actor) { } } -extern Gfx* D_C038AC4; +extern Gfx D_C038AC4[]; void func_i6_80193380(Object_80* obj80) { diff --git a/src/overlays/ovl_i6/fox_sy.c b/src/overlays/ovl_i6/fox_sy.c index 19d4f52f..b0991aa5 100644 --- a/src/overlays/ovl_i6/fox_sy.c +++ b/src/overlays/ovl_i6/fox_sy.c @@ -1,20 +1,20 @@ #include "global.h" -extern AnimationHeader D_6003348; -extern AnimationHeader D_60034C4; +extern Animation D_6003348; +extern Animation D_60034C4; extern Gfx D_6013600[]; extern Gfx D_6014A40[]; extern Gfx D_6014BD0[]; extern Gfx D_601F3D0[]; -extern AnimationHeader D_60258A0; -extern AnimationHeader D_602645C; -extern AnimationHeader D_60265B4; -extern AnimationHeader D_602738C; -extern AnimationHeader D_6029B48; -extern AnimationHeader D_602A2CC; -extern AnimationHeader D_602B778; -extern AnimationHeader D_602B8DC; -extern AnimationHeader D_602CEB4; +extern Animation D_60258A0; +extern Animation D_602645C; +extern Animation D_60265B4; +extern Animation D_602738C; +extern Animation D_6029B48; +extern Animation D_602A2CC; +extern Animation D_602B778; +extern Animation D_602B8DC; +extern Animation D_602CEB4; extern Limb* D_602D140[]; extern f32 D_60340C0[]; extern f32 D_6034124[]; diff --git a/src/overlays/ovl_i6/fox_ve2.c b/src/overlays/ovl_i6/fox_ve2.c index 7b251439..977c4b6e 100644 --- a/src/overlays/ovl_i6/fox_ve2.c +++ b/src/overlays/ovl_i6/fox_ve2.c @@ -14,7 +14,7 @@ s32 func_i6_8019624C(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d return false; } -extern AnimationHeader D_6014904; +extern Animation D_6014904; extern Limb* D_60149D0[]; void func_i6_80196288(Boss* boss) { diff --git a/src/overlays/ovl_menu/fox_map.c b/src/overlays/ovl_menu/fox_map.c index 982bd8b0..a505d83b 100644 --- a/src/overlays/ovl_menu/fox_map.c +++ b/src/overlays/ovl_menu/fox_map.c @@ -6170,185 +6170,31 @@ void func_menu_801AC80C(s32 arg0) { u32 padding_801B6B34[3] = { 0, 0, 0 }; UnkStruct_D_menu_801B8294 D_menu_801B6B40[] = { - { - 0.0, - 260.4722595214844, - 1477.2115478515625, - 0.0, - -17.364818572998047, - -98.48077392578125, - }, - { - 0.0, - 20.159666061401367, - 759.7326049804688, - 0.0, - -2.652587890625, - -99.96481323242188, - }, - { - -45.79036331176758, - 0.7120879888534546, - 336.9016418457031, - 13.467754364013672, - -0.2094379961490631, - -99.0887222290039, - }, - { - -59.033607482910156, - -7.9528679847717285, - 104.17190551757812, - 49.194671630859375, - 6.627389907836914, - -86.80992126464844, - }, - { - -39.37468719482422, - 50.698238372802734, - 40.26434326171875, - 65.62447357177734, - -4.497063159942627, - -67.10723876953125, - }, - { - -57.282569885253906, - 48.52915573120117, - -34.80637741088867, - 95.47095489501953, - 7.118072986602783, - -11.322705268859863, - }, - { - -64.80924987792969, - 53.131526947021484, - -77.35162353515625, - 81.01156616210938, - 3.335592031478882, - 15.689521789550781, - }, - { - -32.061317443847656, - 30.244365692138672, - -127.72071075439453, - 32.061317443847656, - 29.755634307861328, - 61.72071075439453, - }, - { - -62.320308685302734, - 25.741756439208984, - -222.99485778808594, - 31.160154342651367, - 32.129119873046875, - 61.99742889404297, - }, - { - -105.85608673095703, - 14.339532852172852, - -355.72161865234375, - 31.134143829345703, - 34.60601806640625, - 61.918128967285156, - }, - { - -136.990234375, - 9.733512878417969, - -450.6397399902344, - 31.134143829345703, - 34.60601806640625, - 61.918128967285156, - }, - { - -189.91827392578125, - 1.9032800197601318, - -612.0005493164062, - 31.134143829345703, - 34.60601806640625, - 61.918128967285156, - }, + { 0.0f, 260.47226f, 1477.2115f, 0.0f, -17.364819f, -98.480774f }, + { 0.0f, 20.159666f, 759.7326f, 0.0f, -2.652588f, -99.96481f }, + { -45.790363f, 0.712088f, 336.90164f, 13.467754f, -0.209438f, -99.08872f }, + { -59.033607f, -7.952868f, 104.171906f, 49.19467f, 6.62739f, -86.80992f }, + { -39.374687f, 50.69824f, 40.264343f, 65.62447f, -4.497063f, -67.10724f }, + { -57.28257f, 48.529156f, -34.806377f, 95.470955f, 7.118073f, -11.322705f }, + { -64.80925f, 53.131527f, -77.35162f, 81.011566f, 3.335592f, 15.689522f }, + { -32.061317f, 30.244366f, -127.72071f, 32.061317f, 29.755634f, 61.72071f }, + { -62.32031f, 25.741756f, -222.99486f, 31.160154f, 32.12912f, 61.99743f }, + { -105.85609f, 14.339533f, -355.72162f, 31.134144f, 34.606018f, 61.91813f }, + { -136.99023f, 9.733513f, -450.63974f, 31.134144f, 34.606018f, 61.91813f }, + { -189.91827f, 1.90328f, -612.00055f, 31.134144f, 34.606018f, 61.91813f }, }; UnkStruct_D_menu_801B8294 D_menu_801B6C60[] = { - { - 230.0, - -20.0, - -3.999999989900971e-06, - 90.0, - -20.0, - 1.9999999949504854e-06, - }, - { - 217.92657470703125, - 45.027198791503906, - -0.0069610001519322395, - 96.70745849609375, - -25.01511001586914, - 0.0038670001085847616, - }, - { - 161.75991821289062, - 66.46260070800781, - 50.40374755859375, - 73.11239624023438, - -6.1025848388671875, - -28.31671142578125, - }, - { - 117.36236572265625, - 2.6198840141296387, - 27.208602905273438, - 84.39605712890625, - -4.366471767425537, - -45.34767150878906, - }, - { - 19.168537139892578, - 2.4452030658721924, - 27.57978057861328, - 7.556180953979492, - -4.366434097290039, - -49.24960708618164, - }, - { - -116.45977783203125, - 1.2701389789581299, - 27.862812042236328, - -109.60753631591797, - -2.268105983734131, - -49.75502014160156, - }, - { - -117.43788146972656, - 1.2725709676742554, - 27.8646240234375, - -110.64664459228516, - -2.272449016571045, - -49.75825500488281, - }, - { - -118.43771362304688, - 1.3140660524368286, - 27.862712860107422, - -111.64693450927734, - -2.346545934677124, - -49.754844665527344, - }, - { - -118.44500732421875, - 1.3140660524368286, - 27.86207389831543, - -111.6339111328125, - -2.346545934677124, - -49.75370407104492, - }, - { - -118.46446228027344, - 1.3140660524368286, - 27.860361099243164, - -111.59918212890625, - -2.346545934677124, - -49.75064468383789, - }, + { 230.0f, -20.0f, -0.000004f, 90.0f, -20.0f, 0.000002f }, + { 217.92657f, 45.0272f, -0.006961f, 96.70746f, -25.01511f, 0.003867f }, + { 161.75992f, 66.4626f, 50.403748f, 73.1124f, -6.102585f, -28.316711f }, + { 117.362366f, 2.619884f, 27.208603f, 84.39606f, -4.366472f, -45.34767f }, + { 19.168537f, 2.445203f, 27.57978f, 7.556181f, -4.366434f, -49.249607f }, + { -116.45978f, 1.270139f, 27.862812f, -109.60754f, -2.268106f, -49.75502f }, + { -117.43788f, 1.272571f, 27.864624f, -110.646645f, -2.272449f, -49.758255f }, + { -118.43771f, 1.314066f, 27.862713f, -111.646935f, -2.346546f, -49.754845f }, + { -118.44501f, 1.314066f, 27.862074f, -111.63391f, -2.346546f, -49.753704f }, + { -118.46446f, 1.314066f, 27.860361f, -111.59918f, -2.346546f, -49.750645f }, }; void func_menu_801AC9A0(s32 index) { diff --git a/src/overlays/ovl_menu/fox_title.c b/src/overlays/ovl_menu/fox_title.c index 0ae2c0d7..d551bdba 100644 --- a/src/overlays/ovl_menu/fox_title.c +++ b/src/overlays/ovl_menu/fox_title.c @@ -7,19 +7,19 @@ #include "global.h" #include "fox_title.h" -extern AnimationHeader D_602F8E0; -extern AnimationHeader D_60305C0; -extern AnimationHeader D_6031DB8; -extern AnimationHeader D_6031120; -extern AnimationHeader D_6035024; -extern AnimationHeader D_60338DC; -extern AnimationHeader D_603531C; -extern AnimationHeader D_6036278; +extern Animation D_602F8E0; +extern Animation D_60305C0; +extern Animation D_6031DB8; +extern Animation D_6031120; +extern Animation D_6035024; +extern Animation D_60338DC; +extern Animation D_603531C; +extern Animation D_6036278; -extern SkelAnime D_602FBAC[]; -extern SkelAnime D_603088C[]; -extern SkelAnime D_6032084[]; -extern SkelAnime D_60313AC[]; +extern Limb* D_602FBAC[]; +extern Limb* D_603088C[]; +extern Limb* D_6032084[]; +extern Limb* D_60313AC[]; extern Gfx D_6036290[]; extern Gfx D_6036B30[]; @@ -158,8 +158,14 @@ f32 D_menu_801B907C; f32 D_menu_801B9080; f32 D_menu_801B9084; +typedef struct { + /* 0x00 */ Animation* unk_0; + /* 0x04 */ Animation* unk_4; + /* 0x08 */ Limb** skeleton; +} TitleAnimation; // size = 0x0C + //! TODO: Symbols for segmented addresses -Animation D_menu_801ADA00[4] = { +TitleAnimation D_menu_801ADA00[4] = { { &D_602F8E0, &D_6035024, D_602FBAC }, { &D_60305C0, &D_60338DC, D_603088C }, { &D_6031DB8, &D_603531C, D_6032084 }, @@ -680,7 +686,7 @@ void func_menu_801881FC(void) { D_menu_801B8350[3].unk_00.x = 58.0f; D_menu_801B8350[3].unk_00.y = -5.0f; D_menu_801B8350[3].unk_00.z = 22.00f; - D_menu_801B8350[3].unk_48 = -17.899979; + D_menu_801B8350[3].unk_48 = -17.899979f; D_menu_801B8350[3].unk_4C = -8.890011f; D_menu_801B8350[3].unk_50 = 0.00f; } else { @@ -2580,7 +2586,7 @@ void func_menu_8018E67C(s32 arg0) { } Animation_GetFrameData(D_menu_801ADA00[arg0].unk_0, sp5C, sp60); - Animation_DrawSkeleton(0, D_menu_801ADA00[arg0].skelanime, sp60, NULL, NULL, NULL, &gIdentityMatrix); + Animation_DrawSkeleton(0, D_menu_801ADA00[arg0].skeleton, sp60, NULL, NULL, NULL, &gIdentityMatrix); if (arg0 == 2) { gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); @@ -2645,7 +2651,7 @@ void func_menu_8018EA78(s32 arg0) { Math_SmoothStepToVec3fArray(sp48, D_menu_801B86E0[arg0], 1, Animation_GetFrameData(D_menu_801ADA00[arg0].unk_4, sp44, sp48), 0.2f, 100.0f, 0.0001f); - Animation_DrawSkeleton(1, D_menu_801ADA00[arg0].skelanime, D_menu_801B86E0[arg0], func_menu_8018EDC8, NULL, &arg0, + Animation_DrawSkeleton(1, D_menu_801ADA00[arg0].skeleton, D_menu_801B86E0[arg0], func_menu_8018EDC8, NULL, &arg0, &gIdentityMatrix); Matrix_Pop(&gGfxMatrix); diff --git a/yamls/us/overlays.yaml b/yamls/us/overlays.yaml index 9e043b46..99381c1a 100644 --- a/yamls/us/overlays.yaml +++ b/yamls/us/overlays.yaml @@ -57,21 +57,21 @@ - [0xE16C60, c, fox_a6] - [0xE1F680, c, fox_zo] - [0xE2DF20, c, fox_so] - - [0xE38560, c, sf_aq] + - [0xE38560, c, fox_aq] - [0xE4E3D0, .data, fox_i3] - [0xE4E3E0, .data, fox_a6] - [0xE4EC90, .data, fox_zo] - [0xE4F010, .data, fox_so] - - [0xE4F290, .data, sf_aq] + - [0xE4F290, .data, fox_aq] - [0xE50030, .rodata, fox_a6] - [0xE504E0, .rodata, fox_zo] - [0xE50C00, .rodata, fox_so] - - [0xE51160, .rodata, sf_aq] + - [0xE51160, .rodata, fox_aq] - { start: 0xE51970, type: .bss, vram: 0x801C2240, name: fox_i3 } - { type: .bss, vram: 0x801C2250, name: fox_a6 } - { type: .bss, vram: 0x801C2330, name: fox_zo } - { type: .bss, vram: 0x801C2740, name: fox_so } - - { type: .bss, vram: 0x801C27C0, name: sf_aq } + - { type: .bss, vram: 0x801C27C0, name: fox_aq } - name: ovl_i4 type: code