diff --git a/src/engine/fox_play.c b/src/engine/fox_play.c index 1b168aba..ded040cf 100644 --- a/src/engine/fox_play.c +++ b/src/engine/fox_play.c @@ -6233,6 +6233,9 @@ void func_play_800B79B0(void) { sp3A = 0; } else { var_v0_2 = 0; +#ifdef AVOID_UB + sp3A = 0; +#endif } if ((gPlayer[0].state_1C8 == PLAYERSTATE_1C8_3) && !(gGameFrameCount & var_v0_2)) { diff --git a/src/overlays/ovl_i3/fox_aq.c b/src/overlays/ovl_i3/fox_aq.c index 79c187bc..6566f9ef 100644 --- a/src/overlays/ovl_i3/fox_aq.c +++ b/src/overlays/ovl_i3/fox_aq.c @@ -8,7 +8,7 @@ #include "assets/ast_blue_marine.h" #include "assets/ast_aquas.h" -const char D_i3_801C1A30[] = "プレイヤーのすべてをクリア \n"; +const char D_i3_801C1A30[] = "プレイヤーのすべてをクリア \n"; // Clear of all players const char D_i3_801C1A50[] = "i %d\n"; typedef enum { @@ -318,6 +318,7 @@ void Aquas_801A8E30(void) { sp64[i] = RAND_FLOAT_CENTERED(70.0f); } } + for (i = 0; i < 34; i++) { j = (sp5C[i].v.ob[2] + 200) / 25; sp58[i].v.ob[0] = sp5C[i].v.ob[0] + spA8[j]; @@ -401,6 +402,7 @@ void Aquas_801A95C8(void) { Math_SmoothStepToF(&gPlayer[0].camEye.x, gCsCamEyeX, 0.1f, 50.0f, 0.0001f); Math_SmoothStepToF(&gPlayer[0].camEye.y, gCsCamEyeY, 0.1f, 50.0f, 0.0001f); Math_SmoothStepToF(&gPlayer[0].camEye.z, gCsCamEyeZ, 0.1f, 50.0f, 0.0001f); + Math_SmoothStepToF(&gPlayer[0].camAt.x, gCsCamAtX, 0.1f, 50.0f, 0.0001f); Math_SmoothStepToF(&gPlayer[0].camAt.y, gCsCamAtY, 0.1f, 50.0f, 0.0001f); Math_SmoothStepToF(&gPlayer[0].camAt.z, gCsCamAtZ, 0.1f, 50.0f, 0.0001f); @@ -434,6 +436,7 @@ void Aquas_801A9824(void) { s32* var_v0_3; gTeamShields[1] = gTeamShields[2] = gTeamShields[3] = 255; + for (i = 0; i < ARRAY_COUNT(D_i3_801C4190); i++) { D_i3_801C4190[i] = 0; } @@ -449,6 +452,7 @@ void Aquas_801A9824(void) { 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; @@ -457,6 +461,7 @@ void Aquas_801A9824(void) { D_i3_801C41B8[15] = 20.0f; D_i3_801C41B8[16] = 30.0f; D_i3_801C41B8[17] = 50.0f; + if (D_ctx_80177CA0 != 0) { D_i3_801C41B8[12] = 0.0f; D_i3_801C41B8[13] = 3.0f; @@ -465,6 +470,7 @@ void Aquas_801A9824(void) { D_i3_801C41B8[16] = 0.0f; D_i3_801C41B8[17] = 0.0f; } + D_i3_801C4190[5] = 0; D_i3_801C41B8[25] = D_bg_8015F970; D_i3_801C41B8[26] = 128.0f; @@ -475,10 +481,12 @@ void Aquas_801A99D4(Player* player) { Math_SmoothStepToF(&D_bg_8015F970, D_i3_801C41B8[25], 1.0f, 10.0f, 0.00001f); Math_SmoothStepToF(&D_AQ_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_AQ_801C4188 - 6.0f; + if (D_i3_801C41B8[26] < 0.0f) { D_i3_801C41B8[26] = 0.0f; } @@ -509,9 +517,11 @@ void Aquas_801A99D4(Player* player) { 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]; @@ -526,12 +536,11 @@ void Aquas_801A9C98(Player* player) { if ((D_i3_801C4190[0] != 777) && (D_i3_801C4190[0] > 0)) { i = D_i3_801C4190[0] - 1; actor = &gActors[i]; + if ((actor->obj.status != OBJ_ACTIVE) || ((player->unk_138 - 300.0f) <= actor->obj.pos.z) || (actor->obj.pos.z <= (player->unk_138 - 7000.0f)) || (actor->obj.id != D_i3_801C4190[1]) || (actor->health == 0)) { - D_i3_801C4190[0] = D_i3_801C4190[3] = D_i3_801C4190[5] = - - D_i3_801C4190[1] = 0; + D_i3_801C4190[0] = D_i3_801C4190[3] = D_i3_801C4190[5] = D_i3_801C4190[1] = 0; } else { var_v0 = 1; if (actor->info.hitbox[1] == 200000.0f) { @@ -576,10 +585,13 @@ void Aquas_801A9ED0(Player* player) { 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]; @@ -593,6 +605,7 @@ void Aquas_801A9ED0(Player* player) { temp_fa0 = gBosses[0].obj.pos.y + tempy[0] - tempy[1] - 200.0f; temp_fv1 = gBosses[0].obj.pos.x + tempy[2] + tempy[3] + 200.0f; temp_fa1 = gBosses[0].obj.pos.x + tempy[2] - tempy[3] - 200.0f; + if ((gBosses[0].state >= 10) && ((player->pos.y + sp64.y) <= temp_fv0) && (temp_fa0 <= (player->pos.y + sp64.y)) && ((player->pos.x + sp64.x) <= temp_fv1) && (temp_fa1 <= (player->pos.x + sp64.x))) { @@ -635,12 +648,15 @@ void Aquas_801AA20C(void) { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); var_fs1 = -10.0f; var_fs2 = 10.0f; + if (D_i3_801C4190[0] != 0) { var_fs1 = var_fs2 = 0.0f; } + Matrix_Translate(gGfxMatrix, D_i3_801C41B8[0] + var_fs1, D_i3_801C41B8[1] + var_fs2, D_i3_801C41B8[2] + gPlayer[0].unk_144, 1); Matrix_Scale(gGfxMatrix, D_i3_801C41B8[5], D_i3_801C41B8[5], D_i3_801C41B8[5], 1); + for (i = 0; i < 4; i++) { Matrix_RotateZ(gGfxMatrix, M_PI / 2, 1); Matrix_Translate(gGfxMatrix, var_fs1, var_fs2, 0.0f, 1); @@ -677,6 +693,7 @@ void Aquas_801AA4BC(Player* player) { Math_SmoothStepToF(&player->wings.unk_10, 70.0f, 0.3f, 100.0f, 0); } } + if ((gInputHold->button & R_TRIG) && !(gInputHold->button & Z_TRIG)) { sp3C = -90.0f; sp38 = 0.2f; @@ -687,8 +704,10 @@ void Aquas_801AA4BC(Player* player) { Math_SmoothStepToF(&player->wings.unk_10, -70.0f, 0.3f, 100.0f, 0); } } + Math_SmoothStepToF(&player->unk_12C, sp3C, sp38, 10.0f, 0); } + if ((gInputPress->button & Z_TRIG) && (player->unk_230 == 0)) { player->sfx.bank = 1; if (player->timer_1E0 != 0) { @@ -700,6 +719,7 @@ void Aquas_801AA4BC(Player* player) { player->timer_1E0 = 10; } } + if ((gInputPress->button & R_TRIG) && (player->unk_230 == 0)) { player->sfx.bank = 1; if (player->timer_1E4 != 0) { @@ -711,17 +731,22 @@ void Aquas_801AA4BC(Player* player) { player->timer_1E4 = 10; } } + Math_SmoothStepToF(&player->unk_150, 1.0f, 0.05f, 10.0f, 0.0001f); + player->unk_130 = Math_ModF(player->unk_130, 360.0f); + if (player->unk_280 > 0) { player->unk_280 -= 30; if (player->unk_280 <= 0) { player->unk_280 = 0; } } + if (player->unk_1DC == 0) { Math_SmoothStepToF(&player->unk_130, 0.0f, 0.1f, 10.0f, 0.00001f); } + if (player->timer_1E0 != 0) { player->timer_1E0--; } @@ -737,6 +762,7 @@ void Aquas_801AA4BC(Player* player) { if (player->timer_1E8 != 0) { player->timer_1E8--; } + if (player->unk_1DC != 0) { player->timer_1E0 = player->timer_1E4 = 0; player->unk_150 = 1.5f; @@ -770,12 +796,15 @@ void Aquas_801AA8E8(Player* player) { if (player->state_1C8 != PLAYERSTATE_1C8_3) { var_fv0 = var_fv1 = 0.0f; } + Math_SmoothStepToF(&player->unk_030, var_fv0, 0.05f, 1.0f, 0.05f); + if (player->pos.y < (gGroundLevel + 50.0f)) { Math_SmoothStepToF(&player->unk_02C, var_fv1 * 0.3f, 0.05f, 1.0f, 0.05f); } else { Math_SmoothStepToF(&player->unk_02C, var_fv1, 0.05f, 2.0f, 0.05f); } + gCsCamEyeX = (player->pos.x - player->unk_0AC) * (600.0f / player->unk_09C); gCsCamEyeX -= player->unk_030 * 1.5f; gCsCamEyeX += player->unk_0AC + D_i3_801C41B8[9]; @@ -790,19 +819,26 @@ void Aquas_801AA8E8(Player* player) { gCsCamAtY += player->unk_060 * 10.0f; gCsCamAtY -= player->unk_02C * -0.55f; gCsCamAtY += player->unk_0B0 + D_i3_801C41B8[10]; + if (gCsCamAtY < 20.0f) { gCsCamAtY = 20.0f; } + gCsCamEyeZ = 240.0f; gCsCamAtZ = player->unk_138 + (D_ctx_80177D20 - 1.0f); + Math_SmoothStepToF(&player->camEye.x, gCsCamEyeX, player->unk_014, 1000.0f, 0); Math_SmoothStepToF(&player->camEye.y, gCsCamEyeY, player->unk_014, 1000.0f, 0); Math_SmoothStepToF(&player->camEye.z, gCsCamEyeZ, 0.2f, 30.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, gCsCamAtX, player->unk_014, 1000.0f, 0); Math_SmoothStepToF(&player->camAt.y, gCsCamAtY, player->unk_014, 1000.0f, 0); Math_SmoothStepToF(&player->camAt.z, gCsCamAtZ, player->unk_014, 1000.0f, 0); + Math_SmoothStepToF(&player->unk_014, 1.0f, 1.0f, 0.05f, 0.0f); + temp = -player->unk_0EC; + Math_SmoothStepToF(&player->unk_034, temp * 0.3f, 0.1f, 1.5f, 0.0f); } @@ -823,14 +859,19 @@ void Aquas_801AACF8(Player* player) { Aquas_801AA4BC(player); Aquas_801A99D4(player); Aquas_801A8E30(); + sp64 = -gInputPress->stick_x; sp5C = gInputPress->stick_y; + D_ctx_80177970 = 0.68f; + Math_SmoothStepToF(&player->unk_180, sp64 * D_ctx_80177970, 1.0f, 10.0f, 0.0001f); + var_fa0 = fabsf(player->unk_180 * 0.5f); if (var_fa0 > 2.0f) { var_fa0 = 2.0f; } + if (player->unk_180 < 0.0f) { if (D_i3_801C41B8[3] > player->unk_180) { D_i3_801C41B8[3] -= var_fa0; @@ -840,9 +881,12 @@ void Aquas_801AACF8(Player* player) { D_i3_801C41B8[3] += var_fa0; } } + Math_SmoothStepToF(&D_i3_801C41B8[3], player->unk_180, 0.1f, 2.0f, 0.00001f); + sp60 = D_i3_801C41B8[3]; D_ctx_80177968 = 7.0f; + if ((player->pos.x < (-player->unk_09C + player->unk_0AC + 10.0f)) && (sp60 >= 20.0f)) { D_ctx_80177968 = 2.0f; Math_SmoothStepToF(&D_i3_801C41B8[9], 30.0f, 0.1f, 10.0f, 0.0001f); @@ -851,15 +895,20 @@ void Aquas_801AACF8(Player* player) { D_ctx_80177968 = 2.0f; Math_SmoothStepToF(&D_i3_801C41B8[9], -30.0f, 0.1f, 10.0f, 0.0001f); } + Math_SmoothStepToF(&player->unk_0E8, sp60, 0.3f, D_ctx_80177968, 0.00001f); + if (D_ctx_80177968 != 2.0f) { Math_SmoothStepToF(&D_i3_801C41B8[9], 0.0f, 0.1f, 20.0f, 0.0001f); } + Math_SmoothStepToF(&player->unk_17C, sp5C * D_ctx_80177970, 1.0f, 7.0f, 0.0001f); + var_fa1 = fabsf(player->unk_17C * 0.05f); if (var_fa1 > 2.0f) { var_fa1 = 2.0f; } + if (player->unk_17C * -1.0f < 0.0f) { if (D_i3_801C41B8[4] > player->unk_17C) { D_i3_801C41B8[4] -= var_fa1; @@ -869,9 +918,12 @@ void Aquas_801AACF8(Player* player) { D_i3_801C41B8[4] += var_fa1; } } + Math_SmoothStepToF(&D_i3_801C41B8[4], player->unk_17C * -1.0f, 0.1f, 3.0f, 0.00001f); + sp58 = D_i3_801C41B8[4] * 0.8f; D_ctx_80177968 = 10.0f; + if (player->pos.y < (gGroundLevel + 50.0f)) { if (sp58 <= 0.0f) { sp58 = 0.0f; @@ -884,6 +936,7 @@ void Aquas_801AACF8(Player* player) { } else { D_i3_801C4190[7] = 0; } + if ((player->unk_0A0 - 50.0f) <= player->pos.y) { if (sp58 >= 0.0f) { Math_SmoothStepToF(&D_i3_801C41B8[10], 30.0f, 1.0f, 1.0f, 0.00001f); @@ -891,30 +944,45 @@ void Aquas_801AACF8(Player* player) { } else { Math_SmoothStepToF(&D_i3_801C41B8[10], 0.0f, 0.1f, 1.0f, 0.00001f); } + Math_SmoothStepToF(&player->unk_0E4, sp58, 1.0f, D_ctx_80177968, 0.00001f); + var_fv1_2 = 2.0f; if (sp64 == 0.0f) { var_fv1_2 = 1.0f; } + Math_SmoothStepToF(&player->unk_0EC, player->unk_180 * 0.7f, 0.08f, var_fv1_2, 0.0001f); + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + Matrix_RotateY(gCalcMatrix, (player->unk_114 + player->unk_0E8 + 180.0f) * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, -((player->unk_120 + player->unk_0E4 + player->unk_4D8) * M_DTOR), 1); + sp8C.x = sp8C.y = 0.0f; sp8C.z = player->unk_0D0; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp68); + sp68.x *= 1.4f; sp68.y *= 1.4f; + Matrix_RotateY(gCalcMatrix, player->unk_114 * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, player->unk_120 * M_DTOR, 1); + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp68, &sp80); + sp8C.x = sp8C.y = 0.0f; sp8C.z = -player->unk_110; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp74); + player->vel.x = (sp80.x + sp74.x) * player->unk_150; player->vel.y = (sp80.y + sp74.y) * player->unk_150; player->vel.z = sp80.z + sp74.z; + player->pos.x += player->vel.x; + if (player->pos.x > player->unk_09C + player->unk_0AC) { player->pos.x = player->unk_09C + player->unk_0AC; player->vel.x = 0.0f; @@ -923,7 +991,9 @@ void Aquas_801AACF8(Player* player) { player->pos.x = player->unk_0AC - player->unk_09C; player->vel.x = 0.0f; } + player->pos.y += player->vel.y; + if (player->pos.y > player->unk_0A0) { player->pos.y = player->unk_0A0; player->vel.y = 0.0f; @@ -932,6 +1002,7 @@ void Aquas_801AACF8(Player* player) { player->pos.y = player->unk_0A4; player->vel.y = 0.0f; } + if (player->pos.x > (player->unk_0AC + (player->unk_09C - 100.0f))) { player->flags_228 = 1; } @@ -944,6 +1015,7 @@ void Aquas_801AACF8(Player* player) { if (player->pos.y <= (gGroundLevel + 100)) { player->flags_228 = 4; } + if (D_i3_801C4190[6] != 0) { player->unk_0D0 = 20.0f; Math_SmoothStepToF(&D_i3_801BFB60, -40.0f, 0.01f, 0.1f, 0.0f); @@ -952,6 +1024,7 @@ void Aquas_801AACF8(Player* player) { player->vel.z = 0.0f; } } + player->pos.z += player->vel.z; player->unk_138 = player->pos.z; player->unk_060 = SIN_DEG(player->unk_0F4 * 0.7f) * 0.5f; @@ -959,6 +1032,7 @@ void Aquas_801AACF8(Player* player) { player->unk_0F4 += 8.0f + D_i3_801C41B8[24]; player->unk_080 = -SIN_DEG(player->unk_088) * 0.5f; player->unk_0F0 = SIN_DEG(player->unk_0F4) * 1.5f; + if (player->pos.y < (D_ctx_80177CC0 + 50.0f)) { Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); @@ -1000,11 +1074,13 @@ void Aquas_801ABA40(PlayerShot* shot) { D_i3_801C41B8[21] = shot->obj.pos.x; D_i3_801C41B8[22] = shot->obj.pos.y; D_i3_801C41B8[23] = shot->obj.pos.z; + if ((fabsf(shot->obj.pos.z - (gPlayer[0].camEye.z - D_ctx_80177D20)) > 10000.0f) || (fabsf(shot->obj.pos.y - gPlayer[0].camEye.y) > 1500.0f) || ((fabsf(shot->obj.pos.x - gPlayer[0].camEye.x) > 4000.0f) && (shot->unk_5C != 0))) { shot->unk_64 = 0; } + if (shot->obj.pos.y < gGroundLevel) { shot->obj.pos.y = gGroundLevel + 2.0f; func_beam_800365E4(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z, 0.0f, 0.0f, 0.0f, 0.0f, 90.0f, 2.0f, 0, @@ -1023,7 +1099,9 @@ void Aquas_801ABA40(PlayerShot* shot) { if (!(gGameFrameCount & 1)) { func_beam_80035DEC(shot->obj.pos.x, shot->obj.pos.y, shot->obj.pos.z); } + func_beam_80038140(shot); + shot->unk_2C = (shot->obj.pos.y * 0.01f) + 1.2f; shot->unk_30 = (shot->obj.pos.y * 0.003f) + 0.6f; shot->unk_34 = (shot->obj.pos.y * 0.001f) + 0.6f; @@ -1031,6 +1109,7 @@ void Aquas_801ABA40(PlayerShot* shot) { if (shot->unk_58 < 30) { shot->unk_58 = 30; } + switch (shot->unk_5C) { case 0: shot->unk_64 = 50; @@ -1038,6 +1117,7 @@ void Aquas_801ABA40(PlayerShot* shot) { shot->obj.rot.x = gPlayer[0].unk_0E4; shot->unk_5C++; break; + case 1: if (D_i3_801C4190[3] != 0) { sp7C = shot->obj.pos.x - D_i3_801C41B8[0]; @@ -1057,12 +1137,14 @@ void Aquas_801ABA40(PlayerShot* shot) { shot->unk_64 = 10; } } + if (shot->unk_54 == 0) { shot->unk_54 = -30.0f; } if (!(gGameFrameCount & 3)) { Math_SmoothStepToF(&shot->unk_54, D_i3_801C4458, 0.1f, 50.0f, 0.0001f); } + Matrix_RotateY(gCalcMatrix, shot->obj.rot.y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, shot->obj.rot.x * M_DTOR, 1); sp60.x = sp60.y = 0.0f; @@ -1076,6 +1158,7 @@ void Aquas_801ABA40(PlayerShot* shot) { } break; } + if (D_i3_801C4454 < 297) { D_ctx_80178370 = shot->obj.pos.x; D_ctx_80178374 = shot->obj.pos.y; @@ -1085,6 +1168,7 @@ void Aquas_801ABA40(PlayerShot* shot) { D_ctx_80178368 = 150; Math_SmoothStepToF(&D_ctx_8017836C, 0.8f, 1.0f, 0.08f, 0.001f); } + if (D_i3_801C4454 != 0) { D_i3_801C4454--; } @@ -1141,35 +1225,43 @@ void Aquas_801AC274(Player* player) { D_i3_801C41B8[21] = D_i3_801C41B8[22] = D_i3_801C41B8[23] = 0.0f; D_i3_801C4190[5] = D_i3_801C4190[3] = 0; } + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp68.x = 0.0f; sp68.y = 0.0f; sp68.z = -1200.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp68, &sp5C); + D_i3_801C41B8[6] = player->pos.x + sp5C.x; D_i3_801C41B8[7] = player->pos.y + sp5C.y; D_i3_801C41B8[8] = player->unk_138 + sp5C.z; - if (D_i3_801C4190[3] == 0) { + if (D_i3_801C4190[3] == 0) { if (D_i3_801C4190[0] == 0) { D_i3_801C41B8[0] = player->pos.x + sp5C.x; D_i3_801C41B8[1] = player->pos.y + sp5C.y; D_i3_801C41B8[2] = player->unk_138 + sp5C.z; D_i3_801C41B8[5] = 3.0f; } + D_i3_801C41B8[11] = 10000.0f; temp = D_i3_801C4190[0]; + for (i = 0, actor = gActors; i < 60; i++, actor++) { if ((actor->obj.status == OBJ_ACTIVE) && (actor->obj.id != OBJ_ACTOR_189)) { var_v1 = 1; if (actor->info.hitbox[1] == HITBOX_TYPE_2) { var_v1 = 5; } + tempy1 = actor->obj.pos.y + actor->info.hitbox[var_v1 + 2] + actor->info.hitbox[var_v1 + 3] + 200.0f; tempy2 = actor->obj.pos.y + actor->info.hitbox[var_v1 + 2] - actor->info.hitbox[var_v1 + 3] - 200.0f; tempx1 = actor->obj.pos.x + actor->info.hitbox[var_v1 + 4] + actor->info.hitbox[var_v1 + 5] + 200.0f; tempx2 = actor->obj.pos.x + actor->info.hitbox[var_v1 + 4] - actor->info.hitbox[var_v1 + 5] - 200.0f; + if ((actor->health > 0) && (actor->timer_0C2 < 5) && (actor->obj.pos.z <= (player->unk_138 - 300.0f)) && ((player->unk_138 - 7000.0f) <= actor->obj.pos.z) && (player->pos.y + sp5C.y <= tempy1) && (tempy2 <= player->pos.y + sp5C.y) && (player->pos.x + sp5C.x <= tempx1) && @@ -1196,15 +1288,18 @@ void Aquas_801AC274(Player* player) { Aquas_801A9C98(player); Aquas_801A9DE4(player); } + if (gInputPress->button & A_BUTTON) { Aquas_801AC18C(player); } + if (gInputPress->button & B_BUTTON) { Aquas_801AC09C(player); if (D_i3_801C4190[0] != 0) { D_i3_801C4190[3] = 1; } } + if (D_i3_801C4190[5] == 0) { D_ctx_80178370 = player->pos.x; D_ctx_80178374 = player->pos.y - 5.0f; @@ -1263,6 +1358,7 @@ void Aquas_801AC918(Effect* effect) { if (effect->unk_46 != 0) { effect->unk_46--; } + switch (effect->state) { case 0: if (effect->vel.y < 5.0f) { @@ -1276,6 +1372,7 @@ void Aquas_801AC918(Effect* effect) { effect->vel.x = __cosf(gPlayer[0].unk_058) * temp_fs0; effect->vel.z = __sinf(gPlayer[0].unk_058) * temp_fs0; break; + case 1: if (effect->unk_46 == 0) { Object_Kill(&effect->obj, effect->sfxSource); @@ -1288,6 +1385,7 @@ void Aquas_801AC918(Effect* effect) { effect->vel.x = COS_DEG(effect->unk_60.y) * temp_fs0; effect->vel.z = -SIN_DEG(effect->unk_60.y) * temp_fs0; break; + case 2: if (effect->vel.y < 10.0f) { effect->vel.y += 0.2f; @@ -1341,23 +1439,28 @@ void Aquas_801ACE50(Player* player) { Vec3f sp48; player->sfx.boost = 0; + if (player->timer_27C != 0) { player->timer_27C--; player->unk_110 += 0.3f; Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + player->unk_114) * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, player->unk_0E4 * M_DTOR, 1); + sp54.x = sp54.y = 0.0f; sp54.z = 70.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); Aquas_801AC8A8(player->pos.x + RAND_FLOAT_CENTERED(10.0f) + sp48.x, player->pos.y + RAND_FLOAT_CENTERED(10.0f) + sp48.y, player->unk_138 + RAND_FLOAT_CENTERED(10.0f) + (sp48.z * -1.0f), 0.4f, 1); Math_SmoothStepToF(&player->unk_08C, -130.0f, 0.1f, 10.0f, 0.00001f); + player->unk_130 -= player->unk_258; player->unk_258 += 0.2f; if (player->unk_258 > 50.0f) { player->unk_258 = 50.0f; } + if (!(gGameFrameCount & 1) && (gBlurAlpha > 64)) { gBlurAlpha -= 1; } @@ -1369,12 +1472,14 @@ void Aquas_801ACE50(Player* player) { gBlurAlpha = 255; } } + if (!(gBrakeButton[player->num] & gInputHold->button) && !(gBoostButton[player->num] & gInputHold->button)) { player->unk_2B4 = 1; if (player->unk_2BC == 0.0f) { player->unk_2B4 = 0; } } + if ((gBoostButton[player->num] & gInputHold->button) && (player->unk_230 == 0) && (player->state_1C8 != PLAYERSTATE_1C8_5) && (player->unk_2B4 == 0)) { if (player->unk_2BC == 0) { @@ -1441,7 +1546,9 @@ void Aquas_801AD328(Player* player) { player->unk_2B4 = 0; D_i3_801C41B8[28] = 0.0f; } + Math_SmoothStepToF(&D_i3_801C41B8[28], 0.0f, 1.0f, 1.0f, 0.0001f); + if (player->unk_110 < 0.0f) { player->unk_110 += 0.5f; if (player->unk_110 > 0.0f) { @@ -1457,6 +1564,7 @@ void Aquas_801AD598(Actor* actor) { s32 i; D_i3_801C27C0 = &D_i3_801C27C8[50 * actor->iwork[0]]; + for (i = 50 * actor->iwork[0]; i < 50 * actor->iwork[0] + 50; i++, D_i3_801C27C0++) { D_i3_801C27C0->pos.x = actor->obj.pos.x; D_i3_801C27C0->pos.y = actor->obj.pos.y; @@ -1478,7 +1586,7 @@ void Aquas_801AD688(Actor* actor) { // OBJ_ACTOR_255 action void Aquas_801AD6C0(Actor* actor) { - s32 var_v0; + s32 var_v0 = actor->iwork[2] - 1; f32 sp80; f32 sp7C; f32 sp78; @@ -1490,7 +1598,6 @@ void Aquas_801AD6C0(Actor* actor) { Vec3f sp50; Vec3f sp44; - var_v0 = actor->iwork[2] - 1; if ((D_i3_801C42A0[23] == 0) || (gActors[var_v0].state >= 4)) { actor->timer_0C2 = 30000; actor->state = 2; @@ -1498,13 +1605,17 @@ void Aquas_801AD6C0(Actor* actor) { actor->vel.x = 0.0f; actor->vel.z = 0.0f; } + if ((gPlayer[0].unk_138 + 500.0f) <= actor->obj.pos.z) { Object_Kill(&actor->obj, actor->sfxSource); } + actor->unk_04E++; + if (actor->unk_04E >= 50) { actor->unk_04E = 0; } + switch (actor->state) { case 0: if (actor->timer_0BC != 0) { @@ -1517,6 +1628,7 @@ void Aquas_801AD6C0(Actor* actor) { actor->state++; } break; + case 1: if (actor->unk_0D0 != 0) { if (actor->health > 0) { @@ -1534,6 +1646,7 @@ void Aquas_801AD6C0(Actor* actor) { } } } + if (actor->obj.pos.z <= (gPlayer[0].unk_138 - 200.0f)) { actor->fwork[7] = sp80 = gPlayer[0].pos.x + RAND_FLOAT_CENTERED(100.0f) - actor->obj.pos.x; actor->fwork[8] = sp7C = gPlayer[0].pos.y - 30.0f - actor->obj.pos.y; @@ -1543,6 +1656,7 @@ void Aquas_801AD6C0(Actor* actor) { sp7C = actor->fwork[8]; sp78 = actor->fwork[9] + 600.0f; } + Math_RadToDeg(Math_Atan2F(sp80, sp78)); sp70 = sqrtf(SQ(sp80) + SQ(sp78)); Math_RadToDeg(-Math_Atan2F(sp7C, sp70)); @@ -1554,31 +1668,40 @@ void Aquas_801AD6C0(Actor* actor) { sp74 = COS_DEG(actor->fwork[1]) * sp70 * actor->fwork[6]; sp80 = COS_DEG(actor->unk_0F4.y) * sp74; sp78 = -SIN_DEG(actor->unk_0F4.y) * sp74; + if (sp7C < 20.0f) { sp7C = 20.0f; } + if ((Rand_ZeroOne() < 0.7) && (actor->obj.rot.z == 0.0f)) { actor->fwork[2] = 360.0f; } + Math_SmoothStepToF(&actor->unk_0F4.z, actor->fwork[2], 0.1f, 10.0f, 0.001f); + if (actor->unk_0F4.z >= 360.0f) { actor->unk_0F4.z = 0.0f; actor->fwork[2] = 0.0f; } + sp68 = Math_RadToDeg(Math_Atan2F(gPlayer[0].pos.x + sp80 + RAND_FLOAT_CENTERED(200.0f) - actor->obj.pos.x, gPlayer[0].unk_138 + sp78 - actor->obj.pos.z)); sp6C = Math_RadToDeg(-Math_Atan2F(gPlayer[0].pos.y - 30.0f + sp7C - actor->obj.pos.y, sp70)); + if (gPlayer[0].unk_138 <= actor->obj.pos.z) { sp68 = actor->unk_0F4.y; sp6C = actor->unk_0F4.x; } + Math_SmoothStepToAngle(&actor->unk_0F4.y, sp68, 1.0f, 5.0f, 0.001f); Math_SmoothStepToAngle(&actor->unk_0F4.x, sp6C, 1.0f, 5.0f, 0.001f); Matrix_RotateY(gCalcMatrix, actor->unk_0F4.y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, actor->unk_0F4.x * M_DTOR, 1); + sp5C.x = 0.0f; sp5C.y = 0.0f; sp5C.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp5C, &sp50); sp5C.z = 10.0f + (actor->iwork[0] + 1) * RAND_FLOAT(10.0f); Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp5C, &sp44); @@ -1586,6 +1709,7 @@ void Aquas_801AD6C0(Actor* actor) { actor->vel.y = sp50.y; actor->vel.z = sp44.z; break; + case 2: if (actor->timer_0C6 == 0) { actor->timer_0C6 = 15; @@ -1626,10 +1750,13 @@ void Aquas_801ADF7C(f32 xPos, f32 yPos, f32 zPos, f32 xRot, f32 yRot, f32 zRot, s32 index) { Matrix_Push(&gGfxMatrix); Matrix_Translate(gGfxMatrix, xPos, yPos, zPos + D_ctx_80177D20, 1); + Matrix_RotateY(gGfxMatrix, M_DTOR * yRot, 1); Matrix_RotateX(gGfxMatrix, M_DTOR * xRot, 1); Matrix_RotateZ(gGfxMatrix, M_DTOR * zRot, 1); + Graphics_SetScaleMtx(scale); + if (index < 2) { if (!flag) { RCP_SetupDL(&gMasterDisp, 0x39); @@ -1712,7 +1839,9 @@ void Aquas_801AE3D8(Actor* actor) { if (actor->obj.pos.y <= 347.0f) { actor->obj.pos.y = 347.0f; } + actor->scale = fabsf(D_i3_801C4308[10] / -28.0f) + 0.5f; + if (actor->scale > 1.3f) { actor->scale = 1.3f; } @@ -1725,6 +1854,7 @@ void Aquas_801AE3D8(Actor* actor) { actor->info.hitbox[10] = 116.0f; } } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if ((fabsf(D_i3_801C4308[10]) >= 6.0f) && (gBosses[0].state >= 10) && @@ -1733,9 +1863,11 @@ void Aquas_801AE3D8(Actor* actor) { actor->iwork[1] = 0; D_i3_801C4308[79] -= 5.0f; AUDIO_PLAY_SFX(0x29036050, actor->sfxSource, 4); + if (D_i3_801C4308[79] <= -28.0f) { D_i3_801C4308[79] = -28.0f; } + if (D_i3_801C4308[10] <= -23.0f) { if (gBosses[0].timer_052 == 0) { gBosses[0].timer_052 = 72; @@ -1749,6 +1881,7 @@ void Aquas_801AE3D8(Actor* actor) { actor->iwork[1] = 0; actor->timer_0C6 = 0; } + if (gBosses[0].swork[AQ_SWK_0] == 0) { gBosses[0].swork[AQ_SWK_0] = 1; actor->info.hitbox[10] = 300.0f; @@ -1773,6 +1906,7 @@ void Aquas_801AE3D8(Actor* actor) { } } break; + case 1: if (!(gGameFrameCount & 1)) { func_effect_8007C120(actor->obj.pos.x, actor->fwork[0] + actor->obj.pos.y, actor->obj.pos.z, @@ -1781,11 +1915,13 @@ void Aquas_801AE3D8(Actor* actor) { actor->obj.pos.z + 200.0f, actor->vel.x, actor->vel.y, actor->vel.z, 0.1f, 10); actor->fwork[0] += 40.0f; } + if ((actor->fwork[2] * 400.0f) <= actor->fwork[0]) { actor->timer_0BC = 20; actor->state++; } break; + case 2: if (actor->timer_0BC == 0) { for (i = 0; i < 6; i++) { @@ -1798,6 +1934,7 @@ void Aquas_801AE3D8(Actor* actor) { actor->state++; } break; + case 3: if (actor->timer_0BC == 0) { Math_SmoothStepToF(&actor->fwork[3], 0.0f, 0.1f, 2.0f, 0); @@ -1806,11 +1943,16 @@ void Aquas_801AE3D8(Actor* actor) { func_effect_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); func_effect_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); func_effect_8007BC7C(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 50.0f); + Object_Kill(&actor->obj, actor->sfxSource); + D_i3_801C42A0[23]--; + gBosses[0].swork[AQ_SWK_0] = 3; gBosses[0].swork[AQ_SWK_19] = 30; + D_i3_801C4308[79] = 0.0f; + if (D_i3_801C42A0[23] == 0) { D_i3_801C4308[79] = -180.0f; for (i = 0; i < 60; i++) { @@ -1841,20 +1983,24 @@ void Aquas_801AEB44(Actor* actor) { actor->iwork[1]++; actor->iwork[1] %= 8; } + temp_v1_2 = SEGMENTED_TO_VIRTUAL(D_AQ_6019078); if (actor->iwork[1] < 4) { var_t5 = SEGMENTED_TO_VIRTUAL(D_AQ_6018C78); } else { var_t5 = SEGMENTED_TO_VIRTUAL(D_AQ_6018878); } + var_t1 = actor->iwork[1] % 4; if (var_t1 >= 3) { var_t1 = 4 - var_t1; } + var_fv0 = actor->timer_0C6 / 60.0f; if (var_fv0 < 0.1f) { var_fv0 = 0.1f; } + for (i = 0; i < 28; i += 1) { D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.ob[0] = temp_v1_2[i].v.ob[0] + (s16) ((((var_t5[i].n.ob[0] - temp_v1_2[i].n.ob[0]) * var_t1) / 2) * var_fv0); @@ -1875,6 +2021,7 @@ void Aquas_801AEB44(Actor* actor) { temp_v1_2[i].n.n[2] + (((var_t5[i].n.n[2] - temp_v1_2[i].n.n[2]) * var_t1) / 2); D_i3_801C3A88[actor->iwork[0]][gSysFrameCount % 2][i].n.a = temp_v1_2[i].n.a; } + Matrix_Scale(gGfxMatrix, actor->fwork[1] - 0.25f + ((1.5f - actor->scale) * 0.5f), actor->scale, actor->fwork[1], 1); if (actor->state != 0) { @@ -1887,6 +2034,7 @@ void Aquas_801AEB44(Actor* actor) { RCP_SetupDL(&gMasterDisp, 0x16); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } + Matrix_SetGfxMtx(&gMasterDisp); gDPSetTextureLUT(gMasterDisp++, G_TT_RGBA16); gDPLoadTLUT_pal256(gMasterDisp++, D_AQ_6008FC8); @@ -2182,12 +2330,14 @@ void Aquas_801B099C(Actor* actor) { Matrix_RotateZ(gGfxMatrix, (actor->obj.rot.z + actor->fwork[5]) * M_DTOR, 1); Matrix_Scale(gGfxMatrix, actor->fwork[0], actor->fwork[1], actor->fwork[2], 1); Matrix_SetGfxMtx(&gMasterDisp); + if (!(actor->timer_0C6 & 1)) { RCP_SetupDL(&gMasterDisp, 0x39); } else { RCP_SetupDL(&gMasterDisp, 0x3D); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } + switch (actor->iwork[0]) { case 0: gSPDisplayList(gMasterDisp++, D_AQ_6019E80); @@ -2209,6 +2359,7 @@ void Aquas_801B0B60(Actor* actor) { if ((actor->unk_0D0 != 0) || (gBosses[0].state >= 16)) { actor->state = 3; } + switch (actor->state) { case 0: if (actor->timer_0BC == 0) { @@ -2227,6 +2378,7 @@ void Aquas_801B0B60(Actor* actor) { actor->state++; } break; + case 1: if (actor->timer_0BE == 0) { Matrix_RotateY(gCalcMatrix, actor->fwork[4] * M_DTOR, 0); @@ -2241,6 +2393,7 @@ void Aquas_801B0B60(Actor* actor) { actor->state++; } break; + case 2: if (actor->timer_0C0 == 0) { actor->iwork[1] -= 20; @@ -2251,6 +2404,7 @@ void Aquas_801B0B60(Actor* actor) { } } break; + case 3: if (Rand_ZeroOne() < 0.1) { actor->itemDrop = DROP_SILVER_RING_10p; @@ -2263,6 +2417,7 @@ void Aquas_801B0B60(Actor* actor) { func_effect_8007A6F0(&actor->obj.pos, 0x29018049); break; } + if (!(gGameFrameCount & 0xF)) { Aquas_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(10.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(10.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(10.0f), 2.0f, 1); @@ -2306,6 +2461,7 @@ void Aquas_801B1008(Boss* bossAQ, s32 timer) { bossAQ->swork[AQ_SWK_22]++; bossAQ->swork[AQ_SWK_22] &= 3; } + if ((fabsf(D_i3_801C4308[10]) >= 15.0f) && (bossAQ->timer_056 == 0)) { bossAQ->swork[AQ_SWK_2] = bossAQ->swork[AQ_SWK_3] = 1; bossAQ->timer_056 = 60; @@ -2320,6 +2476,7 @@ void Aquas_BossAq_Init(Boss* bossAQ) { gBossActive = 1; gBossFrameCount = 0; bossAQ->health = 150; + for (i = 0, actor = gActors; i < 2; actor++) { if (actor->obj.status == OBJ_FREE) { Actor_Initialize(actor); @@ -2349,6 +2506,7 @@ void Aquas_BossAq_Init(Boss* bossAQ) { bossAQ->swork[AQ_SWK_17] = 10; D_i3_801C42A0[1] = D_i3_801C42A0[2] = D_i3_801C42A0[4] = D_i3_801C42A0[5] = (D_i3_801C42A0[6] = D_i3_801C42A0[7] = 0) ^ 0; // fake + for (i = 0; i < AQ_LIMB_MAX; i++) { sBossAQlimbTimers[i] = 0; } @@ -3182,7 +3340,9 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th } else if ((sBossAQlimbTimers[limbIndex] != 0) && (D_ctx_80177854 != 100)) { sBossAQlimbTimers[limbIndex]--; } + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); + if ((D_i3_801C42A0[0] != 255) && (limbIndex != 27)) { RCP_SetupDL(&gMasterDisp, 0x3A); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, D_i3_801C42A0[0]); @@ -3193,6 +3353,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th RCP_SetupDL(&gMasterDisp, 0x3D); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } + switch (limbIndex) { case AQ_LIMB_4: rot->x = D_i3_801C4308[13]; @@ -3200,6 +3361,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = this->fwork[AQ_FWK_9]; sp54 = this->fwork[AQ_FWK_10]; break; + case AQ_LIMB_5: RCP_SetupDL(&gMasterDisp, 0x3D); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, gBosses[0].swork[AQ_SWK_14], gBosses[0].swork[AQ_SWK_15], @@ -3211,12 +3373,14 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[65]; sp54 = D_i3_801C4308[72]; break; + case AQ_LIMB_6: rot->x = D_i3_801C4308[12]; sp5C = this->fwork[AQ_FWK_8]; sp58 = this->fwork[AQ_FWK_9]; sp54 = this->fwork[AQ_FWK_10]; break; + case AQ_LIMB_7: rot->x = D_i3_801C4308[16]; rot->y = D_i3_801C4308[18]; @@ -3227,6 +3391,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[59]; sp54 = D_i3_801C4308[66]; break; + case AQ_LIMB_8: rot->x = D_i3_801C4308[17]; rot->y = D_i3_801C4308[19]; @@ -3237,13 +3402,16 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[60]; sp54 = D_i3_801C4308[67]; break; + case AQ_LIMB_9: rot->x += D_i3_801C4308[47]; rot->y += D_i3_801C4308[47]; rot->z += D_i3_801C4308[47]; + sp5C = D_i3_801C4308[54]; sp58 = D_i3_801C4308[61]; sp54 = D_i3_801C4308[68]; + if (sp50) { RCP_SetupDL(&gMasterDisp, 0x3D); if (gBosses[0].health != 0) { @@ -3253,6 +3421,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th } } break; + case AQ_LIMB_10: rot->x += D_i3_801C4308[48]; rot->y += D_i3_801C4308[48]; @@ -3261,6 +3430,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[62]; sp54 = D_i3_801C4308[69]; break; + case AQ_LIMB_12: rot->x = D_i3_801C4308[14]; rot->y = D_i3_801C4308[15]; @@ -3268,6 +3438,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = this->fwork[AQ_FWK_9]; sp54 = this->fwork[AQ_FWK_10]; break; + case AQ_LIMB_15: rot->x += D_i3_801C4308[49]; rot->y += D_i3_801C4308[49]; @@ -3276,6 +3447,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[63]; sp54 = D_i3_801C4308[70]; break; + case AQ_LIMB_18: rot->y += D_i3_801C4308[50]; rot->z += D_i3_801C4308[50]; @@ -3283,6 +3455,7 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = D_i3_801C4308[64]; sp54 = D_i3_801C4308[71]; break; + case AQ_LIMB_22: rot->x += D_i3_801C4308[51]; rot->y += D_i3_801C4308[51]; @@ -3291,13 +3464,16 @@ bool Aquas_801B42AC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th sp58 = this->fwork[AQ_FWK_9]; sp54 = this->fwork[AQ_FWK_10]; break; + case AQ_LIMB_24: rot->x = D_i3_801C4308[10]; rot->z = D_i3_801C4308[11]; break; + case AQ_LIMB_27: break; } + if (sp5C > 0.0f) { Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); @@ -3334,6 +3510,7 @@ void Aquas_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx) { D_i3_801C4308[22] = sp6C.y; D_i3_801C4308[23] = sp6C.z; break; + case AQ_LIMB_7: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[24] = sp6C.x; @@ -3344,6 +3521,7 @@ void Aquas_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx) { D_i3_801C4308[74] = sp6C.y; D_i3_801C4308[75] = sp6C.z; break; + case AQ_LIMB_8: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[27] = sp6C.x; @@ -3354,36 +3532,42 @@ void Aquas_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx) { D_i3_801C4308[77] = sp6C.y; D_i3_801C4308[78] = sp6C.z; break; + case AQ_LIMB_9: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[30] = sp6C.x; D_i3_801C4308[31] = sp6C.y; D_i3_801C4308[32] = sp6C.z; break; + case AQ_LIMB_10: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[33] = sp6C.x; D_i3_801C4308[34] = sp6C.y; D_i3_801C4308[35] = sp6C.z; break; + case AQ_LIMB_15: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[36] = sp6C.x; D_i3_801C4308[37] = sp6C.y; D_i3_801C4308[38] = sp6C.z; break; + case AQ_LIMB_18: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[39] = sp6C.x; D_i3_801C4308[40] = sp6C.y; D_i3_801C4308[41] = sp6C.z; break; + case AQ_LIMB_22: Matrix_MultVec3f(gCalcMatrix, &sp60, &sp6C); D_i3_801C4308[42] = sp6C.x; D_i3_801C4308[43] = sp6C.y; D_i3_801C4308[44] = sp6C.z; break; + case AQ_LIMB_24: Matrix_MultVec3f(gCalcMatrix, &sp54, &sp6C); D_i3_801C4308[1] = sp6C.x; @@ -3398,6 +3582,7 @@ void Aquas_801B49DC(s32 limbIndex, Vec3f* rot, void* thisx) { D_i3_801C4308[6] = sp6C.y; D_i3_801C4308[9] = sp6C.z; break; + case AQ_LIMB_27: break; } @@ -3417,7 +3602,7 @@ f32 D_i3_801C0224[11] = { Vec3f D_i3_801C0250 = { 0.0f, 0.0f, 0.0f }; bool Aquas_801B4DDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (!(this->timer_0C6 & 1)) { RCP_SetupDL(&gMasterDisp, 0x39); @@ -3433,7 +3618,7 @@ bool Aquas_801B4DDC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th void Aquas_801B4E94(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp24 = D_i3_801C0250; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (this->health == 0) { switch (limbIndex) { @@ -3504,6 +3689,7 @@ void Aquas_801B50E8(Actor* actor) { actor->state = 7; func_effect_8007A6F0(&actor->obj.pos, 0x29038090); } + switch (actor->state) { case 0: for (i = 0; i < 8; i++) { @@ -3519,6 +3705,7 @@ void Aquas_801B50E8(Actor* actor) { actor->fwork[4] = 1000.0f + RAND_FLOAT_CENTERED(400.0f); actor->state++; break; + case 2: Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138, 1.0f, 10.0f, 0); if (fabsf(actor->obj.pos.z - gPlayer[0].unk_138) < actor->fwork[4]) { @@ -3529,6 +3716,7 @@ void Aquas_801B50E8(Actor* actor) { func_effect_8007B8F8(actor->obj.pos.x, gGroundLevel + 30.0f, actor->obj.pos.z, 10.0f); } break; + case 3: Math_SmoothStepToAngle(&actor->obj.rot.x, 270.0f, 1.0f, 100.0f, 0.0001f); if (actor->obj.rot.x == 270.0f) { @@ -3537,6 +3725,7 @@ void Aquas_801B50E8(Actor* actor) { actor->state = 4; } break; + case 4: Math_SmoothStepToF(&actor->vel.y, 0.0f, 1.0f, 4.0f, 0.0001f); actor->vel.z = gPlayer[0].vel.z; @@ -3553,6 +3742,7 @@ void Aquas_801B50E8(Actor* actor) { actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 1); } break; + case 5: actor->vel.z = gPlayer[0].vel.z; Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].unk_138 - 1000.0f, 0.1f, 100.0f, 0); @@ -3578,6 +3768,7 @@ void Aquas_801B50E8(Actor* actor) { } } break; + case 6: Math_SmoothStepToAngle(&actor->obj.rot.x, actor->fwork[3], 1.0f, 5.0f, 0); Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[2], 1.0f, 5.0f, 0); @@ -3587,6 +3778,7 @@ void Aquas_801B50E8(Actor* actor) { actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 1); } break; + case 7: for (i = 0; i < 8; i++) { Aquas_801A9448(&actor->vwork[i], &actor->vwork[8 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), @@ -3600,6 +3792,7 @@ void Aquas_801B50E8(Actor* actor) { func_effect_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 6.0f); break; } + if (actor->state >= 2) { if (actor->state < 3) { actor->unk_0B6++; @@ -3610,6 +3803,7 @@ void Aquas_801B50E8(Actor* actor) { actor->unk_0B6 = 0; } } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if (actor->health != 0) { @@ -3646,7 +3840,7 @@ bool Aquas_801B5C18(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th f32 sp64 = 1.0f; Vec3f sp58; Vec3f sp4C = { 0.0f, 0.0f, 0.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (!(this->timer_0C6 & 1)) { RCP_SetupDL(&gMasterDisp, 0x39); @@ -3654,6 +3848,7 @@ bool Aquas_801B5C18(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th RCP_SetupDL(&gMasterDisp, 0x3D); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } + switch (limbIndex) { case 7: RCP_SetupDL(&gMasterDisp, 0x40); @@ -3668,6 +3863,7 @@ bool Aquas_801B5C18(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, (s32) this->fwork[4]); break; } + if (sp6C != 1.0f) { Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); @@ -3692,7 +3888,7 @@ void Aquas_801B5F68(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp3C = { 0.0f, 0.0f, 0.0f }; Vec3f sp30; Vec3f sp24; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if ((this->health == 0) || (limbIndex == 7)) { switch (limbIndex) { @@ -3799,23 +3995,28 @@ void Aquas_801B638C(Actor* actor) { RAND_FLOAT_CENTERED(10.0f), 48, actor->scale, 200, i); func_effect_8007BC7C(actor->vwork[i].x, actor->vwork[i].y, actor->vwork[i].z, 10.0f); } + func_effect_800815DC(); func_effect_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); func_effect_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); func_effect_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 150.0f, 10.0f); + for (i = 0; i < 5; i++) { func_effect_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 1.0f + RAND_FLOAT(1.0f), 7); } + actor->itemDrop = DROP_SILVER_RING_50p; if (actor->iwork[16] != 0) { actor->itemDrop = DROP_GOLD_RING_1; } + func_enmy_80066254(actor); Object_Kill(&actor->obj, actor->sfxSource); AUDIO_PLAY_SFX(0x1903001D, actor->sfxSource, 4); func_effect_8007A6F0(&actor->obj.pos, 0x29038090); } + actor->fwork[5] = (actor->obj.pos.y * 0.01f) + 2.5f; actor->fwork[6] = (actor->obj.pos.y * 0.003f) + 0.8f; actor->fwork[7] = (actor->obj.pos.y * 0.001f) + 0.8f; @@ -3823,7 +4024,6 @@ void Aquas_801B638C(Actor* actor) { if (actor->iwork[12] < 30.0f) { actor->iwork[12] = 30; } - actor->fwork[1] = (actor->obj.pos.y * 0.0032f) + 1.0f; actor->fwork[2] = (actor->obj.pos.y * 0.0032f) + 1.5f; actor->fwork[3] = (actor->obj.pos.y * 0.0032f) + 2.0f; @@ -3831,10 +4031,12 @@ void Aquas_801B638C(Actor* actor) { if (actor->fwork[11] > 1200.0f) { actor->fwork[11] = 1200.0f; } + actor->unk_0B6++; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6002628)) { actor->unk_0B6 = 0; } + switch (actor->state) { case 0: for (i = 0; i < 9; i++) { @@ -3855,8 +4057,8 @@ void Aquas_801B638C(Actor* actor) { actor->fwork[15] = actor->obj.pos.x + sp80.x; actor->fwork[16] = actor->obj.pos.z + sp80.z; actor->state = 1; - break; + case 1: if (actor->timer_0BC == 1) { actor->iwork[15] = 1; @@ -3880,34 +4082,46 @@ void Aquas_801B638C(Actor* actor) { sp98 = sqrtf(SQ(actor->obj.pos.z - actor->fwork[16]) + SQ(actor->obj.pos.x - actor->fwork[15])); actor->fwork[13] -= 20.0f; actor->fwork[14] += 5.0f; + spB4 = SIN_DEG(actor->fwork[13]) * sp98 * 0.1f; temp_fsc = COS_DEG(actor->fwork[14]) * sp98 * 0.8f; temp_fscc = COS_DEG(actor->obj.rot.y) * temp_fsc; temp2 = -SIN_DEG(actor->obj.rot.y) * temp_fsc; + temp_fscc = Math_Atan2F(actor->obj.pos.x - actor->fwork[15] + temp_fscc, actor->obj.pos.z - actor->fwork[16] + temp2); temp_fsc = -Math_Atan2F(actor->obj.pos.y - spB4, sp98); temp_fscc = Math_RadToDeg(temp_fscc); + Math_SmoothStepToAngle(&actor->obj.rot.y, temp_fscc, 0.1f, 100.0f, 0.001f); + temp_fscc = Math_RadToDeg(temp_fsc); + if (actor->obj.pos.y >= 1000.0f) { temp_fscc = 0.0f; } + Math_SmoothStepToAngle(&actor->obj.rot.x, temp_fscc, 0.1f, 100.0f, 0.001f); Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + sp8C.x = sp8C.y = 0.0f; sp8C.z = 10.0f; + if (actor->iwork[14] != 0) { sp8C.z = 30.0f; } + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp8C, &sp80); + actor->vel.x = sp80.x; actor->vel.y = sp80.y; actor->vel.z = sp80.z; + if (actor->iwork[15] != 0) { actor->vel.x = actor->vel.y = actor->vel.z = 0.0f; } + if ((actor->iwork[14] != 0) && (actor->obj.pos.z < (gPlayer[0].unk_138 - 2000.0f))) { actor->iwork[14] = 0; actor->timer_0BC = 500; @@ -3915,6 +4129,7 @@ void Aquas_801B638C(Actor* actor) { } break; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if ((actor->health != 0) && (actor->unk_0D2 == 0)) { @@ -3942,7 +4157,9 @@ void Aquas_801B6E54(Actor* actor) { actor->vwork[15 + i].y = actor->obj.rot.y; actor->vwork[15 + i].z = actor->obj.rot.z; } + actor->health = 0; + if (actor->obj.rot.z != 0) { actor->obj.rot.z = 0.0f; actor->state = 1; @@ -3973,6 +4190,7 @@ void Aquas_801B6FF8(Actor* actor) { Object_Kill(&actor->obj, actor->sfxSource); func_effect_8007A6F0(&actor->obj.pos, 0x29038090); } + switch (actor->state) { case 0: if (actor->timer_0BC == 0) { @@ -4029,6 +4247,7 @@ void Aquas_801B6FF8(Actor* actor) { actor->vel.z = sp90.z; break; } + if (!(gGameFrameCount & 3)) { for (i = 0; i < 3; i++) { func_effect_80081A8C(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), @@ -4036,10 +4255,12 @@ void Aquas_801B6FF8(Actor* actor) { actor->obj.pos.z + RAND_FLOAT_CENTERED(70.0f), 1.0f, 1); } } + actor->unk_0B6++; if (Animation_GetFrameCount(&D_AQ_60260EC) < actor->unk_0B6) { actor->unk_0B6 = 0; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if (actor->health > -100) { @@ -4071,7 +4292,7 @@ bool Aquas_801B76EC(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th void Aquas_801B7754(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp24 = { 0.0f, 0.0f, 0.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (this->health == -100) { switch (limbIndex) { @@ -4162,6 +4383,7 @@ void Aquas_801B7AF0(Actor* actor) { actor->fwork[5] = 20.0f; actor->fwork[6] = 20.0f; actor->health = 60; + for (i = 0; i < 10; i++) { actor->vwork[0 + i].x = actor->obj.pos.x; actor->vwork[0 + i].y = actor->obj.pos.y; @@ -4190,6 +4412,7 @@ void Aquas_801B7C78(Actor* actor) { func_effect_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 1.0f + RAND_FLOAT(0.5f), 7); } + for (i = 0; i < 10; i++) { Aquas_801A9448(&actor->vwork[0 + i], &actor->vwork[10 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), RAND_FLOAT_CENTERED(10.0f), 52, actor->scale, 200, i); @@ -4206,45 +4429,56 @@ void Aquas_801B7C78(Actor* actor) { } } } + func_effect_800815DC(); func_effect_8007D0E0(actor->vwork[7].x, actor->vwork[7].y, actor->vwork[7].z, 5.0f); + actor->itemDrop = DROP_SILVER_RING_25p; + func_enmy_80066254(actor); Object_Kill(&actor->obj, actor->sfxSource); func_effect_8007A6F0(&actor->obj.pos, 0x29038090); } + if (actor->state != 6) { spAC = gPlayer[0].pos.x - actor->obj.pos.x; Math_SmoothStepToAngle(&actor->obj.rot.y, Math_RadToDeg(Math_Atan2F(spAC, gPlayer[0].unk_138 - actor->obj.pos.z)), 1.0f, 5.0f, 0.001f); } + if (((actor->state >= 2) && (actor->state < 4)) || (actor->state >= 5)) { Math_SmoothStepToF(&actor->fwork[4], 10.0f, 0.2f, 20.0f, 0); Math_SmoothStepToF(&actor->fwork[5], 20.0f, 0.2f, 20.0f, 0); Math_SmoothStepToF(&actor->fwork[6], 20.0f, 0.2f, 20.0f, 0); } + if ((actor->state >= 4) && (actor->state < 5)) { Math_SmoothStepToF(&actor->fwork[4], 159.0f, 0.1f, 10.0f, 0); Math_SmoothStepToF(&actor->fwork[5], 159.0f, 0.1f, 10.0f, 0); Math_SmoothStepToF(&actor->fwork[6], 255.0f, 0.1f, 10.0f, 0); } + if (((actor->state < 5) || (actor->state == 7)) && (actor->health != 0) && !(gGameFrameCount & 0xF)) { func_effect_8007B8F8(actor->vwork[22].x, gGroundLevel, actor->vwork[22].z, 5.0f); } + Math_SmoothStepToF(&actor->fwork[1], actor->fwork[2], 0.1f, 2.0f, 0.00001f); Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].camEye.z - D_ctx_80177D20 + actor->fwork[3], 0.1f, actor->fwork[1], 0.00001); + if ((actor->state == 1) && (fabsf(actor->fwork[7] - actor->obj.pos.z) >= 10000.0f)) { actor->timer_0C0 = 20; actor->state = 5; } + switch (actor->state) { case 0: actor->timer_0BE = (s32) (100.0f + RAND_FLOAT(150.0f)); actor->state = 1; actor->fwork[7] = actor->obj.pos.z; break; + case 1: if (actor->timer_0BC != 0) { Math_SmoothStepToF(&actor->fwork[4], 255.0f, 0.1f, 50.0f, 0); @@ -4259,20 +4493,24 @@ void Aquas_801B7C78(Actor* actor) { actor->state = 2; } } + if (!(gGameFrameCount & 3)) { Aquas_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), actor->vwork[7].z + 100.0f + RAND_FLOAT_CENTERED(100.0f), 1.0f, 0); } break; + case 2: actor->unk_0B6 += actor->iwork[1]; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6024F80)) { actor->unk_0B6 = 0; actor->timer_0BE = 0; + if (actor->iwork[1] >= 2) { actor->timer_0BE = 30; } + for (i = 0; i < 10; i++) { Aquas_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), @@ -4281,6 +4519,7 @@ void Aquas_801B7C78(Actor* actor) { actor->state = 3; } break; + case 3: if (actor->timer_0BE == 0) { for (i = 0; i < 2; i++) { @@ -4293,6 +4532,7 @@ void Aquas_801B7C78(Actor* actor) { actor->state = 4; } break; + case 4: actor->iwork[5]++; if (actor->timer_0C0 == 0) { @@ -4303,7 +4543,9 @@ void Aquas_801B7C78(Actor* actor) { actor->state = 7; } } + Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); + if ((actor->unk_0B6 < 21) && (actor->state == 4) && (actor->iwork[3] != 0)) { j = actor->iwork[3] - 1; effect = &gEffects[j]; @@ -4314,14 +4556,19 @@ void Aquas_801B7C78(Actor* actor) { temp_fs2 = Math_RadToDeg(Math_Atan2F(spAC, temp_dz)); temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); + Matrix_RotateY(gCalcMatrix, M_DTOR * temp_fs2, 0); Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; sp90.z = 30.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + effect->vel.x = sp84.x; effect->vel.y = sp84.y; effect->vel.z = sp84.z; + effect->unk_44 = 2; effect->timer_50 = 100; actor->iwork[3] = 0; @@ -4332,6 +4579,7 @@ void Aquas_801B7C78(Actor* actor) { effect->obj.pos.z = actor->vwork[21].z; } } + if ((actor->unk_0B6 < 58) && (actor->state == 4) && (actor->iwork[2] != 0)) { j = actor->iwork[2] - 1; effect = &gEffects[j]; @@ -4339,16 +4587,22 @@ void Aquas_801B7C78(Actor* actor) { spAC = gPlayer[0].pos.x - effect->obj.pos.x; temp_dy = gPlayer[0].pos.y - effect->obj.pos.y; temp_dz = gPlayer[0].unk_138 - 50.0f - effect->obj.pos.z; + temp_fs2 = Math_RadToDeg(Math_Atan2F(spAC, temp_dz)); temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); + Matrix_RotateY(gCalcMatrix, M_DTOR * temp_fs2, 0); Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; sp90.z = 50.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + effect->vel.x = sp84.x; effect->vel.y = sp84.y; effect->vel.z = sp84.z; + effect->unk_44 = 2; effect->timer_50 = 100; actor->iwork[2] = 0; @@ -4359,39 +4613,49 @@ void Aquas_801B7C78(Actor* actor) { } } break; + case 5: Math_SmoothStepToAngle(&actor->obj.rot.x, 40.0f, 0.1f, 10.0f, 0); + actor->unk_0B6++; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6024F80)) { actor->unk_0B6 = Animation_GetFrameCount(&D_AQ_6024F80) - 1; } + if (actor->timer_0C0 == 0) { temp_dy = gPlayer[0].pos.y - 50.0f - actor->obj.pos.y; temp_dz = gPlayer[0].unk_138 - actor->obj.pos.z; temp1 = Math_RadToDeg(-Math_Atan2F(temp_dy, sqrtf(SQ(spAC) + SQ(temp_dz)))); Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, M_DTOR * temp1, 1); + sp90.x = sp90.y = 0.0f; sp90.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp90, &sp84); + actor->vel.x = sp84.x; actor->vel.y = sp84.y; actor->vel.z = sp84.z; actor->state = 6; } break; + case 6: actor->unk_0B6++; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6024F80)) { actor->unk_0B6 = Animation_GetFrameCount(&D_AQ_6024F80) - 1; } + Math_SmoothStepToAngle(&actor->obj.rot.x, 30.0f, 0.1f, 10.0f, 0); + if (!(gGameFrameCount & 1)) { Aquas_801AC8A8(actor->vwork[7].x + RAND_FLOAT_CENTERED(120.0f), actor->vwork[7].y + RAND_FLOAT_CENTERED(50.0f), actor->vwork[7].z + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); } break; + case 7: actor->unk_0B6--; if (actor->unk_0B6 <= 0) { @@ -4401,9 +4665,11 @@ void Aquas_801B7C78(Actor* actor) { } break; } + if (actor->iwork[0] != 0) { actor->health = 0; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if (actor->health != 0) { @@ -4435,13 +4701,15 @@ void Aquas_801B7C78(Actor* actor) { } bool Aquas_801B8C50(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* thisx) { - Actor* this = thisx; + Actor* this = (Actor*) thisx; RCP_SetupDL(&gMasterDisp, 0x3A); + if (this->timer_0C6 & 1) { RCP_SetupDL(&gMasterDisp, 0x22); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 0, 0, 255); } + if ((this->timer_0C6 == 0) && ((this->fwork[6] <= 254.0f) || (this->state >= 4))) { RCP_SetupDL(&gMasterDisp, 0x22); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[4], (s32) this->fwork[5], (s32) this->fwork[6], @@ -4455,7 +4723,7 @@ void Aquas_801B8D7C(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp40 = { 108.0f, 0.0f, 24.0f }; Vec3f sp34 = { 102.0f, 14.0f, -21.0f }; Vec3f sp28 = { 0.0f, 0.0f, 0.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; switch (limbIndex) { case 1: @@ -4467,18 +4735,21 @@ void Aquas_801B8D7C(s32 limbIndex, Vec3f* rot, void* thisx) { Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[23]); } break; + case 2: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[1]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[11]); } break; + case 3: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[2]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[12]); } break; + case 4: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[3]); @@ -4488,36 +4759,42 @@ void Aquas_801B8D7C(s32 limbIndex, Vec3f* rot, void* thisx) { Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[24]); } break; + case 5: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[4]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); } break; + case 6: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[5]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); } break; + case 9: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[6]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); } break; + case 10: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[7]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); } break; + case 11: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[8]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[18]); } break; + case 12: if (this->health == 0) { Matrix_MultVec3f(gCalcMatrix, &sp4C, &this->vwork[9]); @@ -4559,23 +4836,29 @@ void Aquas_801B91A4(Actor* actor) { Matrix_RotateY(gCalcMatrix, actor->obj.rot.y * M_DTOR, 0); Matrix_RotateX(gCalcMatrix, actor->obj.rot.x * M_DTOR, 1); + if ((actor->health == 0) && (actor->state > 0)) { actor->itemDrop = DROP_NONE; func_enmy_80066254(actor); + for (i = 0; i < 5; i++) { func_effect_80081A8C(actor->obj.pos.x + RAND_FLOAT(i * 15.0f), actor->obj.pos.y + RAND_FLOAT(i * 3.0f), actor->obj.pos.z + RAND_FLOAT(i * 5.0f), 0.5f + RAND_FLOAT(0.3f), 7); } + for (i = RAND_INT(10.0f); i < 13; i++) { Aquas_801A9448(&actor->vwork[0 + i], &actor->vwork[13 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), RAND_FLOAT_CENTERED(10.0f), 53, actor->scale, 200, i); func_effect_8007BC7C(actor->vwork[0 + i].x, actor->vwork[0 + i].y, actor->vwork[0 + i].z + 100.0f, 6.0f); } + Object_Kill(&actor->obj, actor->sfxSource); + func_effect_800815DC(); func_effect_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 5.0f); func_effect_8007A6F0(&actor->obj.pos, 0x29038090); } + switch (actor->state) { case 0: for (i = 0; i < 13; i++) { @@ -4586,9 +4869,11 @@ void Aquas_801B91A4(Actor* actor) { actor->vwork[13 + i].y = actor->obj.rot.y; actor->vwork[13 + i].z = actor->obj.rot.z; } + actor->health = 30; actor->unk_0B6 = 19; actor->fwork[1] = actor->obj.pos.z; + if (actor->obj.rot.z >= 4.0f) { actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_AQ_60314AC); actor->health = 200; @@ -4603,7 +4888,9 @@ void Aquas_801B91A4(Actor* actor) { } spC4.x = spC4.y = 0.0f; spC4.z = 40.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &spC4, &spB8); + actor->fwork[4] = spB8.x; actor->fwork[5] = spB8.y; actor->fwork[6] = spB8.z; @@ -4611,6 +4898,7 @@ void Aquas_801B91A4(Actor* actor) { actor->obj.rot.z = 0.0f; } break; + case 1: actor->unk_0B6++; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6000AE4)) { @@ -4621,9 +4909,11 @@ void Aquas_801B91A4(Actor* actor) { actor->vel.y = actor->fwork[5]; actor->vel.z = actor->fwork[6]; } + Math_SmoothStepToF(&actor->vel.x, 0.0f, 0.1f, 1.0f, 0.00001f); Math_SmoothStepToF(&actor->vel.y, 0.0f, 0.1f, 1.0f, 0.00001f); Math_SmoothStepToF(&actor->vel.z, 0.0f, 0.1f, 1.0f, 0.00001f); + i = 0; if (actor->iwork[1] != 0) { if (!(actor->unk_0B6 & 7)) { @@ -4634,6 +4924,7 @@ void Aquas_801B91A4(Actor* actor) { i = 1; } } + if ((actor->unk_0B6 > 36) && (i != 0) && (fabsf(gPlayer[0].unk_138 - actor->obj.pos.z) > 1000.0f)) { spfA4 = gPlayer[0].pos.x + RAND_FLOAT_CENTERED(200.0f) - actor->vwork[26].x; spA0 = gPlayer[0].pos.y + RAND_FLOAT_CENTERED(200.0f) - actor->vwork[26].y; @@ -4650,6 +4941,7 @@ void Aquas_801B91A4(Actor* actor) { 0.0f, 0.0f, 0.0f, 0.0f, spAC.x, spAC.y, spAC.z, 1.0f); } break; + case 2: actor->unk_0B6++; if ((actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6000AE4)) && (actor->fwork[8] < 1.0f)) { @@ -4659,13 +4951,16 @@ void Aquas_801B91A4(Actor* actor) { actor->fwork[8] = 700.0f; Aquas_801A9728(actor, 50.0f, 10.0f, 8); } + Math_SmoothStepToF(&actor->obj.pos.y, actor->fwork[7] + actor->fwork[8], 0.1f, 10.0f, 0.00001f); Math_SmoothStepToF(&actor->fwork[8], 0.0f, 0.1f, 10.0f, 0.0001f); + if (actor->unk_0B6 >= 40) { Aquas_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), actor->obj.pos.y - 50.0f + RAND_FLOAT_CENTERED(50.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 1.0f, 0); } + if (actor->unk_0B6 >= 37) { actor->obj.rot.y += 20.0f; actor->fwork[2] += 20.0f; @@ -4684,6 +4979,7 @@ void Aquas_801B91A4(Actor* actor) { } break; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if ((actor->health != 0) && (actor->state != 0)) { @@ -4705,58 +5001,59 @@ void Aquas_801B91A4(Actor* actor) { void Aquas_801B9DB0(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp34 = { 0.0f, 0.0f, 0.0f }; Vec3f sp28 = { -27.0f, 7.0f, 5.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if ((this->health == 0) || (limbIndex == 12)) { switch (limbIndex) { case 1: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[0]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[13]); - return; + break; case 2: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[1]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[14]); - return; + break; case 3: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[2]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[15]); - return; + break; case 4: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[3]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[16]); - return; + break; case 5: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[4]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[17]); - return; + break; case 6: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[5]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[18]); - return; + break; case 7: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[6]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[19]); - return; + break; case 8: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[7]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[20]); - return; + break; case 9: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[8]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[21]); - return; + break; case 10: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[9]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[22]); - return; + break; case 11: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[10]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[23]); - return; + break; case 12: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[11]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[24]); Matrix_Push(&gCalcMatrix); + switch (gGameFrameCount & 3) { case 0: break; @@ -4770,10 +5067,11 @@ void Aquas_801B9DB0(s32 limbIndex, Vec3f* rot, void* thisx) { Matrix_RotateX(gCalcMatrix, 3 * M_PI / 2, 1); break; } + Matrix_MultVec3f(gCalcMatrix, &sp28, &this->vwork[26]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[27]); Matrix_Pop(&gCalcMatrix); - return; + break; case 21: Matrix_MultVec3f(gCalcMatrix, &sp34, &this->vwork[12]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[25]); @@ -4794,10 +5092,13 @@ void Aquas_801BA108(Actor* actor) { RCP_SetupDL(&gMasterDisp, 0x1E); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 95, 31, 255); } + Matrix_Scale(gCalcMatrix, actor->scale, actor->scale, actor->scale, 1); + if (actor->state == 1) { Matrix_RotateX(gCalcMatrix, (actor->obj.rot.x + 90.0f) * M_DTOR, 1); } + Animation_GetFrameData(&D_AQ_6000AE4, actor->unk_0B6, sp40); Animation_DrawSkeleton(3, D_AQ_6000DB0, sp40, NULL, Aquas_801B9DB0, actor, gCalcMatrix); } @@ -4817,7 +5118,9 @@ void Aquas_801BA26C(Actor* actor) { if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6020A40)) { actor->unk_0B6 = 0; } + sp3E = Animation_GetFrameData(&D_AQ_6020A40, actor->unk_0B6, sp40); + if ((fabsf(actor->obj.pos.x - gPlayer[0].pos.x) < 150.0f) && (fabsf(actor->obj.pos.y - gPlayer[0].pos.y) < 500.0f) && (fabsf(actor->obj.pos.z - gPlayer[0].unk_138) < 700.0f)) { @@ -4825,6 +5128,7 @@ void Aquas_801BA26C(Actor* actor) { actor->fwork[0] = 0.0f; } break; + case 2: actor->unk_0B6 += 2; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_601DE50)) { @@ -4881,8 +5185,10 @@ void Aquas_801BA6A4(Actor* actor) { actor->obj.pos.y + RAND_FLOAT_CENTERED(50.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(100.0f), 2.0f, 0); } + actor->fwork[1] += 10.0f; actor->vel.x = SIN_DEG(actor->fwork[1]) * 10.0f; + if (actor->obj.pos.y < (gGroundLevel + 30.0f)) { AUDIO_PLAY_SFX(0x19400007, actor->sfxSource, 4); actor->iwork[1] = 1; @@ -4895,15 +5201,19 @@ void Aquas_801BA6A4(Actor* actor) { } } break; + case 1: if (actor->iwork[1] == 0) { actor->obj.rot.z += actor->fwork[2]; + if (!(gGameFrameCount & 3)) { Aquas_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(70.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(50.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(50.0f), 1.0f, 0); } + Math_SmoothStepToF(&actor->vel.y, -7.0f, 0.1f, 1.0f, 0.0001f); + if (actor->obj.pos.y < (gGroundLevel + 20.0f)) { actor->gravity = 0.0f; if (actor->vel.y < 0.0f) { @@ -4921,6 +5231,7 @@ void Aquas_801BA6A4(Actor* actor) { Math_SmoothStepToF(&actor->vel.z, 0.0f, 0.1f, 1.0f, 0.0001f); break; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; actor->health -= actor->damage; @@ -4933,12 +5244,15 @@ void Aquas_801BA6A4(Actor* actor) { Actor_Initialize(var_s0); var_s0->obj.status = OBJ_INIT; var_s0->obj.id = OBJ_ACTOR_265; + var_s0->obj.pos.x = actor->obj.pos.x; var_s0->obj.pos.y = actor->obj.pos.y + 20.0f; var_s0->obj.pos.z = actor->obj.pos.z; + var_s0->vel.x = RAND_FLOAT_CENTERED(50.0f); var_s0->vel.y = RAND_FLOAT(5.0f); var_s0->vel.z = RAND_FLOAT_CENTERED(50.0f); + var_s0->state = 1; Object_SetInfo(&var_s0->info, var_s0->obj.id); @@ -4986,6 +5300,7 @@ void Aquas_801BADF8(Actor* actor) { } actor->state++; break; + case 1: if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; @@ -4996,6 +5311,7 @@ void Aquas_801BADF8(Actor* actor) { actor->state++; } break; + case 2: for (i = 0; i < 5; i++) { Aquas_801A9448(&actor->vwork[0 + i], &actor->vwork[5 + i], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), @@ -5010,7 +5326,7 @@ void Aquas_801BADF8(Actor* actor) { void Aquas_801BB0C4(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp24 = { 0.0f, 0.0f, 0.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (this->state != 0) { switch (limbIndex) { @@ -5097,17 +5413,22 @@ void Aquas_801BB26C(Actor* actor) { actor->iwork[8] = RAND_INT(120.0f); actor->iwork[9] = RAND_INT(120.0f); actor->unk_0B6 = RAND_INT(Animation_GetFrameCount(&D_AQ_6023780)); + if (actor->iwork[2] == 0) { actor->iwork[18] = fabsf(actor->obj.rot.y / 10.0f); if ((actor->iwork[18] == 0) || (actor->iwork[18] == 2)) { actor->iwork[19] = 1; } actor->iwork[13] = D_i3_801C4450 * 3; + Matrix_RotateZ(gCalcMatrix, actor->obj.rot.z * M_DTOR, 0); + sp54.x = 0.0f; sp54.y = actor->obj.rot.x * 10.0f; sp54.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); + for (sp64 = 0, sp44 = gActors; sp64 < 60; sp64++, sp44++) { if (sp44->obj.status == OBJ_FREE) { Actor_Initialize(sp44); @@ -5126,11 +5447,15 @@ void Aquas_801BB26C(Actor* actor) { break; } } + Matrix_RotateZ(gCalcMatrix, (actor->obj.rot.z + 90.0f) * M_DTOR, 0); + sp54.x = 0.0f; sp54.y = actor->obj.rot.x * 10.0f; sp54.z = 0.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp54, &sp48); + for (sp60 = 0, sp40 = gActors; sp60 < 60; sp60++, sp40++) { if (sp40->obj.status == OBJ_FREE) { Actor_Initialize(sp40); @@ -5200,6 +5525,7 @@ void Aquas_801BB79C(Actor* actor) { } } break; + case 3: case 4: i = actor->iwork[19] + (actor->iwork[2] * 2); @@ -5229,10 +5555,13 @@ void Aquas_801BB79C(Actor* actor) { } else { actor->vel.x = actor->vel.y = 0.0f; } + if (actor->iwork[2] == 0) { sp70 = &gActors[actor->iwork[0] - 1]; sp6C = &gActors[actor->iwork[1] - 1]; + Math_SmoothStepToF(&actor->fwork[21], 200.0f, 0.1f, 2.0f, 0.0001f); + if ((actor->iwork[13] == sp70->iwork[13]) && (actor->iwork[14] == 0)) { i = 1; if (!((sp70->obj.id == OBJ_ACTOR_267) && (sp70->obj.status == OBJ_ACTIVE))) { @@ -5249,10 +5578,13 @@ void Aquas_801BB79C(Actor* actor) { sp70->timer_0C6 = actor->timer_0C6; } } + if (!(gGameFrameCount & 7)) { func_effect_8007A6F0(&sp70->obj.pos, 0x3100208E); } + Aquas_801A92EC(actor, sp70->obj.pos.x, sp70->obj.pos.y, sp70->obj.pos.z, actor->iwork[13], i); + if ((actor->fwork[21] > 200.0f) && (actor->iwork[17] != 0)) { Matrix_RotateZ(gCalcMatrix, actor->fwork[20] * M_DTOR, 0); sp80.x = 0.0f; @@ -5264,6 +5596,7 @@ void Aquas_801BB79C(Actor* actor) { sp70->obj.pos.z = actor->obj.pos.z; } } + if ((actor->iwork[13] == sp6C->iwork[13]) && (actor->iwork[15] == 0)) { i = 1; if (!((sp6C->obj.id == OBJ_ACTOR_267) && (sp6C->obj.status == OBJ_ACTIVE))) { @@ -5280,10 +5613,13 @@ void Aquas_801BB79C(Actor* actor) { sp6C->timer_0C6 = actor->timer_0C6; } } + if (!(gGameFrameCount & 3)) { func_effect_8007A6F0(&sp6C->obj.pos, 0x3100208E); } + Aquas_801A92EC(actor, sp6C->obj.pos.x, sp6C->obj.pos.y, sp6C->obj.pos.z, actor->iwork[13] + 1, i); + if ((actor->fwork[21] > 200.0f) && (actor->iwork[17] != 0)) { Matrix_RotateZ(gCalcMatrix, (actor->fwork[20] + 90.0f) * M_DTOR, 0); sp80.x = 0.0f; @@ -5313,38 +5649,46 @@ void Aquas_801BB79C(Actor* actor) { sp70->timer_0C6 = actor->timer_0C6; } } + if (!(gGameFrameCount & 0xF)) { func_effect_8007A6F0(&sp70->obj.pos, 0x3100208E); } + Aquas_801A92EC(actor, sp70->obj.pos.x, sp70->obj.pos.y, sp70->obj.pos.z, actor->iwork[13] + 2, i); } } + if (!(gGameFrameCount & 3)) { func_effect_8007C120(actor->obj.pos.x + RAND_FLOAT_CENTERED(100.0f), actor->obj.pos.y + RAND_FLOAT_CENTERED(100.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(50.0f), actor->vel.x, actor->vel.y, actor->vel.z, 0.05f + RAND_FLOAT(0.03f), 10); } + if (actor->timer_0BE == 0) { D_i3_801C41B8[18] = 255.0f; D_i3_801C41B8[19] = 255.0f; D_i3_801C41B8[20] = 255.0f; actor->timer_0BE = 10; } + if (actor->iwork[3] == 0) { Math_SmoothStepToF(&actor->fwork[1], 30.0f, 0.1f, 1.0f, 0.00001f); } else { Math_SmoothStepToF(&actor->fwork[1], 100.0f, 0.1f, 1.0f, 0.00001f); } + if (actor->timer_0BC == 0) { actor->timer_0BC = 100; actor->iwork[3]++; actor->iwork[3] &= 1; } + actor->unk_0B6 += 2; if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_6023780)) { actor->unk_0B6 = 0; } + if (actor->iwork[4] < 30) { actor->fwork[2] += D_i3_801C0344[0].x; actor->fwork[3] += D_i3_801C0344[0].y; @@ -5362,6 +5706,7 @@ void Aquas_801BB79C(Actor* actor) { actor->fwork[4] = 255.0f; } } + for (i = 0; i < 2; i++) { if (actor->iwork[i + 5] < 30) { actor->fwork[i + 5] += D_i3_801C0344[2].x; @@ -5381,6 +5726,7 @@ void Aquas_801BB79C(Actor* actor) { } } } + for (i = 0; i < 3; i++) { it0 = i * 12 + 3 * actor->iwork[10 + i]; Math_SmoothStepToF(&actor->fwork[11 + i], D_i3_801C0374[it0 + 0], 0.1f, 5.0f, 0.000001f); @@ -5392,30 +5738,37 @@ void Aquas_801BB79C(Actor* actor) { actor->iwork[10 + i]++; } } + actor->iwork[4]++; if (actor->iwork[4] >= 60) { actor->iwork[4] = 0; } + actor->iwork[5]++; if (actor->iwork[5] >= 60) { actor->iwork[5] = 0; } + actor->iwork[6]++; if (actor->iwork[6] >= 60) { actor->iwork[6] = 0; } + actor->iwork[7]++; if (actor->iwork[7] >= 120) { actor->iwork[7] = actor->iwork[10] = 0; } + actor->iwork[8]++; if (actor->iwork[8] >= 60) { actor->iwork[8] = actor->iwork[11] = 0; } + actor->iwork[9]++; if (actor->iwork[9] >= 120) { actor->iwork[9] = actor->iwork[12] = 0; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; AUDIO_PLAY_SFX(0x2903408F, actor->sfxSource, 4); @@ -5425,6 +5778,7 @@ void Aquas_801BB79C(Actor* actor) { actor->timer_0C0 = actor->timer_0C6 = 80; } } + if (actor->iwork[20] != 0) { actor->iwork[20]--; } @@ -5437,47 +5791,57 @@ bool Aquas_801BC530(s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3f* rot, void* th f32 sp54 = 0.0f; f32 sp50 = 0.0f; f32 sp4C = 0.0f; - Actor* this = thisx; + Actor* this = (Actor*) thisx; RCP_SetupDL(&gMasterDisp, 0x29); + if (!(this->timer_0C6 & 1)) { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 191, 255, 223, (s32) this->fwork[1]); } else { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 0, 255); } + switch (limbIndex) { case 1: sp54 = this->fwork[12]; sp50 = this->fwork[15]; sp4C = this->fwork[18]; break; + case 2: sp54 = this->fwork[13]; sp50 = this->fwork[16]; sp4C = this->fwork[19]; break; + case 3: gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[5], (s32) this->fwork[7], (s32) this->fwork[9], 255); break; + case 4: gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[2], (s32) this->fwork[3], (s32) this->fwork[4], 255); break; + case 5: gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, (s32) this->fwork[6], (s32) this->fwork[8], (s32) this->fwork[10], 255); break; + case 11: sp54 = this->fwork[11]; sp50 = this->fwork[14]; sp4C = this->fwork[17]; } + if (sp54 > 0.0f) { Matrix_Translate(gCalcMatrix, pos->x, pos->y, pos->z, 1); + Matrix_RotateZ(gCalcMatrix, rot->z * M_DTOR, 1); Matrix_RotateY(gCalcMatrix, rot->y * M_DTOR, 1); Matrix_RotateX(gCalcMatrix, rot->x * M_DTOR, 1); + if (*dList != NULL) { Matrix_MultVec3f(gCalcMatrix, &sp64, &sp58); func_edisplay_8005F670(&sp58); @@ -5522,16 +5886,20 @@ void Aquas_801BC9A0(Actor* actor) { actor->vwork[0].x = actor->obj.pos.x; actor->vwork[0].y = actor->obj.pos.y; actor->vwork[0].z = actor->obj.pos.z; + actor->vwork[1].x = actor->obj.pos.x; actor->vwork[1].y = actor->obj.pos.y; actor->vwork[1].z = actor->obj.pos.z; + actor->vwork[4].x = actor->obj.pos.x; actor->vwork[4].y = actor->obj.pos.y; actor->vwork[4].z = actor->obj.pos.z; + actor->iwork[1] = actor->obj.rot.z; if (actor->iwork[1] >= 9) { actor->iwork[1] = 7; } + if (actor->obj.rot.y != 0) { actor->health = 7650; actor->iwork[3] = 1; @@ -5544,6 +5912,7 @@ void Aquas_801BC9A0(Actor* actor) { } actor->obj.rot.y = actor->obj.rot.z = 0.0f; break; + case 1: if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; @@ -5557,6 +5926,7 @@ void Aquas_801BC9A0(Actor* actor) { } } break; + case 3: for (i = 0; i < 2; i++) { for (j = 0; j < 60; j++) { @@ -5567,6 +5937,7 @@ void Aquas_801BC9A0(Actor* actor) { } } } + for (i = 0; i < 2; i++) { for (j = 0, var_s0 = gActors; j < 60; j++, var_s0++) { if (var_s0->obj.status == OBJ_FREE) { @@ -5578,6 +5949,7 @@ void Aquas_801BC9A0(Actor* actor) { var_s0->obj.pos.z = actor->vwork[i].z; var_s0->iwork[0] = i + 1; Object_SetInfo(&var_s0->info, var_s0->obj.id); + if (i == 0) { var_s0->fwork[0] = RAND_FLOAT(360.0f); Matrix_RotateY(gCalcMatrix, var_s0->fwork[0] * M_DTOR, 0); @@ -5596,23 +5968,28 @@ void Aquas_801BC9A0(Actor* actor) { } } } + for (j = 0; j < 10; j++) { Aquas_801A9448(&actor->vwork[4], &actor->vwork[5], RAND_FLOAT_CENTERED(20.0f), RAND_FLOAT(5.0f), RAND_FLOAT_CENTERED(10.0f), 58, 0.2f + RAND_FLOAT(1.0f), 200, 0); func_effect_8007BC7C(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z + 50.0f, 6.0f); } + func_effect_800815DC(); func_effect_8007D0E0(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z, 10.0f); + for (j = 0; j < 20; j++) { Aquas_801AC8A8(actor->vwork[4].x + RAND_FLOAT_CENTERED(100.0f), actor->vwork[4].y + RAND_FLOAT_CENTERED(200.0f), actor->vwork[4].z + 100.0f + RAND_FLOAT_CENTERED(200.0f), 6.0f, 2); } + func_effect_800815DC(); func_effect_8007D0E0(actor->vwork[4].x, actor->vwork[4].y, actor->vwork[4].z + 150.0f, 10.0f); actor->timer_0BC = 4; actor->state = 4; break; + case 4: if (actor->timer_0BC == 0) { actor->obj.pos.x = actor->vwork[4].x; @@ -5624,14 +6001,17 @@ void Aquas_801BC9A0(Actor* actor) { func_effect_8007A6F0(&actor->obj.pos, 0x19021078); } break; + case 5: Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[0], 0.1f, 10.0f, 0.0001f); Math_SmoothStepToAngle(&actor->obj.rot.x, 90.0f, 0.1f, 1.0f, 0.0001f); + if (!(gGameFrameCount & 1) && (actor->iwork[2] == 0)) { Aquas_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(200.0f), actor->obj.pos.y + RAND_RANGE(-45.0f, 105.0f), actor->obj.pos.z + RAND_FLOAT_CENTERED(200.0f), 6.0f, 2); } + if ((actor->obj.pos.y < (gGroundLevel + 30.0f)) && (actor->iwork[2] == 0)) { actor->iwork[2] = 1; actor->vel.x = actor->vel.y = actor->vel.z = actor->gravity = 0.0f; @@ -5648,18 +6028,20 @@ void Aquas_801BC9A0(Actor* actor) { void Aquas_801BD17C(s32 limbIndex, Vec3f* rot, void* thisx) { Vec3f sp2C = { 0.0f, 0.0f, 0.0f }; - Actor* this = thisx; + Actor* this = (Actor*) thisx; if (this->state == 3) { switch (limbIndex) { case 1: Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[4]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[5]); - return; + break; + case 2: Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[0]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[2]); - return; + break; + case 5: Matrix_MultVec3f(gCalcMatrix, &sp2C, &this->vwork[1]); Matrix_GetYRPAngles(gCalcMatrix, &this->vwork[3]); @@ -5702,6 +6084,7 @@ void Aquas_801BD3B0(Actor* actor, f32 x, f32 y, f32 z) { Math_SmoothStepToAngle(&actor->obj.rot.y, actor->fwork[6], 0.1f, 100.0f, 0.00001f); Math_SmoothStepToAngle(&actor->obj.rot.x, actor->fwork[7], 0.1f, 100.0f, 0.00001f); + if (!(gGameFrameCount & 3)) { actor->fwork[6] = Math_RadToDeg(Math_Atan2F(x, z)); temp = sqrtf(SQ(x) + SQ(z)); @@ -5744,6 +6127,7 @@ void Aquas_801BD54C(Actor* actor) { // needed to match } } + switch (actor->state) { case 0: if (actor->obj.rot.z != 0) { @@ -5753,6 +6137,7 @@ void Aquas_801BD54C(Actor* actor) { actor->state = 1; actor->fwork[5] = actor->obj.pos.z; break; + case 1: sp64 = actor->index; for (sp68 = 0; sp68 < 15; sp68++) { @@ -5782,10 +6167,12 @@ void Aquas_801BD54C(Actor* actor) { } actor->state = 2; break; + case 2: if (actor->obj.pos.y < gGroundLevel + 30.0f) { actor->obj.pos.y = gGroundLevel + 30.0f; } + if ((actor->iwork[2] != 0) || (actor->timer_0BE != 0)) { actor->timer_0BC = 0; } else { @@ -5793,6 +6180,7 @@ void Aquas_801BD54C(Actor* actor) { Math_SmoothStepToF(&actor->obj.pos.z, gPlayer[0].camEye.z - D_ctx_80177D20 - actor->fwork[3], 0.1f, 30.0f, 0.00001f); } + if ((actor->timer_0BC == 0) && (actor->iwork[2] == 0) && (actor->timer_0BE == 0)) { actor->timer_0BC = 60; actor->fwork[1] = RAND_FLOAT_CENTERED(300.0f); @@ -5803,9 +6191,11 @@ void Aquas_801BD54C(Actor* actor) { actor->iwork[1]++; actor->iwork[1] &= 3; } + sp5C = gPlayer[0].pos.x - actor->obj.pos.x; sp58 = gPlayer[0].pos.y - actor->obj.pos.y; sp54 = gPlayer[0].unk_138 - actor->obj.pos.z; + if (actor->timer_0BE == 0) { actor->iwork[2] = 0; if (actor->iwork[0] == 0) { @@ -5837,6 +6227,7 @@ void Aquas_801BD54C(Actor* actor) { } } else if ((D_i3_801C41B8[21] != 0) && (D_i3_801C41B8[22] != 0) && (D_i3_801C41B8[23] != 0)) { sp68 = actor->iwork[0]; + var_fs0 = 50.0f; if (Rand_ZeroOne() < 0.5f) { var_fs0 = -50.0f; @@ -5849,6 +6240,7 @@ void Aquas_801BD54C(Actor* actor) { } if (1) {} } + if ((actor->iwork[2] != 0) && (D_i3_801C4190[5] == 0)) { actor->iwork[2] = 0; actor->fwork[4] = 40.0f; @@ -5856,17 +6248,22 @@ void Aquas_801BD54C(Actor* actor) { } Aquas_801BD3B0(actor, sp5C, sp58, sp54); break; + case 3: sp5C = gPlayer[0].pos.x + actor->fwork[1] - actor->obj.pos.x; sp58 = gPlayer[0].pos.y + actor->fwork[2] - actor->obj.pos.y; sp54 = gPlayer[0].unk_138 + 10000.0f - actor->fwork[3] - actor->obj.pos.z; + actor->iwork[2] = 1; + Aquas_801BD3B0(actor, sp5C, sp58, sp54); + if ((gPlayer[0].unk_138 + 1000.0f) < actor->obj.pos.z) { Object_Kill(&actor->obj, actor->sfxSource); } break; } + actor->unk_0B6++; if (Animation_GetFrameCount(&D_AQ_60135E0) < actor->unk_0B6) { actor->unk_0B6 = 0; @@ -5931,9 +6328,11 @@ void Aquas_801BDF14(void) { Actor_Initialize(var_s0); var_s0->obj.status = OBJ_INIT; var_s0->obj.id = OBJ_ACTOR_195; + var_s0->obj.pos.x = D_i3_801C0504[i].x; var_s0->obj.pos.y = D_i3_801C0504[i].y; var_s0->obj.pos.z = D_i3_801C0504[i].z; + var_s0->unk_0F4.y = D_i3_801C075C[i]; var_s0->unk_0B6 = 41; var_s0->iwork[0] = RAND_INT(20.0f); @@ -5952,10 +6351,12 @@ void Aquas_801BE034(Actor* actor) { temp = D_i3_801C0828[actor->iwork[2]]; Math_SmoothStepToAngle(&actor->unk_0F4.y, temp, 1.0f, 100.0f, 0.00001f); } + actor->iwork[0]++; if (actor->iwork[0] >= Animation_GetFrameCount(&D_AQ_60135E0)) { actor->iwork[0] = 0; } + if (gPlayer[0].unk_1D0 >= 5) { Object_Kill(&actor->obj, actor->sfxSource); } @@ -5987,14 +6388,19 @@ void Aquas_801BE274(Actor* actor, f32 yRot, f32 xRot) { Matrix_RotateY(gCalcMatrix, 0.017453292f * yRot, 0); Matrix_RotateX(gCalcMatrix, 0.017453292f * xRot, 1); + sp40.x = sp40.y = 0.0f; sp40.z = 50.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp40, &sp64); + sp64.x += actor->obj.pos.x; sp64.y += actor->obj.pos.y + 8.0f; sp64.z = actor->obj.pos.z; + sp40.x = sp40.y = 0.0f; sp40.z = 80.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp40, &sp58); func_effect_8007F04C(355, sp64.x, sp64.y, sp64.z, xRot, yRot, 0.0f, 0.0f, 0.0f, 0.0f, sp58.x, sp58.y, sp58.z, 1.0f); } @@ -6016,6 +6422,7 @@ void Aquas_801BE3F8(Actor* actor) { actor->fwork[2] = 0.8f; actor->state++; break; + case 1: if (fabsf(gPlayer[0].pos.z - actor->obj.pos.z) <= 3000.0f) { actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_AQ_60314E4); @@ -6025,6 +6432,7 @@ void Aquas_801BE3F8(Actor* actor) { actor->state++; } break; + case 2: actor->unk_0B6++; if (actor->unk_0B6 == 10) { @@ -6034,6 +6442,7 @@ void Aquas_801BE3F8(Actor* actor) { 3.0f, 2); } } + if ((actor->unk_0B6 == 18) && (actor->health != 0)) { actor->unk_0B6 = 17; if ((fabsf(actor->obj.pos.z - gPlayer[0].unk_138) > 1000.0f) && (actor->timer_0BC < 20) && @@ -6049,15 +6458,18 @@ void Aquas_801BE3F8(Actor* actor) { } } } + if (actor->unk_0B6 >= Animation_GetFrameCount(&D_AQ_602201C)) { actor->info.bonus = 0; actor->unk_0B6 = Animation_GetFrameCount(&D_AQ_602201C) - 1; actor->state++; } break; + case 3: break; } + if (actor->unk_0D0 != 0) { actor->unk_0D0 = 0; if (actor->health != 0) { @@ -6065,12 +6477,15 @@ void Aquas_801BE3F8(Actor* actor) { actor->health -= actor->damage; if (actor->health <= 0) { actor->health = actor->itemDrop = 0; + func_enmy_80066254(actor); + for (i = 0; i < 10; i++) { Aquas_801AC8A8(actor->obj.pos.x + RAND_FLOAT_CENTERED(200.0f), actor->obj.pos.y + 50.0f + RAND_FLOAT_CENTERED(70.0f), actor->obj.pos.z + 100.0f, 3.0f, 2); } + for (i = 0; i < 3; i++) { func_effect_80081A8C(actor->obj.pos.x + RAND_FLOAT(15.0f), actor->obj.pos.y + RAND_FLOAT(3.0f), actor->obj.pos.z + RAND_FLOAT(5.0f), 1.0f + RAND_FLOAT(0.5f), 7); @@ -6079,6 +6494,7 @@ void Aquas_801BE3F8(Actor* actor) { func_effect_8007CF30(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z + 51.0f, 10.0f); } } + if (actor->state == 1) { actor->info.hitbox = SEGMENTED_TO_VIRTUAL(D_AQ_60314E4); actor->info.damage = 0; @@ -6096,6 +6512,7 @@ void Aquas_801BEB1C(Actor* actor) { gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 143, 143, 255); Animation_GetFrameData(&D_AQ_602201C, actor->unk_0B6, actor->vwork); Animation_DrawSkeleton(1, D_AQ_60220E8, actor->vwork, NULL, NULL, &actor->index, &gIdentityMatrix); + if (actor->health != 0) { RCP_SetupDL(&gMasterDisp, 0x37); Matrix_Scale(gGfxMatrix, actor->fwork[0], actor->fwork[1], actor->fwork[2], 1);