From a7326c31f496e51ae081049826d574478ac723d5 Mon Sep 17 00:00:00 2001 From: roeming Date: Thu, 19 Dec 2024 21:38:30 -0500 Subject: [PATCH] match hasu --- include/ac_museum_fish.h | 57 ++++++-- src/actor/ac_museum_fish.c | 4 +- src/actor/ac_museum_fish_base.c_inc | 4 +- src/actor/ac_museum_fish_hasu.c_inc | 213 +++++++++++++++++++++++++--- 4 files changed, 238 insertions(+), 40 deletions(-) diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index 076d3847..fe1a255e 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -59,23 +59,36 @@ typedef struct _YET_SKELETON { artificial_padding(0x4F0, 0x514, s_xyz); s_xyz _514; - - artificial_padding(0x514, 0x538, s_xyz); + artificial_padding(0x514, 0x526, s_xyz); + s_xyz _526; + artificial_padding(0x526, 0x538, s_xyz); s_xyz _538; + // unused 2 byte padding here xyz_t _540; cKF_Skeleton_R_c* _54C; - cKF_Animation_R_c* _550; - void* _554; + cKF_Animation_R_c* _550[2]; } YET_SKELETON; // size 558 +typedef struct _YET_SKELETON_2 { + YET_SKELETON _00; + f32 _558; + f32 _55C; + f32 _560; + f32 _564; + s16 _568; + s16 _56A; + s16 _56C; +} YET_SKELETON_2; + typedef struct _FISH_PRIVATE_DATA { MUSEUM_FISH_INIT_DATA init_data; PRIV_FISH_PROCESS _34; // size:4 YET_SKELETON _38; - void* _590; + YET_SKELETON_2* _590; struct _FISH_PRIVATE_DATA* _594; struct _FISH_PRIVATE_DATA* _598; + s32 _59C; // fish num xyz_t _5A0; xyz_t _5AC; @@ -133,9 +146,9 @@ typedef struct _MUSEUM_FISH_ACTOR { int _174; MUSEUM_FISH_PRIVATE_DATA prvFish[40]; // offset: 0x178 size: 0xFB48 MUSEUM_FISH_KUSA_DATA prvKusa[14]; // offset: 0xFCB8 size: 0x4AD0 - void* _14788; // offset: 0x14788 size: 4 + YET_SKELETON_2 _14788; // offset: 0x14788 size: 0x570 - artificial_padding(0x14788, 0x14d08, void*); + u8 _14cf8[16]; // temp xyz_t _14d08[2]; int numFishDisplayed; // offset: 0x14d20, size: 4 @@ -309,6 +322,7 @@ void mfish_tai_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_tai_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_tai_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_small_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_sfish_normal_init(); void mfish_sfish_normal(); @@ -318,6 +332,7 @@ void mfish_small_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_sfish_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_small_fish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_gupi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_gupi_normal_init(); void mfish_gupi_normal(); @@ -327,6 +342,7 @@ void mfish_gupi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_gupi_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_gupi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_medaka_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_medaka_normal_init(); void mfish_medaka_normal(); @@ -336,6 +352,7 @@ void mfish_medaka_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_medaka_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_medaka_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_kingyo_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_kingyo_normal_init(); void mfish_kingyo_normal(); @@ -347,6 +364,7 @@ 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, void* arg, s_xyz* joint1, xyz_t* trans); void mfish_kingyo_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_dojou_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_dojou_normal_init(); void mfish_dojou_normal(); @@ -356,21 +374,25 @@ void mfish_dojou_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_dojou_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_dojou_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_donko_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_donko_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_donko_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_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, void* arg, s_xyz* joint1, xyz_t* trans); void mfish_big_fish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_ito_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_ito_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_ito_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_ito_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_unagi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_unagi_get_next_rail_type(); void mfish_unagi_aim_wind_angle_calc(); @@ -386,6 +408,7 @@ void mfish_unagi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_unagi_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_unagi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_namazu_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_namazu_body_wind_anime_play(); void mfish_namazu_normal_process_init(); @@ -401,6 +424,7 @@ void mfish_namazu_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_namazu_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_namazu_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_zarigani_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_zarigani_normal_process_init(); void mfish_zarigani_normal_process(); @@ -414,6 +438,7 @@ void mfish_zarigani_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_zarigani_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_zarigani_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + void mfish_kurage_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_kurage_normal_init(); void mfish_kurage_normal(); @@ -421,15 +446,17 @@ void mfish_kurage_turn_init(); void mfish_kurage_turn(); void mfish_kurage_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_kurage_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_hasu_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_hasu_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_hasu_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_kaeru_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_kaeru_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void hasu_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, void* arg, + +void mfish_hasu_ct(YET_SKELETON_2* actor, GAME* game); +void mfish_hasu_mv(); +void mfish_hasu_dw(); +void mfish_kaeru_ct(); +void mfish_kaeru_mv(); +BOOL hasu_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 hasu_after_disp(); -void mfish_kaeru_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL hasu_after_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_kaeru_dw(); #ifdef __cplusplus } diff --git a/src/actor/ac_museum_fish.c b/src/actor/ac_museum_fish.c index b669eb4b..10489677 100644 --- a/src/actor/ac_museum_fish.c +++ b/src/actor/ac_museum_fish.c @@ -717,7 +717,7 @@ void Museum_Fish_Actor_ct(ACTOR* actorx, GAME* gamex) { if (mMmd_FishInfo(0x21)) { actor->prvFish[0x21]._590 = &actor->_14788; } else { - mfish_hasu_ct((MUSEUM_FISH_PRIVATE_DATA*)&actor->_14788, gamex); + mfish_hasu_ct(&actor->_14788, gamex); } prv = actor->prvFish; @@ -725,7 +725,7 @@ void Museum_Fish_Actor_ct(ACTOR* actorx, GAME* gamex) { prv->_62E &= ~1; if (mMmd_FishInfo(i)) { prv->_38._54C = mfish_model_tbl[i]; - prv->_38._550 = mfish_anime_init_tbl[i]; + prv->_38._550[0] = mfish_anime_init_tbl[i]; prv->_62E |= 1; Museum_Fish_Prv_data_init(prv, gamex, i, 1); } diff --git a/src/actor/ac_museum_fish_base.c_inc b/src/actor/ac_museum_fish_base.c_inc index 05c642c7..058a786c 100644 --- a/src/actor/ac_museum_fish_base.c_inc +++ b/src/actor/ac_museum_fish_base.c_inc @@ -504,8 +504,8 @@ void mfish_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { void mfish_onefish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { GAME_PLAY* game = (GAME_PLAY*)gamex; YET_SKELETON* s = &actor->_38; - cKF_SkeletonInfo_R_ct(&s->_00, s->_54C, s->_550, &s->_4F0, &s->_514); - cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&s->_00, s->_550, NULL, 1.875f, 0.0f); + cKF_SkeletonInfo_R_ct(&s->_00, s->_54C, s->_550[0], &s->_4F0, &s->_514); + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&s->_00, s->_550[0], NULL, 1.875f, 0.0f); actor->_626 = actor->init_data._2C + (s16)(actor->init_data._2E * fqrand()); actor->_628 = actor->_626; actor->_60C.x = DEG2SHORT_ANGLE(0); diff --git a/src/actor/ac_museum_fish_hasu.c_inc b/src/actor/ac_museum_fish_hasu.c_inc index fb6f7350..27e19f02 100644 --- a/src/actor/ac_museum_fish_hasu.c_inc +++ b/src/actor/ac_museum_fish_hasu.c_inc @@ -1,44 +1,215 @@ +// Pretty sure all the floats in this file are correct -void mfish_hasu_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { +extern cKF_Skeleton_R_c cKF_bs_r_obj_museum5_hasu; +extern cKF_Animation_R_c cKF_ba_r_obj_museum5_hasu; - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; +void mfish_hasu_ct(YET_SKELETON_2* actor, GAME* gamex) { + cKF_SkeletonInfo_R_ct(&actor->_00._00, &cKF_bs_r_obj_museum5_hasu, &cKF_ba_r_obj_museum5_hasu, &actor->_00._4F0, + &actor->_00._526); + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&actor->_00._00, &cKF_ba_r_obj_museum5_hasu, NULL, 1.75, + 0.0); } -void mfish_hasu_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; +void mfish_hasu_mv(YET_SKELETON* actor, GAME* gamex) { + cKF_SkeletonInfo_R_play(&actor->_00); } -void mfish_hasu_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; +void mfish_hasu_dw(YET_SKELETON* actor, GAME* gamex) { + Mtx* mtxp; + if (gamex->frame_counter & 1) { + mtxp = &actor->_70; + } else { + mtxp = &actor->_2b0; + } + OPEN_DISP(gamex->graph); + Matrix_translate(hasu_pos.x + GETREG(TAKREG, 0x42) * 0.1f, hasu_pos.y, hasu_pos.z + GETREG(TAKREG, 0x43) * 0.1f, 0); + Matrix_RotateY(DEG2SHORT_ANGLE(-180), 1); + Matrix_scale(0.01f, 0.01f, 0.01f, 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, &actor->_00, mtxp, NULL, NULL, NULL); + CLOSE_DISP(gamex->graph); } +extern cKF_Animation_R_c cKF_ba_r_act_mus_kaeru_a1_big; void mfish_kaeru_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + //! TODO: grabbed keyframe from ghidra, probably a cast to a larger struct + + YET_SKELETON* skele = &actor->_38; + YET_SKELETON_2* keyframe = actor->_590; + skele->_550[1] = &cKF_ba_r_act_mus_kaeru_a1_big; + cKF_SkeletonInfo_R_ct(&skele->_00, skele->_54C, skele->_550[0], &skele->_4F0, &skele->_514); + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&skele->_00, skele->_550[0], NULL, 1.75f, 0.0f); + cKF_SkeletonInfo_R_ct(&keyframe->_00._00, &cKF_bs_r_obj_museum5_hasu, &cKF_ba_r_obj_museum5_hasu, + &keyframe->_00._4F0, &keyframe->_00._526); + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&keyframe->_00._00, &cKF_ba_r_obj_museum5_hasu, NULL, + 1.75f, 0.0f); + actor->_5A0.x = 453.9f; + actor->_5A0.y = 116.0f; + actor->_5A0.z = 250.4f; + actor->_5AC = ZeroVec; + actor->_626 = 0; + actor->_612.x = 0; + actor->_612.y = 0; + actor->_612.z = 0; + actor->_60C = ZeroSVec; + actor->_5AC.x = -1.5f; + actor->_5AC.z = -2.0f; + actor->_60C.y = DEG2SHORT_ANGLE(135); + actor->_60C.y = DEG2SHORT_ANGLE(135); + actor->_640 = 0; + actor->_63E = RANDOM_F(8.0f) + 1.0f; + actor->_624 = 4; } void mfish_kaeru_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + YET_SKELETON* skele1 = &actor->_38; + YET_SKELETON_2* skele2 = actor->_590; + cKF_SkeletonInfo_R_play(&skele1->_00); + cKF_SkeletonInfo_R_play(&skele2->_00._00); + skele2->_568 += DEG2SHORT_ANGLE(GETREG(TAKREG, 0xb) + 5.0f); + skele2->_56A += DEG2SHORT_ANGLE(GETREG(TAKREG, 0xb) + 5.0f); + skele2->_56C += DEG2SHORT_ANGLE(GETREG(TAKREG, 0xb) + 5.0f); + add_calc0(&skele2->_55C, 0.2f, GETREG(TAKREG, 0xc) * 0.1f + 0.5f); + add_calc0(&skele2->_560, 0.2f, GETREG(TAKREG, 0xc) * 0.1f + 0.5f); + add_calc0(&skele2->_564, 0.2f, GETREG(TAKREG, 0xc) * 0.1f + 0.5f); + // some other macro? + if ((float)__fabs(skele1->_00.frame_control.current_frame - skele1->_00.frame_control.start_frame) < 0.008f) { + actor->_63E--; + if (actor->_63E <= 0) { + if (actor->_640 == 1) { + actor->_640 = 0; + } else { + actor->_640 = 1; + } + actor->_63E = RANDOM_F(8.0f) + 1.0f; + cKF_SkeletonInfo_R_init_standard_repeat_morph(&skele1->_00, skele1->_550[actor->_640], NULL, 0.f); + } + if (actor->_640 == 1) { + sAdo_OngenTrgStart(0x77, &actor->_5A0); + actor->_612.x = 1; + } + } + + if (actor->_612.x > 0) { + actor->_612.x++; + if (actor->_612.x == GETREG(TAKREG, 0x31) + 0xf || actor->_612.x == (GETREG(TAKREG, 0x32) + 0x19)) { + s16 v = GETREG(TAKREG, 0x4d) + 0x3c; + xyz_t v1 = hasu_pos; + v1.x += (-32.6f + GETREG(TAKREG, 0x49) * 0.1f); + v1.y += 116.f; + v1.z += (-26.6f + GETREG(TAKREG, 0x4a) * 0.1f); + if (actor->_612.x == GETREG(TAKREG, 0x31) + 0xf) { + skele2->_564 = GETREG(TAKREG, 10) + 30.0f; + skele2->_56C = DEG2SHORT_ANGLE(-180); + if (RANDOM_F(1.0f) < GETREG(TAKREG, 0x2b) * 0.01f + 0.6f) { + actor->_612.z = 1; + } + } else { + actor->_612.x = 0; + } + v1.x += -1.0f; + v1.y += -1.0f; + v1.z += -4.0f; + Common_Get(clip.effect_clip)->effect_make_proc(0x45, v1, 2, DEG2SHORT_ANGLE(0), gamex, -1, 6, v); + } + } + + if (actor->_612.y > 0) { + actor->_612.y++; + if (actor->_612.y == GETREG(TAKREG, 0x33) + 0xd || actor->_612.y == GETREG(TAKREG, 0x34) + 0x17) { + xyz_t v1 = hasu_pos; + s16 v = GETREG(TAKREG, 0x4c) + 0x23; + v1.x += (-2.3f + GETREG(TAKREG, 0x47) * 0.1f); + v1.y += 116.f; + v1.z += (-13.7f + GETREG(TAKREG, 0x48) * 0.1f); + if (actor->_612.y == GETREG(TAKREG, 0x33) + 0xd) { + skele2->_560 = GETREG(TAKREG, 10) + 30.0f; + skele2->_56A = DEG2SHORT_ANGLE(-180); + } else { + actor->_612.y = 0; + } + v1.x += -1.f; + v1.y += -1.f; + v1.z += -4.f; + Common_Get(clip.effect_clip)->effect_make_proc(0x45, v1, 2, DEG2SHORT_ANGLE(0), gamex, -1, 6, v); + } + } + + if (actor->_612.z > 0) { + actor->_612.z++; + if (actor->_612.z == GETREG(TAKREG, 0x35) + 0x17 || actor->_612.z == GETREG(TAKREG, 0x36) + 0x21) { + xyz_t v1 = hasu_pos; + s16 v = GETREG(TAKREG, 0x4b) + 10; + v1.x += (-7.7f + GETREG(TAKREG, 0x45) * 0.1f); + v1.y += 116.0f; + v1.z += (-32.3f + GETREG(TAKREG, 0x46) * 0.1f); + if (actor->_612.z == GETREG(TAKREG, 0x35) + 0x17) { + skele2->_55C = GETREG(TAKREG, 10) + 30.0f; + skele2->_568 = DEG2SHORT_ANGLE(-180); + if (RANDOM_F(1.0f) < GETREG(TAKREG, 0x2c) * 0.01f + 0.6f) { + actor->_612.y = 1; + } + } else { + actor->_612.z = 0; + } + v1.x += -1.0f; + v1.y += -1.0f; + v1.z += -4.0f; + Common_Get(clip.effect_clip)->effect_make_proc(0x45, v1, 2, DEG2SHORT_ANGLE(0), gamex, -1, 6, v); + } + } } -void hasu_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** joint_m, u8* joint_f, void* arg, +BOOL hasu_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; + YET_SKELETON_2* v2 = actor->_590; + if (joint_num == 7) { + trans->z += v2->_55C * sin_s(v2->_568); + } else if (joint_num == 4) { + trans->z += v2->_560 * sin_s(v2->_56A); + } else if (joint_num == 9) { + trans->z += v2->_564 * sin_s(v2->_56C); + } + return TRUE; } -void hasu_after_disp() { - return; +BOOL hasu_after_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*)arg; + YET_SKELETON_2* skele = actor->_590; + if (joint_num == 9) { + Matrix_Position_Zero(&actor->_5A0); + actor->_5A0.y = skele->_564 * actor->init_data._00 * sin_s(skele->_56C) + 116.0f; + } + return TRUE; } void mfish_kaeru_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele = &actor->_38; + YET_SKELETON_2* keyframe = actor->_590; + Mtx *mtxp, *mtxp2; + if (gamex->frame_counter & 1) { + mtxp = &skele->_70; + mtxp2 = &keyframe->_00._70; + } else { + mtxp = &skele->_2b0; + mtxp2 = &keyframe->_00._2b0; + } - GAME_PLAY* game = (GAME_PLAY*)gamex; - return; + OPEN_DISP(gamex->graph); + Matrix_translate(hasu_pos.x + GETREG(TAKREG, 0x42) * 0.1f, hasu_pos.y, hasu_pos.z + GETREG(TAKREG, 0x43) * 0.1f, 0); + Matrix_RotateY(DEG2SHORT_ANGLE(-180), 1); + Matrix_scale(0.01f, 0.01f, 0.01f, 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, &keyframe->_00._00, mtxp2, hasu_before_disp, hasu_after_disp, actor); + + Matrix_translate(actor->_5A0.x + actor->_5AC.x, actor->_5A0.y, actor->_5A0.z + actor->_5AC.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, NULL, NULL, actor); + CLOSE_DISP(gamex->graph); }