diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index 01332a70..076d3847 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -96,7 +96,7 @@ typedef struct _FISH_PRIVATE_DATA { f32 _608; s_xyz _60C; s_xyz _612; - artificial_padding(0x612, 0x61A, s_xyz); + s16 _618; s16 _61A; s16 _61C; s16 _61E; @@ -292,13 +292,14 @@ void mfish_bass_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_seafish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_seafish_normal_init(); -void mfish_seafish_normal(); -void mfish_seafish_turn_init(); -void mfish_seafish_turn(); +void mfish_seafish_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_seafish_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_seafish_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_seafish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_seafish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_seafish_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_seafish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_tai_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_tai_normal_init(); void mfish_tai_normal(); diff --git a/src/actor/ac_museum_fish_koi.c_inc b/src/actor/ac_museum_fish_koi.c_inc index 2dff7fe7..bd99a55a 100644 --- a/src/actor/ac_museum_fish_koi.c_inc +++ b/src/actor/ac_museum_fish_koi.c_inc @@ -467,7 +467,7 @@ void mfish_koi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { BOOL mfish_koi_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) { - MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)actor; + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; if (joint_num == 0) { trans->x *= actor->_5AC.z; trans->y *= actor->_5AC.z; diff --git a/src/actor/ac_museum_fish_seafish.c_inc b/src/actor/ac_museum_fish_seafish.c_inc index 458e7fa4..8dd55eae 100644 --- a/src/actor/ac_museum_fish_seafish.c_inc +++ b/src/actor/ac_museum_fish_seafish.c_inc @@ -1,7 +1,25 @@ -void mfish_seafish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; +void mfish_seafish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 s = qrand(); + mfish_onefish_ct(actor, game); + actor->_5E8 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->_5F0 = actor->_5E8; + actor->_60C.y = s; + actor->_612.y = actor->_60C.y; + actor->_5F4 = 0.0f; + actor->_5D4 = 0.0f; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = 0; + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_628 = actor->_626; + actor->_624 = 2; + actor->_594 = NULL; + actor->_598 = NULL; + actor->_5EC = 0.08f; + actor->_5AC.x = 15.0f; + actor->_5AC.z = 15.0f; + mfish_seafish_normal_init(actor, game); } void mfish_seafish_normal_init() { @@ -9,31 +27,220 @@ void mfish_seafish_normal_init() { return; } -void mfish_seafish_normal() { - return; +void mfish_seafish_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 a = MAX(actor->_5E8 / (actor->init_data._14 + actor->init_data._10), 0.4f) * 5461.0f; + s16 s = (s16)MY_MAX((s16)(int)a, DEG2SHORT_ANGLE(20)); + f32 o_5a0_z; + f32 o_5a0_y; + f32 sum_i_8; + f32 abs_diff_sum; + f32 t; + f32 r; + + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.5f), (s16)(s >> 1) >> 1, + (s16)DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + if (actor->_598 != NULL) { + o_5a0_z = actor->_598->_5A0.z; + o_5a0_y = actor->_598->_5A0.y; + sum_i_8 = (actor->_598->init_data._08 + actor->init_data._08); + abs_diff_sum = MAX(sum_i_8 - ABS(actor->_598->_5A0.z - actor->_5A0.z), 0.f); + + abs_diff_sum /= sum_i_8; + + if (actor->_598->_59C != 0x23) { + f32 this_5a0_y = actor->_5A0.y; + if (o_5a0_y < actor->_5A0.y) { + t = o_5a0_y + (actor->_598->init_data._04 + actor->init_data._04); + if (this_5a0_y < t) { + add_calc2(&actor->_5A0.y, t + 2.0f, 0.2f, abs_diff_sum * 0.1f); + } + } else { + t = o_5a0_y - (actor->_598->init_data._04 + actor->init_data._04); + if (this_5a0_y > t) { + add_calc2(&actor->_5A0.y, t - 2.0f, 0.2f, abs_diff_sum * 0.1f); + } + } + } + + if (actor->_598->_5A0.z < actor->_5A0.z) { + // swap here + o_5a0_z += sum_i_8; + add_calc2(&actor->_5A0.z, o_5a0_z, 0.1f, abs_diff_sum * 0.1f); + } else { + // swap here + o_5a0_z -= sum_i_8; + add_calc2(&actor->_5A0.z, o_5a0_z, 0.1f, abs_diff_sum * 0.1f); + } + } + + if (actor->_5FC < actor->_5AC.x - 0.5f * actor->init_data._28) { + if (actor->_612.y < 0) { + s16 ss; + if (actor->_604 > actor->_608) { + ss = actor->_60C.y - DEG2SHORT_ANGLE(90); + } else { + ss = actor->_60C.y + DEG2SHORT_ANGLE(90); + } + actor->_612.y = ss; + actor->_5AC.z = RANDOM_F(60.0f) + 15.0f; + } else { + add_calc_short_angle2(&actor->_612.y, DEG2SHORT_ANGLE(90), CALC_EASE(0.5f), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.5f)); + } + } else if (actor->_600 < actor->_5AC.z - 0.5f * actor->init_data._28) { + if (actor->_612.y > 0) { + s16 ss; + if (actor->_604 > actor->_608) { + ss = (s16)actor->_60C.y + DEG2SHORT_ANGLE(90); + } else { + ss = (s16)actor->_60C.y - DEG2SHORT_ANGLE(90); + } + actor->_612.y = ss; + actor->_5AC.x = RANDOM_F(60.0f) + 15.0f; + } else { + add_calc_short_angle2(&actor->_612.y, DEG2SHORT_ANGLE(-90), CALC_EASE(0.5f), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.5f)); + } + } else if (actor->_62E & 0x100) { + actor->_5A0.z += 0.05f; + if (ABS((s16)(actor->_612.y - DEG2SHORT_ANGLE(180))) < DEG2SHORT_ANGLE(110)) { + if (actor->_612.y > 0) { + actor->_612.y -= DEG2SHORT_ANGLE(1.5f); + } else { + actor->_612.y += DEG2SHORT_ANGLE(1.5f); + } + } + } else if (actor->_62E & 0x1e) { + mfish_seafish_turn_init(actor, gamex); + } else if (actor->_62E & 0x20 && actor->_5F8 > actor->init_data._08 * 0.5f) { + if (actor->init_data._20 > actor->_594->init_data._20) { + s16 escAngle = mfish_get_escape_angle(actor, gamex); + add_calc_short_angle2(&actor->_612.y, escAngle, CALC_EASE(0.25f), DEG2SHORT_ANGLE(2.5f), + DEG2SHORT_ANGLE(0)); + } + } else if (actor->_626 < 0) { + // r in wrong register here + r = fqrand(); + actor->_612.y = actor->_60C.y; + if ((actor->_608 - actor->_604) * cos_s(actor->_60C.y) < 0.0f) { + actor->_612.y += (s16)(r * actor->init_data._30); + } else { + actor->_612.y -= (s16)(r * actor->init_data._30); + } + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_628 = actor->_626; + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + } } -void mfish_seafish_turn_init() { - return; +void mfish_seafish_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 s = (s16)actor->_62C; + + if (ABS(actor->_622) > DEG2SHORT_ANGLE(45)) { + return; + } + if (ABS(actor->_612.y - actor->_62C) > DEG2SHORT_ANGLE(90)) { + return; + } + + if ((s16)(actor->_60C.y - s) > 0) { + if (actor->_62E & 6) { + s = s + DEG2SHORT_ANGLE(170); + } else { + s = s + DEG2SHORT_ANGLE(95); + } + } else { + if (actor->_62E & 6) { + s = s - DEG2SHORT_ANGLE(170); + } else { + s = s - DEG2SHORT_ANGLE(95); + } + } + + if (ABS((s16)(s - actor->_612.y)) > DEG2SHORT_ANGLE(45)) { + actor->_34 = mfish_seafish_turn; + } + actor->_612.y = s; } -void mfish_seafish_turn() { - return; +void mfish_seafish_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(GETREG(TAKREG, 0x17) * 0.01f + 0.25f), + DEG2SHORT_ANGLE(3.75f), DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.25f), DEG2SHORT_ANGLE(0.25f)); + if (ABS(actor->_622) < DEG2SHORT_ANGLE(3)) { + mfish_seafish_normal_init(actor, game); + } } void mfish_seafish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + xyz_t p; + actor->_34(actor, gamex); + actor->_618 += DEG2SHORT_ANGLE(actor->_5E8 * RANDOM_F(3.0f)); + actor->_5F4 = sin_s(actor->_618) * 5.0f; + if (actor->_62E & 0x20) { + add_calc2(&actor->_5A0.y, actor->_5F4 + actor->init_data._0C, 0.02f, 0.05f); + } else { + add_calc2(&actor->_5A0.y, actor->_5F4 + actor->init_data._0C, 0.1f, 0.1f); + } + add_calc0(&actor->_5F8, 0.2f, 0.05f); + actor->_5F8 = MIN(1.0f, actor->_5F8); + if (ABS(actor->_61C) > DEG2SHORT_ANGLE(15) && ABS(actor->_622) - ABS(actor->_61C) < 0) { + add_calc2(&actor->_5E8, MAX(actor->_5F0, 0.8f), 0.5f, 0.25f); + } else if (actor->_626 < actor->_628 - 80) { + add_calc2(&actor->_5E8, actor->_5EC, 1.0f - actor->init_data._18, 0.0025f); + } else if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.02f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.01f); + } + actor->_38._00.frame_control.speed = + (GETREG(TAKREG, 0x14) * 0.01f + 0.5f) * 0.5f + (GETREG(TAKREG, 0x15) * 0.01f + 1.2f) * actor->_5E8; + actor->_5D0 = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D8 = actor->_5E8 * cos_s(actor->_60C.y); + mfish_get_flow_vec(&p, actor, gamex); + actor->_5A0.x += actor->_5D0 + p.x; + actor->_5A0.z += actor->_5D8 + p.z; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + if (actor->_5A0.y < GETREG(TAKREG, 0x47) + 55.0f - actor->init_data._04) { + actor->_5A0.y = GETREG(TAKREG, 0x47) + 55.0f - actor->init_data._04; + } + actor->_626--; } -void mfish_seafish_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_seafish_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) { + int s = joint1->x + (int)(actor->_61C * (GETREG(TAKREG, 0x37) * 0.01f + 0.5f)); + joint1->x = MIN(MAX(s, DEG2SHORT_ANGLE(-15)), DEG2SHORT_ANGLE(15)); + Matrix_scale(1.0f, (GETREG(TAKREG, 0x36) * 0.001f + 0.035f) * sin_s(actor->_63A + actor->_63C) + 1.0f, + (GETREG(TAKREG, 0x36) * 0.001f + 0.035f) * sin_s(actor->_63A) + 1.0f, 1); + } else if (joint_num == 2) { + int v = joint1->y - (actor->_61C << 1); + joint1->y = MIN(MAX(v, DEG2SHORT_ANGLE(-80)), DEG2SHORT_ANGLE(80)); + Matrix_scale(1.0f, sin_s(actor->_63A + DEG2SHORT_ANGLE(270)) * 0.07f + 1.0f, + sin_s(actor->_63A + DEG2SHORT_ANGLE(90)) * 0.07f + 1.0f, 1); + } + return TRUE; } void mfish_seafish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - - 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_seafish_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); }