Files
ac-decomp/src/actor/ac_museum_fish.c
T
2025-05-03 11:20:35 -04:00

1135 lines
44 KiB
C

#include "ac_museum_fish_priv.h"
// 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] = {
mfish_TANK_0,
mfish_TANK_2,
mfish_TANK_1,
mfish_TANK_3,
mfish_TANK_3,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_0,
mfish_TANK_2,
mfish_TANK_1,
mfish_TANK_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] = {
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_4,
mfish_TANK_0,
mfish_TANK_0,
mfish_TANK_0,
mfish_TANK_1,
mfish_TANK_1,
mfish_TANK_1,
mfish_TANK_2,
mfish_TANK_2,
mfish_TANK_2,
mfish_TANK_3,
mfish_TANK_3,
mfish_TANK_3,
};
cKF_Skeleton_R_c* mfish_model_tbl[aGYO_TYPE_NUM] = {
/* 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[aGYO_TYPE_NUM] = {
/* 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[aGYO_TYPE_NUM] = {
/* 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[aGYO_TYPE_NUM] = {
/* CRUCIAN_CARP */ mfish_TANK_0,
/* BROOK_TROUT */ mfish_TANK_0,
/* CARP */ mfish_TANK_0,
/* KOI */ mfish_TANK_0,
/* CATFISH */ mfish_TANK_1,
/* SMALL_BASS */ mfish_TANK_1,
/* BASS */ mfish_TANK_1,
/* LARGE_BASS */ mfish_TANK_1,
/* BLUEGILL */ mfish_TANK_1,
/* GIANT_CATFISH */ mfish_TANK_1,
/* GIANT_SNAKEHEAD */ mfish_TANK_3,
/* BARBEL_STEED */ mfish_TANK_0,
/* DACE */ mfish_TANK_2,
/* PALE_CHUB */ mfish_TANK_2,
/* BITTERLING */ mfish_TANK_0,
/* LOACH */ mfish_TANK_1,
/* POND_SMELT */ mfish_TANK_2,
/* SWEETFISH */ mfish_TANK_2,
/* CHERRY_SALMON */ mfish_TANK_2,
/* LARGE_CHAR */ mfish_TANK_2,
/* RAINBOW_TROUT */ mfish_TANK_2,
/* STRINGFISH */ mfish_TANK_2,
/* SALMON */ mfish_TANK_4,
/* GOLDFISH */ mfish_TANK_0,
/* PIRANHA */ mfish_TANK_3,
/* AROWANA */ mfish_TANK_3,
/* EEL */ mfish_TANK_0,
/* FRESHWATER_GOBY */ mfish_TANK_1,
/* ANGELFISH */ mfish_TANK_3,
/* GUPPY */ mfish_TANK_3,
/* POPEYED_GOLDFISH */ mfish_TANK_0,
/* COELACANTH */ mfish_TANK_4,
/* CRAWFISH */ mfish_TANK_2,
/* FROG */ mfish_TANK_1,
/* KILLIFISH */ mfish_TANK_0,
/* JELLYFISH */ mfish_TANK_4,
/* SEA_BASS */ mfish_TANK_4,
/* RED_SNAPPER */ mfish_TANK_4,
/* BARRED_KNIFEJAW */ mfish_TANK_4,
/* ARAPAIMA */ mfish_TANK_3,
};
PRIV_FISH_CONSTRUCTOR mfish_ct[aGYO_TYPE_NUM] = {
/* 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[aGYO_TYPE_NUM] = {
/* 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[aGYO_TYPE_NUM] = {
/* 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
};
#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->fish_idx = fishNum;
actor->init_data = mfish_init_data[fishNum];
actor->tank = mfish_group_tbl[fishNum];
if (actor->tank >= 0) {
actor->position = suisou_pos[actor->tank];
} 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->player_area_update_timer = 0x1e;
mfish_point_light_ct(actorx, gamex);
for (i = 0; i < 14; i++) {
actor->prvKusa[i]._54C = kusa_model[i];
cKF_SkeletonInfo_R_ct(&actor->prvKusa[i].keyframe, kusa_model[i], kusa_anime[i], actor->prvKusa[i].work,
actor->prvKusa[i].morph);
cKF_SkeletonInfo_R_init_standard_repeat_speedsetandmorph(&actor->prvKusa[i].keyframe, kusa_anime[i], NULL,
kusa_group_tbl[i] == mfish_TANK_2 ? 1.5f : 0.5f, 0.0f);
actor->prvKusa[i].keyframe.frame_control.current_frame = kusa_start_frame[i];
actor->prvKusa[i]._538.x = qrand();
actor->prvKusa[i]._538.z = qrand();
}
if (mMmd_FishInfo(aGYO_TYPE_FROG)) {
actor->prvFish[aGYO_TYPE_FROG].hasu_p = &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->kf._54C = mfish_model_tbl[i];
prv->kf._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(MUSEUM_FISH_ACTOR* actor) {
// 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) {
s16 subAngle;
xyz_t pos;
ACTOR* playerx;
// 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 } };
playerx = GET_PLAYER_ACTOR_GAME_ACTOR(gamex);
subAngle = DEG2SHORT_ANGLE(-180) + playerx->world.angle.y;
xyz_t_sub(&playerx->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(MUSEUM_FISH_ACTOR* actor, 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(actor);
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(MUSEUM_FISH_ACTOR* actor, GAME* game) {
// MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx;
if (mDemo_Check(mDemo_TYPE_SPEAK, (ACTOR*)actor) != 0) {
s_xyz rotation = GET_PLAYER_ACTOR_GAME_ACTOR(game)->shape_info.rotation;
add_calc_short_angle2(&rotation.y, DEG2SHORT_ANGLE(-180), 0.3f, DEG2SHORT_ANGLE(22.5f), 0);
GET_PLAYER_ACTOR_NOW()->Set_force_position_angle_proc(gamePT, 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(actor);
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(actor, i);
mDemo_Request(mDemo_TYPE_SPEAK, (ACTOR*)actor, &Museum_Fish_set_talk_info);
}
}
}
}
void Museum_Fish_Actor_move(ACTOR* actorx, GAME* game) {
int i;
int j;
MUSEUM_FISH_PRIVATE_DATA* prv;
s16 oldplayer_area;
f32 v;
MUSEUM_FISH_ACTOR* actor = (MUSEUM_FISH_ACTOR*)actorx;
MUSEUM_FISH_PRIVATE_DATA* prv2;
mfish_point_light_mv((MUSEUM_FISH_ACTOR*)actorx, game);
oldplayer_area = actor->player_area;
mfish_get_player_area((MUSEUM_FISH_ACTOR*)actorx, game);
if (actor->player_area != oldplayer_area) {
xyz_t p;
prv = actor->prvFish;
p = GET_PLAYER_ACTOR_GAME_ACTOR(game)->world.position;
if (actor->player_area == mfish_TANK_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->player_area == mfish_TANK_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->player_area == prv->tank && v < 60.0f) {
prv->activityFrameCount = RANDOM_F(60);
}
}
}
for (j = 0; j < 14; j++) {
cKF_SkeletonInfo_R_play(&actor->prvKusa[j].keyframe);
if (kusa_group_tbl[j] == mfish_TANK_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((MUSEUM_FISH_ACTOR*)actorx, game);
Museum_Fish_Object_Check((MUSEUM_FISH_ACTOR*)actorx, game);
for (i = 0; i < 20; i++) {
actor->_14d50[i]--;
if (actor->_14d50[i] < 0) {
eEC_CLIP->effect_make_proc(eEC_EFFECT_SUISOU_AWA, suisou_awa_pos[i], 2, 0, game, RSV_NO,
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((MUSEUM_FISH_ACTOR*)actorx, game);
prv2 = actor->prvFish;
for (i = 0; i < aGYO_TYPE_NUM; i++, prv2++) {
if (prv2->_62E_flags & 1) {
mfish_mv[i](prv2, 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_idx, Gfx** joint_shape, u8* joint_flags,
void* arg, s_xyz* joint_rot, xyz_t* joint_pos) {
MUSEUM_FISH_KUSA_DATA* actor = (MUSEUM_FISH_KUSA_DATA*)arg;
if (joint_idx > 0) {
f32 v = (actor->_54C == &cKF_bs_r_obj_museum5_kusa3) ? 35.0f : 20.f;
joint_rot->y += (s16)(sin_s(actor->_538.x + (joint_idx * DEG2SHORT_ANGLE(90))) * 1274.0f);
joint_rot->x += (s16)(sin_s(actor->_538.z + (joint_idx * DEG2SHORT_ANGLE(90))) * 4369.0f);
joint_pos->y -= actor->_540.x * (v * joint_idx);
joint_pos->z += actor->_540.z * (v * joint_idx);
}
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].mtx[0];
} else {
mtx = actor->prvKusa[r5].mtx[1];
}
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].keyframe, 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->fish_idx != aGYO_TYPE_JELLYFISH && prv->fish_idx != aGYO_TYPE_FROG &&
mfish_cull_check(game, &prv->objchk_pos, 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.ofs_y,
actor->prvFish[aGYO_TYPE_JELLYFISH].init_data.ofs_y)) {
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);
}