From 83bb546c371686974fed15aca4c43aa83782924e Mon Sep 17 00:00:00 2001 From: roeming Date: Thu, 12 Dec 2024 14:31:02 -0500 Subject: [PATCH] Match mFish parent file and _base --- include/ac_museum_fish.h | 91 ++-- src/actor/ac_museum_fish.c | 101 ++--- src/actor/ac_museum_fish_base.c_inc | 628 ++++++++++++++++++++++++++-- src/actor/ac_museum_fish_bass.c_inc | 72 ++-- 4 files changed, 723 insertions(+), 169 deletions(-) diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index 26651ded..fbdd0c11 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -38,27 +38,35 @@ typedef struct _MUSEUM_FISH_INIT_DATA { s16 _30; } MUSEUM_FISH_INIT_DATA; // size: 0x34 -#define artificial_padding(currentOffset, lastOffset, typeOfLastMember) \ +#define artificial_padding(lastOffset, currentOffset, typeOfLastMember) \ u8 __##currentOffset##padding[currentOffset - lastOffset - sizeof(typeOfLastMember)] #define offsetof(structName, memberName) ((size_t) & (((structName*)0)->memberName)) typedef struct _YET_SKELETON { - cKF_SkeletonInfo_R_c _00; - Mtx _70; // offset A8 - artificial_padding(0x2b0, 0x70, Mtx); + cKF_SkeletonInfo_R_c _00; // offset 0, size 0x70 + Mtx _70; // offset 70, size + artificial_padding(0x70, 0x2b0, Mtx); Mtx _2b0; - artificial_padding(0x46C, 0x2b0, Mtx); + artificial_padding(0x2b0, 0x46C, Mtx); + void* _46C; - artificial_padding(0x4F0, 0x46C, void*); + artificial_padding(0x46C, 0x4F0, void*); + s_xyz _4F0; - artificial_padding(0x514, 0x4F0, s_xyz); + + artificial_padding(0x4F0, 0x514, s_xyz); + s_xyz _514; - artificial_padding(0x54C, 0x514, s_xyz); - void* _54C; - void* _550; -} YET_SKELETON; + + artificial_padding(0x514, 0x538, s_xyz); + s_xyz _538; + xyz_t _540; + cKF_Skeleton_R_c* _54C; + cKF_Animation_R_c* _550; + void* _554; +} YET_SKELETON; // size 558 typedef struct _FISH_PRIVATE_DATA { MUSEUM_FISH_INIT_DATA init_data; @@ -66,13 +74,13 @@ typedef struct _FISH_PRIVATE_DATA { YET_SKELETON _38; void* _590; - s32 _594; - s32 _598; + struct _FISH_PRIVATE_DATA* _594; + struct _FISH_PRIVATE_DATA* _598; s32 _59C; // fish num xyz_t _5A0; xyz_t _5AC; xyz_t _5B8; - artificial_padding(0x5D0, 0x5B8, xyz_t); + artificial_padding(0x5B8, 0x5D0, xyz_t); f32 _5D0; f32 _5D4; f32 _5D8; @@ -88,7 +96,7 @@ typedef struct _FISH_PRIVATE_DATA { f32 _608; s_xyz _60C; s_xyz _612; - artificial_padding(0x61A, 0x612, s_xyz); + artificial_padding(0x612, 0x61A, s_xyz); s16 _61A; s16 _61C; s16 _61E; @@ -109,20 +117,11 @@ typedef struct _FISH_PRIVATE_DATA { s16 _63C; s16 _63E; s16 _640; -} MUSEUM_FISH_PRIVATE_DATA; + s16 _642; +} MUSEUM_FISH_PRIVATE_DATA; // size 644 // Holds data for the underwater grass -typedef struct _MUSEUM_FISH_KUSA_DATA { - YET_SKELETON _00; - s_xyz _4F0; - s_xyz _514; - s16 _538; - s16 _53A; - s16 _53C; - float _540; - float _548; - void* _54C; -} MUSEUM_FISH_KUSA_DATA; // size 558 +typedef YET_SKELETON MUSEUM_FISH_KUSA_DATA; typedef struct _FISH_DISPLAY_MSG_INFO { s16 fishName; @@ -134,26 +133,30 @@ 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 - s16 _101f0; - s16 _101f4; - void* _14788; + void* _14788; // offset: 0x14788 size: 4 + + artificial_padding(0x14788, 0x14d08, void*); + xyz_t _14d08[2]; int numFishDisplayed; // offset: 0x14d20, size: 4 int fishDisplayMsgIter; // offset: 0x14d24, size: 4 FISH_DISPLAY_MSG_INFO fishDisplayMsgInfo[10]; // offset: 0x14d28, size: 4*10 - s16 _14d50[0x10]; - s16 _14d78[0x10]; + s16 _14d50[20]; + s16 _14d78[20]; + artificial_padding(0x14d78, 0x14daa, s16[20]); + + s16 _14daa[5]; s16 _14db4; - s16 _14db6; // offset: 0x14db6, size: 2 - s16 _14db8; // offset: 0x14db8, size: 2 - s16 _14dba; // offset: 0x14dba, size: 2 - s16 _14dbc[2]; // offset: 0x14dbc, size: 4 - s16 _14dc0; // offset: 0x14dc0, size: 2 - s16 _14dc2; // offset: 0x14dc2, size: 2 - s16 _14dc4; // offset: 0x14dc4, size: 2 - s16 _14dc8; // offset: 0x14dc8, size: 2 -} MUSEUM_FISH_ACTOR; + s16 _14db6; // offset: 0x14db6, size: 2 + s16 _14db8; // offset: 0x14db8, size: 2 + s16 _14dba; // offset: 0x14dba, size: 2 + s16 _14dbc[2]; // offset: 0x14dbc, size: 4 + s16 _14dc0; // offset: 0x14dc0, size: 2 + s16 _14dc2; // offset: 0x14dc2, size: 2 + s16 _14dc4; // offset: 0x14dc4, size: 2 + s16 _14dc8; // offset: 0x14dc8, size: 2 +} MUSEUM_FISH_ACTOR; // size 14DCA void Museum_Fish_Prv_data_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, int fishNum, int r6); void Museum_Fish_Actor_ct(ACTOR* actor, GAME* game); @@ -172,7 +175,7 @@ BOOL mfish_cull_check(GAME* game, xyz_t* worldPos, f32 x, f32 y, f32 _y); void mfish_point_ligh_pos_get(ACTOR* actorx, GAME* game, int r5); void mfish_point_light_ct(ACTOR* actor, GAME* game); void mfish_point_light_dt(ACTOR* r30, GAME* r31); -void mfish_point_light_mv(ACTOR* actor, GAME* game); +void mfish_point_light_mv(MUSEUM_FISH_ACTOR* actor, GAME* game); void mfish_normal_light_set(); f32 Rnd_EX_f(f32 v1); @@ -203,7 +206,7 @@ void mfish_ani_base_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void Museum_Fish_BigFishObjCheck(); void Museum_Fish_ObjBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex, f32 f1, f32 f2); void Museum_Fish_DonkoBGCheck(); -void Museum_Fish_objchk_pos_set(); +void Museum_Fish_objchk_pos_set(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void Museum_Fish_BGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void Museum_Fish_Kusa_Check(); void Museum_Fish_Object_Check(); @@ -214,7 +217,7 @@ BOOL mfish_peck_wall_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); BOOL mfish_ground_peck_before_check(); void mfish_get_player_area(); void mfish_get_flow_vec(xyz_t* pos, MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); -void mfish_get_escape_angle(); +s16 mfish_get_escape_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); void mfish_move_smooth(); void mfish_hamon_make(); void mfish_afish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); diff --git a/src/actor/ac_museum_fish.c b/src/actor/ac_museum_fish.c index 01944472..c200a2bc 100644 --- a/src/actor/ac_museum_fish.c +++ b/src/actor/ac_museum_fish.c @@ -1,13 +1,10 @@ #include "ac_museum_fish.h" -#include "m_kankyo.h" -#include "m_play.h" #include "m_demo.h" #include "m_name_table.h" #include "m_item_name.h" #include "m_msg.h" #include "m_common_data.h" #include "sys_matrix.h" -#include "m_lib.h" #include "m_player_lib.h" #include "m_debug_mode.h" #include "libforest/gbi_extensions.h" @@ -707,26 +704,27 @@ void Museum_Fish_Actor_ct(ACTOR* actorx, GAME* gamex) { // 0x1338 : kusa_anime // 0x1370 : kusa_start_frame actor->prvKusa[i]._54C = kusa_model[i]; - cKF_SkeletonInfo_R_ct(&actor->prvKusa[i]._00._00, kusa_model[i], kusa_anime[i], &actor->prvKusa[i]._4F0, + cKF_SkeletonInfo_R_ct(&actor->prvKusa[i]._00, kusa_model[i], kusa_anime[i], &actor->prvKusa[i]._4F0, &actor->prvKusa[i]._514); - cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&actor->prvKusa[i]._00._00, kusa_anime[i], NULL, + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&actor->prvKusa[i]._00, kusa_anime[i], NULL, kusa_group_tbl[i] == 2 ? 1.5f : 0.5f, 0.0f); - actor->prvKusa[i]._00._00.frame_control.current_frame = kusa_start_frame[i]; - actor->_101f0 = qrand(); - actor->_101f4 = qrand(); + actor->prvKusa[i]._00.frame_control.current_frame = kusa_start_frame[i]; + actor->prvKusa[i]._538.x = qrand(); + actor->prvKusa[i]._538.z = qrand(); + // actor->_101f0[i * 2 + 2] = qrand(); } if (mMmd_FishInfo(0x21)) { actor->prvFish[0x21]._590 = &actor->_14788; } else { - mfish_hasu_ct(&actor->prvFish[0x21], gamex); + mfish_hasu_ct((MUSEUM_FISH_PRIVATE_DATA*)&actor->_14788, gamex); } prv = actor->prvFish; for (i = 0; i < 40; i++, prv++) { prv->_62E &= ~1; if (mMmd_FishInfo(i)) { - prv->_38._550 = mfish_model_tbl[i]; + prv->_38._54C = mfish_model_tbl[i]; prv->_38._550 = mfish_anime_init_tbl[i]; prv->_62E |= 1; Museum_Fish_Prv_data_init(prv, gamex, i, 1); @@ -890,14 +888,15 @@ void Museum_Fish_Talk_process(ACTOR* actorx, GAME* game) { } void Museum_Fish_Actor_move(ACTOR* actorx, GAME* game) { - s16 old_14db4; int i; - f32 v; - MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; - GAME_PLAY* play = (GAME_PLAY*)game; + int j; MUSEUM_FISH_PRIVATE_DATA* prv; + s16 old_14db4; + f32 v; + GAME_PLAY* play = (GAME_PLAY*)game; + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; - mfish_point_light_mv(actorx, &play->game); + mfish_point_light_mv(actor, &play->game); old_14db4 = actor->_14db4; mfish_get_player_area(actor, &play->game); @@ -925,21 +924,21 @@ void Museum_Fish_Actor_move(ACTOR* actorx, GAME* game) { } } - for (i = 0; i < 0xe; i++) { - cKF_SkeletonInfo_R_play(&actor->prvKusa[i]._00._00); - if (kusa_group_tbl[i] == 2) { - add_calc2(&actor->prvKusa[i]._540, -2.25f, 1.75f, 1.75f); - add_calc_short_angle2(&actor->prvKusa[i]._53A, DEG2SHORT_ANGLE(3.5f), CALC_EASE2(0.1f), 20, 4); + for (j = 0; j < 14; j++) { + cKF_SkeletonInfo_R_play(&actor->prvKusa[j]._00); + if (kusa_group_tbl[j] == 2) { + add_calc2(&actor->prvKusa[j]._540.x, -2.25f, 1.75f, 1.75f); + add_calc_short_angle2(&actor->prvKusa[j]._538.y, DEG2SHORT_ANGLE(3.5f), CALC_EASE2(0.1f), 22, 4); } else { - actor->prvKusa[i]._540 *= 0.9f; - add_calc_short_angle2(&actor->prvKusa[i]._53A, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); + actor->prvKusa[j]._540.x *= 0.9f; + add_calc_short_angle2(&actor->prvKusa[j]._538.y, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); } - actor->prvKusa[i]._548 *= 0.98f; + actor->prvKusa[j]._540.z *= 0.98f; - actor->prvKusa[i]._538 += actor->prvKusa[i]._53A; - actor->prvKusa[i]._53C += actor->prvKusa[i]._53A >> 1; + actor->prvKusa[j]._538.x += actor->prvKusa[j]._538.y; + actor->prvKusa[j]._538.z += actor->prvKusa[j]._538.y >> 1; - add_calc_short_angle2(&actor->prvKusa[i]._53A, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); + add_calc_short_angle2(&actor->prvKusa[j]._538.y, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); } Museum_Fish_Kusa_Check(actor, &play->game); @@ -960,24 +959,27 @@ void Museum_Fish_Actor_move(ACTOR* actorx, GAME* game) { } } - // TODO: check if this is broken after we changed this above Museum_Fish_Talk_process(actorx, game); - prv = actor->prvFish; - for (i = 0; i < 40; i++, prv++) { - if (prv->_62E & 1) { - mfish_mv[i](prv, game); + + { + // needs a new variable + MUSEUM_FISH_PRIVATE_DATA* prv = actor->prvFish; + for (i = 0; i < 40; i++, prv++) { + if (prv->_62E & 1) { + mfish_mv[i](prv, game); + } } } if ((actor->prvFish[0x21]._62E & 1) == 0) { - mfish_hasu_mv(&actor->prvFish[0x21], game); + mfish_hasu_mv((MUSEUM_FISH_PRIVATE_DATA*)&actor->_14788, game); } for (i = 0; i < 5; i++) { if (i == 2) { - actor->_14d78[i] += (s16)DEG2SHORT_ANGLE2((float)GETREG(TAKREG, 20) * 0.1f + 0.5f + RANDOM_F(1)); + actor->_14daa[i] += (s16)DEG2SHORT_ANGLE2((float)GETREG(TAKREG, 31) * 0.1f + 0.5f + RANDOM_F(1)); } else { - actor->_14d78[i] += 8; + actor->_14daa[i] += 8; } } } @@ -1007,13 +1009,13 @@ void Museum_Fish_Suisou_draw(ACTOR* actorx, GAME* game, int r5) { Setpos_HiliteReflect_xlu_init(&suisou_pos[r5], play); - gSPDisplayList(NEXT_POLY_XLU_DISP, obj_suisou1_model); + gSPDisplayList(NEXT_POLY_OPA_DISP, obj_suisou1_model); gSPDisplayList(NEXT_POLY_XLU_DISP, obj_suisou1_modelT); CLOSE_DISP(graph); if ((actor->prvFish[0x21]._62E & 1) == 0) { - mfish_hasu_dw(&actor->prvFish[0x21], game); + mfish_hasu_dw((MUSEUM_FISH_PRIVATE_DATA*)&actor->_14788, game); } } } else if (mfish_cull_check(game, &suisou_pos[4], 215.0f, 25.0f, 0.0f)) { @@ -1044,11 +1046,11 @@ int kusa_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, if (joint_num > 0) { f32 v = (actor->_54C == &cKF_bs_r_obj_museum5_kusa3) ? 35.0f : 20.f; - joint1->y += (s16)(sin_s(actor->_538 + (joint_num * DEG2SHORT_ANGLE(90))) * 1274.0f); - joint1->x += (s16)(sin_s(actor->_53C + (joint_num * DEG2SHORT_ANGLE(90))) * 4369.0f); + joint1->y += (s16)(sin_s(actor->_538.x + (joint_num * DEG2SHORT_ANGLE(90))) * 1274.0f); + joint1->x += (s16)(sin_s(actor->_538.z + (joint_num * DEG2SHORT_ANGLE(90))) * 4369.0f); - trans->y -= actor->_548 * (v * joint_num); - trans->z += actor->_540 * (v * joint_num); + trans->y -= actor->_540.x * (v * joint_num); + trans->z += actor->_540.z * (v * joint_num); } return 1; } @@ -1059,16 +1061,16 @@ void Museum_Fish_Kusa_Draw(ACTOR* actorx, GAME* game, int r5) { if (mfish_cull_check(game, &kusa_pos[r5], 0.0f, 0.0f, 120.0f)) { Mtx* mtx; if (play->game.frame_counter % 2 != 0) { - mtx = &actor->prvKusa[r5]._00._70; + mtx = &actor->prvKusa[r5]._70; } else { - mtx = &actor->prvKusa[r5]._00._2b0; + mtx = &actor->prvKusa[r5]._2b0; } OPEN_DISP(game->graph); Matrix_translate(kusa_pos[r5].x, 0, kusa_pos[r5].z, 0); Matrix_scale(0.01f, 0.01f, 0.01f, 1); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); CLOSE_DISP(game->graph); - cKF_Si3_draw_R_SV(game, &actor->prvKusa[r5]._00._00, mtx, kusa_before_disp, NULL, &actor->prvKusa[r5]); + cKF_Si3_draw_R_SV(game, &actor->prvKusa[r5]._00, mtx, kusa_before_disp, NULL, &actor->prvKusa[r5]); } } @@ -1119,7 +1121,7 @@ void Museum_Fish_Actor_draw(ACTOR* actorx, GAME* game) { mfish_dw[0x21](&actor->prvFish[0x21], game); } - if (GETREG(TAKREG, 92) == 1) { + if (GETREG(TAKREG, 82) == 1) { mfish_normal_light_set(actorx, game); } } @@ -1224,8 +1226,8 @@ void mfish_point_ligh_pos_get(ACTOR* actorx, GAME* game, int r5) { void mfish_point_light_ct(ACTOR* actorx, GAME* game) { MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; GAME_PLAY* play = (GAME_PLAY*)game; - mfish_point_ligh_pos_get(actorx, game, 0); - mfish_point_ligh_pos_get(actorx, game, 1); + mfish_point_ligh_pos_get(&actor->actor, game, 0); + mfish_point_ligh_pos_get(&actor->actor, game, 1); actor->_14db8 = mEnv_ReservePointLight(play, &actor->_14d08[0], 0, 0x96, 0xff, (u8)actor->_14dbc[0]); actor->_14dba = mEnv_ReservePointLight(play, &actor->_14d08[1], 0, 0x96, 0xff, (u8)actor->_14dbc[1]); actor->_14dc0 = 0; @@ -1244,12 +1246,11 @@ void mfish_point_light_dt(ACTOR* actorx, GAME* game) { } } -void mfish_point_light_mv(ACTOR* actorx, GAME* game) { - MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; +void mfish_point_light_mv(MUSEUM_FISH_ACTOR* actor, GAME* game) { GAME_PLAY* play = (GAME_PLAY*)game; - mfish_point_ligh_pos_get(actorx, game, 0); - mfish_point_ligh_pos_get(actorx, game, 1); + mfish_point_ligh_pos_get(&actor->actor, game, 0); + mfish_point_ligh_pos_get(&actor->actor, game, 1); mEnv_OperateReservedPointLight(actor->_14db8, &actor->_14d08[0], 0, 0x96, 0xff, (u8)actor->_14dbc[0]); mEnv_OperateReservedPointLight(actor->_14dba, &actor->_14d08[1], 0, 0x96, 0xff, (u8)actor->_14dbc[1]); diff --git a/src/actor/ac_museum_fish_base.c_inc b/src/actor/ac_museum_fish_base.c_inc index 16e835a8..791b7aec 100644 --- a/src/actor/ac_museum_fish_base.c_inc +++ b/src/actor/ac_museum_fish_base.c_inc @@ -225,7 +225,7 @@ void mfish_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { v = -ABS(v); } } else if (actor->_62E & 0x1e) { - if ((s16)(actor->_62C - actor->_60C.y) < 0) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { v = -v; } else { v = v; @@ -275,7 +275,7 @@ void mfish_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { CALC_EASE(0.2f), actor->_61A >> 1, DEG2SHORT_ANGLE(0.25f)); add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(0.4f), DEG2SHORT_ANGLE(3.75f), DEG2SHORT_ANGLE(0.25f)); - if (ABS((s16)(actor->_612.y - actor->_61C)) < DEG2SHORT_ANGLE(2) && actor->_5E8 < 0.1f) { + if (ABS((s16)(actor->_60C.y - actor->_612.y)) < DEG2SHORT_ANGLE(2) && actor->_5E8 < 0.1f) { if (actor->_63E > 0) { if (mfish_WallCheck(actor)) { mfish_turn_process_init(actor); @@ -350,7 +350,7 @@ void mfish_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { if (actor->_632 > DEG2SHORT_ANGLE(15)) { add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.25f), - (((actor->_632 - DEG2SHORT_ANGLE(15)) / DEG2SHORT_ANGLE(2)) * 0.04f + 0.01f) * 0.5f, 0.05f); + (((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.04f + 0.01f) * 0.5f, 0.05f); } else if (actor->_626 > actor->_628 - 16) { add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), 0.5f, 0.05f); } else if (dist > 20) { @@ -398,7 +398,7 @@ void mfish_ground_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex void mfish_ground_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { xyz_t p = suisou_pos[actor->_630]; xyz_t_sub(&p, &actor->_5A0, &p); - actor->_5F4 = ((actor->init_data._08 * 0.3f + 64.0f) - (MAX(ABS(p.x), ABS(p.y)) * 0.15f)) - actor->init_data._0C; + actor->_5F4 = ((actor->init_data._08 * 0.3f + 64.0f) - (MAX(ABS(p.x), ABS(p.z)) * 0.15f)) - actor->init_data._0C; xyz_t_mult_v(&actor->_5DC, 0.1f); if (actor->_5A0.y > actor->_5F4 + actor->init_data._0C + 4.0f) { @@ -445,7 +445,7 @@ void mfish_base_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { } actor->_5D4 = 0.0; actor->_5AC = ZeroVec; - actor->_63E = qrand(); + actor->_638 = qrand(); actor->_622 = actor->_60C.y; } @@ -613,11 +613,10 @@ void mfish_ani_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { } void mfish_ani_base_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - GAME_PLAY* game = (GAME_PLAY*)gamex; - // NOT BAD + mfish_onefish_dw(actor, gamex); } -void Museum_Fish_BigFishObjCheck(MUSEUM_FISH_PRIVATE_DATA* actor) { +void Museum_Fish_BigFishObjCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { int i; MUSEUM_FISH_PRIVATE_DATA* fish[2]; f32 max[2] = { 430.0f, 530.0f }; @@ -765,11 +764,11 @@ void Museum_Fish_ObjBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex, f32 f1 } void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { - f32 a, b, c, d; + f32 a, b, d, c; + f32 f27; + f32 f24; f32 f25; f32 f26; - f32 f24; - f32 f27; xyz_t p = suisou_pos[actor->_630]; f32 v = (sin_s(actor->_60C.y) * 0.7f) * (ABS(cos_s(actor->_61C)) * 0.5f + 0.5f) + 0.3f; f32 v2 = (cos_s(actor->_60C.y) * 0.7f) * (ABS(cos_s(actor->_61C)) * 0.5f + 0.5f) + 0.3f; @@ -779,14 +778,15 @@ void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { // asm 17C a = (+00.0f + p.x); b = (-45.5f + p.x); - c = (+45.0f + p.z); d = (-17.5f + p.z); + c = (+45.0f + p.z); + f27 = 76.0f - 6.0f * cos_s(DEG2SHORT_ANGLE2(180.0f * (actor->_5B8.x - p.x) / 55.0f)); - f26 = 76.0f - 6.0f * cos_s(DEG2SHORT_ANGLE2((actor->_5B8.x + sin_s(actor->_60C.z) - p.x) * 180.0f / 55.0f)); + f26 = 76.0f - 6.0f * cos_s(DEG2SHORT_ANGLE2((actor->_5B8.x + sin_s(actor->_60C.y) - p.x) * 180.0f / 55.0f)); a -= (actor->_5A0.x + actor->init_data._28 * v); - c -= (actor->_5A0.x - actor->init_data._28 * v); - b -= (actor->_5A0.z + actor->init_data._28 * v2); + b -= (actor->_5A0.x - actor->init_data._28 * v); + c -= (actor->_5A0.z + actor->init_data._28 * v2); d -= (actor->_5A0.z - actor->init_data._28 * v2); /* @@ -844,7 +844,7 @@ void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { } } - f25 = MIN(MIN(actor->_608, actor->_604), MIN(actor->_5FC, actor->_600)); + f25 = MIN(MIN(actor->_608, actor->_604), MIN(actor->_600, actor->_5FC)); if (f25 < 5.0f) { f27 -= 0.5f * (5.0f - f25); } @@ -863,24 +863,330 @@ void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { } } -void Museum_Fish_objchk_pos_set() { - // NOT BAD +void Museum_Fish_objchk_pos_set(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + actor->_5B8 = actor->_5A0; + actor->_5B8.x += (actor->init_data._24 * sin_s(actor->_60C.y)); + actor->_5B8.z += (actor->init_data._24 * cos_s(actor->_60C.y)); } void Museum_Fish_BGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { - return; + xyz_t p = suisou_pos[actor->_630]; + f32 f29, f30, f28, f27, f31, f26, f25; + s32 r31 = 0; + + if ((actor->_624 == 0 || actor->_624 == 0xb || actor->_624 == 0x1 || actor->_624 == 0x2) && + actor->init_data._28 < 0) { + f26 = + GETREG(TAKREG, 0x52) * 0.01f + 0.3f + + (0.7f - GETREG(TAKREG, 0x52) * 0.01f) * ABS(sin_s(actor->_60C.y)) * (ABS(cos_s(actor->_61C)) * 0.5f + 0.5f); + f25 = + GETREG(TAKREG, 0x52) * 0.01f + 0.3f + + (0.7f - GETREG(TAKREG, 0x52) * 0.01f) * ABS(cos_s(actor->_60C.y)) * (ABS(cos_s(actor->_61C)) * 0.5f + 0.5f); + } else if (actor->_624 == 10 || actor->_624 == 7 || actor->_624 == 9) { + f26 = + GETREG(TAKREG, 0x52) * 0.01f + 0.6f + + (0.4f - GETREG(TAKREG, 0x52) * 0.01f) * ABS(sin_s(actor->_60C.y)) * (ABS(cos_s(actor->_61C)) * 0.4f + 0.6f); + f25 = + GETREG(TAKREG, 0x52) * 0.01f + 0.6f + + (0.4f - GETREG(TAKREG, 0x52) * 0.01f) * ABS(cos_s(actor->_60C.y)) * (ABS(cos_s(actor->_61C)) * 0.4f + 0.6f); + } else { + f26 = 1.0f; + f25 = 1.0f; + } + + if (actor->_630 < 4) { + f30 = 54.0f + actor->init_data._28 * f26; + f29 = 54.0f + actor->init_data._28 * f26; + f28 = 54.0f + actor->init_data._28 * f25; + f27 = 54.0f + actor->init_data._28 * f25; + } else { + f30 = actor->init_data._28 * f26 + 189.0f; + f29 = actor->init_data._28 * f26 + 189.0f; + f28 = actor->init_data._28 * f25 + 14.0f; + f27 = actor->init_data._28 * f25 + 25.0f; + f31 = actor->_5B8.x - p.x; + f27 += cos_s(f31 * 32768.0f / 180.0f) * 9.0f; + f27 += 21.0f; + r31 = DEG2SHORT_ANGLE(sin_s(f31 * 32768.0f / 180.0f) * -10.0f); + } + + actor->_62E &= ~0x1e; + actor->_62C = 0; + Museum_Fish_objchk_pos_set(actor, game); + + if (actor->_5B8.x > (p.x + f30)) { + actor->_5A0.x += (p.x + f30) - actor->_5B8.x; + actor->_62E |= 0x4; + } else if (actor->_5B8.x < p.x - f29) { + actor->_5A0.x += (p.x - f29) - actor->_5B8.x; + actor->_62E |= 0x2; + } + + if (actor->_5B8.z > (p.z + f28)) { + actor->_5A0.z += (p.z + f28) - actor->_5B8.z; + actor->_62E |= 0x10; + } else if (actor->_5B8.z < (p.z - f27)) { + actor->_5A0.z += (p.z - f27) - actor->_5B8.z; + actor->_62E |= 0x8; + } + + // asm 468 + Museum_Fish_objchk_pos_set(actor, game); + actor->_5FC = actor->_5B8.x - (p.x - f29); + actor->_600 = (p.x + f30) - actor->_5B8.x; + actor->_604 = actor->_5B8.z - (p.z - f27); + actor->_608 = (p.z + f28) - actor->_5B8.z; + + if (actor->_630 < 4 && actor->_59C != 26) { + Museum_Fish_ObjBGCheck(actor, game, f26, f25); + } + + if (actor->_62E & 2) { + actor->_62C = DEG2SHORT_ANGLE(-90); + } else if (actor->_62E & 4) { + actor->_62C = DEG2SHORT_ANGLE(90); + } + + if (actor->_62E & 8) { + if (actor->_62E & 6) { + actor->_62C = (DEG2SHORT_ANGLE(180) - (actor->_62C >> 1) + ((s16)r31 >> 1)); + } else { + actor->_62C = r31 + DEG2SHORT_ANGLE(180); + } + } else if (actor->_62E & 0x10) { + if (actor->_62E & 6) { + actor->_62C >>= 1; + } else { + actor->_62C = DEG2SHORT_ANGLE(0); + } + } } -void Museum_Fish_Kusa_Check() { +void Museum_Fish_Kusa_Check(MUSEUM_FISH_ACTOR* actor, GAME* game) { static int kusa_group_tbl[14] = { 0, 2, 1, 3, 3, 4, 4, 4, 4, 4, 0, 2, 1, 3 }; + MUSEUM_FISH_KUSA_DATA* k; + MUSEUM_FISH_PRIVATE_DATA* f = &actor->prvFish[0]; + int i; + int j; + f32 sq; + f32 f30 = 0.0f; + f32 f29 = 0.0f; + f32 f28 = 0.0f; + + for (i = 0; i < 40; i++, f++) { + f->_62E &= ~0x100; + + // this if statement salso works as a continue statement + if (f->_59C != 0x1a && f->_59C != 0x1f && f->_59C != 0x21) { + + for (j = 0; j < 14; j++) { + f32 f1 = (j < 5) ? 90.0f : (j < 10) ? 115.0f : 80.0f; + + if (kusa_group_tbl[j] == f->_630 && f->_5B8.y < f1) { + f32 z; + f32 x; + f32 d; + f32 dSQ; + f32 dx; + f32 dy; + + if (kusa_group_tbl[j] == 4) { + if (f->_59C == 0x1f) { + d = 5.0f + f->init_data._08; + } else { + d = 10.0f + f->init_data._08; + } + dSQ = d * d; + } else { + d = 5.0f + f->init_data._08; + dSQ = d * d; + } + + x = f->_5B8.x - (kusa_pos[j].x + actor->prvKusa[j]._540.x); + z = f->_5B8.z - (kusa_pos[j].z + actor->prvKusa[j]._540.z); + + sq = SQ(x) + SQ(z); + if (sq < dSQ) { + f32 t; + s16 v = atans_table(z, x); + + d -= sqrtf(sq); + d *= 0.1f; + f30 += sin_s(v) * d; + if (kusa_group_tbl[j] == 4) { + f29 += MAX(cos_s(v), 0.2f) * d; + } else { + f29 += cos_s(v) * d; + } + + f28 += 1; + + actor->prvKusa[j]._540.x -= (f->init_data._20 * 1.5f) * d * sin_s(v); + + if (kusa_group_tbl[j] == 4) { + actor->prvKusa[j]._540.z -= (f->init_data._20 * 1.5f) * d * MAX(cos_s(v), 0.1f); + } else { + actor->prvKusa[j]._540.z -= (f->init_data._20 * 1.5f) * d * cos_s(v); + } + t = SQ(actor->prvKusa[j]._540.x) + SQ(actor->prvKusa[j]._540.z); + t = sqrtf(t); + if (t > 4.0f) { + xyz_t_mult_v(&actor->prvKusa[j]._540, 4.0f / t); + } + actor->prvKusa[j]._538.y = 0x27d; + } + } + // asm 3fc-410 + } + // asm 414 + if (f28 > 0.0f) { + f->_62E |= 0x100; + f->_5A0.x += (f30 / f28); + f->_5A0.z += (f29 / f28); + } + f28 = 0.0f; + f29 = 0.0f; + f30 = 0.0f; + // asm 460 + } + } } -void Museum_Fish_Object_Check() { - return; +void Museum_Fish_Object_Check(MUSEUM_FISH_ACTOR* actor, GAME* game) { + int i; + MUSEUM_FISH_PRIVATE_DATA* fj; // r31 + MUSEUM_FISH_PRIVATE_DATA* f; // r29 + int j; + f32 f31; + f32 f30; + f32 f29; + xyz_t test; + f32 f28 = 0.0f; + f32 f27 = 0.0f; + f32 f26 = 0.0f; + f32 f25 = 0.0f; + f32 f24 = 0.0f; + f32 f23 = FLT_MAX; + f32 f22; + f32 sq_xz; + f32 sq_xzy; + + fj = f = &actor->prvFish[0]; + + for (i = 0; i < 40; i++, f++) { + f->_62E &= ~0x20; + } + + f = &actor->prvFish[0]; + for (i = 0; i < 40; i++, f++) { + // asm b8 + if (i != 0x21 && i != 0x20 && i != 0x1a && i != 0x27 && i != 0xa && f->_62E & 1) { + for (j = 0; j < 40; j++, fj++) { + if (f->_630 == fj->_630 && i != j && j != 0x21 && j != 0x1a && j != 0x27 && j != 10 && + fj->_62E & 1 != 0) { + + test.x = f->_5B8.x - fj->_5B8.x; // f31 + test.y = f->_5B8.y - fj->_5B8.y; // f29 + test.z = f->_5B8.z - fj->_5B8.z; // f30 + sq_xz = SQ(test.x) + SQ(test.z); + sq_xzy = sq_xz + SQ(test.y); + if (sqrtf(sq_xzy) < f23) { + f23 = sqrtf(sq_xzy); + f->_598 = fj; + } + + if (ABS(test.y) < (f->init_data._04 + fj->init_data._04)) { + f32 additive = f->init_data._08 + fj->init_data._08; + + if (sq_xz < SQ(additive)) { + f22 = additive - sqrtf(SQ(test.x) + SQ(test.z)); + + // bug? + if (test.y > atans_table(sqrtf(SQ(test.x) + SQ(test.z)), test.y) * 0.0f) { + test.y = -test.y + (f->init_data._04 + fj->init_data._04); + } else { + test.y = -test.y - (f->init_data._04 + fj->init_data._04); + } + + test.y *= 0.2f + (GETREG(TAKREG, 0x11)) * 0.001f; + f22 *= 0.2f + (GETREG(TAKREG, 0x12)) * 0.001f; + f->_62A = atans_table(test.z, test.x); + f->_62E |= 0x20; + fj->_62A = f->_62A + DEG2SHORT_ANGLE(180); + f->_62E |= 0x20; + f->_594 = fj; + if ((fj->_62E & 0x1e) == 0 || ABS((s16)(fj->_62C - f->_62A)) >= DEG2SHORT_ANGLE(90)) { + f32 v = (fj->init_data._20 / (f->init_data._20 + fj->init_data._20)); + v *= (1.0f - f->init_data._20); + f22 *= v; + test.y *= v; + } else { + f32 v = (2.0f * fj->init_data._20 / (f->init_data._20 + 2.0f * fj->init_data._20)); + v *= (1.0f - f->init_data._20); + f22 *= v; + test.y *= v; + } + + if (f22 < ABS(test.y) || f->_624 == 0xa || f->_59C == 0x1f) { + f28 += sin_s(f->_62A) * f22; + f27 += cos_s(f->_62A) * f22; + f25 += 1.0f; + } else { + f26 += test.y; + f24 += 1; + } + + if (fj->init_data._20 > f->init_data._20 && f->_5F8 <= f->init_data._08 * 10.0f) { + f->_5F8 += f22; + } + } + } + } + + // asm 5ec - 5f8 + } + + if (f25 > 0.0f) { + f->_5A0.x += f28 / f25; + f->_5A0.z += f27 / f25; + } + + if (f24 > 0) { + f->_5A0.y += MAX(MIN(f26 / f24, 0.5f), -0.5f); + + if (f->_624 == 0 || f->_624 == 0xb) { + f->_5F4 += f26 / f24; + } + } + + if (f24 > 0 && f25 > 0) { + xyz_t r; + xyz_t_sub(&f->_594->_5A0, &f->_5A0, &r); + f->_62A = atans_table(r.z, r.x); + } + + f25 = 0.0f; + f24 = 0.0f; + f27 = 0.0f; + f28 = 0.0f; + f26 = 0.0f; + f23 = FLT_MAX; + fj = &actor->prvFish[0]; + } + if (f->_630 == 3 && f->_624 != 7) { + Museum_Fish_BigFishObjCheck(f, game); + } + // asm 728 + } } -void mfish_body_wind_anime_play() { - return; +void mfish_body_wind_anime_play(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + int a; + // needs int temp to generate extsh + a = DEG2SHORT_ANGLE(GETREG(TAKREG, 0x32) * 0.1f + 1.5f + RANDOM_F(1.0f)); + actor->_63A += a; + a = DEG2SHORT_ANGLE(GETREG(TAKREG, 0x31) * 0.1f + 0.5f + RANDOM_F(0.5f)); + actor->_63C += a; } void mfish_get_player_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, s16* atanx, s16* atany, f32* distance) { @@ -891,7 +1197,7 @@ void mfish_get_player_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, s16* at p = playerActor->actor_class.world.position; p.y += 40.0f; xyz_t_sub(&p, &actor->_5A0, &p1); - v = p1.x * p1.x + p1.z * p1.z; + v = SQ(p1.x) + SQ(p1.z); v = sqrtf(v); if (atanx) { *atanx = atans_table(p1.z, p1.x); @@ -904,34 +1210,276 @@ void mfish_get_player_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, s16* at } } -BOOL mfish_peck_check() { - return; +BOOL mfish_peck_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + Private_c* commonData_prv = common_data.now_private; + + if (MF_Control_Actor->_14db4 == actor->_630) { + if (actor->_59C == 0x18) { + return TRUE; + } else if (mPr_GetPossessionItemIdx(commonData_prv, 0x2806) != -1) { + if (actor->_59C == 2 || actor->_59C == 3) { + return TRUE; + } + } else if (mPr_GetPossessionItemIdxItem1Category(commonData_prv, 8) != -1 && + (actor->_59C == 0x17 || actor->_59C == 0x1e)) { + return TRUE; + } + } + + return FALSE; } -BOOL mfish_peck_wall_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { - // NOT BAD +BOOL mfish_peck_wall_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 temp = (actor->_60C.y - actor->_62C); + if (actor->_62E & 0x1E && ABS(temp) < DEG2SHORT_ANGLE(45)) { + PLAYER_ACTOR* playerActor = get_player_actor_withoutCheck((GAME_PLAY*)gamex); + xyz_t target = playerActor->actor_class.world.position; + return search_position_distance(&actor->_5A0, &target) < 60.0f; + } + return FALSE; } -BOOL mfish_ground_peck_before_check() { - return; +BOOL mfish_ground_peck_before_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p, p2; + f32 v; + + p2 = p = suisou_pos[actor->_630]; + + xyz_t_sub(&p2, &actor->_5A0, &p2); + + v = MAX(ABS(p2.x), ABS(p2.z)); + + if (actor->_34 == mfish_ground_peck_process) { + return actor->_63E > 0; + } else if ((actor->_630 == 2) && (actor->_5A0.x < p.x + 20.0f) && (actor->_5A0.z > p.z - 10.0f) && + (actor->_5A0.y < (actor->init_data._08 * 0.5f + 75.0f) - (v * 0.15f)) && (fqrand() > 0.2f)) { + return TRUE; + } + + return FALSE; } -void mfish_get_player_area() { - return; +void mfish_get_player_area(MUSEUM_FISH_ACTOR* actor, GAME* gamex) { + PLAYER_ACTOR* player = get_player_actor_withoutCheck((GAME_PLAY*)gamex); + xyz_t p = player->actor_class.world.position; + + if (actor->_14db6-- < 0) { + actor->_14db6 = 0x1e; + } else { + return; + } + + if (p.z < 80.0f) { + actor->_14db4 = 4; + return; + } + + if (p.z > 120.0f && p.z < 320.0f) { + if (p.x < 320.0f) { + actor->_14db4 = 0; + } else { + actor->_14db4 = 1; + } + return; + } + + if (p.z > 360.0f && p.z < 560.0f) { + if (p.x < 320.0f && p.x > 120.0f) { + actor->_14db4 = 2; + } else { + actor->_14db4 = 3; + } + return; + } + + actor->_14db4 = -1; } void mfish_get_flow_vec(xyz_t* pos, MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { - return; + f32 v; + xyz_t p2; + xyz_t p = suisou_pos[actor->_630]; + xyz_t t; + xyz_t p3; + + f32 xy; + f32 s; + s16 s2; + + f32 d; + f32 dSQ; + + if (actor->_630 == 0) { + v = 0.05f; + } else if (actor->_630 == 1) { + v = 0.06f; + } else if (actor->_630 == 2) { + v = 0.2f; + } else if (actor->_630 == 3) { + v = 0.05f; + } else if (actor->_630 == 4) { + v = 0.08f; + } + xyz_t_sub(&actor->_5A0, &p, &t); + xy = SQ(t.x) + SQ(t.z); + s = (sin_s(DEG2SHORT_ANGLE2(360.0f * sqrtf(xy) / 720.0f)) * 0.1f + 0.2f); + p2.x = s * cos_s(DEG2SHORT_ANGLE2(360.0f * t.x / 60.0f)); + p2.z = s * cos_s(DEG2SHORT_ANGLE2(360.0f * t.z / 60.0f)); + p2.y = (s * 0.5f) * cos_s(DEG2SHORT_ANGLE2(180.0f * t.y / 70.0f)); + + s2 = atans_table(t.z, t.x); + s2 += MF_Control_Actor->_14daa[actor->_630]; + + if (actor->_630 == 2) { + p2.x += (GETREG(TAKREG, 0xc) * 0.01f + 2.0f) * cos_s(s2); + p2.z += (GETREG(TAKREG, 0xc) * 0.01f + 2.0f) * sin_s(s2); + } else { + p2.x += (GETREG(TAKREG, 0xc) * 0.01f + 1.5f) * cos_s(s2); + p2.z += (GETREG(TAKREG, 0xc) * 0.01f + 1.5f) * sin_s(s2); + } + + p2.x *= ABS(cos_s(actor->_60C.y) * cos_s(actor->_60C.x)); + p2.z *= ABS(sin_s(actor->_60C.y) * cos_s(actor->_60C.x)); + + if (actor->_624 != 3) { + p2.x *= cos_s(actor->_61C); + p2.z *= cos_s(actor->_61C); + } + + if (actor->_630 == 4) { + p2.z += (GETREG(TAKREG, 0xb) * 0.01f + 0.5f) * cos_s(actor->_60C.y + DEG2SHORT_ANGLE(90)); + } else if (actor->_630 == 2) { + p2.x -= ABS(cos_s(actor->_60C.y)) * 0.02f; + if (ABS((s16)(actor->_60C.y - DEG2SHORT_ANGLE(270))) < DEG2SHORT_ANGLE(100)) { + p2.x = MIN(-1.0f + GETREG(TAKREG, 0x48) * 0.001f, p2.x); + } + } + + if (actor->_598 != NULL) { + if (actor->_630 == 4) { + s = actor->_598->init_data._08 * 10.0f + actor->init_data._08 * 2.0f; + } else { + s = actor->_598->init_data._08 * 5.0f + actor->init_data._08 * 2.0f; + } + xyz_t_sub(&actor->_5A0, &actor->_598->_5A0, &p3); + dSQ = SQ(p3.x) + SQ(p3.y) + SQ(p3.z); + d = sqrtf(dSQ); + + if (d < s) { + f32 x = (1.0f / SQ(s)) * (d - s) * (d - s); + x *= actor->_598->init_data._20; + p2.x += (x * p3.x) / d; + p2.y += (x * p3.y) / d; + p2.z += (x * p3.z) / d; + } + } + + if (actor->_630 == 2 && p2.x < 0.0f) { + p2.x *= 1.1f; + } + + xyz_t_mult_v(&p2, v); + add_calc2(&actor->_5DC.x, p2.x, 0.5f, 0.1f); + add_calc2(&actor->_5DC.y, p2.y, 0.5f, 0.1f); + add_calc2(&actor->_5DC.z, p2.z, 0.5f, 0.1f); + *pos = actor->_5DC; } -void mfish_get_escape_angle() { - return; +s16 mfish_get_escape_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + // int ret; + s16 v1 = atans_table(actor->_594->_5A0.z - actor->_5A0.z, actor->_594->_5A0.x - actor->_5A0.x); + s16 v = actor->_60C.y - v1; + if (ABS(v) < DEG2SHORT_ANGLE(90)) { + if (actor->_624 == 1 || actor->_624 == 2) { + if (ABS((s16)(actor->_594->_60C.y - actor->_60C.y)) > DEG2SHORT_ANGLE(90)) { + add_calc2(&actor->_5F0, actor->init_data._14 + actor->init_data._10, 0.1f, 0.3f); + } else { + add_calc2(&actor->_5F0, actor->init_data._10, 0.05f, 0.3f); + } + } else if (actor->_624 == 6) { + if (actor->_5E8 > 0.0f) { + add_calc2(&actor->_5E8, actor->init_data._14 + actor->init_data._10, 0.25f, 0.1f); + } else { + actor->_5E8 *= 0.95f; + } + } + + if (v > 0) { + v1 += DEG2SHORT_ANGLE(90); + } else { + v1 -= DEG2SHORT_ANGLE(90); + } + + return v1; + } else { + return actor->_62A; + } } -void mfish_move_smooth() { - return; +void mfish_move_smooth(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 vv; + s16 v = 0; + s16* o; + if (actor->_608 < 20.0f || actor->_600 < 20.0f || actor->_604 < 20.0f || actor->_5FC < 20.0f) { + if (actor->_600 < 20.0f) { + v = DEG2SHORT_ANGLE(90); + } else if (actor->_5FC < 20.0f) { + v = DEG2SHORT_ANGLE(-90); + } + + if (actor->_608 < 20.0f) { + if (v == 0) { + v = 0; + } else { + v >>= 1; + } + } else if (actor->_604 < 20.0f) { + if (v == 0) { + v = DEG2SHORT_ANGLE(-180); + } else { + v = DEG2SHORT_ANGLE(180) - (v >> 1); + } + } + + if ((actor->_5E8 > 0.0f || actor->_608 < 5.0f || actor->_604 < 5.0f || actor->_600 < 5.0f || + actor->_5FC < 5.0f) && + (actor->_34 != mfish_peck_process && actor->_34 != mfish_koi_peck_process)) { + vv = actor->_60C.y - (s16)v; + if (ABS(vv) < DEG2SHORT_ANGLE(45)) { + add_calc0(&actor->_5E8, 0.1f * cos_s(vv << 1), 0.02f); + } + + if ((actor->_630 == 0 || actor->_624 == 10 || actor->_624 == 11 || actor->_59C == 25) && + ABS(vv) < DEG2SHORT_ANGLE(90) && ABS(actor->_622) < DEG2SHORT_ANGLE(10)) { + if (actor->_34 == mfish_afish_dummy_process) { + o = &actor->_634; + } else { + o = &actor->_612.y; + } + + if (vv > 0) { + add_calc_short_angle2( + o, (s16)v + DEG2SHORT_ANGLE(90), CALC_EASE(GETREG(TAKREG, 0x2d) * 0.01f + 0.25f), + DEG2SHORT_ANGLE(actor->_5E8 * ((GETREG(TAKREG, 0x2e) + 12.0f) * cos_s(vv)) + 1.5f) >> 1, + DEG2SHORT_ANGLE(0.5f)); + } else { + add_calc_short_angle2( + o, (s16)v - DEG2SHORT_ANGLE(90), CALC_EASE(GETREG(TAKREG, 0x2d) * 0.01f + 0.25f), + DEG2SHORT_ANGLE(actor->_5E8 * ((GETREG(TAKREG, 0x2e) + 5.0f) * cos_s(vv)) + 1.5f) >> 1, + DEG2SHORT_ANGLE(0.5f)); + } + } + } + } } -void mfish_hamon_make() { - return; +void mfish_hamon_make(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + if ((play->game_frame & 7) == 0 && + ((actor->_62E & 0x1e) == 0 || ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(80))) { + xyz_t p = actor->_5A0; + p.y = 115.0f; + Common_Get(clip.effect_clip) + ->effect_make_proc(0x45, p, 2, DEG2SHORT_ANGLE(180) + actor->_60C.y, game, -1, 7, 0); + } } diff --git a/src/actor/ac_museum_fish_bass.c_inc b/src/actor/ac_museum_fish_bass.c_inc index ae18c8df..62585e40 100644 --- a/src/actor/ac_museum_fish_bass.c_inc +++ b/src/actor/ac_museum_fish_bass.c_inc @@ -14,8 +14,8 @@ void mfish_bass_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { f32 t; xyz_t pos; add_calc2(&actor->_5E8, actor->_5AC.x, 1 - actor->init_data._18, 0.01f + 0.001f * GETREG(TAKREG, 20)); - actor->_5D0 = actor->_5E8 * sin_s(actor->_60C.z); - actor->_5D8 = actor->_5E8 * cos_s(actor->_60C.z); + actor->_5D0 = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D8 = actor->_5E8 * cos_s(actor->_60C.y); add_calc(&actor->_5D4, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); t = add_calc(&actor->_5A0.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D4, 0); @@ -25,8 +25,8 @@ void mfish_bass_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { } mfish_move_smooth(actor, game); mfish_get_flow_vec(&pos, actor, game); - actor->_5A0.y += actor->_5D0 + actor->_5DC.x; - actor->_5A0.z += actor->_5D0 + actor->_5DC.x; + actor->_5A0.x += actor->_5D0 + actor->_5DC.x; + actor->_5A0.z += actor->_5D8 + actor->_5DC.z; actor->_5A0.y = actor->_5A0.y + actor->_5DC.y; actor->_5A0.y = MAX(60, MIN(110, actor->_5A0.y)); } @@ -36,13 +36,13 @@ void mfish_bass_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { if ((actor->_62E & 0x1E) != 0) { // works with temp instead of cast - if ((s16)(actor->_612.z - actor->_62C) > 0) { + if ((s16)(actor->_612.y - actor->_62C) > 0) { actor->_634 = actor->_62C + DEG2SHORT_ANGLE(90); } else { actor->_634 = actor->_62C - DEG2SHORT_ANGLE(90); } } else { - add_calc_short_angle2(&actor->_634, actor->_612.z, CALC_EASE(0.5f), DEG2SHORT_ANGLE(22.5), 0x5b); + add_calc_short_angle2(&actor->_634, actor->_612.y, CALC_EASE(0.5f), DEG2SHORT_ANGLE(22.5), 0x5b); } actor->_5EC = 0.0f; @@ -53,8 +53,8 @@ void mfish_bass_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { void mfish_bass_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor) { // no clue what's going on here - add_calc_short_angle2(&actor->_612.z, actor->_634, CALC_EASE2(0.0f), 0x1c7, 0x2d); - actor->_622 = add_calc_short_angle2(&actor->_60C.z, actor->_612.z, CALC_EASE2(0.25f), 0xe3, 0x2d); + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.0f), 0x1c7, 0x2d); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.25f), 0xe3, 0x2d); add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(0.25f), 0xe3, 0x2d); } @@ -89,13 +89,13 @@ void mfish_bass_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* fishActor) { if (RANDOM_F(1) > fishActor->init_data._1C) { int diff; - fishActor->_612.z += (s16)Rnd_EX_fx(fishActor->init_data._30 * 2.0f); - diff = fishActor->_612.z - fishActor->_60C.z; + fishActor->_612.y += (s16)Rnd_EX_fx(fishActor->init_data._30 * 2.0f); + diff = fishActor->_612.y - fishActor->_60C.y; if (ABS((s16)diff) < DEG2SHORT_ANGLE(20)) { if ((s16)diff > 0) { - fishActor->_612.z += DEG2SHORT_ANGLE(20); + fishActor->_612.y += DEG2SHORT_ANGLE(20); } else { - fishActor->_612.z += DEG2SHORT_ANGLE(-20); + fishActor->_612.y += DEG2SHORT_ANGLE(-20); } } @@ -105,10 +105,10 @@ void mfish_bass_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* fishActor) { fishActor->_632 = DEG2SHORT_ANGLE(t * 30 + 20); } } else { - if ((s16)(fishActor->_612.z - fishActor->_60C.z) > 0) { - fishActor->_612.z += DEG2SHORT_ANGLE(15); + if ((s16)(fishActor->_612.y - fishActor->_60C.y) > 0) { + fishActor->_612.y += DEG2SHORT_ANGLE(15); } else { - fishActor->_612.z += DEG2SHORT_ANGLE(-15); + fishActor->_612.y += DEG2SHORT_ANGLE(-15); } if ((fishActor->_62E & 0x200) == 0) { @@ -117,7 +117,7 @@ void mfish_bass_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* fishActor) { fishActor->_632 = DEG2SHORT_ANGLE((GETREG(TAKREG, 42) + 40.0f) * t + 30); } } - if ((s16)(fishActor->_612.z - fishActor->_60C.z) > 0) { + if ((s16)(fishActor->_60C.y - fishActor->_612.y) > 0) { fishActor->_636 = DEG2SHORT_ANGLE(0); } else { fishActor->_636 = DEG2SHORT_ANGLE(-180); @@ -138,14 +138,14 @@ void mfish_bass_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { } if (actor->_62E & 0x200) { add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(GETREG(TAKREG, 73) * 0.1f + 4.0f), - (s16)(DEG2SHORT_ANGLE(GETREG(TAKREG, 73) * 0.1f + 4.0f) >> 1) >> 1, 45); + (s16)(DEG2SHORT_ANGLE(GETREG(TAKREG, 74) * 0.1f + 4.0f) >> 1) >> 1, 45); actor->_636 = actor->_636 + (s16)DEG2SHORT_ANGLE2( (3.0f * actor->_5E8) / (actor->init_data._14 + actor->init_data._10) + 9.0f); } else { add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), 227, 45); actor->_636 += DEG2SHORT_ANGLE(10); } - actor->_622 = add_calc_short_angle2(&actor->_60C.z, actor->_612.z + (s16)(actor->_632 * sin_s(actor->_636)), + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), CALC_EASE2(actor->_5AC.y * 0.25f + 0.25f), (s16)(DEG2SHORT_ANGLE(actor->_5AC.y * 15.0f + 10.0f) >> 1) >> 1, 22); add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(actor->_5AC.y * 0.25f + 0.25f), @@ -154,10 +154,10 @@ void mfish_bass_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { if (actor->_5E8 < 0.01f) { mfish_bass_dummy_process_init(actor); } else if (actor->_5E8 > 1.0f && actor->_62E & 0x1e) { - if ((s16)(actor->_60C.z - actor->_62C) > 0) { - actor->_612.z = actor->_62C + DEG2SHORT_ANGLE(112.5f); + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); } else { - actor->_612.z = actor->_62C - DEG2SHORT_ANGLE(112.5f); + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); } actor->_632 = 0; } @@ -171,7 +171,7 @@ void mfish_bass_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { actor->_61A = DEG2SHORT_ANGLE((actor->_5AC.y * 4.0f + 4.0f) * (SHORT2DEG_ANGLE2(a) / 120.0f) + 2.0f + actor->_5AC.y); if (actor->_62E & 0x1e) { - if ((s16)(actor->_60C.x - actor->_62C) < 0) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { b = -a; } } else if (actor->_62E & 0xC0) { @@ -181,7 +181,7 @@ void mfish_bass_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { b = -ABS(a); } } else if (actor->_62E & 0x20) { - if ((s16)(actor->_62A - actor->_60C.x) < 0) { + if ((s16)(actor->_62A - actor->_60C.y) < 0) { b = -a; } } @@ -192,7 +192,7 @@ void mfish_bass_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { actor->_62E |= 0x80; } - actor->_612.z += b; + actor->_612.y += b; if ((RANDOM_F(1) < 0.25f) && (actor->_62E & 0x200) == 0) { actor->_62E |= 0x200; @@ -228,19 +228,19 @@ void mfish_bass_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor) { v4 = actor->_5AC.y * 0.15f + 0.05f; if (ABS(actor->_622) > DEG2SHORT_ANGLE(20)) { - add_calc2(&actor->_5E8, v0, v1, v2); + add_calc2(&actor->_5EC, v0, v1, v2); add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), actor->_5EC * 0.5f, 0.05f); } add_calc2(&actor->_5F0, MAX(actor->init_data._10, 0.0f), v3, v4); add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(2.5f), 45); - actor->_622 = add_calc_short_angle2(&actor->_60C.z, ((s16)(sin_s(actor->_636) * actor->_632) + actor->_612.z), + actor->_622 = add_calc_short_angle2(&actor->_60C.y, ((s16)(sin_s(actor->_636) * actor->_632) + actor->_612.y), CALC_EASE(0.2f), actor->_61A >> 1, 45); add_calc_short_angle2(&actor->_61C, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(2.5f), 22); - if (ABS((s16)(actor->_60C.z - actor->_612.z)) < DEG2SHORT_ANGLE(2.0f) && actor->_5E8 < 0.1f) { + if (ABS((s16)(actor->_60C.y - actor->_612.y)) < DEG2SHORT_ANGLE(2.0f) && actor->_5E8 < 0.1f) { if (actor->_63E > 0) { if (mfish_WallCheck(actor)) { mfish_bass_tail_anim_set(actor, 1); @@ -297,9 +297,9 @@ void mfish_bass_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { mfish_bass_turn_process_init(actor); } } else if (actor->_34 == &mfish_bass_normal_process) { - if (((actor->_62E & 0x1e) && ABS((s16)(actor->_60C.z - actor->_62C)) < DEG2SHORT_ANGLE(30)) || + if (((actor->_62E & 0x1e) && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || ((actor->_62E & 0x20) && - ABS((s16)((actor->_62A - DEG2SHORT_ANGLE(-180)) - actor->_60C.z)) < DEG2SHORT_ANGLE(30))) { + ABS((s16)((actor->_62A - DEG2SHORT_ANGLE(-180)) - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { actor->_626 = actor->init_data._2C + (s16)(actor->init_data._2E * fqrand()); actor->_628 = actor->_626; mfish_bass_tail_anim_set(actor, 1); @@ -309,7 +309,7 @@ void mfish_bass_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { actor->_638 += DEG2SHORT_ANGLE(10); actor->_34(actor, gamex); - if (ABS(actor->_622) > ABS(actor->_61C)) { + if (ABS(actor->_61C) > ABS(actor->_622)) { add_calc2(&actor->_5E8, MIN(GETREG(TAKREG, 19) * 0.01f + 1.0f, actor->_5E8), GETREG(TAKREG, 18) * 0.01f + 0.2f, GETREG(TAKREG, 17) * 0.01f + 0.5f); } @@ -322,11 +322,13 @@ void mfish_bass_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { Museum_Fish_BGCheck(actor, gamex); if (actor->_640 > 0) { f32 tmp, num, denom; - denom = (actor->init_data._14 + actor->init_data._10); + // needed tmp before the decrement for some reason + tmp = (0.4f + (0.7f * actor->_5AC.y)); actor->_640--; - num = (actor->_5AC.z * (actor->_5F0 - actor->_5E8)); - tmp = (actor->_5AC.y * 0.7f + 0.4f); - add_calc2(&actor->_38._00.frame_control.speed, tmp * (1.75f + num / denom), 0.5f, 0.5f); + add_calc2(&actor->_38._00.frame_control.speed, + tmp * (1.75f + + actor->_5AC.z * (actor->_5F0 - actor->_5E8) / ((actor->init_data._14) + actor->init_data._10)), + 0.5f, 0.5f); } else { add_calc2(&actor->_38._00.frame_control.speed, (actor->_5E8 * 2.0f + 0.5f) * (actor->_5AC.y * 0.8f + 0.6f), 0.2f, 0.1f); @@ -352,7 +354,7 @@ void mfish_bass_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { graph = play->game.graph; Matrix_translate(actor->_5A0.x, actor->_5A0.y, actor->_5A0.z, 0); - Matrix_RotateY(actor->_60C.z, 1); + Matrix_RotateY(actor->_60C.y, 1); Matrix_translate(0, 0.25f * actor->init_data._04, 0.5f * actor->init_data._24, 1); Matrix_RotateX(actor->_60C.x, 1);