From aacb8e54f81c70304d1d0ddb07a06a8a803e0d0a Mon Sep 17 00:00:00 2001 From: roeming Date: Sat, 4 Jan 2025 20:09:47 -0500 Subject: [PATCH] Match big fish --- include/ac_museum_fish.h | 3 +- src/actor/ac_museum_fish_big_fish.c_inc | 203 ++++++++++++++++++++++-- 2 files changed, 195 insertions(+), 11 deletions(-) diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index df32e756..6f397d01 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -129,6 +129,7 @@ typedef struct _FISH_PRIVATE_DATA { s16 _640; s16 _642; s16 _644; + s16 _646; } MUSEUM_FISH_PRIVATE_DATA; // size 648 // Holds data for the underwater grass @@ -381,7 +382,7 @@ void mfish_donko_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_big_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_big_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_bfish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_bfish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, void* arg, s_xyz* joint1, xyz_t* trans); void mfish_big_fish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); diff --git a/src/actor/ac_museum_fish_big_fish.c_inc b/src/actor/ac_museum_fish_big_fish.c_inc index e6943887..ae1be141 100644 --- a/src/actor/ac_museum_fish_big_fish.c_inc +++ b/src/actor/ac_museum_fish_big_fish.c_inc @@ -1,23 +1,206 @@ void mfish_big_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + qrand(); + actor->_5A0.y = actor->init_data._0C; + mfish_onefish_ct(actor, gamex); + actor->_5E8 = 0.0f; + actor->_5AC = ZeroVec; + actor->_5F0 = actor->_5E8; + actor->_60C.y = DEG2SHORT_ANGLE(90); + if (actor->_59C == 0x27) { + actor->_60C.y = -actor->_60C.y; + actor->_5A0.z = 430.0f; + actor->_5A0.x += 40.0f; + actor->_640 = 0; + } else if (actor->_59C == 10) { + actor->_5A0.z = 530.0f; + actor->_5A0.x -= 40.0f; + } + + actor->_612.y = actor->_60C.y; + actor->_5F4 = 0.0f; + actor->_5D0.y = 0.0f; + actor->_622 = 0; + actor->_624 = 7; + actor->_63A = qrand(); + actor->_63C = qrand(); + actor->_640 = 0; + actor->_634 = 0; + actor->_632 = 0; + actor->_644 = 0; + actor->_5AC.x = 0.0f; + actor->_5AC.z = 0.0f; + + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); } void mfish_big_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + if (actor->_59C == 0x27) { + actor->_38._00.frame_control.speed = (sin_s(actor->_63A) * 0.2f + 1.0f) * 0.5f; + } else { + actor->_38._00.frame_control.speed = + ((GETREG(TAKREG, 0x37) * 0.01f) + 0.5f + sin_s(actor->_63A) * (GETREG(TAKREG, 0x38) * 0.01f + 0.1f)) * 0.5f; + } + actor->_5AC.y = 0.0f; + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.02f); + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + if (actor->_59C == 0x27) { + if (actor->_600 > 35.0f) { + if (actor->_632 > DEG2SHORT_ANGLE(10)) { + add_calc0(&actor->_5F0, 1.0f - actor->init_data._18, 0.005f); + } else { + add_calc2(&actor->_5F0, -0.25f, CALC_EASE(0.05f), 0.005f); + } + } else if (actor->_600 < 5.0f) { + add_calc2(&actor->_5F0, 0.025f, CALC_EASE(0.05f), 0.005f); + } else if (actor->_644 > DEG2SHORT_ANGLE(10)) { + add_calc2(&actor->_5F0, (SHORT2DEG_ANGLE2(actor->_644) * 0.1f) / 180.f, CALC_EASE(0.05f), 0.005f); + } + } else if (actor->_5FC > 35.0f) { + if (actor->_632 > DEG2SHORT_ANGLE(10)) { + add_calc0(&actor->_5F0, 1.0f - actor->init_data._18, 0.005f); + } else { + add_calc2(&actor->_5F0, -0.025f, CALC_EASE(0.05f), 0.005f); + } + } else if (actor->_5FC < 5.0f) { + add_calc2(&actor->_5F0, 0.04f, CALC_EASE(0.05f), 0.005f); + } else if (actor->_644 > DEG2SHORT_ANGLE(10)) { + add_calc2(&actor->_5F0, (SHORT2DEG_ANGLE2(actor->_644) * 0.1f) / 180.f, CALC_EASE(0.05f), 0.005f); + } - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + mfish_get_flow_vec(&p, actor, gamex); + actor->_5A0.x += actor->_5D0.x + p.x * 0.1f; + actor->_5A0.z += actor->_5D0.z + p.z * 0.1f; + + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + actor->_632 * sin_s(actor->_636), + CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.875f), DEG2SHORT_ANGLE(0.05f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.025f)); + add_calc_short_angle2(&actor->_632, DEG2SHORT_ANGLE(0), CALC_EASE(0.05f), DEG2SHORT_ANGLE(0.5f), + DEG2SHORT_ANGLE(0.05f)); + actor->_636 += DEG2SHORT_ANGLE(GETREG(TAKREG, 0x47) * 0.1f + 3.0f); + add_calc(&actor->_5A0.y, actor->init_data._0C + actor->_5F4, CALC_EASE(0.05f), 0.15f, 0.05f); + if (actor->_630 == 2) { + actor->_636 += DEG2SHORT_ANGLE(10); + } else { + actor->_646 += actor->_642; + } + add_calc_short_angle2(&actor->_634, actor->_640, CALC_EASE2(0.1f), + (s16)(DEG2SHORT_ANGLE(GETREG(TAKREG, 0x3d) * 0.1f + 0.8f) >> 1) >> 1, + DEG2SHORT_ANGLE(0.025f)); + if (actor->_5E8 > 0.0f) { + add_calc_short_angle2(&actor->_644, actor->_634, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(0.625f), + DEG2SHORT_ANGLE(0.025f)); + } else { + add_calc_short_angle2(&actor->_644, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), DEG2SHORT_ANGLE(0.625f), + DEG2SHORT_ANGLE(0.025f)); + } + add_calc2(&actor->_5AC.x, actor->_5AC.z, 0.25f, 0.02f); + if (actor->_626-- < 0) { + if ((actor->_59C == 0x27 && actor->_600 < 10.0f) || (actor->_59C == 10 && actor->_5FC < 10.0f)) { + if (actor->_60C.y > 0) { + actor->_612.y = DEG2SHORT_ANGLE(90); + } else { + actor->_612.y = DEG2SHORT_ANGLE(-90); + } + + actor->_5F0 = actor->init_data._10 + MAX(-actor->init_data._10, RANDOM_F(actor->init_data._14)); + + if (RANDOM_F(1.0f) < GETREG(TAKREG, 0x46) * 0.01f + 0.5f) { + actor->_642 = DEG2SHORT_ANGLE(RANDOM_F(2.0f) + 3.0f); + if (actor->_59C == 0x27 || GETREG(TAKREG, 0x39) == 1) { + actor->_634 = DEG2SHORT_ANGLE(RANDOM_F(10.f) + 20.f); + actor->_640 = DEG2SHORT_ANGLE(RANDOM_F(10.f)); + actor->_5AC.z = Rnd_EX_f(1.0f); + } else { + actor->_634 = DEG2SHORT_ANGLE(RANDOM_F(2.0f) + 3.0f); + actor->_640 = DEG2SHORT_ANGLE(RANDOM_F(10.f)); + actor->_5AC.z = Rnd_EX_f(0.5f); + } + } else { + actor->_642 = DEG2SHORT_ANGLE(RANDOM2_F(2.0f) + 3.0f); + actor->_634 = 0; + actor->_640 = 0; + actor->_5AC.z = 0.0f; + actor->_632 = DEG2SHORT_ANGLE(GETREG(TAKREG, 0x48) + 45.0f); + actor->_636 = 0; + } + + } else { + actor->_5F0 = -0.01f; + actor->_5F4 = RANDOM_F(5.0f); + actor->_642 = 0; + actor->_634 = 0; + actor->_640 = 0; + actor->_5AC.z = 0.0f; + } + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + } + Museum_Fish_BGCheck(actor, gamex); } -void mfish_bfish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_bfish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, void* arg, s_xyz* joint1, xyz_t* trans) { - return; + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + + if (joint_num == 1) { + f32 v; + int i; + if (actor->_59C == 0x27) { + v = 0.015f; + } else { + v = 0.02f; + } + i = joint1->x + (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + i = joint1->y + (int)(actor->_644 * (GETREG(TAKREG, 0x14) * 0.01f + 0.5f) * sin_s(actor->_646)); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + trans->z += actor->_5AC.x * 0.06f * actor->_644 * sin_s(actor->_646 - DEG2SHORT_ANGLE(90)); + Matrix_scale(1.0f, 1.0f + v * sin_s(actor->_63A + actor->_63C), 1.0f + v * sin_s(actor->_63A), 1); + } else if (joint_num == 2) { + f32 v; + int i; + if (actor->_59C == 0x27) { + v = 0.025f; + } else { + v = 0.035f; + } + i = joint1->y - (actor->_618.z * 2) + + (int)(actor->_644 * (GETREG(TAKREG, 0x15) * 0.1f + 0.75f) * + sin_s(actor->_646 + DEG2SHORT_ANGLE(-90.f + GETREG(TAKREG, 0x17)))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-40), DEG2SHORT_ANGLE(40)); + i = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + Matrix_scale(1.0f, 1.0f + v * sin_s(actor->_63A + DEG2SHORT_ANGLE(270)), + 1.0f + v * sin_s(actor->_63A + DEG2SHORT_ANGLE(90)), 1); + } else if (joint_num == 3 && actor->_59C == 0x27) { + int i = joint1->y - actor->_618.z + + (int)(actor->_644 * (1.0f + 0.01f * GETREG(TAKREG, 0x16)) * + sin_s(actor->_646 + DEG2SHORT_ANGLE(-180.f + GETREG(TAKREG, 0x18)))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + } + + return TRUE; } void mfish_big_fish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - // NOT BAD - - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + YET_SKELETON* skele = &actor->_38; + Mtx* mtxp; + if (gamex->frame_counter & 1) { + mtxp = &skele->_70; + } else { + mtxp = &skele->_2b0; + } + OPEN_DISP(gamex->graph); + Matrix_translate(actor->_5A0.x, actor->_5A0.y, actor->_5A0.z, 0); + Matrix_rotateXYZ(actor->_60C.x, actor->_60C.y, actor->_60C.z, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24, 1); + Matrix_scale(actor->init_data._00, actor->init_data._00, actor->init_data._00, 1); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(gamex->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + cKF_Si3_draw_R_SV(gamex, &skele->_00, mtxp, mfish_sfish_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); }