diff --git a/configure.py b/configure.py index 4c15516d..b2ea257c 100644 --- a/configure.py +++ b/configure.py @@ -1013,7 +1013,7 @@ config.libs = [ Object(Matching, "actor/ac_mscore_control.c"), Object(Matching, "actor/ac_mural.c"), Object(Matching, "actor/ac_museum.c"), - Object(NonMatching, "actor/ac_museum_fish.c"), + Object(Matching, "actor/ac_museum_fish.c"), Object(Matching, "actor/ac_museum_fossil.c"), Object(NonMatching, "actor/ac_museum_indoor.c"), Object(NonMatching, "actor/ac_museum_insect.c"), diff --git a/include/ac_museum_fish.h b/include/ac_museum_fish.h index b6f48bf2..180e7230 100644 --- a/include/ac_museum_fish.h +++ b/include/ac_museum_fish.h @@ -3,6 +3,9 @@ #include "types.h" #include "m_actor.h" +#include "c_keyframe.h" +#include "libu64/u64types.h" +#include "ac_gyoei.h" #ifdef __cplusplus extern "C" { @@ -10,9 +13,478 @@ extern "C" { extern ACTOR_PROFILE Museum_Fish_Profile; +typedef struct _FISH_PRIVATE_DATA; + +typedef void (*PRIV_FISH_CONSTRUCTOR)(struct _FISH_PRIVATE_DATA*, GAME*); +typedef void (*PRIV_FISH_MOVE)(struct _FISH_PRIVATE_DATA*, GAME*); +typedef void (*PRIV_FISH_DRAW)(struct _FISH_PRIVATE_DATA*, GAME*); +// typedef void (*PRIV_FISH_PROCESS)(struct _FISH_PRIVATE_DATA*, GAME*); +typedef void (*PRIV_FISH_PROCESS)(struct _FISH_PRIVATE_DATA*, GAME*); + +// unsure temp structs + +typedef struct _MUSEUM_FISH_INIT_DATA { + f32 renderScale; + f32 _04; + f32 _08; + f32 _0C; + f32 _10; + f32 _14; + f32 _18; + f32 _1C; + f32 _20; + f32 _24; + f32 _28; + s16 activeFramesMin; + s16 activeFramesRange; + s16 _30; +} MUSEUM_FISH_INIT_DATA; // size: 0x34 + +#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; // offset 0, size 0x70 + Mtx _70; // offset 70, size + artificial_padding(0x70, 0x2b0, Mtx); + Mtx _2b0; + artificial_padding(0x2b0, 0x46C, Mtx); + + void* _46C; + + artificial_padding(0x46C, 0x4F0, void*); + + s_xyz _4F0; + + artificial_padding(0x4F0, 0x514, s_xyz); + + s_xyz _514; + 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[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 enum fish_type MUSEUM_FISH_TYPE; + +typedef struct _FISH_PRIVATE_DATA { + MUSEUM_FISH_INIT_DATA init_data; + PRIV_FISH_PROCESS currentProcess; // size:4 + YET_SKELETON _38; + + YET_SKELETON_2* _590; + struct _FISH_PRIVATE_DATA* _594; + struct _FISH_PRIVATE_DATA* _598; + + MUSEUM_FISH_TYPE fishIDEnum; + xyz_t position; + xyz_t _5AC; + xyz_t _5B8; + artificial_padding(0x5B8, 0x5D0, xyz_t); + xyz_t _5D0; + xyz_t _5DC; + f32 _5E8; + f32 _5EC; + f32 _5F0; + f32 _5F4; + f32 _5F8; + f32 _5FC; + f32 _600; + f32 _604; + f32 _608; + s_xyz _60C; + s_xyz _612; + s_xyz _618; + s16 _61E; + s16 _620; + s16 _622; + s16 _624; + s16 activityFrameCount; + s16 savedActivityFrameCount; + s16 _62A; + s16 _62C; + s16 _62E_flags; + s16 group; + s16 _632; + s16 _634; + s16 _636; + s16 _638; + s16 _63A; + s16 _63C; + s16 _63E; + s16 _640; + s16 _642; + s16 _644; + s16 _646; +} MUSEUM_FISH_PRIVATE_DATA; // size 648 + +// Holds data for the underwater grass +typedef YET_SKELETON MUSEUM_FISH_KUSA_DATA; + +typedef struct _FISH_DISPLAY_MSG_INFO { + s16 fishName; + s16 fishInfo; +} FISH_DISPLAY_MSG_INFO; + +typedef struct _MUSEUM_FISH_ACTOR { + ACTOR actor; // offset: 0, size: 0x174 + int _174; + MUSEUM_FISH_PRIVATE_DATA prvFish[aGYO_TYPE_NUM]; // offset: 0x178 size: 0xFB48 + MUSEUM_FISH_KUSA_DATA prvKusa[14]; // offset: 0xFCB8 size: 0x4AD0 + YET_SKELETON_2 _14788; // offset: 0x14788 size: 0x570 + + u8 _14cf8[16]; // temp + + xyz_t lightPosition[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[20]; + s16 _14d78[20]; + artificial_padding(0x14d78, 0x14daa, s16[20]); + + s16 _14daa[5]; + s16 _14db4; + s16 _14db6; // offset: 0x14db6, size: 2 + s16 lightID1; // offset: 0x14db8, size: 2 + s16 lightID2; // offset: 0x14dba, size: 2 + s16 lightPower[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 + +// ac_museum_fish.c_inc +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); +void Museum_Fish_Actor_dt(ACTOR* actor, GAME* game); +int Museum_Fish_GetMsgNo(ACTOR* actor); +BOOL Museum_Fish_Check_Talk_Distance(GAME* gamex, int index); +void Museum_Fish_Set_MsgFishInfo(ACTOR* actor, int param2); +void Museum_Fish_set_talk_info(ACTOR* actor); +void Museum_Fish_Talk_process(ACTOR* actor, GAME* game); +void Museum_Fish_Actor_move(ACTOR* actor, GAME* game); +void Museum_Fish_Suisou_draw(ACTOR* actor, GAME* game, int r5); +int kusa_before_disp(GAME* r3, cKF_SkeletonInfo_R_c* r4, int r5, Gfx** r6, u8* r7, void* arg, s_xyz* r9, xyz_t* r10); +void Museum_Fish_Kusa_Draw(ACTOR* actor, GAME* game, int r5); +void Museum_Fish_Actor_draw(ACTOR* actor, GAME* game); +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(MUSEUM_FISH_ACTOR* actor, GAME* game); +void mfish_normal_light_set(ACTOR* actor, GAME* game); + +// ac_museum_fish_base.c_inc +f32 Rnd_EX_f(f32 v1); +f32 Rnd_EX_fx(f32 v1); +void mfish_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +int mfish_PosWallCheck(MUSEUM_FISH_PRIVATE_DATA* priv, xyz_t* pos); +BOOL mfish_WallCheck(MUSEUM_FISH_PRIVATE_DATA* priv); +s16 mfish_get_hide_camera_angle(MUSEUM_FISH_PRIVATE_DATA* priv); +void mfish_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ground_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ground_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_base_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_onefish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_onefish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL mfish_before_disp(GAME*, cKF_SkeletonInfo_R_c*, int, Gfx**, u8*, void*, s_xyz*, xyz_t*); +void mfish_onefish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ani_base_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ani_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ani_base_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void Museum_Fish_BigFishObjCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void Museum_Fish_ObjBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex, f32 f1, f32 f2); +void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +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(MUSEUM_FISH_ACTOR* actor, GAME* game); +void Museum_Fish_Object_Check(MUSEUM_FISH_ACTOR* actor, GAME* game); +void mfish_body_wind_anime_play(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_get_player_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, s16* atanx, s16* atany, f32* distance); +BOOL mfish_peck_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL mfish_peck_wall_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL mfish_ground_peck_before_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_get_player_area(MUSEUM_FISH_ACTOR* actor, GAME* game); +void mfish_get_flow_vec(xyz_t* pos, MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +s16 mfish_get_escape_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_move_smooth(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_hamon_make(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_afish.c_inc +void mfish_afish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_afish_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_afish_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_afish_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_afish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_aroana.c_inc +void mfish_aroana_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_aroana_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +void mfish_aroana_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_aroana_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_aroana_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_long_move_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_aroana_long_move_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_aroana_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL mfish_aroana_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_aroana_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_koi.c_inc +void mfish_koi_tail_anim_set(MUSEUM_FISH_PRIVATE_DATA* actor, s32 r4); +void mfish_koi_move_smooth(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_koi_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_koi_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_koi_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_long_move_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_koi_long_move_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_koi_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +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); +void mfish_koi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_kaseki.c_inc +void mfish_kaseki_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kaseki_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +void mfish_kaseki_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +void mfish_kaseki_move_wall_smooth(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +void mfish_kaseki_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL mfish_kaseki_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_kaseki_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_bass.c_inc +void mfish_bass_tail_anim_set(MUSEUM_FISH_PRIVATE_DATA* actor, s32 r4); +void mfish_bass_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_bass_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_bass_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_bass_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_bass_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_seafish.c_inc +void mfish_seafish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_seafish_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +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); +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); + +// ac_museum_fish_tai.c_inc +void mfish_tai_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_tai_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_tai_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_tai_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_tai_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_tai_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_sfish.c_inc +void mfish_small_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_sfish_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_sfish_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_sfish_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_sfish_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_small_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_gupi.c_inc +void mfish_gupi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_gupi_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_gupi_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_gupi_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_gupi_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_gupi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_medaka.c_inc +void mfish_medaka_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_medaka_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_medaka_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_medaka_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_medaka_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_medaka_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_kingyo.c_inc +void mfish_kingyo_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_peck_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_peck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kingyo_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +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); + +// ac_museum_fish_dojou.c_inc +void mfish_dojou_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_dojou_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_dojou_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_dojou_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_dojou_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_dojou_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_donko.c_inc +void mfish_donko_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_donko_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_big_fish.c_inc +void mfish_big_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_big_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +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); + +// ac_museum_fish_ito.c_inc +void mfish_ito_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_ito_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_unagi.c_inc +void mfish_unagi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +s16 mfish_unagi_get_next_rail_type(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_unagi_aim_wind_angle_calc(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_unagi_rail_move_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_rail_move(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_normal_to_reverse_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_normal_to_reverse(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_rail_move_reverse_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_rail_move_reverse(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_reverse_to_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_reverse_to_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_unagi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_namazu.c_inc +void mfish_namazu_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_namazu_body_wind_anime_play(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_namazu_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor); +void mfish_namazu_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +//! TODO: these should take (actor, game) because they're assigned to _34, but are statically called with just (actor) +void mfish_namazu_dummy_process_init(); +void mfish_namazu_dummy_process(); +void mfish_namazu_turn_process_init(); +void mfish_namazu_turn_process(); +void mfish_namazu_ground_sweep_process_init(); +void mfish_namazu_ground_sweep_process(); +void mfish_namazu_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_namazu_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_zarigani.c_inc +void mfish_zarigani_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_wait_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_wait_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_stand_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_stand_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_jump_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_jump_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_zarigani_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +BOOL 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); + +// ac_museum_fish_kurage.c_inc +void mfish_kurage_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); +void mfish_kurage_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game); + +// ac_museum_fish_hasu.c_inc +void mfish_hasu_ct(YET_SKELETON_2* actor, GAME* game); +void mfish_hasu_mv(YET_SKELETON_2* actor, GAME* game); +void mfish_hasu_dw(YET_SKELETON_2* actor, GAME* game); +void mfish_kaeru_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +void mfish_kaeru_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); +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); +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(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex); + #ifdef __cplusplus } #endif #endif - diff --git a/src/actor/ac_museum_fish.c b/src/actor/ac_museum_fish.c new file mode 100644 index 00000000..291b99b3 --- /dev/null +++ b/src/actor/ac_museum_fish.c @@ -0,0 +1,1269 @@ +#include "ac_museum_fish.h" +#include "m_msg.h" +#include "m_common_data.h" +#include "sys_matrix.h" +#include "m_player_lib.h" +#include "m_debug_mode.h" +#include "m_rcp.h" +#include "ac_gyoei.h" + +// found useful macros +#define MY_MAX(a, b) (((a) >= (b)) ? (a) : (b)) +#define MY_CLAMP(v, l, h) MIN(MY_MAX((l), (v)), (h)) +#define ARRAY_LEN(a) (sizeof(a) / sizeof(*a)) + +#define CALC_EASE(x) (1.0f - sqrtf(1.0f - (x))) +#define CALC_EASE2(x) CALC_EASE(CALC_EASE(x)) +#define SHORT2DEG_ANGLE2(x) ((x) * (360.0f / 65536.0f)) +#define RANDOMF_RANGE(min, max) ((f32)(min) + (f32)RANDOM_F((f32)(max) - (f32)(min))) +#define RANDOM2F_RANGE(min, max) ((f32)(min) + (f32)RANDOM2_F((f32)(max) - (f32)(min))) +#define RANDOM_RANGE(min, max) ((int)(min) + (int)RANDOM((int)(max) - (int)(min))) +#define RANDOM2_RANGE(min, max) ((int)(min) + (int)RANDOM2((int)(max) - (int)(min))) + +// extern data +// clang-format off +extern cKF_Skeleton_R_c + cKF_bs_r_act_mus_funa_a1, + cKF_bs_r_act_mus_hera_a1, + cKF_bs_r_act_mus_koi_a1, + cKF_bs_r_act_mus_nisiki_a1, + cKF_bs_r_act_mus_namazu_a1, + cKF_bs_r_act_mus_bass_a1, + cKF_bs_r_act_mus_bassm_a1, + cKF_bs_r_act_mus_bassl_a1, + cKF_bs_r_act_mus_gill_a1, + cKF_bs_r_act_mus_onamazu_a1, + cKF_bs_r_act_mus_raigyo_a1, + cKF_bs_r_act_mus_nigoi_a1, + cKF_bs_r_act_mus_ugui_a1, + cKF_bs_r_act_mus_oikawa_a1, + cKF_bs_r_act_mus_tanago_a1, + cKF_bs_r_act_mus_dojyo_a1, + cKF_bs_r_act_mus_wakasa_a1, + cKF_bs_r_act_mus_ayu_a1, + cKF_bs_r_act_mus_yamame_a1, + cKF_bs_r_act_mus_iwana_a1, + cKF_bs_r_act_mus_niji_a1, + cKF_bs_r_act_mus_ito_a1, + cKF_bs_r_act_mus_sake_a1, + cKF_bs_r_act_mus_kingyo_a1, + cKF_bs_r_act_mus_pirania_a1, + cKF_bs_r_act_mus_aroana_a1, + cKF_bs_r_act_mus_unagi_a1, + cKF_bs_r_act_mus_donko_a1, + cKF_bs_r_act_mus_angel_a1, + cKF_bs_r_act_mus_gupi_a1, + cKF_bs_r_act_mus_demekin_a1, + cKF_bs_r_act_mus_kaseki_a1, + cKF_bs_r_act_mus_zari, + cKF_bs_r_act_mus_kaeru_a1, + cKF_bs_r_act_mus_medaka_a1, + cKF_bs_r_act_mus_suzuki_a1, + cKF_bs_r_act_mus_tai_a1, + cKF_bs_r_act_mus_isidai_a1, + cKF_bs_r_act_mus_pira_a1; + +extern cKF_Animation_R_c + cKF_ba_r_act_mus_funa_a1, + cKF_ba_r_act_mus_hera_a1, + cKF_ba_r_act_mus_koi_a1, + cKF_ba_r_act_mus_nisiki_a1, + cKF_ba_r_act_mus_namazu_a1, + cKF_ba_r_act_mus_bass_a1, + cKF_ba_r_act_mus_bassm_a1, + cKF_ba_r_act_mus_bassl_a1, + cKF_ba_r_act_mus_gill_a1, + cKF_ba_r_act_mus_onamazu_a1, + cKF_ba_r_act_mus_raigyo_a1, + cKF_ba_r_act_mus_nigoi_a1, + cKF_ba_r_act_mus_ugui_a1, + cKF_ba_r_act_mus_oikawa_a1, + cKF_ba_r_act_mus_tanago_a1, + cKF_ba_r_act_mus_dojyo_a1, + cKF_ba_r_act_mus_wakasa_a1, + cKF_ba_r_act_mus_ayu_a1, + cKF_ba_r_act_mus_yamame_a1, + cKF_ba_r_act_mus_iwana_a1, + cKF_ba_r_act_mus_niji_a1, + cKF_ba_r_act_mus_ito_a1, + cKF_ba_r_act_mus_sake_a1, + cKF_ba_r_act_mus_kingyo_a1, + cKF_ba_r_act_mus_pirania_a1, + cKF_ba_r_act_mus_aroana_a1, + cKF_ba_r_act_mus_unagi_a2, + cKF_ba_r_act_mus_donko_a1, + cKF_ba_r_act_mus_angel_a1, + cKF_ba_r_act_mus_gupi_a1, + cKF_ba_r_act_mus_demekin_a1, + cKF_ba_r_act_mus_kaseki_a1, + cKF_ba_r_act_mus_zari, + cKF_ba_r_act_mus_kaeru_a1, + cKF_ba_r_act_mus_medaka_a1, + cKF_ba_r_act_mus_suzuki_a1, + cKF_ba_r_act_mus_tai_a1, + cKF_ba_r_act_mus_isidai_a1, + cKF_ba_r_act_mus_pira_a1; + +extern cKF_Skeleton_R_c + cKF_bs_r_obj_museum5_kusa1, + cKF_bs_r_obj_museum5_kusa2, + cKF_bs_r_obj_museum5_kusa3; + +extern cKF_Animation_R_c + cKF_ba_r_obj_museum5_kusa1, + cKF_ba_r_obj_museum5_kusa2, + cKF_ba_r_obj_museum5_kusa3; + +// data + +MUSEUM_FISH_ACTOR* MF_Control_Actor; + +/* Init stuff */ +ACTOR_PROFILE Museum_Fish_Profile = { + mAc_PROFILE_MUSEUM_FISH, + ACTOR_PART_BG, + ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_407, + sizeof(MUSEUM_FISH_ACTOR), + Museum_Fish_Actor_ct, + Museum_Fish_Actor_dt, + Museum_Fish_Actor_move, + Museum_Fish_Actor_draw, + NULL +}; + +static xyz_t suisou_pos[5] = { + { 220.0f, 40.0f, 220.0f }, + { 420.0f, 40.0f, 220.0f }, + { 220.0f, 40.0f, 460.0f }, + { 420.0f, 40.0f, 460.0f }, + { 320.0f, 40.0f, 20.0f } +}; + +int kusa_group_tbl[14] = { 0, 2, 1, 3, 3, 4, 4, 4, 4, 4, 0, 2, 1, 3 }; + +xyz_t kusa_pos[14] = { + { 179.0f, 40.0f, 170.0f }, + { 253.0f, 40.0f, 495.0f }, + { 376.0f, 40.0f, 260.0f }, + { 397.0f, 40.0f, 412.0f }, + { 467.0f, 40.0f, 432.0f }, + { 141.0f, 40.0f, -18.0f }, + { 206.0f, 40.0f, -25.0f }, + { 346.0f, 40.0f, -38.0f }, + { 473.0f, 40.0f, -29.0f }, + { 495.0f, 40.0f, -21.0f }, + { 210.0f, 40.0f, 215.0f }, + { 266.0f, 40.0f, 507.0f }, + { 393.0f, 40.0f, 270.0f }, + { 415.0f, 40.0f, 415.0f } +}; + +xyz_t hasu_pos = { 420, 0, 220 }; + +xyz_t suisou_awa_pos[20] = { + { 150.0f, 60.0f, -12.0f }, + { 192.0f, 60.0f, -20.0f }, + { 216.0f, 60.0f, -4.0f }, + { 300.0f, 60.0f, -42.0f }, + { 332.0f, 60.0f, -28.0f }, + { 356.0f, 60.0f, -46.0f }, + { 416.0f, 60.0f, -28.0f }, + { 456.0f, 60.0f, 20.0f }, + { 190.0f, 60.0f, 173.0f }, + { 196.0f, 60.0f, 186.0f }, + { 232.0f, 60.0f, 178.0f }, + { 372.0f, 60.0f, 254.0f }, + { 388.0f, 60.0f, 270.0f }, + { 434.0f, 60.0f, 173.0f }, + { 180.0f, 60.0f, 408.0f }, + { 256.0f, 60.0f, 512.0f }, + { 270.0f, 60.0f, 500.0f }, + { 406.0f, 60.0f, 414.0f }, + { 458.0f, 60.0f, 424.0f }, + { 447.0f, 60.0f, 442.0f } +}; + +s16 suisou_awa_group[20] = { + 4, 4, 4, 4, 4, + 4, 4, 4, 0, 0, + 0, 1, 1, 1, 2, + 2, 2, 3, 3, 3 +}; + +cKF_Skeleton_R_c* mfish_model_tbl[40] = { +/* CRUCIAN_CARP */ &cKF_bs_r_act_mus_funa_a1, +/* BROOK_TROUT */ &cKF_bs_r_act_mus_hera_a1, +/* CARP */ &cKF_bs_r_act_mus_koi_a1, +/* KOI */ &cKF_bs_r_act_mus_nisiki_a1, +/* CATFISH */ &cKF_bs_r_act_mus_namazu_a1, +/* SMALL_BASS */ &cKF_bs_r_act_mus_bass_a1, +/* BASS */ &cKF_bs_r_act_mus_bassm_a1, +/* LARGE_BASS */ &cKF_bs_r_act_mus_bassl_a1, +/* BLUEGILL */ &cKF_bs_r_act_mus_gill_a1, +/* GIANT_CATFISH */ &cKF_bs_r_act_mus_onamazu_a1, +/* GIANT_SNAKEHEAD */ &cKF_bs_r_act_mus_raigyo_a1, +/* BARBEL_STEED */ &cKF_bs_r_act_mus_nigoi_a1, +/* DACE */ &cKF_bs_r_act_mus_ugui_a1, +/* PALE_CHUB */ &cKF_bs_r_act_mus_oikawa_a1, +/* BITTERLING */ &cKF_bs_r_act_mus_tanago_a1, +/* LOACH */ &cKF_bs_r_act_mus_dojyo_a1, +/* POND_SMELT */ &cKF_bs_r_act_mus_wakasa_a1, +/* SWEETFISH */ &cKF_bs_r_act_mus_ayu_a1, +/* CHERRY_SALMON */ &cKF_bs_r_act_mus_yamame_a1, +/* LARGE_CHAR */ &cKF_bs_r_act_mus_iwana_a1, +/* RAINBOW_TROUT */ &cKF_bs_r_act_mus_niji_a1, +/* STRINGFISH */ &cKF_bs_r_act_mus_ito_a1, +/* SALMON */ &cKF_bs_r_act_mus_sake_a1, +/* GOLDFISH */ &cKF_bs_r_act_mus_kingyo_a1, +/* PIRANHA */ &cKF_bs_r_act_mus_pirania_a1, +/* AROWANA */ &cKF_bs_r_act_mus_aroana_a1, +/* EEL */ &cKF_bs_r_act_mus_unagi_a1, +/* FRESHWATER_GOBY */ &cKF_bs_r_act_mus_donko_a1, +/* ANGELFISH */ &cKF_bs_r_act_mus_angel_a1, +/* GUPPY */ &cKF_bs_r_act_mus_gupi_a1, +/* POPEYED_GOLDFISH */ &cKF_bs_r_act_mus_demekin_a1, +/* COELACANTH */ &cKF_bs_r_act_mus_kaseki_a1, +/* CRAWFISH */ &cKF_bs_r_act_mus_zari, +/* FROG */ &cKF_bs_r_act_mus_kaeru_a1, +/* KILLIFISH */ &cKF_bs_r_act_mus_medaka_a1, +/* JELLYFISH */ NULL, +/* SEA_BASS */ &cKF_bs_r_act_mus_suzuki_a1, +/* RED_SNAPPER */ &cKF_bs_r_act_mus_tai_a1, +/* BARRED_KNIFEJAW */ &cKF_bs_r_act_mus_isidai_a1, +/* ARAPAIMA */ &cKF_bs_r_act_mus_pira_a1 +}; + +cKF_Animation_R_c* mfish_anime_init_tbl[40] = { +/* CRUCIAN_CARP */ &cKF_ba_r_act_mus_funa_a1, +/* BROOK_TROUT */ &cKF_ba_r_act_mus_hera_a1, +/* CARP */ &cKF_ba_r_act_mus_koi_a1, +/* KOI */ &cKF_ba_r_act_mus_nisiki_a1, +/* CATFISH */ &cKF_ba_r_act_mus_namazu_a1, +/* SMALL_BASS */ &cKF_ba_r_act_mus_bass_a1, +/* BASS */ &cKF_ba_r_act_mus_bassm_a1, +/* LARGE_BASS */ &cKF_ba_r_act_mus_bassl_a1, +/* BLUEGILL */ &cKF_ba_r_act_mus_gill_a1, +/* GIANT_CATFISH */ &cKF_ba_r_act_mus_onamazu_a1, +/* GIANT_SNAKEHEAD */ &cKF_ba_r_act_mus_raigyo_a1, +/* BARBEL_STEED */ &cKF_ba_r_act_mus_nigoi_a1, +/* DACE */ &cKF_ba_r_act_mus_ugui_a1, +/* PALE_CHUB */ &cKF_ba_r_act_mus_oikawa_a1, +/* BITTERLING */ &cKF_ba_r_act_mus_tanago_a1, +/* LOACH */ &cKF_ba_r_act_mus_dojyo_a1, +/* POND_SMELT */ &cKF_ba_r_act_mus_wakasa_a1, +/* SWEETFISH */ &cKF_ba_r_act_mus_ayu_a1, +/* CHERRY_SALMON */ &cKF_ba_r_act_mus_yamame_a1, +/* LARGE_CHAR */ &cKF_ba_r_act_mus_iwana_a1, +/* RAINBOW_TROUT */ &cKF_ba_r_act_mus_niji_a1, +/* STRINGFISH */ &cKF_ba_r_act_mus_ito_a1, +/* SALMON */ &cKF_ba_r_act_mus_sake_a1, +/* GOLDFISH */ &cKF_ba_r_act_mus_kingyo_a1, +/* PIRANHA */ &cKF_ba_r_act_mus_pirania_a1, +/* AROWANA */ &cKF_ba_r_act_mus_aroana_a1, +/* EEL */ &cKF_ba_r_act_mus_unagi_a2, +/* FRESHWATER_GOBY */ &cKF_ba_r_act_mus_donko_a1, +/* ANGELFISH */ &cKF_ba_r_act_mus_angel_a1, +/* GUPPY */ &cKF_ba_r_act_mus_gupi_a1, +/* POPEYED_GOLDFISH */ &cKF_ba_r_act_mus_demekin_a1, +/* COELACANTH */ &cKF_ba_r_act_mus_kaseki_a1, +/* CRAWFISH */ &cKF_ba_r_act_mus_zari, +/* FROG */ &cKF_ba_r_act_mus_kaeru_a1, +/* KILLIFISH */ &cKF_ba_r_act_mus_medaka_a1, +/* JELLYFISH */ NULL, +/* SEA_BASS */ &cKF_ba_r_act_mus_suzuki_a1, +/* RED_SNAPPER */ &cKF_ba_r_act_mus_tai_a1, +/* BARRED_KNIFEJAW */ &cKF_ba_r_act_mus_isidai_a1, +/* ARAPAIMA */ &cKF_ba_r_act_mus_pira_a1 +}; + +MUSEUM_FISH_INIT_DATA mfish_init_data[40] = { +/* CRUCIAN_CARP */ { 0.0100f, 3.8f, 7.5f, 74.0f, 0.400f, 0.450f, 0.98995f, 0.2f, 0.40f, -3.5f, -6.0f, 120, 120, DEG2SHORT_ANGLE(70) }, +/* BROOK_TROUT */ { 0.0100f, 4.6f, 7.0f, 78.0f, 0.400f, 0.600f, 0.98995f, 0.2f, 0.40f, -3.5f, -6.0f, 100, 160, DEG2SHORT_ANGLE(70) }, +/* CARP */ { 0.0100f, 6.0f, 10.6f, 80.0f, 0.350f, 0.300f, 0.98995f, 0.2f, 0.60f, -5.0f, -9.0f, 100, 150, DEG2SHORT_ANGLE(90) }, +/* KOI */ { 0.0100f, 6.0f, 10.7f, 85.0f, 0.350f, 0.300f, 0.98995f, 0.2f, 0.60f, -5.0f, -9.0f, 100, 120, DEG2SHORT_ANGLE(90) }, +/* CATFISH */ { 0.0110f, 6.0f, 13.6f, 63.0f, 0.050f, 0.075f, 0.995f, 0.4f, 0.85f, -2.5f, -10.0f, 600, 900, DEG2SHORT_ANGLE(60) }, +/* SMALL_BASS */ { 0.0110f, 3.0f, 8.0f, 85.0f, 0.700f, 0.500f, 0.97468f, 0.2f, 0.30f, -4.0f, -6.0f, 100, 100, DEG2SHORT_ANGLE(70) }, +/* BASS */ { 0.0110f, 4.7f, 9.8f, 92.0f, 0.700f, 0.500f, 0.97468f, 0.2f, 0.60f, -5.0f, -8.0f, 150, 110, DEG2SHORT_ANGLE(70) }, +/* LARGE_BASS */ { 0.0110f, 5.5f, 12.0f, 90.0f, 0.600f, 0.500f, 0.97468f, 0.2f, 0.80f, -5.5f, -10.0f, 160, 120, DEG2SHORT_ANGLE(70) }, +/* BLUEGILL */ { 0.0100f, 4.3f, 6.1f, 95.0f, 0.700f, 0.500f, 0.97468f, 0.2f, 0.30f, -3.5f, -5.0f, 80, 80, DEG2SHORT_ANGLE(70) }, +/* GIANT_CATFISH */ { 0.0120f, 7.6f, 19.4f, 65.0f, 0.075f, 0.150f, 0.995f, 0.4f, 0.95f, -6.0f, -18.0f, 720, 1000, DEG2SHORT_ANGLE(60) }, +/* GIANT_SNAKEHEAD */ { 0.0120f, 9.6f, 20.8f, 65.0f, 0.050f, 0.100f, 0.98488998f, 0.4f, 0.95f, -13.0f, -19.0f, 240, 480, DEG2SHORT_ANGLE(90) }, +/* BARBEL_STEED */ { 0.0100f, 4.8f, 10.5f, 102.0f, 0.350f, 0.300f, 0.98995f, 0.2f, 0.70f, -3.5f, -9.0f, 150, 120, DEG2SHORT_ANGLE(70) }, +/* DACE */ { 0.0100f, 3.0f, 10.6f, 75.0f, 0.750f, 1.500f, 0.94867998f, 0.2f, 0.60f, -4.5f, -8.0f, 480, 150, DEG2SHORT_ANGLE(45) }, +/* PALE_CHUB */ { 0.0100f, 2.5f, 7.0f, 90.0f, 0.050f, 0.475f, 0.94867998f, 0.4f, 0.30f, -3.5f, -6.0f, 240, 200, DEG2SHORT_ANGLE(50) }, +/* BITTERLING */ { 0.0100f, 3.5f, 6.0f, 76.0f, 0.350f, 0.400f, 0.98995f, 0.4f, 0.40f, -3.0f, -6.0f, 100, 120, DEG2SHORT_ANGLE(45) }, +/* LOACH */ { 0.0100f, 4.0f, 6.4f, 65.0f, 0.100f, 0.150f, 0.89442998f, 0.4f, 0.20f, -2.0f, -6.0f, 240, 240, DEG2SHORT_ANGLE(50) }, +/* POND_SMELT */ { 0.0100f, 2.0f, 6.0f, 96.0f, 0.100f, 0.450f, 0.92194998f, 0.2f, 0.10f, -3.5f, -6.0f, 300, 120, DEG2SHORT_ANGLE(50) }, +/* SWEETFISH */ { 0.0100f, 3.0f, 9.8f, 75.0f, 1.000f, 1.500f, 0.94867998f, 0.2f, 0.50f, -3.5f, -7.5f, 480, 120, DEG2SHORT_ANGLE(45) }, +/* CHERRY_SALMON */ { 0.0100f, 3.5f, 9.3f, 85.0f, 0.750f, 1.000f, 0.94867998f, 0.2f, 0.50f, -3.0f, -8.0f, 540, 120, DEG2SHORT_ANGLE(45) }, +/* LARGE_CHAR */ { 0.0100f, 2.5f, 10.6f, 80.0f, 0.750f, 1.000f, 0.94867998f, 0.2f, 0.70f, -3.0f, -9.0f, 600, 140, DEG2SHORT_ANGLE(70) }, +/* RAINBOW_TROUT */ { 0.0100f, 2.5f, 8.8f, 80.0f, 0.500f, 1.000f, 0.94867998f, 0.2f, 0.50f, -4.0f, -7.0f, 660, 160, DEG2SHORT_ANGLE(45) }, +/* STRINGFISH */ { 0.0120f, 6.1f, 19.8f, 75.0f, 0.050f, 0.100f, 0.98488998f, 0.4f, 0.95f, -14.0f, -19.0f, 360, 720, DEG2SHORT_ANGLE(90) }, +/* SALMON */ { 0.0140f, 6.2f, 15.0f, 80.0f, 0.300f, 1.000f, 0.995f, 0.1f, 0.70f, -6.0f, -10.0f, 120, 220, DEG2SHORT_ANGLE(40) }, +/* GOLDFISH */ { 0.0080f, 2.2f, 4.9f, 90.0f, 0.000f, 0.250f, 0.89442998f, 0.2f, 0.10f, -1.5f, -3.0f, 120, 240, DEG2SHORT_ANGLE(50) }, +/* PIRANHA */ { 0.0120f, 4.2f, 7.0f, 75.0f, 0.750f, 1.000f, 0.94867998f, 0.2f, 0.40f, -3.5f, -6.0f, 240, 240, DEG2SHORT_ANGLE(90) }, +/* AROWANA */ { 0.0130f, 5.0f, 13.4f, 70.0f, 0.500f, 0.750f, 0.98995f, 0.2f, 0.60f, -4.5f, -12.0f, 240, 300, DEG2SHORT_ANGLE(60) }, +/* EEL */ { 0.0095f, 3.4f, 15.0f, 55.0f, 0.200f, 0.250f, 0.98995f, 0.6f, 0.70f, -13.5f, -4.0f, 60, 1120, DEG2SHORT_ANGLE(70) }, +/* FRESHWATER_GOBY */ { 0.0120f, 3.3f, 8.0f, 75.0f, 0.300f, 0.600f, 0.97468f, 0.2f, 0.20f, -2.0f, -7.0f, 240, 240, DEG2SHORT_ANGLE(70) }, +/* ANGELFISH */ { 0.0100f, 5.1f, 6.0f, 85.0f, 0.200f, 0.200f, 0.94867998f, 0.5f, 0.20f, -3.0f, -4.0f, 120, 360, DEG2SHORT_ANGLE(50) }, +/* GUPPY */ { 0.0080f, 2.7f, 4.9f, 96.0f, 0.200f, 0.400f, 0.89442998f, 0.5f, 0.10f, -3.0f, -3.0f, 120, 360, DEG2SHORT_ANGLE(30) }, +/* POPEYED_GOLDFISH */ { 0.0080f, 2.5f, 4.9f, 102.0f, 0.000f, 0.250f, 0.89442998f, 0.2f, 0.10f, -2.0f, -3.0f, 120, 240, DEG2SHORT_ANGLE(50) }, +/* COELACANTH */ { 0.0160f, 7.1f, 22.8f, 65.0f, 0.100f, 0.300f, 0.98995f, 0.4f, 0.85f, -2.5f, -20.5f, 300, 420, DEG2SHORT_ANGLE(20) }, +/* CRAWFISH */ { 0.0165f, 5.8f, 10.4f, 70.0f, -0.050f, 0.150f, 0.94867998f, 0.2f, 0.40f, 5.0f, -14.0f, 120, 180, DEG2SHORT_ANGLE(70) }, +/* FROG */ { 0.0100f, 1.0f, 1.0f, 70.0f, 0.500f, 0.500f, 0.94867998f, 0.2f, 0.40f, -1.0f, -9.0f, 120, 180, DEG2SHORT_ANGLE(70) }, +/* KILLIFISH */ { 0.0080f, 1.5f, 3.9f, 102.0f, 0.150f, 0.400f, 0.89442998f, 0.1f, 0.40f, -1.0f, -3.0f, 120, 360, DEG2SHORT_ANGLE(30) }, +/* JELLYFISH */ { 0.0100f, 4.0f, 5.5f, 70.0f, 0.200f, 0.150f, 0.94867998f, 0.1f, 0.40f, -1.0f, -3.0f, 60, 120, DEG2SHORT_ANGLE(70) }, +/* SEA_BASS */ { 0.0100f, 4.0f, 9.5f, 80.0f, 0.300f, 0.800f, 0.995f, 0.1f, 0.75f, -3.5f, -5.0f, 160, 200, DEG2SHORT_ANGLE(25) }, +/* RED_SNAPPER */ { 0.0100f, 6.0f, 11.4f, 90.0f, 0.250f, 0.350f, 0.995f, 0.2f, 0.45f, -6.0f, -6.5f, 120, 240, DEG2SHORT_ANGLE(30) }, +/* BARRED_KNIFEJAW */ { 0.0100f, 5.0f, 10.9f, 95.0f, 0.250f, 0.450f, 0.995f, 0.2f, 0.40f, -5.0f, -6.0f, 120, 240, DEG2SHORT_ANGLE(30) }, +/* ARAPAIMA */ { 0.0120f, 9.3f, 31.5f, 75.0f, 0.050f, 0.100f, 0.97468f, 0.2f, 0.90f, -14.0f, -31.0f, 240, 480, DEG2SHORT_ANGLE(90) } +}; + +s16 mfish_group_tbl[40] = { +/* CRUCIAN_CARP */ 0, +/* BROOK_TROUT */ 0, +/* CARP */ 0, +/* KOI */ 0, +/* CATFISH */ 1, +/* SMALL_BASS */ 1, +/* BASS */ 1, +/* LARGE_BASS */ 1, +/* BLUEGILL */ 1, +/* GIANT_CATFISH */ 1, +/* GIANT_SNAKEHEAD */ 3, +/* BARBEL_STEED */ 0, +/* DACE */ 2, +/* PALE_CHUB */ 2, +/* BITTERLING */ 0, +/* LOACH */ 1, +/* POND_SMELT */ 2, +/* SWEETFISH */ 2, +/* CHERRY_SALMON */ 2, +/* LARGE_CHAR */ 2, +/* RAINBOW_TROUT */ 2, +/* STRINGFISH */ 2, +/* SALMON */ 4, +/* GOLDFISH */ 0, +/* PIRANHA */ 3, +/* AROWANA */ 3, +/* EEL */ 0, +/* FRESHWATER_GOBY */ 1, +/* ANGELFISH */ 3, +/* GUPPY */ 3, +/* POPEYED_GOLDFISH */ 0, +/* COELACANTH */ 4, +/* CRAWFISH */ 2, +/* FROG */ 1, +/* KILLIFISH */ 0, +/* JELLYFISH */ 4, +/* SEA_BASS */ 4, +/* RED_SNAPPER */ 4, +/* BARRED_KNIFEJAW */ 4, +/* ARAPAIMA */ 3 +}; + +PRIV_FISH_CONSTRUCTOR mfish_ct[40] = { +/* CRUCIAN_CARP */ mfish_afish_ct, +/* BROOK_TROUT */ mfish_afish_ct, +/* CARP */ mfish_koi_ct, +/* KOI */ mfish_koi_ct, +/* CATFISH */ mfish_namazu_ct, +/* SMALL_BASS */ mfish_bass_ct, +/* BASS */ mfish_bass_ct, +/* LARGE_BASS */ mfish_bass_ct, +/* BLUEGILL */ mfish_bass_ct, +/* GIANT_CATFISH */ mfish_namazu_ct, +/* GIANT_SNAKEHEAD */ mfish_big_fish_ct, +/* BARBEL_STEED */ mfish_koi_ct, +/* DACE */ mfish_ani_base_ct, +/* PALE_CHUB */ mfish_small_fish_ct, +/* BITTERLING */ mfish_afish_ct, +/* LOACH */ mfish_dojou_ct, +/* POND_SMELT */ mfish_small_fish_ct, +/* SWEETFISH */ mfish_ani_base_ct, +/* CHERRY_SALMON */ mfish_ani_base_ct, +/* LARGE_CHAR */ mfish_ani_base_ct, +/* RAINBOW_TROUT */ mfish_ani_base_ct, +/* STRINGFISH */ mfish_ito_ct, +/* SALMON */ mfish_seafish_ct, +/* GOLDFISH */ mfish_kingyo_ct, +/* PIRANHA */ mfish_ani_base_ct, +/* AROWANA */ mfish_aroana_ct, +/* EEL */ mfish_unagi_ct, +/* FRESHWATER_GOBY */ mfish_donko_ct, +/* ANGELFISH */ mfish_small_fish_ct, +/* GUPPY */ mfish_gupi_ct, +/* POPEYED_GOLDFISH */ mfish_kingyo_ct, +/* COELACANTH */ mfish_kaseki_ct, +/* CRAWFISH */ mfish_zarigani_ct, +/* FROG */ mfish_kaeru_ct, +/* KILLIFISH */ mfish_medaka_ct, +/* JELLYFISH */ mfish_kurage_ct, +/* SEA_BASS */ mfish_seafish_ct, +/* RED_SNAPPER */ mfish_tai_ct, +/* BARRED_KNIFEJAW */ mfish_tai_ct, +/* ARAPAIMA */ mfish_big_fish_ct +}; + +PRIV_FISH_MOVE mfish_mv[40] = { +/* CRUCIAN_CARP */ mfish_afish_mv, +/* BROOK_TROUT */ mfish_afish_mv, +/* CARP */ mfish_koi_mv, +/* KOI */ mfish_koi_mv, +/* CATFISH */ mfish_namazu_mv, +/* SMALL_BASS */ mfish_bass_mv, +/* BASS */ mfish_bass_mv, +/* LARGE_BASS */ mfish_bass_mv, +/* BLUEGILL */ mfish_bass_mv, +/* GIANT_CATFISH */ mfish_namazu_mv, +/* GIANT_SNAKEHEAD */ mfish_big_fish_mv, +/* BARBEL_STEED */ mfish_koi_mv, +/* DACE */ mfish_ani_base_mv, +/* PALE_CHUB */ mfish_small_fish_mv, +/* BITTERLING */ mfish_afish_mv, +/* LOACH */ mfish_dojou_mv, +/* POND_SMELT */ mfish_small_fish_mv, +/* SWEETFISH */ mfish_ani_base_mv, +/* CHERRY_SALMON */ mfish_ani_base_mv, +/* LARGE_CHAR */ mfish_ani_base_mv, +/* RAINBOW_TROUT */ mfish_ani_base_mv, +/* STRINGFISH */ mfish_ito_mv, +/* SALMON */ mfish_seafish_mv, +/* GOLDFISH */ mfish_kingyo_mv, +/* PIRANHA */ mfish_ani_base_mv, +/* AROWANA */ mfish_aroana_mv, +/* EEL */ mfish_unagi_mv, +/* FRESHWATER_GOBY */ mfish_donko_mv, +/* ANGELFISH */ mfish_small_fish_mv, +/* GUPPY */ mfish_gupi_mv, +/* POPEYED_GOLDFISH */ mfish_kingyo_mv, +/* COELACANTH */ mfish_kaseki_mv, +/* CRAWFISH */ mfish_zarigani_mv, +/* FROG */ mfish_kaeru_mv, +/* KILLIFISH */ mfish_medaka_mv, +/* JELLYFISH */ mfish_kurage_mv, +/* SEA_BASS */ mfish_seafish_mv, +/* RED_SNAPPER */ mfish_tai_mv, +/* BARRED_KNIFEJAW */ mfish_tai_mv, +/* ARAPAIMA */ mfish_big_fish_mv +}; + + +PRIV_FISH_DRAW mfish_dw[40] = { +/* CRUCIAN_CARP */ mfish_afish_dw, +/* BROOK_TROUT */ mfish_afish_dw, +/* CARP */ mfish_koi_dw, +/* KOI */ mfish_koi_dw, +/* CATFISH */ mfish_namazu_dw, +/* SMALL_BASS */ mfish_bass_dw, +/* BASS */ mfish_bass_dw, +/* LARGE_BASS */ mfish_bass_dw, +/* BLUEGILL */ mfish_bass_dw, +/* GIANT_CATFISH */ mfish_namazu_dw, +/* GIANT_SNAKEHEAD */ mfish_big_fish_dw, +/* BARBEL_STEED */ mfish_koi_dw, +/* DACE */ mfish_ani_base_dw, +/* PALE_CHUB */ mfish_small_fish_dw, +/* BITTERLING */ mfish_afish_dw, +/* LOACH */ mfish_dojou_dw, +/* POND_SMELT */ mfish_small_fish_dw, +/* SWEETFISH */ mfish_ani_base_dw, +/* CHERRY_SALMON */ mfish_ani_base_dw, +/* LARGE_CHAR */ mfish_ani_base_dw, +/* RAINBOW_TROUT */ mfish_ani_base_dw, +/* STRINGFISH */ mfish_ito_dw, +/* SALMON */ mfish_seafish_dw, +/* GOLDFISH */ mfish_kingyo_dw, +/* PIRANHA */ mfish_ani_base_dw, +/* AROWANA */ mfish_aroana_dw, +/* EEL */ mfish_unagi_dw, +/* FRESHWATER_GOBY */ mfish_donko_dw, +/* ANGELFISH */ mfish_small_fish_dw, +/* GUPPY */ mfish_gupi_dw, +/* POPEYED_GOLDFISH */ mfish_kingyo_dw, +/* COELACANTH */ mfish_kaseki_dw, +/* CRAWFISH */ mfish_zarigani_dw, +/* FROG */ mfish_kaeru_dw, +/* KILLIFISH */ mfish_medaka_dw, +/* JELLYFISH */ mfish_kurage_dw, +/* SEA_BASS */ mfish_ani_base_dw, +/* RED_SNAPPER */ mfish_tai_dw, +/* BARRED_KNIFEJAW */ mfish_tai_dw, +/* ARAPAIMA */ mfish_big_fish_dw +}; + +xyz_t unagi_rail_pos[25] = { + { 228.0f, 57.0f, 192.0f }, + { 231.0f, 57.0f, 203.0f }, + { 237.0f, 57.0f, 215.0f }, + { 245.0f, 58.0f, 225.0f }, + { 252.0f, 59.0f, 233.0f }, + { 254.0f, 60.0f, 245.0f }, + { 248.0f, 60.0f, 255.0f }, + { 238.0f, 60.0f, 256.0f }, + { 231.0f, 60.0f, 247.0f }, + { 222.0f, 60.0f, 240.0f }, + { 212.0f, 60.0f, 243.0f }, + { 203.0f, 60.0f, 249.0f }, + { 196.0f, 60.0f, 248.0f }, + { 191.0f, 60.0f, 241.0f }, + { 191.0f, 60.0f, 234.0f }, + { 187.0f, 60.0f, 223.0f }, + { 183.0f, 60.0f, 212.0f }, + { 181.0f, 60.0f, 203.0f }, + { 182.0f, 57.0f, 191.0f }, + { 187.0f, 56.0f, 183.0f }, + { 193.0f, 56.0f, 176.0f }, + { 201.0f, 56.0f, 172.0f }, + { 209.0f, 56.0f, 173.0f }, + { 216.0f, 56.0f, 176.0f }, + { 221.0f, 56.0f, 182.0f } +}; + +xyz_t unagi_rail_pos2[20] = { + { 228.0f, 57.0f, 192.0f }, + { 236.0f, 57.0f, 201.0f }, + { 244.0f, 57.0f, 204.0f }, + { 250.0f, 58.0f, 213.0f }, + { 254.0f, 59.0f, 225.0f }, + { 250.0f, 60.0f, 238.0f }, + { 243.0f, 60.0f, 242.0f }, + { 235.0f, 60.0f, 238.0f }, + { 226.0f, 60.0f, 233.0f }, + { 215.0f, 60.0f, 229.0f }, + { 205.0f, 60.0f, 228.0f }, + { 198.0f, 60.0f, 229.0f }, + { 191.0f, 60.0f, 227.0f }, + { 186.0f, 60.0f, 222.0f }, + { 181.0f, 60.0f, 216.0f }, + { 181.0f, 60.0f, 207.0f }, + { 184.0f, 60.0f, 196.0f }, + { 191.0f, 60.0f, 186.0f }, + { 201.0f, 57.0f, 177.0f }, + { 213.0f, 56.0f, 178.0f } +}; + +xyz_t unagi_rail_pos3[25] = { + { 228.0f, 57.0f, 192.0f }, + { 231.0f, 57.0f, 203.0f }, + { 229.0f, 57.0f, 213.0f }, + { 222.0f, 58.0f, 225.0f }, + { 212.0f, 59.0f, 226.0f }, + { 204.0f, 60.0f, 227.0f }, + { 197.0f, 60.0f, 230.0f }, + { 193.0f, 60.0f, 236.0f }, + { 195.0f, 60.0f, 246.0f }, + { 201.0f, 60.0f, 253.0f }, + { 212.0f, 60.0f, 256.0f }, + { 222.0f, 60.0f, 255.0f }, + { 237.0f, 60.0f, 254.0f }, + { 243.0f, 60.0f, 246.0f }, + { 240.0f, 60.0f, 232.0f }, + { 232.0f, 60.0f, 227.0f }, + { 223.0f, 60.0f, 225.0f }, + { 209.0f, 60.0f, 225.0f }, + { 198.0f, 60.0f, 220.0f }, + { 190.0f, 60.0f, 209.0f }, + { 187.0f, 60.0f, 196.0f }, + { 191.0f, 60.0f, 184.0f }, + { 197.0f, 60.0f, 178.0f }, + { 207.0f, 59.0f, 173.0f }, + { 221.0f, 57.0f, 180.0f } +}; + +xyz_t unagi_normal_to_reverse_rail_pos[12] = { + { 228.0f, 57.0f, 192.0f }, + { 236.0f, 57.0f, 201.0f }, + { 244.0f, 57.0f, 204.0f }, + { 250.0f, 58.0f, 213.0f }, + { 254.0f, 59.0f, 225.0f }, + { 250.0f, 60.0f, 238.0f }, + { 243.0f, 60.0f, 242.0f }, + { 235.0f, 60.0f, 236.0f }, + { 226.0f, 60.0f, 228.0f }, + { 225.0f, 60.0f, 219.0f }, + { 228.0f, 58.0f, 208.0f }, + { 228.0f, 57.0f, 192.0f } +}; + +xyz_t unagi_reverse_to_normal_rail_pos[19] = { + { 228.0f, 57.0f, 192.0f }, + { 218.0f, 56.0f, 178.0f }, + { 204.0f, 57.0f, 176.0f }, + { 191.0f, 58.0f, 186.0f }, + { 184.0f, 59.0f, 196.0f }, + { 189.0f, 60.0f, 208.0f }, + { 198.0f, 60.0f, 215.0f }, + { 205.0f, 60.0f, 224.0f }, + { 204.0f, 60.0f, 235.0f }, + { 196.0f, 60.0f, 242.0f }, + { 188.0f, 60.0f, 241.0f }, + { 183.0f, 60.0f, 233.0f }, + { 180.0f, 60.0f, 219.0f }, + { 181.0f, 60.0f, 207.0f }, + { 184.0f, 60.0f, 196.0f }, + { 191.0f, 59.0f, 186.0f }, + { 204.0f, 57.0f, 176.0f }, + { 218.0f, 56.0f, 178.0f }, + { 228.0f, 57.0f, 192.0f } +}; + +xyz_t *unagi_rail_tbl[3] = { + unagi_rail_pos, + unagi_rail_pos2, + unagi_rail_pos3 +}; + +int unagi_rail_num_tbl[3] = { + ARRAY_LEN(unagi_rail_pos), + ARRAY_LEN(unagi_rail_pos2), + ARRAY_LEN(unagi_rail_pos3), +}; + +#include "../src/actor/ac_museum_fish_base.c_inc" + +// clang-format on + +void Museum_Fish_Prv_data_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game, int fishNum, int r6) { + actor->fishIDEnum = fishNum; + actor->init_data = mfish_init_data[fishNum]; + actor->group = mfish_group_tbl[fishNum]; + + if (actor->group >= 0) { + actor->position = suisou_pos[actor->group]; + } else { + actor->position = ZeroVec; + } + + actor->position.y = mfish_init_data[fishNum]._0C + RANDOM2_F(10); + if (r6 == 1) { + actor->position.x += RANDOM2_F(90.f); + actor->position.z += RANDOM2_F(90.f); + } + actor->currentProcess = &mfish_normal_process; + mfish_ct[fishNum](actor, game); +} + +// clang-format off +cKF_Skeleton_R_c* kusa_model[14] = { + &cKF_bs_r_obj_museum5_kusa1, + &cKF_bs_r_obj_museum5_kusa1, + &cKF_bs_r_obj_museum5_kusa1, + &cKF_bs_r_obj_museum5_kusa1, + &cKF_bs_r_obj_museum5_kusa1, + &cKF_bs_r_obj_museum5_kusa2, + &cKF_bs_r_obj_museum5_kusa2, + &cKF_bs_r_obj_museum5_kusa2, + &cKF_bs_r_obj_museum5_kusa2, + &cKF_bs_r_obj_museum5_kusa2, + &cKF_bs_r_obj_museum5_kusa3, + &cKF_bs_r_obj_museum5_kusa3, + &cKF_bs_r_obj_museum5_kusa3, + &cKF_bs_r_obj_museum5_kusa3 +}; +cKF_Animation_R_c* kusa_anime[14]= { + &cKF_ba_r_obj_museum5_kusa1, + &cKF_ba_r_obj_museum5_kusa1, + &cKF_ba_r_obj_museum5_kusa1, + &cKF_ba_r_obj_museum5_kusa1, + &cKF_ba_r_obj_museum5_kusa1, + &cKF_ba_r_obj_museum5_kusa2, + &cKF_ba_r_obj_museum5_kusa2, + &cKF_ba_r_obj_museum5_kusa2, + &cKF_ba_r_obj_museum5_kusa2, + &cKF_ba_r_obj_museum5_kusa2, + &cKF_ba_r_obj_museum5_kusa3, + &cKF_ba_r_obj_museum5_kusa3, + &cKF_ba_r_obj_museum5_kusa3, + &cKF_ba_r_obj_museum5_kusa3 +}; + +float kusa_start_frame[14] = { + 25.0f, 0.0f, 25.0f, 0.0f, 50.0f, 0.0f, 20.0f, 60.0f, 80.0f, 0.0f, 0.0f, 25.0f, 0.0f, 75.0f +}; +// clang-format on + +void Museum_Fish_Actor_ct(ACTOR* actorx, GAME* gamex) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + int i; + MUSEUM_FISH_PRIVATE_DATA* prv; + MF_Control_Actor = actor; + actor->_14db6 = 0x1e; + + mfish_point_light_ct(actorx, gamex); + + for (i = 0; i < 14; i++) { + // 0x0060 : kusa_group_tbl + // 0x1300 : kusa_model + // 0x1338 : kusa_anime + // 0x1370 : kusa_start_frame + actor->prvKusa[i]._54C = kusa_model[i]; + 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, kusa_anime[i], NULL, + kusa_group_tbl[i] == 2 ? 1.5f : 0.5f, 0.0f); + 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(aGYO_TYPE_FROG)) { + actor->prvFish[aGYO_TYPE_FROG]._590 = &actor->_14788; + } else { + mfish_hasu_ct(&actor->_14788, gamex); + } + + prv = actor->prvFish; + for (i = 0; i < aGYO_TYPE_NUM; i++, prv++) { + prv->_62E_flags &= ~1; + if (mMmd_FishInfo(i)) { + prv->_38._54C = mfish_model_tbl[i]; + prv->_38._550[0] = mfish_anime_init_tbl[i]; + prv->_62E_flags |= 1; + Museum_Fish_Prv_data_init(prv, gamex, i, 1); + } + } + + for (i = 0; i < 20; i++) { + actor->_14d50[i] = RANDOMF_RANGE(40, 120); + actor->_14d78[i] = RANDOMF_RANGE(2, 5); + } +} + +void Museum_Fish_Actor_dt(ACTOR* actor, GAME* game) { + mfish_point_light_dt(actor, game); +} + +int Museum_Fish_GetMsgNo(ACTOR* actorx) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + + static u8 item_name[mIN_ITEM_NAME_LEN]; + int itemArticle; + mMsg_Window_c* msg; + + int fishInfo = actor->fishDisplayMsgInfo[actor->fishDisplayMsgIter].fishInfo; + mActor_name_t fishName = mNT_FishIdx2FishItemNo(actor->fishDisplayMsgInfo[actor->fishDisplayMsgIter].fishName); + mIN_copy_name_str(item_name, fishName); + mMsg_Set_item_str_art(mMsg_Get_base_window_p(), 0, item_name, 0x10, mIN_get_item_article(fishName)); + + if (fishInfo >= 1 && fishInfo <= 4) { + mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, + common_data.save.save.private_data[fishInfo - 1].player_ID.player_name, 8); + } + + if (actor->fishDisplayMsgIter < actor->numFishDisplayed - 1) { + if (fishInfo >= 1 && fishInfo <= 4) { + return 0x2fa2; + } else { + return 0x2fa3; + } + } + + if (fishInfo >= 1 && fishInfo <= 4) { + return 0x2f9f; + } else { + return 0x2fa0; + } +} + +BOOL Museum_Fish_Check_Talk_Distance(GAME* gamex, int index) { + GAME_PLAY* game = (GAME_PLAY*)gamex; + s16 subAngle; + xyz_t pos; + PLAYER_ACTOR* actor; + + // fish tank locations? + static xyz_t kanban_pos[5] = { { 260.0f, 40.0f, 300.0f }, + { 460.0f, 40.0f, 300.0f }, + { 260.0f, 40.0f, 540.0f }, + { 460.0f, 40.0f, 540.0f }, + { 500.0f, 40.0f, 60.0f } }; + + actor = get_player_actor_withoutCheck(game); + subAngle = DEG2SHORT_ANGLE(-180) + actor->actor_class.world.angle.y; + xyz_t_sub(&actor->actor_class.world.position, &kanban_pos[index], &pos); + + if (ABS(pos.x) < 20.0f && ABS(pos.z) < 20.0f && ABS(subAngle) < 0x3000) { + return TRUE; + } + return FALSE; +} + +void Museum_Fish_Set_MsgFishInfo(ACTOR* actorx, int param2) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + int i; + // defines how many fish are in each grouping of fish names + static int group_max_num[5] = { 10, 9, 9, 6, 6 }; + static int group_A_fish_name[10] = { 0, 1, 2, 3, 11, 14, 26, 23, 30, 34 }; + static int group_B_fish_name[9] = { 4, 9, 15, 8, 5, 6, 7, 27, 33 }; + static int group_C_fish_name[9] = { 12, 13, 16, 17, 18, 20, 19, 21, 32 }; + static int group_D_fish_name[6] = { 10, 29, 28, 24, 25, 39 }; + static int group_E_fish_name[6] = { 22, 31, 35, 36, 37, 38 }; + + static int* group_fish_name[5] = { group_A_fish_name, group_B_fish_name, group_C_fish_name, group_D_fish_name, + group_E_fish_name }; + + actor->numFishDisplayed = 0; + actor->fishDisplayMsgIter = 0; + for (i = 0; i < group_max_num[param2]; i++) { + s16 fishName = group_fish_name[param2][i]; + s16 fishInfo = mMmd_FishInfo(fishName); // is this fish on display? + if (fishInfo != 0) { + actor->fishDisplayMsgInfo[actor->numFishDisplayed].fishName = fishName; // add info to list + actor->fishDisplayMsgInfo[actor->numFishDisplayed].fishInfo = fishInfo; + actor->numFishDisplayed++; // incrememnt counter of fish on display + } + } + + return; +} + +void Museum_Fish_set_talk_info(ACTOR* actorx) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + + static rgba_t window_color = { 255, 255, 0xcd, 255 }; + int r3; + if (actor->numFishDisplayed > 0) { // maybe related to if there are fish in the tank + r3 = Museum_Fish_GetMsgNo(actorx); + actor->fishDisplayMsgIter++; // maybe iterating through the fish donation record, given which fish are donated? + } else { + r3 = 0x2fa1; + } + + mDemo_Set_msg_num(r3); + mDemo_Set_talk_window_color(&window_color); + mDemo_Set_talk_display_name(0); + mDemo_Set_ListenAble(); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + mDemo_Set_use_zoom_sound(TRUE); +} + +void Museum_Fish_Talk_process(ACTOR* actorx, GAME* game) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + + if (mDemo_Check(8, actorx) != 0) { + GAME_PLAY* _gamePT; + PLAYER_ACTOR* playerActor = get_player_actor_withoutCheck((GAME_PLAY*)game); + s_xyz rotation = playerActor->actor_class.shape_info.rotation; + add_calc_short_angle2(&rotation.y, DEG2SHORT_ANGLE(-180), 0.3f, DEG2SHORT_ANGLE(22.5f), 0); + + _gamePT = (GAME_PLAY*)gamePT; + get_player_actor_withoutCheck(_gamePT)->Set_force_position_angle_proc(&_gamePT->game, NULL, &rotation, 32); + if (mMsg_Check_MainNormalContinue(mMsg_Get_base_window_p()) != 0) { + int choseNum = mChoice_Get_ChoseNum(mChoice_Get_base_window_p()); + if (choseNum != -1) { + if (choseNum == 0) { + mMsg_Window_c* windowC; + int msgNum = Museum_Fish_GetMsgNo(actorx); + actor->fishDisplayMsgIter += 1; + mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), msgNum); + mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); + } else { + mMsg_Set_CancelNormalContinue(mMsg_Get_base_window_p()); + mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); + } + } + } + } else if (chkTrigger(BUTTON_A) != 0 && mDemo_Get_talk_actor() == 0) { + int i; + for (i = 0; i < 5; i++) { + if (Museum_Fish_Check_Talk_Distance(game, i)) { + Museum_Fish_Set_MsgFishInfo(actorx, i); + mDemo_Request(8, actorx, &Museum_Fish_set_talk_info); + } + } + } +} + +void Museum_Fish_Actor_move(ACTOR* actorx, GAME* game) { + int i; + 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(actor, &play->game); + old_14db4 = actor->_14db4; + mfish_get_player_area(actor, &play->game); + + if (actor->_14db4 != old_14db4) { + PLAYER_ACTOR* player; + xyz_t p; + prv = actor->prvFish; + player = get_player_actor_withoutCheck(play); + p = player->actor_class.world.position; + + if (actor->_14db4 == 3) { + actor->prvFish[aGYO_TYPE_GOLDFISH].activityFrameCount = 0; + actor->prvFish[aGYO_TYPE_POPEYED_GOLDFISH].activityFrameCount = 0; + actor->prvFish[aGYO_TYPE_PIRANHA].activityFrameCount = 0; + } else if (actor->_14db4 == 0) { + actor->prvFish[aGYO_TYPE_CARP].activityFrameCount = 20; + actor->prvFish[aGYO_TYPE_KOI].activityFrameCount = 20; + } + + for (i = 0; i < aGYO_TYPE_NUM; i++, prv++) { + f32 v = search_position_distanceXZ(&p, &prv->position); + if (actor->_14db4 == prv->group && v < 60.0f) { + prv->activityFrameCount = RANDOM_F(60); + } + } + } + + 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, -4.0f, 0.5f, 0.5f); + add_calc_short_angle2(&actor->prvKusa[j]._538.y, DEG2SHORT_ANGLE(3.5f), CALC_EASE2(0.1f), 22, 4); + } else { + actor->prvKusa[j]._540.x *= 0.98f; + add_calc_short_angle2(&actor->prvKusa[j]._538.y, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); + } + actor->prvKusa[j]._540.z *= 0.98f; + + 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[j]._538.y, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), 22, 4); + } + + Museum_Fish_Kusa_Check(actor, &play->game); + Museum_Fish_Object_Check(actor, &play->game); + + for (i = 0; i < 20; i++) { + actor->_14d50[i]--; + if (actor->_14d50[i] < 0) { + common_data.clip.effect_clip->effect_make_proc(0x6e, suisou_awa_pos[i], 2, 0, &play->game, -1, + suisou_awa_group[i], 0); + if (actor->_14d78[i] > 0) { + actor->_14d78[i]--; + actor->_14d50[i] = RANDOMF_RANGE(2, 10); + } else { + actor->_14d50[i] = RANDOMF_RANGE(80, 240); + actor->_14d78[i] = RANDOMF_RANGE(2, 5); + } + } + } + + Museum_Fish_Talk_process(actorx, game); + + { + // needs a new variable + MUSEUM_FISH_PRIVATE_DATA* prv = actor->prvFish; + for (i = 0; i < aGYO_TYPE_NUM; i++, prv++) { + if (prv->_62E_flags & 1) { + mfish_mv[i](prv, game); + } + } + } + + if ((actor->prvFish[aGYO_TYPE_FROG]._62E_flags & 1) == 0) { + mfish_hasu_mv(&actor->_14788, game); + } + + for (i = 0; i < 5; i++) { + if (i == 2) { + actor->_14daa[i] += (s16)DEG2SHORT_ANGLE2((float)GETREG(TAKREG, 31) * 0.1f + 0.5f + RANDOM_F(1)); + } else { + actor->_14daa[i] += 8; + } + } +} + +extern Gfx obj_suisou1_model[]; +extern Gfx obj_suisou1_modelT[]; + +extern Gfx obj_museum5_model[]; +extern Gfx obj_museum5_modelT[]; + +void Museum_Fish_Suisou_draw(ACTOR* actorx, GAME* game, int r5) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + GRAPH* graph = play->game.graph; + if (r5 < 4) { + xyz_t* p = &suisou_pos[r5]; + if (mfish_cull_check(game, &suisou_pos[r5], 350.0f, 20.0f, 650.0f)) { + Matrix_translate(suisou_pos[r5].x, 0, suisou_pos[r5].z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + + OPEN_DISP(graph); + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(play->game.graph), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + Setpos_HiliteReflect_xlu_init(&suisou_pos[r5], play); + + gSPDisplayList(NEXT_POLY_OPA_DISP, obj_suisou1_model); + gSPDisplayList(NEXT_POLY_XLU_DISP, obj_suisou1_modelT); + + CLOSE_DISP(graph); + + if ((actor->prvFish[aGYO_TYPE_FROG]._62E_flags & 1) == 0) { + mfish_hasu_dw(&actor->_14788, game); + } + } + } else if (mfish_cull_check(game, &suisou_pos[4], 215.0f, 25.0f, 0.0f)) { + Matrix_scale(0.0625f, 0.0625f, 0.0625f, 0); + OPEN_DISP(graph); + + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(play->game.graph), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + Setpos_HiliteReflect_xlu_init(&suisou_pos[r5], play); + + gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_DOLPHIN); + gDPSetTextureAdjustMode(NEXT_POLY_XLU_DISP, G_TA_DOLPHIN); + gSPDisplayList(NEXT_POLY_OPA_DISP, obj_museum5_model); + gSPDisplayList(NEXT_POLY_XLU_DISP, obj_museum5_modelT); + gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_N64); + gDPSetTextureAdjustMode(NEXT_POLY_XLU_DISP, G_TA_N64); + CLOSE_DISP(graph); + } +} + +BOOL kusa_before_disp(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_num, Gfx** mjoint_m, u8* joint_f, void* arg, + s_xyz* joint1, xyz_t* trans) { + MUSEUM_FISH_KUSA_DATA* actor = (MUSEUM_FISH_KUSA_DATA*)arg; + 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.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->_540.x * (v * joint_num); + trans->z += actor->_540.z * (v * joint_num); + } + return TRUE; +} + +void Museum_Fish_Kusa_Draw(ACTOR* actorx, GAME* game, int r5) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + 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]._70; + } else { + 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, mtx, kusa_before_disp, NULL, &actor->prvKusa[r5]); + } +} + +extern EVW_ANIME_DATA obj_suisou1_evw_anime, obj_museum5_evw_anime; +extern Gfx act_mus_fish_set_mode; + +void Museum_Fish_Actor_draw(ACTOR* actorx, GAME* game) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + int i; + + _texture_z_light_fog_prim(game->graph); + _texture_z_light_fog_prim_xlu(game->graph); + + if (!GETREG(TAKREG, 90)) { + for (i = 0; i < 14; i++) { + Museum_Fish_Kusa_Draw(actorx, game, i); + } + } + + if (!GETREG(TAKREG, 92)) { + MUSEUM_FISH_PRIVATE_DATA* prv; + GRAPH* graph; + graph = play->game.graph; + OPEN_DISP(graph); + gSPDisplayList(NEXT_POLY_OPA_DISP, &act_mus_fish_set_mode); + CLOSE_DISP(graph); + + prv = actor->prvFish; + for (i = 0; i < aGYO_TYPE_NUM; i++, prv++) { + if (prv->_62E_flags & 1 && prv->fishIDEnum != aGYO_TYPE_JELLYFISH && prv->fishIDEnum != aGYO_TYPE_FROG && + mfish_cull_check(game, &prv->_5B8, prv->init_data._08 + 50.0f, prv->init_data._08 + 10.0f, + prv->init_data._08 + 10.0f)) { + mfish_dw[i](prv, game); + } + } + + if (actor->prvFish[aGYO_TYPE_JELLYFISH]._62E_flags & 1 && + mfish_cull_check(game, &actor->prvFish[aGYO_TYPE_JELLYFISH].position, + actor->prvFish[aGYO_TYPE_JELLYFISH].init_data._08 + 10.0f, + actor->prvFish[aGYO_TYPE_JELLYFISH].init_data._04, + actor->prvFish[aGYO_TYPE_JELLYFISH].init_data._04)) { + mfish_dw[0x23](&actor->prvFish[aGYO_TYPE_JELLYFISH], game); + } + + if (!GETREG(TAKREG, 82)) { + mfish_normal_light_set(actorx, game); + } + + if (actor->prvFish[aGYO_TYPE_FROG]._62E_flags & 1) { + mfish_dw[aGYO_TYPE_FROG](&actor->prvFish[aGYO_TYPE_FROG], game); + } + + if (GETREG(TAKREG, 82) == 1) { + mfish_normal_light_set(actorx, game); + } + } + + if (!GETREG(TAKREG, 91)) { + if (!GETREG(TAKREG, 88)) { + Evw_Anime_Set(play, &obj_museum5_evw_anime); + Museum_Fish_Suisou_draw(actorx, game, 0x5); + } + + for (i = 0; i < 4; i++) { + Evw_Anime_Set(play, &obj_suisou1_evw_anime); + Museum_Fish_Suisou_draw(actorx, game, i); + } + } +} + +BOOL mfish_cull_check(GAME* game, xyz_t* worldPos, f32 x, f32 y, f32 _y) { + xyz_t screenPos; + Game_play_Projection_Trans((GAME_PLAY*)game, worldPos, &screenPos); + if ((-x < screenPos.x) && (screenPos.x < x + 320) && (-y < screenPos.y) && (screenPos.y < _y + 240)) { + return TRUE; + } + return FALSE; +} + +void mfish_point_ligh_pos_get(ACTOR* actorx, GAME* game, int lightIndex) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + f32 extentRight, extentLeft, extentUp, extentDown; + xyz_t playerPosition, vecToPlayer, lightPos, tankPos; + + int tankIndex; + f32 distLightToPlayer; + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + + playerPosition = player->actor_class.world.position; + + if (playerPosition.z < 100.0f) { + tankIndex = 4; + } else if (playerPosition.z > 100.0f && playerPosition.z < 340.0f) { + if (lightIndex == 0) { + tankIndex = 0; + } else { + tankIndex = 1; + } + } else if (playerPosition.z > 340.0f && playerPosition.z < 580.0f) { + if (lightIndex == 0) { + tankIndex = 2; + } else { + tankIndex = 3; + } + } else { + return; + } + + if (tankIndex < 4) { + extentRight = 60.0f; + extentLeft = 60.0f; + extentUp = 60.0f; + extentDown = 60.0f; + tankPos = suisou_pos[tankIndex]; + lightPos = playerPosition; + } else { + extentRight = 200.0f; + extentLeft = 200.0f; + extentUp = 35.0f; + extentDown = 20.0f; + tankPos = suisou_pos[tankIndex]; + lightPos = playerPosition; + if (lightIndex == 0) { + lightPos.x -= extentDown; + } else { + lightPos.x += extentDown; + } + } + + if (lightPos.x > tankPos.x + extentRight) { + lightPos.x = tankPos.x + extentRight; + } else if (lightPos.x < tankPos.x - extentLeft) { + lightPos.x = tankPos.x - extentLeft; + } + + if (lightPos.z > tankPos.z + extentUp) { + lightPos.z = tankPos.z + extentUp; + } else if (lightPos.z < tankPos.z - extentDown) { + lightPos.z = tankPos.z - extentDown; + } + + actor->lightPosition[lightIndex] = lightPos; + + xyz_t_sub(&lightPos, &playerPosition, &vecToPlayer); + + distLightToPlayer = sqrtf(SQ(vecToPlayer.x) + SQ(vecToPlayer.z)); + + actor->lightPower[lightIndex] = (u8)(((60.0f - CLAMP(distLightToPlayer, 0.0f, 60.0f)) / 60.0f) * 55.0f); +} + +void mfish_point_light_ct(ACTOR* _actor, GAME* game) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)_actor; + GAME_PLAY* play = (GAME_PLAY*)game; + // fill in the light positions + mfish_point_ligh_pos_get(&actor->actor, game, 0); + mfish_point_ligh_pos_get(&actor->actor, game, 1); + // make the lights + actor->lightID1 = mEnv_ReservePointLight(play, &actor->lightPosition[0], 0, 150, 255, (u8)actor->lightPower[0]); + actor->lightID2 = mEnv_ReservePointLight(play, &actor->lightPosition[1], 0, 150, 255, (u8)actor->lightPower[1]); + actor->_14dc0 = 0; +} + +void mfish_point_light_dt(ACTOR* actorx, GAME* game) { + MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + + if (actor->lightID1 != -1) { + mEnv_CancelReservedPointLight(actor->lightID1, (GAME_PLAY*)game); + } + + if (actor->lightID2 != -1) { + mEnv_CancelReservedPointLight(actor->lightID2, (GAME_PLAY*)game); + } +} + +void mfish_point_light_mv(MUSEUM_FISH_ACTOR* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + + mfish_point_ligh_pos_get(&actor->actor, game, 0); + mfish_point_ligh_pos_get(&actor->actor, game, 1); + + mEnv_OperateReservedPointLight(actor->lightID1, &actor->lightPosition[0], 0, 150, 255, (u8)actor->lightPower[0]); + mEnv_OperateReservedPointLight(actor->lightID2, &actor->lightPosition[1], 0, 150, 255, (u8)actor->lightPower[1]); + actor->actor.world.position = actor->lightPosition[0]; + actor->actor.world.position.x = sin_s(actor->_14dc0) * 200.0f; + actor->actor.world.position.y = sin_s(actor->_14dc0 * 2) * 10.0f; + actor->actor.world.position.z = cos_s(actor->_14dc0) * 200.0f; + actor->_14dc0 += DEG2SHORT_ANGLE(1.5f); +} + +void mfish_normal_light_set(ACTOR* actor, GAME* game) { + LightsN* lights; + GAME_PLAY* play = (GAME_PLAY*)game; + + xyz_t lightPos; + lightPos.x = 320; + lightPos.y = 0; + lightPos.z = 240; + + lights = Global_light_read(&play->global_light, play->game.graph); + LightsN_list_check(lights, play->global_light.list, &lightPos); + LightsN_disp(lights, play->game.graph); +} diff --git a/src/actor/ac_museum_fish_afish.c_inc b/src/actor/ac_museum_fish_afish.c_inc new file mode 100644 index 00000000..2ed81fb0 --- /dev/null +++ b/src/actor/ac_museum_fish_afish.c_inc @@ -0,0 +1,246 @@ + +void mfish_afish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + mfish_base_ct(actor, gamex); + actor->_5EC = 0.0f; + actor->_5E8 = actor->init_data._10; + actor->currentProcess = mfish_afish_normal_process; + actor->_624 = 0; +} + +void mfish_afish_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 v; + actor->_634 = mfish_get_hide_camera_angle(actor); + if (actor->_62E_flags & 0x1e) { + 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.y, CALC_EASE(0.4f), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.5f)); + } + + actor->_5F0 = MIN(MAX(actor->init_data._10, 0.1f), actor->_5E8); + actor->_5EC = 0.0f; + actor->currentProcess = mfish_afish_dummy_process; +} + +void mfish_afish_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(5), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.25f)); +} + +void mfish_afish_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 v = RANDOM_F(actor->init_data._14) + actor->init_data._10; + + f32 v2 = v / MAX(actor->init_data._14 + actor->init_data._10, 1.0f); + if (v > actor->_5E8) { + actor->_5F0 = v; + } + actor->_5F4 = Rnd_EX_fx(10.0f) * v2; + actor->_612.x = DEG2SHORT_ANGLE((actor->_5F4 + actor->init_data._0C - actor->position.y) * -12.0f); + actor->_612.x = CLAMP(actor->_612.x, DEG2SHORT_ANGLE(-60), DEG2SHORT_ANGLE(60)); + actor->_5D0.y = 0.0f; + + if (RANDOM_F(1.0f) > actor->init_data._1C) { + actor->_612.y += (s16)Rnd_EX_fx(actor->init_data._30 * 2.0f); + + if (ABS((s16)(actor->_612.y - actor->_60C.y)) < DEG2SHORT_ANGLE(20)) { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 30.0f + 20.0f); + } else { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 40.0f + 30.0f); + } + + if ((s16)(actor->_60C.y - actor->_612.y) > 0) { + actor->_636 = 0; + } else { + actor->_636 = DEG2SHORT_ANGLE(-180); + } + + actor->_62E_flags &= ~0xC0; + actor->_5EC = 0.0f; + actor->currentProcess = mfish_afish_normal_process; +} + +void mfish_afish_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 temp; + if (actor->_632 > DEG2SHORT_ANGLE(20)) { + add_calc2(&actor->_5EC, ((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.003f + 0.03f, 0.25f, + 0.02f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.2f), actor->_5EC * 0.5f); + } + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(0.75f), DEG2SHORT_ANGLE(0.25f)); + temp = DEG2SHORT_ANGLE2(6.0f + (actor->_5E8 * 4.0f) / (actor->init_data._14 + actor->init_data._10)); + actor->_636 += temp; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.2f), DEG2SHORT_ANGLE(3.75f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + + if (actor->_5E8 < 0.01f && actor->_632 < DEG2SHORT_ANGLE(1)) { + mfish_afish_dummy_process_init(actor); + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_afish_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 s3 = DEG2SHORT_ANGLE(RANDOM_F(75.0f)) + DEG2SHORT_ANGLE(45.0f); + actor->_618.y = ABS(DEG2SHORT_ANGLE2((SHORT2DEG_ANGLE2(s3) / 120.0f) * 4.0f + 2.5f)); + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + s3 = -s3; + } + } else if (actor->_62E_flags & 0xC0) { + if (actor->_62E_flags & 0x40) { + s3 = ABS(s3); + } else { + s3 = -ABS(s3); + } + } else if (actor->_62E_flags & 0x20 && (actor->_62A - actor->_60C.y) < 0) { + s3 = -s3; + } + + if (s3 > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += s3; + + if (RANDOM_F(1.0f) < 0.2f) { + actor->_63E = RANDOM_F(3.0f) + 1.0f; + } else { + actor->_63E = 0; + } + + actor->_5EC = 0.0f; + actor->_5F0 = actor->init_data._10 + actor->init_data._14 * 0.5f; + actor->currentProcess = mfish_afish_turn_process; +} + +void mfish_afish_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (ABS(actor->_622) > DEG2SHORT_ANGLE(30)) { + add_calc2(&actor->_5EC, 0.15f, 0.15f, 0.1f); + 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), 0.15f, 0.2f); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE(0.2f), actor->_618.y >> 1, DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + if (ABS((s16)(actor->_60C.y - actor->_612.y)) < DEG2SHORT_ANGLE(2) && actor->_5E8 < 0.1f) { + if (actor->_63E > 0) { + if (mfish_WallCheck(actor)) { + actor->_640 = 10; + mfish_afish_turn_process_init(actor); + } else { + actor->_640 = 10; + mfish_afish_normal_process_init(actor); + } + actor->_63E--; + } else { + mfish_afish_dummy_process_init(actor); + } + } +} + +void mfish_afish_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p; + if (actor->currentProcess != mfish_afish_turn_process && actor->_622 < DEG2SHORT_ANGLE(20)) { + add_calc2(&actor->_5E8, 0.08f, 1.0f - actor->init_data._18, 0.005f); + } else { + add_calc2(&actor->_5E8, 0.05f, 1.0f - actor->init_data._18, 0.001f); + } + add_calc0(&actor->_5EC, 0.5f, 0.01f); + actor->_5D0.x = actor->_5E8 * cos_s(actor->_60C.x) * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.x) * cos_s(actor->_60C.y); + add_calc(&actor->_5D0.y, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y); + mfish_move_smooth(actor, gamex); + mfish_get_flow_vec(&p, actor, gamex); + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + actor->position.y += actor->_5DC.y; + actor->position.y = MAX(60.f, MIN(110.f, actor->position.y)); +} + +void mfish_afish_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->_5F8 > actor->init_data._08 * 20.f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + if (mfish_WallCheck(actor)) { + actor->_640 = 10; + mfish_afish_turn_process_init(actor); + } else { + actor->_640 = 10; + mfish_afish_normal_process_init(actor); + } + } else if (actor->currentProcess == mfish_afish_normal_process) { + if ((actor->_62E_flags & 0x1e && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || + (actor->_62E_flags & 0x20 && + ABS((s16)(DEG2SHORT_ANGLE(180) + actor->_62A - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = 10; + mfish_afish_turn_process_init(actor); + } + } + + actor->_5AC.y = 0.0f; + actor->_638 += DEG2SHORT_ANGLE(10); + actor->currentProcess(actor, gamex); + if (ABS(actor->_618.z) > ABS(actor->_622) && ABS(actor->_622) > DEG2SHORT_ANGLE(2)) { + add_calc2(&actor->_5E8, MIN(0.2f, actor->_5E8), 0.2f, 0.5f); + } + add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE(0.1f), DEG2SHORT_ANGLE(2.5), DEG2SHORT_ANGLE(0.5)); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.1f), DEG2SHORT_ANGLE(1), DEG2SHORT_ANGLE(0.5)); + mfish_afish_base_FishMove(actor, gamex); +} + +void mfish_afish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_mv(actor, gamex); + mfish_afish_base_mv(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + if (actor->_640 > 0) { + actor->_640--; + actor->_38._00.frame_control.speed = + ((actor->_5F0 - actor->_5E8) * 3.0f) / (actor->init_data._10 + actor->init_data._14) + 1.5f; + } else { + add_calc2(&(actor->_38)._00.frame_control.speed, actor->_5E8 * 2.0f + 0.5f, 0.2f, 0.1f); + } +} + +void mfish_afish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_dw(actor, gamex); +} diff --git a/src/actor/ac_museum_fish_aroana.c_inc b/src/actor/ac_museum_fish_aroana.c_inc new file mode 100644 index 00000000..f29391f0 --- /dev/null +++ b/src/actor/ac_museum_fish_aroana.c_inc @@ -0,0 +1,291 @@ + +void mfish_aroana_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + mfish_base_ct(actor, gamex); + actor->currentProcess = mfish_aroana_normal_process; + actor->_624 = 0; +} + +void mfish_aroana_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_5F0 = actor->_5E8; + actor->_5EC = 0.0f; + actor->currentProcess = mfish_aroana_dummy_process; +} + +void mfish_aroana_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.5f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.0f), DEG2SHORT_ANGLE(0.25f)); + add_calc2(&actor->_5EC, 0.05f, 0.25f, 0.025f); + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, actor->_5EC); + add_calc0(&actor->_5F0, 0.01f, 0.001f); +} + +// close copy of mfish_afish_normal_process_init + +void mfish_aroana_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 v = RANDOM_F(actor->init_data._14) + actor->init_data._10; + + f32 v2 = v / MAX(actor->init_data._14 + actor->init_data._10, 1.0f); + if (v > actor->_5E8) { + actor->_5F0 = v; + } + actor->_5F4 = Rnd_EX_fx(10.0f) * v2; + actor->_612.x = atans_table(actor->_5E8, actor->_5F4 + actor->init_data._0C - actor->position.y) >> 4; + actor->_5D0.y = 0.0f; + + if (RANDOM_F(1.0f) > actor->init_data._1C) { + actor->_612.y += (s16)Rnd_EX_fx(actor->init_data._30 * 2.0f); + + if (ABS((s16)(actor->_612.y - actor->_60C.y)) < DEG2SHORT_ANGLE(20)) { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 20.0f + 10.0f); + } else { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 30.0f + 20.0f); + } + + if ((s16)(actor->_60C.y - actor->_612.y) > 0) { + actor->_636 = 0; + } else { + actor->_636 = DEG2SHORT_ANGLE(-180); + } + + actor->_62E_flags &= ~0xC0; + actor->_5EC = 0.0f; + actor->currentProcess = mfish_aroana_normal_process; +} + +void mfish_aroana_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 temp; + if (actor->_632 > DEG2SHORT_ANGLE(20)) { + add_calc2(&actor->_5EC, ((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.002f + 0.03f, 0.25f, + 0.02f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.2f), actor->_5EC * 0.5f); + } else if (actor->activityFrameCount > actor->savedActivityFrameCount - 10) { + add_calc2(&actor->_5EC, 0.25f, 0.2f, 0.5f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.05f), actor->_5EC * 0.5f); + } + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.05f), DEG2SHORT_ANGLE(0.375), DEG2SHORT_ANGLE(0.125)); + temp = DEG2SHORT_ANGLE2((actor->_5E8 * 4.0f) / (actor->init_data._14 + actor->init_data._10) + 6.0f); + actor->_636 += temp; + + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.2f), DEG2SHORT_ANGLE(3.75f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + + if (actor->_5E8 < 0.01f && actor->_632 < DEG2SHORT_ANGLE(1)) { + if (RANDOM_F(1.0f) < 0.8f) { + mfish_aroana_long_move_process_init(actor); + } else { + mfish_aroana_dummy_process_init(actor); + } + } else if (actor->_5E8 > 1.f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_aroana_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 s3 = DEG2SHORT_ANGLE(RANDOM_F(55.0f)) + DEG2SHORT_ANGLE(45.0f); + actor->_618.y = ABS(DEG2SHORT_ANGLE2((SHORT2DEG_ANGLE2(s3) / 120.0f) * 2.5f + 2.0f)); + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + s3 = -s3; + } + } else if (actor->_62E_flags & 0xC0) { + if (actor->_62E_flags & 0x40) { + s3 = ABS(s3); + } else { + s3 = -ABS(s3); + } + } else if (actor->_62E_flags & 0x20 && (actor->_62A - actor->_60C.y) < 0) { + s3 = -s3; + } + + if (s3 > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += s3; + + if (RANDOM_F(1.0f) < 0.2f) { + actor->_63E = RANDOM_F(2.0f) + 1.0f; + } else { + actor->_63E = 0; + } + + actor->_5EC = 0.0f; + actor->_5F0 = actor->init_data._10 + actor->init_data._14 * 0.2f; + actor->currentProcess = mfish_aroana_turn_process; +} + +void mfish_aroana_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + if (ABS(actor->_622) > DEG2SHORT_ANGLE(25)) { + add_calc2(&actor->_5EC, 0.1f, 0.15f, 0.1f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), actor->_5EC * 0.5f); + } + + add_calc2(&actor->_5F0, MAX(actor->init_data._10, 0.0f), 0.15f, 0.2f); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE(0.2f), actor->_618.y >> 1, DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + if (ABS((s16)(actor->_60C.y - actor->_612.y)) < DEG2SHORT_ANGLE(2) && actor->_5E8 < 0.1f) { + if (actor->_63E > 0) { + if (mfish_WallCheck(actor)) { + // actor->_640 = 10; + mfish_aroana_turn_process_init(actor); + } else { + // actor->_640 = 10; + mfish_aroana_normal_process_init(actor); + } + actor->_63E--; + } else { + if (RANDOM_F(1.0f) < 0.8f) { + mfish_aroana_long_move_process_init(actor); + } else { + mfish_aroana_dummy_process_init(actor); + } + } + } +} + +void mfish_aroana_long_move_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_5F0 = MAX(actor->_5E8, 0.2f); + actor->_5EC = 0.0f; + actor->currentProcess = mfish_aroana_long_move_process; +} + +void mfish_aroana_long_move_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); + add_calc2(&actor->_5EC, 0.05f, 0.25f, 0.025f); + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, actor->_5EC); + if ((play->game_frame & 0x3f) == 0 && RANDOM_F(1.0f) > 0.25f) { + mfish_aroana_dummy_process_init(actor); + } +} + +void mfish_aroana_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + xyz_t p; + if (actor->currentProcess != mfish_aroana_turn_process && actor->currentProcess != mfish_aroana_long_move_process && + actor->_622 < DEG2SHORT_ANGLE(20)) { + add_calc0(&actor->_5E8, 1.0f - actor->init_data._18, GETREG(TAKREG, 0x13) * 0.001f + 0.02f); + } else { + add_calc0(&actor->_5E8, 1.0f - actor->init_data._18, GETREG(TAKREG, 0x14) * 0.001f + 0.001f); + } + add_calc0(&actor->_5EC, 0.5f, 0.01f); + + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + add_calc(&actor->_5D0.y, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y); + mfish_move_smooth(actor, game); + mfish_get_flow_vec(&p, actor, game); + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + actor->position.y += actor->_5DC.y; + actor->position.y = MAX(60.f, MIN(110.f, actor->position.y)); +} + +void mfish_aroana_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->_5F8 > actor->init_data._08 * 20.f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + if (mfish_WallCheck(actor)) { + mfish_aroana_turn_process_init(actor); + } else { + mfish_aroana_normal_process_init(actor); + } + } else if (actor->currentProcess == mfish_aroana_normal_process) { + if ((actor->_62E_flags & 0x1e && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || + (actor->_62E_flags & 0x20 && + ABS((s16)(DEG2SHORT_ANGLE(180) + actor->_62A - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_aroana_turn_process_init(actor); + } + } + + actor->_5AC.y = 0.0f; + actor->_638 += DEG2SHORT_ANGLE(5); + actor->currentProcess(actor, gamex); + if (ABS(actor->_618.z) > ABS(actor->_622) && ABS(actor->_622) > DEG2SHORT_ANGLE(2)) { + add_calc2(&actor->_5E8, MIN(0.2f, actor->_5E8), 0.2f, 0.5f); + } + add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE(0.1f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.5f)); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.1f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.5f)); + mfish_aroana_base_FishMove(actor, gamex); +} + +void mfish_aroana_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_mv(actor, gamex); + mfish_aroana_base_mv(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + actor->_38._00.frame_control.speed = (actor->_5E8 * 2.0f) / (actor->init_data._10 + actor->init_data._14) + 0.5f; +} + +BOOL mfish_aroana_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*)arg; + int v; + if (joint_num == 1) { + Matrix_scale(1.0, sin_s(actor->_63A + actor->_63C) * 0.025f + 1.0f, sin_s(actor->_63A) * 0.025f + 1.0f, 1); + } else if (joint_num == 2) { + v = joint1->y - (actor->_618.z << 1); + joint1->y = MIN(MAX(v, DEG2SHORT_ANGLE(-40)), DEG2SHORT_ANGLE(40)); + + v = joint1->x - (actor->_618.z >> 2); + joint1->x = MIN(MAX(v, DEG2SHORT_ANGLE(-20)), DEG2SHORT_ANGLE(20)); + + Matrix_scale(1.0f, sin_s(actor->_63A + DEG2SHORT_ANGLE(270)) * 0.05f + 1.0f, + sin_s(actor->_63A + DEG2SHORT_ANGLE(90)) * 0.05f + 1.0f, 1); + } + return 1; +} + +void mfish_aroana_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y + actor->_5AC.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_aroana_before_disp, NULL, actor); + CLOSE_DISP(play->game.graph); +} diff --git a/src/actor/ac_museum_fish_base.c_inc b/src/actor/ac_museum_fish_base.c_inc new file mode 100644 index 00000000..b94e2791 --- /dev/null +++ b/src/actor/ac_museum_fish_base.c_inc @@ -0,0 +1,1517 @@ +f32 Rnd_EX_f(f32 v) { + f32 rand1 = RANDOM2_F(2); + f32 rand2 = RANDOM_F(1); + if (rand2 > (rand1 * rand1)) { + if (rand1 > 0) { + rand1 = sqrtf(rand2); + } else { + rand1 = -sqrtf(rand2); + } + } + rand1 = (1.0f + rand1) * 0.5f; + return v * rand1; +} + +f32 Rnd_EX_fx(f32 v) { + f32 rand1 = RANDOM2_F(2); + f32 rand2 = RANDOM_F(1); + if (rand2 > (rand1 * rand1)) { + if (rand1 > 0) { + rand1 = sqrtf(rand2); + } else { + rand1 = -sqrtf(rand2); + } + } + rand1 = rand1 / 2; + return v * rand1; +} + +void mfish_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + f32 t; + xyz_t pos; + if (actor->fishIDEnum == aGYO_TYPE_PIRANHA && actor->currentProcess != mfish_peck_process) { + actor->_5E8 *= actor->init_data._18; + } else { + add_calc0(&actor->_5E8, 1.0f - actor->init_data._18, 0.025f); + } + + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + + add_calc(&actor->_5D0.y, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y); + + mfish_move_smooth(actor, game); + mfish_get_flow_vec(&pos, actor, game); + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + actor->position.y = actor->position.y + actor->_5DC.y; + actor->position.y = MAX(60, MIN(110, actor->position.y)); +} + +int mfish_PosWallCheck(MUSEUM_FISH_PRIVATE_DATA* priv, xyz_t* pos) { + u32 flag = 0; + xyz_t p = suisou_pos[priv->group]; + f32 a, b, c, d; + + if (priv->group < 4) { + a = priv->init_data._28 + 45; + b = priv->init_data._28 + 45; + c = priv->init_data._28 + 45; + d = priv->init_data._28 + 45; + } else { + a = priv->init_data._28 + 180; + b = priv->init_data._28 + 180; + c = priv->init_data._28 + 5; + d = priv->init_data._28 + 45; + } + + if (pos->x > p.x + a) { + flag |= 4; + } else if (pos->x < p.x - b) { + flag |= 2; + } + + if (pos->z > p.z + c) { + flag |= 8; + } else if (pos->z < p.z - d) { + flag |= 0x10; + } + + return flag; +} + +BOOL mfish_WallCheck(MUSEUM_FISH_PRIVATE_DATA* prv) { + xyz_t p, p1; + + p = prv->position; + + p.x += sin_s(prv->_60C.y) * (GETREG(TAKREG, 70) + 30.0f); + p.z += cos_s(prv->_60C.y) * (GETREG(TAKREG, 70) + 30.0f); + + p1 = p; + + return mfish_PosWallCheck(prv, &p1) ? TRUE : FALSE; +} + +s16 mfish_get_hide_camera_angle(MUSEUM_FISH_PRIVATE_DATA* priv) { + s16 v = priv->_60C.y; + if (v > 0 || (priv->group == 2 && RANDOM_F(1) < 0.8f)) { + if (v > DEG2SHORT_ANGLE(90)) { + v = DEG2SHORT_ANGLE(90) + DEG2SHORT_ANGLE(RANDOM_F(45)); + } else { + v = DEG2SHORT_ANGLE(90) - DEG2SHORT_ANGLE(RANDOM_F(45)); + } + } else { + if (v > DEG2SHORT_ANGLE(-90)) { + v = DEG2SHORT_ANGLE(-90) + DEG2SHORT_ANGLE(RANDOM_F(45)); + } else { + v = DEG2SHORT_ANGLE(-90) - DEG2SHORT_ANGLE(RANDOM_F(45)); + } + } + return v; +} + +void mfish_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* prv) { + prv->_634 = mfish_get_hide_camera_angle(prv); + if (prv->group == 2 && prv->_60C.y < 0 && prv->_634 > 0) { + prv->_5F0 = MAX(prv->init_data._10, GETREG(TAKREG, 80) * 0.1f + 1.2f); + } + prv->currentProcess = mfish_dummy_process; +} + +void mfish_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + // no clue what's going on here + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(5.0f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(5.0f), DEG2SHORT_ANGLE(0.25f)); + + if (actor->group == 2) { + if (actor->_612.y < 0) { + actor->activityFrameCount--; + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.05f); + add_calc0(&actor->_5F0, 0.05f, 0.1f); + } + } +} + +void mfish_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* fishActor) { + f32 ra; + f32 t; + f32 temp; + + ra = RANDOM_F(fishActor->init_data._14) + fishActor->init_data._10; + t = (ra) / MAX(fishActor->init_data._14 + fishActor->init_data._10, 1); + + if (ra > fishActor->_5E8) { + fishActor->_5F0 = ra; + } + + fishActor->_5F4 = Rnd_EX_fx(10.0f) * t; + + fishActor->_612.x = + atans_table(fishActor->_5E8, fishActor->_5F4 + fishActor->init_data._0C - fishActor->position.y) >> 4; + fishActor->_5D0.y = 0; + + if (RANDOM_F(1) > fishActor->init_data._1C) { + int diff; + + 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.y += DEG2SHORT_ANGLE(20); + } else { + fishActor->_612.y += DEG2SHORT_ANGLE(-20); + } + } + + fishActor->_632 = DEG2SHORT_ANGLE(t * 30.f + 20.0f); + } else { + if ((s16)(fishActor->_612.y - fishActor->_60C.y) > 0) { + fishActor->_612.y += DEG2SHORT_ANGLE(15); + } else { + fishActor->_612.y += DEG2SHORT_ANGLE(-15); + } + + fishActor->_632 = DEG2SHORT_ANGLE((GETREG(TAKREG, 42) + 40.0f) * t + 30.0f); + } + if ((s16)(fishActor->_60C.y - fishActor->_612.y) > 0) { + fishActor->_636 = DEG2SHORT_ANGLE(0); + } else { + fishActor->_636 = DEG2SHORT_ANGLE(-180); + } + + fishActor->_62E_flags &= ~0xC0; + fishActor->currentProcess = mfish_normal_process; +} + +void mfish_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + if (actor->_632 > DEG2SHORT_ANGLE(20)) { + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.2f), + (((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.04f + 0.1f) * 0.5f, 0.05f); + } else if (actor->activityFrameCount > actor->savedActivityFrameCount - 10) { + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.5f), 0.75f, 0.05f); + } + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(1.25f), DEG2SHORT_ANGLE(0.25f)); + actor->_636 += DEG2SHORT_ANGLE(10.0f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.5f), DEG2SHORT_ANGLE(6.25f), 45); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(3.75f), 45); + + if (actor->_5E8 < 0.01f || actor->group == 2 && actor->_5E8 < 0.05f) { + mfish_dummy_process_init(actor); + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 v = DEG2SHORT_ANGLE(RANDOM_F(75.0f)) + DEG2SHORT_ANGLE(45); + actor->_618.y = + DEG2SHORT_ANGLE(((actor->_5E8 + 0.5f) / (actor->init_data._10 + actor->init_data._14 + 0.5f)) * 7.5f + 7.5f); + + if (actor->_62E_flags & 0xC0) { + if (actor->_62E_flags & 0x40) { + v = ABS(v); + } else { + v = -ABS(v); + } + } else if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + v = -v; + } else { + v = v; + } + } else if (actor->_62E_flags & 0x20) { + if ((s16)(actor->_62A - actor->_60C.y) < 0) { + v = -v; + } else { + v = v; + } + } + + if (v > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += v; + + if (actor->group == 2) { + s16 tmp = actor->_612.y + DEG2SHORT_ANGLE(90); + if (tmp > DEG2SHORT_ANGLE(135)) { + actor->_612.y = DEG2SHORT_ANGLE(-45); + } else if (tmp > DEG2SHORT_ANGLE(-135)) { + actor->_612.y = DEG2SHORT_ANGLE(-135); + } + } + + actor->_5F0 = actor->init_data._10 + actor->init_data._14 * 0.7f; + + if (RANDOM_F(1.0f) < 0.2f) { + actor->_63E = RANDOM_F(3.0f) + 1.0f; + } else { + actor->_63E = 0; + } + actor->currentProcess = mfish_turn_process; +} + +void mfish_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + if (ABS(actor->_622) > DEG2SHORT_ANGLE(20)) { + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), (GETREG(TAKREG, 0x4e) * 0.01f + 0.5f) * 0.5f, 0.05f); + } + add_calc2(&actor->_5F0, MAX(actor->init_data._10, 0.0f), 0.5f, 0.2f); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE(0.2f), actor->_618.y >> 1, DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.4f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + + 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); + } else { + mfish_normal_process_init(actor); + } + actor->_63E--; + } else { + mfish_dummy_process_init(actor); + } + } +} + +void mfish_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + f32 fVar8; + f32 fVar9; + int t; + s16 atanx; + s16 atany; + f32 dist; + + actor->_5D0.y = 0.0f; + mfish_get_player_angle(actor, game, &atanx, &atany, &dist); + fVar9 = (actor->init_data)._14 + (actor->init_data)._10; + + if (dist < 20.0f) { + fVar9 *= 0.75f; + actor->_5F0 = MAX(fVar9, 0.5f); + } + + if (fVar9 > actor->_5E8) { + actor->_5F0 = fVar9; + } + + fVar8 = (fVar9 / 8.0f); + + if (ABS((s16)(atanx - actor->_60C.y)) < actor->init_data._30) { + actor->_612.y = atanx; + } else if ((s16)(atanx - actor->_60C.y) > 0) { + actor->_612.y = actor->_60C.y + actor->init_data._30; + } else { + actor->_612.y = actor->_60C.y - actor->init_data._30; + } + + if (atany < 0) { + actor->_5F4 = actor->_5F4 + RANDOM_F(2.5f); + actor->_5F4 = MAX(MIN(10, actor->_5F4), -10); + + } else { + actor->_5F4 = actor->_5F4 - RANDOM_F(2.5f); + actor->_5F4 = MAX(MIN(10, actor->_5F4), -10); + } + + actor->_632 = DEG2SHORT_ANGLE((fVar8 * 30.0f) + 20.0f); + + if (qrand() & 0x8000) { + actor->_636 = DEG2SHORT_ANGLE(90); + } else { + actor->_636 = DEG2SHORT_ANGLE(-90); + } + + actor->_62E_flags &= ~0xC0; + actor->currentProcess = mfish_peck_process; +} + +void mfish_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 atanx; + s16 atany; + f32 dist; + + mfish_get_player_angle(actor, gamex, &atanx, &atany, &dist); + + if (actor->_632 > DEG2SHORT_ANGLE(15)) { + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.25f), + (((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.04f + 0.1f) * 0.5f, 0.05f); + } else if (actor->activityFrameCount > actor->savedActivityFrameCount - 16) { + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), 0.5f, 0.05f); + } else if (dist > 20) { + add_calc2(&actor->_5E8, MAX(actor->_5E8, 0.4f), 0.25f, 0.05f); + } + + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(0.75f), DEG2SHORT_ANGLE(0.25f)); + actor->_636 += DEG2SHORT_ANGLE(10); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + CALC_EASE2(0.5f), DEG2SHORT_ANGLE(6.25f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + + if (mfish_peck_wall_check(actor, gamex)) { + if (RANDOM_F(1.0f) < 0.9f) { + actor->_5E8 = -0.3f - RANDOM_F(0.3f); + actor->activityFrameCount = 10; + } else { + actor->_5E8 = -0.5f; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 3; + } + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = 0.0f; + } +} + +void mfish_ground_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p = suisou_pos[actor->group]; + xyz_t_sub(&p, &actor->position, &p); + + actor->_5F4 = ((actor->init_data._08 * 0.3f + 65.0f) - MAX(ABS(p.x), ABS(p.z)) * 0.15f) - actor->init_data._0C; + actor->_612.x = DEG2SHORT_ANGLE(60); + actor->activityFrameCount = (int)(Rnd_EX_f(30.0f) + 15.0f) << 1; + + if (actor->currentProcess != mfish_ground_peck_process) { + actor->_63E = RANDOM_F(2.0f) + 3.0f; + } else { + actor->_63E--; + } + + actor->_5F0 = 0.5f; + actor->currentProcess = mfish_ground_peck_process; +} + +void mfish_ground_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p = suisou_pos[actor->group]; + xyz_t_sub(&p, &actor->position, &p); + actor->_5F4 = ((actor->init_data._08 * 0.3f + 65.0f) - (MAX(ABS(p.x), ABS(p.z)) * 0.15f)) - actor->init_data._0C; + xyz_t_mult_v(&actor->_5DC, 0.1f); + + if (actor->position.y > actor->_5F4 + actor->init_data._0C + 4.0f) { + if (actor->_612.x < DEG2SHORT_ANGLE(40)) { + actor->_612.x = DEG2SHORT_ANGLE(40); + } + actor->activityFrameCount++; + add_calc2(&actor->_5F0, 0.5f, 0.6f, 0.5f); + } else if ((s16)(actor->_612.x - actor->_60C.x) > 0) { + add_calc2(&actor->_5F0, 0.2f, 0.5f, 0.4f); + } else { + if (actor->_5E8 > 0) { + actor->_5E8 = -0.2f; + } else { + add_calc0(&actor->_5F0, 0.2f, 0.1f); + } + } + + if (actor->_612.x < DEG2SHORT_ANGLE(15)) { + actor->_612.x = DEG2SHORT_ANGLE(15); + } + + add_calc(&actor->_5E8, actor->_5F0 * cos_s(actor->_60C.x), CALC_EASE(0.5f), 0.25f, 0.05f); + + mfish_dummy_process(actor, gamex); +} + +void mfish_base_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + GAME_PLAY* play = (GAME_PLAY*)gamex; + f32 f = RANDOM_F(2.0f); + f32 s; + s16 q = qrand(); + actor->_5E8 = f; + actor->_5D0.x = cos_s(q) * f; + actor->_5D0.z = sin_s(q) * f; + actor->_60C.y = q; + actor->_612.y = actor->_60C.y; + if (actor->fishIDEnum == aGYO_TYPE_CATFISH || actor->fishIDEnum == aGYO_TYPE_GIANT_CATFISH) { + actor->_5F4 = 0.0f; + } else if (actor->fishIDEnum == aGYO_TYPE_FRESHWATER_GOBY) { + actor->_5F4 = RANDOM_F(5.0f); + } else { + actor->_5F4 = RANDOM2_F(10.0f); + } + actor->_5D0.y = 0.0; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = actor->_60C.y; +} + +void mfish_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + GAME_PLAY* game = (GAME_PLAY*)gamex; + + if (actor->_5F8 > actor->init_data._08 * 20.0f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + if (mfish_peck_check(actor, gamex)) { + actor->activityFrameCount >>= 2; + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_peck_process_init(actor, gamex); + } else if (mfish_WallCheck(actor)) { + mfish_turn_process_init(actor); + } else if (mfish_ground_peck_before_check(actor, gamex)) { + mfish_ground_peck_process_init(actor, gamex); + } else { + mfish_normal_process_init(actor); + } + } else if (actor->currentProcess == mfish_normal_process) { + if ((actor->_62E_flags & 0x1E && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || + (actor->_62E_flags & 0x20 && + ABS((s16)(actor->_62A + DEG2SHORT_ANGLE(180) - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_turn_process_init(actor); + } + } + + if (actor->_624 == 10) { + actor->_5AC.y = 0; + actor->position.y = actor->init_data._0C; + } else if (actor->group == 2) { + actor->_5AC.y = sin_s(actor->_638) * 0.2f; + } else { + actor->_5AC.y = 0; + } + + actor->_638 += DEG2SHORT_ANGLE(10); + actor->currentProcess(actor, gamex); + + if (ABS(actor->_618.z) > ABS(actor->_622)) { + add_calc2(&actor->_5E8, MIN(GETREG(TAKREG, 19) * 0.1f + 0.2f, actor->_5E8), 0.2f, 0.5f); + } + + add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE(0.1f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.5f)); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.1f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.5f)); + mfish_base_FishMove(actor, 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[0], &s->_4F0, &s->_514); + cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&s->_00, s->_550[0], NULL, 1.0f, 0.0f); + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_60C.x = DEG2SHORT_ANGLE(0); + actor->_60C.y = DEG2SHORT_ANGLE(-90); + actor->_60C.z = DEG2SHORT_ANGLE(0); + actor->_5DC = ZeroVec; + return; +} + +void mfish_onefish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + cKF_SkeletonInfo_R_play(&actor->_38._00); +} + +int mfish_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*)arg; + if (joint_num == 2) { + int v, t; + + if (actor->group != 4) { + v = 2; + } else if (actor->init_data._20 > 0.7f) { + v = 1; + } else if (actor->init_data._20 > 0.5f) { + v = 2; + } else { + v = 3; + } + + t = joint1->y - (actor->_618.z * v); + joint1->y = MY_CLAMP(t, DEG2SHORT_ANGLE(-60), DEG2SHORT_ANGLE(60)); + t = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(t, DEG2SHORT_ANGLE(-25), DEG2SHORT_ANGLE(25)); + } + return 1; +} + +void mfish_onefish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele; + Mtx* mtx; + GRAPH* graph; + GAME_PLAY* play; + + play = (GAME_PLAY*)gamex; + skele = &actor->_38; + + if (play->game.frame_counter % 2 != 0) { + mtx = &skele->_70; + } else { + mtx = &skele->_2b0; + } + + graph = play->game.graph; + + Matrix_translate(actor->position.x, actor->position.y + actor->_5AC.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + + Matrix_translate(0.0f, 0.25f * actor->init_data._04, 1.5f * actor->init_data._24, 1); + Matrix_RotateX(actor->_60C.x, 1); + Matrix_RotateZ(MY_CLAMP(-(actor->_618.z >> 1), DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)), 1); + Matrix_translate(0.0f, 0.25f * -actor->init_data._04, 0.5f * -actor->init_data._24, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 1); + + OPEN_DISP(graph); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + CLOSE_DISP(graph); + + cKF_Si3_draw_R_SV(&play->game, &skele->_00, mtx, &mfish_before_disp, 0, actor); +} + +void mfish_ani_base_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + mfish_base_ct(actor, gamex); + actor->currentProcess = mfish_normal_process; + actor->_624 = 0; +} + +void mfish_ani_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + GAME_PLAY* play = (GAME_PLAY*)gamex; + mfish_onefish_mv(actor, gamex); + mfish_base_mv(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + + if (actor->group == 2) { + actor->_38._00.frame_control.speed = + (actor->_5E8 * 3.0f) / (actor->init_data._10 + actor->init_data._14) + 1.0f; + } else if (actor->fishIDEnum == aGYO_TYPE_BITTERLING || actor->fishIDEnum == aGYO_TYPE_BROOK_TROUT || + actor->fishIDEnum == aGYO_TYPE_CRUCIAN_CARP) { + if (actor->_5F0 - 0.1f > actor->_5E8 && actor->currentProcess == mfish_normal_process && + actor->activityFrameCount > actor->savedActivityFrameCount - 10) { + actor->_38._00.frame_control.speed = + ((actor->_5F0 - actor->_5E8) * 3.0f) / (actor->init_data._10 + actor->init_data._14) + 1.5f; + } else { + add_calc2(&actor->_38._00.frame_control.speed, 2.0f * actor->_5E8 + 0.5f, 0.2f, 0.1f); + } + } else { + if (actor->activityFrameCount > actor->savedActivityFrameCount - 10 && actor->_5F0 > 0) { + actor->_38._00.frame_control.speed = + (actor->_5E8 * 4.0f) / (actor->init_data._10 + actor->init_data._14) + 1.25f; + } else { + add_calc2(&actor->_38._00.frame_control.speed, 2.0f * actor->_5E8 + 0.5f, 0.2f, 0.1f); + } + } + + mfish_body_wind_anime_play(actor, gamex); +} + +void mfish_ani_base_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_dw(actor, gamex); +} +#include "../src/actor/ac_museum_fish_afish.c_inc" +#include "../src/actor/ac_museum_fish_aroana.c_inc" +#include "../src/actor/ac_museum_fish_koi.c_inc" +#include "../src/actor/ac_museum_fish_kaseki.c_inc" +#include "../src/actor/ac_museum_fish_bass.c_inc" +#include "../src/actor/ac_museum_fish_seafish.c_inc" +#include "../src/actor/ac_museum_fish_tai.c_inc" +#include "../src/actor/ac_museum_fish_small_fish.c_inc" +#include "../src/actor/ac_museum_fish_gupi.c_inc" +#include "../src/actor/ac_museum_fish_medaka.c_inc" +#include "../src/actor/ac_museum_fish_kingyo.c_inc" +#include "../src/actor/ac_museum_fish_dojou.c_inc" +#include "../src/actor/ac_museum_fish_donko.c_inc" +#include "../src/actor/ac_museum_fish_big_fish.c_inc" +#include "../src/actor/ac_museum_fish_ito.c_inc" +#include "../src/actor/ac_museum_fish_unagi.c_inc" +#include "../src/actor/ac_museum_fish_namazu.c_inc" +#include "../src/actor/ac_museum_fish_zarigani.c_inc" +#include "../src/actor/ac_museum_fish_kurage.c_inc" +#include "../src/actor/ac_museum_fish_hasu.c_inc" +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 }; + fish[0] = &MF_Control_Actor->prvFish[aGYO_TYPE_ARAPAIMA]; + fish[1] = &MF_Control_Actor->prvFish[aGYO_TYPE_GIANT_SNAKEHEAD]; + + for (i = 0; i < 2; i++) { + f32 v; + xyz_t ip = fish[i]->_5B8; + xyz_t op; + f32 f27 = actor->init_data._08 * (sin_s(actor->_60C.y) * 0.3f + 0.7f) + fish[i]->init_data._08; + f32 f26 = 10.f + (actor->init_data._08 * (0.7f + 0.3f * cos_s(actor->_60C.y))); + f32 f25 = actor->init_data._04 + fish[i]->init_data._04; + xyz_t_sub(&actor->_5B8, &ip, &op); + if (ABS(op.z) < f26 && ABS(op.y) < f25 && ABS(op.x) < f27) { + f27 -= ABS(op.x); + f26 -= ABS(op.z); + f25 -= ABS(op.y); + if (f25 < MIN(f27, f26)) { + if (op.y < 0) { + actor->position.y -= MIN(f25, 0.25f); + fish[i]->position.y += MIN(f25, 0.05f); + } else { + actor->position.y += MIN(f25, 0.25f); + fish[i]->position.y -= MIN(f25, 0.05f); + } + } else if (f26 < f27) { + v = ABS(cos_s(actor->_60C.y) * actor->_5E8); + if (op.z < 0) { + actor->position.z -= MIN(f26, MAX(0.5f, v)); + if (fish[i]->_5B8.z < max[i] + 10.0f) { + fish[i]->position.z += MIN(f26, 0.05f); + } + } else { + actor->position.z += MIN(f26, MAX(0.5f, v)); + if (fish[i]->_5B8.z > max[i] - 10.0f) { + fish[i]->position.z -= MIN(f26, 0.05f); + } + } + } else { + v = ABS(sin_s(actor->_60C.y) * actor->_5E8); + if (op.x < 0) { + actor->position.x -= MIN(f27, MAX(0.5f, v)); + fish[i]->position.x += MIN(f27, 0.05f); + } else { + actor->position.x += MIN(f27, MAX(0.5f, v)); + fish[i]->position.x -= MIN(f27, 0.05f); + } + } + } + } +} + +void Museum_Fish_ObjBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex, f32 f1, f32 f2) { + xyz_t p = suisou_pos[actor->group]; + f32 a, b, c, d, e; + + switch (actor->group) { + case 0: + e = 85.0f; + a = -20.0f + p.x; + b = 1000.0f + p.x; + c = -25.0f + p.z; + d = -1000.0f + p.z; + break; + case 1: + a = -5.0f + p.x; + c = -10.0f + p.z; + b = 1000.0f + p.x; + d = -1000.0f + p.z; + // needs cast, temp doesn't work + e = 75.0f - cos_s((int)DEG2SHORT_ANGLE(180.0f * (actor->_5B8.x - a) / 70.0f)) * 5.0f; + break; + case 2: + e = 80.0f; + a = -1000.0f + p.x; + b = -5.0f + p.x; + c = -20.0f + p.z; + d = -1000.0f + p.z; + break; + case 3: + e = 75.0f; + a = -20.0f + p.x; + b = 1000.0f + p.x; + c = -5.0f + p.z; + d = -1000.0f + p.z; + break; + case 4: + default: + return; + } + + e -= actor->position.y; + if (e > 0.0f) { + f32 v1, v2; + b -= (actor->position.x + (actor->init_data._28 * f1)); + a -= (actor->position.x - (actor->init_data._28 * f1)); + c -= (actor->position.z + (actor->init_data._28 * f2)); + d -= (actor->position.z - (actor->init_data._28 * f2)); + if (b > 0.0f && c > 0.0f && a < 0.0f && d < 0.0f) { + if (b > -a) { + if ((actor->_62E_flags & 2) == 0) { + actor->_62E_flags |= 4; + } + v1 = a; + } else { + if ((actor->_62E_flags & 4) == 0) { + actor->_62E_flags |= 2; + } + v1 = b; + } + + if (c > -d) { + if ((actor->_62E_flags & 8) == 0) { + actor->_62E_flags |= 0x10; + } + v2 = d; + } else { + if ((actor->_62E_flags & 0x10) == 0) { + actor->_62E_flags |= 8; + } + v2 = c; + } + + if (e < MIN(ABS(v2), ABS(v1)) && actor->_624 != 10) { + actor->position.y += e; + if (actor->_624 == 3) { + actor->_612.x = DEG2SHORT_ANGLE(45); + } else if (actor->fishIDEnum == aGYO_TYPE_LOACH) { + if (actor->_612.x > DEG2SHORT_ANGLE(30)) { + actor->_612.x -= DEG2SHORT_ANGLE(2); + } else if (actor->_612.x < DEG2SHORT_ANGLE(-30)) { + actor->_612.x += DEG2SHORT_ANGLE(2); + } + } + } else { + if (ABS(v2) < ABS(v1)) { + actor->position.z += v2; + } else { + actor->position.x += v1; + } + } + } + } +} + +void Museum_Fish_DonkoBGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 a, b, d, c; + f32 f27; + f32 f24; + f32 f25; + f32 f26; + xyz_t p = suisou_pos[actor->group]; + f32 v = (sin_s(actor->_60C.y) * 0.7f) * (ABS(cos_s(actor->_618.z)) * 0.5f + 0.5f) + 0.3f; + f32 v2 = (cos_s(actor->_60C.y) * 0.7f) * (ABS(cos_s(actor->_618.z)) * 0.5f + 0.5f) + 0.3f; + actor->_62E_flags &= ~0x1e; + actor->_62C = 0; + Museum_Fish_objchk_pos_set(actor, gamex); + // asm 17C + a = (+00.0f + p.x); + b = (+45.0f + p.x); + 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.y) - p.x) * 180.0f / 55.0f)); + + a -= (actor->position.x + actor->init_data._28 * v); + b -= (actor->position.x - actor->init_data._28 * v); + c -= (actor->position.z + actor->init_data._28 * v2); + d -= (actor->position.z - actor->init_data._28 * v2); + + /* + f31 = a + f30 = b + f28 = c + f29 = d + */ + + actor->_5FC = -a; + actor->_600 = b; + actor->_604 = -c; + actor->_608 = d; + + // asm 2E8 + f27 -= actor->position.y; + f26 -= actor->position.y; + if (a > 0.0f) { + actor->_5FC = 0.0f; + actor->position.x += a; + actor->_62E_flags |= 2; + } else if (b < 0.0f) { + actor->_600 = 0.0f; + actor->position.x += b; + actor->_62E_flags |= 4; + } + + if (c > 0.0f) { + actor->_604 = 0.0f; + actor->position.z += c; + actor->_62E_flags |= 0x8; + } else if (d < 0.0f) { + actor->_608 = 0.0f; + actor->position.z += d; + actor->_62E_flags |= 0x10; + } + + if (actor->_62E_flags & 2) { + actor->_62C = DEG2SHORT_ANGLE(-90); + } else if (actor->_62E_flags & 4) { + actor->_62C = DEG2SHORT_ANGLE(90); + } + + if (actor->_62E_flags & 8) { + if (actor->_62E_flags & 6) { + actor->_62C = DEG2SHORT_ANGLE(180) - (actor->_62C >> 1); + } else { + actor->_62C = DEG2SHORT_ANGLE(-180); + } + } else if (actor->_62E_flags & 0x10) { + if (actor->_62E_flags & 6) { + actor->_62C = (actor->_62C >> 1); + } else { + actor->_62C = 0; + } + } + + f25 = MIN(MIN(actor->_608, actor->_604), MIN(actor->_600, actor->_5FC)); + if (f25 < 5.0f) { + f27 -= 0.5f * (5.0f - f25); + } + + f25 = MIN(MIN(actor->_608 - cos_s(actor->_60C.y), actor->_604 + cos_s(actor->_60C.y)), + MIN(actor->_600 - sin_s(actor->_60C.y), actor->_5FC + sin_s(actor->_60C.y))); + // asm 5D8 + if (f25 < 5.0f) { + f26 -= 0.5f * (5.0f - f25); + } + f26 -= f27; + actor->_612.x = atans_table(1.0f, -f26); + if (f27 > 0.0f) { + actor->position.y += f27; + actor->_5D0.y *= 0.95f; + } +} + +void Museum_Fish_objchk_pos_set(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + actor->_5B8 = actor->position; + 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_old_chk_pos_set() { + // UNUSED/STRIPPED +} + +void Museum_Fish_BGCheck(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + xyz_t p = suisou_pos[actor->group]; + 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->_618.z)) * 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->_618.z)) * 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->_618.z)) * 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->_618.z)) * 0.4f + 0.6f); + } else { + f26 = 1.0f; + f25 = 1.0f; + } + + if (actor->group < 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_flags &= ~0x1e; + actor->_62C = 0; + Museum_Fish_objchk_pos_set(actor, game); + + if (actor->_5B8.x > (p.x + f30)) { + actor->position.x += (p.x + f30) - actor->_5B8.x; + actor->_62E_flags |= 0x4; + } else if (actor->_5B8.x < p.x - f29) { + actor->position.x += (p.x - f29) - actor->_5B8.x; + actor->_62E_flags |= 0x2; + } + + if (actor->_5B8.z > (p.z + f28)) { + actor->position.z += (p.z + f28) - actor->_5B8.z; + actor->_62E_flags |= 0x10; + } else if (actor->_5B8.z < (p.z - f27)) { + actor->position.z += (p.z - f27) - actor->_5B8.z; + actor->_62E_flags |= 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->group < 4 && actor->fishIDEnum != aGYO_TYPE_EEL) { + Museum_Fish_ObjBGCheck(actor, game, f26, f25); + } + + if (actor->_62E_flags & 2) { + actor->_62C = DEG2SHORT_ANGLE(-90); + } else if (actor->_62E_flags & 4) { + actor->_62C = DEG2SHORT_ANGLE(90); + } + + if (actor->_62E_flags & 8) { + if (actor->_62E_flags & 6) { + actor->_62C = (DEG2SHORT_ANGLE(180) - (actor->_62C >> 1) + ((s16)r31 >> 1)); + } else { + actor->_62C = r31 + DEG2SHORT_ANGLE(180); + } + } else if (actor->_62E_flags & 0x10) { + if (actor->_62E_flags & 6) { + actor->_62C >>= 1; + } else { + actor->_62C = DEG2SHORT_ANGLE(0); + } + } +} + +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; + int i; + int j; + f32 sq; + f32 f30 = 0.0f; + f32 f29 = 0.0f; + f32 f28 = 0.0f; + + for (i = 0; i < aGYO_TYPE_NUM; i++, f++) { + f->_62E_flags &= ~0x100; + + // this if statement salso works as a continue statement + if (f->fishIDEnum != aGYO_TYPE_EEL && f->fishIDEnum != aGYO_TYPE_COELACANTH && + f->fishIDEnum != aGYO_TYPE_FROG) { + + for (j = 0; j < 14; j++) { + f32 f1 = (j < 5) ? 90.0f : (j < 10) ? 115.0f : 80.0f; + + if (kusa_group_tbl[j] == f->group && f->_5B8.y < f1) { + f32 z; + f32 x; + f32 d; + f32 dSQ; + f32 dx; + f32 dy; + + if (kusa_group_tbl[j] == 4) { + if (f->fishIDEnum == aGYO_TYPE_COELACANTH) { + 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 = DEG2SHORT_ANGLE(3.5f); + } + } + // asm 3fc-410 + } + // asm 414 + if (f28 > 0.0f) { + f->_62E_flags |= 0x100; + f->position.x += (f30 / f28); + f->position.z += (f29 / f28); + } + f28 = 0.0f; + f29 = 0.0f; + f30 = 0.0f; + // asm 460 + } + } +} + +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; + + for (i = 0; i < aGYO_TYPE_NUM; i++, f++) { + f->_62E_flags &= ~0x20; + } + + f = actor->prvFish; + for (i = 0; i < aGYO_TYPE_NUM; i++, f++) { + // asm b8 + if (i != 0x21 && i != 0x20 && i != 0x1a && i != 0x27 && i != 0xa && f->_62E_flags & 1) { + for (j = 0; j < aGYO_TYPE_NUM; j++, fj++) { + if (f->group == fj->group && i != j && j != 0x21 && j != 0x1a && j != 0x27 && j != 10 && + fj->_62E_flags & 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.0001f; + f22 *= 0.2f + (GETREG(TAKREG, 0x12)) * 0.0001f; + f->_62A = atans_table(test.z, test.x); + f->_62E_flags |= 0x20; + fj->_62A = f->_62A + DEG2SHORT_ANGLE(180); + f->_62E_flags |= 0x20; + f->_594 = fj; + if ((fj->_62E_flags & 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->fishIDEnum == aGYO_TYPE_COELACANTH) { + 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->position.x += f28 / f25; + f->position.z += f27 / f25; + } + + if (f24 > 0) { + f->position.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->position, &f->position, &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; + } + if (f->group == 3 && f->_624 != 7) { + Museum_Fish_BigFishObjCheck(f, game); + } + // asm 728 + } +} + +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) { + PLAYER_ACTOR* playerActor = get_player_actor_withoutCheck((GAME_PLAY*)game); + xyz_t p; + xyz_t p1; + f32 v; + p = playerActor->actor_class.world.position; + p.y += 40.0f; + xyz_t_sub(&p, &actor->position, &p1); + v = SQ(p1.x) + SQ(p1.z); + v = sqrtf(v); + if (atanx) { + *atanx = atans_table(p1.z, p1.x); + } + if (atany) { + *atany = atans_table(v, -p1.y); + } + if (distance) { + *distance = v; + } +} + +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->group) { + if (actor->fishIDEnum == aGYO_TYPE_PIRANHA) { + return TRUE; + } else if (mPr_GetPossessionItemIdx(commonData_prv, 0x2806) != -1) { + if (actor->fishIDEnum == aGYO_TYPE_CARP || actor->fishIDEnum == aGYO_TYPE_KOI) { + return TRUE; + } + } else if (mPr_GetPossessionItemIdxItem1Category(commonData_prv, 8) != -1 && + (actor->fishIDEnum == aGYO_TYPE_GOLDFISH || actor->fishIDEnum == aGYO_TYPE_POPEYED_GOLDFISH)) { + return TRUE; + } + } + + return FALSE; +} + +BOOL mfish_peck_wall_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 temp = (actor->_60C.y - actor->_62C); + if (actor->_62E_flags & 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->position, &target) < 60.0f; + } + return FALSE; +} + +BOOL mfish_ground_peck_before_check(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p, p2; + f32 v; + + p2 = p = suisou_pos[actor->group]; + + xyz_t_sub(&p2, &actor->position, &p2); + + v = MAX(ABS(p2.x), ABS(p2.z)); + + if (actor->currentProcess == mfish_ground_peck_process) { + return actor->_63E > 0; + } else if ((actor->group == 2) && (actor->position.x < p.x + 20.0f) && (actor->position.z > p.z - 10.0f) && + (actor->position.y < (actor->init_data._08 * 0.5f + 75.0f) - (v * 0.15f)) && (RANDOM_F(1.0f) > 0.2f)) { + return TRUE; + } + + return FALSE; +} + +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) { + f32 v; + xyz_t p2; + xyz_t p = suisou_pos[actor->group]; + xyz_t t; + xyz_t p3; + + f32 xy; + f32 s; + s16 s2; + + f32 d; + f32 dSQ; + + if (actor->group == 0) { + v = 0.05f; + } else if (actor->group == 1) { + v = 0.06f; + } else if (actor->group == 2) { + v = 0.2f; + } else if (actor->group == 3) { + v = 0.05f; + } else if (actor->group == 4) { + v = 0.08f; + } + xyz_t_sub(&actor->position, &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->group]; + + if (actor->group == 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->_618.z); + p2.z *= cos_s(actor->_618.z); + } + + if (actor->group == 4) { + p2.z += (GETREG(TAKREG, 0xb) * 0.01f + 0.5f) * cos_s(actor->_60C.y + DEG2SHORT_ANGLE(90)); + } else if (actor->group == 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->group == 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->position, &actor->_598->position, &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->group == 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; +} + +s16 mfish_get_escape_angle(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 v1 = atans_table(actor->_594->position.z - actor->position.z, actor->_594->position.x - actor->position.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(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->currentProcess != mfish_peck_process && actor->currentProcess != 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->group == 0 || actor->_624 == 10 || actor->_624 == 11 || + actor->fishIDEnum == aGYO_TYPE_AROWANA) && + ABS(vv) < DEG2SHORT_ANGLE(90) && ABS(actor->_622) < DEG2SHORT_ANGLE(10)) { + if (actor->currentProcess == 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(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + if ((play->game_frame & 7) == 0 && + ((actor->_62E_flags & 0x1e) == 0 || ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(80))) { + xyz_t p = actor->position; + 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 new file mode 100644 index 00000000..706fc44d --- /dev/null +++ b/src/actor/ac_museum_fish_bass.c_inc @@ -0,0 +1,379 @@ + +void mfish_bass_tail_anim_set(MUSEUM_FISH_PRIVATE_DATA* actor, s32 r4) { + if (r4 == 0) { + actor->_640 = 0xf; + actor->_5AC.z = 4; + } else if (r4 == 1 && actor->_640 == 0) { + actor->_640 = 0x14; + actor->_5AC.z = 3; + } +} + +void mfish_bass_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)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.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + + add_calc(&actor->_5D0.y, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); + t = add_calc(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y, 0); + if (fabsf(t) < 0.008f) { + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.03f), DEG2SHORT_ANGLE(1.0f + (0.5f * actor->_5AC.y)) >> 1, + 9); + } + mfish_move_smooth(actor, game); + mfish_get_flow_vec(&pos, actor, game); + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + actor->position.y = actor->position.y + actor->_5DC.y; + actor->position.y = MAX(60, MIN(110, actor->position.y)); +} + +void mfish_bass_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_634 = mfish_get_hide_camera_angle(actor); + + if ((actor->_62E_flags & 0x1E) != 0) { + // works with temp instead of cast + 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.y, CALC_EASE(0.5f), DEG2SHORT_ANGLE(22.5), + DEG2SHORT_ANGLE(0.5f)); + } + + actor->_5EC = 0.0f; + actor->currentProcess = &mfish_bass_dummy_process; + + return; +} + +void mfish_bass_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + // no clue what's going on here + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); +} + +void mfish_bass_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* fishActor) { + //! NOTE: wrong floats in this file, based on objdiff + f32 ra; + f32 t; + f32 temp; + + ra = RANDOM_F(fishActor->init_data._14) + fishActor->init_data._10; + t = (ra) / MAX(fishActor->init_data._14 + fishActor->init_data._10, 1); + + if (RANDOM_F(1.0f) > 0.25f && (fishActor->_62E_flags & 0x200) == 0) { + fishActor->_62E_flags |= 0x200; + } else { + fishActor->_62E_flags &= ~0x200; + } + + if (ra > fishActor->_5E8) { + f32 v2; + fishActor->_5F0 = ra; + fishActor->_5AC.x = 0.15f + Rnd_EX_fx(0.1f); + mfish_bass_tail_anim_set(fishActor, 0); + } + + fishActor->_5F4 = t * Rnd_EX_fx(10); + temp = (fishActor->_5F4 + fishActor->init_data._0C - fishActor->position.y); + fishActor->_612.x = DEG2SHORT_ANGLE2(temp * -(2 * fishActor->_5AC.y + 10)); + + fishActor->_612.x = CLAMP(fishActor->_612.x, DEG2SHORT_ANGLE(-50), DEG2SHORT_ANGLE(50)); + fishActor->_5D0.y = 0; + + if (RANDOM_F(1) > fishActor->init_data._1C) { + int diff; + + 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.y += DEG2SHORT_ANGLE(20); + } else { + fishActor->_612.y += DEG2SHORT_ANGLE(-20); + } + } + + if ((fishActor->_62E_flags & 0x200) == 0) { + fishActor->_632 = DEG2SHORT_ANGLE(t * 15 + 20); + } else { + fishActor->_632 = DEG2SHORT_ANGLE(t * 30 + 20); + } + } else { + if ((s16)(fishActor->_612.y - fishActor->_60C.y) > 0) { + fishActor->_612.y += DEG2SHORT_ANGLE(15); + } else { + fishActor->_612.y += DEG2SHORT_ANGLE(-15); + } + + if ((fishActor->_62E_flags & 0x200) == 0) { + fishActor->_632 = DEG2SHORT_ANGLE(t * 10 + 30); + } else { + fishActor->_632 = DEG2SHORT_ANGLE((GETREG(TAKREG, 42) + 40.0f) * t + 30); + } + } + if ((s16)(fishActor->_60C.y - fishActor->_612.y) > 0) { + fishActor->_636 = DEG2SHORT_ANGLE(0); + } else { + fishActor->_636 = DEG2SHORT_ANGLE(-180); + } + + fishActor->_62E_flags &= ~0xC0; + fishActor->_5EC = 0; + fishActor->currentProcess = mfish_bass_normal_process; +} + +void mfish_bass_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + //! NOTE: wrong floats in this file, based on objdiff + if (((actor->_62E_flags & 0x200) != 0 && actor->_632 > DEG2SHORT_ANGLE(20)) || actor->_640 > 0) { + f32 v = (actor->_5AC.y * 0.03f + 0.02f); + add_calc2(&actor->_5EC, + v + (actor->_5AC.y * 0.02f + 0.03f) * (float)((actor->_632 - DEG2SHORT_ANGLE(20)) / 364), + actor->_5AC.y * 0.04f + 0.01f, actor->_5AC.y * 0.02f + 0.01f); + add_calc(&actor->_5E8, actor->_5F0, CALC_EASE(v), actor->_5EC * 0.5f, 0.025f); + } + if (actor->_62E_flags & 0x200) { + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(GETREG(TAKREG, 73) * 0.01f + 0.5f), + (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.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->_618.z, actor->_622, CALC_EASE2(actor->_5AC.y * 0.25f + 0.25f), + (s16)(DEG2SHORT_ANGLE(actor->_5AC.y * 8.0f + 7.0f) >> 1) >> 1, 22); + + if (actor->_5E8 < 0.01f) { + mfish_bass_dummy_process_init(actor); + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_bass_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 a; + s16 b; + + b = a = DEG2SHORT_ANGLE(45) + DEG2SHORT_ANGLE(RANDOM_F(75)); + actor->_618.y = + DEG2SHORT_ANGLE((actor->_5AC.y * 4.0f + 4.0f) * (SHORT2DEG_ANGLE2(a) / 120.0f) + 2.0f + actor->_5AC.y); + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + b = -a; + } + } else if (actor->_62E_flags & 0xC0) { + if (actor->_62E_flags & 0x40) { + b = ABS(a); + } else { + b = -ABS(a); + } + } else if (actor->_62E_flags & 0x20) { + if ((s16)(actor->_62A - actor->_60C.y) < 0) { + b = -a; + } + } + + if (b > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += b; + + if ((RANDOM_F(1) < 0.25f) && (actor->_62E_flags & 0x200) == 0) { + actor->_62E_flags |= 0x200; + } else { + actor->_62E_flags &= ~0x200; + } + + if ((actor->_62E_flags & 0x200) == 0) { + actor->_5F0 = 1.75f; + actor->_5AC.x = Rnd_EX_fx(0.1f) + 0.15f; + } else { + actor->_5F0 = actor->init_data._10 + actor->init_data._14 * 0.7f; + actor->_5AC.x = Rnd_EX_fx(0.1f) + 0.15f; + } + + if (RANDOM_F(1) < 0.2f) { + actor->_63E = RANDOMF_RANGE(1, 4); + } else { + actor->_63E = 0; + } + + actor->_5EC = 0.0f; + actor->currentProcess = mfish_bass_turn_process; +} + +void mfish_bass_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + int a; + f32 v0, v1, v2, v3, v4; + v0 = actor->_5AC.y * 0.2f + 0.05f; + v1 = actor->_5AC.y * 0.04f + 0.01f; + v2 = actor->_5AC.y * 0.04f + 0.01f; + v3 = actor->_5AC.y * 0.15f + 0.1f; + v4 = actor->_5AC.y * 0.15f + 0.05f; + + if (ABS(actor->_622) > DEG2SHORT_ANGLE(20)) { + 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.y, ((s16)(sin_s(actor->_636) * actor->_632) + actor->_612.y), + CALC_EASE(0.2f), actor->_618.y >> 1, 45); + + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(2.5f), 22); + + 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); + mfish_bass_turn_process_init(actor); + + } else { + mfish_bass_normal_process_init(actor); + } + actor->_63E--; + } else { + mfish_bass_dummy_process_init(actor); + } + } +} + +void mfish_bass_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + GAME_PLAY* game = (GAME_PLAY*)gamex; + + mfish_onefish_ct(actor, gamex); + mfish_base_ct(actor, gamex); + + actor->currentProcess = mfish_bass_normal_process; + + if (actor->fishIDEnum == aGYO_TYPE_LARGE_BASS) { + actor->_5AC.y = 0; + } else if (actor->fishIDEnum == aGYO_TYPE_BASS) { + actor->_5AC.y = 0.5f; + } else { + actor->_5AC.y = 1; + } + + actor->_624 = 0xb; + + return; +} + +void mfish_bass_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! NOTE: wrong floats in this file, based on objdiff + mfish_onefish_mv(actor, gamex); + + if (actor->_5F8 > actor->init_data._08 * 20.0f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)(RANDOM_F(actor->init_data.activeFramesRange)); + actor->savedActivityFrameCount = actor->activityFrameCount; + + if (mfish_WallCheck(actor)) { + mfish_bass_tail_anim_set(actor, 1); + mfish_bass_turn_process_init(actor); + } else { + mfish_bass_tail_anim_set(actor, 0); + mfish_bass_normal_process_init(actor); + } + } else if (actor->currentProcess == &mfish_bass_normal_process) { + if (((actor->_62E_flags & 0x1e) && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || + ((actor->_62E_flags & 0x20) && + ABS((s16)((actor->_62A - DEG2SHORT_ANGLE(-180)) - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_bass_tail_anim_set(actor, 1); + mfish_bass_turn_process_init(actor); + } + } + actor->_638 += DEG2SHORT_ANGLE(10); + actor->currentProcess(actor, gamex); + + if (ABS(actor->_618.z) > ABS(actor->_622)) { + add_calc2(&actor->_5E8, MIN(GETREG(TAKREG, 19) * 0.1f + 1.0f, actor->_5E8), GETREG(TAKREG, 18) * 0.01f + 0.2f, + GETREG(TAKREG, 17) * 0.01f + 0.5f); + } + + add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE(0.05f), DEG2SHORT_ANGLE(actor->_5AC.y + 3.0f) >> 1, + 9); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.05f), DEG2SHORT_ANGLE(actor->_5AC.y * 0.5f + 2.0f) >> 1, 9); + + mfish_bass_base_FishMove(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + if (actor->_640 > 0) { + f32 tmp, num, denom; + // needed tmp before the decrement for some reason + tmp = (0.4f + (0.7f * actor->_5AC.y)); + actor->_640--; + 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); + } +} + +void mfish_bass_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele; + Mtx* mtx; + GRAPH* graph; + GAME_PLAY* play; + + play = (GAME_PLAY*)gamex; + + skele = &actor->_38; + + if (play->game.frame_counter % 2 != 0) { + mtx = &skele->_70; + } else { + mtx = &skele->_2b0; + } + + graph = play->game.graph; + + Matrix_translate(actor->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + + Matrix_translate(0, 0.25f * actor->init_data._04, 1.5f * actor->init_data._24, 1); + Matrix_RotateX(actor->_60C.x, 1); + Matrix_RotateZ(MY_CLAMP(-(actor->_618.z >> 1), DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)), 1); + Matrix_translate(0, 0.25f * -actor->init_data._04, 0.5f * -actor->init_data._24, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 1); + + OPEN_DISP(graph); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + CLOSE_DISP(graph); + + cKF_Si3_draw_R_SV(&play->game, &skele->_00, mtx, &mfish_before_disp, 0, actor); + return; +} diff --git a/src/actor/ac_museum_fish_big_fish.c_inc b/src/actor/ac_museum_fish_big_fish.c_inc new file mode 100644 index 00000000..6fe49ea9 --- /dev/null +++ b/src/actor/ac_museum_fish_big_fish.c_inc @@ -0,0 +1,210 @@ + +void mfish_big_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + qrand(); + actor->position.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->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + actor->_60C.y = -actor->_60C.y; + actor->position.z = 430.0f; + actor->position.x += 40.0f; + actor->_640 = 0; + } else if (actor->fishIDEnum == aGYO_TYPE_GIANT_SNAKEHEAD) { + actor->position.z = 530.0f; + actor->position.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->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); +} + +void mfish_big_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! NOTE: wrong floats in this function, based on objdiff + xyz_t p; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + if (actor->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + 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->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + 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.025f, 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); + } + + mfish_get_flow_vec(&p, actor, gamex); + actor->position.x += actor->_5D0.x + p.x * 0.1f; + actor->position.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->position.y, actor->init_data._0C + actor->_5F4, CALC_EASE(0.05f), 0.15f, 0.05f); + if (actor->group == 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->activityFrameCount-- < 0) { + if ((actor->fishIDEnum == aGYO_TYPE_ARAPAIMA && actor->_600 < 10.0f) || + (actor->fishIDEnum == aGYO_TYPE_GIANT_SNAKEHEAD && 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(RANDOM2_F(2.0f) + 3.0f); + if (actor->fishIDEnum == aGYO_TYPE_ARAPAIMA || 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(5.0f) + 15.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 = RANDOM2_F(5.0f); + actor->_642 = 0; + actor->_634 = 0; + actor->_640 = 0; + actor->_5AC.z = 0.0f; + } + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + } + Museum_Fish_BGCheck(actor, gamex); +} + +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) { + //! NOTE: wrong floats in this function, based on objdiff + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + + if (joint_num == 1) { + f32 v; + int i; + if (actor->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + 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->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + v = 0.025f; + } else { + v = 0.035f; + } + i = joint1->y - (actor->_618.z * 2) + + (int)(actor->_644 * (GETREG(TAKREG, 0x15) * 0.01f + 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->fishIDEnum == aGYO_TYPE_ARAPAIMA) { + 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) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_bfish_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_dojou.c_inc b/src/actor/ac_museum_fish_dojou.c_inc new file mode 100644 index 00000000..271307dc --- /dev/null +++ b/src/actor/ac_museum_fish_dojou.c_inc @@ -0,0 +1,210 @@ + +void mfish_dojou_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_624 = 6; + actor->_5AC.x = 0.0f; + mfish_dojou_normal_init(actor, gamex); +} + +void mfish_dojou_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->currentProcess = mfish_dojou_normal; +} + +void mfish_dojou_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 30.f); + actor->_636 += DEG2SHORT_ANGLE(10); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, + actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636) * cos_s(actor->_60C.x)), + CALC_EASE2(0.3f), DEG2SHORT_ANGLE(3.75f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(2.5f), + DEG2SHORT_ANGLE(0.25f)); + if (actor->_62E_flags & 0x1e) { + mfish_dojou_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 v = RANDOM_F(1.0f); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + 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)); + } + } +} + +void mfish_dojou_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->currentProcess = mfish_dojou_turn; +} + +void mfish_dojou_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 15.0f); + actor->_636 += DEG2SHORT_ANGLE(10); + actor->_622 = add_calc_short_angle2( + &actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636) * cos_s(actor->_60C.x)), + CALC_EASE2(0.3f), (s16)(DEG2SHORT_ANGLE(ABS(cos_s(actor->_60C.x)) * 15.0f) >> 1) >> 1, DEG2SHORT_ANGLE(0.25f)); + + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), + (s16)(DEG2SHORT_ANGLE(ABS(cos_s(actor->_60C.x)) * 10.0f) >> 1) >> 1, DEG2SHORT_ANGLE(0.25f)); + + if (ABS(actor->_622) < DEG2SHORT_ANGLE(1)) { + mfish_dojou_normal_init(actor, gamex); + } +} + +void mfish_dojou_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p; + actor->currentProcess(actor, gamex); + actor->_61E = add_calc_short_angle2(&actor->_60C.x, + actor->_612.x + (s16)(actor->_632 * sin_s(actor->_636) * sin_s(actor->_60C.x)), + CALC_EASE(0.1f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.5f)); + add_calc_short_angle2(&actor->_618.x, actor->_61E, CALC_EASE(0.1f), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.5f)); + + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.05f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.02f); + } + + 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) * 2.0f, 0.2f, 0.1f); + } + } + + v = cos_s(actor->_60C.x) * actor->_5E8; + 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->position.x += actor->_5D0.x + p.x; + actor->position.y += actor->_5D0.y + p.y; + actor->position.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + if (ABS(actor->_612.x) > DEG2SHORT_ANGLE(15)) { + add_calc2(&actor->_38._00.frame_control.speed, + (GETREG(TAKREG, 0x1a) * 0.1f + 3.0f) * 0.5f + (GETREG(TAKREG, 0x1b) * 0.1f + 3.0f) * actor->_5E8, + 0.2f, 0.1f); + add_calc2(&actor->_5AC.x, 1.0f, 0.1f, 0.02f); + } else { + add_calc2(&actor->_38._00.frame_control.speed, actor->_5E8 * 1.5f + 0.5f, 0.2f, 0.1f); + add_calc0(&actor->_5AC.x, 0.1f, 0.02f); + } + actor->_5B8 = actor->position; + Museum_Fish_BGCheck(actor, gamex); + if (actor->position.y < actor->init_data._08 + 50.f) { + actor->position.y = actor->init_data._08 + 50.f; + if (actor->_612.x > 0) { + if ((RANDOM_F(1.0f) < 0.5f && actor->_63E < 0) || actor->_63E > 0) { + actor->_612.x = DEG2SHORT_ANGLE(-80); + actor->_5F4 = 110.0f; + if (actor->_63E <= 0) { + actor->_63E = 1; + } else { + actor->_63E--; + } + } else { + if (actor->_63E == 0) { + actor->_63E--; + } + actor->_612.x = DEG2SHORT_ANGLE(-10); + actor->_5F4 = 75.0f; + } + } + } else if (actor->position.y > actor->_5F4 - actor->init_data._08) { + actor->position.y = actor->_5F4 - actor->init_data._08; + if (actor->_5F4 > 100.0f) { + actor->_612.x = DEG2SHORT_ANGLE(80); + mfish_hamon_make(actor, gamex); + } else { + actor->_612.x = DEG2SHORT_ANGLE(10); + } + } else { + if (actor->_63E > 0) { + if (actor->_612.x > 0) { + add_calc_short_angle2(&actor->_612.x, DEG2SHORT_ANGLE(75), CALC_EASE(0.25f), DEG2SHORT_ANGLE(0.25f), + DEG2SHORT_ANGLE(0.0f)); + } else { + add_calc_short_angle2(&actor->_612.x, DEG2SHORT_ANGLE(-75), CALC_EASE(0.25f), DEG2SHORT_ANGLE(0.25f), + DEG2SHORT_ANGLE(0.0f)); + } + } + actor->activityFrameCount--; + } + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); +} + +BOOL 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) { + 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(-45), DEG2SHORT_ANGLE(40)); + i = joint1->y + actor->_618.z; + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-40), DEG2SHORT_ANGLE(40)); + } else if (joint_num == 2) { + int i = (s16)(joint1->z - actor->_618.x); + f32 z; + f32 t; + joint1->z = MY_CLAMP(i, DEG2SHORT_ANGLE(-40), DEG2SHORT_ANGLE(40)); + z = actor->_618.z; + t = joint1->y * ((GETREG(TAKREG, 0x19) * 0.1f + 0.8f) * actor->_5AC.x + 1.0f); + i = (int)t - (int)z; + + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-80), DEG2SHORT_ANGLE(80)); + } + return TRUE; +} + +void mfish_dojou_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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; + OPEN_DISP(gamex->graph); + Matrix_translate(actor->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24 * (0.5f * cos_s(s) + ABS(cos_s(s))), 1); + Matrix_RotateX(s, 1); + Matrix_translate(0.0f, 0.0f, -actor->init_data._24 * 0.5f * cos_s(s), 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_dojou_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_donko.c_inc b/src/actor/ac_museum_fish_donko.c_inc new file mode 100644 index 00000000..86cedac4 --- /dev/null +++ b/src/actor/ac_museum_fish_donko.c_inc @@ -0,0 +1,131 @@ + +void mfish_donko_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! BUG: ? + qrand(); + mfish_onefish_ct(actor, gamex); + actor->position.x = GETREG(TAKREG, 0x32) + 450.f; + actor->position.y = GETREG(TAKREG, 0x33) + 60.f; + actor->position.z = GETREG(TAKREG, 0x34) + 180.f; + actor->_5E8 = 0.0f; + actor->_5AC = ZeroVec; + actor->_5F0 = actor->_5E8; + actor->_60C.y = DEG2SHORT_ANGLE(-90); + actor->_612.y = actor->_60C.y; + actor->_5F4 = 0.0f; + actor->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_622 = 0; + actor->_624 = 0; + actor->_63A = qrand(); + actor->_63C = qrand(); + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); +} + +void mfish_donko_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p; + f32 x, z; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + + if (actor->activityFrameCount > actor->savedActivityFrameCount - 10) { + actor->_38._00.frame_control.speed = (actor->_5E8 * 3.0f + 1.0f) * 0.5f; + } else { + add_calc2(&actor->_38._00.frame_control.speed, actor->_5E8 * 2.0f + 0.125f, 0.2f, 0.1f); + } + + actor->_5AC.y = 0.0f; + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + x = (actor->position.x - (suisou_pos[actor->group].x + 22.5f)); + z = (actor->position.z - (suisou_pos[actor->group].z - 31.25f)); + actor->_5D0.x -= x * 0.002f; + actor->_5D0.z -= z * 0.002f; + + actor->_5D0.y -= 0.05f; + actor->_5D0.y *= 0.95f; + mfish_get_flow_vec(&p, actor, gamex); + mfish_move_smooth(actor, gamex); + actor->position.x += actor->_5D0.x + actor->_5DC.x * 0.1f; + actor->position.z += actor->_5D0.z + actor->_5DC.z * 0.1f; + actor->position.y += actor->_5D0.y; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_60C.x, actor->_612.x >> 1, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + + if (actor->activityFrameCount-- < 0) { + s16 s = RANDOM_F(actor->init_data._30); + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_60C.y + s; + } else { + actor->_612.y = actor->_60C.y - s; + } + } else { + if (RANDOM_F(1.0f) > 0.5f) { + actor->_612.y = actor->_60C.y + s; + } else { + actor->_612.y = actor->_60C.y - s; + } + } + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + } else if (actor->activityFrameCount > actor->savedActivityFrameCount - 20) { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.025f); + } else { + actor->_5E8 *= actor->init_data._18; + } + + if (actor->_62E_flags & 0x1e && actor->_5E8 > 0.05f) { + s16 s = actor->_62C; + if ((s16)(actor->_612.y - actor->_62C) > DEG2SHORT_ANGLE(-1) && + ABS((s16)(actor->_612.y - actor->_62C)) < DEG2SHORT_ANGLE(95)) { + s += DEG2SHORT_ANGLE(90); + } else { + s -= DEG2SHORT_ANGLE(90); + } + + add_calc_short_angle2(&actor->_612.y, s, CALC_EASE(0.2f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.5f)); + } + + Museum_Fish_DonkoBGCheck(actor, gamex); +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int i = joint1->x + (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + } else if (joint_num == 2) { + int i = joint1->y - (actor->_618.z << 1); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-60), DEG2SHORT_ANGLE(60)); + i = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + } + + return TRUE; +} + +void mfish_donko_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24 * 1.5f, 1); + Matrix_RotateX(actor->_60C.x, 1); + Matrix_translate(0.0f, 0.0f, -actor->init_data._24 * 0.5f, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_donko_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_gupi.c_inc b/src/actor/ac_museum_fish_gupi.c_inc new file mode 100644 index 00000000..5924cb5e --- /dev/null +++ b/src/actor/ac_museum_fish_gupi.c_inc @@ -0,0 +1,214 @@ + +void mfish_gupi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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_ANGLE(RANDOM2_F(actor->init_data._30 * 2.0f)); + actor->_612.x = actor->_60C.x; + actor->_5F4 = 115.f; + actor->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_624 = 6; + mfish_gupi_normal_init(actor, gamex); +} + +void mfish_gupi_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->currentProcess = mfish_gupi_normal; +} + +void mfish_gupi_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 35.f); + actor->_636 += DEG2SHORT_ANGLE(7.5f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + 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 (actor->_62E_flags & 0x1e) { + mfish_gupi_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 v = RANDOM_F(1.0f); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + 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(20)) { + actor->_612.x = RANDOM2_F(actor->init_data._30 * 2.0f * (v - 0.3f)); + if (actor->_612.x > 0) { + actor->_612.x = MAX(actor->_612.x, DEG2SHORT_ANGLE(5)); + } else { + actor->_612.x = MIN(actor->_612.x, DEG2SHORT_ANGLE(-5)); + } + } + + } else if (actor->_5F8 > actor->init_data._08 * 30.f) { + s16 s; + //! BUG: unused? + RANDOM_F(1.0f); + s = search_position_angleY(&suisou_pos[actor->group], &actor->position); + actor->_5F8 = 0.0f; + actor->_612.y = s + DEG2SHORT_ANGLE(RANDOM2_F(90.0)); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } +} + +void mfish_gupi_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->currentProcess = mfish_gupi_turn; +} + +void mfish_gupi_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 15.0f); + actor->_636 += DEG2SHORT_ANGLE(7.5f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + 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_gupi_normal_init(actor, gamex); + } +} + +void mfish_gupi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p; + int s; + actor->currentProcess(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)); + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.05f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.02f); + } + + 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 = cos_s(actor->_60C.x) * actor->_5E8; + 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->position.x += actor->_5D0.x + p.x; + actor->position.y += actor->_5D0.y + p.y; + actor->position.z += actor->_5D0.z + p.z; + + mfish_onefish_mv(actor, gamex); + if (actor->_5F0 - 0.01f > actor->_5E8 && actor->_5F0 > 0.1f) { + actor->_38._00.frame_control.speed = + (1.0f + GETREG(TAKREG, 0x28) * 0.1f) * 0.5f + (3.0f + GETREG(TAKREG, 0x29) * 0.1f) * actor->_5E8; + } else { + 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->position; + Museum_Fish_BGCheck(actor, gamex); + + if (actor->position.y < (actor->_5F4 - 30.f) + actor->init_data._08) { + actor->position.y = (actor->_5F4 - 30.f) + actor->init_data._08; + if (actor->_612.x > 0) { + if (RANDOM_F(1.0f) < 0.1f) { + actor->_5F4 -= RANDOM_F(10.f) + 5.0f; + actor->_5F4 = CLAMP(actor->_5F4, 85.0f, 115.0f); + } else { + actor->_612.x = DEG2SHORT_ANGLE(-30); + } + } + } else if (actor->position.y > actor->_5F4 - actor->init_data._08) { + actor->position.y = actor->_5F4 - actor->init_data._08; + if (actor->_612.x <= 0) { + if (RANDOM_F(1.0f) < 0.1f) { + actor->_5F4 += RANDOM_F(10.f) + 5.0f; + actor->_5F4 = CLAMP(actor->_5F4, 85.0f, 115.0f); + } else { + actor->_612.x = DEG2SHORT_ANGLE(30); + } + } + if (actor->_5F4 > 110.f || actor->position.y >= 114.5f - actor->init_data._08) { + mfish_hamon_make(actor, gamex); + } + } else { + actor->activityFrameCount--; + } + + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int s = joint1->x + actor->_618.z; + joint1->x = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + s = joint1->y + actor->_618.z; + joint1->y = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + } else if (joint_num == 2) { + int s; + if (actor->_5F0 - 0.001f > actor->_5E8) { + joint1->y += (int)(2.0f * (actor->_5F0 - actor->_5E8) * joint1->y); + } + s = joint1->y - actor->_618.z * 3; + joint1->y = MY_CLAMP(s, -DEG2SHORT_ANGLE(60), DEG2SHORT_ANGLE(60)); + s = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + joint1->z += (s16)(actor->_618.x * (-1.3f + GETREG(TAKREG, 0x4e) * 0.1f)); + 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, 1.0f, 1); + } + return TRUE; +} + +void mfish_gupi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele = &actor->_38; + Mtx* mtxp; + s16 v; + if (gamex->frame_counter & 1) { + mtxp = &skele->_70; + } else { + mtxp = &skele->_2b0; + } + v = actor->_60C.x * 0.7f; + OPEN_DISP(gamex->graph); + Matrix_translate(actor->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24 * 1.5f, 1); + Matrix_RotateX(v, 1); + Matrix_translate(0.0f, 0.0f, -actor->init_data._24 * 0.5f, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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); +} diff --git a/src/actor/ac_museum_fish_hasu.c_inc b/src/actor/ac_museum_fish_hasu.c_inc new file mode 100644 index 00000000..65a9a8de --- /dev/null +++ b/src/actor/ac_museum_fish_hasu.c_inc @@ -0,0 +1,213 @@ +// Pretty sure all the floats in this file are correct + +extern cKF_Skeleton_R_c cKF_bs_r_obj_museum5_hasu; +extern cKF_Animation_R_c cKF_ba_r_obj_museum5_hasu; + +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, 0.5f, + 0.0f); +} + +void mfish_hasu_mv(YET_SKELETON_2* actor, GAME* gamex) { + cKF_SkeletonInfo_R_play(&actor->_00._00); +} + +void mfish_hasu_dw(YET_SKELETON_2* actor, GAME* gamex) { + Mtx* mtxp; + if (gamex->frame_counter & 1) { + mtxp = &actor->_00._70; + } else { + mtxp = &actor->_00._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._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) { + 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, 0.5f, 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, 0.5f, + 0.0f); + actor->position.x = 453.9f; + actor->position.y = 116.0f; + actor->position.z = 250.4f; + actor->_5AC = ZeroVec; + actor->activityFrameCount = 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; + 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->position); + 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); + } + } +} + +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) { + 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; +} + +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->position); + actor->position.y = skele->_564 * actor->init_data.renderScale * 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; + } + + 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->position.x + actor->_5AC.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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); +} diff --git a/src/actor/ac_museum_fish_ito.c_inc b/src/actor/ac_museum_fish_ito.c_inc new file mode 100644 index 00000000..93deec89 --- /dev/null +++ b/src/actor/ac_museum_fish_ito.c_inc @@ -0,0 +1,127 @@ + +void mfish_ito_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! BUG: unused + s16 s = qrand(); + actor->position.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); + 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->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); +} + +void mfish_ito_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + actor->_38._00.frame_control.speed = (sin_s(actor->_63A) * 0.6f + 3.0f) * 0.5f; + actor->_5AC.y = sin_s(actor->_63A) * 0.2f; + 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 (ABS(actor->_600 - actor->_5FC) > 60.f) { + if (actor->_600 > actor->_5FC) { + add_calc2(&actor->_5F0, 0.1f, CALC_EASE(0.05f), 0.005f); + } else { + add_calc2(&actor->_5F0, -0.1f, CALC_EASE(0.05f), 0.005f); + } + } + mfish_get_flow_vec(&p, actor, gamex); + actor->position.x += actor->_5D0.x + p.x * 0.1f; + actor->position.z += actor->_5D0.z + p.z * 0.1f; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, 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(&actor->position.y, actor->init_data._0C + actor->_5F4, CALC_EASE(0.05f), 0.15f, 0.05f); + actor->_646 += DEG2SHORT_ANGLE(10); + 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)); + add_calc_short_angle2(&actor->_644, actor->_634, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(0.625f), + DEG2SHORT_ANGLE(0.025f)); + add_calc2(&actor->_5AC.x, actor->_5AC.z, 0.25f, 0.001f); + if (actor->activityFrameCount-- < 0) { + if (RANDOM_F(1.0f) > 0.5f && actor->_600 > 5.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)); + actor->_642 = DEG2SHORT_ANGLE(RANDOM2_F(2.0f) + 3.0f); + actor->_634 = DEG2SHORT_ANGLE(RANDOM_F(10.0f) + 20.0f); + actor->_640 = DEG2SHORT_ANGLE(RANDOM_F(10.0f)); + actor->_5AC.z = Rnd_EX_f(0.06f); + } else { + actor->_5F0 = -0.1f; + actor->_5F4 = RANDOM2_F(5.0f); + actor->_642 = 0; + actor->_634 = 0; + actor->_640 = 0; + actor->_5AC.z = 0.0f; + } + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + } + Museum_Fish_BGCheck(actor, gamex); +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + f32 v; + int 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)); + v = actor->_5AC.x * actor->_644 * sin_s(actor->_646 - DEG2SHORT_ANGLE(90)); + trans->z += v; + Matrix_scale(1.0f, sin_s(actor->_63A + actor->_63C) * 0.025f + 1.0f, sin_s(actor->_63A) * 0.025f + 1.0f, 1); + } else if (joint_num == 2) { + int i; + i = joint1->y - 2 * actor->_618.z + + (int)(actor->_644 * (GETREG(TAKREG, 0x15) * 0.01f + 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, sin_s(actor->_63A + DEG2SHORT_ANGLE(270)) * 0.05f + 1.0f, + sin_s(actor->_63A + DEG2SHORT_ANGLE(90)) * 0.05f + 1.0f, 1); + } + return TRUE; +} + +void mfish_ito_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + + 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->position.x, actor->position.y + actor->_5AC.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_ito_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_kaseki.c_inc b/src/actor/ac_museum_fish_kaseki.c_inc new file mode 100644 index 00000000..410d1dc3 --- /dev/null +++ b/src/actor/ac_museum_fish_kaseki.c_inc @@ -0,0 +1,191 @@ + +void mfish_kaseki_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + actor->_5E8 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->_5F0 = actor->_5E8; + if (RANDOM_F(1.0f) > 0.5f) { + actor->_60C.y = DEG2SHORT_ANGLE(90); + } else { + actor->_60C.y = DEG2SHORT_ANGLE(-90); + } + actor->_612.y = actor->_60C.y; + actor->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = 0; + actor->_634 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_624 = 1; + actor->_594 = NULL; + actor->_598 = NULL; + mfish_kaseki_normal_init(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); +} + +void mfish_kaseki_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->currentProcess = mfish_kaseki_normal; +} + +void mfish_kaseki_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 s = ABS(actor->_622) * (actor->init_data._30 * (GETREG(TAKREG, 0x1d) * 0.001f + 0.5f) / 32749.0f); + s = MIN(actor->_634, MAX(s, DEG2SHORT_ANGLE2(5))); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE(0.5), DEG2SHORT_ANGLE(5), DEG2SHORT_ANGLE(0.5f)); + actor->_636 += 455; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(GETREG(TAKREG, 0x1e) * 0.01f + 0.15f), (s16)(s >> 1) >> 1, + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(GETREG(TAKREG, 0x1f) * 0.01f + 0.1f), + (s16)(DEG2SHORT_ANGLE(GETREG(TAKREG, 0x20) * 0.1f + 4.0f) >> 1) >> 1, DEG2SHORT_ANGLE(0.25f)); + if (actor->_5FC < 10.0f - actor->init_data._28 * 0.5f) { + if (actor->_612.y < 0) { + s16 v; + if (actor->_604 > actor->_608) { + v = actor->_60C.y - DEG2SHORT_ANGLE(90); + } else { + v = actor->_60C.y + DEG2SHORT_ANGLE(90); + } + actor->_612.y = v; + } else { + add_calc_short_angle2(&actor->_612.y, DEG2SHORT_ANGLE(90), CALC_EASE(GETREG(TAKREG, 0x21) * 0.01f + 0.25f), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x22) + 25.0f) >> 1, DEG2SHORT_ANGLE(0.5f)); + } + } else if (actor->_600 < 10.0 - actor->init_data._28 * 0.5) { + if (actor->_612.y > 0) { + s16 v; + if (actor->_604 > actor->_608) { + v = actor->_60C.y + DEG2SHORT_ANGLE(90); + } else { + v = actor->_60C.y - DEG2SHORT_ANGLE(90); + } + actor->_612.y = v; + } else { + add_calc_short_angle2(&actor->_612.y, DEG2SHORT_ANGLE(-90), CALC_EASE(GETREG(TAKREG, 0x21) * 0.01f + 0.25f), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x22) + 25.0f) >> 1, DEG2SHORT_ANGLE(0.5f)); + } + } else if (actor->_62E_flags & 0x1e) { + mfish_kaseki_move_wall_smooth(actor, gamex); + } else if (actor->activityFrameCount < 0) { + f32 r = RANDOM_F(1.0f); + actor->_612.y = actor->_60C.y; + if ((actor->_608 - actor->_604) * cos_s(actor->_60C.y) < 0) { + actor->_612.y += (s16)(r * actor->init_data._30); + } else { + actor->_612.y -= (s16)(r * actor->init_data._30); + } + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)(RANDOM_F(actor->init_data.activeFramesRange)); + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + } +} + +void mfish_kaseki_move_wall_smooth(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + int n = (s16)actor->_62C; + s16 s; + s16 a, b; + s16 diff; + if (MIN(actor->_5FC, actor->_600) < 40.0f && ABS(actor->_618.z) > DEG2SHORT_ANGLE(5)) { + return; + } + + diff = actor->_60C.y - (s16)n; + if (diff > 0) { + s = ((s16)n + DEG2SHORT_ANGLE(90.0f)); + } else { + s = ((s16)n - DEG2SHORT_ANGLE(90.0f)); + } + + a = (actor->_612.y - actor->_60C.y); + b = s - actor->_60C.y; + if (a * b > DEG2SHORT_ANGLE(-5)) { + add_calc_short_angle2(&actor->_612.y, s, CALC_EASE(0.25f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0)); + } +} + +void mfish_kaseki_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + f32 v; + actor->currentProcess(actor, game); + add_calc2(&actor->position.y, actor->init_data._0C, 0.5f, 0.1f); + if (ABS(actor->_622) > DEG2SHORT_ANGLE(10)) { + add_calc_short_angle2(&actor->_634, DEG2SHORT_ANGLE(20), CALC_EASE(0.25f), DEG2SHORT_ANGLE(0.25f), + DEG2SHORT_ANGLE(0)); + } else { + add_calc_short_angle2(&actor->_634, DEG2SHORT_ANGLE(1), CALC_EASE(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0)); + } + + if (MIN(actor->_5FC, actor->_600) < 20.0f) { + if (ABS(actor->_618.z) > ABS(actor->_622) && + ABS(actor->_618.z) < DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x36) + 20.0f)) { + add_calc2(&actor->_5E8, GETREG(TAKREG, 0x30) * 0.01f + 0.8f, GETREG(TAKREG, 0x31) * 0.01f + 0.25f, + GETREG(TAKREG, 0x32) * 0.01f + 0.1f); + } else { + add_calc2(&actor->_5E8, GETREG(TAKREG, 0x33) * 0.01f + 0.35f, GETREG(TAKREG, 0x34) * 0.01f + 0.05f, + GETREG(TAKREG, 0x35) * 0.01f + 0.05f); + } + } else { + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.01f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.3f, 0.02f); + } + } + v = actor->_5E8 * (1.0f - ((sin_s(actor->_63A) * 0.2f + 0.2f) * MAX(cos_s(actor->_618.z), 0.5f))); + actor->_5D0.x = v * sin_s(actor->_60C.y); + actor->_5D0.z = v * cos_s(actor->_60C.y); + actor->position.x += actor->_5D0.x; + actor->position.z += actor->_5D0.z; + mfish_onefish_mv(actor, game); + actor->_38._00.frame_control.speed = actor->_5E8 * 0.75f + 0.25f; + mfish_body_wind_anime_play(actor, game); + Museum_Fish_BGCheck(actor, game); + if (actor->position.y < 55.0f - actor->init_data._04) { + actor->position.y = 55.0f - actor->init_data._04; + } + actor->activityFrameCount--; +} + +BOOL mfish_kaseki_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*)arg; + int i; + if (joint_num == 1) { + i = joint1->x + (int)(actor->_618.z * (GETREG(TAKREG, 0x47) * 0.01f + 0.5f)); + joint1->x = MIN(MAX(i, DEG2SHORT_ANGLE(-10)), DEG2SHORT_ANGLE(10)); + Matrix_scale(1.0f, (GETREG(TAKREG, 0x36) * 0.001f + 0.02f) * sin_s(actor->_63A + actor->_63C) + 1.0f, + (GETREG(TAKREG, 0x36) * 0.001f + 0.02f) * sin_s(actor->_63A) + 1.0f, 1); + } else if (joint_num == 2) { + i = joint1->y - (int)(actor->_618.z * (GETREG(TAKREG, 0x46) * 0.01f + 1.25f)); + joint1->y = MIN(MAX(i, DEG2SHORT_ANGLE(-50)), DEG2SHORT_ANGLE(50)); + i = joint1->x - (int)(actor->_618.z * (GETREG(TAKREG, 0x48) * 0.01f + 0.25f)); + joint1->x = MIN(MAX(i, DEG2SHORT_ANGLE(-10)), DEG2SHORT_ANGLE(10)); + Matrix_scale(1.0f, (GETREG(TAKREG, 0x37) * 0.001f + 0.045f) * sin_s(actor->_63A + DEG2SHORT_ANGLE(270)) + 1.0f, + (GETREG(TAKREG, 0x37) * 0.001f + 0.045f) * sin_s(actor->_63A + DEG2SHORT_ANGLE(90)) + 1.0f, 1); + } else if (joint_num == 3) { + i = joint1->y - (int)(actor->_618.z * (GETREG(TAKREG, 0x47) * 0.01f + 1.25f)); + joint1->y = MIN(MAX(i, DEG2SHORT_ANGLE(-50)), DEG2SHORT_ANGLE(50)); + i = joint1->x + DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x2d) * sin_s(actor->_63A)); + joint1->x = MIN(MAX(i, DEG2SHORT_ANGLE(-40)), DEG2SHORT_ANGLE(40)); + } + return TRUE; +} + +void mfish_kaseki_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_kaseki_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_kingyo.c_inc b/src/actor/ac_museum_fish_kingyo.c_inc new file mode 100644 index 00000000..96143ebd --- /dev/null +++ b/src/actor/ac_museum_fish_kingyo.c_inc @@ -0,0 +1,263 @@ + +void mfish_kingyo_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = RANDOM_F(130.f); + actor->_624 = 6; + mfish_kingyo_normal_init(actor, gamex); +} + +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->currentProcess = mfish_kingyo_normal; +} + +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_flags & 0x1e) { + mfish_kingyo_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 v = RANDOM_F(1.0f); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + 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->group], &actor->position); + actor->_5F8 = 0.0f; + actor->_612.y = s + DEG2SHORT_ANGLE(RANDOM2_F(90)); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = RANDOM_F(130.f); + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } +} + +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->currentProcess = mfish_kingyo_turn; +} + +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(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 dist; + mfish_get_player_angle(actor, gamex, &actor->_612.y, &actor->_612.x, &dist); + actor->activityFrameCount = 120; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = RANDOM_F(130.f); + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + actor->currentProcess = mfish_kingyo_peck; +} + +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->activityFrameCount < 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_flags & 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(RANDOM2_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->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = RANDOM_F(130.f); + } else { + actor->activityFrameCount = 60; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_640 = RANDOM_F(130.f); + } + } else if (MF_Control_Actor->_14db4 != actor->group) { + 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->currentProcess(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)); + + 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->position.x += actor->_5D0.x + p.x; + actor->position.y += actor->_5D0.y + p.y; + actor->position.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + if ((((actor->_5F0 - 0.01f) > actor->_5E8) || + (actor->activityFrameCount > (s16)(actor->savedActivityFrameCount - 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->position; + Museum_Fish_BGCheck(actor, gamex); + if (actor->position.y < 60.f + actor->init_data._08) { + actor->position.y = 60.f + actor->init_data._08; + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(-30); + } + } else if (actor->position.y > 115.f - actor->init_data._08) { + actor->position.y = 115.f - actor->init_data._08; + actor->_612.x = DEG2SHORT_ANGLE(30); + mfish_hamon_make(actor, gamex); + } else { + actor->activityFrameCount--; + } + + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); +} + +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) { + 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) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_kingyo_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_koi.c_inc b/src/actor/ac_museum_fish_koi.c_inc new file mode 100644 index 00000000..09b68c13 --- /dev/null +++ b/src/actor/ac_museum_fish_koi.c_inc @@ -0,0 +1,516 @@ +void mfish_koi_tail_anim_set(MUSEUM_FISH_PRIVATE_DATA* actor, s32 r4) { + f32 temp; + f32 temp2; + f32 temp3; + if (r4 == 0) { + actor->_640 = RANDOM_RANGE(25, 31); + actor->_5AC.x = RANDOM2F_RANGE(6.5f, 6.5f); + } else if (r4 == 1) { + if (actor->_640 == 0) { + actor->_640 = RANDOM_RANGE(20, 24); + actor->_5AC.x = RANDOM2F_RANGE(5.0f, 5.0f); + } + } else { + if (actor->_640 == 0) { + actor->_640 = RANDOM_RANGE(45, 51); + actor->_5AC.x = RANDOM2F_RANGE(1.0f, 1.0f); + } + } +} + +void mfish_koi_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 < 10.0f || actor->_604 < 10.0f || actor->_600 < 10.0f || + actor->_5FC < 10.0f) && + (actor->currentProcess != mfish_koi_peck_process)) { + vv = actor->_60C.y - (s16)v; + if (ABS(vv) < DEG2SHORT_ANGLE(45)) { + add_calc0(&actor->_5E8, 0.05f * cos_s(vv << 1), 0.0025f); + } + + if (ABS(vv) < DEG2SHORT_ANGLE(90) && ABS(actor->_622) < DEG2SHORT_ANGLE(15)) { + if (actor->currentProcess == mfish_koi_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.15f), + DEG2SHORT_ANGLE(actor->_5E8 * ((GETREG(TAKREG, 0x2e) + 5.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.15f), + DEG2SHORT_ANGLE(actor->_5E8 * ((GETREG(TAKREG, 0x2e) + 5.0f) * cos_s(vv)) + 1.5f) >> 1, + DEG2SHORT_ANGLE(0.5f)); + } + } + } + } +} + +void mfish_koi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + GAME_PLAY* game = (GAME_PLAY*)gamex; + + mfish_onefish_ct(actor, gamex); + mfish_base_ct(actor, gamex); + + actor->currentProcess = mfish_koi_normal_process; + actor->_5E8 = actor->init_data._10; + actor->_5AC.z = 1.0f; + actor->_624 = 9; +} + +void mfish_koi_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_634 = mfish_get_hide_camera_angle(actor); + if (actor->_62E_flags & 0x1e) { + 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.y, CALC_EASE(0.4), DEG2SHORT_ANGLE(7.5f), + DEG2SHORT_ANGLE(0.5f)); + } + actor->_5F0 = MIN(MAX(actor->init_data._10, 0.1f), actor->_5E8); + actor->_5EC = 0.0f; + actor->currentProcess = mfish_koi_dummy_process; +} + +void mfish_koi_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(3.75f), + DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.5f), + DEG2SHORT_ANGLE(0.125f)); + add_calc2(&actor->_5EC, 0.05f, 0.25f, 0.025f); + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, actor->_5EC); + add_calc0(&actor->_5F0, 0.02f, 0.01f); +} + +void mfish_koi_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 v = RANDOM_F(actor->init_data._14) + actor->init_data._10; + + f32 v2 = v / MAX(actor->init_data._14 + actor->init_data._10, 1.0f); + if (v > actor->_5E8) { + mfish_koi_tail_anim_set(actor, 0); + actor->_5F0 = v; + } + actor->_5F4 = Rnd_EX_fx(10.0f) * v2; + actor->_612.x = DEG2SHORT_ANGLE(-10 * (actor->_5F4 + actor->init_data._0C - actor->position.y)); + actor->_612.x = CLAMP(actor->_612.x, DEG2SHORT_ANGLE(-50), DEG2SHORT_ANGLE(50)); + + actor->_5D0.y = 0.0f; + + if (RANDOM_F(1.0f) > actor->init_data._1C) { + actor->_612.y += (s16)Rnd_EX_fx(actor->init_data._30 * 2.0f); + + if (ABS((s16)(actor->_612.y - actor->_60C.y)) < DEG2SHORT_ANGLE(20)) { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 30.0f + 20.0f); + } else { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + actor->_632 = DEG2SHORT_ANGLE(v2 * 40.0f + 30.0f); + } + + if ((s16)(actor->_60C.y - actor->_612.y) > 0) { + actor->_636 = DEG2SHORT_ANGLE(-180); + } else { + actor->_636 = 0; + } + + actor->_62E_flags &= ~0xC0; + actor->_5EC = 0.0f; + actor->currentProcess = mfish_koi_normal_process; +} + +void mfish_koi_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + s16 temp; + //! NOTE: wrong float somewhere in this file, just based on objdiffs colors changing + if (ABS(actor->_632) > DEG2SHORT_ANGLE(20) || actor->_640 > 0) { + add_calc2(&actor->_5EC, ((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.0035f + 0.03f, 0.35f, + 0.05f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.4f), actor->_5EC * 0.5f); + } + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.05f), DEG2SHORT_ANGLE(0.375), DEG2SHORT_ANGLE(0.125)); + temp = DEG2SHORT_ANGLE2((actor->_5E8 * 2.0f) / (actor->init_data._14 + actor->init_data._10) + 3.0f); + actor->_636 += temp; + + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.0f), + DEG2SHORT_ANGLE(0.125f)); + + if (actor->_5E8 < 0.01f && actor->_632 < DEG2SHORT_ANGLE(1)) { + if (RANDOM_F(1.0f) < 0.8f) { + mfish_koi_long_move_process_init(actor); + } else { + mfish_koi_dummy_process_init(actor); + } + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_koi_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 s3 = DEG2SHORT_ANGLE(RANDOM_F(30.0f)) + DEG2SHORT_ANGLE(60.0f); + actor->_618.y = ABS(DEG2SHORT_ANGLE2((SHORT2DEG_ANGLE2(s3) / 120.0f) * 3.0f + 2.0f)); + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + s3 = -s3; + } + } else if (actor->_62E_flags & 0xC0) { + if (actor->_62E_flags & 0x40) { + s3 = ABS(s3); + } else { + s3 = -ABS(s3); + } + actor->_62E_flags &= ~0xC0; + } else if (actor->_62E_flags & 0x20 && (actor->_62A - actor->_60C.y) < 0) { + s3 = -s3; + } + + if (s3 > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += s3; + + if (RANDOM_F(1.0f) < 0.2f) { + actor->_63E = RANDOM_F(2.0f) + 1.0f; + } else { + actor->_63E = 0; + } + + actor->_5EC = 0.0f; + actor->_5F0 = actor->init_data._10; + actor->currentProcess = mfish_koi_turn_process; +} + +void mfish_koi_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + if (ABS(actor->_622) > DEG2SHORT_ANGLE(35) || actor->_640 > 0) { + add_calc2(&actor->_5EC, 0.08f, 0.2f, 0.1f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.1f), actor->_5EC * 0.5f); + } + + add_calc2(&actor->_5F0, MAX(actor->init_data._10, 0.0f), 0.15f, 0.2f); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE(0.2f), actor->_618.y >> 1, DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); + if (ABS(actor->_622) < DEG2SHORT_ANGLE(2) && actor->_5E8 < 0.1f) { + if (actor->_63E > 0 && ABS(actor->_618.z) < DEG2SHORT_ANGLE(2)) { + if (mfish_WallCheck(actor)) { + mfish_koi_tail_anim_set(actor, 1); + mfish_koi_turn_process_init(actor); + } else { + mfish_koi_normal_process_init(actor); + } + actor->_63E--; + } else { + if (RANDOM_F(1.0f) < 0.8f) { + mfish_koi_long_move_process_init(actor); + } else { + mfish_koi_dummy_process_init(actor); + } + } + } +} + +void mfish_koi_peck_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + f32 fVar8; + f32 fVar9; + int t; + s16 atanx; + s16 atany; + f32 dist; + + actor->_5D0.y = 0.0f; + mfish_get_player_angle(actor, game, &atanx, &atany, &dist); + fVar9 = (actor->init_data)._10 + RANDOM_F(actor->init_data._14); + + if (dist < 60.0f) { + fVar9 *= 0.75f; + actor->_5F0 = MIN(fVar9, 0.75f); + } + + if (fVar9 > actor->_5E8) { + actor->_5F0 = fVar9; + } + + fVar8 = (fVar9 / 8.0f); + + if (ABS((s16)(atanx - actor->_60C.y)) < actor->init_data._30) { + actor->_612.y = atanx; + } else if ((s16)(atanx - actor->_60C.y) > 0) { + actor->_612.y = actor->_60C.y + actor->init_data._30; + } else { + actor->_612.y = actor->_60C.y - actor->init_data._30; + } + + if (atany < 0) { + actor->_5F4 = actor->_5F4 + RANDOM_F(2.5f); + actor->_5F4 = MAX(MIN(10, actor->_5F4), -10); + + } else { + actor->_5F4 = actor->_5F4 - RANDOM_F(2.5f); + actor->_5F4 = MAX(MIN(10, actor->_5F4), -10); + } + + actor->_632 = DEG2SHORT_ANGLE((fVar8 * 40.0f) + 30.0f); + + if (qrand() & 0x8000) { + actor->_636 = DEG2SHORT_ANGLE(90); + } else { + actor->_636 = DEG2SHORT_ANGLE(-90); + } + + actor->_62E_flags &= ~0xC0; + actor->_5EC = 0.0f; + actor->currentProcess = mfish_koi_peck_process; +} + +void mfish_koi_peck_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 atanx; + s16 atany; + f32 dist; + + // mfish_get_player_angle(actor, gamex, &atanx, &atany, &dist); + + if (ABS(actor->_632) > DEG2SHORT_ANGLE(20) || actor->_640 > 0) { + add_calc2(&actor->_5EC, ((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2)) * 0.0035f + 0.04f, 0.4f, + 0.1f); + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.4f), actor->_5EC * 0.5f); + } + + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.05f), DEG2SHORT_ANGLE(0.375f), DEG2SHORT_ANGLE(0.125f)); + actor->_636 += DEG2SHORT_ANGLE(3.f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.f), DEG2SHORT_ANGLE(0.125f)); + + if (mfish_peck_wall_check(actor, gamex)) { + if (RANDOM_F(1.0f) < 0.8f) { + actor->_5E8 = -0.05f - RANDOM_F(0.1f); + actor->_5F0 = 0.05f; + actor->activityFrameCount = DEG2SHORT_ANGLE(0.33f); + } else { + actor->_5E8 = -0.1f - RANDOM_F(0.05f); + actor->_5F0 = 0.05f; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + // actor->_626 >>= 3; + } + actor->savedActivityFrameCount = actor->activityFrameCount; + // actor->_5F0 = 0.0f; + } +} + +void mfish_koi_long_move_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_5F0 = MAX(MIN(actor->_5E8, 0.5f), 0.05f); + actor->_5EC = 0.0f; + actor->currentProcess = mfish_koi_long_move_process; +} + +void mfish_koi_long_move_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(2.f), + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.15f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.25f)); + add_calc2(&actor->_5EC, 0.05f, 0.25f, 0.025f); + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, actor->_5EC); +} + +void mfish_koi_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + xyz_t p; + if ((actor->currentProcess != mfish_koi_turn_process && actor->currentProcess != mfish_koi_long_move_process) || + actor->_640 > DEG2SHORT_ANGLE(0)) { + add_calc0(&actor->_5E8, 1.0f - actor->init_data._18, GETREG(TAKREG, 0x13) * 0.001f + 0.01f); + } else { + add_calc0(&actor->_5E8, 1.0f - actor->init_data._18, GETREG(TAKREG, 0x14) * 0.0001f + 0.0005f); + } + add_calc0(&actor->_5EC, 0.5f, 0.01f); + + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y) * cos_s(actor->_60C.x); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y) * cos_s(actor->_60C.x); + add_calc(&actor->_5D0.y, MAX(ABS(actor->_5E8 * sin_s(actor->_60C.x)), 0.1f), 0.1f, 0.1f, 0.005f); + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y); + mfish_koi_move_smooth(actor, game); + mfish_get_flow_vec(&p, actor, game); + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + actor->position.y += actor->_5DC.y * 0.05f; + actor->position.y = MAX(60.f, MIN(110.f, actor->position.y)); +} + +void mfish_koi_base_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! NOTE: wrong floats in this file, based on objdiff + if (actor->_5F8 > actor->init_data._08 * 20.f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + if (mfish_peck_check(actor, gamex)) { + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_koi_tail_anim_set(actor, 0); + mfish_koi_peck_process_init(actor, gamex); + } else if (mfish_WallCheck(actor)) { + mfish_koi_tail_anim_set(actor, 1); + mfish_koi_turn_process_init(actor); + } else { + mfish_koi_tail_anim_set(actor, 0); + mfish_koi_normal_process_init(actor); + } + } else if (actor->currentProcess == mfish_koi_normal_process) { + if ((actor->_62E_flags & 0x1e && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(30)) || + (actor->_62E_flags & 0x20 && + ABS((s16)(DEG2SHORT_ANGLE(180) + actor->_62A - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_koi_tail_anim_set(actor, 1); + mfish_koi_turn_process_init(actor); + } + } + + // actor->_5AC.y = 0.0f; + actor->_638 += DEG2SHORT_ANGLE(10); + actor->currentProcess(actor, gamex); + if (ABS(actor->_618.z) < ABS(actor->_622) && ABS(actor->_622) > DEG2SHORT_ANGLE(2)) { + add_calc2(&actor->_5E8, MAX(0.1f, actor->_5E8), 0.2f, 0.25f); + } + add_calc_short_angle2(&actor->_60C.x, actor->_612.x, CALC_EASE(0.05f), DEG2SHORT_ANGLE(1.5f), + DEG2SHORT_ANGLE(0.05f)); + add_calc_short_angle2(&actor->_612.x, 0, CALC_EASE(0.05f), DEG2SHORT_ANGLE(0.5f), DEG2SHORT_ANGLE(0.05f)); + mfish_koi_base_FishMove(actor, gamex); +} + +void mfish_koi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* game) { + GAME_PLAY* play = (GAME_PLAY*)game; + mfish_onefish_mv(actor, game); + mfish_koi_base_mv(actor, game); + Museum_Fish_BGCheck(actor, game); + if ((actor->currentProcess == mfish_koi_dummy_process || actor->currentProcess == mfish_koi_long_move_process) && + (play->game_frame & 0xff) == 0 && RANDOM_F(1) < 0.3f) { + mfish_koi_tail_anim_set(actor, 2); + } + if (actor->_640 > 0) { + actor->_640--; + if (actor->currentProcess == mfish_koi_dummy_process || actor->currentProcess == mfish_koi_long_move_process) { + add_calc2(&actor->_38._00.frame_control.speed, + (actor->_5AC.x * MAX(actor->_5F0 - actor->_5E8, 0.0f)) / + (actor->init_data._10 + actor->init_data._14) + + 0.15f, + 0.5f, 0.5f); + } else { + add_calc2(&actor->_38._00.frame_control.speed, + (actor->_5AC.x * MAX(actor->_5F0 - actor->_5E8, 0.0f)) / + (actor->init_data._10 + actor->init_data._14) + + 0.15f, + 0.5f, 0.5f); + } + add_calc2(&actor->_5AC.z, + (GETREG(TAKREG, 0x46) * 0.01f) + 0.2f + + ((0.8f - (GETREG(TAKREG, 0x46) * 0.01f)) * + (actor->init_data._14 + actor->init_data._10 - actor->_5F0)) / + (actor->init_data._14 + actor->init_data._10), + 0.5f, 0.1f); + } else { + add_calc2(&actor->_38._00.frame_control.speed, + (actor->_5E8 * 2.0f) / (actor->init_data._10 + actor->init_data._14) + 0.3f, 0.2f, 0.1f); + add_calc2(&actor->_5AC.z, 1.0f, 0.1f, 0.025f); + } +} + +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*)arg; + if (joint_num == 0) { + trans->x *= actor->_5AC.z; + trans->y *= actor->_5AC.z; + trans->z = (trans->z - 1400.0f) * actor->_5AC.z + 1400.0f; + } else if (joint_num == 1) { + joint1->y = joint1->y * actor->_5AC.z; + } else if (joint_num == 2) { + int i; + + i = joint1->y - (int)(actor->_618.z * (GETREG(TAKREG, 0x47) * 0.1f + 2.0f)); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-80), DEG2SHORT_ANGLE(80)); + + i = joint1->x - (actor->_618.z >> 3); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-25), DEG2SHORT_ANGLE(25)); + } + + return TRUE; +} + +void mfish_koi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, actor->init_data._04 * 0.25f, actor->init_data._24 * 1.5f, 1); + Matrix_RotateX(actor->_60C.x, 1); + Matrix_RotateZ(MY_CLAMP(-(actor->_618.z >> 2), DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)), 1); + Matrix_translate(0.0f, -actor->init_data._04 * 0.25f, -actor->init_data._24 * 0.5f, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_koi_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_kurage.c_inc b/src/actor/ac_museum_fish_kurage.c_inc new file mode 100644 index 00000000..eec6471d --- /dev/null +++ b/src/actor/ac_museum_fish_kurage.c_inc @@ -0,0 +1,222 @@ + +void mfish_kurage_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 s = qrand(); + 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->_60C.x = DEG2SHORT_ANGLE2(RANDOM2_F(100.0f)); + actor->_612.x = actor->_60C.x; + actor->_5F4 = 0.05f; + actor->_5D0 = ZeroVec; + actor->_5AC = ZeroVec; + actor->_5AC.y = actor->_5E8; + actor->_638 = qrand(); + actor->_618 = ZeroSVec; + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_594 = NULL; + actor->_598 = NULL; + actor->_624 = 3; + mfish_kurage_normal_init(actor, gamex); +} + +void mfish_kurage_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->currentProcess = mfish_kurage_normal; +} + +void mfish_kurage_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->_62E_flags & 0x1e) { + mfish_kurage_turn_init(actor, gamex); + } else if (actor->activityFrameCount < 0) { + actor->_612.y = qrand(); + actor->_612.x = qrand(); + + if (actor->_612.x > 0) { + actor->_612.x = MIN(DEG2SHORT_ANGLE(120), actor->_612.x); + } else { + actor->_612.x = MAX(DEG2SHORT_ANGLE(-120), actor->_612.x); + } + + if (actor->_60C.x > DEG2SHORT_ANGLE(90) && actor->_612.x < (s16)(actor->_60C.x + DEG2SHORT_ANGLE(180))) { + //! BUG: should this be 179 degrees? + actor->_612.x = actor->_60C.x + (DEG2SHORT_ANGLE(180) - 1); + } else if (actor->_60C.x < DEG2SHORT_ANGLE(-90) && + actor->_612.x > (s16)(actor->_60C.x + DEG2SHORT_ANGLE(180))) { + actor->_612.x = actor->_60C.x - (DEG2SHORT_ANGLE(180) - 1); + } + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + } else if (actor->_5F8 > actor->init_data._08 * 10.0f) { + f32 v = RANDOM_F(0.5f) + 0.5f; + actor->_5F8 = 0.0f; + if (RANDOM_F(1.0f) < 0.5) { + actor->_612.y += DEG2SHORT_ANGLE(v * 90.f); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(v * 90.f); + } + + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(90.0f + RANDOM2_F(60.0f)); + } else { + actor->_612.x = DEG2SHORT_ANGLE(-90.0f + RANDOM2_F(60.0f)); + } + + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + } +} + +void mfish_kurage_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! BUG: cast needed to match? maybe i've been making assumptions about what these functions have taken as args + MUSEUM_FISH_PRIVATE_DATA* actor2 = (MUSEUM_FISH_PRIVATE_DATA*)actor; + if (actor->_60C.x * (s16)(actor2->_60C.y - actor2->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(135); + } else { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(-135); + } + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->currentProcess = mfish_kurage_turn; +} + +void mfish_kurage_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if ((s16)(actor->_612.x - actor->_60C.x) == 0 && (s16)(actor->_612.y - actor->_60C.y) == 0) { + mfish_kurage_normal_init(actor, gamex); + } else if (actor->activityFrameCount < 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } +} + +void mfish_kurage_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! NOTE: wrong floats in this file, based on objdiff + f32 v; + xyz_t p; + f32 t; + + actor->currentProcess(actor, gamex); + actor->_5F4 = GETREG(TAKREG, 0x55) * 0.001f + 0.035f; + actor->_632 += actor->_63A; + actor->_63C += actor->_618.y; + if (actor->_62E_flags & 0x20) { + add_calc_short_angle2(&actor->_618.y, DEG2SHORT_ANGLE(8), CALC_EASE(0.5f), DEG2SHORT_ANGLE(0.5f), + DEG2SHORT_ANGLE(0.05f)); + } else { + add_calc_short_angle2(&actor->_618.y, DEG2SHORT_ANGLE(2), CALC_EASE(0.5f), DEG2SHORT_ANGLE(0.5f), + DEG2SHORT_ANGLE(0.05f)); + } + actor->_622 = DEG2SHORT_ANGLE(actor->_5E8 * 12.0f + 0.2f + GETREG(TAKREG, 0x1a) * 0.1f); + if (actor->activityFrameCount > actor->savedActivityFrameCount - 20) { + add_calc2(&actor->_5EC, 0.1f, 0.5f, 0.02f); + } + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, actor->_5EC); + add_calc2(&actor->_5AC.y, actor->_5F0, 0.1f, 0.25f); + add_calc2(&actor->_5F0, 0.05f, 0.05f, 0.01f); + add_calc_short_angle2(&actor->_63A, (s16)DEG2SHORT_ANGLE2((GETREG(TAKREG, 0x56) + 13.0f) * 0.5f), CALC_EASE2(0.1f), + DEG2SHORT_ANGLE(0.25f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_60C.x, (s16)actor->_612.x, CALC_EASE2(GETREG(TAKREG, 0x18) * 0.01f + 0.1f), + (s16)(actor->_622 >> 1) >> 1, DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_60C.y, (s16)actor->_612.y, CALC_EASE2(GETREG(TAKREG, 0x18) * 0.01f + 0.1f), + (s16)(actor->_622 >> 1) >> 1, DEG2SHORT_ANGLE(0.25f)); + v = actor->_5E8 * sin_s(actor->_60C.x) * (sin_s(actor->_63A) * 0.1f + 0.9f); + actor->_5D0.x = sin_s(actor->_60C.y) * v; + actor->_5D0.z = cos_s(actor->_60C.y) * v; + actor->_5D0.y = actor->_5E8 * cos_s(actor->_60C.x) * (sin_s(actor->_63A) * 0.1f + 0.9f); + mfish_get_flow_vec(&p, actor, gamex); + + if (actor->_5FC < 120.f) { + add_calc2(&actor->_5DC.x, (120.f - actor->_5FC) * (GETREG(TAKREG, 0x3c) * 0.0001f + 0.01f), + GETREG(TAKREG, 0x3d) * 0.01f + 0.25f, GETREG(TAKREG, 0x3e) * 0.01f + 0.2f); + + } else if (actor->_600 < 120.f) { + add_calc2(&actor->_5DC.x, -(120.f - actor->_600) * (GETREG(TAKREG, 0x3c) * 0.0001f + 0.01f), + GETREG(TAKREG, 0x3d) * 0.01f + 0.25f, GETREG(TAKREG, 0x3e) * 0.01f + 0.2f); + } + + if (actor->_604 < 20.f) { + add_calc2(&actor->_5DC.z, (20.f - actor->_604) * (GETREG(TAKREG, 0x3c) * 0.0001f + 0.01f), + GETREG(TAKREG, 0x3d) * 0.01f + 0.25f, GETREG(TAKREG, 0x3e) * 0.01f + 0.2f); + + } else if (actor->_608 < 20.f) { + add_calc2(&actor->_5DC.z, -(20.f - actor->_608) * (GETREG(TAKREG, 0x3c) * 0.0001f + 0.01f), + GETREG(TAKREG, 0x3d) * 0.01f + 0.25f, GETREG(TAKREG, 0x3e) * 0.01f + 0.2f); + } + + if (actor->position.y < (55.0f + actor->init_data._08) + 10.0f) { + t = (10.f - (actor->position.y - (55.0f + actor->init_data._08))); + t *= (GETREG(TAKREG, 0x3C) * 0.0001f + 0.01f); + + add_calc2(&actor->_5DC.y, t, GETREG(TAKREG, 0x3D) * 0.01f + 0.25f, GETREG(TAKREG, 0x3E) * 0.01f + 0.2f); + } else if (actor->position.y > (110.0f - actor->init_data._08) - 10.0f) { + t = -(10.f - ((110.0f - actor->init_data._08) - actor->position.y)); + t *= (GETREG(TAKREG, 0x3C) * 0.0001f + 0.01f); + + add_calc2(&actor->_5DC.y, t, GETREG(TAKREG, 0x3D) * 0.01f + 0.25f, GETREG(TAKREG, 0x3E) * 0.01f + 0.2f); + } + + actor->position.x += actor->_5D0.x + actor->_5DC.x; + actor->position.y += actor->_5D0.y + actor->_5DC.y; + actor->position.z += actor->_5D0.z + actor->_5DC.z; + + actor->_5B8 = actor->position; + + Museum_Fish_BGCheck(actor, gamex); + if (actor->position.y < 55.0f + actor->init_data._08) { + actor->position.y = 55.0f + actor->init_data._08; + actor->_612.x = DEG2SHORT_ANGLE(-30); + } else if (actor->position.y > 110.f - actor->init_data._08 - actor->_608 * 0.2f) { + actor->position.y = 110.f - actor->init_data._08 - actor->_608 * 0.2f; + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(120); + } else { + actor->_612.x = DEG2SHORT_ANGLE(-120); + } + } + actor->activityFrameCount--; +} + +extern Gfx act_mus_kurage_sakana_body_model[]; +extern Gfx act_mus_kurage_sakana_foot_model[]; + +void mfish_kurage_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 a = (actor->_5E8 - 0.1f) * (-0.3f + GETREG(TAKREG, 0x1b) * 0.01f); + a += (actor->_5F4 * sin_s(actor->_632) + 1.0f); + + OPEN_DISP(gamex->graph); + Matrix_translate(actor->position.x, actor->position.y, actor->position.z, 0); + Matrix_rotateXYZ(actor->_60C.x, actor->_60C.y, actor->_60C.z, 1); + Matrix_scale(actor->init_data.renderScale * a, actor->init_data.renderScale * (1.0f / SQ(a)), + actor->init_data.renderScale * a, 1); + Matrix_push(); + + Matrix_RotateY(actor->_63C, 1); + Matrix_scale((GETREG(TAKREG, 0x4b) * 0.01f + 0.1f) * sin_s(actor->_63C) + 1.0f, 1.0f, + (GETREG(TAKREG, 0x4b) * 0.01f + 0.1f) * cos_s(actor->_63C) + 1.0f, 1); + Matrix_RotateY(-actor->_63C, 1); + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(gamex->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(NEXT_POLY_XLU_DISP, act_mus_kurage_sakana_body_model); + + Matrix_pull(); + + Matrix_RotateY(actor->_63C, 1); + Matrix_scale((GETREG(TAKREG, 0x4b) * 0.01f + 0.1f) * sin_s(actor->_63C) + 1.0f, 1.0f, + (GETREG(TAKREG, 0x4b) * 0.01f + 0.1f) * cos_s(actor->_63C) + 1.0f, 1); + Matrix_RotateY(-actor->_63C, 1); + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(gamex->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(NEXT_POLY_XLU_DISP, act_mus_kurage_sakana_foot_model); + + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_medaka.c_inc b/src/actor/ac_museum_fish_medaka.c_inc new file mode 100644 index 00000000..3789e73c --- /dev/null +++ b/src/actor/ac_museum_fish_medaka.c_inc @@ -0,0 +1,177 @@ + +void mfish_medaka_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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_ANGLE(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->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_624 = 6; + mfish_medaka_normal_init(actor, gamex); +} + +void mfish_medaka_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->group == 2) { + if (actor->activityFrameCount < 0) { + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + } + } else { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + } + actor->currentProcess = mfish_medaka_normal; +} + +void mfish_medaka_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 35.0f); + 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(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 (actor->_62E_flags & 0x1e) { + mfish_medaka_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 v = RANDOM_F(1.0f); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + 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(20)) { + 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->group], &actor->position); + actor->_5F8 = 0.0f; + actor->_612.y = s + DEG2SHORT_ANGLE(RANDOM2_F(90)); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } +} + +void mfish_medaka_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->currentProcess = mfish_medaka_turn; +} + +void mfish_medaka_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 15.0f); + 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(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_medaka_normal_init(actor, gamex); + } +} + +void mfish_medaka_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p; + + actor->currentProcess(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)); + + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.05f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.02f); + } + + 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->position.x += actor->_5D0.x + p.x; + actor->position.y += actor->_5D0.y + p.y; + actor->position.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + add_calc2(&actor->_38._00.frame_control.speed, actor->_5E8 * 2.0f + 0.5f, 0.2f, 0.1f); + actor->_5B8 = actor->position; + Museum_Fish_BGCheck(actor, gamex); + if (actor->position.y < 70.f + actor->init_data._08) { + actor->position.y = 70.f + actor->init_data._08; + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(-30); + } + } else if (actor->position.y > 100.f - actor->init_data._08) { + actor->position.y = 100.f - actor->init_data._08; + actor->_612.x = DEG2SHORT_ANGLE(30); + } else { + actor->activityFrameCount--; + } + + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); +} + +BOOL 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) { + 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 = joint1->y - (actor->_618.z * 3); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-60), DEG2SHORT_ANGLE(60)); + i = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(i, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + } + return TRUE; +} + +void mfish_medaka_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_medaka_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_namazu.c_inc b/src/actor/ac_museum_fish_namazu.c_inc new file mode 100644 index 00000000..e9728e0d --- /dev/null +++ b/src/actor/ac_museum_fish_namazu.c_inc @@ -0,0 +1,326 @@ + +void mfish_namazu_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + actor->_5E8 = 0.0f; + actor->_5D0 = ZeroVec; + actor->_60C.y = qrand(); + actor->_612.y = actor->_60C.y; + actor->_5F4 = 0.0f; + actor->_5AC = ZeroVec; + if (actor->fishIDEnum == aGYO_TYPE_CATFISH) { + actor->_5AC.y = 1500.f; + } else { + actor->_5AC.y = 1700.f; + } + actor->_638 = qrand(); + actor->_622 = actor->_60C.y; + actor->position.z += 40.0f; + actor->_624 = 10; + // maybe s_xyz? but because we're not assigning a ZeroSVec, i'm thinking not? + actor->_640 = 0; + actor->_642 = 0; + actor->_644 = 0; + mfish_namazu_normal_process_init(actor); +} + +void mfish_namazu_body_wind_anime_play(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_63A += (s16)DEG2SHORT_ANGLE2(2.0f + RANDOM_F(1.0f)); + actor->_63C += (s16)DEG2SHORT_ANGLE2(1.0f + RANDOM_F(0.5f)); +} + +void mfish_namazu_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 s; + f32 p; + f32 f; + + p = RANDOM_F(actor->init_data._14) + actor->init_data._10; + s = MAX(actor->init_data._14 + actor->init_data._10, 1.0f); + f = p / s; + if (p > actor->_5E8) { + actor->_5F0 = p; + } + actor->_5F4 = 0.0f; + actor->_5D0.y = 0.0f; + if (RANDOM_F(1.0f) > actor->init_data._1C) { + actor->_612.y += (s16)Rnd_EX_fx(actor->init_data._30 * 2.0f); + if (ABS((s16)(actor->_612.y - actor->_60C.y)) < DEG2SHORT_ANGLE(20)) { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(20); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(20); + } + } + actor->_632 = DEG2SHORT_ANGLE(30.0f + f * 40.0f); + } else { + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(15); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(15); + } + actor->_632 = DEG2SHORT_ANGLE(40.0f + f * 50.0f); + } + + if ((s16)(actor->_60C.y - actor->_612.y) > 0) { + actor->_636 = DEG2SHORT_ANGLE(0); + } else { + actor->_636 = DEG2SHORT_ANGLE(-180); + } + + actor->_62E_flags &= ~0xC0; + actor->currentProcess = mfish_namazu_normal_process; +} + +void mfish_namazu_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->_632 > DEG2SHORT_ANGLE(20)) { + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.075f), + (0.4f + ((DEG2SHORT_ANGLE(-20) + actor->_632) / DEG2SHORT_ANGLE(2)) * 0.02f) * 0.5f); + } + add_calc_short_angle2(&actor->_632, DEG2SHORT_ANGLE(0), CALC_EASE2(0.1f), DEG2SHORT_ANGLE(0.25f), + DEG2SHORT_ANGLE(0.125f)); + actor->_636 += DEG2SHORT_ANGLE(1.25f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.1f), DEG2SHORT_ANGLE(1.25f), DEG2SHORT_ANGLE(0.065f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.105f), DEG2SHORT_ANGLE(0.8125f), + DEG2SHORT_ANGLE(0.0625f)); + + if (actor->_5E8 < 0.01f) { + mfish_namazu_dummy_process_init(actor); + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + actor->_632 = 0; + } +} + +void mfish_namazu_dummy_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + actor->_634 = mfish_get_hide_camera_angle(actor); + add_calc_short_angle2(&actor->_634, actor->_612.y, CALC_EASE(0.5f), DEG2SHORT_ANGLE(10), DEG2SHORT_ANGLE(0.5f)); + actor->currentProcess = mfish_namazu_dummy_process; +} + +void mfish_namazu_dummy_process(MUSEUM_FISH_PRIVATE_DATA* actor) { + if (actor->_5E8 < 0.5f) { + add_calc_short_angle2(&actor->_612.y, actor->_634, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + } + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.05f), DEG2SHORT_ANGLE(0.8125f), + DEG2SHORT_ANGLE(0.065f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.055f), DEG2SHORT_ANGLE(0.5f), + DEG2SHORT_ANGLE(0.0625f)); +} + +void mfish_namazu_turn_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 angle = DEG2SHORT_ANGLE(RANDOM_F(60.0f)) + DEG2SHORT_ANGLE(30); + actor->_618.y = DEG2SHORT_ANGLE(0.5f + SHORT2DEG_ANGLE2(angle) / 90.f); + + if (actor->_62E_flags & 0x1e) { + if ((s16)(actor->_60C.y - actor->_62C) < 0) { + angle = -angle; + } + } else if (actor->_62E_flags & 0xc0) { + if (actor->_62E_flags & 0x40) { + angle = ABS(angle); + } else { + angle = -ABS(angle); + } + } else if (actor->_62E_flags & 0x20) { + if ((s16)(actor->_62A - actor->_60C.y) < 0) { + angle = -angle; + } + } + + if (angle > 0) { + actor->_62E_flags |= 0x40; + } else { + actor->_62E_flags |= 0x80; + } + + actor->_612.y += angle; + actor->_5F0 = 0.06f; + actor->currentProcess = mfish_namazu_turn_process; +} + +void mfish_namazu_turn_process(MUSEUM_FISH_PRIVATE_DATA* actor) { + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.05f), 0.0625f); + add_calc2(&actor->_5F0, 0.05f, CALC_EASE(0.1f), 0.0025f); + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.29f), DEG2SHORT_ANGLE(1.25f), DEG2SHORT_ANGLE(0.125f)); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE(0.035f), (s16)(actor->_618.y >> 1), + DEG2SHORT_ANGLE(0.05f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE(0.025f), DEG2SHORT_ANGLE(0.75f), + DEG2SHORT_ANGLE(0.25f)); + if (actor->_60C.y == actor->_612.y) { + mfish_namazu_dummy_process_init(actor); + } +} + +void mfish_namazu_ground_sweep_process_init(MUSEUM_FISH_PRIVATE_DATA* actor) { + f32 s; + f32 p; + f32 f; + + p = RANDOM_F(actor->init_data._14) + actor->init_data._10; + s = MAX(actor->init_data._14 + actor->init_data._10, 1.0f); + f = p / s; + if (p > actor->_5E8) { + actor->_5F0 = p; + } + actor->_5F4 = 0.0f; + actor->_5D0.y = 0.0f; + if ((s16)(actor->_612.y - actor->_60C.y) > 0) { + actor->_612.y += DEG2SHORT_ANGLE(15); + } else { + actor->_612.y -= DEG2SHORT_ANGLE(15); + } + actor->_632 = DEG2SHORT_ANGLE(30.f + f * 60.f); + if ((s16)(actor->_60C.y - actor->_612.y) > 0) { + actor->_636 = DEG2SHORT_ANGLE(0); + } else { + actor->_636 = DEG2SHORT_ANGLE(-180); + } + actor->_62E_flags &= ~0xc0; + actor->currentProcess = mfish_namazu_ground_sweep_process; +} + +void mfish_namazu_ground_sweep_process(MUSEUM_FISH_PRIVATE_DATA* actor) { + if (actor->_632 > DEG2SHORT_ANGLE(20)) { + add_calc2(&actor->_5E8, actor->_5F0, CALC_EASE(0.075f), + (0.4f + 0.02f * ((actor->_632 - DEG2SHORT_ANGLE(20)) / DEG2SHORT_ANGLE(2))) * 0.5f); + } + add_calc_short_angle2(&actor->_632, 0, CALC_EASE2(0.1f), DEG2SHORT_ANGLE(0.0625f), DEG2SHORT_ANGLE(0.025f)); + actor->_636 += DEG2SHORT_ANGLE(3); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(actor->_632 * sin_s(actor->_636)), + CALC_EASE2(0.25f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.125f)); + + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.875f), + DEG2SHORT_ANGLE(0.125f)); + + if (actor->_5E8 < 0.01f) { + mfish_namazu_dummy_process_init(actor); + } else if (actor->_5E8 > 1.0f && actor->_62E_flags & 0x1e) { + if ((s16)(actor->_612.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(112.5f); + } else { + actor->_612.y = actor->_62C - DEG2SHORT_ANGLE(112.5f); + } + } +} + +void mfish_namazu_base_FishMove(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + add_calc2(&actor->_5E8, 0.05f, 1.0f - actor->init_data._18, 0.025f); + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + add_calc(&actor->_5D0.y, MAX(ABS(sin_s(actor->_60C.x) * actor->_5E8), 0.1f), 0.1f, 0.1f, 0.005f); + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, actor->_5D0.y); + mfish_move_smooth(actor, gamex); + actor->position.x += actor->_5D0.x; + actor->position.z += actor->_5D0.z; + actor->position.y = MAX(60.f, MIN(110.f, actor->position.y)); +} + +void mfish_namazu_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p = suisou_pos[actor->group]; + f32 v; + int s; + mfish_onefish_mv(actor, gamex); + if (actor->_5F8 > actor->init_data._08 * 10.0f) { + actor->_5F8 = 0.0f; + actor->activityFrameCount = 0; + } + if (actor->activityFrameCount-- <= 0) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + if (actor->_644 <= 0 && RANDOM_F(1.0f) < 0.2f) { + actor->_644 = (s16)RANDOM_F(300.f) + 300; + mfish_namazu_ground_sweep_process_init(actor); + } else if (mfish_WallCheck(actor)) { + mfish_namazu_turn_process_init(actor); + } else { + mfish_namazu_normal_process_init(actor); + } + } else if (actor->currentProcess == mfish_namazu_normal_process) { + if ((actor->_62E_flags & 0x1e && ABS((s16)(actor->_62C - actor->_60C.y)) < DEG2SHORT_ANGLE(45)) || + (actor->_62E_flags & 0x20 && + ABS((s16)(actor->_62A + DEG2SHORT_ANGLE(180) - actor->_60C.y)) < DEG2SHORT_ANGLE(30))) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + mfish_namazu_turn_process_init(actor); + } + } + + actor->_638 += DEG2SHORT_ANGLE(10); + actor->currentProcess(actor, gamex); + if (ABS(actor->_618.z) > DEG2SHORT_ANGLE(20) && ABS(actor->_622 - actor->_618.z) < DEG2SHORT_ANGLE(30)) { + add_calc2(&actor->_5E8, 0.2f + 0.01f * GETREG(TAKREG, 0x2d), 0.25f + 0.01f * GETREG(TAKREG, 0x2e), + 0.05f + 0.01f * GETREG(TAKREG, 0x2f)); + } + + s = GETREG(TAKREG, 0x4c); + if (s == 1) { + actor->_644 = (s16)RANDOM_F(300.f) + 300; + } else if (s == -1) { + actor->_644 = 0; + } + + if (actor->_644 > 0) { + actor->_644--; + actor->_642 = DEG2SHORT_ANGLE(GETREG(TAKREG, 0x4d) + 35.0f); + } else { + actor->_642 = 0; + } + add_calc_short_angle2(&actor->_640, actor->_642, CALC_EASE(0.2f), DEG2SHORT_ANGLE(0.25f), DEG2SHORT_ANGLE(0.05f)); + actor->_38._00.frame_control.speed = (actor->_5E8 * 0.75f) / (actor->init_data._10 + actor->init_data._14) + 0.125f; + mfish_namazu_base_FishMove(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + xyz_t_sub(&p, &actor->position, &p); + v = 60.f + MAX(ABS(p.x), ABS(p.z)) * -0.15f; + actor->position.y = v + actor->init_data._04; + mfish_namazu_body_wind_anime_play(actor, gamex); +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + int s; + if (joint_num == 0) { + trans->y = -(actor->_5AC.y * MIN(sin_s(actor->_640), 0.5f)); + } else if (joint_num == 1) { + s = joint1->z + actor->_640; + joint1->z = MY_CLAMP(s, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + s = joint1->x + (actor->_618.z >> 2); + joint1->x = MY_CLAMP(s, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + Matrix_scale(1.0f, 1.0f + 0.01f * sin_s(actor->_63A + actor->_63C), 1.0f + 0.01f * sin_s(actor->_63A), 1); + } else if (joint_num == 2) { + s = joint1->y - (actor->_618.z << 1); + joint1->y = MY_CLAMP(s, DEG2SHORT_ANGLE(-60), DEG2SHORT_ANGLE(60)); + s = joint1->x - (actor->_618.z >> 2); + joint1->x = MY_CLAMP(s, DEG2SHORT_ANGLE(-20), DEG2SHORT_ANGLE(20)); + s = joint1->z - (s16)(actor->_640 * (0.6f + GETREG(TAKREG, 0x4E) * 0.01f)); + joint1->z = MY_CLAMP(s, DEG2SHORT_ANGLE(-30), DEG2SHORT_ANGLE(30)); + Matrix_scale(1.0f, 1.0f + 0.005f * sin_s(actor->_63A + DEG2SHORT_ANGLE(270)), + 1.0f + 0.005f * sin_s(actor->_63A + DEG2SHORT_ANGLE(90)), 1); + } + return TRUE; +} + +void mfish_namazu_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_namazu_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_seafish.c_inc b/src/actor/ac_museum_fish_seafish.c_inc new file mode 100644 index 00000000..2ac49a41 --- /dev/null +++ b/src/actor/ac_museum_fish_seafish.c_inc @@ -0,0 +1,252 @@ + +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->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + 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(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->_5EC = Rnd_EX_f(0.15f) + 0.15f; + actor->currentProcess = mfish_seafish_normal; +} + +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->_618.z, actor->_622, CALC_EASE2(0.3f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + if (actor->_598 != NULL) { + o_5a0_z = actor->_598->position.z; + o_5a0_y = actor->_598->position.y; + sum_i_8 = (actor->_598->init_data._08 + actor->init_data._08); + abs_diff_sum = MAX(sum_i_8 - ABS(actor->_598->position.z - actor->position.z), 0.f); + + abs_diff_sum /= sum_i_8; + + if (actor->_598->fishIDEnum != aGYO_TYPE_JELLYFISH) { + f32 this_5a0_y = actor->position.y; + if (o_5a0_y < actor->position.y) { + t = o_5a0_y + (actor->_598->init_data._04 + actor->init_data._04); + if (this_5a0_y < t) { + add_calc2(&actor->position.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->position.y, t - 2.0f, 0.2f, abs_diff_sum * 0.1f); + } + } + } + + if (actor->_598->position.z < actor->position.z) { + // swap here + o_5a0_z += sum_i_8; + add_calc2(&actor->position.z, o_5a0_z, 0.1f, abs_diff_sum * 0.1f); + } else { + // swap here + o_5a0_z -= sum_i_8; + add_calc2(&actor->position.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_flags & 0x100) { + actor->position.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_flags & 0x1e) { + mfish_seafish_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + // r in wrong register here + r = RANDOM_F(1.0f); + 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->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + } +} + +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_flags & 6) { + s = s + DEG2SHORT_ANGLE(170); + } else { + s = s + DEG2SHORT_ANGLE(95); + } + } else { + if (actor->_62E_flags & 6) { + s = s - DEG2SHORT_ANGLE(170); + } else { + s = s - DEG2SHORT_ANGLE(95); + } + } + + if (ABS((s16)(s - actor->_612.y)) > DEG2SHORT_ANGLE(45)) { + actor->currentProcess = mfish_seafish_turn; + } + actor->_612.y = s; +} + +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->_618.z, 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) { + //! NOTE: wrong floats in this file, based on objdiff + xyz_t p; + actor->currentProcess(actor, gamex); + actor->_618.x += DEG2SHORT_ANGLE(actor->_5E8 * RANDOM_F(3.0f)); + actor->_5F4 = sin_s(actor->_618.x) * 5.0f; + if (actor->_62E_flags & 0x20) { + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.02f, 0.05f); + } else { + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, 0.1f); + } + add_calc0(&actor->_5F8, 0.25f, 0.05f); + actor->_5F8 = MIN(1.0f, actor->_5F8); + if (ABS(actor->_618.z) > DEG2SHORT_ANGLE(15) && ABS(actor->_622) - ABS(actor->_618.z) < 0) { + add_calc2(&actor->_5E8, MAX(actor->_5F0, 0.8f), 0.5f, 0.25f); + } else if (actor->activityFrameCount < actor->savedActivityFrameCount - 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.1f, 0.01f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.02f); + } + 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.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + mfish_get_flow_vec(&p, actor, gamex); + actor->position.x += actor->_5D0.x + p.x; + actor->position.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + mfish_body_wind_anime_play(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + if (actor->position.y < GETREG(TAKREG, 0x47) + 55.0f - actor->init_data._04) { + actor->position.y = GETREG(TAKREG, 0x47) + 55.0f - actor->init_data._04; + } + actor->activityFrameCount--; +} + +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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int s = joint1->x + (int)(actor->_618.z * (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->_618.z << 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) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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); +} diff --git a/src/actor/ac_museum_fish_small_fish.c_inc b/src/actor/ac_museum_fish_small_fish.c_inc new file mode 100644 index 00000000..9c9b77eb --- /dev/null +++ b/src/actor/ac_museum_fish_small_fish.c_inc @@ -0,0 +1,202 @@ + +void mfish_small_fish_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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_ANGLE(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->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_624 = 6; + mfish_sfish_normal_init(actor, gamex); +} + +void mfish_sfish_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->group == 2) { + if (actor->activityFrameCount < 0) { + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + } + } else { + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + } + actor->currentProcess = mfish_sfish_normal; +} + +void mfish_sfish_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 35.0f); + 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(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 (actor->_62E_flags & 0x1e) { + mfish_sfish_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 v = RANDOM_F(1.0f); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + if (actor->group == 2 && actor->_5F0 < actor->init_data._10 + actor->init_data._14 * 0.5f) { + actor->_612.y = atans_table(-actor->_5DC.z, -actor->_5DC.x); + actor->activityFrameCount *= 5; + } + + 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) { + s16 s; + //! BUG: unused? + RANDOM_F(1.0f); + s = search_position_angleY(&suisou_pos[actor->group], &actor->position); + actor->_5F8 = 0.0f; + actor->_612.y = s + DEG2SHORT_ANGLE(RANDOM2_F(90.0)); + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->activityFrameCount >>= 1; + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } +} + +void mfish_sfish_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); + } + + if (actor->group == 2) { + if (actor->_5F0 < 0.0f) { + actor->_5F0 = actor->init_data._10 + MAX(-actor->init_data._10, RANDOM_F(actor->init_data._14)); + } + } else { + actor->_5F0 = actor->init_data._14 + actor->init_data._10; + } + actor->currentProcess = mfish_sfish_turn; +} + +void mfish_sfish_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_632 = DEG2SHORT_ANGLE(actor->_5E8 * 15.0f); + actor->_636 += DEG2SHORT_ANGLE(7.5f); + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + 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_sfish_normal_init(actor, gamex); + } +} + +void mfish_small_fish_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p; + int s; + actor->currentProcess(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)); + if (actor->_5E8 > actor->_5F0) { + add_calc2(&actor->_5E8, actor->_5F0, 0.2f, 0.05f); + } else { + add_calc2(&actor->_5E8, actor->_5F0, 0.1f, 0.02f); + } + + 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 = cos_s(actor->_60C.x) * actor->_5E8; + 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->position.x += actor->_5D0.x + p.x; + actor->position.y += actor->_5D0.y + p.y; + actor->position.z += actor->_5D0.z + p.z; + mfish_onefish_mv(actor, gamex); + if (actor->group == 2) { + actor->_38._00.frame_control.speed = actor->_5E8 * 2.0f + 1.0f; + } else { + add_calc2(&actor->_38._00.frame_control.speed, actor->_5E8 * 2.0f + 0.5f, 0.2f, 0.1f); + } + + actor->_5B8 = actor->position; + Museum_Fish_BGCheck(actor, gamex); + + if (actor->position.y < 55.0f + actor->init_data._08) { + actor->position.y = 55.0f + actor->init_data._08; + if (actor->_612.x > 0) { + actor->_612.x = DEG2SHORT_ANGLE(-30); + } + } else if (actor->position.y > 115.0f - actor->init_data._08) { + actor->position.y = 115.0f - actor->init_data._08; + mfish_hamon_make(actor, gamex); + actor->_612.x = DEG2SHORT_ANGLE(30); + } else { + actor->activityFrameCount--; + } + + actor->_612.x = MAX((s16)-actor->init_data._30, MIN(actor->init_data._30, actor->_612.x)); +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int s = joint1->x + actor->_618.z; + joint1->x = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + s = joint1->y + actor->_618.z; + joint1->y = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + } else if (joint_num == 2) { + int s = joint1->y - actor->_618.z * 3; + joint1->y = MY_CLAMP(s, -DEG2SHORT_ANGLE(60), DEG2SHORT_ANGLE(60)); + s = joint1->x - (actor->_618.z >> 1); + joint1->x = MY_CLAMP(s, -DEG2SHORT_ANGLE(30), DEG2SHORT_ANGLE(30)); + } + return TRUE; +} + +void mfish_small_fish_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele = &actor->_38; + Mtx* mtxp; + s16 v; + if (gamex->frame_counter & 1) { + mtxp = &skele->_70; + } else { + mtxp = &skele->_2b0; + } + v = actor->_60C.x * 0.7f; + OPEN_DISP(gamex->graph); + Matrix_translate(actor->position.x, actor->position.y, actor->position.z, 0); + Matrix_RotateY(actor->_60C.y, 1); + Matrix_translate(0.0f, 0.0f, actor->init_data._24 * 1.5f, 1); + Matrix_RotateX(v, 1); + Matrix_translate(0.0f, 0.0f, -actor->init_data._24 * 0.5f, 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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); +} diff --git a/src/actor/ac_museum_fish_tai.c_inc b/src/actor/ac_museum_fish_tai.c_inc new file mode 100644 index 00000000..40573d63 --- /dev/null +++ b/src/actor/ac_museum_fish_tai.c_inc @@ -0,0 +1,277 @@ + +void mfish_tai_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->_5F4 = 0.0f; + actor->_5D0.y = 0.0f; + actor->_5AC = ZeroVec; + actor->_638 = qrand(); + actor->_622 = 0; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_624 = 2; + actor->_594 = NULL; + actor->_598 = NULL; + actor->_5AC.x = 30.f; + actor->_5AC.x = 30.f; + mfish_tai_normal_init(actor, gamex); +} + +void mfish_tai_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + if (actor->currentProcess == mfish_tai_turn) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = RANDOM_F(actor->init_data._14) + actor->init_data._10; + } + actor->currentProcess = mfish_tai_normal; +} + +void mfish_tai_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + + s16 ss = (ABS(actor->_622) * ((0.75f * actor->init_data._30) / 32749.0f)); + + int s = (s16)MIN(DEG2SHORT_ANGLE2(25), MAX(ss, DEG2SHORT_ANGLE2(5))); + + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + (s16)(sin_s(actor->_636) * actor->_632), + CALC_EASE2(0.3f), (s16)(s >> 1) >> 1, DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.15f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + + if (actor->_598) { + f32 d = (actor->_598->init_data._08 + actor->init_data._08); + f32 o_y = actor->_598->position.y; + f32 o_z = actor->_598->position.z; + f32 v = MAX(d - ABS(actor->_598->position.z - actor->position.z), 0.0f); + v = v / d; + if (actor->_598->fishIDEnum != aGYO_TYPE_JELLYFISH) { + if (actor->_598->position.y < actor->position.y) { + if (actor->position.y < (o_y + (actor->_598->init_data._04 + actor->init_data._04))) { + add_calc2(&actor->position.y, (o_y + (actor->_598->init_data._04 + actor->init_data._04)) + 2.0f, + 0.2f, v * 0.1f); + } + } else { + if (actor->position.y > o_y - (actor->_598->init_data._04 + actor->init_data._04)) { + add_calc2(&actor->position.y, (o_y - (actor->_598->init_data._04 + actor->init_data._04)) - 2.0f, + 0.2f, v * 0.1f); + } + } + } + + if (actor->_598->position.z < actor->position.z) { + add_calc2(&actor->position.z, o_z + d, 0.05f, v * 0.1f); + } else { + add_calc2(&actor->position.z, o_z - d, 0.05f, v * 0.1f); + } + } + + if (actor->_5FC < actor->_5AC.x - actor->init_data._28 * 0.5f) { + if (actor->_612.y < 0) { + s16 s; + if (actor->_604 > actor->_608) { + s = actor->_60C.y - DEG2SHORT_ANGLE(90); + } else { + s = actor->_60C.y + DEG2SHORT_ANGLE(90); + } + actor->_612.y = s; + actor->_5AC.x = RANDOM_F(80.f) + 30.f; + } 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.x - actor->init_data._28 * 0.5f) { + if (actor->_612.y > 0) { + s16 s; + if (actor->_604 > actor->_608) { + s = actor->_60C.y + DEG2SHORT_ANGLE(90); + } else { + s = actor->_60C.y - DEG2SHORT_ANGLE(90); + } + actor->_612.y = s; + actor->_5AC.x = RANDOM_F(80.f) + 30.f; + } 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_flags & 0x100) { + actor->position.z += 0.05f; + if (ABS((s16)(actor->_612.y - DEG2SHORT_ANGLE(180))) < DEG2SHORT_ANGLE(110)) { + if (actor->_612.y > DEG2SHORT_ANGLE(0)) { + actor->_612.y -= DEG2SHORT_ANGLE(1.5f); + } else { + actor->_612.y += DEG2SHORT_ANGLE(1.5f); + } + } + } else if (actor->_62E_flags & 0x1e) { + mfish_tai_turn_init(actor, gamex); + } else if (actor->_62E_flags & 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->activityFrameCount < 0) { + f32 f = RANDOM_F(1.0f); + actor->_612.y = actor->_60C.y; + if (RANDOM_F(1.0f) < GETREG(TAKREG, 0x1c) * 0.1f + 0.1f) { + if (actor->_612.y < 0) { + if (actor->_604 > actor->_608) { + actor->_612.y = actor->_60C.y - DEG2SHORT_ANGLE(157.5f); + } else { + actor->_612.y = actor->_60C.y + DEG2SHORT_ANGLE(157.5f); + } + } else { + if (actor->_604 > actor->_608) { + actor->_612.y = actor->_60C.y + DEG2SHORT_ANGLE(157.5f); + } else { + actor->_612.y = actor->_60C.y - DEG2SHORT_ANGLE(157.5f); + } + } + } else { + if ((actor->_608 - actor->_604) * cos_s(actor->_60C.y) < 0.0f) { + actor->_612.y += (s16)(f * actor->init_data._30); + } else { + actor->_612.y -= (s16)(f * actor->init_data._30); + } + } + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + actor->_5F0 = actor->init_data._10 + Rnd_EX_f(actor->init_data._14); + } +} + +void mfish_tai_turn_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 b = (s16)actor->_62C; + + if (ABS(actor->_622) > DEG2SHORT_ANGLE(45)) { + return; + } + + if ((s16)(actor->_60C.y - b) > 0) { + if (actor->_62E_flags & 6) { + b = b + DEG2SHORT_ANGLE(170); + } else { + b = b + DEG2SHORT_ANGLE(95); + } + } else { + if (actor->_62E_flags & 6) { + b = b - DEG2SHORT_ANGLE(170); + } else { + b = b - DEG2SHORT_ANGLE(95); + } + } + + if (ABS((s16)(b - actor->_612.y)) > DEG2SHORT_ANGLE(45)) { + actor->currentProcess = mfish_tai_turn; + } + + actor->_612.y = b; +} + +void mfish_tai_turn(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(0.25f + GETREG(TAKREG, 0x17) * 0.01f), + (s16)(DEG2SHORT_ANGLE2(15.0f + 0.1f * GETREG(TAKREG, 0x18)) >> 1) >> 1, + DEG2SHORT_ANGLE(0.125f)); + + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.2f + GETREG(TAKREG, 0x19) * 0.01f), + (s16)(DEG2SHORT_ANGLE(5.0f + 0.1f * GETREG(TAKREG, 0x1a)) >> 1) >> 1, + DEG2SHORT_ANGLE(0.125f)); + + if (ABS((s16)actor->_622) < DEG2SHORT_ANGLE(3)) { + mfish_tai_normal_init(actor, gamex); + } +} + +void mfish_tai_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t p; + f32 v; + + actor->currentProcess(actor, gamex); + actor->_618.x += DEG2SHORT_ANGLE(RANDOM_F(3.0f) * actor->_5E8 + 0.1f); + actor->_5F4 = sin_s(actor->_618.x) * 5.0f; + if (actor->_62E_flags & 0x20) { + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.02f, 0.05f); + } else { + add_calc2(&actor->position.y, actor->_5F4 + actor->init_data._0C, 0.1f, 0.125f); + } + + if (ABS(actor->_622) > DEG2SHORT_ANGLE(20)) { + add_calc_short_angle2(&actor->_632, MAX(DEG2SHORT_ANGLE2((GETREG(TAKREG, 0x27) + 5.0f) * actor->_5E8), 0), + CALC_EASE(0.25f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.5f)); + } else if ((actor->_62E_flags & 0x20) == 0) { + add_calc_short_angle2(&actor->_632, MAX(DEG2SHORT_ANGLE2((GETREG(TAKREG, 0x28) + 30.0f) * actor->_5E8), 0), + CALC_EASE(0.25f), DEG2SHORT_ANGLE(5.0f), DEG2SHORT_ANGLE(0.5f)); + } else { + add_calc_short_angle2(&actor->_632, DEG2SHORT_ANGLE(5), CALC_EASE(0.1f), DEG2SHORT_ANGLE(2.5f), + DEG2SHORT_ANGLE(0.25f)); + } + + actor->_636 += (s16)DEG2SHORT_ANGLE2((GETREG(TAKREG, 0x29) + 10.0f) * 0.5f); + + if (ABS(actor->_622) > DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x37) + 60.f) || + (s16)(ABS(actor->_622) - ABS(actor->_618.z)) < DEG2SHORT_ANGLE(5)) { + add_calc2(&actor->_5EC, 0.05f, 0.1f, 0.005f); + add_calc2(&actor->_5E8, MAX(actor->_5F0, actor->init_data._10), 0.05f, actor->_5EC); + } else { + add_calc0(&actor->_5EC, 0.1f, 0.002f); + add_calc2(&actor->_5E8, 0.16f, 1.0f - actor->init_data._18, 0.001f); + } + + actor->_5D0.x = actor->_5E8 * sin_s(actor->_60C.y); + actor->_5D0.z = actor->_5E8 * cos_s(actor->_60C.y); + + mfish_get_flow_vec(&p, actor, gamex); + + actor->position.x += actor->_5D0.x + p.x; + actor->position.z += actor->_5D0.z + p.z; + + mfish_onefish_mv(actor, gamex); + actor->_38._00.frame_control.speed = + (0.1f + 0.01f * GETREG(TAKREG, 0x14)) * 0.5f + (1.5f + 0.01f * GETREG(TAKREG, 0x15)) * actor->_5E8; + add_calc0(&actor->_5F8, 0.25f, 0.05f); + actor->_5F8 = MIN(1.0f, actor->_5F8); + mfish_body_wind_anime_play(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + + if (actor->position.y < (GETREG(TAKREG, 0x47) + 55.0f) - actor->init_data._04) { + actor->position.y = (GETREG(TAKREG, 0x47) + 55.0f) - actor->init_data._04; + } + + actor->activityFrameCount--; +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int s = (joint1->x + actor->_618.z) >> 3; + joint1->x = MY_CLAMP(s, DEG2SHORT_ANGLE(-15), DEG2SHORT_ANGLE(15)); + } else if (joint_num == 2) { + int s = joint1->y - (int)(actor->_618.z * (0.01f * GETREG(TAKREG, 0x4b) + 1.5f)); + joint1->y = MY_CLAMP(s, DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(90)); + } + return TRUE; +} + +void mfish_tai_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_tai_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_unagi.c_inc b/src/actor/ac_museum_fish_unagi.c_inc new file mode 100644 index 00000000..e0847f91 --- /dev/null +++ b/src/actor/ac_museum_fish_unagi.c_inc @@ -0,0 +1,355 @@ + +void mfish_unagi_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + mfish_onefish_ct(actor, gamex); + actor->_624 = 8; + actor->position.x = 225.0f; + actor->position.y = 55.0f; + actor->position.z = 185.0f; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_640 = 0; + actor->_642 = 1; + actor->_5AC = ZeroVec; + actor->_612.x = DEG2SHORT_ANGLE2(25.0f + GETREG(TAKREG, 0x46)); + actor->_612.z = DEG2SHORT_ANGLE(-3); + actor->_646 = 0; + actor->_5AC.y = 0.1f; + actor->_5E8 = 0.05f; + actor->_60C.y = DEG2SHORT_ANGLE(50); + mfish_unagi_rail_move_init(actor, gamex); +} + +s16 mfish_unagi_get_next_rail_type(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 s = actor->_646; + s16 s2 = (s16)RANDOM_F(3.0f); + if (s2 == s) { + if (s2 < 2) { + s2++; + } else { + s2 = 0; + } + } + return s2; +} + +void mfish_unagi_aim_wind_angle_calc(MUSEUM_FISH_PRIVATE_DATA* actor) { + s16 s; + if (actor->currentProcess == mfish_unagi_normal_to_reverse) { + s = 12; + } else if (actor->currentProcess == mfish_unagi_reverse_to_normal) { + s = 19; + } else { + s = unagi_rail_num_tbl[actor->_646]; + } + if (actor->_640 > s - 5 || actor->_640 < 3) { + add_calc_short_angle2(&actor->_612.x, (s16)DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x32) + 25.0f), CALC_EASE(0.1f), + DEG2SHORT_ANGLE(0.75f), DEG2SHORT_ANGLE(0)); + } else { + add_calc_short_angle2(&actor->_612.x, (s16)DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x33) + 30.0f), CALC_EASE(0.05f), + DEG2SHORT_ANGLE(0.25f), DEG2SHORT_ANGLE(0)); + } + add_calc_short_angle2(&actor->_612.z, (s16)DEG2SHORT_ANGLE2(-(GETREG(TAKREG, 0x34) * 0.1f + 3.0f)), + CALC_EASE(0.05f), DEG2SHORT_ANGLE(0.025f), DEG2SHORT_ANGLE(0)); +} + +void mfish_unagi_rail_move_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 target = search_position_angleY(&actor->position, &unagi_rail_tbl[actor->_646][actor->_642]); + actor->_640 = 0; + actor->_642 = 1; + add_calc_short_angle2(&actor->_612.y, target, CALC_EASE(GETREG(TAKREG, 0x24) * 0.01f + 0.5f), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x25) + 5.0f) >> 1, DEG2SHORT_ANGLE(0.25f)); + actor->currentProcess = mfish_unagi_rail_move; +} + +void mfish_unagi_rail_move(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t* pp = unagi_rail_tbl[actor->_646]; + f32 v = cos_s(actor->_618.z); + f32 v2 = actor->_5E8; + f32 v3; + s16 s; + if (v < 0.0f) { + v = 0.0f; + } + v3 = search_position_distance(&actor->position, &pp[actor->_642]); + if ((f32)(__fabs(chase_xyz_t(&actor->position, &pp[actor->_642], v2))) < 0.008f) { + if (actor->_640 < unagi_rail_num_tbl[actor->_646] - 1) { + actor->_640++; + } else { + actor->_640 = 0; + if (RANDOM_F(1.0f) > 0.5f) { + mfish_unagi_normal_to_reverse_init(actor, gamex); + return; + } + actor->_646 = mfish_unagi_get_next_rail_type(actor); + } + if (actor->_642 < unagi_rail_num_tbl[actor->_646] - 1) { + actor->_642++; + } else { + actor->_642 = 0; + } + v2 -= v3; + if (v2 > 0.0f) { + chase_xyz_t(&actor->position, &pp[actor->_642], v2); + } + } + + mfish_unagi_aim_wind_angle_calc(actor); + s = search_position_angleY(&actor->position, &pp[actor->_642]); + add_calc_short_angle2(&actor->_612.y, s, CALC_EASE(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_632, actor->_612.x * v, CALC_EASE(0.2f), DEG2SHORT_ANGLE(1.5f), DEG2SHORT_ANGLE(0)); + add_calc_short_angle2(&actor->_644, actor->_612.z * v, CALC_EASE(0.1f), DEG2SHORT_ANGLE(0.1f), DEG2SHORT_ANGLE(0)); +} + +void mfish_unagi_normal_to_reverse_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 target = search_position_angleY(&actor->position, &unagi_normal_to_reverse_rail_pos[actor->_642]); + actor->_640 = 0; + actor->_642 = 1; + add_calc_short_angle2(&actor->_612.y, target, CALC_EASE(GETREG(TAKREG, 0x24) * 0.01f + 0.5f), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x25) + 5.0f) >> 1, 0x2d); + actor->currentProcess = mfish_unagi_normal_to_reverse; +} + +void mfish_unagi_normal_to_reverse(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v1; + s16 s2; + xyz_t* p = unagi_normal_to_reverse_rail_pos; + f32 c = cos_s(actor->_618.z); + f32 v0 = actor->_5E8; + if (c < 0.0f) { + c = 0.0f; + } + + v1 = search_position_distance(&actor->position, &p[actor->_642]); + if ((f32)__fabs(chase_xyz_t(&actor->position, &p[actor->_642], v0)) < 0.008f) { + if (actor->_640 < 11) { + actor->_640++; + } else { + actor->_640 = 0; + actor->_646 = mfish_unagi_get_next_rail_type(actor); + mfish_unagi_rail_move_reverse_init(actor, gamex); + return; + } + if (actor->_642 < 11) { + actor->_642++; + } else { + actor->_642 = 0; + } + v0 -= v1; + if (v0 > 0.0f) { + chase_xyz_t(&actor->position, &p[actor->_642], v0); + } + } + mfish_unagi_aim_wind_angle_calc(actor); + s2 = search_position_angleY(&actor->position, &p[actor->_642]); + add_calc_short_angle2(&actor->_612.y, s2, CALC_EASE(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_632, actor->_612.x * c, CALC_EASE(0.1f), DEG2SHORT_ANGLE(0.75f), DEG2SHORT_ANGLE(0)); + add_calc_short_angle2(&actor->_644, actor->_612.z * c, CALC_EASE(0.1f), DEG2SHORT_ANGLE(0.1f), DEG2SHORT_ANGLE(0)); +} + +void mfish_unagi_rail_move_reverse_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + xyz_t* p = unagi_rail_tbl[actor->_646]; + s16 target; + actor->_640 = 0; + actor->_642 = unagi_rail_num_tbl[actor->_646] - 1; + target = search_position_angleY(&actor->position, &p[actor->_642]); + add_calc_short_angle2(&actor->_612.y, target, CALC_EASE(0.5f + 0.01f * GETREG(TAKREG, 0x24)), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x25) + 5.0f) >> 1, DEG2SHORT_ANGLE(0.25f)); + actor->currentProcess = mfish_unagi_rail_move_reverse; +} + +void mfish_unagi_rail_move_reverse(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v1; + s16 s2; + xyz_t* p = unagi_rail_tbl[actor->_646]; + f32 c = cos_s(actor->_618.z); + f32 v0 = actor->_5E8; + if (c < 0.0f) { + c = 0.0f; + } + v1 = search_position_distance(&actor->position, &p[actor->_642]); + if ((f32)__fabs(chase_xyz_t(&actor->position, &p[actor->_642], v0)) < 0.008f) { + if (actor->_640 > 1) { + actor->_640--; + } else if (actor->_640 == 1) { + actor->_640 = 0; + if (RANDOM_F(1.0f) > 0.5f) { + mfish_unagi_reverse_to_normal_init(actor, gamex); + return; + } + actor->_646 = mfish_unagi_get_next_rail_type(actor); + } else { + actor->_640 = unagi_rail_num_tbl[actor->_646] + -1; + } + + if (actor->_642 > 0) { + actor->_642--; + } else { + actor->_642 = unagi_rail_num_tbl[actor->_646] + -1; + } + v0 -= v1; + if (v0 > 0.0f) { + chase_xyz_t(&actor->position, &p[actor->_642], v0); + } + } + mfish_unagi_aim_wind_angle_calc(actor); + s2 = search_position_angleY(&actor->position, &p[actor->_642]); + add_calc_short_angle2(&actor->_612.y, s2, CALC_EASE(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_632, actor->_612.x * c, CALC_EASE(0.2f), DEG2SHORT_ANGLE(1.5f), DEG2SHORT_ANGLE(0)); + add_calc_short_angle2(&actor->_644, actor->_612.z * c, CALC_EASE(0.1f), DEG2SHORT_ANGLE(0.1f), DEG2SHORT_ANGLE(0)); +} + +void mfish_unagi_reverse_to_normal_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + s16 target; + actor->_640 = 0; + actor->_642 = 0x12; + target = search_position_angleY(&actor->position, &unagi_reverse_to_normal_rail_pos[actor->_642]); + add_calc_short_angle2(&actor->_612.y, target, CALC_EASE(0.5f + 0.01f * GETREG(TAKREG, 0x24)), + DEG2SHORT_ANGLE(GETREG(TAKREG, 0x25) + 5.0f) >> 1, DEG2SHORT_ANGLE(0.25f)); + actor->currentProcess = mfish_unagi_reverse_to_normal; +} + +void mfish_unagi_reverse_to_normal(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v1; + s16 s2; + xyz_t* p = unagi_reverse_to_normal_rail_pos; + f32 c = cos_s(actor->_618.z); + f32 v0 = actor->_5E8; + if (c < 0.0f) { + c = 0.0f; + } + v1 = search_position_distance(&actor->position, &p[actor->_642]); + if ((f32)__fabs(chase_xyz_t(&actor->position, &p[actor->_642], v0)) < 0.008f) { + if (actor->_640 > 1) { + actor->_640--; + } else if (actor->_640 == 1) { + actor->_640 = 0; + actor->_646 = mfish_unagi_get_next_rail_type(actor); + mfish_unagi_rail_move_init(actor, gamex); + return; + } else { + actor->_640 = 0x12; + } + + if (actor->_642 > 0) { + actor->_642--; + } else { + actor->_642 = 0x12; + } + v0 -= v1; + if (v0 > 0.0f) { + chase_xyz_t(&actor->position, &p[actor->_642], v0); + } + } + mfish_unagi_aim_wind_angle_calc(actor); + s2 = search_position_angleY(&actor->position, &p[actor->_642]); + add_calc_short_angle2(&actor->_612.y, s2, CALC_EASE(0.5f), DEG2SHORT_ANGLE(2.5f), DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_632, actor->_612.x * c, CALC_EASE(0.2f), DEG2SHORT_ANGLE(1.5f), DEG2SHORT_ANGLE(0)); + add_calc_short_angle2(&actor->_644, actor->_612.z * c, CALC_EASE(0.1f), DEG2SHORT_ANGLE(0.1f), DEG2SHORT_ANGLE(0)); +} + +void mfish_unagi_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + //! NOTE: wrong floats in this file, based on objdiff + xyz_t p1, p2, p3; + p1 = ZeroVec; + p2 = ZeroVec; + mfish_onefish_mv(actor, gamex); + if (actor->activityFrameCount-- < 0) { + f32 v; + actor->_5F0 = Rnd_EX_f(actor->init_data._14) + actor->init_data._10; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->savedActivityFrameCount = actor->activityFrameCount; + v = (actor->_5F0 / (actor->init_data._14 + actor->init_data._10)); + actor->_612.x = DEG2SHORT_ANGLE((GETREG(TAKREG, 0x35) + 75.0f) * v); + actor->_612.z = DEG2SHORT_ANGLE(-(GETREG(TAKREG, 0x36) * 0.1f + 9.0f) * v); + actor->_5AC.y = (GETREG(TAKREG, 0x11) * 0.01f + 0.05f) + RANDOM_F(GETREG(TAKREG, 0x12) * 0.01f + 0.1f); + } + + if (actor->activityFrameCount > actor->savedActivityFrameCount - 40) { + actor->_5EC = cos_s(actor->_622) * 0.1f; + add_calc2(&actor->_5E8, actor->_5F0, 0.15f, actor->_5EC); + } else { + if (ABS(actor->_618.z) > ABS(actor->_622)) { + actor->_5EC = cos_s(actor->_622) * 0.05f; + add_calc2(&actor->_5E8, actor->_5AC.y * MAX(0.0f, cos_s(actor->_622)), 0.025f, actor->_5EC); + } + } + + add_calc0(&actor->_5AC.x, 0.025f, 0.5f); + add_calc0(&actor->_5AC.z, 0.025f, 0.5f); + p1.x = sin_s(actor->_612.y) * actor->_5E8; + p1.z = cos_s(actor->_612.y) * actor->_5E8; + p2.x = sin_s(actor->_60C.y) * actor->_5E8; + p2.z = cos_s(actor->_60C.y) * actor->_5E8; + xyz_t_sub(&p2, &p1, &p3); + actor->_5AC.x += p3.x; + actor->_5AC.z += p3.z; + actor->_636 += actor->_644; + + actor->_622 = + add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE2(GETREG(TAKREG, 0x26) * 0.01f + 0.2f), + (s16)(DEG2SHORT_ANGLE((GETREG(TAKREG, 0x27) + 10.0f) + + (GETREG(TAKREG, 0x28) + 50.0f) * MAX(actor->_5E8, 0.01f)) >> + 1) >> + 1, + DEG2SHORT_ANGLE(0.25f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE2(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_38._538.x, actor->_618.z, CALC_EASE2(0.2f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + add_calc_short_angle2(&actor->_38._538.y, actor->_38._538.x, CALC_EASE2(0.15f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.125f)); + actor->currentProcess(actor, gamex); + add_calc2(&actor->_5F4, actor->_632 * (GETREG(TAKREG, 0x47) * 0.001f + 0.04f), 0.25f, 91.0f); + Museum_Fish_objchk_pos_set(actor, gamex); +} + +BOOL 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) { + + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 1) { + int i = (s16)(actor->_632 * 0.5f * sin_s(actor->_636)); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(90)); + trans->z += actor->_5F4 * sin_s(actor->_636 + DEG2SHORT_ANGLE(90)); + } else if (joint_num == 2) { + int i; + + i = DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x3c)) - (int)(actor->_618.z * (1.0f + 0.01f * GETREG(TAKREG, 0x38))); + i += (s16)(actor->_632 * 0.75f * sin_s(actor->_636 + DEG2SHORT_ANGLE2(90))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE2(-90), DEG2SHORT_ANGLE2(90)); + } else if (joint_num == 3) { + int i; + i = DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x3d)) - (int)(actor->_38._538.x * (1.1f + 0.01f * GETREG(TAKREG, 0x39))); + i += (s16)(actor->_632 * sin_s(actor->_636 + DEG2SHORT_ANGLE(180))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(90)); + } else if (joint_num == 4) { + int i; + i = DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x3e)) - (int)(actor->_38._538.y * (1.2f + 0.01f * GETREG(TAKREG, 0x3a))); + i += (s16)(actor->_632 * 0.75f * sin_s(actor->_636 + DEG2SHORT_ANGLE(270))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(90)); + } else if (joint_num == 5) { + int i; + i = DEG2SHORT_ANGLE2(GETREG(TAKREG, 0x3f)) - (int)(actor->_38._538.z * (1.3f + 0.01f * GETREG(TAKREG, 0x3b))); + i += (s16)(actor->_632 * 0.5f * sin_s(actor->_636 + DEG2SHORT_ANGLE(0))); + joint1->y = MY_CLAMP(i, DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(90)); + } + return TRUE; +} + +void mfish_unagi_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x + actor->_5AC.x, actor->position.y, actor->position.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.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_unagi_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +} diff --git a/src/actor/ac_museum_fish_zarigani.c_inc b/src/actor/ac_museum_fish_zarigani.c_inc new file mode 100644 index 00000000..74f03a37 --- /dev/null +++ b/src/actor/ac_museum_fish_zarigani.c_inc @@ -0,0 +1,229 @@ + +void mfish_zarigani_ct(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + YET_SKELETON* skele = &actor->_38; + 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, 0.5f, 0.0f); + actor->position = suisou_pos[actor->group]; + actor->position.y = 53.0f; + actor->_60C.y = qrand(); + actor->_612.y = actor->_60C.y; + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_5E8 = 0.0f; + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->_5AC = ZeroVec; + actor->_624 = 5; + mfish_zarigani_normal_process_init(actor, gamex); +} + +void mfish_zarigani_normal_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->currentProcess = mfish_zarigani_normal_process; +} + +void mfish_zarigani_normal_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->activityFrameCount--; + cKF_SkeletonInfo_R_play(&actor->_38._00); + if (actor->_5F0 > 0.0f) { + add_calc_short_angle2(&actor->_644, (s16)DEG2SHORT_ANGLE2(actor->_5F0 * 30.0f + 1.0f), CALC_EASE(0.25f), + DEG2SHORT_ANGLE(0.125f), DEG2SHORT_ANGLE(0.5f)); + } else { + add_calc_short_angle2(&actor->_644, (s16)DEG2SHORT_ANGLE2(-3.0f + GETREG(TAKREG, 0x19)), CALC_EASE(0.25f), + DEG2SHORT_ANGLE(0.125f), DEG2SHORT_ANGLE(0.5f)); + } + actor->_622 = add_calc_short_angle2(&actor->_60C.y, actor->_612.y + DEG2SHORT_ANGLE(sin_s(actor->_638) * 3.0f), + CALC_EASE(0.1f), DEG2SHORT_ANGLE(1.0f), DEG2SHORT_ANGLE(0.5f)); + add_calc_short_angle2(&actor->_618.z, actor->_622, CALC_EASE(0.25f), DEG2SHORT_ANGLE(1.0f), DEG2SHORT_ANGLE(0.5f)); + + add_calc_short_angle2(&actor->_60C.x, (s16)DEG2SHORT_ANGLE2(sin_s(actor->_638) * 2.5f + 2.5f), CALC_EASE(0.25f), + DEG2SHORT_ANGLE(1.0f), DEG2SHORT_ANGLE(0.5f)); + + if (ABS((s16)(actor->_612.y - actor->_60C.y)) < DEG2SHORT_ANGLE(10) | actor->_638 > 0) { + //! BUG: someone forgot a `|` ^ + f32 v = actor->_5E8 * (ABS(sin_s(actor->_638)) * 0.5f + 0.5f); + actor->position.x += v * sin_s(actor->_60C.y); + actor->position.z += v * cos_s(actor->_60C.y); + } + + if (actor->activityFrameCount < 0) { + actor->_5F0 = 0.0f; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + mfish_zarigani_wait_process_init(actor, gamex); + } + + if (actor->_62E_flags & 0x1e) { + if (ABS((s16)(actor->_60C.y - actor->_62C)) < DEG2SHORT_ANGLE(90)) { + if (ABS((s16)(actor->_612.y - actor->_62C)) < DEG2SHORT_ANGLE(35) && (actor->_62E_flags & 0x10) == 0) { + mfish_zarigani_stand_process_init(actor, gamex); + } else if ((s16)(actor->_612.y - actor->_62C) > 0) { + actor->_612.y = actor->_62C; + actor->_612.y += DEG2SHORT_ANGLE(95); + } else { + actor->_612.y = actor->_62C; + actor->_612.y -= DEG2SHORT_ANGLE(95); + } + } else { + actor->_5F0 = actor->init_data._10 + MAX(-actor->init_data._10, RANDOM_F(actor->init_data._14)); + actor->_612.y = actor->_62C + DEG2SHORT_ANGLE(180); + } + } +} + +void mfish_zarigani_wait_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->currentProcess = mfish_zarigani_wait_process; +} + +void mfish_zarigani_wait_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->activityFrameCount--; + add_calc_short_angle2(&actor->_644, 0, CALC_EASE(0.25f), DEG2SHORT_ANGLE(0.125f), DEG2SHORT_ANGLE(0.5f)); + if (actor->activityFrameCount < 0) { + if (mfish_WallCheck(actor) && RANDOM_F(1) < 0.2f) { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + mfish_zarigani_jump_process_init(actor, gamex); + } else { + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + actor->_5F0 = actor->init_data._10 + RANDOM_F(actor->init_data._14); + actor->_612.y += (s16)RANDOM2_F(actor->init_data._30 * 2.0f); + mfish_zarigani_normal_process_init(actor, gamex); + } + } +} + +void mfish_zarigani_stand_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->currentProcess = mfish_zarigani_stand_process; + if (actor->_62E_flags & 0x1e) { + actor->_612.y = actor->_62C; + if ((s16)(actor->_60C.y - actor->_62C) != DEG2SHORT_ANGLE(0)) { + actor->_612.y += DEG2SHORT_ANGLE(90); + } else { + actor->_612.y += DEG2SHORT_ANGLE(-90); + } + } + actor->activityFrameCount = actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); +} + +void mfish_zarigani_stand_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + + cKF_SkeletonInfo_R_play(&actor->_38._00); + if (actor->activityFrameCount > 0) { + actor->activityFrameCount--; + if (add_calc_short_angle2(&actor->_60C.x, (s16)DEG2SHORT_ANGLE2(-45.0f + GETREG(TAKREG, 0x1a)), CALC_EASE(0.1), + DEG2SHORT_ANGLE(0.5f), DEG2SHORT_ANGLE(0.05f)) == 0) { + add_calc_short_angle2(&actor->_644, DEG2SHORT_ANGLE(0.5f), CALC_EASE(0.01f), DEG2SHORT_ANGLE(0.05f), + DEG2SHORT_ANGLE(0)); + } + } else { + add_calc_short_angle2(&actor->_60C.y, actor->_612.y, CALC_EASE(0.25f), DEG2SHORT_ANGLE(1.25f), + DEG2SHORT_ANGLE(0.05f)); + if (add_calc_short_angle2(&actor->_60C.x, DEG2SHORT_ANGLE(0), CALC_EASE(0.25f), DEG2SHORT_ANGLE(0.75f), + DEG2SHORT_ANGLE(0.05f)) == 0) { + actor->_5AC = ZeroVec; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + mfish_zarigani_wait_process_init(actor, gamex); + } + } + + v = (-SHORT2DEG_ANGLE2(actor->_60C.x) / 90.0f); + v *= (20.0f + GETREG(TAKREG, 0x1b) * 0.1f); + actor->_5AC.x = sin_s(actor->_60C.y) * v; + actor->_5AC.z = cos_s(actor->_60C.y) * v; +} + +void mfish_zarigani_jump_process_init(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_5F0 = -1.2f + GETREG(TAKREG, 0x1e) * 0.01f; + actor->_5E8 = 0.0f; + actor->_5D0.y = 0.25f + GETREG(TAKREG, 0x1d) * 0.01f; + actor->_644 = 0; + actor->currentProcess = mfish_zarigani_jump_process; +} + +void mfish_zarigani_jump_process(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + actor->_5D0.y -= 0.015f + GETREG(TAKREG, 0x1f) * 0.001f; + actor->_5D0.y *= 0.99f; + actor->_5F0 *= 0.95f; + add_calc2(&actor->_5E8, actor->_5F0, 0.25f, 0.05f); + actor->position.x += actor->_5E8 * sin_s(actor->_60C.y); + actor->position.y += actor->_5D0.y * MAX(sin_s(actor->_60C.x), 0.1f); + actor->position.z += actor->_5E8 * cos_s(actor->_60C.y); + if (actor->_5D0.y > 0.0f) { + add_calc_short_angle2(&actor->_60C.x, (s16)DEG2SHORT_ANGLE2(30.f + GETREG(TAKREG, 0x21)), CALC_EASE(0.5), + DEG2SHORT_ANGLE(7.5f), DEG2SHORT_ANGLE(0)); + } else if ((add_calc_short_angle2(&actor->_60C.x, 0, CALC_EASE(0.1), DEG2SHORT_ANGLE(1.5f), + DEG2SHORT_ANGLE(0.25f)) == 0) && + (actor->_62E_flags & 0x200)) { + actor->_5AC.y = 0.0f; + actor->activityFrameCount = + actor->init_data.activeFramesMin + (s16)RANDOM_F(actor->init_data.activeFramesRange); + mfish_zarigani_wait_process_init(actor, gamex); + return; + } + actor->_5AC.y = SHORT2DEG_ANGLE2(actor->_60C.x) / 90.f; + actor->_5AC.y *= 20.f + GETREG(TAKREG, 0x1c) * 0.1f; +} + +void mfish_zarigani_mv(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + f32 v; + xyz_t p = suisou_pos[actor->group]; + add_calc(&actor->_5E8, actor->_5F0, 0.1f, 0.2f, 0.01f); + actor->currentProcess(actor, gamex); + actor->_638 += actor->_644; + Museum_Fish_objchk_pos_set(actor, gamex); + Museum_Fish_BGCheck(actor, gamex); + xyz_t_sub(&p, &actor->position, &p); + v = 58.0f + MAX(ABS(p.x), ABS(p.z)) * -0.15f; + actor->_62E_flags &= ~0x200; + if (actor->position.y < v || actor->currentProcess != mfish_zarigani_jump_process) { + actor->_62E_flags |= 0x200; + actor->position.y = v; + } +} + +BOOL 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) { + MUSEUM_FISH_PRIVATE_DATA* actor = (MUSEUM_FISH_PRIVATE_DATA*)arg; + if (joint_num == 2) { + joint1->x += (s16)(actor->_60C.x >> 3); + } else if (joint_num == 3) { + joint1->z += (s16)((joint1->z + DEG2SHORT_ANGLE2(-90.65f) + GETREG(TAKREG, 0x2a)) * + (1.5f + GETREG(TAKREG, 0x29) * 0.1f)); + } else if (joint_num == 5) { + joint1->x += (s16)DEG2SHORT_ANGLE2(3.0f * sin_s(actor->_638)); + joint1->z -= (s16)DEG2SHORT_ANGLE2(5.0f * cos_s(actor->_638)); + joint1->z += (s16)(actor->_618.z * (0.4f + cos_s(actor->_638) * 0.4f)); + } else if (joint_num == 7) { + joint1->x += (s16)DEG2SHORT_ANGLE2(3.0f * sin_s(actor->_638)); + joint1->z -= (s16)DEG2SHORT_ANGLE2(5.0f * cos_s(actor->_638)); + joint1->z += (s16)(actor->_618.z * (0.4f + cos_s(actor->_638) * 0.4f)); + } else if (joint_num == 8) { + joint1->z >>= 2; + if (actor->_60C.x < 0) { + joint1->z += actor->_60C.x; + } else { + joint1->z += (s16)(actor->_60C.x * (GETREG(TAKREG, 0x20) * 0.1f + 3.0f)); + } + } + return TRUE; +} + +void mfish_zarigani_dw(MUSEUM_FISH_PRIVATE_DATA* actor, GAME* gamex) { + 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->position.x + actor->_5AC.x, actor->position.y + actor->_5AC.y, + actor->position.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_rotateXYZ(DEG2SHORT_ANGLE(-90), DEG2SHORT_ANGLE(-180), DEG2SHORT_ANGLE(0), 1); + Matrix_scale(actor->init_data.renderScale, actor->init_data.renderScale, actor->init_data.renderScale, 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_zarigani_before_disp, NULL, actor); + CLOSE_DISP(gamex->graph); +}