From 119dfa93545a3b2023e1b1fe35b624d68d8893bf Mon Sep 17 00:00:00 2001 From: petrie911 <69443847+petrie911@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:28:02 -0600 Subject: [PATCH] Solar decompiled, some cleanup (#102) * stuff * stuff * temps * matched * so complete * merge and clean * format * graphics macros --- include/assets.h | 13 +- include/functions.h | 10 +- include/i3.h | 4 +- include/libc/math.h | 4 +- linker_scripts/us/undefined_syms.ld | 11 + src/main/fox_360.c | 2 +- src/main/fox_display.c | 2 +- src/main/fox_edisplay.c | 8 +- src/main/fox_effect.c | 3 +- src/main/fox_hud.c | 8 +- src/main/fox_std_lib.c | 2 +- src/overlays/ovl_i1/fox_co.c | 8 +- src/overlays/ovl_i3/fox_a6.c | 6 +- src/overlays/ovl_i3/fox_so.c | 3189 +++++++++++++++++++++++++++ src/overlays/ovl_i3/fox_zo.c | 77 +- src/overlays/ovl_i3/sf_aq.c | 496 ++++- src/overlays/ovl_i3/sf_so.c | 1243 ----------- src/overlays/ovl_i6/fox_ve2.c | 90 +- yamls/us/overlays.yaml | 8 +- 19 files changed, 3804 insertions(+), 1380 deletions(-) create mode 100644 src/overlays/ovl_i3/fox_so.c delete mode 100644 src/overlays/ovl_i3/sf_so.c diff --git a/include/assets.h b/include/assets.h index b020773f..63ea7ed1 100644 --- a/include/assets.h +++ b/include/assets.h @@ -543,7 +543,8 @@ extern Gfx D_6011EE0[]; extern Gfx D_60120F0[]; extern u8 D_6012310[]; extern u8 D_60123F0[]; -extern Gfx D_6012C00[]; +extern Gfx D_6012C00_Gfx[]; +extern AnimationHeader D_6012C00_Anim; extern u8 D_60131A0[]; extern Gfx D_60132B0[]; extern u8 D_6013470[]; @@ -942,6 +943,16 @@ extern f32 D_603E030[]; extern f32 D_603E09C[]; extern f32 D_603E0EC[]; +extern Gfx D_60084C0[]; +extern Gfx D_6008D40[]; +extern Gfx D_6007C40[]; +extern Gfx D_601B790[]; +extern Gfx D_601B790[]; +extern Gfx D_601A700[]; +extern Gfx D_6019670[]; +extern Gfx D_60185E0[]; +extern Gfx D_6017550[]; + // ast_9DD390, ast_A0E340, ast_BFA740, ast_CBFE70, ast_D27600 extern Gfx D_7000000[]; extern u8 D_7000F10[]; diff --git a/include/functions.h b/include/functions.h index 60b1830e..7d4146f8 100644 --- a/include/functions.h +++ b/include/functions.h @@ -42,7 +42,7 @@ void func_8001CE28(u8, f32 *); void func_8001D034(f32*, s32, u8); void func_8001D10C(f32*, u32); void func_8001D15C(u8); -void func_8001D1C8(u8, s32); +void func_8001D1C8(u8, u32); void func_8001D2FC(f32 *, u16); void func_8001D3A0(f32 *, u16); void func_8001D400(s8); @@ -116,6 +116,9 @@ void func_800319AC(Actor* this); void func_80035448(Actor* actor); //fox_beam +void func_80038140(PlayerShot* shot); +void func_80036318(PlayerShot* shot); +void func_80035DEC(f32 xPos, f32 yPos, f32 zPos); void PlayerShot_Initialize(PlayerShot *); void func_800365E4(f32, f32, f32, f32, f32, f32, f32, f32, f32, s32, s32); void func_8003D9B8(void); @@ -152,7 +155,7 @@ void func_80045E7C(Player*); void func_80047504(Player * player); void func_80046358(Player*); -// sf_496E0 +// fox_demo void func_80048AC0(s32 teamId); void func_80049C0C(Player *); void func_8004A52C(Player *); @@ -160,6 +163,7 @@ void func_8004AA84(void); void func_8004AAF4(Player *); void func_8004C930(Player *); void func_8004CCC0(Player *); +void func_8004D440(Player* player); void func_8004E3D8(Player *); void func_8004F8AC(Actor*); void func_8004FEC0(Actor*); @@ -315,6 +319,7 @@ void func_800771CC(Actor*); void func_80077218(Actor*); // fox_effect +s32 func_80081B24(f32 posX, f32 posY, f32 posZ, f32 scale2); void func_80077240(f32 posX, f32 posY, f32 posZ, s32 hits); void func_8007729C(void); void func_80077790(void); @@ -531,6 +536,7 @@ void func_800A3CA0(void); s32 Play_CheckMedalStatus(u16); s32 Play_GetMaxShields(void); void func_800A6028(f32*, u32); +void func_800AC290(Player* player, PlayerShot* shot, f32 arg2, f32 arg3, PlayerShotId shotId, f32 arg5); void func_800A5844(void); void func_800A594C(void); void func_800A5D6C(void); diff --git a/include/i3.h b/include/i3.h index 36982576..b9fa4dbf 100644 --- a/include/i3.h +++ b/include/i3.h @@ -10,7 +10,7 @@ // extern f32 D_i3_801C4188; Currently externed in relevant files for bss ordering -void func_i3_801BE034(Actor*, Player*); +void func_i3_801BE034(Actor*); void func_i3_8018DA58(Actor*); void func_i3_8019E5F0(Actor*); @@ -97,7 +97,7 @@ void func_i3_801ABA40(PlayerShot*); void func_i3_801AC274(Player*); void func_i3_801AC8A8(f32, f32, f32, f32, s32); void func_i3_801AC918(Effect*); -void func_i3_801ACBB4(void); +void func_i3_801ACBB4(Player*); void func_i3_801ACE50(Player*); void func_i3_801AD328(Player*); void func_i3_801AD688(Actor *); diff --git a/include/libc/math.h b/include/libc/math.h index 7c9b533a..892e4086 100644 --- a/include/libc/math.h +++ b/include/libc/math.h @@ -12,8 +12,8 @@ #define SHT_MAX 32767.0f #define SHT_MINV (1.0f / SHT_MAX) -#define RAD_TO_DEG(radians) ((radians * 180.0f) / M_PI) -#define DEG_TO_RAD(degrees) ((degrees * M_PI) / 180.0f) +#define RAD_TO_DEG(radians) (((radians) * 180.0f) / M_PI) +#define DEG_TO_RAD(degrees) (((degrees) * M_PI) / 180.0f) typedef union { struct { diff --git a/linker_scripts/us/undefined_syms.ld b/linker_scripts/us/undefined_syms.ld index 87510fbc..66be4e72 100644 --- a/linker_scripts/us/undefined_syms.ld +++ b/linker_scripts/us/undefined_syms.ld @@ -457,6 +457,8 @@ D_6011C48 = 0x06011C48; D_6011C80 = 0x06011C80; D_6011EE0 = 0x06011EE0; D_60120F0 = 0x060120F0; +D_6012C00_Gfx = 0x06012C00; +D_6012C00_Anim = 0x06012C00; D_60132B0 = 0x060132B0; D_60137B0 = 0x060137B0; D_6013960 = 0x06013960; @@ -752,6 +754,15 @@ D_6011000 = 0x06011000; D_600FF30_Env = 0x0600FF30; D_6006E70 = 0x06006E70; D_6014D50 = 0x06014D50; +D_60084C0 = 0x060084C0; +D_6008D40 = 0x06008D40; +D_6007C40 = 0x06007C40; +D_601B790 = 0x0601B790; +D_601B790 = 0x0601B790; +D_601A700 = 0x0601A700; +D_6019670 = 0x06019670; +D_60185E0 = 0x060185E0; +D_6017550 = 0x06017550; D_700AB70 = 0x0700AB70; D_700BE00 = 0x0700BE00; diff --git a/src/main/fox_360.c b/src/main/fox_360.c index 8f729b50..e71d9a83 100644 --- a/src/main/fox_360.c +++ b/src/main/fox_360.c @@ -2165,7 +2165,7 @@ void func_80035448(Actor* actor) { f32 sp38; s32 pad[3]; Vec3f sp1E4 = { 0.0f, 0.0f, 0.0f }; - Vec3f sp7C[30]; // larger than expected + Vec3f sp7C[30]; f32 pad2; if (actor->unk_0E4 != 1000) { diff --git a/src/main/fox_display.c b/src/main/fox_display.c index fadf9f27..e9673c6a 100644 --- a/src/main/fox_display.c +++ b/src/main/fox_display.c @@ -690,7 +690,7 @@ void func_80054280(Player* player, s32 arg1) { func_80052884(player); return; case FORM_BLUE_MARINE: - func_i3_801ACBB4(); + func_i3_801ACBB4(player); return; case FORM_ON_FOOT: func_800526B8(player); diff --git a/src/main/fox_edisplay.c b/src/main/fox_edisplay.c index 9d8e58db..003dbbab 100644 --- a/src/main/fox_edisplay.c +++ b/src/main/fox_edisplay.c @@ -409,7 +409,7 @@ void func_8005A094(Actor* actor) { gSPDisplayList(gMasterDisp++, D_i1_8019A008[actor->unk_048]); break; default: - if (actor->unk_0B8 > 9) { // part of switch tree somehow? + if (actor->unk_0B8 > 9) { if (actor->unk_0B8 == 0x24) { gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); } @@ -856,7 +856,7 @@ void func_8005CDA8(Item* item) { } else { RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); } - gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK | G_LIGHTING); // wrong order? + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK | G_LIGHTING); for (i = 0; i < 7; i++) { Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, (i * 360.0f / 7.0f) * M_DTOR, 1); @@ -1384,7 +1384,7 @@ void func_8005F0E8(f32* sfxSrc, Vec3f* pos) { } func_8005F030(sfxSrc); } -// check + void func_8005F1EC(f32* sfxSrc) { Vec3f sp2C = { 0.0f, 0.0f, 0.0f }; Vec3f sp20; @@ -1798,7 +1798,7 @@ void func_80060968(void) { } else { Matrix_SetGfxMtx(&gMasterDisp); if (gCurrentLevel == LEVEL_MACBETH) { - gSPDisplayList(gMasterDisp++, D_6012C00); + gSPDisplayList(gMasterDisp++, D_6012C00_Gfx); } else { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, ent30->unk_2C, ent30->unk_2D, ent30->unk_2E, ent30->unk_2F); diff --git a/src/main/fox_effect.c b/src/main/fox_effect.c index 964435f9..1250f5e3 100644 --- a/src/main/fox_effect.c +++ b/src/main/fox_effect.c @@ -3496,7 +3496,6 @@ void func_80081C5C(Effect* effect) { s32 unusedOut; Vec3f velocity; Vec3f velocityDest; - // f32 pad; velocity.x = effect->vel.x; velocity.y = effect->vel.y; @@ -3659,7 +3658,7 @@ void func_80081C5C(Effect* effect) { case LEVEL_ZONESS: if (!(gGameFrameCount & 3)) { // clang-format off - func_80081A8C(effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z, effect->scale2 * 3.0f, 6); + func_80081A8C(effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z, effect->scale2 * 3.0f, 6); // clang-format on } diff --git a/src/main/fox_hud.c b/src/main/fox_hud.c index d537142a..dda62c16 100644 --- a/src/main/fox_hud.c +++ b/src/main/fox_hud.c @@ -1427,8 +1427,6 @@ void func_80088784(s32 arg0) { } } -// #if defined(IMPORT_BSS) || defined(NON_MATCHING) -// needs D_80161838 to be static void func_80088970(void) { s32 i; s32 j; @@ -1751,10 +1749,6 @@ void func_80088970(void) { } } } -// #else -// void func_80088970(void); -// #pragma GLOBAL_ASM("asm/us/nonmatchings/main/fox_hud/func_80088970.s") -// #endif void func_80089670(void) { RCP_SetupDL(&gMasterDisp, 0x3E); @@ -4851,7 +4845,7 @@ void func_80093164(Actor* actor) { break; case 41: - func_i3_801BE034(actor, player); + func_i3_801BE034(actor); break; case 44: diff --git a/src/main/fox_std_lib.c b/src/main/fox_std_lib.c index 3d7b9bc6..4752e1ac 100644 --- a/src/main/fox_std_lib.c +++ b/src/main/fox_std_lib.c @@ -384,7 +384,7 @@ void Animation_GetSkeletonBoundingBox(Limb** skeletonSegment, AnimationHeader* a boundBox[2].y = boundBox[3].y = boundBox[6].y = boundBox[7].y = min->y; boundBox[4].z = boundBox[5].z = boundBox[6].z = boundBox[7].z = min->z; for (i = 0; i < 8; i++) { - // Matrix_MultVec3f(gGfxMatrix, spC0[i], sp60[i]); should logically go here + // Matrix_MultVec3f(gGfxMatrix, boundBox[i], boundBoxRot[i]); should logically go here } *min = *max = boundBoxRot[0]; for (i = 1; i < 8; i++) { diff --git a/src/overlays/ovl_i1/fox_co.c b/src/overlays/ovl_i1/fox_co.c index 99a98f27..291ce200 100644 --- a/src/overlays/ovl_i1/fox_co.c +++ b/src/overlays/ovl_i1/fox_co.c @@ -11,9 +11,9 @@ extern Gfx D_60199D0[]; void func_i1_8018753C(Object_80* obj80) { - GCGM_BACK(); - GDL(&D_60199D0); - GSGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + gSPDisplayList(gMasterDisp++, D_60199D0); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); } void func_i1_801875A4(Object_4C* obj4C) { @@ -1009,7 +1009,7 @@ s32 func_i1_8018A434(s32 arg0, Gfx** arg1, Vec3f* arg2, Vec3f* arg3, void* arg4) } if ((boss->swork[arg0] & 1) || (boss->timer_05C & 1)) { RCP_SetupDL_64(); - GPC(64, 64, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 64, 64, 255, 255); } return false; } diff --git a/src/overlays/ovl_i3/fox_a6.c b/src/overlays/ovl_i3/fox_a6.c index e112ca24..fffb8d86 100644 --- a/src/overlays/ovl_i3/fox_a6.c +++ b/src/overlays/ovl_i3/fox_a6.c @@ -1696,14 +1696,14 @@ void func_i3_8018BCD4(Vec3f* arg0, f32 arg1, f32 arg2, Vec3f* arg3, s32 arg4, f3 Matrix_Scale(gCalcMatrix, 1.5f, 1.5f, 1.5f, 1); Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); Matrix_SetGfxMtx(&gMasterDisp); - GSGM_BACK(); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); gSPDisplayList(gMasterDisp++, D_600F1F0); Matrix_MultVec3f(gCalcMatrix, &sp90, arg3); } else { Matrix_Scale(gCalcMatrix, 2.0f, 2.0f, 2.0f, 1); Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); Matrix_SetGfxMtx(&gMasterDisp); - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); gSPDisplayList(gMasterDisp++, D_6015EE0); if (arg6 != 12) { Matrix_MultVec3f(gCalcMatrix, &sp90, arg3); @@ -1734,7 +1734,7 @@ void func_i3_8018C0D0(f32* arg0, f32 arg1, Vec3f* arg2, f32 arg3, s32 arg4) { Matrix_Push(&gGfxMatrix); Matrix_Push(&gCalcMatrix); Matrix_Copy(gCalcMatrix, &gIdentityMatrix); - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); Matrix_RotateZ(gCalcMatrix, (D_i3_801C22F0.unk_34 + arg1) * M_DTOR, 1); Matrix_Translate(gCalcMatrix, 0.0f, -360.0f, 120.0f, 1); Matrix_RotateX(gCalcMatrix, -(90.0f - arg3) * M_DTOR, 1); diff --git a/src/overlays/ovl_i3/fox_so.c b/src/overlays/ovl_i3/fox_so.c new file mode 100644 index 00000000..445e4d26 --- /dev/null +++ b/src/overlays/ovl_i3/fox_so.c @@ -0,0 +1,3189 @@ +#include "global.h" + +typedef void (*BossSOfunc)(Boss*); + +typedef enum { + /* 0 */ SO_SWK_0, + /* 1 */ SO_SWK_1, + /* 2 */ SO_SWK_2, + /* 3 */ SO_SWK_3, + /* 4 */ SO_SWK_4, + /* 5 */ SO_SWK_5, + /* 6 */ SO_SWK_6, + /* 7 */ SO_SWK_7, + /* 8 */ SO_SWK_8, + /* 9 */ SO_SWK_9, + /* 10 */ SO_SWK_10, + /* 11 */ SO_SWK_11, + /* 12 */ SO_SWK_12, + /* 13 */ SO_SWK_13, + /* 14 */ SO_SWK_14, + /* 15 */ SO_SWK_15, + /* 16 */ SO_SWK_16, + /* 17 */ SO_SWK_17, + /* 18 */ SO_SWK_18, + /* 19 */ SO_SWK_19, + /* 20 */ SO_SWK_20, + /* 21 */ SO_SWK_21, + /* 22 */ SO_SWK_22, + /* 23 */ SO_SWK_23, + /* 24 */ SO_SWK_24, + /* 25 */ SO_SWK_25, + /* 26 */ SO_SWK_26, + /* 27 */ SO_SWK_27, + /* 28 */ SO_SWK_28, + /* 29 */ SO_SWK_29, + /* 30 */ SO_SWK_30, + /* 31 */ SO_SWK_31, + /* 32 */ SO_SWK_32, + /* 33 */ SO_SWK_33, + /* 34 */ SO_SWK_34, + /* 35 */ SO_SWK_35, + /* 36 */ SO_SWK_36, + /* 37 */ SO_SWK_37, + /* 38 */ SO_SWK_38, + /* 39 */ SO_SWK_39, + /* 40 */ SO_SWK_MAX, +} BossSOswork; + +typedef enum { + /* 0 */ SO_FWK_0, + /* 1 */ SO_FWK_1, + /* 2 */ SO_FWK_2, + /* 3 */ SO_FWK_3, + /* 4 */ SO_FWK_4, + /* 5 */ SO_FWK_5, + /* 6 */ SO_FWK_6, + /* 7 */ SO_FWK_7, + /* 8 */ SO_FWK_8, + /* 9 */ SO_FWK_9, + /* 10 */ SO_FWK_10, + /* 11 */ SO_FWK_11, + /* 12 */ SO_FWK_12, + /* 13 */ SO_FWK_13, + /* 14 */ SO_FWK_14, + /* 15 */ SO_FWK_15, + /* 16 */ SO_FWK_16, + /* 17 */ SO_FWK_17, + /* 18 */ SO_FWK_18, + /* 19 */ SO_FWK_19, + /* 20 */ SO_FWK_20, + /* 21 */ SO_FWK_21, + /* 22 */ SO_FWK_22, + /* 23 */ SO_FWK_23, + /* 24 */ SO_FWK_24, + /* 25 */ SO_FWK_25, + /* 26 */ SO_FWK_26, + /* 27 */ SO_FWK_27, + /* 28 */ SO_FWK_28, + /* 29 */ SO_FWK_29, + /* 30 */ SO_FWK_30, + /* 31 */ SO_FWK_31, + /* 32 */ SO_FWK_32, + /* 33 */ SO_FWK_33, + /* 34 */ SO_FWK_34, + /* 35 */ SO_FWK_35, + /* 36 */ SO_FWK_36, + /* 37 */ SO_FWK_37, + /* 38 */ SO_FWK_38, + /* 39 */ SO_FWK_39, + /* 40 */ SO_FWK_40, + /* 41 */ SO_FWK_41, + /* 42 */ SO_FWK_42, + /* 43 */ SO_FWK_43, + /* 44 */ SO_FWK_44, + /* 45 */ SO_FWK_45, + /* 46 */ SO_FWK_46, + /* 47 */ SO_FWK_47, + /* 48 */ SO_FWK_48, + /* 49 */ SO_FWK_49, + /* 50 */ SO_FWK_MAX, +} BossSOfwork; + +typedef enum { + /* 0 */ SO_VWK_0, + /* 1 */ SO_VWK_1, + /* 2 */ SO_VWK_2, + /* 3 */ SO_VWK_3, + /* 4 */ SO_VWK_4, + /* 5 */ SO_VWK_5, + /* 6 */ SO_VWK_6, + /* 7 */ SO_VWK_7, + /* 8 */ SO_VWK_8, + /* 9 */ SO_VWK_9, + /* 10 */ SO_VWK_10, + /* 11 */ SO_VWK_11, + /* 12 */ SO_VWK_12, + /* 13 */ SO_VWK_13, + /* 14 */ SO_VWK_14, + /* 15 */ SO_VWK_15, + /* 16 */ SO_VWK_16, + /* 17 */ SO_VWK_17, + /* 18 */ SO_VWK_18, + /* 19 */ SO_VWK_19, + /* 20 */ SO_VWK_20, + /* 21 */ SO_VWK_21, + /* 22 */ SO_VWK_22, + /* 23 */ SO_VWK_23, + /* 24 */ SO_VWK_24, + /* 25 */ SO_VWK_25, + /* 26 */ SO_VWK_26, + /* 27 */ SO_VWK_27, + /* 28 */ SO_VWK_28, + /* 29 */ SO_VWK_29, + /* 30 */ SO_VWK_30, + /* 31 */ SO_VWK_31, + /* 32 */ SO_VWK_32, + /* 33 */ SO_VWK_33, + /* 34 */ SO_VWK_34, + /* 35 */ SO_VWK_35, + /* 36 */ SO_VWK_36, + /* 37 */ SO_VWK_37, + /* 38 */ SO_VWK_38, + /* 39 */ SO_VWK_39, + /* 40 */ SO_VWK_40, + /* 41 */ SO_VWK_41, + /* 42 */ SO_VWK_42, + /* 43 */ SO_VWK_43, + /* 44 */ SO_VWK_44, + /* 45 */ SO_VWK_45, + /* 46 */ SO_VWK_46, + /* 47 */ SO_VWK_47, + /* 48 */ SO_VWK_48, + /* 49 */ SO_VWK_49, + /* 50 */ SO_VWK_MAX, +} BossSOvwork; + +void func_i3_801A239C(Boss* bossSO); +void func_i3_801A2C3C(Boss* bossSO); +void func_i3_801A3468(Boss* bossSO); +void func_i3_801A48B8(Boss* bossSO); +void func_i3_801A4EC0(Boss* bossSO); +void func_i3_801A8DB8(Vec3f* pos, u32 sfxId, f32 zVel); + +s32 D_i3_801C2740[10]; +f32 D_i3_801C2768[14]; +s32 D_i3_801C27A0[8]; // unused? part of previous? + +void func_i3_8019E7F0(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 scale2) { + Effect_Initialize(effect); + effect->obj.status = OBJ_ACTIVE; + effect->obj.id = OBJ_EFFECT_392; + effect->unk_4E = 3; + effect->obj.pos.x = xPos; + effect->obj.pos.y = yPos; + effect->obj.pos.z = zPos; + effect->obj.rot.z = 180.0f; + if (Rand_ZeroOne() < 0.5f) { + effect->obj.rot.y = 180.0f; + } + effect->unk_44 = 112; + effect->scale2 = scale2; + effect->vel.y = 5.0f; + Object_SetInfo(&effect->info, effect->obj.id); + effect->info.unk_14 = 0; +} + +void func_i3_8019E8B8(f32 xPos, f32 yPos, f32 zPos, f32 scale2) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(gEffects); i++) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_8019E7F0(&gEffects[i], xPos, yPos, zPos, scale2); + break; + } + } +} + +void func_i3_8019E920(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, + s32 unk4E) { + Effect_Initialize(effect); + effect->obj.status = OBJ_ACTIVE; + effect->obj.id = OBJ_EFFECT_392; + effect->unk_4E = unk4E; + if (unk4E == 2) { + effect->timer_50 = 30; + effect->unk_4C = 3; + } + effect->obj.pos.x = xPos; + effect->obj.pos.y = yPos; + effect->obj.pos.z = zPos; + effect->vel.x = xVel; + effect->vel.y = yVel; + effect->vel.z = zVel; + effect->obj.rot.z = Rand_ZeroOne() * 360.0f; + effect->unk_44 = 176; + effect->scale2 = scale2; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i3_8019E9F4(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, s32 unk4E) { + s32 i; + + for (i = 99; i >= 34; i--) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_8019E920(&gEffects[i], xPos, yPos, zPos, xVel, yVel, zVel, scale2, unk4E); + break; + } + } +} + +void func_i3_8019EA7C(Actor* actor) { + f32 sp34; + s32 sp30; + + if (actor->unk_0B8 == 0) { + actor->vel.z = 20.0f - D_80177D08; + actor->fwork[0] = 12.0f; + } else { + actor->vel.z = actor->fwork[1] - D_80177D08; + if (actor->unk_0B8 == 2) { + Math_SmoothStepToF(&actor->obj.pos.x, gPlayer[0].pos.x, 1.0f, 100.0f, 10.0f); + } else { + actor->fwork[0] = 14.0f; + } + } + if ((actor->unk_046 == 0) || (actor->unk_046 == 1)) { + actor->unk_046 = 3; + func_8005F0E8(actor->sfxPos, &actor->obj.pos); + Audio_PlaySfx(0x11002052, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (func_800A73E4(&sp34, &sp30, actor->obj.pos.x, -100.0f, actor->obj.pos.z)) { + D_801782EC[sp30] = actor->fwork[0]; + D_801782EC[sp30 + 1] = actor->fwork[0] * 0.95f; + D_801782EC[sp30 - 1] = actor->fwork[0] * 0.95f; + D_801782EC[sp30 + 2] = actor->fwork[0] * 0.9f; + D_801782EC[sp30 - 2] = actor->fwork[0] * 0.9f; + D_801782EC[sp30 + 3] = actor->fwork[0] * 0.8f; + D_801782EC[sp30 - 3] = actor->fwork[0] * 0.8f; + if (actor->unk_0B8 != 2) { + D_801782EC[sp30 + 4] = actor->fwork[0] * 0.65f; + D_801782EC[sp30 - 4] = actor->fwork[0] * 0.65f; + D_801782EC[sp30 + 5] = actor->fwork[0] * 0.45f; + D_801782EC[sp30 - 5] = actor->fwork[0] * 0.45f; + D_801782EC[sp30 + 6] = actor->fwork[0] * 0.2f; + D_801782EC[sp30 - 6] = actor->fwork[0] * 0.2f; + D_801782EC[sp30 + 7] = actor->fwork[0] * 0.1f; + D_801782EC[sp30 - 7] = actor->fwork[0] * 0.1f; + } else { + D_801782EC[sp30 + 4] = actor->fwork[0] * 0.75f; + D_801782EC[sp30 - 4] = actor->fwork[0] * 0.75f; + D_801782EC[sp30 + 5] = actor->fwork[0] * 0.7f; + D_801782EC[sp30 - 5] = actor->fwork[0] * 0.7f; + D_801782EC[sp30 + 6] = actor->fwork[0] * 0.65f; + D_801782EC[sp30 - 6] = actor->fwork[0] * 0.65f; + D_801782EC[sp30 + 7] = actor->fwork[0] * 0.6f; + D_801782EC[sp30 - 7] = actor->fwork[0] * 0.6f; + D_801782EC[sp30 + 8] = actor->fwork[0] * 0.55f; + D_801782EC[sp30 - 8] = actor->fwork[0] * 0.55f; + D_801782EC[sp30 + 9] = actor->fwork[0] * 0.4f; + D_801782EC[sp30 - 9] = actor->fwork[0] * 0.4f; + D_801782EC[sp30 + 10] = actor->fwork[0] * 0.3f; + D_801782EC[sp30 - 10] = actor->fwork[0] * 0.3f; + D_801782EC[sp30 + 11] = actor->fwork[0] * 0.2f; + D_801782EC[sp30 - 11] = actor->fwork[0] * 0.2f; + D_801782EC[sp30 + 12] = actor->fwork[0] * 0.1f; + D_801782EC[sp30 - 12] = actor->fwork[0] * 0.1f; + } + } + switch (actor->unk_0D0) { + case 3: + func_i3_801A8DB8(&actor->obj.pos, 0x11002052, actor->vel.z); + /* fallthrough */ + case 2: + Object_Kill(&actor->obj, actor->sfxPos); + break; + } +} + +void func_i3_8019EF30(Actor* actor, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { + Actor_Initialize(actor); + actor->obj.status = OBJ_ACTIVE; + actor->obj.id = OBJ_ACTOR_275; + if (Rand_ZeroOne() < 0.1f) { + actor->obj.id = OBJ_ACTOR_276; + } + actor->obj.pos.x = xPos; + actor->obj.pos.y = yPos; + actor->obj.pos.z = zPos; + actor->unk_0F4.x = Rand_ZeroOne() * 360.0f; + actor->vel.x = xVel; + actor->vel.y = yVel; + actor->vel.z = zVel; + actor->unk_0B8 = 2; + actor->timer_0C2 = 8; + Object_SetInfo(&actor->info, actor->obj.id); + if (gBossActive != 0) { + actor->info.bonus = 0; + } + Audio_PlaySfx(0x29000071, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i3_8019F038(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { + s32 i; + + for (i = 4; i < ARRAY_COUNT(gActors); i++) { + if (gActors[i].obj.status == OBJ_FREE) { + func_i3_8019EF30(&gActors[i], xPos, yPos, zPos, xVel, yVel, zVel); + break; + } + } +} + +void func_i3_8019F0B0(Actor* actor, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { + Actor_Initialize(actor); + actor->obj.status = OBJ_ACTIVE; + actor->obj.id = OBJ_ACTOR_277; + actor->obj.pos.x = xPos; + actor->obj.pos.y = yPos; + actor->obj.pos.z = zPos; + actor->unk_0F4.x = Rand_ZeroOne() * 360.0f; + actor->vel.x = xVel; + actor->vel.y = yVel; + actor->vel.z = zVel; + actor->unk_0B8 = 2; + actor->timer_0C2 = 8; + Object_SetInfo(&actor->info, actor->obj.id); + if (gBossActive != 0) { + actor->info.bonus = 0; + } + Audio_PlaySfx(0x29000071, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i3_8019F194(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { + s32 i; + + for (i = 4; i < ARRAY_COUNT(gActors); i++) { + if (gActors[i].obj.status == OBJ_FREE) { + func_i3_8019F0B0(&gActors[i], xPos, yPos, zPos, xVel, yVel, zVel); + break; + } + } +} + +f32 D_i3_801BF8E0[4] = { 10.0f, 6.0f, -6.0f, -10.0f }; +Vec3f D_i3_801BF8F0[4] = { + { 10.0f, 7.0f, 0.0f }, + { -10.0f, 7.0f, 0.0f }, + { 7.0f, 10.0f, 0.0f }, + { -7.0f, 10.0f, 0.0f }, +}; +Vec3f D_i3_801BF920 = { 0.0f, 0.0f, 0.0f }; +Gfx* D_i3_801BF92C[6] = { + D_200B630, D_200A5A0, D_2009510, D_60084C0, D_6008D40, D_6007C40, +}; +Gfx* D_i3_801BF944[6] = { + D_601B790, D_601B790, D_601A700, D_6019670, D_60185E0, D_6017550, +}; +Vec3f D_i3_801BF95C[3] = { + { 0.0f, 30.0f, 480.0f }, + { -180.0f, 0.0f, 240.0f }, + { 180.0f, 0.0f, 240.0f }, +}; + +void func_i3_8019F20C(Actor* actor) { + f32 sp8C = 0.0f; + s32 sp88; + s32 i; + + if (actor->obj.id == OBJ_ACTOR_277) { + actor->scale = 2.0f; + } + if (actor->obj.id == OBJ_ACTOR_276) { + actor->unk_0F4.x -= 6.6f; + actor->unk_0F4.y -= 4.0f; + + } else { + actor->unk_0F4.x += 3.3f; + actor->unk_0F4.y += 2.0f; + } + switch (actor->unk_0B8) { + case 0: + actor->fwork[0] = actor->obj.pos.y * 0.05f; + actor->obj.pos.y = -100.0f; + /* fallthrough */ + case 1: + actor->unk_0B8 = 2; + actor->vel.y = actor->fwork[0]; + func_800A73E4(&sp8C, &sp88, actor->obj.pos.x, actor->obj.pos.y - 100.0f, actor->obj.pos.z); + actor->obj.pos.y = sp8C; + for (i = 0; i < 4; i++) { + func_i3_8019E9F4(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, D_i3_801BF8E0[i], + (Rand_ZeroOne() * 10.0f) + 10.0f, 0.0f, actor->scale * 5.0f, 1); + } + actor->timer_0C2 = 5; + Audio_PlaySfx(0x29000071, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + case 2: + actor->gravity = 0.5f; + if (func_800A73E4(&sp8C, &sp88, actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z)) { + Object_Kill(&actor->obj, actor->sfxPos); + func_8007A6F0(&actor->obj.pos, 0x29000072); + for (i = 0; i < 4; i++) { + func_i3_8019E9F4(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, D_i3_801BF8E0[i], + (Rand_ZeroOne() * 10.0f) + 10.0f, 0.0f, actor->scale * 5.0f, 1); + } + } + if (actor->timer_0BC == 0) { + actor->timer_0BC = 5; + func_i3_8019E9F4(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 0.0f, 0.0f, 0.0f, + actor->scale * 6.5f, 2); + } + if ((actor->unk_0D0 != 0) || ((actor->obj.id == OBJ_ACTOR_277) && (actor->vel.y < 0.0f))) { + func_8007D2C8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, actor->scale * 4.0f); + Object_Kill(&actor->obj, actor->sfxPos); + if (actor->obj.id == OBJ_ACTOR_277) { + for (i = 0; i < 4; i++) { + func_i3_8019F038(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, + D_i3_801BF8F0[i].x + ((Rand_ZeroOne() - 0.5f) * 3.0f), + D_i3_801BF8F0[i].y + ((Rand_ZeroOne() - 0.5f) * 3.0f), + (Rand_ZeroOne() * -10.0f) - 10.0f); + } + } else if (actor->obj.id == OBJ_ACTOR_275) { + actor->unk_044 = 1; + } else if (actor->obj.id == OBJ_ACTOR_276) { + if (gGoldRingCount[0] != 4) { + actor->unk_044 = 14; + } else { + actor->unk_044 = 25; + } + } + func_80066254(actor); + for (i = 0; i < 3; i++) { + func_800794CC(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 0.3f); + } + for (i = 0; i < 7; i++) { + func_i3_8019E9F4(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, + (Rand_ZeroOne() - 0.5f) * 30.0f, (Rand_ZeroOne() - 0.5f) * 30.0f, 0.0f, + ((2.0f * Rand_ZeroOne()) + 2.0f) * actor->scale, 1); + } + func_8007A6F0(&actor->obj.pos, 0x2903A008); + } + break; + } + actor->obj.rot.y = RAD_TO_DEG(-gPlayer[0].unk_058); + actor->obj.rot.x = RAD_TO_DEG(gPlayer[0].unk_05C); + if (!(gGameFrameCount & 1)) { + actor->unk_0B6++; + if (actor->unk_0B6 >= 3) { + actor->unk_0B6 = 0; + } + } +} + +void func_i3_8019F7AC(Actor* actor) { + if (actor->unk_0B8 != 0) { + Matrix_Push(&gGfxMatrix); + Matrix_RotateY(gGfxMatrix, actor->unk_0F4.y * M_DTOR, 1); + Matrix_RotateX(gGfxMatrix, actor->unk_0F4.x * M_DTOR, 1); + Matrix_SetGfxMtx(&gMasterDisp); + switch (actor->obj.id) { + case OBJ_ACTOR_275: + gSPDisplayList(gMasterDisp++, D_6017370); + break; + case OBJ_ACTOR_276: + if (!(gGameFrameCount & 1)) { + RCP_SetupDL(&gMasterDisp, 0x29); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 0, 255); + } + gSPDisplayList(gMasterDisp++, D_6017090); + break; + case OBJ_ACTOR_277: + gSPDisplayList(gMasterDisp++, D_6016CF0); + break; + } + + Matrix_Pop(&gGfxMatrix); + Graphics_SetScaleMtx(actor->scale * 3.5f); + RCP_SetupDL(&gMasterDisp, 0x40); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 128, 128, 160); + gSPDisplayList(gMasterDisp++, D_i3_801BF92C[actor->unk_0B6]); + } +} + +void func_i3_8019F99C(Actor* actor, Effect* effect, f32 scale1) { + Effect_Initialize(effect); + effect->obj.status = OBJ_ACTIVE; + effect->obj.id = OBJ_EFFECT_392; + effect->obj.pos.x = effect->vel.x = actor->obj.pos.x; + effect->obj.pos.y = -2000.0f; + effect->vel.y = actor->obj.pos.y; + effect->obj.pos.z = effect->vel.z = actor->obj.pos.z; + effect->scale1 = scale1; + effect->unk_60.y = actor->obj.rot.y; + effect->obj.rot.z = Rand_ZeroOne() * 360.0f; + effect->unk_44 = 255 - (actor->unk_04E * 8); + if (effect->unk_44 < 0) { + effect->unk_44 = 0; + } + effect->scale2 = 20.0f - (actor->unk_04E * 0.5f); + effect->unk_48 = 1; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i3_8019FAA4(Boss* bossSO, Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 hVelMod) { + Vec3f sp44; + Vec3f sp38; + Vec3f sp2C = D_i3_801BF920; + + Effect_Initialize(effect); + effect->obj.status = OBJ_ACTIVE; + effect->obj.id = OBJ_EFFECT_392; + effect->obj.pos.x = xPos; + effect->obj.pos.y = yPos; + effect->obj.pos.z = zPos; + effect->vel.y = yVel; + effect->vel.x = 0.0f; + effect->scale2 = 10.0f; + + if (gBossHealthBar != 0) { + if (gBosses[0].fwork[SO_FWK_31] > 0.0f) { + if (gBosses[0].swork[SO_SWK_0] != 7) { + Matrix_RotateY(gCalcMatrix, gBosses[0].obj.rot.y * M_DTOR, 0); + sp44.y = 0.0f; + sp44.z = 0.0f; + sp44.x = gBosses[0].fwork[SO_FWK_31] * 5.0f; + Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38); + effect->vel.x = sp38.x * hVelMod; + effect->vel.z = gPlayer[0].vel.z + (sp38.z * hVelMod); + } else { + Matrix_RotateZ(gCalcMatrix, bossSO->obj.rot.z * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, gBosses[0].obj.rot.x * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, gBosses[0].unk_078.y * M_DTOR, 1); + sp44.x = effect->obj.pos.x - bossSO->obj.pos.x; + sp44.y = effect->obj.pos.y - bossSO->obj.pos.y; + sp44.z = effect->obj.pos.z - bossSO->obj.pos.z; + Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38); + effect->obj.pos.x = bossSO->obj.pos.x + sp38.x; + effect->obj.pos.y = bossSO->obj.pos.y + sp38.y; + effect->obj.pos.z = bossSO->obj.pos.z + sp38.z; + effect->vel.z = gPlayer[0].vel.z; + effect->vel.y = yVel; + if (gBosses[0].actionState >= 2) { + effect->scale2 = 15.0f; + } + } + } else { + effect->vel.z = gPlayer[0].vel.z; + } + } else { + effect->vel.x = (Rand_ZeroOne() - 0.5f) * 30.0f; + effect->vel.z = (Rand_ZeroOne() - 0.5f) * 30.0f; + } + effect->unk_60.y = bossSO->obj.rot.y; + effect->unk_60.x = 90.0f; + effect->obj.rot.z = Rand_ZeroOne() * 360.0f; + effect->unk_44 = 255; + effect->unk_48 = 1; + effect->unk_4E = 4; + effect->unk_4C = 5; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i3_8019FDE0(Boss* bossSO, Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 unk4E) { + Effect_Initialize(effect); + effect->obj.status = OBJ_ACTIVE; + effect->obj.id = OBJ_EFFECT_392; + effect->obj.pos.x = xPos; + effect->obj.pos.y = yPos; + effect->obj.pos.z = zPos; + if (unk4E != 0) { + effect->vel.z = gPlayer[0].vel.z + 80.0f; + } else { + effect->vel.z = gPlayer[0].vel.z + 15.0f; + } + effect->scale2 = scale2; + effect->unk_60.y = bossSO->obj.rot.y; + effect->unk_60.x = 0.0f; + effect->obj.rot.z = Rand_ZeroOne() * 360.0f; + effect->unk_44 = 255; + effect->unk_48 = 1; + effect->unk_4E = unk4E + 5; + Object_SetInfo(&effect->info, effect->obj.id); + effect->info.damage = 40; +} + +void func_i3_8019FEE8(Actor* actor, f32 scale1) { + s32 i; + + for (i = 70; i >= 0; i--) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_8019F99C(actor, &gEffects[i], scale1); + break; + } + } +} + +void func_i3_8019FF44(Boss* bossSO, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 hVelMod) { + s32 i; + + for (i = 70; i >= 0; i--) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_8019FAA4(bossSO, &gEffects[i], xPos, yPos, zPos, yVel, hVelMod); + break; + } + } +} + +void func_i3_8019FFC0(Boss* bossSO, f32 xPos, f32 yPos, f32 zPos, f32 scale2, s32 unk4E) { + s32 i; + + for (i = 70; i >= 0; i--) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_i3_8019FDE0(bossSO, &gEffects[i], xPos, yPos, zPos, scale2, unk4E); + break; + } + } +} + +void func_i3_801A003C(Actor* actor) { + switch (actor->unk_0B8) { + case 0: + if (actor->timer_0BE == 0) { + actor->unk_0B8 = 1; + actor->timer_0BE = 50; + } else if (actor->timer_0BC == 0) { + actor->timer_0BC = 2; + func_i3_8019FEE8(actor, 1000.0f); + actor->unk_04E++; + } + break; + case 1: + if (actor->timer_0BE == 0) { + actor->unk_0B8 = 0; + actor->timer_0BE = 50; + actor->unk_04E = 0; + func_8005F0E8(actor->sfxPos, &actor->obj.pos); + Audio_PlaySfx(0x19035053, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + } +} + +void func_i3_801A0120(Effect* effect) { + f32 sp5C; + f32 sp58; + f32 sp54; + f32 sp50 = 1.0f; + s32 sp4C; + s32 sp48; + Vec3f sp3C; + + switch (effect->unk_4E) { + case 0: + Matrix_Translate(gCalcMatrix, effect->vel.x, effect->vel.y, effect->vel.z, 0); + Matrix_RotateY(gCalcMatrix, effect->unk_60.y * M_DTOR, 1); + Matrix_RotateX(gCalcMatrix, effect->unk_60.x * M_DTOR, 1); + sp3C.x = 0.0f; + sp3C.y = 0.0f; + sp3C.z = -effect->scale1; + Matrix_MultVec3f(gCalcMatrix, &sp3C, &effect->obj.pos); + effect->unk_60.x += 5.0f; + if (!(gGameFrameCount & 1)) { + effect->unk_4C++; + if (effect->unk_4C > 2) { + effect->unk_4C = 0; + } + } + if (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_7) { + func_8007A774(&gPlayer[0], effect, effect->scale2 * 12.0f); + } + if (effect->unk_60.x > 190.0f) { + Object_Kill(&effect->obj, effect->sfxPos); + } + sp48 = effect->unk_48; + if (func_800A73E4(&sp5C, &sp4C, effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z)) { + effect->unk_48 = 1; + if (effect->scale2 == 20.0f) { + Audio_PlaySfx(0x19035054, effect->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else { + effect->unk_48 = 0; + } + if (sp48 != effect->unk_48) { + if (effect->unk_48 != 0) { + sp54 = 50.0f; + } else { + sp54 = -50.0f; + } + if (effect->index & 1) { + sp58 = 100.0f; + } else { + sp58 = -100.0f; + } + func_i3_8019E9F4(effect->obj.pos.x + sp58, effect->obj.pos.y + sp54, effect->obj.pos.z, sp58 * 0.25f, + (Rand_ZeroOne() * 10.0f) + 20.0f, sp58 * 0.25f, 20.0f, 1); + } + break; + case 1: + if (effect->timer_50 == 0) { + effect->timer_50 = 4; + effect->unk_4C++; + if (effect->unk_4C >= 6) { + effect->unk_4C = 0; + Object_Kill(&effect->obj, effect->sfxPos); + } + } + if (effect->scale2 > 10.0f) { + effect->vel.y -= 2.5f; + } else if (effect->scale2 > 4.0f) { + effect->vel.y -= 1.0f; + } + break; + case 2: + if (effect->timer_50 == 0) { + Object_Kill(&effect->obj, effect->sfxPos); + } + Math_SmoothStepToF(&effect->scale2, 0.0f, 0.1f, 0.2f, 0.0f); + effect->obj.rot.z += 3.0f; + effect->vel.y -= 0.3f; + break; + case 3: + Math_SmoothStepToF(&effect->obj.rot.z, -190.0f, 1.0f, 10.0f, 0.0f); + effect->vel.y -= 0.3f; + if (effect->obj.rot.z <= -180.0f) { + Object_Kill(&effect->obj, effect->sfxPos); + } + break; + case 4: + if (gBosses[0].swork[SO_SWK_0] != 7) { + Math_SmoothStepToF(&effect->vel.y, -40.0f, 1.0f, 1.0f, 1.0f); + } else { + effect->vel.z = gPlayer[0].vel.z; + Math_SmoothStepToF(&effect->vel.y, -65.0f, 2.0f, 1.0f, 0.5f); + } + if (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_7) { + func_8007A774(&gPlayer[0], effect, effect->scale2 * 12.0f); + } + if (effect->obj.pos.y < -20.0f) { + Object_Kill(&effect->obj, effect->sfxPos); + } + effect->obj.rot.z += 6.0f; + if (effect->obj.rot.z >= 360.0f) { + effect->obj.rot.z = 0.0f; + } + sp48 = effect->unk_48; + if (func_800A73E4(&sp5C, &sp4C, effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z)) { + effect->unk_48 = 1; + if (effect->scale2 == 20.0f) { + Audio_PlaySfx(0x19035054, effect->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else { + effect->unk_48 = 0; + } + if ((sp48 != effect->unk_48) && (effect->unk_48 != 0)) { + if (effect->index & 1) { + sp58 = 100.0f; + } else { + sp58 = -100.0f; + } + func_i3_8019E9F4(effect->obj.pos.x + sp58, effect->obj.pos.y + -50.0f, effect->obj.pos.z, sp58 * 0.25f, + (Rand_ZeroOne() * 10.0f) + 20.0f, sp58 * 0.25f, 20.0f, 1); + } + break; + case 5: + effect->unk_4C++; + if (effect->unk_4C > 2) { + effect->unk_4C = 0; + } + if (effect->unk_60.x < 7.5f) { + effect->unk_60.x += 0.25f; + } + effect->unk_60.z += 10.0f; + effect->vel.x = __sinf(effect->unk_60.z * M_DTOR) * (effect->unk_60.x * 10.0f); + effect->vel.y = __cosf(effect->unk_60.z * M_DTOR) * (effect->unk_60.x * 10.0f); + effect->vel.z = gPlayer[0].vel.z + 15.0f; + if (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_7) { + func_8007A774(&gPlayer[0], effect, effect->scale2 * 18.0f); + if ((effect->unk_4C == 0) && ((effect->scale2 >= 9.8f) || (effect->scale2 <= 4.4f))) { + Audio_PlaySfx(0x31033078, effect->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else { + effect->vel.z += 65.0f; + if (fabsf(gBosses[0].obj.pos.z - effect->obj.pos.z) >= 2000.0f) { + func_8001A55C(effect->sfxPos, 0x31033078); + } + } + break; + case 6: + sp50 = -1.0f; + /* fallthrough */ + case 7: + effect->unk_4C++; + if (effect->unk_4C > 2) { + effect->unk_4C = 0; + } + effect->unk_60.z += 20.0f; + effect->vel.x = __sinf(effect->unk_60.z * M_DTOR) * sp50 * 50.0f; + effect->vel.y = __cosf(effect->unk_60.z * M_DTOR) * sp50 * 50.0f; + effect->vel.z = gPlayer[0].vel.z + 80.0f; + if (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_7) { + func_8007A774(&gPlayer[0], effect, effect->scale2 * 18.0f); + if ((effect->unk_4C == 0) && ((effect->scale2 >= 9.8f) || (effect->scale2 <= 4.4f))) { + Audio_PlaySfx(0x31033078, effect->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } else if (fabsf(gBosses[0].obj.pos.z - effect->obj.pos.z) >= 2000.0f) { + func_8001A55C(effect->sfxPos, 0x31033078); + } + break; + } +} + +void func_i3_801A0AF0(Effect* effect) { + Graphics_SetScaleMtx(effect->scale2); + switch (effect->unk_4E) { + case 0: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 128, 128, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_i3_801BF92C[effect->unk_4C]); + break; + case 1: + case 2: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 128, 128, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_i3_801BF944[effect->unk_4C]); + break; + case 3: + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 128, 128, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_601C820); + break; + case 4: + case 5: + case 6: + case 7: + RCP_SetupDL(&gMasterDisp, 0x35); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 128, 128, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_i3_801BF92C[effect->unk_4C]); + RCP_SetupDL(&gMasterDisp, 0x40); + break; + } +} + +void func_i3_801A0CEC(Actor* actor, f32 xPos, f32 zPos, f32 zVel, s32 unkB8) { + Actor_Initialize(actor); + actor->obj.status = OBJ_ACTIVE; + actor->obj.id = OBJ_ACTOR_278; + actor->obj.pos.x = xPos; + actor->obj.pos.z = zPos; + actor->unk_046 = 1; + actor->unk_0B8 = unkB8; + actor->vel.z = zVel; + actor->fwork[1] = zVel; + if (unkB8 == 2) { + actor->fwork[0] = 18.0f; + } + Object_SetInfo(&actor->info, actor->obj.id); + actor->info.bonus = 0; +} + +void func_i3_801A0D90(f32 xPos, f32 zPos, f32 zVel, s32 unkB8) { + s32 i; + + for (i = 4; i < ARRAY_COUNT(gActors); i++) { + if (gActors[i].obj.status == OBJ_FREE) { + func_i3_801A0CEC(&gActors[i], xPos, zPos, zVel, unkB8); + break; + } + } +} + +void func_i3_801A0DF8(f32 xPos, f32 zPos, f32 yRot, s32 index, f32 yPos) { + s32 sp2C; + + switch (index) { + case 0: + if (D_80177A10[0] != 0) { + sp2C = 5; + D_80177A10[1] = (s32) (Rand_ZeroOne() * 10.0f) + 128; + } else { + sp2C = 4; + D_80177A10[0] = (s32) (Rand_ZeroOne() * 10.0f) + 128; + } + break; + case 1: + case 4: + sp2C = 6; + break; + case 2: + sp2C = 4; + break; + case 3: + sp2C = 5; + break; + } + Actor_Initialize(&gActors[sp2C]); + gActors[sp2C].obj.status = OBJ_ACTIVE; + gActors[sp2C].obj.id = OBJ_ACTOR_279; + Object_SetInfo(&gActors[sp2C].info, gActors[sp2C].obj.id); + gActors[sp2C].unk_0B8 = 0; + gActors[sp2C].obj.pos.x = xPos; + gActors[sp2C].obj.pos.z = zPos; + gActors[sp2C].obj.rot.y = yRot; + if (index != 4) { + gActors[sp2C].obj.pos.y = -80.0f * yPos; + } else { + gActors[sp2C].timer_0BC = 0; + gActors[sp2C].timer_0BE = 50; + gActors[sp2C].unk_04E = 0; + gActors[sp2C].obj.pos.y = -1.0f * yPos; + func_8005F0E8(gActors[sp2C].sfxPos, &gActors[sp2C].obj.pos); + Audio_PlaySfx(0x19035053, gActors[sp2C].sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } +} + +void func_i3_801A0FD4(Actor* actor, s32 index) { + if (gTeamShields[3 - index] > 0) { + Actor_Initialize(actor); + actor->obj.status = OBJ_ACTIVE; + actor->obj.id = OBJ_ACTOR_195; + actor->obj.pos.x = D_i3_801BF95C[index].x + gPlayer[0].pos.x; + actor->obj.pos.y = D_i3_801BF95C[index].y + gPlayer[0].pos.y; + actor->obj.pos.z = D_i3_801BF95C[index].z + gPlayer[0].pos.z; + actor->unk_0B8 = 0; + actor->iwork[11] = 1; + actor->vel.z = 0.0f; + actor->vel.y = 0.0f; + actor->obj.rot.x = 0.0f; + actor->obj.rot.y = 180.0f; + Object_SetInfo(&actor->info, actor->obj.id); + Audio_PlaySfx(0x3100000C, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } +} + +void func_i3_801A10F4(Player* player) { + s32 i; + Vec3f sp50; + Vec3f sp44; + + if (D_80177A10[0] != 0) { + D_80177A10[0]--; + } + if (D_80177A10[1] != 0) { + D_80177A10[1]--; + } + switch (player->unk_1D0) { + case 0: + gCsFrameCount = 0; + Rand_SetSeed(1, 29100, 9786); + player->unk_1D0 = 1; + player->camEye.x = -2000.0f; + D_80177978 = -2800.0f; + player->camEye.y = D_80177980 = 120.0f; + player->camEye.z = -1800.0f; + D_80177988 = -2800.0f; + + player->camAt.x = D_801779A0 = -1000.0f; + player->camAt.y = 1400.0f; + D_801779B8 = 400.0f; + player->camAt.z = D_801779C0 = -2300.0f; + + D_80177A48[0] = 0.0045f; + + player->unk_034 = 0.0f; + player->unk_0D0 = 0.0f; + + D_80178340 = 255; + D_80178358 = 0; + func_i3_801A0DF8(-750.0f, -2600.0f, 300.0f, 2, 1.0f); + Audio_PlaySfx(0x3140807E, player->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + case 1: + D_80177CE8 += 30.0f; + if (gCsFrameCount == 140) { + func_i3_801A0DF8(-400.0f, -2000.0f, 45.0f, 3, 1.0f); + } + if (gCsFrameCount == 280) { + func_i3_801A0DF8(-1730.0f, -2300.0f, 250.0f, 1, 1.0f); + } + if (gCsFrameCount == 100) { + Object_Kill(&gActors[4].obj, gActors[4].sfxPos); + } + if (gCsFrameCount == 240) { + Object_Kill(&gActors[5].obj, gActors[5].sfxPos); + } + if (gCsFrameCount == 380) { + Object_Kill(&gActors[6].obj, gActors[6].sfxPos); + } + if (gCsFrameCount < 3) { + D_80178340 = 255; + } + if (gCsFrameCount == 370) { + D_80178358 = 255; + D_80178348 = 255; + D_80178350 = 255; + D_80178354 = 255; + D_8017835C = 8; + } + if (!(gGameFrameCount & 7)) { + func_i3_8019E8B8((Rand_ZeroOne() - 0.5f) * 6000.0f, ((Rand_ZeroOne() - 0.5f) * 5.0f) - 90.0f, + (Rand_ZeroOne() * 2000.0f) - 6000.0f + D_80177D20, (Rand_ZeroOne() * 20.0f) + 20.0f); + } + if (gCsFrameCount == 380) { + for (i = 0; i < 100; i++) { + Object_Kill(&gEffects[i].obj, gEffects[i].sfxPos); + } + func_i3_801A0DF8(400.0f, -2800.0f, 340.0f, 1, 1.0f); + } + if (gCsFrameCount == 410) { + player->unk_1D0++; + player->camEye.x = 200.0f; + D_80177978 = 800.0f; + player->camEye.y = 140.0f; + D_80177980 = player->pos.y + 200.0f; + player->camEye.z = D_80177988 = 400.0f; + + player->camAt.x = 400.0f; + D_801779A0 = 200.0f; + player->camAt.y = 140.0f; + D_801779B8 = 1200.0f; + player->camAt.z = -500.0f; + + player->pos.y = 1200.0f; + player->pos.z = -2500.0f; + func_i3_801A0FD4(&gActors[0], 0); + func_i3_801A0FD4(&gActors[1], 1); + func_i3_801A0FD4(&gActors[2], 2); + D_801779C0 = -3000.0f; + D_80177988 = -3400.0f; + func_8001A55C(player->sfxPos, 0x3140807E); + func_8001D444(0, 0x33, 0, 0xFF); + func_80057814(player); + func_8001C8B8(gPlayerNum); + D_80177A48[0] = 0.01f; + } + break; + case 2: + D_80177CE8 += 60.0f; + D_80178358 = 0; + D_8017835C = 8; + Math_SmoothStepToF(D_80177A48, 0.02f, 1.0f, 0.0000003f, 0.0f); + if (gCsFrameCount == 525) { + func_800BA808(gMsg_ID_10010, RCID_FOX); + } + if (gCsFrameCount == 550) { + Object_Kill(&gActors[5].obj, gActors[5].sfxPos); + func_i3_801A0DF8(30.0f, -1500.0f, 160.0f, 3, 2.0f); + } + if (player->camEye.z <= -2465.0f) { + player->unk_1D0++; + D_80177980 = player->pos.y + 180.0f; + D_801779A0 = 0.0f; + D_80177978 = 0.0f; + D_801779C0 = -2800.0f; + D_80177A48[0] = 0.06f; + } + break; + case 3: + D_80177CE8 += 60.0f; + if (!(gGameFrameCount & 3)) { + func_i3_8019E8B8((Rand_ZeroOne() - 0.5f) * 6000.0f, -400.0f - ((player->camEye.y - 1380.0f) * 0.3f), + ((Rand_ZeroOne() - 0.5f) * 2000.0f) + 500.0f + D_80177D20, + (Rand_ZeroOne() * 20.0f) + 20.0f); + } + if (gCsFrameCount == 615) { + func_800A6028(player->sfxPos, 0x09000002); + gActors[0].fwork[29] = gActors[1].fwork[29] = gActors[2].fwork[29] = 5.0f; + gActors[0].unk_0B8 = 3; + gActors[1].unk_0B8 = 2; + gActors[2].unk_0B8 = 1; + player->timer_1F8 = 3; + player->unk_190 = 5.0f; + player->unk_1D0++; + player->unk_194 = 5.0f; + } + break; + case 4: + D_80177978 = player->pos.x; + D_80177980 = player->pos.y; + D_80177988 = player->unk_138 + 1000.0f; + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->unk_138 + 1100.0f; + D_80177A48[0] = 0.03f; + D_801779A8[gMainController] = 60.0f; + player->unk_190 = 2.0f; + if (player->timer_1F8 == 0) { + D_80178358 = 255; + D_8017835C = 24; + D_80178348 = D_80178350 = D_80178354 = 255; + } + if (D_80178340 == 255) { + func_8001D444(0, 0x800B, 0, 0xFF); + player->pos.z = 0.0f; + player->unk_0D0 = D_80161A54; + func_800A6148(); + D_80177838 = 50; + player->state_1C8 = PLAYERSTATE_1C8_3; + player->unk_1D0 = 0; + player->pos.y = 350.0f; + + player->camEye.x = player->pos.x; + player->camEye.y = 50.0f + player->pos.y * player->unk_148; + player->camEye.z = 30.0f; + + player->camAt.x = player->pos.x; + player->camAt.y = 20.0f + player->pos.y * player->unk_148; + player->camAt.z = player->unk_138; + + D_80177950 = 1.0f; + func_8001D1C8(0xFF, 3); + Audio_PlaySfx(0x4100C023, D_800C5D28, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_80178488 = 1; + D_80178358 = 0; + player->timer_1F8 = 15; + gPlayer[0].shields = 255; + } + break; + case 10: + D_80177CE8 += 60.0f; + break; + } + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 20000.0f, 0); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 20000.0f, 0); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 20000.0f, 0); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 20000.0f, 0); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 20000.0f, 0); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 20000.0f, 0); + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + 180.0f) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -(player->unk_0E4 * M_DTOR), 1); + sp50.x = 0.f; + sp50.y = 0.0f; + sp50.z = player->unk_0D0; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp50, &sp44); + player->vel.x = sp44.x; + player->vel.z = sp44.z; + player->vel.y = sp44.y; + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + player->pos.z += player->vel.z; + player->unk_138 = player->pos.z + player->unk_08C; +} + +void func_i3_801A1CD8(Actor* actor, f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 xVel, f32 yVel, + f32 zVel, s32 unk46) { + Actor_Initialize(actor); + actor->obj.status = OBJ_INIT; + actor->obj.id = OBJ_ACTOR_189; + actor->unk_0B8 = 40; + actor->unk_046 = unk46; + actor->unk_04A = 3; + actor->obj.pos.x = xPos; + actor->obj.pos.y = yPos; + actor->obj.pos.z = zPos; + actor->obj.rot.x = xRot; + actor->obj.rot.y = yRot; + actor->obj.rot.z = zRot; + actor->vel.x = xVel; + actor->vel.y = yVel; + actor->vel.z = zVel; + actor->iwork[0] = 3; + + actor->fwork[0] = (Rand_ZeroOne() - 0.5f) * 25.0f; + actor->fwork[1] = (Rand_ZeroOne() - 0.5f) * 25.0f; + actor->fwork[2] = (Rand_ZeroOne() - 0.5f) * 25.0f; + actor->fwork[5] = 2000.0f; + actor->gravity = 3.5f; + actor->scale = 5.5f; + Object_SetInfo(&actor->info, actor->obj.id); +} + +void func_i3_801A1E14(f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, f32 xVel, f32 yVel, f32 zVel, + s32 unk46) { + s32 i; + + for (i = 59; i >= 0; i--) { + if (gActors[i].obj.status == OBJ_FREE) { + func_i3_801A1CD8(&gActors[i], xPos, yPos, zPos, xRot, yRot, zRot, xVel, yVel, zVel, unk46); + break; + } + } +} + +void func_i3_801A1EB0(Boss* bossSO, f32 xPos, f32 xOffset, f32 yPos, f32 zPos) { + func_i3_8019E9F4(xPos + xOffset, yPos, zPos, 20.0f, (Rand_ZeroOne() * 10.0f) + 20.0f, 0.0f, 20.0f, 1); + func_i3_8019E9F4(xPos - xOffset, yPos, zPos, -20.0f, (Rand_ZeroOne() * 10.0f) + 20.0f, 0.0f, 20.0f, 1); +} + +void func_i3_801A1F80(Boss* bossSO) { + if (gBossActive != 0) { + bossSO->unk_3F8 = 5.5f; + } + if (bossSO->health == 0) { + func_800182F4(0x101400FF); + func_800182F4(0x111400FF); + gBossActive = 1; + gBossFrameCount = 0; + bossSO->health = 600; + + bossSO->unk_3F8 = 0.1f; + bossSO->fwork[SO_FWK_0] = 1.0f; + bossSO->swork[SO_SWK_2] = bossSO->swork[SO_SWK_3] = 400; + + bossSO->obj.pos.y = -3000.0f; + + func_i3_801A0CEC(&gActors[10], bossSO->obj.pos.x, bossSO->obj.pos.z + 2000.0f, 20.0f, 1); + D_801779A8[gMainController] = 10.0f; + D_80178480 = 120; + bossSO->fwork[SO_FWK_3] = 2400.0f; + bossSO->info.hitbox = SEGMENTED_TO_VIRTUAL(D_60231A4); + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 0; + bossSO->info.hitbox[8] = bossSO->info.hitbox[12] = bossSO->info.hitbox[14] = bossSO->info.hitbox[18] = + bossSO->info.hitbox[20] = bossSO->info.hitbox[24] = bossSO->info.hitbox[26] = bossSO->info.hitbox[30] = + bossSO->info.hitbox[32] = bossSO->info.hitbox[36] = bossSO->info.hitbox[38] = bossSO->info.hitbox[42] = + 220.0f; + bossSO->info.hitbox[10] = bossSO->info.hitbox[28] = 467.5f; + bossSO->info.hitbox[16] = bossSO->info.hitbox[34] = 247.5f; + bossSO->info.hitbox[22] = bossSO->info.hitbox[40] = 715.0f; + + D_i3_801C2740[0] = 255; + D_i3_801C2740[1] = 255; + D_i3_801C2768[3] = D_i3_801C2768[2] = D_i3_801C2768[4] = D_i3_801C2768[5] = D_i3_801C2768[6] = + D_i3_801C2768[7] = D_i3_801C2768[8] = D_i3_801C2768[9] = D_i3_801C2768[10] = D_i3_801C2768[11] = + D_i3_801C2768[12] = D_i3_801C2768[13] = 0.0f; + } + gActors[10].obj.pos.z = bossSO->obj.pos.z + 2000.0f; + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 30.0f, 0.1f); + if (gFogRed > 96) { + gFogRed--; + } + if (gFogGreen > 96) { + gFogGreen--; + } + if (gFogBlue > 64) { + gFogBlue--; + } + if (gBossFrameCount == 30) { + func_8001D444(0, 0x801B, 0, 0xFF); + } + if (gBossFrameCount <= 60) { + Math_SmoothStepToF(&D_801779A8[gMainController], 120.0f, 1.0f, 3.5f, 0.0f); + } + if (gBossFrameCount == 60) { + gActors[10].unk_0D0 = 3; + Audio_PlaySfx(0x19036053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->timer_050 == 100) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 1; + } + if (gBossFrameCount == 150) { + func_i3_801A239C(bossSO); + bossSO->fwork[SO_FWK_0] = 0.01f; + } + if ((gBossFrameCount == 100) && (gTeamShields[3] != 0)) { + func_800BA808(gMsg_ID_10300, RCID_PEPPY); + } +} + +void func_i3_801A239C(Boss* bossSO) { + bossSO->swork[SO_SWK_0] = 1; + if ((bossSO->swork[SO_SWK_2] != 0) || (bossSO->swork[SO_SWK_3] != 0)) { + if (bossSO->swork[SO_SWK_3] != 0) { + bossSO->swork[SO_SWK_1] = 3; + } else { + bossSO->swork[SO_SWK_1] = 4; + } + } else { + bossSO->swork[SO_SWK_1] = 7; + } + bossSO->unk_04C = 0; +} + +void func_i3_801A23F4(Boss* bossSO) { + s32 i; + Vec3f sp58; + Vec3f sp4C; + Vec3f sp40; + Vec3f sp34; + + switch (bossSO->swork[SO_SWK_1]) { + case 3: + if ((bossSO->unk_04C == 119) || (bossSO->swork[SO_SWK_3] == 0)) { + bossSO->unk_04C = 0; + if (bossSO->swork[SO_SWK_2] != 0) { + if (Rand_ZeroOne() >= 0.5f) { + bossSO->swork[SO_SWK_1] = 4; + } else { + bossSO->swork[SO_SWK_1] = 2; + bossSO->actionState = 0; + bossSO->unk_078.y = 0.0f; + } + } else if (bossSO->swork[SO_SWK_3] == 0) { + bossSO->swork[SO_SWK_1] = 7; + } else { + bossSO->swork[SO_SWK_1] = 5; + } + } + if (bossSO->unk_04C >= 28) { + bossSO->info.hitbox[38] = 715.0f; + bossSO->info.hitbox[40] = 440.0f; + bossSO->info.hitbox[42] = 110.0f; + } + if (bossSO->unk_04C == 29) { + func_8005F0E8(bossSO->sfxPos, &bossSO->obj.pos); + Audio_PlaySfx(0x19035053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 80) { + Audio_PlaySfx(0x29432077, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C >= 94) { + bossSO->info.hitbox[38] = 220.0f; + bossSO->info.hitbox[40] = 715.0f; + bossSO->info.hitbox[42] = 220.0f; + } + break; + case 4: + if ((bossSO->unk_04C == 99) || (bossSO->swork[SO_SWK_2] == 0)) { + bossSO->unk_04C = 0; + if ((bossSO->swork[SO_SWK_3] != 0) || (bossSO->swork[SO_SWK_2] != 0)) { + bossSO->swork[SO_SWK_1] = 5; + } else { + bossSO->swork[SO_SWK_1] = 7; + } + } + if (bossSO->unk_04C > 20) { + bossSO->info.hitbox[20] = 715.0f; + bossSO->info.hitbox[22] = 110.0f; + bossSO->info.hitbox[24] = 275.0f; + } + if (bossSO->unk_04C == 10) { + func_8005F0E8(bossSO->sfxPos, &bossSO->obj.pos); + Audio_PlaySfx(0x19035053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 50) { + Audio_PlaySfx(0x29432077, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C >= 85) { + bossSO->info.hitbox[20] = 220.0f; + bossSO->info.hitbox[22] = 715.0f; + bossSO->info.hitbox[24] = 220.0f; + } + break; + case 5: + bossSO->fwork[SO_FWK_3] = 2600.0f; + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 1.0f, 1.5f, 1.0f); + if (bossSO->unk_04C == 65) { + Matrix_RotateX(gCalcMatrix, D_i3_801C2768[0] * M_DTOR, 0); + Matrix_RotateY(gCalcMatrix, D_i3_801C2768[1] * M_DTOR, 1); + sp40.x = 0.0f; + sp40.y = -200.0f; + sp40.z = 1100.0f; + Matrix_MultVec3f(gCalcMatrix, &sp40, &sp34); + for (i = 0; i < 4; i++) { + sp58.x = D_i3_801BF8F0[i].x + (2.0f * (Rand_ZeroOne() - 0.5f)); + sp58.y = 2.0f * (Rand_ZeroOne() - 0.5f); + sp58.z = (Rand_ZeroOne() * 10.0f) + 2.5f; + Matrix_MultVec3f(gCalcMatrix, &sp58, &sp4C); + func_i3_8019F038(bossSO->fwork[SO_FWK_4] + sp34.x, bossSO->fwork[SO_FWK_5] + sp34.y, + bossSO->fwork[SO_FWK_6] + sp34.z, sp4C.x, sp4C.y, sp4C.z); + } + } + if (bossSO->unk_04C == 99) { + if ((bossSO->swork[SO_SWK_2] != 0) || (bossSO->swork[SO_SWK_3] != 0)) { + func_i3_801A2C3C(bossSO); + } else { + func_i3_801A4EC0(bossSO); + } + } + break; + case 7: + if (bossSO->unk_04C < 50) { + if (bossSO->fwork[SO_FWK_31] < 22.0f) { + bossSO->fwork[SO_FWK_31] += 0.5f; + } + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + } + if ((bossSO->unk_04C >= 50) && (bossSO->unk_04C <= 100)) { + if (bossSO->fwork[SO_FWK_31] > 0.0f) { + bossSO->fwork[SO_FWK_31] -= 0.5f; + } + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + } + if (bossSO->obj.rot.y >= 360.0f) { + bossSO->obj.rot.y -= 360.0f; + Audio_PlaySfx(0x39033079, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 1) { + Audio_PlaySfx(0x39033079, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C >= 100) { + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 1.0f, 2.0f, 1.0f); + bossSO->fwork[SO_FWK_31] = 0.0f; + } + if (bossSO->unk_04C == 120) { + bossSO->swork[SO_SWK_1] = 5; + bossSO->unk_04C = 0; + bossSO->fwork[SO_FWK_0] = 0.1f; + } + break; + case 2: + if (((bossSO->unk_04C == 89) && (bossSO->actionState == 2)) || (bossSO->swork[SO_SWK_2] == 0)) { + bossSO->unk_04C = 0; + if ((bossSO->swork[SO_SWK_3] != 0) || (bossSO->swork[SO_SWK_2] != 0)) { + bossSO->swork[SO_SWK_1] = 5; + } else { + bossSO->swork[SO_SWK_1] = 7; + } + } + if (bossSO->unk_04C == 80) { + bossSO->unk_078.y += 15.0f; + bossSO->actionState++; + if (bossSO->unk_078.y >= 30.0f) { + bossSO->unk_078.y = 0.0f; + } + } + Math_SmoothStepToAngle(&bossSO->obj.rot.y, bossSO->unk_078.y, 1.0f, 1.5f, 1.0f); + if (bossSO->unk_04C >= 19) { + bossSO->info.hitbox[20] = 715.0f; + bossSO->info.hitbox[22] = 440.0f; + bossSO->info.hitbox[24] = 110.0f; + } + if (bossSO->unk_04C == 5) { + func_8005F0E8(bossSO->sfxPos, &bossSO->obj.pos); + Audio_PlaySfx(0x19035053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 20) { + Audio_PlaySfx(0x29432077, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C > 36) { + bossSO->info.hitbox[20] = 220.0f; + bossSO->info.hitbox[22] = 715.0f; + bossSO->info.hitbox[24] = 220.0f; + } + break; + } +} + +void func_i3_801A2C3C(Boss* bossSO) { + bossSO->swork[SO_SWK_0] = 2; + bossSO->swork[SO_SWK_1] = 0; + bossSO->fwork[SO_FWK_0] = 0.05f; + bossSO->unk_04C = Animation_GetFrameCount(&D_601388C) - 2; + bossSO->actionState = 0; + bossSO->swork[SO_SWK_11] = 15; +} + +void func_i3_801A2C98(Boss* bossSO) { + s32 i; + + if (bossSO->swork[SO_SWK_11] != 0) { + bossSO->swork[SO_SWK_11]--; + } + if (bossSO->actionState == 0) { + if (bossSO->swork[SO_SWK_11] == 0) { + bossSO->unk_04C -= 2; + Math_SmoothStepToF(&bossSO->obj.pos.y, -1000.0f, 0.1f, 10.0f, 0.1f); + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 181.0f, 1.0f, 3.0f, 1.0f); + if (bossSO->unk_04C == 50) { + func_i3_801A0CEC(&gActors[10], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 20.0f, 1); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 70; + } + if (bossSO->unk_04C == 60) { + for (i = 0; i < 4; i++) { + func_i3_8019F038(bossSO->obj.pos.x + 100.0f, 100.0f, bossSO->obj.pos.z + 1100.0f, + D_i3_801BF8F0[i].x + (2.0f * (Rand_ZeroOne() - 0.5f)), + D_i3_801BF8F0[i].y + 10.0f + (2.0f * (Rand_ZeroOne() - 0.5f)), + (Rand_ZeroOne() * -10.0f) - 10.0f); + func_i3_8019F038(bossSO->obj.pos.x - 100.0f, 100.0f, bossSO->obj.pos.z + 1100.0f, + D_i3_801BF8F0[i].x + (2.0f * (Rand_ZeroOne() - 0.5f)), + D_i3_801BF8F0[i].y + 10.0f + (2.0f * (Rand_ZeroOne() - 0.5f)), + (Rand_ZeroOne() * -10.0f) - 10.0f); + } + } + if (bossSO->unk_04C == 20) { + gActors[10].unk_0D0 = 3; + Audio_PlaySfx(0x19036054, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 0) { + bossSO->actionState++; + bossSO->swork[SO_SWK_11] = 100; + bossSO->obj.pos.y = -500.0f; + bossSO->fwork[SO_FWK_3] = 4800.0f; + bossSO->obj.pos.z = gPlayer[0].unk_138 - bossSO->fwork[SO_FWK_3]; + bossSO->obj.rot.y = -bossSO->obj.rot.y; + } + } else { + bossSO->unk_04C = Animation_GetFrameCount(&D_601388C) - 2; + } + } else { + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 1.0f, 1.5f, 1.0f); + if (bossSO->swork[SO_SWK_11] == 80) { + func_i3_801A0CEC(&gActors[9], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 20.0f, 1); + } + if (bossSO->swork[SO_SWK_11] == 0) { + bossSO->swork[SO_SWK_11] = 220; + } + if (bossSO->swork[SO_SWK_11] == 210) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 1; + bossSO->fwork[SO_FWK_0] = 0.05f; + } + if (bossSO->swork[SO_SWK_11] >= 100) { + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 10.0f, 0.1f); + } + if (bossSO->swork[SO_SWK_11] == 150) { + func_i3_801A3468(bossSO); + } + if (bossSO->swork[SO_SWK_11] == 50) { + gActors[9].unk_0D0 = 3; + Audio_PlaySfx(0x19036053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } +} + +void func_i3_801A30CC(Boss* bossSO) { + bossSO->swork[SO_SWK_0] = 3; + bossSO->swork[SO_SWK_1] = 0; + bossSO->fwork[SO_FWK_0] = 0.1f; + bossSO->unk_04C = Animation_GetFrameCount(&D_601388C) - 2; + bossSO->actionState = 0; + bossSO->swork[SO_SWK_11] = 15; +} + +void func_i3_801A3128(Boss* bossSO) { + if (bossSO->swork[SO_SWK_11] != 0) { + bossSO->swork[SO_SWK_11]--; + } + if (bossSO->actionState == 0) { + if (bossSO->swork[SO_SWK_11] == 0) { + bossSO->unk_04C -= 2; + Math_SmoothStepToF(&bossSO->obj.pos.y, -1000.0f, 0.1f, 10.0f, 0.1f); + if (bossSO->unk_04C == 50) { + func_i3_801A0CEC(&gActors[10], bossSO->obj.pos.x, bossSO->obj.pos.z + 2000.0f, 10.0f, 1); + } + if (bossSO->unk_04C == 40) { + gActors[10].unk_0D0 = 3; + Audio_PlaySfx(0x19036054, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 0) { + bossSO->actionState++; + bossSO->swork[SO_SWK_11] = 100; + bossSO->obj.pos.y = -500.0f; + bossSO->fwork[SO_FWK_3] = 2400.0f; + bossSO->obj.pos.z = gPlayer[0].unk_138 - 2100.0f; + } + } else { + bossSO->unk_04C = Animation_GetFrameCount(&D_601388C) - 2; + } + } else { + if (bossSO->swork[SO_SWK_11] == 80) { + func_i3_801A0CEC(&gActors[9], bossSO->obj.pos.x, bossSO->obj.pos.z + 850.0f, 20.0f, 1); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 70; + D_i3_801C2740[2]++; + if (D_i3_801C2740[2] & 1) { + if (D_i3_801C2740[2] & 2) { + if (gTeamShields[3] > 0) { + func_800BA808(gMsg_ID_20317, RCID_PEPPY); + } + } else { + if (gTeamShields[1] > 0) { + func_800BA808(gMsg_ID_20271, RCID_FALCO); + } + } + } + } + if (bossSO->swork[SO_SWK_11] == 0) { + bossSO->swork[SO_SWK_11] = 220; + } + if (bossSO->swork[SO_SWK_11] == 210) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 1; + } + if (bossSO->swork[SO_SWK_11] >= 100) { + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 20.0f, 0.1f); + } + if (bossSO->swork[SO_SWK_11] == 150) { + func_i3_801A239C(bossSO); + bossSO->fwork[SO_FWK_0] = 0.01f; + if ((Rand_ZeroOne() >= 0.4f) && (gTeamShields[3] > 0) && (bossSO->swork[SO_SWK_2] != 0) && + (bossSO->swork[SO_SWK_3] != 0)) { + func_800BA808(gMsg_ID_10320, RCID_PEPPY); + } + } + if (bossSO->swork[SO_SWK_11] == 50) { + gActors[9].unk_0D0 = 3; + Audio_PlaySfx(0x19036053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } +} + +void func_i3_801A3468(Boss* bossSO) { + bossSO->swork[SO_SWK_0] = 4; + bossSO->unk_048 = 0; + if ((bossSO->swork[SO_SWK_2] != 0) || (bossSO->swork[SO_SWK_3] != 0)) { + if (bossSO->swork[SO_SWK_3] != 0) { + bossSO->swork[SO_SWK_1] = 3; + } else { + bossSO->swork[SO_SWK_1] = 4; + } + } else { + if (Rand_ZeroOne() >= 0.5f) { + bossSO->unk_048 = 1; + bossSO->swork[SO_SWK_1] = 5; + } else { + bossSO->timer_050 = 0; + bossSO->swork[SO_SWK_1] = 8; + } + } + bossSO->unk_04C = 0; + bossSO->fwork[SO_FWK_0] = 0.01f; +} + +void func_i3_801A3510(Boss* bossSO) { + s32 i; + + switch (bossSO->swork[SO_SWK_1]) { + case 3: + if ((bossSO->unk_04C == 119) || (bossSO->swork[SO_SWK_3] == 0)) { + bossSO->unk_04C = 0; + if (bossSO->swork[SO_SWK_2] != 0) { + bossSO->swork[SO_SWK_1] = 4; + } else { + bossSO->swork[SO_SWK_1] = 5; + } + } + if (bossSO->unk_04C == 29) { + func_8005F0E8(bossSO->sfxPos, &bossSO->obj.pos); + Audio_PlaySfx(0x19035053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 80) { + Audio_PlaySfx(0x29432077, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 94) { + func_i3_801A0DF8(bossSO->fwork[SO_FWK_13], bossSO->fwork[SO_FWK_15], (Rand_ZeroOne() - 0.5f) * 60.0f, 4, + 2.0f); + bossSO->timer_050 = 90; + } + break; + case 4: + if ((bossSO->unk_04C == 99) || (bossSO->swork[SO_SWK_2] == 0)) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 5; + } + Math_SmoothStepToAngle(&bossSO->obj.rot.x, 20.0f, 0.1f, 10.0f, 0.1f); + if (bossSO->unk_04C == 10) { + func_8005F0E8(bossSO->sfxPos, &bossSO->obj.pos); + Audio_PlaySfx(0x19035053, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 50) { + Audio_PlaySfx(0x29432077, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C == 60) { + func_i3_801A0D90(bossSO->obj.pos.x, bossSO->obj.pos.z + 1600.0f, 80.0f, 2); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 100; + } + break; + case 5: + Math_SmoothStepToAngle(&bossSO->obj.rot.x, 0.0f, 0.1f, 10.0f, 0.1f); + if (bossSO->unk_04C == 65) { + for (i = 0; i < 4; i++) { + func_i3_8019F194(bossSO->obj.pos.x, bossSO->obj.pos.y + 300.0f, bossSO->obj.pos.z + 1000.0f, + D_i3_801BF8F0[i].x + ((Rand_ZeroOne() - 0.5f) * 0.25f), + D_i3_801BF8F0[i].y + ((Rand_ZeroOne() - 0.5f) * 0.25f), + (Rand_ZeroOne() * 10.0f) + 100.0f); + } + } + if ((bossSO->unk_048 != 0) && (bossSO->unk_04C == 68)) { + bossSO->swork[SO_SWK_1] = 9; + bossSO->fwork[SO_FWK_0] = 0.01f; + bossSO->unk_04C = 20; + } + if (bossSO->unk_04C == 99) { + func_i3_801A30CC(bossSO); + } + break; + case 8: + if (bossSO->unk_04C == 65) { + Audio_PlaySfx(0x31033078, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossSO->timer_050 = 30; + } + if (bossSO->timer_050 != 0) { + bossSO->unk_04C = 65; + } + if ((bossSO->unk_04C == 65) && !(gGameFrameCount & 1)) { + func_i3_8019FFC0(bossSO, bossSO->fwork[SO_FWK_4], bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 600.0f, (bossSO->timer_050 * 0.2f) + 4.0f, 0); + func_i3_801A1EB0(bossSO, bossSO->fwork[SO_FWK_4], 25.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 300.0f); + } + if (bossSO->unk_04C == 75) { + func_8001A55C(bossSO->sfxPos, 0x31033078); + } + if (bossSO->unk_04C == 99) { + bossSO->swork[SO_SWK_1] = 5; + bossSO->unk_04C = 0; + } + break; + case 9: + bossSO->unk_04C++; + if (bossSO->unk_04C == 66) { + Audio_PlaySfx(0x31033078, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossSO->timer_050 = 30; + } + if (bossSO->timer_050 != 0) { + bossSO->unk_04C = 66; + } + if ((bossSO->unk_04C == 66) && !(gGameFrameCount & 1)) { + func_i3_8019FFC0(bossSO, bossSO->fwork[SO_FWK_4] + 125.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 600.0f, (bossSO->timer_050 * 0.2f) + 4.0f, 1); + func_i3_8019FFC0(bossSO, bossSO->fwork[SO_FWK_4] - 125.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 600.0f, (bossSO->timer_050 * 0.2f) + 4.0f, 2); + func_i3_801A1EB0(bossSO, bossSO->fwork[SO_FWK_4], 25.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 300.0f); + } + if (bossSO->unk_04C == 76) { + func_8001A55C(bossSO->sfxPos, 0x31033078); + } + if (bossSO->unk_04C >= 99) { + func_i3_801A30CC(bossSO); + } + break; + } + if (bossSO->timer_050 == 0) { + Object_Kill(&gActors[6].obj, gActors[6].sfxPos); + } else { + Math_SmoothStepToF(&gActors[6].obj.pos.x, gPlayer[0].pos.x, 0.1f, 10.0f, 0.1f); + } +} + +void func_i3_801A3C4C(Boss* bossSO) { + s32 i; + + if ((bossSO->swork[SO_SWK_2] == 0) && (bossSO->swork[SO_SWK_3] == 0) && + ((bossSO->dmgPart == 8) || (bossSO->dmgPart == -1))) { + bossSO->health -= bossSO->damage; + if (bossSO->health < 0) { + bossSO->health = 0; + } + + bossSO->swork[SO_SWK_10] = 20; + if (bossSO->health > 0.0f) { + Audio_PlaySfx(0x29433074, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO) {} + } + bossSO->timer_058 = 20; + if ((bossSO->dmgPart >= 1) && (bossSO->dmgPart <= 3) && (bossSO->swork[SO_SWK_2] != 0)) { + Audio_PlaySfx(0x29433074, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossSO->swork[SO_SWK_2] -= bossSO->damage; + if (bossSO->swork[SO_SWK_2] < 0) { + bossSO->swork[SO_SWK_2] = 0; + } + if (bossSO->swork[SO_SWK_2] == 0) { + for (i = 0; i < 6; i++) { + bossSO->info.hitbox[7 + i] = bossSO->info.hitbox[13 + i] = bossSO->info.hitbox[19 + i] = 0.0f; + } + bossSO->swork[SO_SWK_2] = -1; + func_i3_801A48B8(bossSO); + } else { + bossSO->swork[SO_SWK_8] = 20; + } + } + if ((bossSO->dmgPart >= 4) && (bossSO->dmgPart <= 6) && (bossSO->swork[SO_SWK_3] != 0)) { + Audio_PlaySfx(0x29433074, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossSO->swork[SO_SWK_3] -= bossSO->damage; + if (bossSO->swork[SO_SWK_3] < 0) { + bossSO->swork[SO_SWK_3] = 0; + } + if (bossSO->swork[SO_SWK_3] == 0) { + for (i = 0; i < 6; i++) { + bossSO->info.hitbox[25 + i] = bossSO->info.hitbox[31 + i] = bossSO->info.hitbox[37 + i] = 0.0f; + } + bossSO->swork[SO_SWK_3] = -1; + func_i3_801A48B8(bossSO); + } else { + bossSO->swork[SO_SWK_9] = 20; + } + } + if (bossSO->health <= 0) { + bossSO->unk_04C = 21; + bossSO->actionState = 0; + bossSO->swork[SO_SWK_1] = 1; + bossSO->fwork[SO_FWK_0] = 0.01f; + bossSO->info.hitbox = SEGMENTED_TO_VIRTUAL(D_800CBF34); + bossSO->timer_058 = 20000; + D_8017796C = -1; + D_80178348 = D_80178350 = D_80178354 = D_80178340 = 255; + D_80178358 = 0; + D_8017835C = 255; + gCsFrameCount = 0; + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 10; + func_800182F4(0x100100FF); + func_800182F4(0x110100FF); + func_8001A838(0x4100C023); + Audio_PlaySfx(0x2940D09A, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_3) { + gPlayer[0].state_1C8 = PLAYERSTATE_1C8_7; + gPlayer[0].timer_1F8 = 0; + gPlayer[0].unk_1D0 = gPlayer[0].timer_1F8; + gPlayer[0].unk_0E8 += gPlayer[0].unk_114; + if (gPlayer[0].unk_0E8 > 360.0f) { + gPlayer[0].unk_0E8 -= 360.0f; + } + if (gPlayer[0].unk_0E8 < 0.0f) { + gPlayer[0].unk_0E8 += 360.0f; + } + gPlayer[0].unk_114 = 0.0f; + } + bossSO->fwork[SO_FWK_31] = 0.0f; + bossSO->fwork[SO_FWK_3] = 2400.0f; + func_800BA808(gMsg_ID_15252, RCID_SLIPPY); + } +} + +void func_i3_801A4214(Boss* bossSO) { + s32 i; + Vec3f sp50; + Vec3f sp44; + + if (bossSO->health > 0) { + return; + } + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToAngle(&bossSO->obj.rot.x, 0.0f, 0.1f, 3.0f, 0.0f); + if ((bossSO->unk_04C == 52) && (bossSO->swork[SO_SWK_1] == 5)) { + bossSO->unk_04C = 38; + bossSO->fwork[SO_FWK_0] = 0.05f; + } + Matrix_RotateX(gCalcMatrix, bossSO->fwork[SO_FWK_1] * M_DTOR, 0); + Matrix_RotateY(gCalcMatrix, -bossSO->fwork[SO_FWK_2] * M_DTOR, 1); + sp50.x = 0.0f; + sp50.y = 200.0f; + sp50.z = 1100.0f; + Matrix_MultVec3f(gCalcMatrix, &sp50, &sp44); + if (bossSO->actionState >= 2) { + Math_SmoothStepToF(&D_801779A8[gMainController], 30.0f, 1.0f, 2.5f, 0.0f); + } + switch (bossSO->actionState) { + case 0: + if (D_i3_801C2740[0] >= 33) { + D_i3_801C2740[0] -= 3; + } + if (bossSO->timer_058 == 19910) { + bossSO->actionState++; + bossSO->swork[SO_SWK_1] = 5; + bossSO->unk_04C = 0; + bossSO->fwork[SO_FWK_0] = 0.05f; + } + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 10.0f, 0.1f); + break; + case 1: + if (bossSO->unk_04C == 51) { + bossSO->unk_04C = 50; + bossSO->actionState++; + gShowBossHealth = false; + Audio_PlaySfx(0x39439076, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + func_i3_801A1E14(bossSO->fwork[SO_FWK_4], bossSO->fwork[SO_FWK_5] + 300.0f, bossSO->fwork[SO_FWK_6], + bossSO->fwork[SO_FWK_1], bossSO->fwork[SO_FWK_2], 73.0f, + (Rand_ZeroOne() - 0.5f) * 50.0f, 80.0f, 40.0f, 8); + D_i3_801C2768[3] = 6.0f; + D_i3_801C2768[2] = 100.0f; + D_80178340 = 255; + D_80178348 = 255; + D_80178350 = 255; + D_80178354 = 255; + D_80178358 = 0; + D_8017835C = 4; + func_80042EC0(bossSO); + bossSO->swork[SO_SWK_4]++; + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 10.0f, 0.1f); + } + break; + case 2: + if (D_i3_801C2740[0] >= 33) { + D_i3_801C2740[0] -= 3; + } + if (D_i3_801C2740[1] >= 33) { + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 10.0f, 0.1f); + D_i3_801C2740[1] -= 4; + } else { + bossSO->actionState++; + } + break; + case 3: + if ((gCsFrameCount >= 205) && (D_i3_801C2768[5] < 1.0f)) { + D_i3_801C2768[5] += 0.1f; + } + if ((gCsFrameCount >= 207) && (D_i3_801C2768[9] < 1.0f)) { + D_i3_801C2768[9] += 0.1f; + } + if ((gCsFrameCount >= 209) && (D_i3_801C2768[10] < 1.0f)) { + D_i3_801C2768[10] += 0.1f; + } + if ((gCsFrameCount >= 211) && (D_i3_801C2768[7] < 1.0f)) { + D_i3_801C2768[7] += 0.1f; + } + if ((gCsFrameCount >= 213) && (D_i3_801C2768[8] < 1.0f)) { + D_i3_801C2768[8] += 0.1f; + } + if ((gCsFrameCount >= 215) && (D_i3_801C2768[11] < 1.0f)) { + D_i3_801C2768[11] += 0.1f; + } + if ((gCsFrameCount >= 217) && (D_i3_801C2768[12] < 1.0f)) { + D_i3_801C2768[12] += 0.1f; + } + if ((gCsFrameCount >= 219) && (D_i3_801C2768[4] < 1.0f)) { + D_i3_801C2768[4] += 0.1f; + } + if ((gCsFrameCount >= 221) && (D_i3_801C2768[6] < 1.0f)) { + D_i3_801C2768[6] += 0.2f; + } + if ((gCsFrameCount >= 226) && (D_i3_801C2768[13] < 380.0f)) { + D_i3_801C2768[13] += 30.0f; + } + if (gCsFrameCount >= 238) { + D_i3_801C2768[13] = 0.0f; + } + if (gCsFrameCount == 230) { + Audio_PlaySfx(0x2940F026, gActors[5].sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_801779A8[gMainController] = 120.0f; + } + if (gCsFrameCount == 250) { + bossSO->actionState++; + bossSO->obj.pos.y = -1600.0f; + for (i = 0; i < 2; i++) { + if (gEffects[i].obj.status != OBJ_FREE) { + Object_Kill(&gEffects[i].obj, gEffects[i].sfxPos); + } + } + bossSO->timer_058 = 100; + } + break; + case 4: + if (bossSO->timer_058 == 1) { + func_800182F4(0x105000FF); + func_800182F4(0x115000FF); + Object_Kill(&bossSO->obj, bossSO->sfxPos); + } + break; + } +} + +void func_i3_801A48B8(Boss* bossSO) { + s32 i; + + Audio_PlaySfx(0x29434075, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 10; + if (bossSO->swork[SO_SWK_0] != 6) { + bossSO->swork[SO_SWK_5] = bossSO->swork[SO_SWK_0]; + bossSO->swork[SO_SWK_6] = bossSO->swork[SO_SWK_1]; + bossSO->swork[SO_SWK_7] = bossSO->unk_04C; + } + if ((bossSO->swork[SO_SWK_0] == 4) && (bossSO->unk_04C >= 60) && (bossSO->unk_04C < 67)) { + for (i = 4; i < 60; i++) { + if (gActors[i].obj.id == OBJ_ACTOR_278) { + gActors[i].unk_0D0 = 2; + break; + } + } + } + D_80178348 = D_80178350 = D_80178354 = D_80178340 = 255; + D_80178358 = 0; + D_8017835C = 64; + bossSO->swork[SO_SWK_0] = 6; + bossSO->swork[SO_SWK_1] = 6; + bossSO->unk_04C = 0; + bossSO->fwork[SO_FWK_0] = 0.01f; + if (((bossSO->swork[SO_SWK_2] > 0) || (bossSO->swork[SO_SWK_3] > 0)) && (gTeamShields[2] > 0)) { + func_800BA808(gMsg_ID_7086, RCID_SLIPPY); + } +} + +void func_i3_801A4A34(Boss* bossSO) { + if (bossSO->swork[SO_SWK_2] < 0) { + bossSO->swork[SO_SWK_2] = 0; + func_i3_801A1E14(bossSO->fwork[SO_FWK_28], bossSO->fwork[SO_FWK_29], bossSO->fwork[SO_FWK_30], + bossSO->fwork[SO_FWK_41], bossSO->fwork[SO_FWK_42], bossSO->fwork[SO_FWK_43], + (Rand_ZeroOne() * -25.0f) - 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 0); + func_i3_801A1E14(bossSO->fwork[SO_FWK_22], bossSO->fwork[SO_FWK_23], bossSO->fwork[SO_FWK_24], + bossSO->fwork[SO_FWK_47], bossSO->fwork[SO_FWK_48], bossSO->fwork[SO_FWK_49], + (Rand_ZeroOne() * -25.0f) - 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 1); + func_i3_801A1E14(bossSO->fwork[SO_FWK_10], bossSO->fwork[SO_FWK_11], bossSO->fwork[SO_FWK_12], + bossSO->fwork[SO_FWK_35], bossSO->fwork[SO_FWK_36], bossSO->fwork[SO_FWK_37], + (Rand_ZeroOne() * -25.0f) - 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 2); + } + if (bossSO->swork[SO_SWK_3] < 0) { + bossSO->swork[SO_SWK_3] = 0; + func_i3_801A1E14(bossSO->fwork[SO_FWK_25], bossSO->fwork[SO_FWK_26], bossSO->fwork[SO_FWK_27], + bossSO->fwork[SO_FWK_38], bossSO->fwork[SO_FWK_39], bossSO->fwork[SO_FWK_40], + (Rand_ZeroOne() * 25.0f) + 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 5); + func_i3_801A1E14(bossSO->fwork[SO_FWK_19], bossSO->fwork[SO_FWK_20], bossSO->fwork[SO_FWK_21], + bossSO->fwork[SO_FWK_44], bossSO->fwork[SO_FWK_45], bossSO->fwork[SO_FWK_46], + (Rand_ZeroOne() * 25.0f) + 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 4); + func_i3_801A1E14(bossSO->fwork[SO_FWK_7], bossSO->fwork[SO_FWK_8], bossSO->fwork[SO_FWK_9], + bossSO->fwork[SO_FWK_32], bossSO->fwork[SO_FWK_33], bossSO->fwork[SO_FWK_34], + (Rand_ZeroOne() * 25.0f) + 10.0f, (Rand_ZeroOne() * 25.0f) + 30.0f, + ((Rand_ZeroOne() - 0.5f) * 25.0f) - 50.0f, 3); + } + switch (bossSO->unk_04C) { + case 30: + Audio_PlaySfx(0x29433074, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + /* fallthrough */ + case 35: + case 97: + Audio_PlaySfx(0x29434075, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + if (bossSO->unk_04C == 119) { + bossSO->swork[SO_SWK_0] = bossSO->swork[SO_SWK_5]; + bossSO->swork[SO_SWK_1] = bossSO->swork[SO_SWK_6]; + if ((bossSO->swork[SO_SWK_5] == 2) || (bossSO->swork[SO_SWK_5] == 3)) { + bossSO->unk_04C = bossSO->swork[SO_SWK_7]; + } else { + bossSO->unk_04C = 0; + } + bossSO->fwork[SO_FWK_0] = 0.01f; + } +} + +void func_i3_801A4EC0(Boss* bossSO) { + bossSO->swork[SO_SWK_0] = 7; + bossSO->swork[SO_SWK_1] = 5; + bossSO->fwork[SO_FWK_0] = 0.01f; + bossSO->unk_04C = 0; + bossSO->actionState = 0; + bossSO->fwork[SO_FWK_31] = bossSO->obj.rot.y = 0.0f; +} + +void func_i3_801A4EF8(Boss* bossSO) { + s32 i; + + if (bossSO->swork[SO_SWK_11] != 0) { + bossSO->swork[SO_SWK_11]--; + } + switch (bossSO->actionState) { + case 0: + bossSO->unk_04C = 0; + if (bossSO->fwork[SO_FWK_31] > 20.0f) { + bossSO->actionState++; + bossSO->swork[SO_SWK_11] = 108; + bossSO->fwork[SO_FWK_0] = 0.01f; + bossSO->unk_04C = 56; + } + if (bossSO->obj.rot.y == 0.0f) { + Audio_PlaySfx(0x39033079, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + bossSO->fwork[SO_FWK_31] += 0.5f; + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + if (bossSO->obj.rot.y >= 360.0f) { + bossSO->obj.rot.y -= 360.0f; + Audio_PlaySfx(0x39033079, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + bossSO->unk_078.y = bossSO->obj.rot.y; + break; + case 1: + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + bossSO->unk_04C = 56; + if (bossSO->obj.rot.y >= 360.0f) { + bossSO->obj.rot.y -= 360.0f; + Audio_PlaySfx(0x39033079, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->swork[SO_SWK_11] <= 45) { + Math_SmoothStepToF(&bossSO->obj.pos.y, -1000.0f, 0.1f, 20.0f, 0.1f); + } + if (bossSO->swork[SO_SWK_11] == 30) { + func_i3_801A0CEC(&gActors[10], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 20.0f, 1); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 70; + for (i = 0; i < 4; i++) { + func_i3_8019F038(bossSO->obj.pos.x + 100.0f, 100.0f, bossSO->obj.pos.z + 1100.0f, + D_i3_801BF8F0[i].x + (2.0f * (Rand_ZeroOne() - 0.5f)), + D_i3_801BF8F0[i].y + 10.0f + (2.0f * (Rand_ZeroOne() - 0.5f)), + (Rand_ZeroOne() * -10.0f) - 10.0f); + func_i3_8019F038(bossSO->obj.pos.x - 100.0f, 100.0f, bossSO->obj.pos.z + 1100.0f, + D_i3_801BF8F0[i].x + (2.0f * (Rand_ZeroOne() - 0.5f)), + D_i3_801BF8F0[i].y + 10.0f + (2.0f * (Rand_ZeroOne() - 0.5f)), + (Rand_ZeroOne() * -10.0f) - 10.0f); + } + } + if (bossSO->swork[SO_SWK_11] == 16) { + gActors[10].unk_0D0 = 2; + } + if (bossSO->obj.pos.y <= -900.0f) { + bossSO->actionState++; + bossSO->swork[SO_SWK_11] = 500; + bossSO->obj.pos.y = -1500.0f; + bossSO->fwork[SO_FWK_3] = 4800.0f; + bossSO->obj.pos.z = gPlayer[0].unk_138 - bossSO->fwork[SO_FWK_3]; + bossSO->swork[SO_SWK_1] = 0; + bossSO->unk_078.y = bossSO->obj.rot.y = 0.0f; + bossSO->vel.y = 0.0f; + bossSO->obj.rot.x = 0.0f; + } + bossSO->unk_078.y = bossSO->obj.rot.y; + break; + case 2: + bossSO->unk_04C = 0; + if (bossSO->swork[SO_SWK_11] == 300) { + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 170; + D_80178480 = 130; + } + if (bossSO->swork[SO_SWK_11] == 200) { + func_i3_801A0CEC(&gActors[9], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 20.0f, 1); + } + if (bossSO->swork[SO_SWK_11] < 200) { + bossSO->unk_04C = 98; + bossSO->unk_078.y += bossSO->fwork[SO_FWK_31]; + if (bossSO->swork[SO_SWK_11] == 170) { + Audio_PlaySfx(0x29432073, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + bossSO->obj.pos.y = -500.0f; + gActors[9].unk_0D0 = 2; + } + if (bossSO->swork[SO_SWK_11] <= 170) { + bossSO->vel.y = __cosf(bossSO->obj.rot.x * M_DTOR) * 80.0f; + bossSO->vel.z = (__sinf(bossSO->obj.rot.x * M_DTOR) * 30.0f) + gPlayer[0].vel.z; + } + if (bossSO->obj.rot.x < 190.0f) { + bossSO->obj.rot.x += 1.0f; + } + if (bossSO->swork[SO_SWK_11] == 50) { + func_i3_801A0CEC(&gActors[10], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 80.0f, 2); + D_80137E84[gMainController] = 1; + D_Timer_80177BD0[gMainController] = 100; + D_80178480 = 10; + } + if (bossSO->obj.pos.y < -1500.0f) { + bossSO->actionState++; + bossSO->swork[SO_SWK_11] = 100; + bossSO->obj.pos.y = -500.0f; + bossSO->fwork[SO_FWK_3] = 4800.0f; + bossSO->obj.pos.z = gPlayer[0].unk_138 - bossSO->fwork[SO_FWK_3]; + bossSO->unk_04C = 0; + bossSO->obj.rot.x = 0.0f; + bossSO->fwork[SO_FWK_31] = bossSO->vel.y = bossSO->vel.z = 0.0f; + bossSO->obj.rot.y = 330.0f; + } + } + break; + case 3: + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 1.0f, 1.5f, 1.0f); + if (bossSO->swork[SO_SWK_11] == 65) { + func_i3_801A0CEC(&gActors[9], bossSO->obj.pos.x, bossSO->obj.pos.z + 1000.0f, 20.0f, 1); + } + if (bossSO->swork[SO_SWK_11] == 0) { + bossSO->swork[SO_SWK_11] = 220; + } + if (bossSO->swork[SO_SWK_11] == 210) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1] = 1; + } + if (bossSO->swork[SO_SWK_11] >= 100) { + Math_SmoothStepToF(&bossSO->obj.pos.y, 180.0f, 0.1f, 10.0f, 0.1f); + } + if (bossSO->swork[SO_SWK_11] == 150) { + func_i3_801A3468(bossSO); + bossSO->fwork[SO_FWK_0] = 0.01f; + } + if (bossSO->swork[SO_SWK_11] == 50) { + gActors[9].unk_0D0 = 2; + } + break; + } +} + +void func_i3_801A56B8(Boss* bossSO) { + switch (bossSO->swork[SO_SWK_1]) { + case 2: + if (((bossSO->unk_04C == 89) && (bossSO->actionState == 2)) || (bossSO->swork[SO_SWK_2] == 0)) { + bossSO->unk_04C = 0; + bossSO->actionState = 0; + bossSO->unk_078.y = 0.0f; + } + if (bossSO->unk_04C == 89) { + bossSO->actionState++; + bossSO->unk_078.y += 15.0f; + } + Math_SmoothStepToAngle(&bossSO->obj.rot.y, bossSO->unk_078.y, 1.0f, 3.0f, 1.0f); + if (bossSO->unk_04C > 18) { + bossSO->info.hitbox[20] = 715.0f; + bossSO->info.hitbox[22] = 440.0f; + bossSO->info.hitbox[24] = 110.0f; + } + if (bossSO->unk_04C > 36) { + bossSO->info.hitbox[20] = 220.0f; + bossSO->info.hitbox[22] = 715.0f; + bossSO->info.hitbox[24] = 220.0f; + } + break; + case 4: + if ((bossSO->unk_04C == 99) || (bossSO->swork[SO_SWK_2] == 0)) { + bossSO->unk_04C = 0; + if ((bossSO->swork[SO_SWK_3] != 0) || (bossSO->swork[SO_SWK_2] != 0)) { + bossSO->swork[SO_SWK_1] = 5; + } else { + bossSO->swork[SO_SWK_1] = 7; + } + } + if (bossSO->unk_04C > 20) { + bossSO->info.hitbox[20] = 715.0f; + bossSO->info.hitbox[22] = 110.0f; + bossSO->info.hitbox[24] = 275.0f; + } + if (bossSO->unk_04C > 84) { + bossSO->info.hitbox[20] = 220.0f; + bossSO->info.hitbox[22] = 715.0f; + bossSO->info.hitbox[24] = 220.0f; + } + break; + case 5: + bossSO->fwork[SO_FWK_3] = 4800.0f; + if (bossSO->unk_04C == 65) { + bossSO->timer_050 = 30; + } + if (bossSO->timer_050 != 0) { + bossSO->unk_04C = 65; + } + if ((bossSO->unk_04C == 65) && !(gGameFrameCount & 3)) { + func_i3_8019FFC0(bossSO, bossSO->fwork[SO_FWK_4] + 125.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 600.0f, ((f32) bossSO->timer_050 * 0.2f) + 4.0f, 1); + func_i3_8019FFC0(bossSO, bossSO->fwork[SO_FWK_4] - 125.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 600.0f, ((f32) bossSO->timer_050 * 0.2f) + 4.0f, 2); + func_i3_801A1EB0(bossSO, bossSO->fwork[SO_FWK_4], 25.0f, bossSO->fwork[SO_FWK_5] - 100.0f, + bossSO->fwork[SO_FWK_6] + 300.0f); + } + break; + case 7: + if (bossSO->unk_04C < 50) { + if (bossSO->fwork[SO_FWK_31] < 22.0f) { + bossSO->fwork[SO_FWK_31] += 0.5f; + } + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + } + if ((bossSO->unk_04C >= 50) && (bossSO->unk_04C <= 100)) { + if (bossSO->fwork[SO_FWK_31] > 0.0f) { + bossSO->fwork[SO_FWK_31] -= 0.5f; + } + bossSO->obj.rot.y += bossSO->fwork[SO_FWK_31]; + } + if (bossSO->unk_04C >= 100) { + Math_SmoothStepToAngle(&bossSO->obj.rot.y, 0.0f, 1.0f, 2.0f, 1.0f); + bossSO->fwork[SO_FWK_31] = 0.0f; + } + if (bossSO->unk_04C == 120) { + bossSO->swork[SO_SWK_1] = 5; + bossSO->unk_04C = 0; + bossSO->fwork[SO_FWK_0] = 0.1f; + } + break; + } +} + +BossSOfunc D_i3_801BF980[9] = { + func_i3_801A1F80, func_i3_801A23F4, func_i3_801A2C98, func_i3_801A3128, func_i3_801A3510, + func_i3_801A4214, func_i3_801A4A34, func_i3_801A4EF8, func_i3_801A56B8, +}; + +void func_i3_801A5B3C(Boss* bossSO) { + f32 sp1CC; + f32 sp1C8; + f32 sp1C4; + f32 sp1C0; + s32 sp1BC; + s32 sp1B8; + Vec3f sp50[30]; + Vec3f sp44; + Vec3f sp38; + + gBossFrameCount++; + + if (bossSO->swork[SO_SWK_9] != 0) { + bossSO->swork[SO_SWK_9]--; + } + if (bossSO->swork[SO_SWK_8] != 0) { + bossSO->swork[SO_SWK_8]--; + } + if (bossSO->swork[SO_SWK_10] != 0) { + bossSO->swork[SO_SWK_10]--; + } + if ((gBossFrameCount == 200) && (gTeamShields[1] != 0)) { + func_800BA808(gMsg_ID_10310, RCID_FALCO); + } + if ((gBossFrameCount == 300) && (gTeamShields[2] != 0)) { + func_800BA808(gMsg_ID_4092, RCID_SLIPPY); + } + if ((gBossFrameCount == 450) && (gTeamShields[3] != 0)) { + func_800BA808(gMsg_ID_10320, RCID_PEPPY); + } + if (bossSO->health != 0) { + Math_SmoothStepToF(&bossSO->obj.pos.z, gPlayer[0].unk_138 - bossSO->fwork[SO_FWK_3], 1.0f, 60.0f, 1.0f); + } else { + Math_SmoothStepToF(&bossSO->obj.pos.z, -(D_80177D20 + 2600.0f), 1.0f, 40.0f, 1.0f); + } + if (bossSO->swork[SO_SWK_2] != 0) { + bossSO->info.hitbox[7] = bossSO->fwork[SO_FWK_12] - bossSO->obj.pos.z; + bossSO->info.hitbox[9] = bossSO->fwork[SO_FWK_11] - bossSO->obj.pos.y; + bossSO->info.hitbox[11] = bossSO->fwork[SO_FWK_10] - bossSO->obj.pos.x; + bossSO->info.hitbox[13] = bossSO->fwork[SO_FWK_24] - bossSO->obj.pos.z; + bossSO->info.hitbox[15] = bossSO->fwork[SO_FWK_23] - bossSO->obj.pos.y; + bossSO->info.hitbox[17] = bossSO->fwork[SO_FWK_22] - bossSO->obj.pos.x; + Matrix_RotateY(gCalcMatrix, -bossSO->obj.rot.y * M_DTOR, 0); + sp44.x = bossSO->fwork[SO_FWK_28] - bossSO->obj.pos.x; + sp44.y = bossSO->fwork[SO_FWK_29] - bossSO->obj.pos.y; + sp44.z = bossSO->fwork[SO_FWK_30] - bossSO->obj.pos.z; + Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38); + bossSO->info.hitbox[19] = sp38.z; + bossSO->info.hitbox[21] = sp38.y; + bossSO->info.hitbox[23] = sp38.x; + } + if (bossSO->swork[SO_SWK_3] != 0) { + bossSO->info.hitbox[25] = bossSO->fwork[SO_FWK_9] - bossSO->obj.pos.z; + bossSO->info.hitbox[27] = bossSO->fwork[SO_FWK_8] - bossSO->obj.pos.y; + bossSO->info.hitbox[29] = bossSO->fwork[SO_FWK_7] - bossSO->obj.pos.x; + bossSO->info.hitbox[31] = bossSO->fwork[SO_FWK_21] - bossSO->obj.pos.z; + bossSO->info.hitbox[33] = bossSO->fwork[SO_FWK_20] - bossSO->obj.pos.y; + bossSO->info.hitbox[35] = bossSO->fwork[SO_FWK_19] - bossSO->obj.pos.x; + bossSO->info.hitbox[37] = bossSO->fwork[SO_FWK_27] - bossSO->obj.pos.z; + bossSO->info.hitbox[39] = bossSO->fwork[SO_FWK_26] - bossSO->obj.pos.y; + bossSO->info.hitbox[41] = bossSO->fwork[SO_FWK_25] - bossSO->obj.pos.x; + } + if (!(gGameFrameCount & 7) && (bossSO->fwork[SO_FWK_3] < 4800.0f)) { + if (func_800A73E4(&sp1C0, &sp1B8, bossSO->obj.pos.x, bossSO->obj.pos.y - 160.0f, bossSO->obj.pos.z)) { + func_i3_801A1EB0(bossSO, bossSO->obj.pos.x, 50.0f, sp1C0 - 170.0f, bossSO->obj.pos.z + 100.0f); + } + if ((bossSO->swork[SO_SWK_2] != 0) && func_800A73E4(&sp1C0, &sp1B8, bossSO->fwork[SO_FWK_16], + bossSO->fwork[SO_FWK_17], bossSO->fwork[SO_FWK_18])) { + func_i3_801A1EB0(bossSO, bossSO->fwork[SO_FWK_16], 50.0f, sp1C0 - 150.f, bossSO->fwork[SO_FWK_18] + 150.0f); + } + if ((bossSO->swork[SO_SWK_3] != 0) && func_800A73E4(&sp1C0, &sp1B8, bossSO->fwork[SO_FWK_13], + bossSO->fwork[SO_FWK_14], bossSO->fwork[SO_FWK_15])) { + func_i3_801A1EB0(bossSO, bossSO->fwork[SO_FWK_13], 50.0f, sp1C0 - 150.0f, + bossSO->fwork[SO_FWK_15] + 150.0f); + } + } + if ((!(gGameFrameCount & 3) || (bossSO->fwork[SO_FWK_31] != 0.0f)) && + ((bossSO->swork[SO_SWK_0] != 7) || !(gGameFrameCount & 1))) { + if ((bossSO->swork[SO_SWK_2] == 0) && ((bossSO->health > 0) || (bossSO->actionState < 2))) { + func_i3_8019FF44(bossSO, bossSO->fwork[SO_FWK_10], bossSO->fwork[SO_FWK_11], bossSO->fwork[SO_FWK_12], + bossSO->fwork[SO_FWK_31] - 20.0f, -1.0f); + } + if ((bossSO->swork[SO_SWK_3] == 0) && ((bossSO->health > 0) || (bossSO->actionState < 2))) { + func_i3_8019FF44(bossSO, bossSO->fwork[SO_FWK_7], bossSO->fwork[SO_FWK_8], bossSO->fwork[SO_FWK_9], + bossSO->fwork[SO_FWK_31] - 20.0f, 1.0f); + } + } + Math_SmoothStepToF(bossSO->fwork, 1.0f, 0.01f, 0.01f, 0.0f); + if ((bossSO->health > 0) || (bossSO->swork[SO_SWK_0] == 0)) { + D_i3_801BF980[bossSO->swork[SO_SWK_0]](bossSO); + } + if (bossSO->timer_058 != 0) { + func_i3_801A4214(bossSO); + } + switch (bossSO->swork[SO_SWK_1]) { + case 0: + bossSO->unk_04C++; + if (bossSO->unk_04C == 75) { + Audio_PlaySfx(0x29432073, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_601388C)) { + if (bossSO->health != 0) { + bossSO->unk_04C = 0; + bossSO->swork[SO_SWK_1]++; + bossSO->fwork[SO_FWK_0] = 0.01f; + } else { + bossSO->unk_04C = Animation_GetFrameCount(&D_601388C) - 1; + } + } + sp1BC = Animation_GetFrameData(&D_601388C, bossSO->unk_04C, sp50); + break; + case 1: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_600D3DC)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_600D3DC, bossSO->unk_04C, sp50); + break; + case 2: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_600E2C4)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_600E2C4, bossSO->unk_04C, sp50); + break; + case 3: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_600F744)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_600F744, bossSO->unk_04C, sp50); + break; + case 4: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_600C15C)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_600C15C, bossSO->unk_04C, sp50); + break; + case 5: + case 8: + case 9: + bossSO->unk_04C++; + if ((bossSO->unk_04C == 45) && (bossSO->health != 0)) { + Audio_PlaySfx(0x29432073, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_6012C00_Anim)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_6012C00_Anim, bossSO->unk_04C, sp50); + break; + case 6: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_600B1B4)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_600B1B4, bossSO->unk_04C, sp50); + break; + case 7: + bossSO->unk_04C++; + if (bossSO->unk_04C >= Animation_GetFrameCount(&D_6009D30)) { + bossSO->unk_04C = 0; + } + sp1BC = Animation_GetFrameData(&D_6009D30, bossSO->unk_04C, sp50); + break; + } + Matrix_RotateZ(gCalcMatrix, -bossSO->vwork[SO_VWK_29].z * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -bossSO->vwork[SO_VWK_29].x * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, -bossSO->vwork[SO_VWK_29].y * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, -bossSO->obj.rot.z * M_DTOR, 1); + Matrix_RotateX(gCalcMatrix, -bossSO->obj.rot.x * M_DTOR, 1); + Matrix_RotateY(gCalcMatrix, -bossSO->obj.rot.y * M_DTOR, 1); + if ((bossSO->health > 0) && (bossSO->swork[SO_SWK_0] == 1)) { + sp44.x = gPlayer[0].pos.x - bossSO->obj.pos.x; + sp44.y = gPlayer[0].pos.y - bossSO->obj.pos.y; + sp44.z = gPlayer[0].pos.z - bossSO->obj.pos.z; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp44, &sp38); + sp1C4 = Math_RadToDeg(Math_Atan2F(sp38.x, sp38.z)); + sp1CC = sqrtf(SQ(sp38.x) + SQ(sp38.z)); + sp1C8 = Math_RadToDeg(-Math_Atan2F(sp38.y, sp1CC)); + if ((sp1C8 > 30.0f) && (sp1C8 <= 180.0f)) { + sp1C8 = 30.0f; + } + if ((sp1C8 < 330.0f) && (sp1C8 > 180.0f)) { + sp1C8 = 330.0f; + } + if ((sp1C4 > 40.0f) && (sp1C4 <= 180.0f)) { + sp1C4 = 40.0f; + } + if ((sp1C4 < 320.0f) && (sp1C4 > 180.0f)) { + sp1C4 = 320.0f; + } + Math_SmoothStepToAngle(&D_i3_801C2768[1], sp1C4, 0.2f, 4.0f, 0.1f); + Math_SmoothStepToAngle(&D_i3_801C2768[0], sp1C8, 0.2f, 4.0f, 0.1f); + } else { + Math_SmoothStepToAngle(&D_i3_801C2768[1], 0.0f, 0.2f, 4.0f, 0.1f); + Math_SmoothStepToAngle(&D_i3_801C2768[0], 0.0f, 0.2f, 4.0f, 0.1f); + } + Math_SmoothStepToVec3fArray(sp50, bossSO->vwork, 1, sp1BC, bossSO->fwork[SO_FWK_0], 100.0f, 0.0f); + if ((bossSO->dmgType != DMG_NONE) && (bossSO->health > 0)) { + bossSO->dmgType = DMG_NONE; + Audio_PlaySfx(0x29121007, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + if (!((bossSO->swork[SO_SWK_0] == 0) || (bossSO->swork[SO_SWK_0] == 2) || (bossSO->swork[SO_SWK_0] == 3) || + (bossSO->swork[SO_SWK_0] == 6) || ((bossSO->swork[SO_SWK_0] == 7) && (bossSO->actionState == 2)))) { + func_i3_801A3C4C(bossSO); + } + } + if (gBossFrameCount == 400) { + gShowBossHealth = true; + } + if (gBossFrameCount >= 400) { + gBossHealthBar = (bossSO->health + bossSO->swork[SO_SWK_2] + bossSO->swork[SO_SWK_3]) * (255.0f / 1400.0f); + } +} + +s32 func_i3_801A68A8(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { + Boss* this = thisx; + Vec3f sp58 = { 0.0f, 0.0f, 0.0f }; + Vec3f sp4C = { 10.0f, 0.0f, 0.0f }; + Vec3f sp40 = { -10.0f, 0.0f, 0.0f }; + + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, D_i3_801C2740[1], D_i3_801C2740[0], D_i3_801C2740[0], 255); + if (this->fwork[SO_FWK_3] < 4800.0f) { + RCP_SetupDL_30(64, 32, 32, gFogAlpha, gFogNear, gFogFar); + } else { + RCP_SetupDL_30(16, 16, 16, gFogAlpha, gFogNear, gFogFar); + } + switch (limbIndex) { + case 11: + rot->y -= D_i3_801C2768[1]; + rot->z += D_i3_801C2768[0]; + /* fallthrough */ + case 1: + if (this->swork[SO_SWK_4] != 0) { + *dList = NULL; + } else if (this->swork[SO_SWK_10] != 0) { + if (this->swork[SO_SWK_10] & 1) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 32, 32, 128, 255); + rot->z += 3.0f; + } else { + rot->z -= 3.0f; + } + } + break; + case 2: + case 3: + case 4: + if (this->swork[SO_SWK_2] == 0) { + *dList = NULL; + } + if ((this->swork[SO_SWK_8] & 1) != 0) { + if ((this->swork[SO_SWK_8] & 1) != 0) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 32, 32, 128, 255); + rot->y += 3.0f; + } else { + rot->y -= 3.0f; + } + } + break; + case 5: + case 6: + case 7: + if (this->swork[SO_SWK_3] == 0) { + *dList = NULL; + } + if ((this->swork[SO_SWK_9] & 1) != 0) { + if ((this->swork[SO_SWK_9] & 1) != 0) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 32, 32, 128, 255); + rot->y += 3.0f; + } else { + rot->y -= 3.0f; + } + } + break; + } + return false; +} + +void func_i3_801A6BDC(s32 limbIndex, Vec3f* rot, void* thisx) { + Boss* this = thisx; + Vec3f spA0 = { 90.0f, 0.0f, -10.0f }; + Vec3f sp94 = { 135.0f, 0.0f, -40.0f }; + Vec3f sp88 = { 106.0f, 0.0f, 0.0f }; + Vec3f sp7C = { 75.0f, 0.0f, 0.0f }; + Vec3f sp70 = { 85.0f, 0.0f, 0.0f }; + Vec3f sp64 = { 10.0f, 2.0f, 0.0f }; + Vec3f sp58 = { 10.0f, -2.0f, 0.0f }; + Vec3f sp4C = { 0.0f, 0.05f, 0.0f }; + Vec3f sp40 = { 0.0f, -0.05f, 0.0f }; + Vec3f sp34 = { 0.0f, 0.0f, 0.0f }; + Vec3f sp28; + + switch (limbIndex) { + case 11: + Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); + this->fwork[SO_FWK_4] = sp28.x; + this->fwork[SO_FWK_5] = sp28.y; + this->fwork[SO_FWK_6] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, &sp28); + this->fwork[SO_FWK_1] = sp28.x; + this->fwork[SO_FWK_2] = sp28.y; + break; + case 2: + if (this->swork[SO_SWK_2] > 0) { + Matrix_Push(&gCalcMatrix); + Matrix_MultVec3f(gCalcMatrix, &sp88, &sp28); + this->fwork[SO_FWK_28] = sp28.x; + this->fwork[SO_FWK_29] = sp28.y; + this->fwork[SO_FWK_30] = sp28.z; + Matrix_Pop(&gCalcMatrix); + Matrix_MultVec3f(gCalcMatrix, &spA0, &sp28); + this->fwork[SO_FWK_16] = sp28.x; + this->fwork[SO_FWK_17] = sp28.y; + this->fwork[SO_FWK_18] = sp28.z; + } + if (this->swork[SO_SWK_2] < 0) { + Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); + this->fwork[SO_FWK_28] = sp28.x; + this->fwork[SO_FWK_29] = sp28.y; + this->fwork[SO_FWK_30] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_41]); + } + break; + default: + break; + case 3: + if (this->swork[SO_SWK_2] > 0) { + Matrix_MultVec3f(gCalcMatrix, &sp7C, &sp28); + this->fwork[SO_FWK_22] = sp28.x; + this->fwork[SO_FWK_23] = sp28.y; + this->fwork[SO_FWK_24] = sp28.z; + } + if (this->swork[SO_SWK_2] < 0) { + Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); + this->fwork[SO_FWK_22] = sp28.x; + this->fwork[SO_FWK_23] = sp28.y; + this->fwork[SO_FWK_24] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_47]); + } + break; + case 4: + if (this->swork[SO_SWK_2] > 0) { + Matrix_MultVec3f(gCalcMatrix, &sp70, &sp28); + this->fwork[SO_FWK_10] = sp28.x; + this->fwork[SO_FWK_11] = sp28.y; + this->fwork[SO_FWK_12] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_35]); + } else { + if (gBosses[0].swork[SO_SWK_0] != 7) { + Matrix_MultVec3f(gCalcMatrix, &sp64, &sp28); + } else { + Matrix_MultVec3f(gCalcMatrix, &sp4C, &sp28); + } + this->fwork[SO_FWK_10] = sp28.x; + this->fwork[SO_FWK_11] = sp28.y; + this->fwork[SO_FWK_12] = sp28.z; + } + break; + case 5: + if (this->swork[SO_SWK_3] > 0) { + Matrix_Push(&gCalcMatrix); + Matrix_MultVec3f(gCalcMatrix, &sp88, &sp28); + this->fwork[SO_FWK_25] = sp28.x; + this->fwork[SO_FWK_26] = sp28.y; + this->fwork[SO_FWK_27] = sp28.z; + Matrix_Pop(&gCalcMatrix); + Matrix_MultVec3f(gCalcMatrix, &spA0, &sp28); + this->fwork[SO_FWK_13] = sp28.x; + this->fwork[SO_FWK_14] = sp28.y; + this->fwork[SO_FWK_15] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_38]); + } + if (this->swork[SO_SWK_3] < 0) { + Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); + this->fwork[SO_FWK_25] = sp28.x; + this->fwork[SO_FWK_26] = sp28.y; + this->fwork[SO_FWK_27] = sp28.z; + } + break; + case 6: + if (this->swork[SO_SWK_3] > 0) { + Matrix_MultVec3f(gCalcMatrix, &sp7C, &sp28); + this->fwork[SO_FWK_19] = sp28.x; + this->fwork[SO_FWK_20] = sp28.y; + this->fwork[SO_FWK_21] = sp28.z; + } + if (this->swork[SO_SWK_3] < 0) { + Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); + this->fwork[SO_FWK_19] = sp28.x; + this->fwork[SO_FWK_20] = sp28.y; + this->fwork[SO_FWK_21] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_44]); + } + break; + case 7: + if (this->swork[SO_SWK_3] > 0) { + Matrix_MultVec3f(gCalcMatrix, &sp70, &sp28); + this->fwork[SO_FWK_7] = sp28.x; + this->fwork[SO_FWK_8] = sp28.y; + this->fwork[SO_FWK_9] = sp28.z; + Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[SO_FWK_32]); + } else { + if (gBosses[0].swork[SO_SWK_0] != 7) { + Matrix_MultVec3f(gCalcMatrix, &sp58, &sp28); + } else { + Matrix_MultVec3f(gCalcMatrix, &sp40, &sp28); + } + this->fwork[SO_FWK_7] = sp28.x; + this->fwork[SO_FWK_8] = sp28.y; + this->fwork[SO_FWK_9] = sp28.z; + } + break; + } +} + +void func_i3_801A71B8(Boss* bossSO) { + s32 i; + Vec3f spE8[9] = { + { 150.0f, 300.0f, 100.0f }, { -100.0f, 200.0f, 100.0f }, { 50.0f, 100.0f, 100.0f }, + { 0.0f, 0.0f, -500.0f }, { 790.0f, 630.0f, -600.0f }, { 280.0f, 140.0f, 500.0f }, + { -210.0f, 110.0f, 500.0f }, { -460.0f, 260.0f, 500.0f }, { 380.0f, 290.0f, 500.0f }, + }; + f32 spC4[9] = { + -1.0f, -0.3f, -2.0f, 121.0f, 209.0f, 183.0f, 181.0f, 167.0f, 182.0f, + }; + f32 spA0[9] = { + -89.0f, -90.0f, -88.0f, -36.0f, -73.0f, -95.0f, -91.0f, -83.0f, -91.0f, + }; + + Matrix_Scale(gCalcMatrix, bossSO->unk_3F8, bossSO->unk_3F8, bossSO->unk_3F8, 1); + if (gBossActive != 0) { + Animation_DrawSkeleton(2, D_600E470, bossSO->vwork, func_i3_801A68A8, func_i3_801A6BDC, bossSO, gCalcMatrix); + } + if (bossSO->health <= 0) { + RCP_SetupDL_49(); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); + gDPSetEnvColor(gMasterDisp++, 255, 192, 0, 255); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y, bossSO->obj.pos.z - 500.0f + D_80177D20, 1); + Matrix_Scale(gGfxMatrix, D_i3_801C2768[3], D_i3_801C2768[2], 1.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_1024AC0); + for (i = 0; i < 9; i++) { + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x + spE8[i].x, bossSO->obj.pos.y + spE8[i].y, + bossSO->obj.pos.z + D_80177D20 + spE8[i].z, 1); + Matrix_RotateY(gGfxMatrix, spC4[i] * M_DTOR, 1); + Matrix_RotateX(gGfxMatrix, spA0[i] * M_DTOR, 1); + Matrix_Scale(gGfxMatrix, D_i3_801C2768[4 + i], 100.0f, 1.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_1024AC0); + } + if (D_i3_801C2768[13] > 0.0f) { + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 192, 64, 255); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y + 230.0f, + (bossSO->obj.pos.z - 300.0f) + D_80177D20, 1); + Matrix_RotateX(gGfxMatrix, M_PI * 0.027777777, 1); // 1 / 36 + Matrix_Scale(gGfxMatrix, D_i3_801C2768[13], 1.0f, D_i3_801C2768[13], 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_20112C0); + Matrix_Scale(gGfxMatrix, 0.6f, 1.0f, 0.6f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_20112C0); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y + 270.0f, + (bossSO->obj.pos.z - 300.0f) + D_80177D20, 1); + Matrix_RotateX(gGfxMatrix, -M_PI / 60.0f, 1); + Matrix_Scale(gGfxMatrix, D_i3_801C2768[13], 1.0f, D_i3_801C2768[13], 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_20112C0); + Matrix_Scale(gGfxMatrix, 0.6f, 1.0f, 0.6f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_20112C0); + } + } +} + +Vec3f D_i3_801BFAF4[5] = { + { 0.0f, 10.0f, 20.0f }, { 300.0f, 100.0f, 200.0f }, { 100.0f, 60.0f, -260.0f }, + { 80.0f, 100.0f, 80.0f }, { 262.0f, 285.0f, 252.0f }, +}; + +Vec3f D_i3_801BFB30[3] = { + { 0.0f, 50.0f, 500.0f }, + { -500.0f, 0.0f, 250.0f }, + { 500.0f, 0.0f, 250.0f }, +}; + +void func_i3_801A7750(void) { + Actor* actor = gActors; + s32 i; + + Rand_SetSeed(1, 29100, 9786); + + for (i = 0; i < 3; i++, actor++) { + if ((i == 0) && (gTeamShields[3] <= 0.0f)) { + continue; + } + if ((i == 1) && (gTeamShields[2] <= 0.0f)) { + continue; + } + if ((i == 2) && (gTeamShields[1] <= 0.0f)) { + continue; + } + + Actor_Initialize(actor); + actor->obj.status = OBJ_INIT; + actor->obj.id = OBJ_ACTOR_195; + + actor->obj.pos.x = D_i3_801BFB30[i].x / 2.0f + gPlayer[0].pos.x; + actor->obj.pos.y = D_i3_801BFB30[i].y + gPlayer[0].pos.y; + actor->obj.pos.z = D_i3_801BFB30[i].z + gPlayer[0].pos.z; + actor->unk_0B8 = 1; + Object_SetInfo(&actor->info, actor->obj.id); + actor->iwork[11] = 1; + Audio_PlaySfx(0x3100000C, actor->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } +} + +void func_i3_801A7930(Player* player) { + s32 i; + f32 sp78; + f32 sp74; + f32 dx; + f32 dz; + Vec3f sp60; + Vec3f sp54; + Boss* bossSO = &gBosses[0]; + + switch (player->unk_1D0) { + case 0: + gCsFrameCount = 0; + player->unk_034 = player->unk_4D8 = 0.0f; + player->unk_0D0 = 40.0f; + + player->wings.unk_04 = player->wings.unk_0C = player->wings.unk_08 = player->wings.unk_10 = + player->unk_130 = player->unk_12C = player->unk_110 = 0.0f; + player->unk_234 = 1; + D_80177978 = player->camEye.x; + D_80177980 = player->camEye.y; + D_80177988 = player->camEye.z; + D_801779A0 = player->camAt.x; + D_801779B8 = player->camAt.y; + D_801779C0 = player->camAt.z; + for (i = 10; i < 60; i++) { + if (gActors[i].unk_0B6 == 0) { + Object_Kill(&gActors[i].obj, gActors[i].sfxPos); + } + } + Object_Kill(&gActors[2].obj, gActors[2].sfxPos); + Object_Kill(&gActors[3].obj, gActors[3].sfxPos); + Object_Kill(&gActors[4].obj, gActors[4].sfxPos); + player->unk_1D0 = 1; + D_80177A48[0] = 0.1f; + if (Rand_ZeroOne() > 0.5f) { + D_80177A48[9] = -1.0f; + } else { + D_80177A48[9] = 1.0f; + } + break; + case 1: + D_80177CE8 += 30.0f; + Math_SmoothStepToF(&player->unk_0E4, 0.0f, 0.1f, 5.0f, 0.0f); + Math_SmoothStepToF(&player->pos.y, 200.0f, 0.05f, 10.0f, 0.0f); + dx = player->pos.x - bossSO->obj.pos.x; + dz = (player->pos.z - bossSO->obj.pos.z) * 0.05f; + sp78 = Math_RadToDeg(-Math_Atan2F(dx, dz)); + Math_SmoothStepToF(&D_80177980, 300.0f, 1.0f, 20.0f, 0.0f); + Math_SmoothStepToF(&D_801779B8, 290.0f, 1.0f, 20.0f, 0.0f); + sp74 = Math_SmoothStepToAngle(&player->unk_0E8, sp78, 0.5f, 2.0f, 0.0001f) * 30.0f; + if (gCsFrameCount >= 14) { + Math_SmoothStepToAngle(&player->unk_0EC, sp74, 0.1f, 5.0f, 0.0001f); + D_801779A0 = 0.0f; + D_80177978 = 0.0f; + } else if (sp74 < 0.0f) { + player->unk_0EC -= 30.0f; + } else { + player->unk_0EC += 30.0f; + } + if (gCsFrameCount >= 200) { + player->unk_0E4 += 1.0f; + player->unk_0E8 += 1.0f; + player->unk_0EC += 1.0f; + } + if (gCsFrameCount >= 230) { + D_80178358 = 255; + D_80178348 = D_80178354 = D_80178350 = 255; + } + if (gCsFrameCount == 230) { + func_800182F4(0x103200FF); + func_800182F4(0x113200FF); + } + if (gCsFrameCount == 400) { + player->unk_1D0++; + func_800A6148(); + func_8001CA24(0); + Audio_KillSfx(player->sfxPos); + D_80178340 = 250; + player->timer_1F8 = 20; + player->unk_0D0 = 0.0f; + player->unk_0E4 = 0.0f; + player->unk_0E8 = 0.0f; + player->unk_0EC = 0.0f; + } + break; + case 2: + D_80177CE8 += 60.0f; + if (player->timer_1F8 == 0) { + player->pos.x = 0.0f; + player->pos.y = 200.0f; + player->pos.z = -(D_80177D20 - 500.0f); + player->unk_1D0++; + player->wings.unk_2C = 1; + func_8001C8B8(0); + func_8001D444(0, 0x26, 0, 0xFF); + D_80177A98 = 1; + func_800A6148(); + D_80177A48[1] = 0.0f; + D_80177A48[2] = 0.0f; + player->camEye.x = 0.0f; + player->camEye.y = player->pos.y + 80.0f; + player->camEye.z = player->pos.z + D_80177D20 - 4000.0f; + D_80177988 = player->pos.z + D_80177D20 - 4900.0f; + player->camAt.x = D_801779A0 = 0.0f; + player->camAt.y = D_801779B8 = 200.0f; + player->camAt.z = D_801779C0 = player->pos.z + D_80177D20; + D_80177A48[0] = 0.0f; + Object_Kill(&gActors[4].obj, gActors[4].sfxPos); + Object_Kill(&gActors[5].obj, gActors[5].sfxPos); + } + break; + case 3: + D_80177CE8 += 60.0f; + D_80178358 = 0; + D_8017835C = 4; + if (D_801782F8) { + player->wings.unk_30 = (gGameFrameCount & 1) * 5.0f; + } + switch (gCsFrameCount) { + case 450: + func_i3_801A0DF8(-1200.0f, -(D_80177D20 + 2500.0f), 90.0f, 2, 1.0f); + break; + case 545: + func_i3_801A0DF8(1400.0f, -(D_80177D20 + 3250.0f), -90.0f, 3, 1.0f); + break; + case 550: + Object_Kill(&gActors[4].obj, gActors[4].sfxPos); + break; + case 645: + Object_Kill(&gActors[5].obj, gActors[5].sfxPos); + break; + case 700: + player->unk_1D0++; + func_i3_801A7750(); + D_i3_801C2768[3] = 1000.0f; + break; + } + if ((gCsFrameCount >= 520) && (gCsFrameCount < 605)) { + Math_SmoothStepToF(&player->pos.x, 400.0f, 0.1f, 10.0f, 0.1f); + } + if ((gCsFrameCount >= 520) && (gCsFrameCount < 570)) { + Math_SmoothStepToAngle(&player->unk_0EC, -30.0f, 0.1f, 5.0f, 0.1f); + } + if ((gCsFrameCount >= 570) && (gCsFrameCount < 605)) { + Math_SmoothStepToAngle(&player->unk_0EC, 0.0f, 0.1f, 5.0f, 0.1f); + } + if ((gCsFrameCount >= 605) && (gCsFrameCount < 620)) { + player->unk_0EC += 30.0f; + } + if ((gCsFrameCount >= 620) && (gCsFrameCount < 640)) { + Math_SmoothStepToAngle(&player->unk_0EC, 45.0f, 0.1f, 5.0f, 0.0f); + } + if (gCsFrameCount >= 640) { + Math_SmoothStepToAngle(&player->unk_0EC, 0.0f, 0.3f, 7.0f, 0.0f); + } + if (gCsFrameCount >= 585) { + Math_SmoothStepToF(&player->pos.x, 0.0f, 0.2f, 9.0f, 0); + } + if (gCsFrameCount >= 600) { + Math_SmoothStepToF(&player->pos.y, 950.0f, 0.1f, 10.0f, 0.0001f); + } + Math_SmoothStepToF(&player->pos.z, -(D_80177D20 + 4350.0f), 1.0f, 20.0f, 0.0001f); + if (gCsFrameCount >= 620) { + Math_SmoothStepToF(&player->camEye.x, 0.0f, 1.0f, 10.0f, 0); + Math_SmoothStepToF(&player->camEye.y, player->pos.y + 52.0f, 1.0f, 16.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.z, (player->pos.z + D_80177D20) - 50.0f, 1.0f, 21.5f, 0.0f); + } + player->camAt.x = D_801779A0 = player->pos.x; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = player->pos.z + D_80177D20; + break; + case 4: + D_80177CE8 += 60.0f; + D_80178358 = 0; + D_8017835C = 4; + D_80177A48[1] += D_80177A48[2] * 0.8f; + Matrix_RotateY(gCalcMatrix, D_80177A48[1] * M_DTOR, 0); + sp60.x = 0.0f; + sp60.y = 0.0f; + sp60.z = -700.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp60, &sp54); + if (gCsFrameCount < 1440) { + D_80177978 = sp54.x; + D_80177980 = D_i3_801C2768[3] + sp54.y; + D_80177988 = player->pos.z + D_80177D20 + sp54.z; + D_801779A0 = 0.0f; + D_801779B8 = player->pos.y + 75.0f; + Math_SmoothStepToF(&D_i3_801C2768[3], 500.0f, 0.1f, 1.0f, 0.0001f); + D_801779C0 = player->pos.z + D_80177D20 + 200.0f; + if (gCsFrameCount >= 1400) { + D_801779C0 -= (gCsFrameCount * 8) - 11200; + } + } else { + Math_SmoothStepToF(&D_80177978, 0.0f, 0.1f, 1.0f, 0.0001f); + D_801779A0 = 0.0f; + D_801779B8 = player->pos.y + 75.0f; + D_801779C0 = player->pos.z + D_80177D20 + 200.0f - ((gCsFrameCount * 8) - 11200); + } + if (gCsFrameCount > 1460) { + player->unk_0D0 += 2.0f; + player->unk_0E4 += 0.2f; + Math_SmoothStepToF(&D_80177A48[2], 0.0f, 1.0f, 0.001f, 0); + player->unk_190 = 2.0f; + } else { + Math_SmoothStepToF(&D_80177A48[2], 0.23f, 1.0f, 0.001f, 0.0f); + Math_SmoothStepToF(&D_80177A48[0], 0.5f, 0.1f, 0.0005f, 0.0f); + } + if (gCsFrameCount == 1560) { + func_800A6148(); + } + if (gCsFrameCount > 1530) { + D_80178358 = 255; + D_80178348 = D_80178350 = D_80178354 = 0; + D_8017835C = 8; + if (D_80178340 == 255) { + func_8001CA24(0); + func_8001DBD0(10); + player->state_1C8 = PLAYERSTATE_1C8_6; + player->timer_1F8 = 0; + D_8017837C = 4; + D_800D3180[LEVEL_SOLAR] = Play_CheckMedalStatus(100) + 1; + } + } + break; + } + switch (gCsFrameCount) { + case 440: + D_80177840 = 100; + break; + case 640: + func_800BA808(gMsg_ID_20010, RCID_FOX); + break; + case 728: + switch (gTeamShields[2]) { + case 0: + func_800BA808(gMsg_ID_20345, RCID_ROB64); + break; + case -1: + func_800BA808(gMsg_ID_20339, RCID_ROB64); + break; + default: + func_80048AC0(2); + break; + } + break; + case 875: + switch (gTeamShields[3]) { + case 0: + func_800BA808(gMsg_ID_20344, RCID_ROB64); + break; + case -1: + func_800BA808(gMsg_ID_20338, RCID_ROB64); + break; + default: + func_80048AC0(3); + break; + } + break; + case 1021: + switch (gTeamShields[1]) { + case 0: + func_800BA808(gMsg_ID_20343, RCID_ROB64); + break; + case -1: + func_800BA808(gMsg_ID_20337, RCID_ROB64); + break; + default: + func_80048AC0(1); + break; + } + break; + case 1186: + D_80177830 = 1; + break; + case 1386: + D_80177830 = 0; + break; + case 1460: + Audio_PlaySfx(0x09000002, player->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + player->unk_190 = player->unk_194 = 5.0f; + break; + case 1400: + if (gTeamShields[3] > 0) { + gActors[0].unk_0B8 = 2; + } + break; + case 1500: + func_800182F4(0x103200FF); + func_800182F4(0x113200FF); + break; + case 1420: + if (gTeamShields[2] > 0) { + gActors[1].unk_0B8 = 2; + } + break; + case 1440: + if (gTeamShields[1] > 0) { + gActors[2].unk_0B8 = 2; + } + break; + } + Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8 + 180.0f) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -((player->unk_120 + player->unk_0E4) * M_DTOR), 1); + sp60.x = 0.0f; + sp60.y = 0.0f; + sp60.z = player->unk_0D0; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp60, &sp54); + player->vel.x = sp54.x; + player->vel.z = sp54.z; + player->vel.y = sp54.y; + + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + player->pos.z += player->vel.z; + + player->unk_138 = player->pos.z; + player->unk_0F8 = player->unk_0EC; + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0.0f); + player->unk_088 += 10.0f; + player->unk_080 = -__sinf(player->unk_088 * M_DTOR) * 0.3f; + player->unk_0F4 += 8.0f; + player->unk_0F0 = __sinf(player->unk_0F4 * M_DTOR); +} + +void func_i3_801A8BE8(Actor* actor) { + Vec3f sp3C; + Vec3f sp30; + + switch (actor->unk_0B8) { + case 4: + break; + case 1: + if ((actor->unk_0B6 != 0) && ((((actor->index & 7) * 10) + 1030) < gCsFrameCount)) { + actor->unk_0B8 = 4; + } + break; + case 2: + actor->unk_0B8 = 3; + Audio_PlaySfx(0x09000002, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->fwork[29] = 5.0f; + /* fallthrough */ + case 3: + actor->iwork[11] = 2; + actor->fwork[0] += 2.0f; + actor->unk_0F4.x += 0.2f; + break; + } + Matrix_RotateY(gCalcMatrix, (actor->unk_0F4.y + 180.0f) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -(actor->unk_0F4.x * M_DTOR), 1); + sp3C.x = 0.0f; + sp3C.y = 0.0f; + sp3C.z = actor->fwork[0]; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp3C, &sp30); + actor->vel.x = sp30.x; + actor->vel.y = sp30.y; + actor->vel.z = sp30.z; + actor->obj.rot.x = -actor->unk_0F4.x; + actor->obj.rot.y = actor->unk_0F4.y + 180.0f; + + actor->obj.rot.z = -actor->unk_0F4.z; +} + +void func_i3_801A8DB8(Vec3f* pos, u32 sfxId, f32 zVel) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(gEffects); i++) { + if (gEffects[i].obj.status == OBJ_FREE) { + func_8007A5F8(&gEffects[i], pos, sfxId); + gEffects[i].vel.z = zVel; + break; + } + } +} diff --git a/src/overlays/ovl_i3/fox_zo.c b/src/overlays/ovl_i3/fox_zo.c index 92eb5317..abddfbdc 100644 --- a/src/overlays/ovl_i3/fox_zo.c +++ b/src/overlays/ovl_i3/fox_zo.c @@ -605,9 +605,9 @@ void func_i3_801900FC(Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 } s32 func_i3_8019019C(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { - GSGM_BACK(); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); if ((limbIndex >= 4) && (limbIndex < 10)) { - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); } return false; } @@ -810,9 +810,9 @@ void func_i3_80190B4C(f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot RCP_SetupDL_29(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); if (arg7 != 0) { RCP_SetupDL_64(); - GPC(40, 40, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 40, 40, 255, 255); } - GDL(D_i3_801BF5A8[arg6]); + gSPDisplayList(gMasterDisp++, D_i3_801BF5A8[arg6]); Matrix_Pop(&gGfxMatrix); } @@ -962,10 +962,10 @@ void func_i3_801914C4(Actor* actor) { Vec3f sp38[20]; Matrix_Scale(gCalcMatrix, actor->scale, actor->scale, actor->scale, 1); - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); Animation_GetFrameData(&D_601AA48, actor->unk_0B6, sp38); Animation_DrawSkeleton(3, D_601AB14, sp38, NULL, func_i3_80190F28, actor, gCalcMatrix); - GSGM_BACK(); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); } void func_i3_801915A4(Actor* actor) { @@ -1114,11 +1114,11 @@ void func_i3_80191BC4(Actor* actor) { void func_i3_80191DB0(Actor* actor) { RCP_SetupDL_40(); - GDL(D_6019EB0); + gSPDisplayList(gMasterDisp++, D_6019EB0); Matrix_RotateY(gGfxMatrix, actor->fwork[0] * 0.7f * M_DTOR, 1); Matrix_RotateX(gGfxMatrix, actor->fwork[0] * M_DTOR, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6023D50); + gSPDisplayList(gMasterDisp++, D_6023D50); } void func_i3_80191E94(s32 limbIndex, Vec3f* rot, void* thisx) { @@ -1745,15 +1745,15 @@ s32 func_i3_80193D08(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* t if (sZoLimbTimers[limbIndex] == LIMB_DESTROYED) { *dList = NULL; } - GSGM_BACK(); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); if (sZoSwork[ZO_BSS_37] != 255) { RCP_SetupDL_46(); - GPC(255, 255, sZoSwork[ZO_BSS_37], sZoSwork[ZO_BSS_37]); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, sZoSwork[ZO_BSS_37], sZoSwork[ZO_BSS_37]); } else if (!(sZoLimbTimers[limbIndex] & 1)) { RCP_SetupDL_29(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); } else { RCP_SetupDL_27(); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } switch (limbIndex) { case ZO_LIMB_1: @@ -1766,7 +1766,7 @@ s32 func_i3_80193D08(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* t } /* fallthrough */ case ZO_LIMB_12: - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); break; case ZO_LIMB_2: @@ -3516,7 +3516,7 @@ void func_i3_80199A28(Actor* actor) { void func_i3_80199E24(Actor* actor) { Matrix_Scale(gGfxMatrix, 2.0f, 2.0f, 2.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6025E60); + gSPDisplayList(gMasterDisp++, D_6025E60); } void func_i3_80199E9C(Actor* actor, f32 arg1, f32 arg2) { @@ -3597,13 +3597,12 @@ void func_i3_8019A1FC(Actor* actor) { Matrix_Scale(gGfxMatrix, 2.0f, 2.0f, 2.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); RCP_SetupDL_57(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); - GDL(D_601C590); + gSPDisplayList(gMasterDisp++, D_601C590); RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); if (((actor->unk_0B8 == 1) && (gBosses[0].timer_052 != 0)) || (actor->unk_0B8 == 0)) { Matrix_RotateY(gGfxMatrix, gGameFrameCount * M_DTOR, 1); } - // var_s1 = 1; var_fv0 = sZoFwork[ZO_BSF_60_Y] + -1.0f * actor->fwork[0] - actor->obj.pos.y; for (var_s1 = 1; var_fv0 >= 0.0f; var_s1++) { @@ -3621,7 +3620,7 @@ void func_i3_8019A1FC(Actor* actor) { Matrix_Push(&gGfxMatrix); Matrix_Scale(gGfxMatrix, 0.75f, 0.75f, 0.75f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6018660); + gSPDisplayList(gMasterDisp++, D_6018660); Matrix_Pop(&gGfxMatrix); } } @@ -3779,10 +3778,10 @@ void func_i3_8019ACCC(Actor* actor) { var_fs5 = 90.0f; Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); - GSGM_BACK(); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); if ((gBosses[0].actionState != 6) && (gBosses[0].actionState != 7)) { RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); temp_fa0 = sZoFwork[ZO_BSF_65_X] - actor->obj.pos.x; temp_fs0 = sZoFwork[ZO_BSF_65_Y] - actor->obj.pos.y; temp_fa1 = sZoFwork[ZO_BSF_65_Z] - actor->obj.pos.z; @@ -3814,7 +3813,7 @@ void func_i3_8019ACCC(Actor* actor) { Matrix_RotateX(gGfxMatrix, 1.5707964f, 1); Matrix_Scale(gGfxMatrix, 1.5f, 1.5f, 1.5f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6018660); + gSPDisplayList(gMasterDisp++, D_6018660); Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gGfxMatrix); var_fs5 += 90.0f; @@ -3828,14 +3827,14 @@ void func_i3_8019ACCC(Actor* actor) { Matrix_Scale(gGfxMatrix, 2.6f, 2.6f, 2.6f, 1); Matrix_SetGfxMtx(&gMasterDisp); RCP_SetupDL(&gMasterDisp, 70); - GPC(255, 255, 255, 255); - GDL(D_6004380); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); + gSPDisplayList(gMasterDisp++, D_6004380); Matrix_RotateY(gGfxMatrix, sZoFwork[ZO_BSF_19] * M_DTOR, 1); Matrix_RotateX(gGfxMatrix, actor->fwork[2] * M_DTOR, 1); Matrix_RotateZ(gGfxMatrix, actor->fwork[3] * M_DTOR, 1); Matrix_SetGfxMtx(&gMasterDisp); RCP_SetupDL_55(); - GDL(D_601BCC0); + gSPDisplayList(gMasterDisp++, D_601BCC0); } Vec3f D_i3_801BF744[3] = { @@ -3962,7 +3961,7 @@ void func_i3_8019B548(Actor* actor) { } void func_i3_8019B7DC(Actor* actor) { - GDL(D_6006360); + gSPDisplayList(gMasterDisp++, D_6006360); } void func_i3_8019B810(Actor* actor) { @@ -4161,7 +4160,7 @@ void func_i3_8019BE48(Actor* actor) { } void func_i3_8019C1CC(Actor* actor) { - GDL(D_6002E10); + gSPDisplayList(gMasterDisp++, D_6002E10); } Vec3f D_i3_801BF8AC = { 230.0f, -50.0f, 0.0f }; @@ -4293,25 +4292,25 @@ void func_i3_8019C83C(Actor* actor) { Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, actor->fwork[0] * M_DTOR, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_601A340); + gSPDisplayList(gMasterDisp++, D_601A340); Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); Matrix_Translate(gGfxMatrix, 0.0f, -320.0f, 0.0f, 1); Matrix_Scale(gGfxMatrix, 1.0f, 1.3, 1.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6013330); + gSPDisplayList(gMasterDisp++, D_6013330); Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, 1.5707964f, 1); Matrix_Translate(gGfxMatrix, -110.0f, 0.0f, 0.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_601D680); + gSPDisplayList(gMasterDisp++, D_601D680); Matrix_Pop(&gGfxMatrix); Matrix_Translate(gGfxMatrix, actor->fwork[1], actor->fwork[2], 0.0f, 1); Matrix_RotateY(gGfxMatrix, actor->fwork[4] * M_DTOR, 1); Matrix_Scale(gGfxMatrix, 0.75f, 0.75f, 0.75f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_601C590); + gSPDisplayList(gMasterDisp++, D_601C590); RCP_SetupDL_57(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); Matrix_RotateY(gGfxMatrix, gGameFrameCount * M_DTOR, 1); @@ -4332,7 +4331,7 @@ void func_i3_8019C83C(Actor* actor) { Matrix_Push(&gGfxMatrix); Matrix_Scale(gGfxMatrix, 0.5f, 0.5f, 0.5f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_6018660); + gSPDisplayList(gMasterDisp++, D_6018660); Matrix_Pop(&gGfxMatrix); } } @@ -4407,20 +4406,20 @@ void func_i3_8019CE58(Actor* actor) { Matrix_Scale(gGfxMatrix, actor->fwork[1], actor->fwork[2], actor->fwork[3], 1); Matrix_SetGfxMtx(&gMasterDisp); if (D_80161684 != 0) { - GPC(255, 191, 43, 255); - GEC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 191, 43, 255); + gDPSetEnvColor(gMasterDisp++, 255, 0, 0, 255); } else { - GPC(255, 255, 255, 255); - GEC(255, 255, 127, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); + gDPSetEnvColor(gMasterDisp++, 255, 255, 127, 255); } } else if (D_80161684 != 0) { - GPC(255, 191, 43, 50); - GEC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 191, 43, 50); + gDPSetEnvColor(gMasterDisp++, 255, 0, 0, 255); } else { - GPC(255, 255, 255, 50); - GEC(255, 255, 127, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 50); + gDPSetEnvColor(gMasterDisp++, 255, 255, 127, 255); } - GDL(D_60181E0); + gSPDisplayList(gMasterDisp++, D_60181E0); } #ifdef NON_MATCHING diff --git a/src/overlays/ovl_i3/sf_aq.c b/src/overlays/ovl_i3/sf_aq.c index b4f20a3c..c09aff3b 100644 --- a/src/overlays/ovl_i3/sf_aq.c +++ b/src/overlays/ovl_i3/sf_aq.c @@ -373,10 +373,6 @@ f32 D_i3_801C0828[51] = { }; Vec3f D_i3_801C08F4 = { 0.0f, 0.0f, 0.0f }; -typedef struct { - char unk_00[0x148]; -} UnkStruct_1C4308; - PosRot* D_i3_801C27C0; PosRot D_i3_801C27C8[4][50]; Vtx D_i3_801C3A88[2][2][28]; @@ -385,39 +381,501 @@ s32 D_i3_801C4190[10]; f32 D_i3_801C41B8[30]; s32 D_i3_801C4230[28]; s32 D_i3_801C42A0[25]; -UnkStruct_1C4308 D_i3_801C4308; +f32 D_i3_801C4308[82]; s32 D_i3_801C4450; s32 D_i3_801C4454; f32 D_i3_801C4458; f32 D_i3_801C445C; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A8E30.s") +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[]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A92EC.s") +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); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9374.s") +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); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9448.s") + for (i = 0; i < 17; i++) { + if ((i == 0) || (i == 16)) { + spA8[i] = 0.0f; + sp64[i] = 0.0f; + } else { + spA8[i] = (Rand_ZeroOne() - 0.5f) * 70.0f; + sp64[i] = (Rand_ZeroOne() - 0.5f) * 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]; + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A94EC.s") +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; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A958C.s") +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->unk_0B8 = 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); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A95C8.s") +void func_i3_801A9448(Vec3f* pos, Vec3f* rot, f32 xVel, f32 yVel, f32 zVel, s32 unkB8, f32 scale, s32 timerBC, + s32 unk48) { + s32 i; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A96DC.s") + 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; + } + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9728.s") +void func_i3_801A94EC(Vec3f* pos, ObjectId objId) { + Item* sp18; + Item* item; + s32 i; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9824.s") + 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; + } + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A99D4.s") +f32 func_i3_801A958C(s32 arg0, f32 arg1) { + f32 var_fv1 = arg0 / 2.0f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9C98.s") + var_fv1 = MIN(arg1, var_fv1); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9DE4.s") + return var_fv1; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_aq/func_i3_801A9ED0.s") +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 = __sinf(i * 10.0f * M_DTOR) * radius; + temp_fs0 = __cosf(i * 10.0f * M_DTOR) * 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].actionState >= 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].actionState >= 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") diff --git a/src/overlays/ovl_i3/sf_so.c b/src/overlays/ovl_i3/sf_so.c deleted file mode 100644 index 9cfaa8a0..00000000 --- a/src/overlays/ovl_i3/sf_so.c +++ /dev/null @@ -1,1243 +0,0 @@ -#include "global.h" -#include "prevent_bss_reordering.h" - -typedef void (*BossSOfunc)(Boss*); - -typedef enum { - /* 0 */ SO_SWK_0, - /* 1 */ SO_SWK_1, - /* 2 */ SO_SWK_2, - /* 3 */ SO_SWK_3, - /* 4 */ SO_SWK_4, - /* 5 */ SO_SWK_5, - /* 6 */ SO_SWK_6, - /* 7 */ SO_SWK_7, - /* 8 */ SO_SWK_8, - /* 9 */ SO_SWK_9, - /* 10 */ SO_SWK_10, - /* 11 */ SO_SWK_11, - /* 12 */ SO_SWK_12, - /* 13 */ SO_SWK_13, - /* 14 */ SO_SWK_14, - /* 15 */ SO_SWK_15, - /* 16 */ SO_SWK_16, - /* 17 */ SO_SWK_17, - /* 18 */ SO_SWK_18, - /* 19 */ SO_SWK_19, - /* 20 */ SO_SWK_20, - /* 21 */ SO_SWK_21, - /* 22 */ SO_SWK_22, - /* 23 */ SO_SWK_23, - /* 24 */ SO_SWK_24, - /* 25 */ SO_SWK_25, - /* 26 */ SO_SWK_26, - /* 27 */ SO_SWK_27, - /* 28 */ SO_SWK_28, - /* 29 */ SO_SWK_29, - /* 30 */ SO_SWK_30, - /* 31 */ SO_SWK_31, - /* 32 */ SO_SWK_32, - /* 33 */ SO_SWK_33, - /* 34 */ SO_SWK_34, - /* 35 */ SO_SWK_35, - /* 36 */ SO_SWK_36, - /* 37 */ SO_SWK_37, - /* 38 */ SO_SWK_38, - /* 39 */ SO_SWK_39, - /* 40 */ SO_SWK_MAX, -} BossSOswork; - -typedef enum { - /* 0 */ SO_FWK_0, - /* 1 */ SO_FWK_1, - /* 2 */ SO_FWK_2, - /* 3 */ SO_FWK_3, - /* 4 */ SO_FWK_4, - /* 5 */ SO_FWK_5, - /* 6 */ SO_FWK_6, - /* 7 */ SO_FWK_7, - /* 8 */ SO_FWK_8, - /* 9 */ SO_FWK_9, - /* 10 */ SO_FWK_10, - /* 11 */ SO_FWK_11, - /* 12 */ SO_FWK_12, - /* 13 */ SO_FWK_13, - /* 14 */ SO_FWK_14, - /* 15 */ SO_FWK_15, - /* 16 */ SO_FWK_16, - /* 17 */ SO_FWK_17, - /* 18 */ SO_FWK_18, - /* 19 */ SO_FWK_19, - /* 20 */ SO_FWK_20, - /* 21 */ SO_FWK_21, - /* 22 */ SO_FWK_22, - /* 23 */ SO_FWK_23, - /* 24 */ SO_FWK_24, - /* 25 */ SO_FWK_25, - /* 26 */ SO_FWK_26, - /* 27 */ SO_FWK_27, - /* 28 */ SO_FWK_28, - /* 29 */ SO_FWK_29, - /* 30 */ SO_FWK_30, - /* 31 */ SO_FWK_31, - /* 32 */ SO_FWK_32, - /* 33 */ SO_FWK_33, - /* 34 */ SO_FWK_34, - /* 35 */ SO_FWK_35, - /* 36 */ SO_FWK_36, - /* 37 */ SO_FWK_37, - /* 38 */ SO_FWK_38, - /* 39 */ SO_FWK_39, - /* 40 */ SO_FWK_40, - /* 41 */ SO_FWK_41, - /* 42 */ SO_FWK_42, - /* 43 */ SO_FWK_43, - /* 44 */ SO_FWK_44, - /* 45 */ SO_FWK_45, - /* 46 */ SO_FWK_46, - /* 47 */ SO_FWK_47, - /* 48 */ SO_FWK_48, - /* 49 */ SO_FWK_49, - /* 50 */ SO_FWK_MAX, -} BossSOfwork; - -typedef enum { - /* 0 */ SO_VWK_0, - /* 1 */ SO_VWK_1, - /* 2 */ SO_VWK_2, - /* 3 */ SO_VWK_3, - /* 4 */ SO_VWK_4, - /* 5 */ SO_VWK_5, - /* 6 */ SO_VWK_6, - /* 7 */ SO_VWK_7, - /* 8 */ SO_VWK_8, - /* 9 */ SO_VWK_9, - /* 10 */ SO_VWK_10, - /* 11 */ SO_VWK_11, - /* 12 */ SO_VWK_12, - /* 13 */ SO_VWK_13, - /* 14 */ SO_VWK_14, - /* 15 */ SO_VWK_15, - /* 16 */ SO_VWK_16, - /* 17 */ SO_VWK_17, - /* 18 */ SO_VWK_18, - /* 19 */ SO_VWK_19, - /* 20 */ SO_VWK_20, - /* 21 */ SO_VWK_21, - /* 22 */ SO_VWK_22, - /* 23 */ SO_VWK_23, - /* 24 */ SO_VWK_24, - /* 25 */ SO_VWK_25, - /* 26 */ SO_VWK_26, - /* 27 */ SO_VWK_27, - /* 28 */ SO_VWK_28, - /* 29 */ SO_VWK_29, - /* 30 */ SO_VWK_30, - /* 31 */ SO_VWK_31, - /* 32 */ SO_VWK_32, - /* 33 */ SO_VWK_33, - /* 34 */ SO_VWK_34, - /* 35 */ SO_VWK_35, - /* 36 */ SO_VWK_36, - /* 37 */ SO_VWK_37, - /* 38 */ SO_VWK_38, - /* 39 */ SO_VWK_39, - /* 40 */ SO_VWK_40, - /* 41 */ SO_VWK_41, - /* 42 */ SO_VWK_42, - /* 43 */ SO_VWK_43, - /* 44 */ SO_VWK_44, - /* 45 */ SO_VWK_45, - /* 46 */ SO_VWK_46, - /* 47 */ SO_VWK_47, - /* 48 */ SO_VWK_48, - /* 49 */ SO_VWK_49, - /* 50 */ SO_VWK_MAX, -} BossSOvwork; - -void func_i3_801A1F80(Boss* bossSO); -void func_i3_801A23F4(Boss* bossSO); -void func_i3_801A2C98(Boss* bossSO); -void func_i3_801A3128(Boss* bossSO); -void func_i3_801A3510(Boss* bossSO); -void func_i3_801A4214(Boss* bossSO); -void func_i3_801A4A34(Boss* bossSO); -void func_i3_801A4EF8(Boss* bossSO); -void func_i3_801A56B8(Boss* bossSO); - -void func_i3_801A239C(Boss* bossSO); -void func_i3_801A2C3C(Boss* bossSO); -void func_i3_801A3468(Boss* bossSO); -void func_i3_801A48B8(Boss* bossSO); -void func_i3_801A4EC0(Boss* bossSO); -void func_i3_801A8DB8(Vec3f* arg0, u32 arg1, f32 arg2); - -void func_i3_8019FAA4(Boss* bossSO, Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 arg6); -void func_i3_8019FF44(Boss* bossSO, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 arg6); -void func_i3_801A1EB0(Boss* bossSO, f32, f32, f32, f32); -void func_i3_801A3C4C(Boss* bossSO); - -s32 D_i3_801C2740[10]; -f32 D_i3_801C2768[14]; -s32 D_i3_801C27A0[8]; // unused? part of previous? - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019E7F0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019E8B8.s") - -void func_i3_8019E920(Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, - s32 unk4E) { - Effect_Initialize(effect); - effect->obj.status = OBJ_ACTIVE; - effect->obj.id = 392; - effect->unk_4E = unk4E; - if (unk4E == 2) { - effect->timer_50 = 30; - effect->unk_4C = 3; - } - effect->obj.pos.x = xPos; - effect->obj.pos.y = yPos; - effect->obj.pos.z = zPos; - effect->vel.x = xVel; - effect->vel.y = yVel; - effect->vel.z = zVel; - effect->obj.rot.z = Rand_ZeroOne() * 360.0f; - effect->unk_44 = 176; - effect->scale2 = scale2; - Object_SetInfo(&effect->info, effect->obj.id); -} - -void func_i3_8019E9F4(f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel, f32 scale2, s32 unk4E) { - s32 i; - - for (i = 99; i >= 34; i--) { - if (gEffects[i].obj.status == OBJ_FREE) { - func_i3_8019E920(&gEffects[i], xPos, yPos, zPos, xVel, yVel, zVel, scale2, unk4E); - break; - } - } -} - -// OBJ_ACTOR_278 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019EA7C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019EF30.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F038.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F0B0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F194.s") - -f32 D_i3_801BF8E0[4] = { 10.0f, 6.0f, -6.0f, -10.0f }; -Vec3f D_i3_801BF8F0[4] = { - { 10.0f, 7.0f, 0.0f }, - { -10.0f, 7.0f, 0.0f }, - { 7.0f, 10.0f, 0.0f }, - { -7.0f, 10.0f, 0.0f }, -}; -// OBJ_ACTOR_275, 276, 277 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F20C.s") - -// OBJ_ACTOR_275, 276, 277 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F7AC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019F99C.s") - -Vec3f D_i3_801BF920 = { 0.0f, 0.0f, 0.0f }; -void func_i3_8019FAA4(Boss* bossSO, Effect* effect, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 arg6) { - Vec3f sp44; - Vec3f sp38; - Vec3f sp2C = D_i3_801BF920; - - Effect_Initialize(effect); - effect->obj.status = OBJ_ACTIVE; - effect->obj.id = OBJ_EFFECT_392; - effect->obj.pos.x = xPos; - effect->obj.pos.y = yPos; - effect->obj.pos.z = zPos; - effect->vel.y = yVel; - effect->vel.x = 0.0f; - effect->scale2 = 10.0f; - - if (gBossHealthBar != 0) { - if (gBosses[0].fwork[0x1F] > 0.0f) { - if (gBosses[0].swork[0] != 7) { - Matrix_RotateY(gCalcMatrix, gBosses[0].obj.rot.y * 0.017453292f, 0); - sp44.y = 0.0f; - sp44.z = 0.0f; - sp44.x = gBosses[0].fwork[31] * 5.0f; - Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38); - effect->vel.x = sp38.x * arg6; - effect->vel.z = gPlayer[0].vel.z + (sp38.z * arg6); - } else { - Matrix_RotateZ(gCalcMatrix, bossSO->obj.rot.z * 0.017453292f, 0); - Matrix_RotateX(gCalcMatrix, gBosses[0].obj.rot.x * 0.017453292f, 1); - Matrix_RotateY(gCalcMatrix, gBosses[0].unk_078.y * 0.017453292f, 1); - sp44.x = effect->obj.pos.x - bossSO->obj.pos.x; - sp44.y = effect->obj.pos.y - bossSO->obj.pos.y; - sp44.z = effect->obj.pos.z - bossSO->obj.pos.z; - Matrix_MultVec3f(gCalcMatrix, &sp44, &sp38); - effect->obj.pos.x = bossSO->obj.pos.x + sp38.x; - effect->obj.pos.y = bossSO->obj.pos.y + sp38.y; - effect->obj.pos.z = bossSO->obj.pos.z + sp38.z; - effect->vel.z = gPlayer[0].vel.z; - effect->vel.y = yVel; - if (gBosses[0].actionState >= 2) { - effect->scale2 = 15.0f; - } - } - } else { - effect->vel.z = gPlayer[0].vel.z; - } - } else { - effect->vel.x = (Rand_ZeroOne() - 0.5f) * 30.0f; - effect->vel.z = (Rand_ZeroOne() - 0.5f) * 30.0f; - } - effect->unk_60.y = bossSO->obj.rot.y; - effect->unk_60.x = 90.0f; - effect->obj.rot.z = Rand_ZeroOne() * 360.0f; - effect->unk_44 = 255; - effect->unk_48 = 1; - effect->unk_4E = 4; - effect->unk_4C = 5; - Object_SetInfo(&effect->info, effect->obj.id); -} - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019FDE0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019FEE8.s") - -void func_i3_8019FF44(Boss* bossSO, f32 xPos, f32 yPos, f32 zPos, f32 yVel, f32 arg6) { - s32 i; - - for (i = 70; i >= 0; i--) { - if (gEffects[i].obj.status == OBJ_FREE) { - func_i3_8019FAA4(bossSO, &gEffects[i], xPos, yPos, zPos, yVel, arg6); - break; - } - } -} - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_8019FFC0.s") - -// OBJ_ACTOR_279 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A003C.s") - -// OBJ_EFFECT_392 action -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0120.s") - -u32 D_i3_801BF92C[6] = { - 0x0200B630, 0x0200A5A0, 0x02009510, 0x060084C0, 0x06008D40, 0x06007C40, -}; -u32 D_i3_801BF944[6] = { - 0x0601B790, 0x0601B790, 0x0601A700, 0x06019670, 0x060185E0, 0x06017550, -}; -Vec3f D_i3_801BF95C[3] = { - { 0.0f, 30.0f, 480.0f }, - { -180.0f, 0.0f, 240.0f }, - { 180.0f, 0.0f, 240.0f }, -}; -// OBJ_EFFECT_392 draw -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0AF0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0CEC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0D90.s") - -void func_i3_801A0DF8(f32, f32, f32, s32, f32); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0DF8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A0FD4.s") - -void func_i3_801A10F4(Player* player); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A10F4.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A1CD8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A1E14.s") - -void func_i3_801A1EB0(Boss* bossSO, f32 xPos, f32 xOffset, f32 yPos, f32 zPos) { - func_i3_8019E9F4(xPos + xOffset, yPos, zPos, 20.0f, (Rand_ZeroOne() * 10.0f) + 20.0f, 0.0f, 20.0f, 1); - func_i3_8019E9F4(xPos - xOffset, yPos, zPos, -20.0f, (Rand_ZeroOne() * 10.0f) + 20.0f, 0.0f, 20.0f, 1); -} - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A1F80.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A239C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A23F4.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A2C3C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A2C98.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A30CC.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A3128.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A3468.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A3510.s") - -// void func_i3_801A3C4C(Boss *bossSO) { -// Vec3f *sp2C; -// f32 *temp_v0_5; -// f32 *temp_v0_6; -// f32 *temp_v1; -// f32 *temp_v1_2; -// f32 *temp_v1_3; -// f32 *temp_v1_4; -// f32 *temp_v1_5; -// f32 *temp_v1_6; -// f32 *temp_v1_7; -// f32 *temp_v1_8; -// f32 temp_fv0; -// f32 temp_fv0_10; -// f32 temp_fv0_11; -// f32 temp_fv0_12; -// f32 temp_fv0_2; -// f32 temp_fv0_3; -// f32 temp_fv0_4; -// f32 temp_fv0_5; -// f32 temp_fv0_6; -// f32 temp_fv0_7; -// f32 temp_fv0_8; -// f32 temp_fv0_9; -// f32 var_fv0; -// s16 temp_v0; -// s16 temp_v0_2; - -// if ((bossSO->swork[2] == 0) && (bossSO->swork[3] == 0) && ((temp_v0 = bossSO->dmgPart, (temp_v0 == 8)) || -// (temp_v0 == -1))) { -// bossSO->health -= bossSO->damage; -// if (bossSO->health < 0) { -// bossSO->health = 0; -// } -// bossSO->swork[10] = 20; -// if (bossSO->health > 0.0f) { -// Audio_PlaySfx(0x29433074U, bossSO->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); -// } -// } -// bossSO->timer_058 = 20; -// if ((bossSO->dmgPart > 0) && (bossSO->dmgPart < 4) && (bossSO->swork[2] != 0)) { -// Audio_PlaySfx(0x29433074U, bossSO->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); -// bossSO->swork[2] -= bossSO->damage; -// if (bossSO->swork[2] < 0) { -// bossSO->swork[2] = 0; -// } -// if (bossSO->swork[2] == 0) { -// bossSO->info.hitbox->unk1C = bossSO->info.hitbox->unk34 = bossSO->info.hitbox->unk4C = 0.0f; -// bossSO->info.hitbox->unk20 = bossSO->info.hitbox->unk38 = bossSO->info.hitbox->unk50 = 0.0f; -// bossSO->info.hitbox[2].unk4C = 0.0f; -// temp_fv0_3 = bossSO->info.hitbox[2].unk4C; -// bossSO->info.hitbox[2].unk34 = temp_fv0_3; -// bossSO->info.hitbox[2].unk1C = temp_fv0_3; -// bossSO->info.hitbox[2].unk50 = 0.0f; -// temp_fv0_4 = bossSO->info.hitbox[2].unk50; -// bossSO->info.hitbox[2].unk38 = temp_fv0_4; -// bossSO->info.hitbox[2].unk20 = temp_fv0_4; -// bossSO->info.hitbox[2].unk54 = 0.0f; -// temp_fv0_5 = bossSO->info.hitbox[2].unk54; -// bossSO->info.hitbox[2].unk3C = temp_fv0_5; -// bossSO->info.hitbox[2].unk24 = temp_fv0_5; -// bossSO->info.hitbox[2].unk58 = 0.0f; -// temp_fv0_6 = bossSO->info.hitbox[2].unk58; -// bossSO->info.hitbox[2].unk40 = temp_fv0_6; -// bossSO->info.hitbox[2].unk28 = temp_fv0_6; -// bossSO->swork[2] = -1; -// func_i3_801A48B8(bossSO); -// } else { -// bossSO->swork[8] = 20; -// } -// } -// if ((bossSO->dmgPart >= 4) && (bossSO->dmgPart < 7) && (bossSO->swork[3] != 0)) { -// Audio_PlaySfx(0x29433074, bossSO->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); -// bossSO->swork[3] -= bossSO->damage; -// if (bossSO->swork[3] < 0) { -// bossSO->swork[3] = 0; -// } -// if (bossSO->swork[3] == 0) { -// bossSO->info.hitbox->unk94 = 0.0f; -// temp_fv0_7 = bossSO->info.hitbox->unk94; -// bossSO->info.hitbox->unk7C = temp_fv0_7; -// bossSO->info.hitbox->unk64 = temp_fv0_7; -// bossSO->info.hitbox->unk98 = 0.0f; -// temp_fv0_8 = bossSO->info.hitbox->unk98; -// bossSO->info.hitbox->unk80 = temp_fv0_8; bossSO->info.hitbox->unk68 = temp_fv0_8; -// bossSO->info.hitbox[2].unk94 = 0.0f; -// temp_fv0_9 = bossSO->info.hitbox[2].unk94; -// bossSO->info.hitbox[2].unk7C = temp_fv0_9; -// bossSO->info.hitbox[2].unk64 = temp_fv0_9; -// bossSO->info.hitbox[2].unk98 = 0.0f; -// temp_fv0_10 = bossSO->info.hitbox[2].unk98; -// bossSO->info.hitbox[2].unk80 = temp_fv0_10; -// bossSO->info.hitbox[2].unk68 = temp_fv0_10; -// bossSO->info.hitbox[2].unk9C = 0.0f; -// temp_fv0_11 = bossSO->info.hitbox[2].unk9C; -// bossSO->info.hitbox[2].unk84 = temp_fv0_11; -// bossSO->info.hitbox[2].unk6C = temp_fv0_11; -// bossSO->info.hitbox[2].unkA0 = 0.0f; -// temp_fv0_12 = bossSO->info.hitbox[2].unkA0; -// bossSO->info.hitbox[2].unk88 = temp_fv0_12; -// bossSO->info.hitbox[2].unk70 = temp_fv0_12; -// bossSO->swork[3] = -1; -// func_i3_801A48B8(bossSO); -// } else { -// bossSO->swork[9] = 20; -// } -// } -// if (bossSO->health <= 0) { -// bossSO->unk_04C = 21; -// bossSO->actionState = 0; -// bossSO->swork[1] = 1; -// bossSO->fwork[0] = 0.01f; -// bossSO->info.hitbox = SEGMENTED_TO_VIRTUAL(D_800CBF34); -// bossSO->timer_058 = 20000; -// D_8017796C = -1; -// D_80178354 = 255; -// D_80178350 = 255; -// D_80178340 = 255; -// D_80178348 = 255; -// D_80178358 = 0; -// D_8017835C = 255; -// gCsFrameCount = 0; -// D_80137E84[gMainController] = 1; -// D_Timer_80177BD0[gMainController] = 10; -// func_800182F4(0x100100FF); -// func_800182F4(0x110100FF); -// func_8001A838(0x4100C023U); -// Audio_PlaySfx(0x2940D09AU, bossSO->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); -// if (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_3) { -// gPlayer[0].state_1C8 = PLAYERSTATE_1C8_7; -// gPlayer[0].timer_1F8 = 0; -// gPlayer[0].unk_1D0 = gPlayer[0].timer_1F8; -// gPlayer[0].unk_0E8 += gPlayer[0].unk_114; -// if (gPlayer[0].unk_0E8 > 360.0f) { -// gPlayer[0].unk_0E8 -= 360.0f; -// } -// if (gPlayer[0].unk_0E8 < 0.0f) { -// gPlayer[0].unk_0E8 += 360.0f; -// } -// gPlayer[0].unk_114 = 0.0f; -// } -// bossSO->fwork[31] = 0.0f; -// bossSO->fwork[3] = 2400.0f; -// func_800BA808(gMsg_ID_15252, RCID_SLIPPY); -// } -// } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A3C4C.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A4214.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A48B8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A4A34.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A4EC0.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A4EF8.s") - -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A56B8.s") - -BossSOfunc D_i3_801BF980[9] = { - func_i3_801A1F80, func_i3_801A23F4, func_i3_801A2C98, func_i3_801A3128, func_i3_801A3510, - func_i3_801A4214, func_i3_801A4A34, func_i3_801A4EF8, func_i3_801A56B8, -}; - -// OBJ_BOSS_SO action -void func_i3_801A5B3C(Boss* bossSO); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i3/sf_so/func_i3_801A5B3C.s") - -s32 func_i3_801A68A8(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { - Boss* this = thisx; - Vec3f sp58 = { 0.0f, 0.0f, 0.0f }; - Vec3f sp4C = { 10.0f, 0.0f, 0.0f }; - Vec3f sp40 = { -10.0f, 0.0f, 0.0f }; - - GPC(D_i3_801C2740[1], D_i3_801C2740[0], D_i3_801C2740[0], 255); - if (this->fwork[3] < 4800.0f) { - RCP_SetupDL_30(0x40, 0x20, 0x20, gFogAlpha, gFogNear, gFogFar); - } else { - RCP_SetupDL_30(0x10, 0x10, 0x10, gFogAlpha, gFogNear, gFogFar); - } - switch (limbIndex) { - case 11: - rot->y -= D_i3_801C2768[1]; - rot->z += D_i3_801C2768[0]; - /* fallthrough */ - case 1: - if (this->swork[4] != 0) { - *dList = NULL; - } else { - if (this->swork[10] != 0) { - if (this->swork[10] & 1) { - GPC(32, 32, 128, 255); - rot->z += 3.0f; - } else { - rot->z -= 3.0f; - } - } - } - break; - case 2: - case 3: - case 4: - if (this->swork[2] == 0) { - *dList = NULL; - } - if ((this->swork[8] & 1) != 0) { - if ((this->swork[8] & 1) != 0) { - GPC(32, 32, 128, 255); - rot->y += 3.0f; - } else { - rot->y -= 3.0f; - } - } - break; - case 5: - case 6: - case 7: - if (this->swork[3] == 0) { - *dList = NULL; - } - if ((this->swork[9] & 1) != 0) { - if ((this->swork[9] & 1) != 0) { - GPC(32, 32, 128, 255); - rot->y += 3.0f; - } else { - rot->y -= 3.0f; - } - } - break; - } - return false; -} - -void func_i3_801A6BDC(s32 limbIndex, Vec3f* rot, void* thisx) { - Boss* this = thisx; - Vec3f spA0 = { 90.0f, 0.0f, -10.0f }; - Vec3f sp94 = { 135.0f, 0.0f, -40.0f }; - Vec3f sp88 = { 106.0f, 0.0f, 0.0f }; - Vec3f sp7C = { 75.0f, 0.0f, 0.0f }; - Vec3f sp70 = { 85.0f, 0.0f, 0.0f }; - Vec3f sp64 = { 10.0f, 2.0f, 0.0f }; - Vec3f sp58 = { 10.0f, -2.0f, 0.0f }; - Vec3f sp4C = { 0.0f, 0.05f, 0.0f }; - Vec3f sp40 = { 0.0f, -0.05f, 0.0f }; - Vec3f sp34 = { 0.0f, 0.0f, 0.0f }; - Vec3f sp28; - - switch (limbIndex) { - case 11: - Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); - this->fwork[4] = sp28.x; - this->fwork[5] = sp28.y; - this->fwork[6] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, &sp28); - this->fwork[1] = sp28.x; - this->fwork[2] = sp28.y; - break; - case 2: - if (this->swork[2] > 0) { - Matrix_Push(&gCalcMatrix); - Matrix_MultVec3f(gCalcMatrix, &sp88, &sp28); - this->fwork[28] = sp28.x; - this->fwork[29] = sp28.y; - this->fwork[30] = sp28.z; - Matrix_Pop(&gCalcMatrix); - Matrix_MultVec3f(gCalcMatrix, &spA0, &sp28); - this->fwork[16] = sp28.x; - this->fwork[17] = sp28.y; - this->fwork[18] = sp28.z; - } - if (this->swork[2] < 0) { - Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); - this->fwork[28] = sp28.x; - this->fwork[29] = sp28.y; - this->fwork[30] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[41]); - } - break; - default: - break; - case 3: - if (this->swork[2] > 0) { - Matrix_MultVec3f(gCalcMatrix, &sp7C, &sp28); - this->fwork[22] = sp28.x; - this->fwork[23] = sp28.y; - this->fwork[24] = sp28.z; - } - if (this->swork[2] < 0) { - Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); - this->fwork[22] = sp28.x; - this->fwork[23] = sp28.y; - this->fwork[24] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[47]); - } - break; - case 4: - if (this->swork[2] > 0) { - Matrix_MultVec3f(gCalcMatrix, &sp70, &sp28); - this->fwork[10] = sp28.x; - this->fwork[11] = sp28.y; - this->fwork[12] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[35]); - } else { - if (gBosses[0].swork[0] != 7) { - Matrix_MultVec3f(gCalcMatrix, &sp64, &sp28); - } else { - Matrix_MultVec3f(gCalcMatrix, &sp4C, &sp28); - } - this->fwork[10] = sp28.x; - this->fwork[11] = sp28.y; - this->fwork[12] = sp28.z; - } - break; - case 5: - if (this->swork[3] > 0) { - Matrix_Push(&gCalcMatrix); - Matrix_MultVec3f(gCalcMatrix, &sp88, &sp28); - this->fwork[25] = sp28.x; - this->fwork[26] = sp28.y; - this->fwork[27] = sp28.z; - Matrix_Pop(&gCalcMatrix); - Matrix_MultVec3f(gCalcMatrix, &spA0, &sp28); - this->fwork[13] = sp28.x; - this->fwork[14] = sp28.y; - this->fwork[15] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[38]); - } - if (this->swork[3] < 0) { - Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); - this->fwork[25] = sp28.x; - this->fwork[26] = sp28.y; - this->fwork[27] = sp28.z; - } - break; - case 6: - if (this->swork[3] > 0) { - Matrix_MultVec3f(gCalcMatrix, &sp7C, &sp28); - this->fwork[19] = sp28.x; - this->fwork[20] = sp28.y; - this->fwork[21] = sp28.z; - } - if (this->swork[3] < 0) { - Matrix_MultVec3f(gCalcMatrix, &sp34, &sp28); - this->fwork[19] = sp28.x; - this->fwork[20] = sp28.y; - this->fwork[21] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[44]); - } - break; - case 7: - if (this->swork[3] > 0) { - Matrix_MultVec3f(gCalcMatrix, &sp70, &sp28); - this->fwork[7] = sp28.x; - this->fwork[8] = sp28.y; - this->fwork[9] = sp28.z; - Matrix_GetYRPAngles(gCalcMatrix, (Vec3f*) &this->fwork[32]); - } else { - if (gBosses[0].swork[0] != 7) { - Matrix_MultVec3f(gCalcMatrix, &sp58, &sp28); - } else { - Matrix_MultVec3f(gCalcMatrix, &sp40, &sp28); - } - this->fwork[7] = sp28.x; - this->fwork[8] = sp28.y; - this->fwork[9] = sp28.z; - } - break; - } -} - -void func_i3_801A71B8(Boss* bossSO) { - s32 i; - Vec3f spE8[9] = { - { 150.0f, 300.0f, 100.0f }, { -100.0f, 200.0f, 100.0f }, { 50.0f, 100.0f, 100.0f }, - { 0.0f, 0.0f, -500.0f }, { 790.0f, 630.0f, -600.0f }, { 280.0f, 140.0f, 500.0f }, - { -210.0f, 110.0f, 500.0f }, { -460.0f, 260.0f, 500.0f }, { 380.0f, 290.0f, 500.0f }, - }; - f32 spC4[9] = { - -1.0f, -0.3f, -2.0f, 121.0f, 209.0f, 183.0f, 181.0f, 167.0f, 182.0f, - }; - f32 spA0[9] = { - -89.0f, -90.0f, -88.0f, -36.0f, -73.0f, -95.0f, -91.0f, -83.0f, -91.0f, - }; - - Matrix_Scale(gCalcMatrix, bossSO->unk_3F8, bossSO->unk_3F8, bossSO->unk_3F8, 1); - if (gBossActive != 0) { - Animation_DrawSkeleton(2, D_600E470, bossSO->vwork, func_i3_801A68A8, func_i3_801A6BDC, bossSO, gCalcMatrix); - } - if (bossSO->health <= 0) { - RCP_SetupDL_49(); - GPC(255, 255, 255, 255); - GEC(255, 192, 0, 255); - Matrix_Pop(&gGfxMatrix); - Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y, bossSO->obj.pos.z - 500.0f + D_80177D20, 1); - Matrix_Scale(gGfxMatrix, D_i3_801C2768[3], D_i3_801C2768[2], 1.0f, 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_1024AC0); - for (i = 0; i < 9; i++) { - Matrix_Pop(&gGfxMatrix); - Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x + spE8[i].x, bossSO->obj.pos.y + spE8[i].y, - bossSO->obj.pos.z + D_80177D20 + spE8[i].z, 1); - Matrix_RotateY(gGfxMatrix, spC4[i] * M_DTOR, 1); - Matrix_RotateX(gGfxMatrix, spA0[i] * M_DTOR, 1); - Matrix_Scale(gGfxMatrix, D_i3_801C2768[i + 4], 100.0f, 1.0f, 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_1024AC0); - } - if (D_i3_801C2768[13] > 0.0f) { - GPC(255, 192, 64, 255); - Matrix_Pop(&gGfxMatrix); - Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y + 230.0f, - (bossSO->obj.pos.z - 300.0f) + D_80177D20, 1); - Matrix_RotateX(gGfxMatrix, 0.08726646f, 1); - Matrix_Scale(gGfxMatrix, D_i3_801C2768[13], 1.0f, D_i3_801C2768[13], 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_20112C0); - Matrix_Scale(gGfxMatrix, 0.6f, 1.0f, 0.6f, 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_20112C0); - Matrix_Pop(&gGfxMatrix); - Matrix_Push(&gGfxMatrix); - Matrix_Translate(gGfxMatrix, bossSO->obj.pos.x, bossSO->obj.pos.y + 270.0f, - (bossSO->obj.pos.z - 300.0f) + D_80177D20, 1); - Matrix_RotateX(gGfxMatrix, -0.05235988f, 1); - Matrix_Scale(gGfxMatrix, D_i3_801C2768[13], 1.0f, D_i3_801C2768[13], 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_20112C0); - Matrix_Scale(gGfxMatrix, 0.6f, 1.0f, 0.6f, 1); - Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_20112C0); - } - } -} - -Vec3f D_i3_801BFAF4[5] = { - { 0.0f, 10.0f, 20.0f }, { 300.0f, 100.0f, 200.0f }, { 100.0f, 60.0f, -260.0f }, - { 80.0f, 100.0f, 80.0f }, { 262.0f, 285.0f, 252.0f }, -}; - -Vec3f D_i3_801BFB30[3] = { - { 0.0f, 50.0f, 500.0f }, - { -500.0f, 0.0f, 250.0f }, - { 500.0f, 0.0f, 250.0f }, -}; - -void func_i3_801A7750(void) { - Actor* var_s0 = gActors; - s32 i; - Vec3f* temp; - - Rand_SetSeed(1, 29100, 9786); - - for (i = 0; i < 3; i++, var_s0++) { - temp = &D_i3_801BFB30[i]; - if ((i == 0) && (gTeamShields[3] <= 0.0f)) { - continue; - } - if ((i == 1) && (gTeamShields[2] <= 0.0f)) { - continue; - } - if ((i == 2) && (gTeamShields[1] <= 0.0f)) { - continue; - } - - Actor_Initialize(var_s0); - var_s0->obj.status = OBJ_INIT; - var_s0->obj.id = OBJ_ACTOR_195; - - var_s0->obj.pos.x = gPlayer[0].pos.x + temp->x / 2.0f; - var_s0->obj.pos.y = gPlayer[0].pos.y + temp->y; - var_s0->obj.pos.z = gPlayer[0].pos.z + temp->z; - var_s0->unk_0B8 = 1; - Object_SetInfo(&var_s0->info, var_s0->obj.id); - var_s0->iwork[11] = 1; - Audio_PlaySfx(0x3100000C, var_s0->sfxPos, 4, &D_800C5D34, &D_800C5D34, &D_800C5D3C); - } -} - -void func_i3_801A7930(Player* player) { - s32 i; - f32 sp78; - f32 temp_fv1; - f32 dx; - f32 dz; - Vec3f sp60; - Vec3f sp54; - Boss* bossSO = &gBosses[0]; - - switch (player->unk_1D0) { - case 0: - gCsFrameCount = 0; - player->unk_034 = player->unk_4D8 = 0.0f; - player->unk_0D0 = 40.0f; - - player->wings.unk_04 = player->wings.unk_0C = player->wings.unk_08 = player->wings.unk_10 = - player->unk_130 = player->unk_12C = player->unk_110 = 0.0f; - player->unk_234 = 1; - D_80177978 = player->camEye.x; - D_80177980 = player->camEye.y; - D_80177988 = player->camEye.z; - D_801779A0 = player->camAt.x; - D_801779B8 = player->camAt.y; - D_801779C0 = player->camAt.z; - for (i = 10; i < 60; i++) { - if (gActors[i].unk_0B6 == 0) { - Object_Kill(&gActors[i].obj, gActors[i].sfxPos); - } - } - Object_Kill(&gActors[2].obj, gActors[2].sfxPos); - Object_Kill(&gActors[3].obj, gActors[3].sfxPos); - Object_Kill(&gActors[4].obj, gActors[4].sfxPos); - player->unk_1D0 = 1; - D_80177A48[0] = 0.1f; - if (Rand_ZeroOne() > 0.5f) { - D_80177A48[9] = -1.0f; - } else { - D_80177A48[9] = 1.0f; - } - break; - case 1: - D_80177CE8 += 30.0f; - Math_SmoothStepToF(&player->unk_0E4, 0.0f, 0.1f, 5.0f, 0.0f); - Math_SmoothStepToF(&player->pos.y, 200.0f, 0.05f, 10.0f, 0.0f); - dx = player->pos.x - bossSO->obj.pos.x; - dz = (player->pos.z - bossSO->obj.pos.z) * 0.05f; - sp78 = Math_RadToDeg(-Math_Atan2F(dx, dz)); - Math_SmoothStepToF(&D_80177980, 300.0f, 1.0f, 20.0f, 0.0f); - Math_SmoothStepToF(&D_801779B8, 290.0f, 1.0f, 20.0f, 0.0f); - temp_fv1 = Math_SmoothStepToAngle(&player->unk_0E8, sp78, 0.5f, 2.0f, 0.0001f) * 30.0f; - if (gCsFrameCount >= 0xE) { - Math_SmoothStepToAngle(&player->unk_0EC, temp_fv1, 0.1f, 5.0f, 0.0001f); - D_801779A0 = 0.0f; - D_80177978 = 0.0f; - } else if (temp_fv1 < 0.0f) { - player->unk_0EC -= 30.0f; - } else { - player->unk_0EC += 30.0f; - } - if (gCsFrameCount >= 0xC8) { - player->unk_0E4 += 1.0f; - player->unk_0E8 += 1.0f; - player->unk_0EC += 1.0f; - } - if (gCsFrameCount >= 0xE6) { - D_80178358 = 0xFF; - D_80178348 = D_80178354 = D_80178350 = 0xFF; - } - if (gCsFrameCount == 0xE6) { - func_800182F4(0x103200FF); - func_800182F4(0x113200FF); - } - if (gCsFrameCount == 0x190) { - player->unk_1D0++; - func_800A6148(); - func_8001CA24(0); - Audio_KillSfx(player->sfxPos); - D_80178340 = 0xFA; - player->timer_1F8 = 0x14; - player->unk_0D0 = 0.0f; - player->unk_0E4 = 0.0f; - player->unk_0E8 = 0.0f; - player->unk_0EC = 0.0f; - } - break; - case 2: - D_80177CE8 += 60.0f; - if (player->timer_1F8 == 0) { - player->pos.x = 0.0f; - player->pos.y = 200.0f; - player->pos.z = -(D_80177D20 - 500.0f); - player->unk_1D0++; - player->wings.unk_2C = 1; - func_8001C8B8(0); - func_8001D444(0, 0x26, 0, 0xFF); - D_80177A98 = 1; - func_800A6148(); - D_80177A48[1] = 0.0f; - D_80177A48[2] = 0.0f; - player->camEye.x = 0.0f; - player->camEye.y = player->pos.y + 80.0f; - player->camEye.z = player->pos.z + D_80177D20 - 4000.0f; - D_80177988 = player->pos.z + D_80177D20 - 4900.0f; - player->camAt.x = D_801779A0 = 0.0f; - player->camAt.y = D_801779B8 = 200.0f; - player->camAt.z = D_801779C0 = player->pos.z + D_80177D20; - D_80177A48[0] = 0.0f; - Object_Kill(&gActors[4].obj, gActors[4].sfxPos); - Object_Kill(&gActors[5].obj, gActors[5].sfxPos); - } - break; - case 3: - D_80177CE8 += 60.0f; - D_80178358 = 0; - D_8017835C = 4; - if (D_801782F8 != 0) { - player->wings.unk_30 = (gGameFrameCount & 1) * 5.0f; - } - switch (gCsFrameCount) { - case 0x1C2: - func_i3_801A0DF8(-1200.0f, -(D_80177D20 + 2500.0f), 90.0f, 2, 1.0f); - break; - case 0x221: - func_i3_801A0DF8(1400.0f, -(D_80177D20 + 3250.0f), -90.0f, 3, 1.0f); - break; - case 0x226: - Object_Kill(&gActors[4].obj, gActors[4].sfxPos); - break; - case 0x285: - Object_Kill(&gActors[5].obj, gActors[5].sfxPos); - break; - case 0x2BC: - player->unk_1D0++; - func_i3_801A7750(); - D_i3_801C2768[3] = 1000.0f; - break; - } - if ((gCsFrameCount >= 0x208) && (gCsFrameCount < 0x25D)) { - Math_SmoothStepToF(&player->pos.x, 400.0f, 0.1f, 10.0f, 0.1f); - } - if ((gCsFrameCount >= 0x208) && (gCsFrameCount < 0x23A)) { - Math_SmoothStepToAngle(&player->unk_0EC, -30.0f, 0.1f, 5.0f, 0.1f); - } - if ((gCsFrameCount >= 0x23A) && (gCsFrameCount < 0x25D)) { - Math_SmoothStepToAngle(&player->unk_0EC, 0.0f, 0.1f, 5.0f, 0.1f); - } - if ((gCsFrameCount >= 0x25D) && (gCsFrameCount < 0x26C)) { - player->unk_0EC += 30.0f; - } - if ((gCsFrameCount >= 0x26C) && (gCsFrameCount < 0x280)) { - Math_SmoothStepToAngle(&player->unk_0EC, 45.0f, 0.1f, 5.0f, 0.0f); - } - if (gCsFrameCount >= 0x280) { - Math_SmoothStepToAngle(&player->unk_0EC, 0.0f, 0.3f, 7.0f, 0.0f); - } - if (gCsFrameCount >= 0x249) { - Math_SmoothStepToF(&player->pos.x, 0.0f, 0.2f, 9.0f, 0); - } - if (gCsFrameCount >= 0x258) { - Math_SmoothStepToF(&player->pos.y, 950.0f, 0.1f, 10.0f, 0.0001f); - } - Math_SmoothStepToF(&player->pos.z, -(D_80177D20 + 4350.0f), 1.0f, 20.0f, 0.0001f); - if (gCsFrameCount >= 0x26C) { - Math_SmoothStepToF(&player->camEye.x, 0.0f, 1.0f, 10.0f, 0); - Math_SmoothStepToF(&player->camEye.y, player->pos.y + 52.0f, 1.0f, 16.0f, 0.0f); - Math_SmoothStepToF(&player->camEye.z, (player->pos.z + D_80177D20) - 50.0f, 1.0f, 21.5f, 0.0f); - } - player->camAt.x = D_801779A0 = player->pos.x; - player->camAt.y = D_801779B8 = player->pos.y; - player->camAt.z = D_801779C0 = player->pos.z + D_80177D20; - break; - case 4: - D_80177CE8 += 60.0f; - D_80178358 = 0; - D_8017835C = 4; - D_80177A48[1] += D_80177A48[2] * 0.8f; - Matrix_RotateY(gCalcMatrix, D_80177A48[1] * M_DTOR, 0); - sp60.x = 0.0f; - sp60.y = 0.0f; - sp60.z = -700.0f; - Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp60, &sp54); - if (gCsFrameCount < 0x5A0) { - D_80177978 = sp54.x; - D_80177980 = D_i3_801C2768[3] + sp54.y; - D_80177988 = player->pos.z + D_80177D20 + sp54.z; - D_801779A0 = 0.0f; - D_801779B8 = player->pos.y + 75.0f; - Math_SmoothStepToF(&D_i3_801C2768[3], 500.0f, 0.1f, 1.0f, 0.0001f); - D_801779C0 = player->pos.z + D_80177D20 + 200.0f; - if (gCsFrameCount >= 0x578) { - D_801779C0 -= (gCsFrameCount * 8) - 11200; - } - } else { - Math_SmoothStepToF(&D_80177978, 0.0f, 0.1f, 1.0f, 0.0001f); - D_801779A0 = 0.0f; - D_801779B8 = player->pos.y + 75.0f; - D_801779C0 = player->pos.z + D_80177D20 + 200.0f - ((gCsFrameCount * 8) - 11200); - } - if (gCsFrameCount >= 0x5B5) { - player->unk_0D0 += 2.0f; - player->unk_0E4 += 0.2f; - Math_SmoothStepToF(&D_80177A48[2], 0.0f, 1.0f, 0.001f, 0); - player->unk_190 = 2.0f; - } else { - Math_SmoothStepToF(&D_80177A48[2], 0.23f, 1.0f, 0.001f, 0.0f); - Math_SmoothStepToF(&D_80177A48[0], 0.5f, 0.1f, 0.0005f, 0.0f); - } - if (gCsFrameCount == 0x618) { - func_800A6148(); - } - if (gCsFrameCount >= 0x5FB) { - D_80178358 = 0xFF; - D_80178348 = D_80178350 = D_80178354 = 0; - D_8017835C = 8; - if (D_80178340 == 0xFF) { - func_8001CA24(0); - func_8001DBD0(10); - player->state_1C8 = PLAYERSTATE_1C8_6; - player->timer_1F8 = 0; - D_8017837C = 4; - D_800D3180[LEVEL_SOLAR] = Play_CheckMedalStatus(100) + 1; - } - } - break; - } - switch (gCsFrameCount) { - case 0x1B8: - D_80177840 = 0x64; - break; - case 0x280: - func_800BA808(gMsg_ID_20010, RCID_FOX); - break; - case 0x2D8: - switch (gTeamShields[2]) { - case 0: - func_800BA808(gMsg_ID_20345, RCID_ROB64); - break; - case -1: - func_800BA808(gMsg_ID_20339, RCID_ROB64); - break; - default: - func_80048AC0(2); - break; - } - break; - case 0x36B: - switch (gTeamShields[3]) { - case 0: - func_800BA808(gMsg_ID_20344, RCID_ROB64); - break; - case -1: - func_800BA808(gMsg_ID_20338, RCID_ROB64); - break; - default: - func_80048AC0(3); - break; - } - break; - case 0x3FD: - switch (gTeamShields[1]) { - case 0: - func_800BA808(gMsg_ID_20343, RCID_ROB64); - break; - case -1: - func_800BA808(gMsg_ID_20337, RCID_ROB64); - break; - default: - func_80048AC0(1); - break; - } - break; - case 0x4A2: - D_80177830 = 1; - break; - case 0x56A: - D_80177830 = 0; - break; - case 0x5B4: - Audio_PlaySfx(0x09000002, player->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); - player->unk_190 = player->unk_194 = 5.0f; - break; - case 0x578: - if (gTeamShields[3] > 0) { - gActors[0].unk_0B8 = 2; - } - break; - case 0x5DC: - func_800182F4(0x103200FF); - func_800182F4(0x113200FF); - break; - case 0x58C: - if (gTeamShields[2] > 0) { - gActors[1].unk_0B8 = 2; - } - break; - case 0x5A0: - if (gTeamShields[1] > 0) { - gActors[2].unk_0B8 = 2; - } - break; - } - Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8 + 180.0f) * M_DTOR, 0); - Matrix_RotateX(gCalcMatrix, -((player->unk_120 + player->unk_0E4) * M_DTOR), 1); - sp60.x = 0.0f; - sp60.y = 0.0f; - sp60.z = player->unk_0D0; - Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp60, &sp54); - player->vel.x = sp54.x; - player->vel.z = sp54.z; - player->vel.y = sp54.y; - - player->pos.x += player->vel.x; - player->pos.y += player->vel.y; - player->pos.z += player->vel.z; - - player->unk_138 = player->pos.z; - player->unk_0F8 = player->unk_0EC; - Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0.0f); - Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0.0f); - Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0.0f); - Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0.0f); - Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0.0f); - Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0.0f); - player->unk_088 += 10.0f; - player->unk_080 = -__sinf(player->unk_088 * M_DTOR) * 0.3f; - player->unk_0F4 += 8.0f; - player->unk_0F0 = __sinf(player->unk_0F4 * M_DTOR); -} - -void func_i3_801A8BE8(Actor* actor) { - Vec3f sp3C; - Vec3f sp30; - - switch (actor->unk_0B8) { - case 4: - break; - case 1: - if ((actor->unk_0B6 != 0) && ((((actor->index & 7) * 10) + 1030) < gCsFrameCount)) { - actor->unk_0B8 = 4; - } - break; - case 2: - actor->unk_0B8 = 3; - Audio_PlaySfx(0x09000002, actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); - actor->fwork[29] = 5.0f; - /* fallthrough */ - case 3: - actor->iwork[11] = 2; - actor->fwork[0] += 2.0f; - actor->unk_0F4.x += 0.2f; - break; - } - Matrix_RotateY(gCalcMatrix, (actor->unk_0F4.y + 180.0f) * M_DTOR, 0); - Matrix_RotateX(gCalcMatrix, -(actor->unk_0F4.x * M_DTOR), 1); - sp3C.x = 0.0f; - sp3C.y = 0.0f; - sp3C.z = actor->fwork[0]; - Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp3C, &sp30); - actor->vel.x = sp30.x; - actor->vel.y = sp30.y; - actor->vel.z = sp30.z; - actor->obj.rot.x = -actor->unk_0F4.x; - actor->obj.rot.y = actor->unk_0F4.y + 180.0f; - - actor->obj.rot.z = -actor->unk_0F4.z; -} - -void func_i3_801A8DB8(Vec3f* arg0, u32 arg1, f32 arg2) { - s32 i; - - for (i = 0; i < ARRAY_COUNT(gEffects); i++) { - if (gEffects[i].obj.status == OBJ_FREE) { - func_8007A5F8(&gEffects[i], arg0, arg1); - gEffects[i].vel.z = arg2; - break; - } - } -} diff --git a/src/overlays/ovl_i6/fox_ve2.c b/src/overlays/ovl_i6/fox_ve2.c index f44cb1ac..44ecf33c 100644 --- a/src/overlays/ovl_i6/fox_ve2.c +++ b/src/overlays/ovl_i6/fox_ve2.c @@ -348,14 +348,14 @@ extern Gfx* D_6009300; void func_i6_80188660(Actor* actor) { RCP_SetupDL(&gMasterDisp, 0x3D); - GPC(255, 255, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); Matrix_RotateZ(gGfxMatrix, actor->unk_0F4.z * M_DTOR, 1); Matrix_Scale(gGfxMatrix, 1.1f, 0.9f, 1.0f, 1); Matrix_RotateZ(gGfxMatrix, -actor->unk_0F4.z * M_DTOR, 1); Matrix_Scale(gGfxMatrix, 1.1f, 0.9f, 1.0f, 1); Matrix_Scale(gGfxMatrix, 3.0f, 3.0f, 1.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(&D_6009300); + gSPDisplayList(gMasterDisp++, &D_6009300); } void func_i6_801887B0(Actor* actor, f32 xPos, f32 yPos, f32 zPos, f32 xVel, f32 yVel, f32 zVel) { @@ -1169,13 +1169,13 @@ s32 func_i6_8018B47C(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d if (boss->fwork[21] >= 254.0f) { if (limbIndex == 2) { RCP_SetupDL(&gMasterDisp, 0x16); - GPC((s32) boss->fwork[25], 255, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) boss->fwork[25], 255, 255, 255); } else { RCP_SetupDL(&gMasterDisp, 0x17); } } else { RCP_SetupDL(&gMasterDisp, 0x33); - GPC(255, 255, 255, (s32) boss->fwork[21]); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, (s32) boss->fwork[21]); } if ((limbIndex == 2) && (boss->swork[6] != 0)) { *dList = NULL; @@ -1202,10 +1202,10 @@ s32 func_i6_8018B47C(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d Matrix_SetGfxMtx(&gMasterDisp); if ((boss->swork[3] & 1) && (boss->fwork[21] >= 254.0f)) { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } - GDL(*dList); + gSPDisplayList(gMasterDisp++, *dList); Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gCalcMatrix); } @@ -1235,12 +1235,12 @@ void func_i6_8018B8C0(Boss* boss) { Animation_DrawSkeleton(0, D_600C0A4, boss->vwork, func_i6_8018B47C, NULL, boss, &gIdentityMatrix); if (boss->fwork[21] >= 254) { RCP_SetupDL(&gMasterDisp, 0x36); - GPC(255, 64, 64, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 64, 64, 255); } else { RCP_SetupDL(&gMasterDisp, 0x46); - GPC(255, 64, 64, (s32) boss->fwork[21]); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 64, 64, (s32) boss->fwork[21]); } - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); Matrix_Translate(gGfxMatrix, 0.0f, -16.0f, 0.0f, 1); Matrix_Scale(gGfxMatrix, 0.3f, 0.6f, 0.3f, 1); @@ -1263,9 +1263,9 @@ void func_i6_8018B8C0(Boss* boss) { Matrix_Translate(gGfxMatrix, 0.0f, -5.0f, 0.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); if (j == 9) { - GDL(&D_600C2D0); + gSPDisplayList(gMasterDisp++, &D_600C2D0); } else { - GDL(&D_600C560); + gSPDisplayList(gMasterDisp++, &D_600C560); } Matrix_Pop(&gGfxMatrix); } @@ -1563,17 +1563,17 @@ static Gfx* D_i6_801A6790[10] = { void func_i6_8018CF98(Effect* effect) { if (effect->unk_4E == 10) { - GPC(255, 255, 255, effect->unk_44); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, effect->unk_44); Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(&D_2010A30); + gSPDisplayList(gMasterDisp++, &D_2010A30); } else { RCP_SetupDL(&gMasterDisp, 0x1D); if (effect->unk_4C < 8) { Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2, 1); Matrix_SetGfxMtx(&gMasterDisp); } - GDL(D_i6_801A6790[effect->unk_4C]); + gSPDisplayList(gMasterDisp++, D_i6_801A6790[effect->unk_4C]); RCP_SetupDL(&gMasterDisp, 0x40); } } @@ -2884,20 +2884,20 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d *dList = NULL; } else if (boss->swork[3] & 1) { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } } else if (boss->swork[4] < 0) { *dList = NULL; } else if (boss->swork[2] & 1) { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } } } else if (!(boss->timer_05C & 1)) { RCP_SetupDL(&gMasterDisp, 0x1D); } else { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } switch (limbIndex) { @@ -2914,7 +2914,7 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d rot->y -= boss->vwork[4].y; if (boss->swork[0] & 1) { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } if (boss->swork[11] != 0) { *dList = D_C0043D0; @@ -2927,7 +2927,7 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d rot->y -= boss->vwork[5].y; if (boss->swork[1] & 1) { RCP_SetupDL(&gMasterDisp, 0x1B); - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } if (boss->swork[12] != 0) { *dList = D_C015740; @@ -3010,20 +3010,20 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d Matrix_Push(&gCalcMatrix); Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(*dList); + gSPDisplayList(gMasterDisp++, *dList); RCP_SetupDL(&gMasterDisp, 0x29); switch (gGameFrameCount & 3) { case 0: - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); break; case 1: - GPC(0, 255, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 255, 0, 255); break; case 2: - GPC(0, 0, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 255, 255); break; case 3: - GPC(255, 255, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); break; } Matrix_Translate(gGfxMatrix, D_i6_801A67DC.x, D_i6_801A67DC.y, D_i6_801A67DC.z, 1); @@ -3031,7 +3031,7 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d Matrix_RotateY(gGfxMatrix, D_i6_801A67EC * M_DTOR, 1); Matrix_RotateX(gGfxMatrix, D_i6_801A67E8 * M_DTOR, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_C022520); + gSPDisplayList(gMasterDisp++, D_C022520); Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gCalcMatrix); } @@ -3049,20 +3049,20 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d Matrix_Push(&gCalcMatrix); Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(*dList); + gSPDisplayList(gMasterDisp++, *dList); RCP_SetupDL(&gMasterDisp, 0x29); switch (gGameFrameCount & 3) { case 0: - GPC(255, 0, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); break; case 1: - GPC(0, 255, 0, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 255, 0, 255); break; case 2: - GPC(0, 0, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 255, 255); break; case 3: - GPC(255, 255, 255, 255); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); break; } Matrix_Translate(gGfxMatrix, D_i6_801A67C4.x, D_i6_801A67C4.y, D_i6_801A67C4.z, 1); @@ -3070,7 +3070,7 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d Matrix_RotateY(gGfxMatrix, D_i6_801A67D4 * M_DTOR, 1); Matrix_RotateX(gGfxMatrix, D_i6_801A67D0 * M_DTOR, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_C022520); + gSPDisplayList(gMasterDisp++, D_C022520); Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gCalcMatrix); } @@ -3090,7 +3090,7 @@ s32 func_i6_801917F0(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* d func_8005F670(&sp88); Matrix_Mult(gGfxMatrix, gCalcMatrix, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(*dList); + gSPDisplayList(gMasterDisp++, *dList); } Matrix_Pop(&gCalcMatrix); return true; @@ -3199,23 +3199,23 @@ void func_i6_801928C8(Boss* boss) { if (boss->fwork[21] > 0.05f) { Matrix_Push(&gGfxMatrix); RCP_SetupDL(&gMasterDisp, 0x43); - GPC(255, 255, 255, 192); - GEC(255, 0, 128, 192); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 192); + gDPSetEnvColor(gMasterDisp++, 255, 0, 128, 192); Matrix_Scale(gGfxMatrix, boss->fwork[21] * 7.0f, boss->fwork[21] * 7.0f, boss->fwork[21] * 7.0f, 1); if (gGameFrameCount & 1) { Matrix_Scale(gGfxMatrix, 1.1f, 1.1f, 1.1f, 1); } Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_1024AC0); + gSPDisplayList(gMasterDisp++, D_1024AC0); Matrix_Pop(&gGfxMatrix); } Matrix_Scale(gGfxMatrix, boss->fwork[20] * 10.0f, boss->fwork[20] * 10.0f, boss->fwork[20] * 10.0f, 1); Matrix_RotateZ(gGfxMatrix, boss->fwork[19] * M_DTOR, 1); RCP_SetupDL(&gMasterDisp, 0x40); if (gGameFrameCount & 1) { - GPC(255, 255, 255, 128); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 128); } else { - GPC(255, 255, 255, 30); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 30); } Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, 0.0f, 1); @@ -3223,7 +3223,7 @@ void func_i6_801928C8(Boss* boss) { Matrix_Scale(gGfxMatrix, 0.3f, 1.0f, 1.0f, 1); Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 200.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_C017440); + gSPDisplayList(gMasterDisp++, D_C017440); Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, 2.0943952f, 1); @@ -3231,7 +3231,7 @@ void func_i6_801928C8(Boss* boss) { Matrix_Scale(gGfxMatrix, 0.3f, 1.0f, 1.0f, 1); Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 200.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_C017440); + gSPDisplayList(gMasterDisp++, D_C017440); Matrix_Pop(&gGfxMatrix); Matrix_Push(&gGfxMatrix); Matrix_RotateZ(gGfxMatrix, 4.1887903f, 1); @@ -3239,7 +3239,7 @@ void func_i6_801928C8(Boss* boss) { Matrix_Scale(gGfxMatrix, 0.3f, 1.0f, 1.0f, 1); Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 200.0f, 1); Matrix_SetGfxMtx(&gMasterDisp); - GDL(D_C017440); + gSPDisplayList(gMasterDisp++, D_C017440); Matrix_Pop(&gGfxMatrix); } Lights_SetOneLight(&gMasterDisp, gLight1x, gLight1y, gLight1z, gLight1R, gLight1G, gLight1B, gAmbientR, @@ -3314,7 +3314,7 @@ extern Gfx* D_6007E20; void func_i6_80193244(Actor* actor) { - GDL(&D_6007E20); + gSPDisplayList(gMasterDisp++, &D_6007E20); if (actor->timer_0BC != 0) { f32 scale; u8 alpha; @@ -3329,9 +3329,9 @@ void func_i6_80193244(Actor* actor) { Matrix_RotateX(gGfxMatrix, 1.5707964f, 1); Matrix_SetGfxMtx(&gMasterDisp); RCP_SetupDL(&gMasterDisp, 0x43); - GPC(255, 255, 255, alpha); - GEC(255, 128, 128, alpha); - GDL(D_1024AC0); + gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, alpha); + gDPSetEnvColor(gMasterDisp++, 255, 128, 128, alpha); + gSPDisplayList(gMasterDisp++, D_1024AC0); } } @@ -3393,7 +3393,7 @@ void func_i6_801935D4(Object_80* obj80) { Animation_GetFrameData(&D_6014658, obj80->unk_44, frameTable); if (gLevelMode == LEVELMODE_ALL_RANGE) { - GCGM_BACK(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); } Animation_DrawSkeleton(1, D_6014844, frameTable, func_i6_801935B4, NULL, NULL, &gIdentityMatrix); } diff --git a/yamls/us/overlays.yaml b/yamls/us/overlays.yaml index 4607becc..2c72e04b 100644 --- a/yamls/us/overlays.yaml +++ b/yamls/us/overlays.yaml @@ -56,21 +56,21 @@ - [0xE16C50, c, fox_i3] - [0xE16C60, c, fox_a6] - [0xE1F680, c, fox_zo] - - [0xE2DF20, c, sf_so] + - [0xE2DF20, c, fox_so] - [0xE38560, c, sf_aq] - [0xE4E3D0, .data, fox_i3] - [0xE4E3E0, .data, fox_a6] - [0xE4EC90, .data, fox_zo] - - [0xE4F010, .data, sf_so] + - [0xE4F010, .data, fox_so] - [0xE4F290, .data, sf_aq] - [0xE50030, .rodata, fox_a6] - [0xE504E0, .rodata, fox_zo] - - [0xE50C00, .rodata, sf_so] + - [0xE50C00, .rodata, fox_so] - [0xE51160, .rodata, sf_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: sf_so } + - { type: .bss, vram: 0x801C2740, name: fox_so } - { type: .bss, vram: 0x801C27C0, name: sf_aq } - name: ovl_i4