diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index 199d2d84..674b2821 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -360,7 +360,7 @@ void mfish_kingyo_turn(); void mfish_kingyo_peck_init(); void mfish_kingyo_peck(); void mfish_kingyo_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_kingyo_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_kingyo_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_kingyo_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); diff --git a/src/actor/ac_museum_fish_kingyo.c_inc b/src/actor/ac_museum_fish_kingyo.c_inc index 030a4981..03355c1c 100644 --- a/src/actor/ac_museum_fish_kingyo.c_inc +++ b/src/actor/ac_museum_fish_kingyo.c_inc @@ -1,49 +1,259 @@ void mfish_kingyo_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + s16 s = qrand(); + mfish_onefish_ct(actor, gamex); + actor->_5E8 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->_5F0 = actor->_5E8; + actor->_60C.y = s; + actor->_612.y = actor->_60C.y; + actor->_60C.x = DEG2SHORT_ANGLE2(RANDOM2_F(actor->init_data._30 * 2.0f)); + actor->_612.x = actor->_60C.x; + actor->_5F4 = 110.0f; + actor->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_622 = 0; + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + actor->_624 = 6; + mfish_kingyo_normal_init(actor, gamex); } -void mfish_kingyo_normal_init() { - // NOT BAD - return; +void mfish_kingyo_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->_34 = mfish_kingyo_normal; } -void mfish_kingyo_normal() { - return; +void mfish_kingyo_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = 0; + actor->_636 = 0; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(GETREG(TAKREG, 0x17) * 0.01f + 0.5f), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.25f)); + + if (mfish_peck_check(actor, gamex)) { + mfish_kingyo_peck_init(actor, gamex); + } else if (actor->_62E & 0x1e) { + mfish_kingyo_turn_init(actor, gamex); + } else if (actor->_62E & 0x20) { + add_calc_short_angle2(&actor->_612.y, mfish_get_escape_angle(actor, gamex), CALC_EASE(0.5f), + DEG2SHORT_ANGLE(15), DEG2SHORT_ANGLE(0.5f)); + } else if (actor->_626 < 0) { + f32 v = RANDOM_F(1.0f); + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + if (RANDOM_F(1.0f) < 0.5f) { + actor->_612.y += DEG2SHORT_ANGLE((v - 0.3f) * 90.f); + } else { + actor->_612.y -= DEG2SHORT_ANGLE((v - 0.3f) * 90.f); + } + if (ABS(actor->_612.x) > DEG2SHORT_ANGLE(50)) { + actor->_612.x = RANDOM2_F(actor->init_data._30 * 2.0f * (v - 0.3f)); + } + } else if (actor->_5F8 > actor->init_data._08 * 30.f) { + f32 v = RANDOM_F(1.0f); + s16 s = search_position_angleY(&suisou_pos[actor->_630], &actor->_5A0); + actor->_5F8 = 0.0f; + actor->_612.y = s + DEG2SHORT_ANGLE(RANDOM2_F(90)); + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_626 >>= 1; + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } } -void mfish_kingyo_turn_init() { - // NOT BAD - return; +void mfish_kingyo_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(115); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(115); + } + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + actor->_34 = mfish_kingyo_turn; } -void mfish_kingyo_turn() { - return; +void mfish_kingyo_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = 0; + actor->_636 = 0; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(GETREG(TAKREG, 0x17) * 0.01f + 0.5f), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.25f)); + if (ABS(actor->_622) < DEG2SHORT_ANGLE(1)) { + mfish_kingyo_normal_init(actor, gamex); + } } -void mfish_kingyo_peck_init() { - // NOT BAD - return; +void mfish_kingyo_peck_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 dist; + mfish_get_player_angle(actor, gamex, &actor->_612.y, &actor->_612.x, &dist); + actor->_626 = 120; + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->_34 = mfish_kingyo_peck; } -void mfish_kingyo_peck() { - return; +void mfish_kingyo_peck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 30.f); + actor->_636 += DEG2SHORT_ANGLE(7.5f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(GETREG(TAKREG, 0x17) * 0.01f + 0.5f), DEG2SHORT_ANGLE(10), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.25f)); + if (actor->_626 < 0) { + f32 dist; + mfish_get_player_angle(actor, gamex, &actor->_612.y, &actor->_612.x, &dist); + if (ABS(actor->_612.y) < DEG2SHORT_ANGLE(15)) { + if (actor->_612.y > 0) { + actor->_612.y = DEG2SHORT_ANGLE(15); + } else { + actor->_612.y = DEG2SHORT_ANGLE(-15); + } + } else if (ABS(actor->_612.y) > DEG2SHORT_ANGLE(165)) { + if (actor->_612.y > 0) { + actor->_612.y = DEG2SHORT_ANGLE(165); + } else { + actor->_612.y = DEG2SHORT_ANGLE(-165); + } + } + + if (actor->_62E & 0x20 && dist > 40.f) { + if ((s16)(actor->_612.y - actor->_62A) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(90); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(90); + } + } + actor->_612.x += (s16)DEG2SHORT_ANGLE2(RANDOM_F(20.0f)); + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + if (actor->_5F0 < 0.1f) { + actor->_5F0 = 0.1f; + } + if (dist > 40.0f) { + actor->_626 = actor->init_data._2C + (s16)RANDOM_F(actor->init_data._2E); + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + } else { + actor->_626 = 60; + actor->_628 = actor->_626; + actor->_640 = RANDOM_F(130.f); + } + } else if (MF_Control_Actor->_14db4 != actor->_630) { + mfish_kingyo_turn_init(actor, gamex); + } else if (mfish_peck_wall_check(actor, gamex)) { + actor->_5F0 = 0.0f; + actor->_5E8 = -0.2f; + } else if (fabsf(actor->_5E8) < 0.008f) { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + } } void mfish_kingyo_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p; + actor->_34(actor, gamex); + actor->_61E = add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.75f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.x, actor->_61E, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.05f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, GETREG(TAKREG, 0x35) * 0.01f + 0.25f, + GETREG(TAKREG, 0x36) * 0.01f + 0.05f); + } + if (actor->_5F0 < 0.0f) { + add_calc0(&actor->_5F0, 0.1f, 0.05f); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.2f), DEG2SHORT_ANGLE(1.5f), DEG2SHORT_ANGLE(0.5f)); + } else if (ABS(actor->_60C.x) > DEG2SHORT_ANGLE(50)) { + add_calc2(&actor->_5F0, actor->init_data._14 + actor->init_data._10, 0.2f, 0.1f); + } + v = actor->_5E8 * cos_s(actor->_60C.x); + actor->_5D0.x = v * sin_s(actor->_60C.y); + actor->_5D0.z = v * cos_s(actor->_60C.y); + actor->_5D0.y = -actor->_5E8 * sin_s(actor->_60C.x); + mfish_get_flow_vec(&p, actor, gamex); + actor->_5A0.x += actor->_5D0.x + p.x; + actor->_5A0.y += actor->_5D0.y + p.y; + actor->_5A0.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + if ((((actor->_5F0 - 0.01f) > actor->_5E8) || (actor->_626 > (s16)(actor->_628 - actor->_640))) && + actor->_5F0 > 0.1f) { + actor->_38._00.frame_control.speed = + (5.0f + GETREG(TAKREG, 0x28) * 0.1f) * 0.5f + (4.0f + GETREG(TAKREG, 0x29) * 0.1f) * actor->_5E8; + } else { + add_calc2(&actor->_5F0, GETREG(TAKREG, 0x31) * 0.001f + 0.05f, GETREG(TAKREG, 0x32) * 0.001f + 0.01f, + GETREG(TAKREG, 0x33) * 0.001f + 0.002f); + add_calc2(&actor->_38._00.frame_control.speed, actor->_5E8 * 2.0f + 0.5f, 0.2f, 0.1f); + } + actor->_63A += (s16)DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x47) + 3.0f); + actor->_5B8 = actor->_5A0; + Museum_Fish_BGCheck(actor, gamex); + if (actor->_5A0.y < 60.f + actor->init_data._08) { + actor->_5A0.y = 60.f + actor->init_data._08; + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(-30); + } + } else if (actor->_5A0.y > 115.f - actor->init_data._08) { + actor->_5A0.y = 115.f - actor->init_data._08; + actor->_612.x = DEG2SHORT_ANGLE(30); + mfish_hamon_make(actor, gamex); + } else { + actor->_626--; + } + + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); } -void mfish_kingyo_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, +BOOL mfish_kingyo_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 i = joint1->x + actor->_618.z; + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + i = joint1->y + actor->_618.z; + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + } else if (joint_num == 2) { + int i; + if (actor->_5F0 - 0.001f > actor->_5E8) { + joint1->y += (int)((actor->_5F0 - actor->_5E8) * 2.0f * joint1->y); + } + i = joint1->y - actor->_618.z * 3; + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-80), DEG2SHORT_ANGLE(80)); + i = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + joint1->z += (int)(actor->_618.x * (-1.3f + 0.1f * GETREG(TAKREG, 0x4e))); + Matrix_scale(GETREG(TAKREG, 0x4b) * 0.01f * cos_s(actor->_63A) + 0.05f + 1.0f, + GETREG(TAKREG, 0x4c) * 0.01f * sin_s(actor->_63A) + 0.1f + 1.0f, + GETREG(TAKREG, 0x4d) * 0.01f * cos_s(actor->_63A) + 0.1f + 1.0f, 1); + } + return TRUE; } void mfish_kingyo_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + YET_SKELETON* skele = &actor->_38; + Mtx* mtxp; + s16 s; + if (gamex->frame_counter & 1) { + mtxp = &skele->_70; + } else { + mtxp = &skele->_2b0; + } + s = actor->_60C.x * (GETREG(TAKREG, 0x41) * 0.01f + 0.75f); + OPEN_DISP(gamex->graph); + Matrix_translate(actor->_5A0.x, actor->_5A0.y, actor->_5A0.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24 * 1.5f, 1); + Matrix_RotateX(s, 1); + Matrix_translate(0.0f, 0.0f, -actor->init_data._24 * 0.5f, 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_gupi_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); }