Files
dusklight/src/d/actor/d_a_mg_fish.cpp
T
Luke Street c900a043b8 Some GCC compilation fixes (#3114)
* Fix 6-byte multichar literals

* Add `struct` to `e_ga_class::ga_s`

* Fix remaining wrong forward declares (struct/class)

* Replace `#include <string>` with `#include <cstring>`

* Guard FLT_EPSILON define to prevent redefinition

* Add missing `#include <cstring>` for direct cstring function usage
2026-02-28 12:11:00 -08:00

4081 lines
151 KiB
C++

/**
* @file d_a_mg_fish.cpp
*
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_mg_fish.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "SSystem/SComponent/c_cc_d.h"
#include "SSystem/SComponent/c_counter.h"
#include "Z2AudioLib/Z2Instances.h"
#include "d/actor/d_a_alink.h"
#include "d/actor/d_a_b_ob.h"
#include "d/actor/d_a_e_sg.h"
#include "d/actor/d_a_fr.h"
#include "d/actor/d_a_mg_rod.h"
#include "d/actor/d_a_npc_henna.h"
#include "d/actor/d_a_player.h"
#include "d/d_com_inf_game.h"
#include "d/d_s_play.h"
#include "d/d_vibration.h"
#include "f_op/f_op_kankyo_mng.h"
#include <cstring>
#define ANM_MG_FISH_MOUTH_CLOSE 4
#define ANM_MG_FISH_MOUTH_OPEN 5
#define ACTION_MG_FISH_MF_SWIM 0
#define ACTION_MG_FISH_MF_STAY 1
#define ACTION_MG_FISH_MF_AWAY 2
#define ACTION_MG_FISH_MF_SWIM_P 4
#define ACTION_MG_FISH_MF_SWIM_S 5
#define ACTION_MG_FISH_RI_SWIM 10
#define ACTION_MG_FISH_MF_AQUA 20
#define ACTION_MG_FISH_RI_AQUA 21
#define ACTION_MG_FISH_MF_AQUA_TILT 22
#define ACTION_MG_FISH_MF_LURE_SEARCH 50
#define ACTION_MG_FISH_MF_BAIT_SEARCH 51
#define ACTION_MG_FISH_MF_HIT 52
#define ACTION_MG_FISH_MF_JUMP 53
#define ACTION_MG_FISH_MF_CATCH 60
#define ACTION_MG_FISH_MF_ESA_SEARCH 70
#define ACTION_MG_FISH_MF_ESA_HIT 71
#define ACTION_MG_FISH_MF_ESA_CATCH 72
#define GEDOU_KIND_LM_1 0
#define GEDOU_KIND_RI_1 1
#define GEDOU_KIND_NP_1 2
#define GEDOU_KIND_CF_1 3
#define GEDOU_KIND_KS_1 4
#define GEDOU_KIND_BG 5
#define GEDOU_KIND_LM_2 6
#define GEDOU_KIND_RI_2 7
#define GEDOU_KIND_NP_2 8
#define GEDOU_KIND_CF_2 9
#define GEDOU_KIND_KS_2 10
#define GEDOU_KIND_BT 20
#define GEDOU_KIND_LH 21
#define GEDOU_KIND_SP 22
#define GEDOU_KIND_BB 23
#define GEDOU_KIND_O_GD_BOTT 24
#define GEDOU_KIND_KN 25
#define GEDOU_KIND_ED 26
#define GEDOU_KIND_SY 27
static u16 check_kind[4] = {
0xF57F,
0xF47F,
0xF37F,
0xF27F,
};
struct PathNode {
s16 index;
Vec pos;
};
daMg_Fish_HIO_c::daMg_Fish_HIO_c() {
this->field_0x4 = -1;
this->field_0x8 = 1.0f;
this->field_0xc = 5.0f;
this->field_0x10 = 300.0f;
this->field_0x14 = 400.0f;
this->field_0x18 = 0x0;
this->field_0x19 = 0x0;
this->field_0x1a = 0x0;
}
static void hit_vib_set(mg_fish_class* i_this) {
static s32 vib_p[4] = { 1, 2, 3, 4 };
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (rod != NULL && rod->vib_timer == 0) {
s32 vib_index = (rod->field_0xf60 - 100.0f) * 0.02f;
if (vib_index < 0) {
vib_index = 0;
} else if (vib_index > 3) {
vib_index = 3;
}
dComIfGp_getVibration().StartShock(vib_p[vib_index], 1,
cXyz(0.0f, 1.0f, 0.0f));
}
}
static void sibuki_set(mg_fish_class* i_this, f32 scale, cXyz i_pos) {
double newScale = 0.4f * scale * i_this->mJointScale;
i_pos.y = i_this->mSurfaceY;
fopKyM_createWpillar(&i_pos, newScale, 0);
fopAcM_effHamonSet(&i_this->field_0xc20, &i_pos, newScale, 0.2f);
}
// needed for .rodata ordering
static f32 dummy_3759() {
return 30.0f;
}
static void* s_hitfish_sub(void* a, void* b) {
if (fopAc_IsActor(a)) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fopAcM_GetName(fish) == PROC_MG_FISH && fish->mCurAction == ACTION_MG_FISH_MF_HIT) {
return &fish->actor.base;
}
}
return NULL;
}
static s32 pl_check(mg_fish_class* i_this, f32 speed) {
if (i_this->mDistToPlayer < fabsf(dComIfGp_getPlayer(0)->speedF) * 10.0f + speed) {
return 1;
}
fopAc_ac_c* actor = (fopAc_ac_c*)fpcEx_Search(s_hitfish_sub, i_this);
if (actor != NULL) {
if ((actor->current.pos - i_this->actor.current.pos).abs() < speed) {
return 3;
}
}
return 0;
}
static void anm_init(mg_fish_class* i_this, int i_resIndex, f32 i_morf, u8 i_mode, f32 i_speed) {
J3DAnmTransform* anmTransform =
(J3DAnmTransform*)dComIfG_getObjectRes(i_this->mResName, i_resIndex);
i_this->mpMorf->setAnm(anmTransform, i_mode, i_morf, i_speed,
0.0f, -1.0f, NULL);
i_this->mAnmID = i_resIndex;
}
static void mouth_open(mg_fish_class* i_this) {
if (i_this->mAnmTransform != NULL) {
anm_init(i_this, ANM_MG_FISH_MOUTH_OPEN, 2.0f, 0, 1.0f);
} else {
if (i_this->mKind2 == 2) {
i_this->mRotZ = -3000;
}
}
}
static void mouth_close(mg_fish_class* i_this) {
if (i_this->mAnmTransform != NULL) {
anm_init(i_this, ANM_MG_FISH_MOUTH_CLOSE, 2.0f, 0, 1.0f);
} else {
if (i_this->mKind2 == 2) {
i_this->mRotZ = 0;
}
}
}
static void* s_lure_sub(void* a, void* b) {
if (fopAc_IsActor(a)) {
if (fopAcM_GetName(a) == PROC_MG_ROD) {
dmg_rod_class* rod = (dmg_rod_class*)a;
if (rod->kind == 0 &&
rod->action == 4 &&
rod->field_0x10a9 == 0 &&
rod->is_hook_in_water != 0) {
return rod;
}
}
}
return NULL;
}
static void* s_esa_sub(void* a, void* b) {
if (fopAc_IsActor(a)) {
if (fopAcM_GetName(a) == PROC_MG_ROD) {
dmg_rod_class* rod = (dmg_rod_class*)a;
if (rod->kind == 1 &&
rod->action != 5 &&
rod->is_hook_in_water != 0 &&
rod->actor.current.pos.y < rod->water_surface_y - 20.0f) {
return rod;
}
}
}
return NULL;
}
static void* s_bait_sub(void* a, void* b) {
if (fopAc_IsActor(a)) {
if (fopAcM_GetName(a) == PROC_FR) {
fr_class* fr = (fr_class*)a;
if (fr->field_0x5ec != 0 &&
fr->speedF > 1.0f) {
return fr;
}
}
}
return NULL;
}
static u8 lit_1008;
static u8 lit_1007;
static daMg_Fish_HIO_c l_HIO;
static s32 s_fish_ct;
static void* s_other_search_sub(void* a, void* b) {
if (fopAc_IsActor(a) && b != a && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mCurAction == ACTION_MG_FISH_MF_LURE_SEARCH) {
s_fish_ct += 1;
}
}
return NULL;
}
static s32 search_lure(mg_fish_class* i_this, int param_2) {
static u8 learn_d[5] = {
0x01, 0x02, 0x04, 0x08, 0x10,
};
if (param_2 == 0) {
fopAc_ac_c* rod_actor = (fopAc_ac_c*)fpcM_Search(s_lure_sub, i_this);
if (rod_actor != NULL) {
dmg_rod_class* rod = (dmg_rod_class*)rod_actor;
s_fish_ct = 0;
fpcM_Search(s_other_search_sub, i_this);
if (s_fish_ct <= 1) {
f32 fVar1 = i_this->field_0x5ec;
if (rod->lure_type == MG_LURE_SP) {
fVar1 = 1000.0f;
} else {
if (rod->field_0x1009 != 0) {
fVar1 *= 1.5f;
}
if (s_fish_ct > 0 && i_this->mGedouKind != GEDOU_KIND_CF_1) {
fVar1 *= 0.5f;
}
}
if (i_this->field_0xc44 >= 0x14) {
fVar1 *= 0.5f;
}
if (i_this->mGedouKind != GEDOU_KIND_CF_1 &&
rod->lure_type != MG_LURE_SP &&
(i_this->field_0x750 & learn_d[rod->lure_type]) != 0)
{
return -1;
}
cXyz diff = rod->actor.current.pos - i_this->actor.current.pos;
if (rod->lure_type == MG_LURE_PO && rod->field_0x100c >= 10) {
diff.y = -80.0f;
}
if (diff.abs() < fVar1) {
return fopAcM_GetID(rod);
}
}
}
} else if (param_2 == 1) {
fopAc_ac_c* rod_actor = (fopAc_ac_c*)fpcM_Search(s_esa_sub, i_this);
if (rod_actor != NULL) {
dmg_rod_class* rod = (dmg_rod_class*)rod_actor;
if (i_this->mGedouKind == GEDOU_KIND_KS_2 && rod->hook_kind != 1) {
return -1;
}
if ((i_this->mGedouKind == GEDOU_KIND_BG || rod->hook_kind == 1 || rod->esa_kind != 0) &&
rod->actor.current.pos.y < i_this->mSurfaceY - 60.0f)
{
f32 maxLatDist = i_this->field_0x5ec;
f32 distX = rod->actor.current.pos.x - i_this->actor.current.pos.x;
f32 distZ = rod->actor.current.pos.z - i_this->actor.current.pos.z;
f32 latDist = JMAFastSqrt(distX * distX + distZ * distZ);
if (latDist < maxLatDist) {
return fopAcM_GetID(rod);
}
}
}
}
return -1;
}
static PathNode swim_path[43] = {
{ 0, { -1394.0f, -80.0f, 559.0f } },
{ 1, { -2327.0f, -80.0f, 1240.0f } },
{ 2, { -3002.0f, -80.0f, 1481.0f } },
{ 3, { -4268.0f, -80.0f, 1723.0f } },
{ 4, { -5114.0f, -80.0f, 1786.0f } },
{ 5, { -6163.0f, -80.0f, 2230.0f } },
{ 6, { -6924.0f, -80.0f, 2591.0f } },
{ 7, { -7840.0f, -80.0f, 2494.0f } },
{ 8, { -8343.0f, -80.0f, 2120.0f } },
{ 9, { -8060.0f, -80.0f, 1361.0f } },
{ 10, { -7754.0f, -80.0f, 773.0f } },
{ 11, { -7379.0f, -80.0f, 515.0f } },
{ 12, { -6807.0f, -80.0f, 549.0f } },
{ 13, { -6222.0f, -80.0f, 540.0f } },
{ 14, { -5343.0f, -80.0f, 21.0f } },
{ 15, { -4951.0f, -80.0f, -547.0f } },
{ 16, { -4825.0f, -80.0f, -1112.0f } },
{ 17, { -4132.0f, -80.0f, -1578.0f } },
{ 18, { -3561.0f, -80.0f, -1891.0f } },
{ 19, { -3274.0f, -80.0f, -2824.0f } },
{ 20, { -2693.0f, -80.0f, -3434.0f } },
{ 21, { -1915.0f, -80.0f, -3586.0f } },
{ 22, { -1360.0f, -80.0f, -3800.0f } },
{ 23, { -47.0f, -80.0f, -3921.0f } },
{ 24, { 716,.0f -80.0f, -3180.0f } },
{ 25, { 696,.0f -80.0f, -2490.0f } },
{ 26, { -391.0f, -80.0f, -1086.0f } },
{ 27, { -1250.0f, -80.0f, 338.0f } },
{ 28, { -1465.0f, -80.0f, 1203.0f } },
{ 29, { -1553.0f, -80.0f, 2380.0f } },
{ 30, { -493.0f, -80.0f, 3106.0f } },
{ 31, { 330.0f, -80.0f, 3403.0f } },
{ 32, { 1615.0f, -80.0f, 3361.0f } },
{ 33, { 3422.0f, -80.0f, 2460.0f } },
{ 34, { 3347.0f, -80.0f, 1203.0f } },
{ 35, { 3136.0f, -80.0f, 839.0f } },
{ 36, { 2754.0f, -80.0f, 244.0f } },
{ 37, { 2096.0f, -80.0f, -127.0f } },
{ 38, { 1452.0f, -80.0f, -964.0f } },
{ 39, { 252,.0f -80.0f, -1556.0f } },
{ 40, { -215.0f, -80.0f, -1227.0f } },
{ 41, { -1149.0f, -80.0f, 272.0f } },
{ -1, { 0.0f, 0.0f, 0.0f } },
};
static void* s_other_bait_sub(void* a, void* b) {
if (fopAc_IsActor(a) && b != a && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mCurAction == ACTION_MG_FISH_MF_BAIT_SEARCH &&
fish->mBaitId == ((mg_fish_class*)b)->mBaitId) {
return fish;
}
}
return NULL;
}
static s32 search_bait(mg_fish_class* i_this) {
void* searchRes = fpcM_Search(s_bait_sub, i_this);
if (searchRes != NULL) {
i_this->mBaitId = fopAcM_GetID(searchRes);
if (fpcM_Search(s_other_bait_sub, i_this) == NULL) {
f32 fVar1 = i_this->field_0x5ec + KREG_F(8);
cXyz acStack_38 = ((fopAc_ac_c*)searchRes)->current.pos - i_this->actor.current.pos;
f32 fVar5 = acStack_38.abs();
if (fVar5 < fVar1) {
return i_this->mBaitId;
}
}
}
return -1;
}
static int nodeCallBack(J3DJoint* joint, int param_1) {
if (param_1 == 0) {
s32 jointNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
mg_fish_class* fish = (mg_fish_class*)model->getUserArea();
dComIfGp_getPlayer(0);
if (fish != 0) {
if (jointNo <= fish->mNumJoints) {
MtxTrans(fish->mJointTranslations[jointNo].x, fish->mJointTranslations[jointNo].y,
fish->mJointTranslations[jointNo].z, 0);
cMtx_YrotM(*calc_mtx, fish->mJointRotations[jointNo].y);
cMtx_XrotM(*calc_mtx, fish->mJointRotations[jointNo].x);
cMtx_ZrotM(*calc_mtx, fish->mJointRotations[jointNo].z - fish->actor.shape_angle.z);
cMtx_YrotM(*calc_mtx, -16384);
MtxScale(fish->mJointScale, fish->mJointScale, fish->mJointScale, 1);
model->setAnmMtx(jointNo, *calc_mtx);
} else {
if (fish->mKind2 == 3 && jointNo >= 9 && jointNo <= 12) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
MtxScale(0.0f, 0.0f,
0.0f, 1);
model->setAnmMtx(jointNo, *calc_mtx);
}
if (fish->mKind2 == 1 || fish->mKind2 == 2 || fish->mKind2 == 4) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
if (jointNo == 7 || jointNo == 8) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 3]);
}
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
} else if (fish->mKind2 == 0) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
if (jointNo == 5 || jointNo == 6) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 1]);
}
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
} else if (fish->mGedouKind == GEDOU_KIND_BG) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
if (jointNo == 5 || jointNo == 6) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 1]);
}
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
}
if ((fish->mKind2 == 4 || fish->mKind2 == 2) && jointNo == 10) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
cMtx_ZrotM(*calc_mtx, fish->mRotZ);
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
}
}
}
}
return 1;
}
static int nodeCallBack2(J3DJoint* joint, int param_1) {
if (param_1 == 0) {
s32 jointNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
mg_fish_class* fish = (mg_fish_class*)model->getUserArea();
dComIfGp_getPlayer(0);
if (fish != NULL) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
if (fish->mKind2 == 3 && jointNo >= 9 && jointNo <= 12) {
MtxScale(0.0f, 0.0f, 0.0f, 1.0f);
model->setAnmMtx(jointNo, *calc_mtx);
}
if (jointNo >= 1 && jointNo <= fish->mNumJoints) {
cMtx_YrotM(*calc_mtx, fish->jointYaws1[jointNo - 1]);
}
if (fish->mKind2 == 1 || fish->mKind2 == 2 || fish->mKind2 == 4) {
if (jointNo == 7 || jointNo == 8) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 3]);
}
} else if (fish->mKind2 == 0) {
if (jointNo == 5 || jointNo == 6) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 1]);
}
} else if (fish->mGedouKind == GEDOU_KIND_BG && (jointNo == 5 || jointNo == 6)) {
cMtx_YrotM(*calc_mtx, fish->jointYaws2[jointNo - 1]);
}
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
}
}
return 1;
}
static int nodeCallBackLH(J3DJoint* joint, int param_1) {
if (param_1 == 0) {
s32 jointNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
mg_fish_class* fish = (mg_fish_class*)model->getUserArea();
if (fish != NULL && jointNo == 1) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
f32 dVar4 = fish->field_0x74c + 1.0f;
MtxScale(1.0f / dVar4, dVar4, dVar4, 1.0f);
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
}
}
return 1;
}
static int nodeCallBackBB(J3DJoint* joint, int param_1) {
if (param_1 == 0) {
s32 jointNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
mg_fish_class* fish = (mg_fish_class*)model->getUserArea();
if (fish != NULL && (jointNo == 2 || jointNo == 3 || jointNo == 4)) {
MTXCopy(model->getAnmMtx(jointNo), *calc_mtx);
cMtx_YrotM(*calc_mtx, fish->jointYaws1[jointNo - 2]);
model->setAnmMtx(jointNo, *calc_mtx);
MTXCopy(*calc_mtx, &J3DSys::mCurrentMtx[0]);
}
}
return 1;
}
static void* s_bt_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_BT) {
return fish;
}
}
return NULL;
}
static void* s_sp_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_SP) {
return fish;
}
}
return NULL;
}
static void* s_lh_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_LH) {
fish->field_0x74c = ((mg_fish_class*)b)->field_0x74c;
return fish;
}
}
return NULL;
}
static void* s_bin_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_O_GD_BOTT) {
return fish;
}
}
return NULL;
}
static void* s_kn_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_KN) {
return fish;
}
}
return NULL;
}
static void* s_ed_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_ED) {
return fish;
}
}
return NULL;
}
static void* s_sy_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_SY) {
return fish;
}
}
return NULL;
}
static void* s_bb_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_MG_FISH) {
mg_fish_class* fish = (mg_fish_class*)a;
if (fish->mGedouKind == GEDOU_KIND_BB) {
return fish;
}
}
return NULL;
}
static void* s_bb2_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_E_BG) {
return a;
}
return NULL;
}
static void* s_sg_sub(void* a, void* b) {
if (fopAc_IsActor(a) && fopAcM_GetName(a) == PROC_E_SG) {
return a;
}
return NULL;
}
s32 daMg_Fish_Draw(mg_fish_class* i_this) {
if (i_this->mGedouKind == GEDOU_KIND_BT ||
i_this->mGedouKind == GEDOU_KIND_SP ||
i_this->mGedouKind == GEDOU_KIND_LH ||
i_this->mGedouKind == GEDOU_KIND_O_GD_BOTT ||
i_this->mGedouKind == GEDOU_KIND_BB ||
i_this->mGedouKind == GEDOU_KIND_KN ||
i_this->mGedouKind == GEDOU_KIND_ED ||
i_this->mGedouKind == GEDOU_KIND_SY) {
return 1;
}
g_env_light.settingTevStruct(0, &i_this->actor.current.pos, &i_this->actor.tevStr);
if (i_this->mCaughtType != 0) {
mg_fish_class* fish;
if (i_this->mCaughtType == 1) {
fish = (mg_fish_class*)fpcEx_Search(s_bt_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 2) {
fish = (mg_fish_class*)fpcEx_Search(s_sp_sub, i_this);
if (fish != NULL) {
for (s32 i = 0; i < 3; i++) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[i], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[i]);
}
}
} else if (i_this->mCaughtType == 3) {
fish = (mg_fish_class*)fpcEx_Search(s_lh_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 5) {
fish = (mg_fish_class*)fpcEx_Search(s_bb_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 6) {
fish = (mg_fish_class*)fpcEx_Search(s_bin_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
fish->mpBtpAnm->setFrame(2.0f);
fish->mpBtpAnm->entry(fish->mpModel[0]->getModelData());
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 7) {
fish = (mg_fish_class*)fpcEx_Search(s_kn_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 8) {
fish = (mg_fish_class*)fpcEx_Search(s_ed_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
} else if (i_this->mCaughtType == 9) {
fish = (mg_fish_class*)fpcEx_Search(s_sy_sub, i_this);
if (fish != NULL) {
g_env_light.setLightTevColorType_MAJI(fish->mpModel[0], &i_this->actor.tevStr);
mDoExt_modelUpdateDL(fish->mpModel[0]);
}
}
} else {
if (i_this->field_0x5ec > 10000.0f) {
return 1;
}
J3DModel* i_model = i_this->mpMorf->getModel();
g_env_light.setLightTevColorType_MAJI(i_model, &i_this->actor.tevStr);
if (i_this->mpBrkAnm != NULL) {
i_this->mpBrkAnm->entry(i_model->getModelData());
}
i_this->mpMorf->entryDL();
if (i_this->field_0xc3c == 0 && i_this->mCurAction == ACTION_MG_FISH_MF_JUMP &&
i_this->mActionPhase >= 10) {
cXyz pos;
pos.set(i_this->actor.current.pos.x, 50.0f + i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
i_this->mShadowId = dComIfGd_setShadow(i_this->mShadowId, 1, i_model, &pos,
600.0f * i_this->mJointScale, 0.0f,
i_this->actor.current.pos.y, i_this->mAcch.GetGroundH(), i_this->mAcch.m_gnd,
&i_this->actor.tevStr, 0, 1.0f, &dDlst_shadowControl_c::mSimpleTexObj);
}
if (i_this->mKind2 == 3) {
_GXColor color;
color.r = 0x32;
color.g = 0x2d;
color.b = 0x14;
color.a = 0xff;
i_this->mLineMat.update(5, color, &i_this->actor.tevStr);
dComIfGd_set3DlineMat(&i_this->mLineMat);
}
}
return 1;
}
static void get_surface_y(mg_fish_class* i_this, cXyz* param_2) {
dBgS_ObjGndChk_Spl gndChk;
cXyz pos = *param_2;
pos.y += 1500.0f;
gndChk.SetPos(&pos);
dBgS& bgs = dComIfG_Bgsp();
f32 gndCross = bgs.GroundCross(&gndChk);
if (!(gndCross < -100000.0f)) {
i_this->mSurfaceY = gndCross;
}
}
static f32 get_ground_y(mg_fish_class* i_this, cXyz* param_2) {
dBgS_ObjGndChk gndChk;
cXyz pos = *param_2;
pos.y += 1500.0f;
gndChk.SetPos(&pos);
return dComIfG_Bgsp().GroundCross(&gndChk);
}
static void mf_swim(mg_fish_class* i_this) {
cXyz delta;
switch (i_this->mActionPhase) {
case 0: {
i_this->mNextPos.x = i_this->actor.home.pos.x + cM_rndFX(1000.0f);
i_this->mNextPos.z = i_this->actor.home.pos.z + cM_rndFX(1000.0f);
if (i_this->field_0x624[2] == 0) {
i_this->mNextPos.y = i_this->mSurfaceY;
i_this->mActionPhase = 2;
} else {
i_this->mNextPos.y = i_this->actor.home.pos.y;
i_this->mActionPhase = 1;
}
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
f32 deltaY = i_this->mSurfaceY - i_this->mGroundY;
if (deltaY > 0.0f && deltaY < 2000.0f) {
if (i_this->mActionPhase == 1) {
i_this->mNextPos.y = i_this->mGroundY +
(cM_rndFX(0.2f) + 0.5f) *
(i_this->mSurfaceY - i_this->mGroundY);
}
i_this->field_0x624[0] = cM_rndF(50.0f) + 50.0f;
} else {
i_this->mActionPhase = 0;
break;
}
}
case 1:
delta = i_this->mNextPos - i_this->actor.current.pos;
if ((i_this->mBobTimer & 3) == 0) {
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 latMoveDist = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, latMoveDist);
}
if (i_this->field_0x624[0] == 0 || delta.abs() < 100.0f) {
i_this->mActionPhase = 0;
}
break;
case 2:
delta = i_this->mNextPos - i_this->actor.current.pos;
if ((i_this->mBobTimer & 3) == 0) {
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 latMoveDist = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, latMoveDist);
}
if (i_this->actor.current.pos.y > i_this->mSurfaceY - 10.0f) {
sibuki_set(i_this, 1.5f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_JUMP_UP_S, 0, -1);
i_this->actor.current.angle.x = 0x2000;
i_this->mMovementYaw = 0x2000;
i_this->mActionPhase = 0;
i_this->field_0x624[2] = cM_rndF(1000.0f) + 1000.0f;
}
break;
}
cLib_addCalc2(&i_this->actor.speedF, 1.0f, 1.0f, 0.1f);
i_this->mMaxStep = 0x400;
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
}
static s32 pos_bg_check(cXyz* param_1, cXyz* param_2) {
dBgS_LinChk dStack_80;
dStack_80.Set(param_1, param_2, NULL);
dBgS& foo = dComIfG_Bgsp();
s32 iVar1 = foo.LineCross(&dStack_80);
if (iVar1 != 0) {
return 1;
} else {
return 0;
}
}
static s16 path_search(mg_fish_class* i_this) {
f32 maxSpeed = 500.0f;
s32 visited[50];
for (s32 i = 0; i < 50; i++) {
visited[i] = 0;
}
for (s16 i = 0; i < 50; i++) {
if (swim_path[i].index >= 0 && visited[i] == 0) {
cXyz pos_offset;
cXyz path_pos = swim_path[i].pos;
pos_offset = i_this->actor.current.pos - path_pos;
f32 speedMagnitude = pos_offset.abs();
if (speedMagnitude < maxSpeed) {
if (pos_bg_check(&i_this->actor.current.pos, &path_pos)) {
visited[i] = 1;
} else {
return i;
}
}
} else {
i = -1;
maxSpeed += 300.0f;
if (maxSpeed > 7000.0f) {
return -1;
}
}
}
return -1;
}
static void mf_swim_p(mg_fish_class* i_this) {
f32 targetSpeed = 1.0f;
switch (i_this->mActionPhase) {
case 0:
i_this->mCurSwimStep = path_search(i_this);
if (i_this->mCurSwimStep < 0) {
i_this->actor.home.pos = i_this->actor.current.pos;
i_this->mActionPhase = 10;
return;
}
i_this->mActionPhase = 1;
case 1:
i_this->mNextPos.x = swim_path[i_this->mCurSwimStep].pos.x + cM_rndFX(200.0f);
i_this->mNextPos.y = swim_path[i_this->mCurSwimStep].pos.y + cM_rndFX(40.0f);
i_this->mNextPos.z = swim_path[i_this->mCurSwimStep].pos.z + cM_rndFX(200.0f);
i_this->mActionPhase = 2;
case 2: {
cXyz delta = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 latMoveDist = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, latMoveDist);
f32 distToNextPos = delta.abs();
if (distToNextPos < 100.0f) {
i_this->mActionPhase = 1;
i_this->mCurSwimStep += 1;
i_this->mMaxStep = 0;
if (swim_path[i_this->mCurSwimStep].index < 0) {
i_this->mCurSwimStep = 0;
}
} else if (i_this->mAcch.ChkWallHit()) {
i_this->mActionPhase = 0;
}
break;
}
case 10:
targetSpeed = 0.0f;
break;
}
cLib_addCalc2(&i_this->actor.speedF, targetSpeed, 1.0f, 0.1f);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x400, 4, 0x20);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
}
static void mf_swim_s(mg_fish_class* i_this) {
cXyz delta;
switch (i_this->mActionPhase) {
case 0:
i_this->mNextPos.x = i_this->actor.home.pos.x + cM_rndFX(1000.0f);
i_this->mNextPos.z = i_this->actor.home.pos.z + cM_rndFX(1000.0f);
if (i_this->field_0x5ec < 10000.0f && i_this->field_0x624[2] == 0) {
i_this->mNextPos.y = i_this->mSurfaceY;
i_this->mActionPhase = 2;
} else {
i_this->mNextPos.y = i_this->actor.home.pos.y;
i_this->mActionPhase = 1;
}
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
if (i_this->mSurfaceY - i_this->mGroundY > 400.0f) {
i_this->mGroundY = i_this->mSurfaceY - 400.0f;
}
if (i_this->mSurfaceY - i_this->mGroundY > 0.0f &&
i_this->mSurfaceY - i_this->mGroundY < 2000.0f) {
if (i_this->mActionPhase == 1) {
i_this->mNextPos.y = i_this->mGroundY + (i_this->mSurfaceY - i_this->mGroundY) *
(cM_rndFX(0.2f) + 0.5f);
}
i_this->field_0x624[0] = cM_rndF(50.0f) + 50.0f;
// intentional fall-through
} else {
i_this->mActionPhase = 0;
break;
}
case 1:
delta = i_this->mNextPos - i_this->actor.current.pos;
if ((i_this->mBobTimer & 3) == 0) {
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 latMoveDist = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, latMoveDist);
}
if (i_this->field_0x624[0] == 0 || delta.abs() < 100.0f) {
i_this->mActionPhase = 0;
}
break;
case 2:
delta = i_this->mNextPos - i_this->actor.current.pos;
if ((i_this->mBobTimer & 3) == 0) {
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 latMoveDist = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, latMoveDist);
}
if (i_this->actor.current.pos.y > i_this->mSurfaceY - 10.0f) {
sibuki_set(i_this, 1.5f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_JUMP_UP_S, 0, -1);
i_this->actor.current.angle.x = 0x2000;
i_this->mMovementYaw = 0x2000;
i_this->mActionPhase = 0;
i_this->field_0x624[2] = cM_rndF(1000.0f) + 1000.0f;
}
break;
}
cLib_addCalc2(&i_this->actor.speedF, 1.0f, 1.0f, 0.1f);
i_this->mMaxStep = 0x400;
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
if (i_this->field_0x632 == 0 &&
i_this->mGedouKind == GEDOU_KIND_BG &&
i_this->field_0x5ec > 10000.0f &&
(i_this->mBobTimer & 0xF) == 0) {
if (fpcEx_Search(s_sg_sub, i_this) != NULL ||
fpcEx_Search(s_bb2_sub, i_this) != NULL) {
if (fpcEx_Search(s_bb2_sub, i_this) != NULL &&
fpcEx_Search(s_bb_sub, i_this) == NULL) {
fopAcM_create(PROC_MG_FISH, 0x17, &i_this->actor.current.pos,
fopAcM_GetRoomNo(&i_this->actor), NULL, NULL, -1);
}
} else {
fopAcM_delete(&i_this->actor);
}
}
}
static void mf_stay(mg_fish_class* i_this) {
f32 f31 = 0.0f;
f32 f30 = 0.01f;
switch (i_this->mActionPhase) {
case 0:
i_this->mNextPos = i_this->actor.home.pos;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
i_this->mActionPhase += 1;
i_this->mMaxStep = 0;
break;
case 1: {
f31 = 0.4f;
f30 = 0.02f;
cXyz delta = i_this->mNextPos - i_this->actor.current.pos;
f32 fVar6 = delta.abs();
if (fVar6 < 60.0f) {
i_this->mActionPhase = 2;
break;
}
i_this->mMovementYaw = cM_atan2s(delta.x, delta.z);
f32 mag = JMAFastSqrt(delta.x * delta.x + delta.z * delta.z);
i_this->mMovementPitch = -cM_atan2s(delta.y, mag);
break;
}
case 2:
cLib_addCalcAngleS2(&i_this->mMovementPitch, 0, 16, 0xa0);
if (i_this->field_0x624[0] == 1 && i_this->field_0xc44 < 10) {
i_this->mActionPhase = 0;
}
break;
}
cLib_addCalc2(&i_this->actor.speedF, f31, 1.0f, f30);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x300, 1, 0x20);
}
static void mf_away(mg_fish_class* i_this) {
cXyz offsetToNext;
switch (i_this->mActionPhase) {
case -1:
dKy_Sound_set(i_this->actor.current.pos, 30.0f * i_this->mJointScale,
fopAcM_GetID(i_this), 5);
i_this->field_0x624[1] = 0;
i_this->field_0x624[0] = 0;
i_this->mActionPhase = 0;
case 0:
mouth_close(i_this);
mDoMtx_YrotS(*calc_mtx, i_this->mYawToPlayer + 0x8000 + (s16)cM_rndFX(14000.0f));
offsetToNext.x = 0.0f;
offsetToNext.y = 0.0f;
offsetToNext.z = cM_rndF(150.0f) + 200.0f;
MtxPosition(&offsetToNext, &i_this->mNextPos);
i_this->mNextPos += i_this->actor.current.pos;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
if (i_this->mSurfaceY - i_this->mGroundY > 400.0f) {
i_this->mGroundY = i_this->mSurfaceY - 400.0f;
}
if (i_this->mSurfaceY - i_this->mGroundY > 0.0f &&
i_this->mSurfaceY - i_this->mGroundY < 2000.0f) {
i_this->mNextPos.y = i_this->mGroundY + (i_this->mSurfaceY - i_this->mGroundY) *
(cM_rndF(0.2f) + 0.1f);
if (i_this->mGedouKind >= GEDOU_KIND_BG) {
i_this->field_0x624[0] = cM_rndF(50.0f) + 50.0f;
i_this->mActionPhase += 1;
} else {
if (i_this->field_0x624[0] == 0) {
i_this->field_0x624[0] = cM_rndF(200.0f) + 500.0f;
}
i_this->mActionPhase = 5;
break;
}
} else {
break;
}
case 1:
offsetToNext = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(offsetToNext.x, offsetToNext.z);
i_this->mMovementPitch =
-cM_atan2s(offsetToNext.y, JMAFastSqrt(offsetToNext.x * offsetToNext.x + offsetToNext.z * offsetToNext.z));
if (i_this->field_0x624[0] == 0 || offsetToNext.abs() < 100.0f) {
if (pl_check(i_this, 500.0f) == 0) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
i_this->mActionPhase = 0;
i_this->field_0x624[0] = cM_rndF(100.0f) + 100.0f;
i_this->field_0x62e = cM_rndF(100.0f) + 200.0f;
} else {
i_this->mActionPhase = 0;
}
}
break;
case 5:
if (i_this->mGedouKind < GEDOU_KIND_BG) {
if (i_this->mAcch.ChkWallHit()) {
if (i_this->field_0x624[1] == 0) {
i_this->mActionPhase = 0;
i_this->field_0x624[1] = 40;
break;
}
}
}
offsetToNext = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(offsetToNext.x, offsetToNext.z);
i_this->mMovementPitch =
-cM_atan2s(offsetToNext.y, JMAFastSqrt(offsetToNext.x * offsetToNext.x + offsetToNext.z * offsetToNext.z));
if (i_this->field_0x624[0] == 0 || offsetToNext.abs() < 100.0f) {
i_this->mCurAction = ACTION_MG_FISH_MF_STAY;
i_this->mActionPhase = 2;
i_this->field_0x624[0] = cM_rndF(1000.0f) + 2000.0f;
i_this->field_0x62e = cM_rndF(100.0f) + 200.0f;
}
break;
}
cLib_addCalc2(&i_this->actor.speedF, 1.5f, 1.0f,
0.3f);
i_this->mMaxStep = 0x800;
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2,i_this-> mMaxStep);
}
static void ri_swim(mg_fish_class* i_this) {
cXyz offsetToNext;
f32 target = 0.0f;
f32 maxStep = 0.01f;
switch (i_this->mActionPhase) {
case 0: {
s16 foo = cM_rndFX(8000.0f);
foo += i_this->actor.shape_angle.y + 0x8000;
mDoMtx_YrotS(*calc_mtx, foo);
offsetToNext.x = 0.0f;
offsetToNext.y = 0.0f;
offsetToNext.z = cM_rndF(150.0f) + 300.0f;
MtxPosition(&offsetToNext, &i_this->mNextPos);
i_this->mNextPos += i_this->actor.current.pos;
i_this->mNextPos.y = i_this->actor.home.pos.y;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
f32 waterDepth = i_this->mSurfaceY - i_this->mGroundY;
if (waterDepth > 0.0f &&
waterDepth < 2000.0f) {
i_this->mNextPos.y = i_this->mGroundY;
i_this->mActionPhase += 1;
} else {
break;
}
i_this->mMaxStep = 0;
}
case 1:
target = 0.25f;
maxStep = 0.01f;
offsetToNext = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(offsetToNext.x, offsetToNext.z);
i_this->mMovementPitch =
-cM_atan2s(offsetToNext.y, JMAFastSqrt(offsetToNext.x * offsetToNext.x + offsetToNext.z * offsetToNext.z));
offsetToNext.y = 0.0f;
if (offsetToNext.abs() < 100.0f) {
i_this->mActionPhase = 2;
} else {
break;
}
i_this->field_0x624[0] = cM_rndF(200.0f) + 300.0f;
break;
case 2:
cLib_addCalcAngleS2(&i_this->mMovementPitch, 0, 0x20, 0x50);
if (i_this->field_0x624[0] == 0) {
mDoMtx_YrotS(*calc_mtx, cM_rndF(65536.0f));
offsetToNext.x = 0.0f;
offsetToNext.y = 0.0f;
offsetToNext.z = cM_rndF(150.0f) + 150.0f;
MtxPosition(&offsetToNext, &i_this->mNextPos);
i_this->mNextPos += i_this->actor.home.pos;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
f32 waterDepth = i_this->mSurfaceY - i_this->mGroundY;
if (waterDepth > 0.0f &&
waterDepth < 2000.0f) {
i_this->mNextPos.y = i_this->mSurfaceY;
i_this->mActionPhase = 3;
i_this->mMaxStep = 0;
}
}
break;
case 3:
target = 0.25f;
offsetToNext = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(offsetToNext.x, offsetToNext.z);
i_this->mMovementPitch = -cM_atan2s(offsetToNext.y,
JMAFastSqrt(offsetToNext.x * offsetToNext.x + offsetToNext.z * offsetToNext.z));
offsetToNext.y = 0.0f;
if (i_this->actor.current.pos.y >= i_this->mSurfaceY + i_this->mJointScale * -30.0f) {
if (offsetToNext.abs() < 100.0f) {
i_this->mActionPhase = 4;
i_this->field_0x624[0] = cM_rndF(50.0f) + 150.0f;
i_this->actor.speedF = 0.0f;
i_this->field_0x5e0 = i_this->actor.speed;
target = 0.0f;
} else {
break;
}
} else {
break;
}
case 4:
cLib_addCalc2(&i_this->actor.current.pos.x, i_this->mNextPos.x, 0.05f,
fabsf(i_this->field_0x5e0.x));
cLib_addCalc2(&i_this->actor.current.pos.y,
i_this->mSurfaceY + i_this->mJointScale * -10.0f, 0.05f,
fabsf(i_this->field_0x5e0.y));
cLib_addCalc2(&i_this->actor.current.pos.z, i_this->mNextPos.z, 0.05f,
fabsf(i_this->field_0x5e0.z));
cLib_addCalcAngleS2(&i_this->mMovementPitch, -0xA00, 0x20, 0x50);
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 5;
i_this->field_0x624[0] = cM_rndF(20.0f) + 50.0f;
}
break;
case 5:
target = -0.1f;
maxStep = 0.002f;
cLib_addCalcAngleS2(&i_this->mMovementPitch, -0xA00, 0x20, 0x50);
if (i_this->field_0x624[0] != 0) {
break;
}
i_this->mActionPhase = 0;
break;
}
cLib_addCalc2(&i_this->actor.speedF, target, 1.0f, maxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x300, 1, 0x10);
for (s32 i = 0; i < 3; i++) {
i_this->mJointRotations[i + 3].z =
cM_ssin(i_this->mBobTimer * 1300 + i * 16000) * 1300.0f;
}
}
struct JointOffsets {
f32 * const offsets[11];
};
static void dmcalc(mg_fish_class* i_this) {
static f32 joint_offset_LM[3] = { 20.0f, 20.0f, 20.0f };
static f32 joint_offset_BG[2] = { 20.0f, 20.0f };
static f32 joint_offset_NP[6] = {
31.0f / 2.0f, 31.0f / 2.0f, 31.0f / 2.0f,
10.0f, 10.0f, 15.0f,
};
static f32 joint_offset_KS[6] = {
31.0f / 2.0f, 31.0f / 2.0f, 10.0f,
5.0f, 10.0f, 15.0f,
};
static f32 joint_offset_CF[6] = {
15.0f, 15.0f, 15.0f,
15.0f, 15.0f, 15.0f,
};
static f32 joint_offset_RI[6] = {
33.0f / 2.0f, 22.0f, 22.0f,
10.0f, 15.0f, 15.0f,
};
static const JointOffsets jointOffsets = {{
joint_offset_LM, joint_offset_RI, joint_offset_NP,
joint_offset_CF, joint_offset_KS, joint_offset_BG,
joint_offset_LM, joint_offset_RI, joint_offset_NP,
joint_offset_CF, joint_offset_KS,
}};
s32 i;
s16 pitch;
s16 yaw;
s16 yawOffset;
f32 yawOffsetScalar1;
f32 yawOffsetScalar2;
f32 yawScalar1;
s16 yawScalar2;
cXyz* trans;
csXyz* rots;
f32 mult;
f32 x;
f32 y;
f32 z;
f32 zScalar1;
f32* jointOffset;
cXyz sp20;
cXyz sp14;
cXyz sp08;
i_this->mJointTranslations[0] = i_this->actor.current.pos;
trans = i_this->mJointTranslations + 1;
rots = i_this->mJointRotations + 1;
if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
zScalar1 = 1.0f;
} else {
zScalar1 = 1.5f;
}
if (i_this->mGedouKind >= GEDOU_KIND_BG) {
zScalar1 = 7.0f;
} else if (i_this->actor.speedF > 0.5f) {
zScalar1 = 3.0f;
} else if (i_this->mCurAction == ACTION_MG_FISH_MF_LURE_SEARCH ||
i_this->mCurAction == ACTION_MG_FISH_MF_BAIT_SEARCH) {
if (i_this->mGedouKind == GEDOU_KIND_CF_1) {
zScalar1 = 2.75f;
} else {
zScalar1 = 3.0f;
}
}
if (i_this->field_0x65d != 0) {
i_this->field_0x65d--;
zScalar1 = 30.0f;
}
mDoMtx_YrotS(*calc_mtx, i_this->actor.shape_angle.y);
mDoMtx_XrotM(*calc_mtx, i_this->actor.shape_angle.x);
mDoMtx_ZrotM(*calc_mtx, i_this->actor.shape_angle.z);
mDoMtx_YrotM(*calc_mtx, i_this->jointYaws2[0]);
sp20.x = 0.0f;
sp20.y = 0.0f;
sp20.z = -zScalar1 * i_this->mJointScale;
MtxPosition(&sp20, &sp08);
yawOffsetScalar1 = 1.0f;
yawOffsetScalar2 = 500.0f * i_this->field_0x5d4;
JointOffsets jointOffsets2 = jointOffsets;
jointOffset = jointOffsets2.offsets[i_this->mGedouKind];
yawScalar1 = 1.3f;
if (i_this->mNumJoints != 4 && i_this->mNumJoints < 6) {
yawScalar1 = 1.5f;
}
yawScalar2 = 11000;
if (i_this->mNumJoints == 4) {
yawScalar2 = 12000;
} else if (i_this->mNumJoints < 4) {
yawScalar2 = 14000;
}
mult = 1.0f;
i = 1;
while (i <= i_this->mNumJoints) {
if (i == 1) {
sp20.z = 0.0f;
} else {
sp20.z = i_this->mJointScale * jointOffset[i - 2];
}
x = trans[0].x - trans[-1].x + sp08.x * mult;
y = trans[0].y - trans[-1].y + sp08.y * mult;
z = trans[0].z - trans[-1].z + sp08.z * mult;
yaw = (s16)cM_atan2s(x, z);
pitch = -cM_atan2s(y, JMAFastSqrt(x * x + z * z));
yawOffset = cM_ssin(i_this->jointYaws2[1] + i * -yawScalar2) * yawOffsetScalar2 * yawOffsetScalar1;
yaw += yawOffset;
yawOffsetScalar1 *= yawScalar1;
cMtx_YrotS(*calc_mtx, yaw);
cMtx_XrotM(*calc_mtx, pitch);
MtxPosition(&sp20, &sp14);
trans[0].x = trans[-1].x + sp14.x;
trans[0].y = trans[-1].y + sp14.y;
trans[0].z = trans[-1].z + sp14.z;
rots[0].x = pitch;
rots[0].y = yaw;
i++;
trans++;
rots++;
}
}
static void mf_lure_search(mg_fish_class* i_this) {
s32 foundLure = false;
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (rod == NULL || rod->field_0x1008 != 0) {
foundLure = true;
} else if (rod->field_0x100a != 0 || rod->is_hook_in_water == 0) {
foundLure = true;
} else if (rod->action != 4) {
if (rod->action >= 5 &&
rod->mg_fish_id == fopAcM_GetID(i_this)) {
foundLure = false;
} else {
foundLure = true;
}
}
if (foundLure) {
i_this->mActionPhase = 100;
}
i_this->mMaxStep = 0x800;
f32 target = 0.0f;
f32 maxStep = 0.1f;
s16 sVar10 = 0;
cXyz rodSep;
switch (i_this->mActionPhase) {
case 0:
i_this->field_0x624[0] = 0;
i_this->mActionPhase++;
i_this->field_0x5f8 = 0;
case 1:
i_this->mActionPhase = 2;
case 2: {
rodSep = rod->actor.current.pos - i_this->actor.current.pos;
rodSep.y -= 10.0f;
i_this->mMovementYaw = cM_atan2s(rodSep.x, rodSep.z);
i_this->mMovementPitch = -cM_atan2s(rodSep.y, JMAFastSqrt(rodSep.x * rodSep.x + rodSep.z * rodSep.z));
if (i_this->mMovementPitch < -0x2000) {
i_this->mMovementPitch = -0x2000;
}
f32 rodDist = sqrtf(VECSquareMag(&rodSep));
if (rod->lure_type != MG_LURE_SP && rod->lure_type != MG_LURE_PO &&
rodDist > 2.0f * i_this->field_0x5ec) {
foundLure = true;
} else {
if (rodDist > 100.0f) {
target = 1.5f;
i_this->field_0x624[0] = cM_rndF(100.0f);
i_this->field_0x624[1] = cM_rndF(200.0f) + 100.0f;
if (i_this->mGedouKind == GEDOU_KIND_NP_1 || i_this->mGedouKind == GEDOU_KIND_LM_1) {
if (rod->reel_btn_flags != 0) {
target = 2.0f;
}
f32 fVar11;
if (i_this->mGedouKind == GEDOU_KIND_NP_1) {
fVar11 = 0.1f;
} else {
fVar11 = 0.025f;
}
if (rodDist < 1.3f * i_this->field_0x5ec &&
(rod->lure_type == MG_LURE_SP || rod->lure_type == MG_LURE_WS) &&
rod->reel_btn_flags != 0 &&
(i_this->mBobTimer & 0x1f) == 0 &&
cM_rndF(1.0f) < fVar11) {
sVar10 = 0x5a;
}
}
} else {
if (rodDist < 50.0f) {
target = -0.1f;
i_this->field_0x624[0] = cM_rndF(30.0f) + 10.0f;
} else {
if (i_this->field_0x624[0] == 0) {
if (rod->field_0x1009 != 0) {
i_this->field_0x624[0] = cM_rndF(30.0f) + 10.0f;
i_this->field_0x624[1] = cM_rndF(200.0f) + 100.0f;
}
} else if (i_this->field_0x624[0] == 1) {
f32 limit1 = 0.15f;
f32 limit2 = 0.3f;
i_this->field_0x5f8++;
if (i_this->mGedouKind == GEDOU_KIND_CF_1) {
limit1 *= 2.0f;
limit2 *= 2.0f;
} else if (i_this->mGedouKind == GEDOU_KIND_RI_1 &&
rod->lure_type != MG_LURE_FR &&
i_this->field_0x5f8 < 10) {
limit1 = limit2 = -1.0f;
}
dScnKy_env_light_c* envlight = dKy_getEnvlight();
s32 iVar6 = (s32)(envlight->daytime / 15.0f);
if (iVar6 < 8 || iVar6 > 16) {
limit1 *= 1.5f;
limit2 *= 1.5f;
}
if (envlight->raincnt > 10) {
limit1 *= 1.75f;
limit2 *= 1.75f;
}
if (l_HIO.field_0x18 != 0 || rod->field_0x10a4 != 0) {
limit1 = limit2 = 1.0f;
}
if ((rod->field_0x1009 != 0 && cM_rndF(1.0f) < limit2) ||
cM_rndF(1.0f) < limit1) {
sVar10 = 0x3c;
}
}
}
}
}
if (sVar10 != 0) {
i_this->mActionPhase = 3;
i_this->field_0x624[2] = sVar10;
}
cLib_addCalc2(&i_this->actor.current.pos.y, rod->actor.current.pos.y - 20.0f,
0.05f, 2.0f);
if (i_this->field_0x624[1] == 1) {
i_this->mActionPhase = 5;
i_this->field_0x624[0] = cM_rndF(20.0f) + 10.0f;
if (i_this->field_0x624[2] == 0) {
break;
}
}
break;
}
case 3: {
if (i_this->field_0x624[2] == 0) {
foundLure = true;
break;
}
rodSep = rod->actor.current.pos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(rodSep.x, rodSep.z);
i_this->mMovementPitch = -cM_atan2s(rodSep.y, JMAFastSqrt(rodSep.x * rodSep.x + rodSep.z * rodSep.z));
target = 3.0f;
if (rod->reel_btn_flags != 0) {
target = 5.0f;
}
maxStep = 1.0f;
f32 rodDist = sqrtf(VECSquareMag(&rodSep));
if (rodDist < i_this->mJointScale * 150.0f) {
mouth_open(i_this);
}
if (rodDist < i_this->mJointScale * 40.0f) {
if (i_this->mGedouKind == GEDOU_KIND_CF_1) {
if (rod->lure_type == MG_LURE_SP) {
i_this->mRemainingHookTime = cM_rndF(10.0f) + 20.0f;
} else {
i_this->mRemainingHookTime = cM_rndF(12.0f) + 30.0f;
}
} else if (rod->lure_type == MG_LURE_SP) {
if (i_this->mJointScale >= 0.6f) {
if (sVar10 != 0) {
i_this->mActionPhase = 3;
i_this->field_0x624[2] = sVar10;
}
i_this->mRemainingHookTime = cM_rndF(5.0f) + 10.0f;
} else if (i_this->mJointScale >= 0.5f) {
i_this->mRemainingHookTime = cM_rndF(7.0f) + 15.0f;
} else {
i_this->mRemainingHookTime = cM_rndF(10.0f) + 20.0f;
}
} else if (i_this->mJointScale >= 0.6f) {
i_this->mRemainingHookTime = cM_rndF(10.0f) + 15.0f;
} else {
i_this->mRemainingHookTime = cM_rndF(10.0f) + 25.0f;
}
} else {
break;
}
if (rod->lure_type == MG_LURE_FR) {
i_this->mRemainingHookTime = cM_rndF(10.0f) + 40.0f;
}
rod->action = 5;
rod->field_0x10a5 = 2;
rod->mg_fish_id = fopAcM_GetID(i_this);
rod->field_0x1006 = cM_rndFX(7000.0f) + 1000.0f;
i_this->mHookedState = 1;
i_this->mMovementYaw = cM_rndFX(65536.0f);
i_this->mMovementPitch = 0x2000;
i_this->mMaxStep = 0x1000;
i_this->mActionPhase = 4;
mouth_close(i_this);
if (rod->actor.current.pos.y > i_this->mSurfaceY - 15.0f) {
sibuki_set(i_this, 2.5f, i_this->field_0x638);
if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
i_this->mSound.startCreatureSound(Z2SE_AL_DOJOU_EAT_IMPACT, 0, -1);
} else {
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_RELEASE, 0, -1);
}
}
rod->camera_morf_rate = 0.0f;
dKy_Sound_set(i_this->actor.current.pos, 40.0f * i_this->mJointScale,
fopAcM_GetID(i_this), 5);
rod->vib_timer = 5;
rod->vibmode = VIBMODE_S_POWER3;
break;
}
case 4: {
rod->field_0x10a5 = 2;
target = 2.5f;
maxStep = 0.5f;
i_this->mHookedState = 2;
if (i_this->mRemainingHookTime == 0) {
if (rod->lure_type != MG_LURE_SP) {
rod->field_0x10a6 = 30;
if (rod->field_0x10a7 != 4) {
rod->field_0x10a7 = 1;
}
}
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
return;
}
break;
}
case 5: {
target = -0.15f;
maxStep = 0.01f;
if (i_this->field_0x624[0] == 0) {
foundLure = true;
}
break;
}
case 0x64: // ???
default:
break;
}
cLib_addCalc2(&i_this->actor.speedF, target, 1.0f, maxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
if (foundLure) {
i_this->mCurAction = ACTION_MG_FISH_MF_STAY;
i_this->mActionPhase = 0;
i_this->field_0x624[0] = 0;
i_this->field_0x62e = cM_rndF(1000.0f) + 2000.0f;
mouth_close(i_this);
}
}
static void mf_bait_search(mg_fish_class* i_this) {
s32 foundBait = false;
fr_class* rod = (fr_class*)fopAcM_SearchByID(i_this->mBaitId);
if (rod == NULL) {
i_this->mActionPhase = 100;
foundBait = true;
}
i_this->mMaxStep = 0x800;
f32 targetSpeed = 0.0f;
f32 speedMaxStep = 0.1f;
cXyz offsetToRod;
switch (i_this->mActionPhase) {
case 0: {
i_this->field_0x624[0] = 0;
i_this->mActionPhase++;
}
case 1: {
i_this->mActionPhase = 2;
}
case 2: {
offsetToRod = rod->current.pos - i_this->actor.current.pos;
offsetToRod.y = offsetToRod.y - 10.0f;
i_this->mMovementYaw = cM_atan2s(offsetToRod.x, offsetToRod.z);
i_this->mMovementPitch = -cM_atan2s(offsetToRod.y,
JMAFastSqrt(offsetToRod.x * offsetToRod.x + offsetToRod.z * offsetToRod.z));
if (i_this->mMovementPitch < -0x2000) {
i_this->mMovementPitch = -0x2000;
}
f32 fVar5 = offsetToRod.abs();
if (fVar5 > 2.0f * i_this->field_0x5ec) {
foundBait = true;
} else if (fVar5 > 100.0f) {
targetSpeed = 0.7f;
speedMaxStep = 0.05f;
i_this->field_0x624[0] = cM_rndF(100.0f);
} else if (fVar5 < 50.0f) {
targetSpeed = -0.1f;
} else if (i_this->field_0x624[0] == 0) {
i_this->field_0x624[0] = cM_rndF(30.0f) + 10.0f;
} else if (i_this->field_0x624[0] == 1 && cM_rndF(1.0f) < 0.5f) {
i_this->mActionPhase = 3;
i_this->field_0x624[3] = 7;
i_this->field_0x624[2] = 0x3c;
}
cLib_addCalc2(&i_this->actor.current.pos.y, rod->current.pos.y - 20.0f,
0.05f, 2.0f);
break;
}
case 3: {
if (i_this->field_0x624[2] == 0) {
foundBait = 1;
break;
}
offsetToRod = rod->current.pos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(offsetToRod.x, offsetToRod.z);
i_this->mMovementPitch = -cM_atan2s(offsetToRod.y,
JMAFastSqrt(offsetToRod.x * offsetToRod.x + offsetToRod.z * offsetToRod.z));
targetSpeed = 3.0f;
speedMaxStep = 1.0f;
f32 fVar10 = offsetToRod.abs();
if (fVar10 < 40.0f * i_this->mJointScale) {
rod->field_0x5d2 = 0x32;
rod->field_0x5d4 = 0;
rod->field_0x5f8 = fopAcM_GetID(i_this);
fVar10 = cM_rndFX(65536.0f);
i_this->mMovementYaw = fVar10;
i_this->mMovementPitch = 0x2000;
i_this->mMaxStep = 0x1000;
i_this->mActionPhase = 4;
mouth_close(i_this);
sibuki_set(i_this, 2.5f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_CM_BODYFALL_WATER_S, 0, -1);
dKy_Sound_set(i_this->actor.current.pos, 40.0f * i_this->mJointScale,
fopAcM_GetID(i_this), 5);
i_this->field_0x624[0] = cM_rndF(10.0f) + 10.0f;
}
break;
}
case 4: {
targetSpeed = 1.5f;
speedMaxStep = 0.2f;
if (i_this->field_0x624[0] == 0) {
foundBait = true;
}
}
}
cLib_addCalc2(&i_this->actor.speedF, targetSpeed, 1.0f, speedMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y,
i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x,
i_this->mMovementPitch, 2, i_this->mMaxStep);
if (foundBait) {
i_this->mCurAction = ACTION_MG_FISH_MF_STAY;
i_this->mActionPhase = 0;
i_this->field_0x624[0] = 0;
targetSpeed = cM_rndF(100.0f);
i_this->field_0x62e = targetSpeed + 300.0f;
mouth_close(i_this);
}
}
static void mf_hit(mg_fish_class* i_this) {
dmg_rod_class* pvVar5 = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (pvVar5 == NULL) {
i_this->mCurAction = ACTION_MG_FISH_MF_STAY;
i_this->mActionPhase = 0;
i_this->field_0x62e = cM_rndF(1000.0f) + 2000.0f;
return;
}
i_this->mHookedState = 2;
pvVar5->field_0x10a5 = 2;
s32 iVar1 = 0;
s32 didCatch = false;
cXyz commonXyz;
switch (i_this->mActionPhase) {
case 0: {
i_this->field_0x624[1] = cM_rndF(100.0f) + 100.0f;
i_this->mActionPhase = 1;
i_this->field_0x65b = 0;
}
case 1: {
cMtx_YrotS(*calc_mtx, i_this->mYawToPlayer + 0x8000 + (s16)cM_rndFX(10000.0f));
commonXyz.x = 0.0f;
commonXyz.y = 0.0f;
commonXyz.z = cM_rndF(150.0f) + 200.0f;
MtxPosition(&commonXyz, &i_this->mNextPos);
i_this->mNextPos += i_this->actor.current.pos;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
if (i_this->mSurfaceY - i_this->mGroundY > 0.0f && i_this->mSurfaceY - i_this->mGroundY < 2000.0f) {
if (i_this->mGedouKind == GEDOU_KIND_CF_1 || i_this->mGedouKind == GEDOU_KIND_RI_1) {
i_this->mNextPos.y = i_this->mGroundY +
(i_this->mSurfaceY - i_this->mGroundY) *
(cM_rndF(0.2f) + 0.1f);
} else {
i_this->mNextPos.y = i_this->mGroundY +
(i_this->mSurfaceY - i_this->mGroundY) *
(cM_rndF(0.8f) + 0.1f);
}
i_this->field_0x624[0] = cM_rndF(40.0f) + 10.0f;
dKy_Sound_set(i_this->actor.current.pos, 30.0f * i_this->mJointScale,
fopAcM_GetID(i_this), 5);
i_this->mActionPhase = 2;
if (i_this->field_0x624[1] == 0 &&
i_this->mDistToPlayer > 400.0f &&
i_this->field_0x660 > 0.6f)
{
f32 threshold = -1.0f;
if (i_this->mGedouKind == GEDOU_KIND_LM_1) {
if (i_this->mJointScale >= 0.6f) {
threshold = 0.5f;
} else {
threshold = 0.25f;
}
} else if (i_this->mGedouKind == GEDOU_KIND_NP_1 || i_this->mGedouKind == GEDOU_KIND_KS_1) {
threshold = 0.35f;
} else if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
threshold = 0.1f;
}
if (cM_rndF(1.0f) < threshold) {
i_this->mCurAction = ACTION_MG_FISH_MF_JUMP;
i_this->mActionPhase = 0;
mouth_open(i_this);
}
}
} else {
break;
}
}
case 2: {
commonXyz = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(commonXyz.x, commonXyz.z);
i_this->mMovementPitch = -cM_atan2s(commonXyz.y,
JMAFastSqrt(commonXyz.x * commonXyz.x + commonXyz.z * commonXyz.z));
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 1;
}
if (cM_ssin(i_this->jointYaws2[1]) > 0.8f) {
hit_vib_set(i_this);
}
break;
}
}
cLib_addCalc2(&i_this->actor.speedF, 1.5f, 1.0f, 0.5f);
i_this->mMaxStep = 0x800;
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
if (l_HIO.field_0x19 != 0) {
didCatch = true;
}
if (i_this->mDistToPlayer < 200.0f &&
i_this->actor.current.pos.y > i_this->mSurfaceY - 50.0f * i_this->mJointScale)
{
if ((mDoCPd_c::m_cpadInfo[0].mPressedButtonFlags & 0x100) != 0) {
i_this->field_0x624[4] = 60;
}
if (i_this->field_0x624[4] == 0) {
if (i_this->mKind2 == 3) {
i_this->field_0x624[4] = cM_rndF(20.0f) + 50.0f;
i_this->field_0x624[2] = cM_rndF(15.0f) + 15.0f;
} else {
f32 jointScale = i_this->mJointScale;
if (i_this->mKind2 == 2) {
jointScale -= 0.15f;
}
if (jointScale < 0.5f) {
i_this->field_0x624[4] = cM_rndF(20.0f) + 50.0f;
i_this->field_0x624[2] = cM_rndF(15.0f) + 15.0f;
} else if (jointScale < 0.55f) {
i_this->field_0x624[4] = cM_rndF(30.0f) + 40.0f;
i_this->field_0x624[2] = cM_rndF(15.0f) + 13.0f;
} else if (jointScale < 0.6f) {
i_this->field_0x624[4] = cM_rndF(40.0f) + 30.0f;
i_this->field_0x624[2] = cM_rndF(10.0f) + 12.0f;
} else if (jointScale < 0.65f) {
i_this->field_0x624[4] = cM_rndF(45.0f) + 30.0f;
i_this->field_0x624[2] = cM_rndF(9.0f) + 11.0f;
} else if (jointScale < 0.65f) {
i_this->field_0x624[4] = cM_rndF(50.0f) + 30.0f;
i_this->field_0x624[2] = cM_rndF(8.0f) + 10.0f;
} else if (jointScale < 0.7f) {
i_this->field_0x624[4] = cM_rndF(50.0f) + 40.0f;
i_this->field_0x624[2] = cM_rndF(7.0f) + 9.0f;
} else {
i_this->field_0x624[4] = cM_rndF(50.0f) + 50.0f;
i_this->field_0x624[2] = cM_rndF(6.0f) + 8.0f;
}
}
}
i_this->field_0x65b++;
if (i_this->field_0x65b == 200) {
iVar1 = 2;
pvVar5->field_0xf5c = 0.5f;
} else if (i_this->field_0x624[2] != 0) {
pvVar5->field_0x100f = 1;
if ((mDoCPd_c::m_cpadInfo[0].mPressedButtonFlags & 0x100) != 0) {
didCatch = true;
}
}
} else {
if (pvVar5->reel_btn_flags == 0 ||
pvVar5->field_0x1515 == 0 ||
pvVar5->field_0xf60 < 100.0f)
{
i_this->field_0x65c++;
} else {
i_this->field_0x65c = 0;
}
if (i_this->field_0x65c == 90) {
iVar1 = 1;
}
}
if (didCatch) {
i_this->mCurAction = ACTION_MG_FISH_MF_CATCH;
i_this->mActionPhase = 0;
g_dComIfG_gameInfo.play.mVibration.StartShock(4, 1, cXyz(0.0f, 1.0f, 0.0f));
Z2GetAudioMgr()->changeBgmStatus(4);
pvVar5->action = 6;
pvVar5->play_cam_mode = 10;
pvVar5->play_cam_timer = 0;
pvVar5->field_0x14c2 = 0;
pvVar5->play_cam_fovy = 90.0f;
pvVar5->msg_flow_state = 0;
pvVar5->field_0x10b0 = 0;
daPy_py_c* player = daPy_getLinkPlayerActorClass();
player->onFishingRodGetFish();
if (pvVar5->lure_type == MG_LURE_SP) {
u8 bVar7 = dComIfGs_getEventReg(0xf11f);
if (bVar7 < 0x1f) {
bVar7++;
}
dComIfGs_setEventReg(0xf11f, bVar7);
}
} else if (iVar1 != 0) {
if (iVar1 == 2) {
pvVar5->field_0x10a7 = 3;
pvVar5->timers[2] = cM_rndF(13.0f) + 30.0f;
pvVar5->field_0x10a6 = 1;
} else {
pvVar5->field_0x10a7 = 2;
pvVar5->field_0x10a6 = 0x19;
pvVar5->timers[2] = 0;
}
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
i_this->mHookedState = 0;
i_this->field_0x62e = cM_rndF(1500.0f) + 4000.0f;
}
}
static void mf_jump(mg_fish_class* i_this) {
cXyz commonXyz1;
cXyz commonXyz2;
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (i_this->mActionPhase < 10) {
if (rod == NULL) {
i_this->mCurAction = ACTION_MG_FISH_MF_STAY;
i_this->mActionPhase = 0;
return;
}
if (i_this->field_0x65a == 0) {
i_this->mHookedState = 2;
rod->field_0x10a5 = 2;
i_this->field_0x62e = cM_rndF(1500.0f) + 4000.0f;
}
}
i_this->mMaxStep = 0x800;
switch (i_this->mActionPhase) {
case 0: {
i_this->mMovementPitch = (s16)cM_rndFX(2000.0f) + -0x2800;
i_this->mMovementYaw = i_this->mYawToPlayer + 0x8000 + (s16)cM_rndFX(16384.0f);
i_this->mActionPhase = 1;
}
case 1: {
i_this->actor.speedF = 1.5f;
if (cM_ssin(i_this->mBobTimer * 7000) > 0.8f) {
hit_vib_set(i_this);
}
if (i_this->actor.current.pos.y > i_this->mSurfaceY) {
i_this->actor.speedF = 0.0f;
i_this->field_0x5e0 = i_this->actor.speed;
i_this->field_0x5e0.y = 15.0f;
i_this->jointYaws2[2] = cM_rndFX(1000.0f);
i_this->jointYaws2[3] = cM_rndF(384.0f);
i_this->mActionPhase = 2;
i_this->field_0x624[0] = cM_rndF(10.0f) + 23.0f;
sibuki_set(i_this, 2.0f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_JUMP_UP, 0, -1);
} else {
break;
}
}
case 2: {
rod->field_0x100f = 2;
if (i_this->field_0x65a == 0 && (i_this->mBobTimer & 0xf) == 0) {
hit_vib_set(i_this);
}
i_this->actor.current.angle.z = i_this->actor.current.angle.z + i_this->jointYaws2[2];
i_this->actor.shape_angle.z = i_this->actor.current.angle.z;
i_this->mMovementPitch = i_this->mMovementPitch + i_this->jointYaws2[3];
if (i_this->field_0x624[0] == 1 && rod->rod_stick_y <= -0.5f && cM_rndF(1.0f) < 0.35f) {
i_this->field_0x65a = 1;
i_this->mHookedState = 0;
}
i_this->actor.current.pos += i_this->field_0x5e0;
for (s32 i = 0; i <= i_this->mNumJoints; i++) {
i_this->mJointTranslations[i] += i_this->field_0x5e0;
}
i_this->field_0x5e0.y = i_this->field_0x5e0.y - 1.0f;
if (i_this->field_0x65a != 0) {
rod->field_0x10a6 = 0x19;
rod->field_0x10a7 = 0;
}
if (i_this->field_0x5e0.y < 0.0f && i_this->actor.current.pos.y < i_this->mSurfaceY) {
if (i_this->field_0x65a != 0) {
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
} else {
i_this->mCurAction = ACTION_MG_FISH_MF_HIT;
i_this->mActionPhase = 1;
}
i_this->field_0x624[1] = 30;
sibuki_set(i_this, 2.5f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_JUMP_DOWN, 0, -1);
i_this->actor.speedF = 0.5f;
i_this->mMovementPitch = 0;
i_this->actor.current.angle.z = 0;
i_this->field_0x65d = 5;
mouth_close(i_this);
}
break;
}
case 10: {
if (i_this->mGedouKind == GEDOU_KIND_KS_2) {
i_this->mBaitId = fopAcM_createChild(PROC_KYTAG03, fopAcM_GetID(i_this), 0x10000b3,
&commonXyz2, fopAcM_GetRoomNo(&i_this->actor), NULL, NULL, -1, 0);
}
i_this->mActionPhase = 0xb;
}
case 11: {
daPy_py_c::setLookPos(&i_this->actor.current.pos);
if (i_this->mGedouKind == GEDOU_KIND_KS_2) {
fopAc_ac_c* actor = fopAcM_SearchByID(i_this->mBaitId);
if (actor != NULL) {
actor->current.pos = i_this->actor.current.pos;
}
}
i_this->field_0x659 = 0;
i_this->mHookedState = 0;
if (rod != NULL) {
rod->field_0x10a5 = 0;
}
i_this->mMaxStep = 0x600;
i_this->actor.current.pos += i_this->field_0x5e0;
i_this->field_0x5e0.y = i_this->field_0x5e0.y - 2.0f;
if (i_this->mAcch.ChkGroundHit()) {
i_this->actor.current.pos.x = i_this->actor.old.pos.x;
i_this->actor.current.pos.y = i_this->actor.old.pos.y;
i_this->actor.current.pos.z = i_this->actor.old.pos.z;
mDoMtx_YrotS(*calc_mtx, i_this->field_0x5f6);
if (i_this->field_0x624[2] == 0) {
commonXyz1.x = cM_rndFX(3.0f);
commonXyz1.z = cM_rndFX(2.0f) + 6.0f;
} else {
commonXyz1.x = cM_rndFX(3.0f);
commonXyz1.z = cM_rndFX(3.0f);
}
commonXyz1.y = cM_rndF(5.0f) + 10.0f;
MtxPosition(&commonXyz1, &i_this->field_0x5e0);
if (i_this->actor.shape_angle.z < 0) {
i_this->actor.shape_angle.z = -0x4000;
} else {
i_this->actor.shape_angle.z = 0x4000;
}
if (cM_rndF(1.0f) < 0.5f) {
i_this->actor.current.angle.z = 0x4000;
} else {
i_this->actor.current.angle.z = -0x4000;
}
i_this->mMovementYaw = i_this->mMovementYaw + (s16)cM_rndFX(13000.0f);
fopAcM_effSmokeSet1(&i_this->field_0xc34, &i_this->field_0xc38, &i_this->actor.current.pos,
NULL, 0.6f * i_this->mJointScale, &i_this->actor.tevStr, 1);
Z2GetAudioMgr()->seStart(Z2SE_OBJ_NIOIMASU_BOUND, &i_this->actor.current.pos,
0x14, 0,1.0f, 1.0f,
-1.0f, -1.0f, 0);
}
cLib_addCalcAngleS2(&i_this->actor.shape_angle.z, i_this->actor.current.angle.z, 2, 0xb00);
if (i_this->field_0x5e0.y < 0.0f && i_this->actor.current.pos.y < i_this->mSurfaceY) {
sibuki_set(i_this, 2.0f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_JUMP_DOWN, 0, -1);
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
i_this->actor.current.angle.z = 0;
if (i_this->mGedouKind == GEDOU_KIND_KS_2) {
fopAc_ac_c* actor = fopAcM_SearchByID(i_this->mBaitId);
if (actor != NULL) {
fopAcM_delete(actor);
}
}
mDoMtx_YrotS(*calc_mtx, i_this->mYawToPlayer);
commonXyz1.x = 0.0f;
commonXyz1.y = 0.0f;
commonXyz1.z = 100.0f;
MtxPosition(&commonXyz1, &commonXyz2);
commonXyz2.x += i_this->actor.current.pos.x;
commonXyz2.z += i_this->actor.current.pos.z;
commonXyz2.y = 10.0f + i_this->mSurfaceY;
fopAcM_createItem(&commonXyz2, 0, -1, -1, NULL, NULL, 0);
dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[0x1d6]);
}
break;
}
}
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
s16 sVar1 = 7000;
if (i_this->mJointScale >= 0.7f) {
sVar1 = 5000;
} else if (i_this->mJointScale >= 0.6f) {
sVar1 = 6000;
} else if (i_this->mJointScale >= 0.5f) {
sVar1 = 6500;
}
s32 numJoints;
for (s32 i = 0; i <= i_this->mNumJoints; i++) {
numJoints = i_this->mNumJoints;
if (numJoints <= 4) {
i_this->jointYaws1[i] =
cM_ssin(i_this->mBobTimer * sVar1 + -8500 * i) * 7000.0f;
} else {
i_this->jointYaws1[i] =
cM_ssin(i_this->mBobTimer * (sVar1 - 500) + -7000 * i) * 4000.0f;
}
}
}
static void pota_set(mg_fish_class* i_this) {
static u16 b_id[3] = {
0x873A,
0x873B,
0x873C,
};
static u16 h_id[11] = {
0x8738,
0x8739,
0x8739,
0x8737,
0x8739,
0x8736,
0x8738,
0x8739,
0x8739,
0x8737,
0x8739,
};
static u32 h_jnt[11] = {
2,
2,
2,
2,
2,
1,
2,
2,
2,
2,
2,
};
if (i_this->mCaughtType == 1) {
for (s32 i = 0; i < 3; i++) {
u32 uVar2 = dComIfGp_particle_set(i_this->mEmitterIds[i],
b_id[i], &i_this->actor.current.pos, NULL, NULL);
i_this->mEmitterIds[i] = uVar2;
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(i_this->mEmitterIds[i]);
if (emitter != NULL) {
mg_fish_class* found = (mg_fish_class*)fpcEx_Search(s_bt_sub, i_this);
if (found != NULL) {
emitter->setGlobalSRTMatrix(found->mpModel[0]->getBaseTRMtx());
}
}
}
} else {
u32 uVar2 = dComIfGp_particle_set(i_this->mEmitterIds[0],
h_id[i_this->mGedouKind], &i_this->actor.current.pos, NULL, NULL);
i_this->mEmitterIds[0] = uVar2;
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(i_this->mEmitterIds[0]);
if (emitter != NULL) {
emitter->setGlobalSRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(h_jnt[i_this->mGedouKind]));
}
}
}
static void mf_catch(mg_fish_class* i_this) {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
if (i_this->actor.health == 2) {
fopAcM_delete(&i_this->actor);
return;
}
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
rod->field_0x10a5 = 0;
i_this->mHookedState = 2;
i_this->actor.speed.set(0.0f, 0.0f, 0.0f);
i_this->actor.speedF = 0.0f;
switch (i_this->mActionPhase) {
case 0: {
i_this->mActionPhase = 1;
mouth_open(i_this);
i_this->field_0x624[0] = 100;
i_this->field_0x740 = 0.0f;
i_this->actor.health = 0;
}
case 1: {
if (i_this->field_0x624[0] == 70) {
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_CATCH, 0, -1);
i_this->field_0x624[1] = 50;
sibuki_set(i_this, 1.5f, i_this->field_0x638);
}
if (i_this->field_0x624[0] == 80) {
i_this->field_0x740 = cM_rndF(2000.0f) + 4000.0f;
}
if (i_this->field_0x624[0] == 0 && i_this->actor.health == 1) {
i_this->actor.health = 0;
i_this->mActionPhase = 2;
i_this->field_0x624[0] = 1;
}
i_this->actor.current.angle.x = -0x4000;
break;
}
case 2: {
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 3;
i_this->field_0x624[0] = 40;
player->onFishingRelease();
rod->actor.health = 1;
rod->play_cam_mode = 11;
rod->play_cam_timer = 0;
rod->msg_flow_state = 0;
i_this->field_0x740 = cM_rndF(1000.0f) + 3000.0f;
}
break;
}
case 3: {
i_this->mHookedState = 0;
if (i_this->field_0x624[0] <= 25) {
cXyz local_24 = i_this->actor.current.pos;
local_24.y = i_this->mSurfaceY;
fopAcM_effHamonSet(&i_this->field_0xc20, &local_24,
0.5f, 0.1f);
}
if (i_this->field_0x624[0] <= 15) {
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, 0, 8, 0x800);
}
if (i_this->field_0x624[0] == 0) {
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
mouth_close(i_this);
sibuki_set(i_this, 1.3f, i_this->field_0x638);
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_RELEASE, 0, -1);
i_this->field_0x624[1] = 0;
i_this->field_0x65d = 5;
i_this->field_0x62e = cM_rndF(1500.0f) + 4000.0f;
}
break;
}
default:
break;
}
i_this->actor.current.angle.y = 26000 +
(s16)(daPy_getLinkPlayerActorClass()->shape_angle.y +
daPy_getLinkPlayerActorClass()->mBodyAngle.y);
int iVar1 = i_this->field_0x740 * cM_ssin(i_this->mBobTimer * 2000);
cLib_addCalc2(&i_this->field_0x740,
200.0f, 0.05f, 100.0f);
for (s32 i = 0; i <= i_this->mNumJoints; i++) {
if (i == 0) {
i_this->jointYaws1[i] = 0;
} else {
i_this->jointYaws1[i] = iVar1;
}
}
if (i_this->field_0x624[1] != 0) {
pota_set(i_this);
}
}
static void mf_esa_search(mg_fish_class* i_this) {
s32 flag1 = 0;
s32 flag2 = 0;
fopAc_ac_c* rod_actor = (fopAc_ac_c*)fopAcM_SearchByID(i_this->mRodId);
dmg_rod_class* rod = (dmg_rod_class*)rod_actor;
if (rod_actor == NULL) {
flag1 = 1;
} else if (rod->is_hook_in_water == 0) {
flag1 = 1;
} else if (rod->action == 5) {
flag1 = 1;
}
if (flag1) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
i_this->mActionPhase = 0;
i_this->field_0x62e = cM_rndF(100.0f) + 300.0f;
mouth_close(i_this);
i_this->field_0x659 = 0;
return;
}
i_this->mMaxStep = 0x800;
f32 fVar9 = 0.0f;
switch (i_this->mActionPhase) {
case 0: {
i_this->field_0x624[0] = 0;
i_this->mActionPhase++;
}
case 1: {
i_this->mActionPhase = 2;
}
case 2: {
cXyz xyz = rod->actor.current.pos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(xyz.x, xyz.z);
i_this->mMovementPitch = -cM_atan2s(xyz.y,
JMAFastSqrt(xyz.x * xyz.x + xyz.z * xyz.z));
f32 distFromRod = sqrtf(VECSquareMag(&xyz));
if (distFromRod > i_this->field_0x5ec + 100.0f) {
flag2 = 1;
} else if (distFromRod > i_this->mJointScale * 80.0f) {
fVar9 = 1.5f;
} else {
if (distFromRod < i_this->mJointScale * 50.0f) {
fVar9 = -0.002f - (i_this->mJointScale * 50.0f - distFromRod) * 0.1f;
if (fVar9 < -0.2f) {
fVar9 = -0.2f;
}
} else if (i_this->field_0x5ec > 10000.0f ||
((i_this->mBobTimer & 0x3f) == 0 && cM_rndF(1.0f) > 0.5f)) {
i_this->actor.speedF = 1.0f;
fVar9 = i_this->actor.speedF;
i_this->field_0x624[0] = 0;
i_this->field_0x654 = -(cM_rndF(0.5f) + 0.2f);
}
}
xyz = i_this->field_0x638 - rod->actor.current.pos;
if (sqrtf(VECSquareMag(&xyz)) < i_this->mJointScale * 14.0f) {
fVar9 = i_this->field_0x654;
i_this->mMaxStep = 0;
if (i_this->field_0x624[0] == 0) {
rod->mg_fish_id = fopAcM_GetID(i_this);
f32 fVar10 = 0.5f;
if (dComIfGs_getFishNum(5) <= 5) {
fVar10 = 1.5f;
}
if (i_this->mGedouKind != GEDOU_KIND_BG) {
if (rod->hook_kind == 1) {
fVar10 = 1.0f;
}
if (rod->esa_kind == 1) {
fVar10 *= 1.5f;
} else if (rod->esa_kind == 2) {
fVar10 *= 2.0f;
}
}
if (fVar10 > 2.5f) {
fVar10 = 2.5f;
}
if (cM_rndF(1.0f) < fVar10 * 0.35f ||
i_this->field_0x5ec > 10000.0f) {
i_this->mActionPhase = 3;
i_this->mMovementPitch = i_this->mMovementPitch + 0x2000;
ANGLE_ADD(i_this->mMovementYaw, cM_rndFX(32768.0f));
rod->field_0x10a5 = fVar10 * (cM_rndF(20.0f) + 15.0f);
i_this->field_0x659 = rod->field_0x10a5;
} else {
rod->field_0x10a5 = fVar10 * (cM_rndF(15.0f) + 15.0f);
i_this->field_0x659 = rod->field_0x10a5;
i_this->field_0x650 = 0.0f;
if (rod->hook_kind == 0 && rod->esa_kind == 0) {
i_this->field_0x624[0] = cM_rndF(80.0f) + 50.0f;
} else {
i_this->field_0x624[0] = cM_rndF(20.0f) + 30.0f;
}
}
}
}
if (i_this->field_0x659 == 0) {
cLib_addCalc2(&i_this->actor.current.pos.y, rod->actor.current.pos.y, 0.05f, 2.0f);
} else {
cLib_addCalc2(&i_this->actor.current.pos.y, rod->actor.current.pos.y - 20.0f, 0.05f, 2.0f);
}
break;
}
case 3: {
fVar9 = 1.5f;
i_this->mMaxStep = 0x1000;
cLib_addCalc2(&rod->field_0x1090, 0.5f, 1.0f, 0.2f);
if (i_this->field_0x659 == 0) {
flag2 = 1;
}
break;
}
}
cLib_addCalc2(&i_this->actor.speedF, fVar9, 1.0f, 0.1f);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
if (i_this->field_0x5ec > 10000.0f) {
cLib_addCalc2(&i_this->actor.current.pos.x, rod->actor.current.pos.x, 0.1f, 50.0f);
cLib_addCalc2(&i_this->actor.current.pos.z, rod->actor.current.pos.z, 0.1f, 50.0f);
}
if (flag2) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
i_this->mActionPhase = 0;
i_this->field_0x62e = cM_rndF(30.0f) + 30.0f;
mouth_close(i_this);
}
}
static void mf_esa_hit(mg_fish_class* i_this) {
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (rod == NULL || (rod != NULL && rod->action != 5)) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
i_this->mActionPhase = 0;
i_this->field_0x62e = cM_rndF(100.0f) + 100.0f;
return;
}
i_this->field_0x659 = 2;
rod->field_0x10a5 = 2;
i_this->field_0x62e = 500;
cXyz commonXyz;
switch (i_this->mActionPhase) {
case 0:
i_this->mActionPhase = 1;
case 1:
mDoMtx_YrotS(*calc_mtx, i_this->mYawToPlayer + 0x8000 + (s16)cM_rndFX(10000.0f));
commonXyz.x = 0.0f;
commonXyz.y = 0.0f;
commonXyz.z = cM_rndF(150.0f) + 200.0f;
MtxPosition(&commonXyz, &i_this->mNextPos);
i_this->mNextPos += i_this->actor.current.pos;
i_this->mGroundY = get_ground_y(i_this, &i_this->mNextPos);
if (i_this->mSurfaceY - i_this->mGroundY > 300.0f) {
i_this->mGroundY = i_this->mSurfaceY - 300.0f;
}
if (i_this->mSurfaceY - i_this->mGroundY > 0.0f &&
i_this->mSurfaceY - i_this->mGroundY < 2000.0f) {
i_this->mNextPos.y = i_this->mGroundY + (i_this->mSurfaceY - i_this->mGroundY) *
(cM_rndF(0.2f) + 0.1f);
i_this->field_0x624[0] = cM_rndF(40.0f) + 10.0f;
dKy_Sound_set(i_this->actor.current.pos, (s32)(30.0f * i_this->mJointScale),
fopAcM_GetID(i_this), 5);
i_this->mActionPhase = 2;
} else {
break;
}
case 2:
commonXyz = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(commonXyz.x, commonXyz.z);
i_this->mMovementPitch =
-cM_atan2s(commonXyz.y,
JMAFastSqrt(commonXyz.x * commonXyz.x + commonXyz.z * commonXyz.z));
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 1;
}
if (cM_ssin(i_this->jointYaws2[1]) > 0.8f)
{
hit_vib_set(i_this);
}
}
cLib_addCalc2(&i_this->actor.speedF, 1.5f, 1.0f,
0.5f);
i_this->mMaxStep = 0x800;
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 2, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 2, i_this->mMaxStep);
}
static s32 mf_esa_catch(mg_fish_class* i_this) {
fopAc_ac_c* player = dComIfGp_getPlayer(0);
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (rod == NULL) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
i_this->mActionPhase = 0;
i_this->field_0x62e = cM_rndF(100.0f) + 100.0f;
return 1;
}
cXyz position;
s32 flag = 1;
i_this->field_0x659 = 2;
rod->field_0x10a5 = 2;
switch (i_this->mActionPhase) {
case 0: {
if (i_this->mCaughtType == 4 || i_this->mCaughtType == 5) {
i_this->field_0x740 = 3000.0f;
} else {
if (i_this->mGedouKind == GEDOU_KIND_BG) {
i_this->field_0x740 = cM_rndF(1000.0f) + 8000.0f;
} else if (i_this->mGedouKind == GEDOU_KIND_CF_2) {
i_this->field_0x740 = cM_rndF(500.0f) + 4000.0f;
} else if (i_this->mGedouKind == GEDOU_KIND_NP_2) {
i_this->field_0x740 = cM_rndF(500.0f) + 4000.0f;
} else {
i_this->field_0x740 = cM_rndF(700.0f) + 5000.0f;
}
}
i_this->actor.current.angle.x = -0x3e00;
i_this->field_0x748 = 0.3f;
if (i_this->field_0x624[0] != 0) {
break;
}
position = i_this->actor.current.pos;
position.y = i_this->mSurfaceY;
fopKyM_createWpillar(&position, 0.7f, 0);
Z2GetAudioMgr()->changeFishingBgm(4);
i_this->mActionPhase = 1;
i_this->mBobAmp = 50.0f;
i_this->mSound.startCreatureSound(Z2SE_AL_FISH_CATCH, 0, -1);
if (i_this->mCaughtType == 1) {
i_this->mSound.startCreatureSound(Z2SE_AL_FISHING_BOOTS_GET, 0, -1);
}
i_this->field_0x624[1] = 65;
i_this->field_0x624[2] = 20;
}
case 1: {
if (i_this->field_0x624[2] != 0) {
flag = 0;
}
mDoMtx_YrotS(*calc_mtx, player->shape_angle.y + (s16)(cM_ssin(i_this->mBobTimer * 800) * 1500.0f));
position.x = 0.0f;
if (i_this->mCaughtType == 2) {
position.y = i_this->mBobAmp * cM_ssin(i_this->mBobTimer * 2000) + 180.0f;
} else {
position.y = i_this->mBobAmp * cM_ssin(i_this->mBobTimer * 2000) + 160.0f;
}
position.z = 58.0f;
cXyz local_3c;
MtxPosition(&position, &local_3c);
local_3c += player->current.pos;
cLib_addCalc2((float*)&i_this->actor.current, local_3c.x, 0.1f, 15.0f);
cLib_addCalc2(&i_this->actor.current.pos.y, local_3c.y, 0.1f, 15.0f);
cLib_addCalc2(&i_this->actor.current.pos.z, local_3c.z, 0.1f, 15.0f);
i_this->actor.current.angle.y =
i_this->actor.current.angle.y + i_this->jointYaws2[2];
if (i_this->mCaughtType == 2) {
if (g_Counter.mTimer & 0x80) {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], 1000, 4, 0x28);
} else {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], -1000, 4, 0x28);
}
} else if (i_this->mCaughtType >= 7) {
if (g_Counter.mTimer & 0x100) {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], 200, 4, 8);
} else {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], -200, 4, 8);
}
} else if (i_this->mBobTimer & 0x100) {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], 200, 8, 4);
} else {
cLib_addCalcAngleS2(&i_this->jointYaws2[2], -200, 8, 4);
}
i_this->actor.current.angle.x = -0x3e00;
}
}
if (i_this->mCaughtType != 0) {
if (i_this->mCaughtType == 3) {
i_this->field_0x74c = i_this->field_0x748 * cM_ssin(i_this->mBobTimer * 2000);
cLib_addCalc2(&i_this->field_0x748, 0.05f, 0.1f, 0.005f);
} else if (i_this->mCaughtType == 4 || i_this->mCaughtType == 5) {
cLib_addCalc2(&i_this->field_0x740, 500.0f, 0.05f, 100.0f);
}
} else {
f32 target = 1500.0f;
s32 jointYaw = 5000;
if (i_this->mGedouKind == GEDOU_KIND_CF_2) {
target = 300.0f;
jointYaw = 2500;
} else if (i_this->mGedouKind != GEDOU_KIND_BG) {
target = 500.0f;
jointYaw = 3000;
}
jointYaw = i_this->field_0x740 * cM_ssin(i_this->mBobTimer * jointYaw);
cLib_addCalc2(&i_this->field_0x740, target, 0.05f, 100.0f);
for (s32 i = 0; i <= i_this->mNumJoints; i++) {
if (i == 0) {
i_this->jointYaws1[i] = 0;
} else {
i_this->jointYaws1[i] = jointYaw;
}
}
}
cLib_addCalc2(&i_this->mBobAmp, 5.0f, 0.05f, 1.0f);
i_this->actor.speedF = 0.0f;
if (i_this->field_0x624[1] != 0) {
pota_set(i_this);
}
return flag;
}
static void mf_aqua(mg_fish_class* i_this) {
f32 targetSpeed = 0.0f;
switch (i_this->mActionPhase) {
case 0:
i_this->mNextPos.z = cM_rndFX(190.0f) + 70.0f;
i_this->mNextPos.x = cM_rndFX(30.0f) + -720.0f;
i_this->mNextPos.y = cM_rndF(100.0f) + 70.0f;
i_this->mActionPhase = 1;
i_this->field_0x624[0] = cM_rndF(100.0f) + 100.0f;
i_this->mMaxStep = 0;
case 1: {
targetSpeed = 0.4f;
cXyz local_44 = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(local_44.x, local_44.z);
f32 fVar7 = JMAFastSqrt(local_44.x * local_44.x + local_44.z * local_44.z);
i_this->mMovementPitch = -cM_atan2s(local_44.y, fVar7);
if (i_this->mMovementPitch > 0xc00) {
i_this->mMovementPitch = 0xc00;
} else if (i_this->mMovementPitch < -0xc00) {
i_this->mMovementPitch = -0xc00;
}
if (i_this->field_0x624[0] == 0 || sqrtf(VECSquareMag(&local_44)) < 50.0f) {
if (cM_rndF(1.0f) < 0.2f && i_this->mGedouKind != GEDOU_KIND_BG) {
i_this->mActionPhase = 2;
i_this->field_0x624[0] = cM_rndF(100.0f) + 70.0f;
} else {
i_this->mActionPhase = 0;
}
}
break;
}
case 2:
cLib_addCalcAngleS2(&i_this->mMovementPitch, 0, 0x10, 100);
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 0;
}
}
cLib_addCalc2(&i_this->actor.speedF, targetSpeed, 0.05f, 0.004f);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x400, 1, 0x20);
}
static void ri_aqua(mg_fish_class* i_this) {
// Two different vectors in Debug, but this messes up the stack for GZ2E01.
// cXyz commonXyz2;
cXyz commonXyz;
f32 targetSpeed = 0.0f;
f32 speedMaxStep = NREG_F(0) + 0.01f;
switch (i_this->mActionPhase) {
case 0: {
if (i_this->actor.current.pos.z < 70.0f) {
i_this->mNextPos.z = 120.0f + cM_rndF(140.0f);
} else {
i_this->mNextPos.z = 70.0f - (cM_rndF(140.0f) + 50.0f);
}
i_this->mNextPos.x = cM_rndFX(30.0f) + -720.0f;
commonXyz.x = -30.0f - i_this->mNextPos.z;
commonXyz.z = 220.0f - i_this->mNextPos.z;
if (fabsf(commonXyz.x) < 70.0f || fabsf(commonXyz.z) < 50.0f) {
i_this->mNextPos.y = i_this->mGroundY + (15.0f + hREG_F(7));
} else {
i_this->mNextPos.y = i_this->mGroundY + hREG_F(6);
}
i_this->mActionPhase++;
i_this->mMaxStep = 0;
}
case 1: {
targetSpeed = NREG_F(1) + 0.25f;
speedMaxStep = NREG_F(2) + 0.01f;
commonXyz = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(commonXyz.x, commonXyz.z);
i_this->mMovementPitch = -cM_atan2s(
commonXyz.y, JMAFastSqrt(commonXyz.x * commonXyz.x + commonXyz.z * commonXyz.z));
if (i_this->actor.current.pos.y < i_this->mNextPos.y + (15.0f + hREG_F(8))) {
i_this->mActionPhase = 2;
i_this->field_0x624[0] = cM_rndF(500.0f) + 1000.0f;
}
break;
}
case 2: {
cLib_addCalcAngleS2(&i_this->mMovementPitch, 0, 0x20, 0x50);
if (i_this->field_0x624[0] == 0) {
if (i_this->actor.current.pos.z < 70.0f) {
i_this->mNextPos.z = cM_rndF(150.0f) + 120.0f;
} else {
i_this->mNextPos.z = 70.0f - (cM_rndF(150.0f) + 50.0f);
}
i_this->mNextPos.x = cM_rndFX(30.0f) + -720.0f;
i_this->mNextPos.y = i_this->mSurfaceY;
i_this->mActionPhase = 3;
i_this->mMaxStep = 0;
}
break;
}
case 3:
targetSpeed = NREG_F(1) + 0.25f;
speedMaxStep = NREG_F(1) + 0.01f;
commonXyz = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(commonXyz.x, commonXyz.z);
i_this->mMovementPitch = -cM_atan2s(
commonXyz.y, JMAFastSqrt(commonXyz.x * commonXyz.x + commonXyz.z * commonXyz.z));
commonXyz.y = 0.0f;
if (i_this->actor.current.pos.y >=
i_this->mSurfaceY + (KREG_F(15) + -30.0f) * i_this->mJointScale &&
commonXyz.abs() < 100.0f) {
i_this->mActionPhase = 4;
i_this->field_0x624[0] = cM_rndF(50.0f) + 150.0f;
i_this->actor.speedF = 0.0f;
i_this->field_0x5e0 = i_this->actor.speed;
targetSpeed = 0.0f;
} else {
break;
}
case 4:
cLib_addCalc2(&i_this->actor.current.pos.x, i_this->mNextPos.x, 0.05f,
fabsf(i_this->field_0x5e0.x));
cLib_addCalc2(&i_this->actor.current.pos.y,
i_this->mSurfaceY + (KREG_F(11) + -10.0f) * i_this->mJointScale, 0.05f,
fabsf(i_this->field_0x5e0.y));
cLib_addCalc2(&i_this->actor.current.pos.z, i_this->mNextPos.z, 0.05f,
fabsf(i_this->field_0x5e0.z));
cLib_addCalcAngleS2(&i_this->mMovementPitch, -0xa00, 0x20, 0x50);
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 5;
i_this->field_0x624[0] = cM_rndF(20.0f) + 50.0f;
}
break;
case 5: {
targetSpeed = TREG_F(4) + -0.1f;
speedMaxStep = 0.002f;
cLib_addCalcAngleS2(&i_this->mMovementPitch, -0xa00, 0x20, 0x50);
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 0;
}
break;
}
default:
break;
}
cLib_addCalc2(&i_this->actor.speedF, targetSpeed, 0.1f, speedMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y, i_this->mMovementYaw, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x, i_this->mMovementPitch, 8, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x300, 1, 0x10);
for (s32 i = 0; i < 3; i++) {
i_this->mJointRotations[i + 3].z =
cM_ssin(i_this->mBobTimer * (YREG_S(0) + 1300) + i * (YREG_S(1) + 16000)) *
(YREG_F(2) + 1300.0f);
}
}
static void mf_aqua_tilt(mg_fish_class* i_this) {
float targetSpeed = 0.0f;
switch (i_this->mActionPhase) {
case 0: {
i_this->mNextPos.z = cM_rndFX(180.0f) + 70.0f;
i_this->mNextPos.x = cM_rndFX(30.0f) + -720.0f;
i_this->mNextPos.y = cM_rndF(100.0f) + 70.0f;
i_this->mActionPhase = 1;
i_this->field_0x624[0] = cM_rndF(20.0f) + 20.0f;
}
case 1: {
targetSpeed = 1.2f;
cXyz movement = i_this->mNextPos - i_this->actor.current.pos;
i_this->mMovementYaw = cM_atan2s(movement.x, movement.z);
i_this->mMovementPitch = -cM_atan2s(movement.y,
JMAFastSqrt(movement.x * movement.x + movement.z * movement.z));
if (i_this->mMovementPitch > 0xc00) {
i_this->mMovementPitch = 0xc00;
} else if (i_this->mMovementPitch < -0xc00) {
i_this->mMovementPitch = 0xf400;
}
if (i_this->field_0x624[0] == 0) {
i_this->mActionPhase = 0;
}
break;
}
default:
break;
}
cLib_addCalc2(&i_this->actor.speedF, targetSpeed, 0.8f, 0.6f);
cLib_addCalcAngleS2(&i_this->actor.current.angle.y,
i_this->mMovementYaw, 4, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->actor.current.angle.x,
i_this->mMovementPitch, 4, i_this->mMaxStep);
cLib_addCalcAngleS2(&i_this->mMaxStep, 0x800, 1, 0x100);
if (i_this->field_0x624[1] == 0) {
if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
i_this->mCurAction = ACTION_MG_FISH_RI_AQUA;
} else {
i_this->mCurAction = ACTION_MG_FISH_MF_AQUA;
}
i_this->mActionPhase = 0;
}
}
static void action(mg_fish_class* i_this) {
i_this->mDistToPlayer = fopAcM_searchPlayerDistanceXZ(&i_this->actor);
const char* stageName = dComIfGp_getStartStageName();
if (strcmp(stageName, "F_SP127") == 0) {
if (i_this->mCurAction == ACTION_MG_FISH_MF_SWIM_S) {
if (i_this->mDistToPlayer > 2000.0f) {
return;
}
} else if (i_this->mCurAction == ACTION_MG_FISH_MF_STAY) {
if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
i_this->mCurAction = ACTION_MG_FISH_RI_SWIM;
i_this->mActionPhase = 0;
} else if (i_this->mGedouKind == GEDOU_KIND_CF_1) {
i_this->mCurAction = ACTION_MG_FISH_MF_SWIM_P;
i_this->mActionPhase = 0;
} else if (i_this->mDistToPlayer > 4500.0f) {
return;
}
}
}
i_this->mBobTimer += 1;
for (s32 i = 0; i < 5; i++) {
if (i_this->field_0x624[i] != 0) {
i_this->field_0x624[i] -= 1;
}
}
if (i_this->mRemainingHookTime != 0) {
i_this->mRemainingHookTime -= 1;
}
if (i_this->field_0x632 != 0) {
i_this->field_0x632 -= 1;
}
i_this->field_0x5d4 = i_this->actor.speedF;
if (i_this->field_0x5d4 > 2.7f) {
i_this->field_0x5d4 = 2.7f;
}
if (i_this->mCurAction == ACTION_MG_FISH_RI_AQUA) {
if (i_this->field_0x5d4 <= TREG_F(2) + 0.1f) {
i_this->field_0x5d4 = TREG_F(2) + 0.1f;
}
} else if (i_this->field_0x5d4 <= TREG_F(2) + 0.15f) {
i_this->field_0x5d4 = TREG_F(2) + 0.15f;
}
i_this->mYawToPlayer = fopAcM_searchPlayerAngleY(&i_this->actor);
s32 unkFlag1 = false;
s32 unkFlag2 = false;
s32 canBeginSearch = false;
s32 isInUnderwaterState = true;
s32 unkFlag5 = false;
s32 unkFlag6 = false;
s32 unkFlag7 = true;
s32 isAqua = false;
switch (i_this->mCurAction) {
case ACTION_MG_FISH_MF_SWIM:
mf_swim(i_this);
unkFlag1 = true;
unkFlag2 = true;
canBeginSearch = true;
unkFlag6 = true;
break;
case ACTION_MG_FISH_MF_STAY:
mf_stay(i_this);
unkFlag1 = true;
unkFlag2 = true;
canBeginSearch = true;
unkFlag6 = true;
if (i_this->actor.speedF <= 0.05f) {
unkFlag7 = false;
}
break;
case ACTION_MG_FISH_MF_AWAY:
mf_away(i_this);
unkFlag2 = true;
break;
case ACTION_MG_FISH_MF_SWIM_P:
mf_swim_p(i_this);
canBeginSearch = true;
unkFlag6 = true;
break;
case ACTION_MG_FISH_MF_SWIM_S:
mf_swim_s(i_this);
unkFlag1 = true;
unkFlag2 = true;
unkFlag6 = true;
canBeginSearch = true;
break;
case ACTION_MG_FISH_RI_SWIM:
ri_swim((i_this));
unkFlag1 = true;
unkFlag2 = true;
canBeginSearch = true;
if (i_this->actor.speedF <= 0.05f) {
unkFlag7 = false;
}
break;
case ACTION_MG_FISH_MF_AQUA:
mf_aqua(i_this);
unkFlag7 = false;
isAqua = true;
break;
case ACTION_MG_FISH_RI_AQUA:
ri_aqua(i_this);
unkFlag7 = false;
isAqua = true;
break;
case ACTION_MG_FISH_MF_AQUA_TILT:
mf_aqua_tilt(i_this);
unkFlag7 = false;
isAqua = true;
break;
case ACTION_MG_FISH_MF_LURE_SEARCH:
mf_lure_search(i_this);
unkFlag2 = true;
break;
case ACTION_MG_FISH_MF_BAIT_SEARCH:
mf_bait_search(i_this);
unkFlag2 = true;
break;
case ACTION_MG_FISH_MF_HIT:
mf_hit(i_this);
unkFlag5 = true;
break;
case ACTION_MG_FISH_MF_JUMP:
mf_jump(i_this);
isInUnderwaterState = false;
unkFlag5 = true;
break;
case ACTION_MG_FISH_MF_CATCH:
mf_catch(i_this);
unkFlag6 = true;
unkFlag7 = false;
isInUnderwaterState = false;
break;
case ACTION_MG_FISH_MF_ESA_SEARCH:
mf_esa_search(i_this);
unkFlag2 = true;
unkFlag6 = true;
break;
case ACTION_MG_FISH_MF_ESA_HIT:
mf_esa_hit(i_this);
unkFlag5 = true;
break;
case ACTION_MG_FISH_MF_ESA_CATCH:
unkFlag6 = mf_esa_catch(i_this);
unkFlag7 = true;
isInUnderwaterState = false;
break;
}
if (unkFlag6 != 0) {
i_this->mCcCyl.OffCoSetBit();
} else {
i_this->mCcCyl.OnCoSetBit();
}
if (unkFlag5) {
f32 jointScale;
if (i_this->mGedouKind == GEDOU_KIND_LM_1) {
jointScale = i_this->mJointScale;
if (jointScale >= 0.7f) {
jointScale = 0.0001f;
} else if (jointScale >= 0.65f) {
jointScale = 0.00015f;
} else if (jointScale >= 0.6f) {
jointScale = 0.0002f;
} else if (jointScale >= 0.55f) {
jointScale = 0.0003f;
} else {
jointScale = 0.0004f;
}
} else if (i_this->mGedouKind == GEDOU_KIND_NP_1) {
jointScale = i_this->mJointScale;
if (jointScale >= 0.7f) {
jointScale = 0.00015f;
} else if (jointScale >= 0.65f) {
jointScale = 0.0002f;
} else if (jointScale >= 0.6f) {
jointScale = 0.00025f;
} else if (jointScale >= 0.55f) {
jointScale = 0.0003f;
} else {
jointScale = 0.0004f;
}
} else if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
if (i_this->mJointScale >= 0.8f) {
jointScale = 0.0001f;
} else {
jointScale = 0.00015f;
}
} else {
jointScale = 0.0003f;
}
cLib_addCalc2(&i_this->field_0x660, 0.5f, 1.0f, jointScale);
} else {
cLib_addCalc2(&i_this->field_0x660, 1.0f, 1.0f, 0.002f);
}
if (TREG_S(7) == 0 && unkFlag1 && pl_check(i_this, i_this->field_0xc40) != 0) {
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = -1;
}
if (unkFlag2 &&
i_this->mSurfaceY - i_this->mAcch.GetGroundH() < i_this->mJointScale * (TREG_F(5) + 35.0f)) {
i_this->mCurAction = ACTION_MG_FISH_MF_AWAY;
i_this->mActionPhase = 1;
i_this->field_0x624[0] = cM_rndF(30.0f) + 40.0f;
i_this->mNextPos = i_this->actor.home.pos;
}
if (canBeginSearch) {
if (i_this->field_0x62e == 0 || i_this->field_0x5ec > 10000.0f) {
s32 unkSint2 = 0;
if (i_this->mGedouKind >= GEDOU_KIND_BG) {
unkSint2 = 1;
}
i_this->mRodId = search_lure(i_this, unkSint2);
if (fopAcM_SearchByID(i_this->mRodId) != NULL) {
if (unkSint2 == 0) {
i_this->mCurAction = ACTION_MG_FISH_MF_LURE_SEARCH;
} else {
i_this->mCurAction = ACTION_MG_FISH_MF_ESA_SEARCH;
}
i_this->mActionPhase = 0;
} else {
if (unkSint2 == 0) {
i_this->mBaitId = search_bait(i_this);
if (fopAcM_SearchByID(i_this->mBaitId) != NULL) {
i_this->mCurAction = ACTION_MG_FISH_MF_BAIT_SEARCH;
i_this->mActionPhase = 0;
}
}
}
} else {
i_this->field_0x62e -= 1;
}
}
if (i_this->mCurAction == ACTION_MG_FISH_MF_JUMP && i_this->actor.speedF == 0.0f) {
s32 unkSint2 = 7000;
if (i_this->mJointScale >= 0.7f) {
unkSint2 = 5000;
} else if (i_this->mJointScale >= 0.6f) {
unkSint2 = 6000;
} else if (i_this->mJointScale >= 0.5f) {
unkSint2 = 6500;
}
if (i_this->mNumJoints <= 4) {
i_this->jointYaws2[0] = cM_ssin(i_this->mBobTimer * unkSint2) *
(ZREG_F(10) + -9000.0f);
} else {
i_this->jointYaws2[0] = cM_ssin(i_this->mBobTimer * (unkSint2 + -500)) *
(ZREG_F(10) + -9000.0f);
}
} else {
f32 unkFloat0 = -1000.0f * i_this->field_0x5d4 * i_this->field_0x660;
ANGLE_ADD(i_this->jointYaws2[1], i_this->field_0x5d4 * 2500.0f / i_this->mJointScale);
if (i_this->mGedouKind >= GEDOU_KIND_BG) {
i_this->jointYaws2[1] += 2000;
}
i_this->jointYaws2[0] = unkFloat0 * cM_ssin(i_this->jointYaws2[1]);
}
cMtx_YrotS(*calc_mtx, i_this->actor.current.angle.y);
cMtx_XrotM(*calc_mtx, i_this->actor.current.angle.x);
cMtx_YrotM(*calc_mtx, i_this->jointYaws2[0]);
cXyz commonXyz;
commonXyz.x = 0.0f;
commonXyz.y = 0.0f;
commonXyz.z = i_this->actor.speedF * l_HIO.field_0xc * i_this->mJointScale * i_this->field_0x660;
if (i_this->mGedouKind >= GEDOU_KIND_BG && i_this->mGedouKind != GEDOU_KIND_KS_2) {
commonXyz.z *= 1.3f;
}
f32 unkFloat1 = 10.0f;
if (i_this->mGedouKind == GEDOU_KIND_CF_1) {
unkFloat1 = 4.5f;
} else if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
unkFloat1 = 5.0f;
} else if (i_this->mGedouKind == GEDOU_KIND_NP_1 || i_this->mGedouKind == GEDOU_KIND_KS_1) {
unkFloat1 = 7.0f;
}
if (commonXyz.z > unkFloat1) {
commonXyz.z = unkFloat1;
}
MtxPosition(&commonXyz, &i_this->actor.speed);
i_this->actor.current.pos += i_this->actor.speed;
i_this->actor.eyePos = i_this->actor.current.pos;
commonXyz = i_this->actor.eyePos;
commonXyz.y -= 10.0f;
i_this->mCcCyl.SetC(commonXyz);
if (i_this->mCurAction == ACTION_MG_FISH_MF_HIT ||
i_this->mCurAction >= ACTION_MG_FISH_MF_ESA_HIT) {
i_this->mCcCyl.SetH(KREG_F(17) + 500.0f);
if (i_this->mCurAction >= ACTION_MG_FISH_MF_ESA_HIT) {
i_this->mCcCyl.SetR(30.0f);
} else {
i_this->mCcCyl.SetR(hREG_F(16) + 40.0f);
}
} else {
f32 radius = i_this->mJointScale * (KREG_F(13) + 20.0f);
if (radius > 15.0f) {
radius = 15.0f;
}
i_this->mCcCyl.SetR(radius);
i_this->mCcCyl.SetH((KREG_F(13) + 30.0f) * i_this->mJointScale);
}
dComIfG_Ccsp()->Set(&i_this->mCcCyl);
if (unkFlag6 == 0) {
cXyz* ccMoveP = i_this->mCcStatus.GetCCMoveP();
if (ccMoveP != NULL) {
if (isAqua) {
f32 scalar = XREG_F(15) + 0.04f;
i_this->actor.current.pos.x += ccMoveP->x * scalar;
i_this->actor.current.pos.z += ccMoveP->z * scalar;
for (s32 i = 0; i <= i_this->mNumJoints; i++) {
i_this->mJointTranslations[i].x += ccMoveP->x * scalar;
i_this->mJointTranslations[i].z += ccMoveP->z * scalar;
}
} else if (i_this->mCurAction == ACTION_MG_FISH_MF_HIT ||
i_this->mCurAction >= ACTION_MG_FISH_MF_ESA_HIT) {
i_this->actor.current.pos.x += ccMoveP->x;
i_this->actor.current.pos.z += ccMoveP->z;
} else {
i_this->actor.current.pos.x += ccMoveP->x * 0.5f;
i_this->actor.current.pos.z += ccMoveP->z * 0.5f;
}
}
}
if (unkFlag7) {
f32 unkFloat2 = i_this->mJointScale * (TREG_F(3) + 10.0f);
unkFloat2 += fabsf(unkFloat2 * cM_ssin(i_this->actor.current.angle.x) * 2.0f);
i_this->actor.current.pos.y = i_this->actor.current.pos.y - unkFloat2;
i_this->actor.old.pos.y = i_this->actor.old.pos.y - unkFloat2;
i_this->mAcch.CrrPos(dComIfG_Bgsp());
i_this->actor.current.pos.y = i_this->actor.current.pos.y + unkFloat2;
i_this->actor.old.pos.y = i_this->actor.old.pos.y + unkFloat2;
if (i_this->mAcch.ChkGroundHit() && i_this->actor.current.angle.x > 0x800) {
i_this->mMovementPitch = 0x800;
i_this->actor.current.angle.x = 0x800;
}
}
if (isAqua) {
if (i_this->actor.current.pos.x > -675.0f || i_this->actor.current.pos.x < -765.0f) {
i_this->actor.current.pos.x = i_this->actor.old.pos.x;
}
if (i_this->actor.current.pos.z > 290.0f || i_this->actor.current.pos.z < -150.0f) {
i_this->actor.current.pos.z = i_this->actor.old.pos.z;
}
if (i_this->actor.current.pos.y < i_this->mGroundY + 5.0f) {
i_this->actor.current.pos.y = i_this->actor.old.pos.y;
}
if (daPy_getPlayerActorClass()->checkFrontRollCrash() && i_this->mDistToPlayer < 200.0f) {
i_this->mCurAction = ACTION_MG_FISH_MF_AQUA_TILT;
i_this->mActionPhase = 0;
i_this->field_0x624[1] = cM_rndF(30.0f) + 50.0f;
fopAc_ac_c* henna = fopAcM_SearchByName(PROC_NPC_HENNA);
if (henna != NULL) {
((npc_henna_class*)henna)->field_0x7b5 = 20;
}
}
}
// surfaceY access is replaced with subtraction operation in debug rom
if (isInUnderwaterState && i_this->actor.current.pos.y > i_this->mSurfaceY) {
i_this->actor.current.pos.y = i_this->mSurfaceY;
if (i_this->actor.current.angle.x < 0) {
i_this->mMovementPitch = 0;
i_this->actor.current.angle.x = 0;
}
}
cLib_addCalcAngleS2(&i_this->actor.shape_angle.y, i_this->actor.current.angle.y, 2, 0x1000);
cLib_addCalcAngleS2(&i_this->actor.shape_angle.x, i_this->actor.current.angle.x, 2, 0x1000);
cLib_addCalcAngleS2(&i_this->actor.shape_angle.z, i_this->actor.current.angle.z, 0x10, 0x200);
if (i_this->mGedouKind != GEDOU_KIND_CF_1) {
f32 unkFloat4 = i_this->actor.speedF * (NREG_F(15) + 4000.0f);
f32 target = 4000.0f;
if (i_this->mGedouKind == GEDOU_KIND_RI_1) {
target = 1000.0f;
} else if (i_this->mGedouKind == GEDOU_KIND_NP_1 || i_this->mGedouKind == GEDOU_KIND_KS_1) {
target = 3500.0f;
}
if (unkFloat4 > target) {
unkFloat4 = target;
}
i_this->jointYaws2[4] = -(i_this->field_0x73c - unkFloat4) +
i_this->field_0x73c * cM_ssin(i_this->mBobTimer * (TREG_S(9) + 1900));
i_this->jointYaws2[5] = i_this->field_0x73c - unkFloat4 +
i_this->field_0x73c * cM_ssin(i_this->mBobTimer * (TREG_S(9) + 1700));
target = 0.3f - (NREG_F(14) + i_this->actor.speedF);
if (target < NREG_F(14) + 0.0f) {
target = NREG_F(14) + 0.0f;
}
target *= 23333.0f;
cLib_addCalc2(&i_this->field_0x73c, target, 0.2f, 800.0f);
}
}
static void ke_control(mg_fish_class* i_this, mf_ke_s* rope) {
s32 i;
s16 pitch;
s32 yaw;
cXyz* p1 = rope->mControlPoints + 1;
f32 influence = 1.0f;
cMtx_YrotS(*calc_mtx, i_this->actor.shape_angle.y);
cMtx_XrotM(*calc_mtx, i_this->actor.shape_angle.x);
cXyz localOffset(0.0f, 0.0f, -3.0f);
cXyz newSegmentDelta;
cXyz transformedOffset;
MtxPosition(&localOffset, &transformedOffset);
localOffset.x = 0.0f;
localOffset.y = 0.0f;
localOffset.z = 10.0f * i_this->mJointScale;
for (i = 1; i < 5; i++, p1++) {
f32 newX = p1->x - p1[-1].x + rope->mMovementDir.x * influence + transformedOffset.x;
f32 newY = p1->y - p1[-1].y + rope->mMovementDir.y * influence + transformedOffset.y;
f32 newZ = p1->z - p1[-1].z + rope->mMovementDir.z * influence + transformedOffset.z;
influence *= 0.4f;
yaw = cM_atan2s(newX, newZ);
pitch = -cM_atan2s(newY, JMAFastSqrt(newX * newX + newZ * newZ));
cMtx_YrotS(*calc_mtx, yaw);
cMtx_XrotM(*calc_mtx, pitch);
MtxPosition(&localOffset, &newSegmentDelta);
p1->x = p1[-1].x + newSegmentDelta.x;
p1->y = p1[-1].y + newSegmentDelta.y;
p1->z = p1[-1].z + newSegmentDelta.z;
}
}
static void ke_move(mg_fish_class* i_this, mf_ke_s* param_1, int param_2) {
ke_control(i_this, param_1);
cXyz* pos = i_this->mLineMat.getPos(param_2);
f32* size = i_this->mLineMat.getSize(param_2);
for (s32 i = 0; i < 5; i++, pos++, size++) {
*pos = param_1->mControlPoints[i];
if (i < 3) {
*size = 0.3f * i_this->mJointScale;
} else {
*size = 0.0f;
}
}
}
static int daMg_Fish_Execute(mg_fish_class* i_this) {
static s32 mouth_idx[11] = { 7, 0, 9, 7, 9, 4, 7, 0, 9, 7, 9 };
if (i_this->mGedouKind == GEDOU_KIND_BT || i_this->mGedouKind == GEDOU_KIND_SP ||
i_this->mGedouKind == GEDOU_KIND_LH || i_this->mGedouKind == GEDOU_KIND_O_GD_BOTT ||
i_this->mGedouKind == GEDOU_KIND_BB || i_this->mGedouKind == GEDOU_KIND_KN ||
i_this->mGedouKind == GEDOU_KIND_ED || i_this->mGedouKind == GEDOU_KIND_SY ||
i_this->field_0xc3c != 0) {
return 1;
}
cXyz commonXyz;
daPy_py_c* player = daPy_getPlayerActorClass();
#if VERSION == VERSION_GCN_JPN
lit_1008 = 0;
#elif VERSION == VERSION_GCN_PAL
if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_ENGLISH) {
lit_1008 = 2;
} else {
lit_1008 = 0;
}
#endif
if (i_this->mSurfaceY != 0.0f) {
if ((g_Counter.mTimer + fopAcM_GetID(i_this) & 0xf) == 0) {
get_surface_y(i_this, &i_this->actor.current.pos);
}
}
i_this->mHookedState = 0;
action(i_this);
dmcalc(i_this);
J3DModel* model = i_this->mpMorf->getModel();
for (u16 i = 1; i < model->mModelData->getJointNum(); i++) {
if ((i_this->mCurAction == ACTION_MG_FISH_MF_JUMP && i_this->actor.speedF == 0.0f) ||
i_this->mCurAction == ACTION_MG_FISH_MF_CATCH ||
i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH)
{
model->mModelData->getJointNodePointer(i)->setCallBack(nodeCallBack2);
} else {
model->mModelData->getJointNodePointer(i)->setCallBack(nodeCallBack);
}
}
if (i_this->mCurAction == ACTION_MG_FISH_MF_CATCH) {
if (i_this->field_0x624[0] < 0x50) {
MtxP src = daPy_getLinkPlayerActorClass()->getRightItemMatrix();
MTXCopy(src, *calc_mtx);
commonXyz.set(0.0f, 5.0f, -5.0f);
MtxPosition(&commonXyz, &i_this->actor.current.pos);
} else {
daPy_py_c* player2 = (daPy_py_c*)dComIfGp_getPlayer(0);
cMtx_YrotS(*calc_mtx, player2->shape_angle.y);
if (player2->checkCanoeFishingGetRight() != 0) {
commonXyz.x = -100.0f;
} else {
commonXyz.x = 100.0f;
}
commonXyz.y = 0.0f;
commonXyz.z = 0.0f;
MtxPosition(&commonXyz, &i_this->actor.current.pos);
i_this->actor.current.pos.x = i_this->actor.current.pos.x + player2->current.pos.x;
i_this->actor.current.pos.z = i_this->actor.current.pos.z + player2->current.pos.z;
i_this->actor.current.pos.y = i_this->mSurfaceY - 10.0f;
}
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.x);
f32 jointScaleMult = 1.0f;
f32 jointScale = i_this->mJointScale;
if (jointScale < 0.6f) {
jointScaleMult = 0.6f - jointScale + 1.0f;
}
if (jointScaleMult > 1.12f) {
jointScaleMult = 1.12f;
}
jointScale *= jointScaleMult;
mDoMtx_stack_c::scaleM(jointScale, jointScale, jointScale);
if (i_this->mNumJoints <= 4) {
mDoMtx_stack_c::transM(0.0f, 15.0f, -25.0f);
} else {
mDoMtx_stack_c::transM(0.0f, 10.0f, -15.0f);
}
} else {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.x);
cMtx_ZrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.z);
f32 jointScale = i_this->mJointScale;
mDoMtx_stack_c::scaleM(jointScale, jointScale, jointScale);
if (i_this->mCurAction == ACTION_MG_FISH_MF_JUMP && i_this->actor.speedF == 0.0f) {
jointScale = 20.0f;
} else {
jointScale = 0.0f;
}
mDoMtx_stack_c::transM(0.0f, 0.0f, -jointScale);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->jointYaws2[0]);
mDoMtx_stack_c::transM(0.0f, 0.0f, jointScale);
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
mDoMtx_stack_c::scaleM(1.1f, 1.1f, 1.1f);
}
}
MTXCopy(mDoMtx_stack_c::now, model->getBaseTRMtx());
if (i_this->mCaughtType != 0) {
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (i_this->mCaughtType == 1) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_bt_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y - 10.0f,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, -0x4000);
mDoMtx_stack_c::transM(0.0f, 0.0f, 7.0f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 2) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_sp_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, 0x4000);
if (rod->hook_kind == 1) {
mDoMtx_stack_c::transM(0.0f, 0.0f, 35.0f);
} else {
mDoMtx_stack_c::transM(0.0f, 0.0f, 29.0f);
}
mDoMtx_stack_c::scaleM(0.36f, 0.36f, 0.36f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
mDoMtx_stack_c::transM(0.0f, 0.0f, -40.0f);
mDoMtx_stack_c::scaleM(2.5f, 2.5f, 2.5f);
cMtx_XrotM(mDoMtx_stack_c::now, 0x4000);
fish->mpModel[1]->setBaseTRMtx(mDoMtx_stack_c::now);
cMtx_XrotM(mDoMtx_stack_c::now, -0x4000);
mDoMtx_stack_c::transM(0.0f, 0.0f, 17.0f);
mDoMtx_stack_c::scaleM(0.5f, 0.5f, 0.5f);
cMtx_ZrotM(mDoMtx_stack_c::now, 0x4000);
fish->mpModel[2]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 3) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_lh_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
f32 latScale = 0.5f / (i_this->field_0x74c + 1.0f);
mDoMtx_stack_c::scaleM(latScale, (i_this->field_0x74c + 1.0f) * 0.5f, latScale);
mDoMtx_stack_c::transM(0.0f, -30.0f, 0.0f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 4) {
fopAc_ac_c* skullfish_actor = fopAcM_SearchByID(i_this->mSkullfishId);
if (skullfish_actor != NULL) {
e_sg_class* skullfish = (e_sg_class*)skullfish_actor;
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.x);
cMtx_ZrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.z);
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
mDoMtx_stack_c::scaleM(0.8f, 0.8f, 0.8f);
}
mDoMtx_stack_c::transM(0.0f, 2.5f, 0.0f);
skullfish->mpModel->setBaseTRMtx(mDoMtx_stack_c::now);
f32 fAVar1[] = { 1.0f, 2.0f, 3.5f };
skullfish->mJointYRot = 0.0f;
for (s32 i = 0; i < 3; i++) {
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
skullfish->mJoints[i + 1] = (s32)(i_this->field_0x740 *
cM_ssin(i_this->mBobTimer * 4000 + -15000 * i) *
fAVar1[i]);
} else {
skullfish->mJoints[i + 1] = (s32)(cM_ssin(i_this->mBobTimer * 8000 + -15000 * i) *
4000.0f *
fAVar1[i]);
}
}
}
} else if (i_this->mCaughtType == 5) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_bb_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
f32 fAVar2[] = { 1.0f, 2.0f, 3.5f };
for (s32 i = 0; i < 3; i++) {
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
fish->jointYaws1[i] = (s32)(i_this->field_0x740 *
cM_ssin(i_this->mBobTimer * 4000 + -15000 * i) *
fAVar2[i]);
} else {
fish->jointYaws1[i] = (s32)(cM_ssin(i_this->mBobTimer * 10000 + -15000 * i) *
3000.0f *
fAVar2[i]);
}
}
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
} else {
cMtx_YrotM(mDoMtx_stack_c::now,
i_this->actor.shape_angle.y + fish->jointYaws1[0]);
}
cMtx_XrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.x);
cMtx_ZrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.z);
if (i_this->mCurAction == ACTION_MG_FISH_MF_ESA_CATCH) {
mDoMtx_stack_c::scaleM(0.7f, 0.7f, 0.7f);
}
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 6) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_bin_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y - 10.0f,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
mDoMtx_stack_c::transM(0.0f, -9.0f, 0.0f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 7) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_kn_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now,
(s16)(cM_ssin(i_this->mBobTimer * 0x514) * 600.0f + 2600.0f) +
-0x4000);
mDoMtx_stack_c::scaleM(1.0f, 1.0f, 1.0f);
mDoMtx_stack_c::transM(0.0f, -8.0f, -5.0f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 8) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_ed_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, -0x4000);
if (rod->hook_kind == 1) {
mDoMtx_stack_c::transM(0.0f, 0.0f, -14.0f);
} else {
mDoMtx_stack_c::transM(0.0f, 0.0f, -8.0f);
}
cMtx_YrotM(mDoMtx_stack_c::now, cM_ssin(i_this->mBobTimer * 800) * 1500.0f);
mDoMtx_stack_c::scaleM(0.5f, 0.5f, 0.5f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
} else if (i_this->mCaughtType == 9) {
mg_fish_class* fish = (mg_fish_class*)fpcEx_Search(s_sy_sub, i_this);
if (fish != NULL) {
MTXTrans(mDoMtx_stack_c::now, i_this->actor.current.pos.x, i_this->actor.current.pos.y,
i_this->actor.current.pos.z);
cMtx_YrotM(mDoMtx_stack_c::now, i_this->actor.shape_angle.y);
cMtx_XrotM(mDoMtx_stack_c::now, -0x4000);
if (rod->hook_kind == 1) {
mDoMtx_stack_c::transM(0.0f, 0.0f, -25.0f);
} else {
mDoMtx_stack_c::transM(0.0f, 0.0f, -19.0f);
}
cMtx_YrotM(mDoMtx_stack_c::now, 0xa00);
mDoMtx_stack_c::scaleM(0.3f, 0.3f, 0.3f);
fish->mpModel[0]->setBaseTRMtx(mDoMtx_stack_c::now);
}
}
}
i_this->mpMorf->play(&i_this->actor.eyePos, 0, 0);
if (i_this->mpBrkAnm != NULL) {
i_this->mpBrkAnm->play();
}
i_this->mpMorf->modelCalc();
i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(&i_this->actor)));
if (i_this->mKind2 == 3) {
cXyz* ctrlPtMtx;
for (s32 i = 0; i < 2; i++) {
MTXCopy(i_this->mpMorf->getModel()->getAnmMtx(0), *calc_mtx);
if (i == 0) {
commonXyz.set(3.0f, 0.0f, 17.0f);
} else {
commonXyz.set(-3.0f, 0.0f, 17.0f);
}
MtxPosition(&commonXyz, &i_this->field_0x754[i].mControlPoints[0]);
cMtx_YrotS(*calc_mtx, i_this->actor.shape_angle.y);
cMtx_XrotM(*calc_mtx, i_this->actor.shape_angle.x);
cMtx_ZrotM(*calc_mtx, i_this->actor.shape_angle.z);
cMtx_YrotM(*calc_mtx, i_this->jointYaws2[0]);
commonXyz.set(i == 0 ? 2.0f : -2.0f, 0.0f, 0.0f);
MtxPosition(&commonXyz, &i_this->field_0x754[i].mControlPoints[5]);
ke_move(i_this, (mf_ke_s*)&i_this->field_0x754[i].mControlPoints[0], i);
}
}
static cXyz mouth_off[11] = {
cXyz(25.0f, 5.0f, -8.0f), cXyz(25.0f, 0.0f, 2.0f), cXyz(30.0f, 0.0f, 2.0f),
cXyz(25.0f, -2.0f, 2.0f), cXyz(30.0f, 0.0f, 2.0f), cXyz(30.0f, 0.0f, 0.0f),
cXyz(15.0f, 0.0f, 0.0f), cXyz(15.0f, -1.0f, 0.0f), cXyz(15.0f, -1.0f, 0.0f),
cXyz(15.0f, -1.0f, 0.0f), cXyz(15.0f, -1.0f, 0.0f),
};
MTXCopy(model->getAnmMtx(mouth_idx[i_this->mGedouKind]), *calc_mtx);
commonXyz = mouth_off[i_this->mGedouKind];
MtxPosition(&commonXyz, &i_this->field_0x638);
if (i_this->mHookedState != 0) {
dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByID(i_this->mRodId);
if (rod->lure_type == MG_LURE_SP && i_this->mCurAction == ACTION_MG_FISH_MF_CATCH) {
if (i_this->mKind2 == 0) {
f32 fVar3 = (i_this->mJointScale - 0.48f) * 100.0f;
if (fVar3 < 0.0f) {
fVar3 = 0.0f;
}
commonXyz.x += fVar3 + -45.0f;
commonXyz.z += -5.0f;
} else if (i_this->mKind2 == 2) {
commonXyz.x += -35.0f;
commonXyz.z += 7.0f;
} else if (i_this->mKind2 == 3) {
commonXyz.x += -35.0f;
commonXyz.y += 11.0f;
commonXyz.z += 5.0f;
} else if (i_this->mKind2 == 1) {
commonXyz.x += -30.0f;
commonXyz.z += 5.0f;
}
MtxPosition(&commonXyz, &i_this->field_0x638);
rod->actor.current.angle.y = 0;
rod->actor.current.angle.x = 0x4000;
rod->actor.current.angle.z = player->shape_angle.y + 8000;
rod->actor.shape_angle.x = rod->actor.current.angle.x;
rod->actor.shape_angle.y = rod->actor.current.angle.y;
rod->actor.shape_angle.z = rod->actor.current.angle.z;
rod->field_0x114a = 0;
rod->field_0x114c = 0;
rod->field_0x1004 = 0;
} else {
if (rod->lure_type == MG_LURE_FR && i_this->mGedouKind == GEDOU_KIND_RI_1) {
commonXyz.y += 8.0f;
commonXyz.z += -3.0f;
MtxPosition(&commonXyz, &i_this->field_0x638);
}
cLib_addCalcAngleS2(&rod->actor.current.angle.y, i_this->actor.shape_angle.y - 0x1710, 2, 0x800);
cLib_addCalcAngleS2(&rod->actor.current.angle.x,
i_this->actor.shape_angle.x + - 0x310c + rod->field_0x1006, 2, 0x800);
cLib_addCalcAngleS2(&rod->actor.current.angle.z, 0x6328, 2, 0x800);
}
rod->actor.current.pos.x = i_this->field_0x638.x;
rod->actor.current.pos.y = i_this->field_0x638.y;
rod->actor.current.pos.z = i_this->field_0x638.z;
rod->lure_pitch_offset = 0;
rod->lure_yaw_offset = 0;
}
if (i_this->field_0x659 != 0) {
fopAc_ac_c* rod = fopAcM_SearchByID(i_this->mRodId);
if (rod != NULL) {
if (i_this->mCaughtType != 0) {
i_this->field_0x638 = i_this->actor.current.pos;
}
if (i_this->mCurAction >= ACTION_MG_FISH_MF_ESA_HIT) {
rod->current.pos = i_this->field_0x638;
} else {
cLib_addCalc2(&rod->current.pos.x, i_this->field_0x638.x, 1.0f,
i_this->field_0x650);
cLib_addCalc2(&rod->current.pos.y, i_this->field_0x638.y, 1.0f,
i_this->field_0x650);
cLib_addCalc2(&rod->current.pos.z, i_this->field_0x638.z, 1.0f,
i_this->field_0x650);
cLib_addCalc2(&i_this->field_0x650, 100.0f, 1.0f, 2.0f);
}
i_this->field_0x659--;
} else {
i_this->field_0x659 = 0;
}
}
return 1;
}
static int daMg_Fish_IsDelete(mg_fish_class* i_this) {
return 1;
}
static int daMg_Fish_Delete(mg_fish_class* i_this) {
fopAcM_GetID(i_this);
dComIfG_resDelete(&i_this->mPhaseReq, i_this->mResName);
if (i_this->field_0xc3f != 0) {
lit_1007 = 0;
}
if (i_this->actor.heap != NULL) {
i_this->mSound.deleteObject();
}
return 1;
}
static int useHeapInit2(fopAc_ac_c* i_actor) {
mg_fish_class* i_this = (mg_fish_class*)i_actor;
if (i_this->mGedouKind == GEDOU_KIND_BT) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 3);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
} else if (i_this->mGedouKind == GEDOU_KIND_SP) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 11);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 5);
i_this->mpModel[1] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[1] == 0) {
return 0;
}
modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 7);
i_this->mpModel[2] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[2] == 0) {
return 0;
}
} else if (i_this->mGedouKind == GEDOU_KIND_LH) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 3);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
i_this->mpModel[0]->setUserArea((s32)i_this);
for (u16 i = 0; i < modelData->getJointNum(); i++) {
i_this->mpModel[0]->mModelData->getJointNodePointer(i)->setCallBack(nodeCallBackLH);
}
} else if (i_this->mGedouKind == GEDOU_KIND_O_GD_BOTT) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 6);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0, 0x11020084);
if (i_this->mpModel[0] == NULL) {
return 0;
}
i_this->mpBtpAnm = new mDoExt_btpAnm();
if (i_this->mpBtpAnm == 0) {
return 0;
}
J3DAnmTexPattern* pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes(i_this->mResName, 15);
if (i_this->mpBtpAnm->init(&modelData->getMaterialTable(),
pattern, 1, 0, 1.0f, 0, -1) == 0) {
return 0;
}
} else if (i_this->mGedouKind == GEDOU_KIND_BB) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 3);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
i_this->mpModel[0]->setUserArea((s32)i_this);
for (u16 i = 0; i < modelData->getJointNum(); i++) {
i_this->mpModel[0]->mModelData->getJointNodePointer(i)->setCallBack(nodeCallBackBB);
}
} else if (i_this->mGedouKind == GEDOU_KIND_KN) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 6);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
} else if (i_this->mGedouKind == GEDOU_KIND_ED) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 4);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == 0) {
return 0;
}
} else if (i_this->mGedouKind == GEDOU_KIND_SY) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(i_this->mResName, 8);
i_this->mpModel[0] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (i_this->mpModel[0] == NULL) {
return 0;
}
}
for (s32 i = 0; i < 3; i++) {
if (i_this->mpModel[i] != NULL) {
mDoMtx_stack_c::scaleS(0.0f, 0.0f, 0.0f);
mDoMtx_copy(mDoMtx_stack_c::now, i_this->mpModel[i]->mBaseTransformMtx);
}
}
return 1;
}
static int useHeapImg_fisht(fopAc_ac_c* i_actor) {
static u32 fish_bmd[11] = {
8, 3, 3, 3, 4, 3, 8, 3,
3, 3, 4,
};
static u32 fish_joint[11] = {
4, 6, 6, 6, 6, 3, 4, 6,
6, 6, 6,
};
mg_fish_class* i_this = (mg_fish_class*)i_actor;
if (i_this->mGedouKind == GEDOU_KIND_LM_1) {
i_this->mAnmTransform = (J3DAnmTransform*)dComIfG_getObjectRes(i_this->mResName, 4);
} else {
i_this->mAnmTransform = 0;
}
i_this->mpMorf = new mDoExt_McaMorf(
(J3DModelData*)dComIfG_getObjectRes(i_this->mResName, fish_bmd[i_this->mGedouKind]),
NULL, NULL, i_this->mAnmTransform, 0, 1.0f, 0, -1, 1, NULL,
0x80000, 0x11000084);
if (i_this->mpMorf == NULL || i_this->mpMorf->getModel() == NULL) {
return 0;
}
J3DModel* model = i_this->mpMorf->getModel();
model->setUserArea((s32)i_this);
i_this->mNumJoints = fish_joint[i_this->mGedouKind];
for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) {
model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
}
if (i_this->mKind2 == 3 && i_this->mLineMat.init(2, 5, 1) == 0) {
return 0;
}
if (i_this->mKind2 == 4) {
i_this->mpBrkAnm = new mDoExt_brkAnm();
if (i_this->mpBrkAnm == NULL) {
return 0;
}
J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(i_this->mResName, 7);
J3DModelData* modelData = model->getModelData();
s32 iVar7 = i_this->mpBrkAnm->init(&modelData->getMaterialTable(), brk, 1, 2,
1.0f, 0, -1);
if (iVar7 == 0) {
return 0;
}
i_this->mRotZ = 5000;
}
return 1;
}
static int daMg_Fish_Create(fopAc_ac_c* i_this) {
static dCcD_SrcCyl cc_cyl_src = {
{
{ 0x0, { { 0x0, 0x0, 0x0 }, { 0x0, 0x0 }, 0x75 } }, // mObj
{ dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0 }, // mGObjAt
{ dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2 }, // mGObjTg
{ 0 }, // mGObjCo
}, // mObjInf
{
{
{ 0.0f, 0.0f, 0.0f }, // mCenter
35.0f, // mRadius
35.0f // mHeight
} // mCyl
}
};
static f32 fish_max[11] = {
0.828f,
0.998f,
0.998f,
0.998f,
0.708f,
0.428f,
0.448f,
0.588f,
0.588f,
0.548f,
0.708f,
};
fopAcM_ct(i_this, mg_fish_class);
mg_fish_class* a_this = (mg_fish_class*)i_this;
a_this->mGedouKind = fopAcM_GetParam(i_this);
bool flag1 = false;
if (a_this->mGedouKind == 106) {
a_this->mGedouKind = GEDOU_KIND_BG;
flag1 = true;
}
if (a_this->mGedouKind >= 100) {
a_this->mGedouKind = a_this->mGedouKind - 95;
}
u32 heapSize = 0x1000;
if (a_this->mGedouKind == GEDOU_KIND_LM_1 || a_this->mGedouKind == GEDOU_KIND_LM_2) {
a_this->mKind2 = 0;
a_this->mResName = "Mg_f_lm";
heapSize = 0x1420;
} else if (a_this->mGedouKind == GEDOU_KIND_NP_1 || a_this->mGedouKind == GEDOU_KIND_NP_2) {
a_this->mKind2 = 2;
a_this->mResName = "Mg_f_np";
heapSize = 0xd60;
} else if (a_this->mGedouKind == GEDOU_KIND_CF_1 || a_this->mGedouKind == GEDOU_KIND_CF_2) {
a_this->mKind2 = 3;
a_this->mResName = "Mg_f_cf";
heapSize = 0x1200;
} else if (a_this->mGedouKind == GEDOU_KIND_RI_1 || a_this->mGedouKind == GEDOU_KIND_RI_2) {
a_this->mKind2 = 1;
a_this->mResName = "Mg_f_ri";
heapSize = 0xdc0;
} else if (a_this->mGedouKind == GEDOU_KIND_KS_1 || a_this->mGedouKind == GEDOU_KIND_KS_2) {
a_this->mKind2 = 4;
a_this->mResName = "Mg_f_ks";
heapSize = 0x13d0;
} else if (a_this->mGedouKind == GEDOU_KIND_BG) {
a_this->mKind2 = 5;
a_this->mResName = "Mg_f_bg";
heapSize = 0xc60;
} else if (a_this->mGedouKind == GEDOU_KIND_BT) {
a_this->mResName = "Mg_f_bt";
} else if (a_this->mGedouKind == GEDOU_KIND_SP || a_this->mGedouKind == GEDOU_KIND_KN ||
a_this->mGedouKind == GEDOU_KIND_ED || a_this->mGedouKind == GEDOU_KIND_SY) {
a_this->mResName = "Mg_f_sp";
} else if (a_this->mGedouKind == GEDOU_KIND_BB) {
a_this->mResName = "Mg_f_bb";
} else if (a_this->mGedouKind == GEDOU_KIND_LH) {
a_this->mResName = "Mg_f_lh";
} else if (a_this->mGedouKind == GEDOU_KIND_O_GD_BOTT) {
a_this->mResName = "O_gD_bott";
}
#if VERSION == VERSION_GCN_JPN
lit_1008 = 0;
#elif VERSION == VERSION_GCN_PAL
if (dComIfGs_getPalLanguage() == dSv_player_config_c::LANGUAGE_ENGLISH) {
lit_1008 = 2;
} else {
lit_1008 = 0;
}
#else
lit_1008 = 1;
#endif
cPhs_Step phase = dComIfG_resLoad(&a_this->mPhaseReq, a_this->mResName);
cPhs_Step retval = phase;
if (phase == cPhs_COMPLEATE_e) {
s32 params_0 = fopAcM_GetParam(i_this) >> 24;
if (params_0 != 0 && params_0 != 0xff &&
dComIfGs_isSwitch(params_0, fopAcM_GetRoomNo(i_this)))
{
return cPhs_ERROR_e;
}
if (a_this->mGedouKind == GEDOU_KIND_BT ||
a_this->mGedouKind == GEDOU_KIND_SP ||
a_this->mGedouKind == GEDOU_KIND_BB ||
a_this->mGedouKind == GEDOU_KIND_LH ||
a_this->mGedouKind == GEDOU_KIND_O_GD_BOTT ||
a_this->mGedouKind == GEDOU_KIND_KN ||
a_this->mGedouKind == GEDOU_KIND_ED ||
a_this->mGedouKind == GEDOU_KIND_SY)
{
s32 params_2 = fopAcM_GetParam(i_this) >> 8 & 0xff;
if (params_2 == 0xff) {
params_2 = 0x1e;
}
a_this->mJointScale = params_2 * 100;
heapSize = 0x3000;
if (a_this->mGedouKind == GEDOU_KIND_BT) {
heapSize = 0x800;
} else if (a_this->mGedouKind == GEDOU_KIND_LH) {
heapSize = 0x840;
} else if (a_this->mGedouKind == GEDOU_KIND_SP) {
heapSize = 0x1d40;
} else if (a_this->mGedouKind == GEDOU_KIND_KN) {
heapSize = 0x820;
} else if (a_this->mGedouKind == GEDOU_KIND_ED) {
heapSize = 0x800;
} else if (a_this->mGedouKind == GEDOU_KIND_SY) {
heapSize = 0x820;
}
if (!fopAcM_entrySolidHeap(i_this, useHeapInit2, heapSize)) {
return cPhs_ERROR_e;
}
return phase;
}
if (!fopAcM_entrySolidHeap(i_this, useHeapImg_fisht, heapSize)) {
return cPhs_ERROR_e;
}
if (lit_1007 == 0) {
a_this->field_0xc3f = 1;
lit_1007 = 1;
l_HIO.field_0x4 = -1;
}
a_this->mCcStatus.Init(0x1e, 0, i_this);
a_this->mCcCyl.Set(cc_cyl_src);
a_this->mCcCyl.SetStts(&a_this->mCcStatus);
i_this->cullMtx = a_this->mpMorf->getModel()->getBaseTRMtx();
fopAcM_SetMin(i_this, -200.0f, -200.0f, -200.0f);
fopAcM_SetMax(i_this, 200.0f, 200.0f, 200.0f);
a_this->mAcch.Set(&i_this->current.pos, &i_this->old.pos, i_this, 1, &a_this->mAcchCir,
&i_this->speed, NULL, NULL);
a_this->field_0xc44 = dComIfGs_getEventReg(0xf11f);
a_this->mJointScale = 0.0001f + (fopAcM_GetParam(i_this) >> 8 & 0xff) * 0.01f;
if (a_this->mGedouKind >= GEDOU_KIND_BG) {
f32 fishMaxSize;
if (lit_1008 == 1) {
fishMaxSize = dComIfGs_getFishSize(a_this->mKind2) * 2.54f;
} else {
fishMaxSize = dComIfGs_getFishSize(a_this->mKind2);
}
if (fishMaxSize > 0.1f) {
if (lit_1008 != 0) {
a_this->mJointScale = fishMaxSize * 0.01f + cM_rndFX(0.05334f);
} else {
a_this->mJointScale = fishMaxSize * 0.01f + cM_rndFX(0.021f);
}
} else {
a_this->mJointScale = cM_rndFX(0.02f) + 0.28f;
if (a_this->mGedouKind != GEDOU_KIND_BG) {
if (a_this->mGedouKind == GEDOU_KIND_LM_2) {
a_this->mJointScale += 0.04f;
} else if (a_this->mGedouKind == GEDOU_KIND_KS_2) {
a_this->mJointScale = cM_rndFX(0.039f) + 0.67f;
} else if (a_this->mGedouKind == GEDOU_KIND_CF_2) {
a_this->mJointScale += 0.1f;
} else {
a_this->mJointScale += 0.1f;
}
}
}
} else {
if (a_this->mGedouKind <= GEDOU_KIND_CF_1) {
f32 jointScale = 100.0f * a_this->mJointScale;
f32 fVar1 =
lit_1008 == 1 ?
dComIfGs_getEventReg(check_kind[a_this->mGedouKind << 0]) * 2.54f :
dComIfGs_getEventReg(check_kind[a_this->mGedouKind << 0]);
if ((s32)jointScale <= (s32)fVar1) {
a_this->mJointScale = fVar1 * 0.01f;
f32 fVar2 = 0.05f;
if (a_this->mGedouKind == GEDOU_KIND_RI_1) {
fVar2 = 0.15f;
} else if (fVar1 >= 0.6f) {
fVar2 = 0.03f;
}
if (cM_rndF(1.0f) < fVar2) {
if (lit_1008 != 0) {
a_this->mJointScale += 0.028194f;
} else {
a_this->mJointScale += 0.0111f;
}
} else if (a_this->mGedouKind == GEDOU_KIND_RI_1) {
a_this->mJointScale *= 1.0f - cM_rndF(0.1f);
} else {
a_this->mJointScale *= 1.0f - cM_rndF(0.3f);
}
if (a_this->field_0xc44 >= 20 ||
(a_this->mGedouKind != GEDOU_KIND_RI_1 && cM_rndF(1.0f) < 0.2f))
{
a_this->mJointScale *= 0.8f;
} else if (a_this->field_0xc44 >= 10) {
a_this->mJointScale *= 0.85f;
} else if (a_this->field_0xc44 >= 5) {
a_this->mJointScale *= 0.9f;
}
}
if (a_this->mJointScale < 0.42f) {
a_this->mJointScale = cM_rndF(0.05f) + 0.4f;
}
}
}
if (a_this->mJointScale > fish_max[a_this->mGedouKind]) {
a_this->mJointScale = fish_max[a_this->mGedouKind];
}
a_this->mAcchCir.SetWall(3.0f * a_this->mJointScale, 30.0f * a_this->mJointScale);
a_this->mBobTimer = cM_rndF(65536.0f);
a_this->jointYaws2[1] = cM_rndF(65536.0f);
a_this->mSound.init(&i_this->current.pos, &i_this->current.pos, 3, 1);
a_this->field_0x660 = 1.0f;
a_this->field_0x5ec = l_HIO.field_0x10;
if (a_this->mGedouKind == GEDOU_KIND_RI_1) {
a_this->mCurAction = ACTION_MG_FISH_RI_SWIM;
a_this->mActionPhase = 2;
a_this->field_0x624[0] = cM_rndF(200.0f) + 300.0f;
} else if (a_this->mGedouKind == GEDOU_KIND_CF_1) {
a_this->mCurAction = ACTION_MG_FISH_MF_SWIM_P;
a_this->field_0x5ec = 500.0f;
} else if (a_this->mGedouKind >= GEDOU_KIND_BG) {
a_this->mCurAction = ACTION_MG_FISH_MF_SWIM_S;
a_this->field_0x5ec = l_HIO.field_0x14;
if (flag1) {
a_this->field_0x5ec = 20000.0f;
} else {
a_this->field_0x5ec = 1000.0f;
}
a_this->field_0x624[2] = cM_rndF(1000.0f) + 1000.0f;
} else {
a_this->mCurAction = ACTION_MG_FISH_MF_STAY;
a_this->mActionPhase = 2;
}
s16 newYaw = cM_rndF(65536.0f);
i_this->current.angle.y = newYaw;
i_this->shape_angle.y = newYaw;
a_this->mMovementYaw = newYaw;
if (strcmp(dComIfGp_getStartStageName(), "R_SP127") == 0) {
a_this->mSurfaceY = 200.0f;
a_this->mGroundY = 60.0f;
i_this->current.pos.set(cM_rndFX(30.0f) + -720.0f, cM_rndF(30.0f) + 110.0f,
cM_rndFX(180.0f) + 70.0f);
if (a_this->mGedouKind == GEDOU_KIND_RI_1) {
a_this->mCurAction = ACTION_MG_FISH_RI_AQUA;
} else {
a_this->mCurAction = ACTION_MG_FISH_MF_AQUA;
if (a_this->mGedouKind == GEDOU_KIND_BG) {
a_this->mJointScale = cM_rndFX(0.03f) + 0.25f;
}
}
a_this->mActionPhase = 0;
} else if (strcmp(dComIfGp_getStartStageName(), "F_SP127") != 0) {
a_this->mSurfaceY = 200000.0f;
}
a_this->mDistToPlayer = 100000.0f;
a_this->field_0x632 = 20;
a_this->mNodeCallBack = nodeCallBack2;
if (a_this->mGedouKind < GEDOU_KIND_BG) {
a_this->field_0xc40 = 50.0f * a_this->field_0xc44 + 500.0f;
} else {
a_this->field_0xc40 = 300.0f;
}
daMg_Fish_Execute(a_this);
}
return retval;
}
static actor_method_class l_daMg_Fish_Method = {
(process_method_func)daMg_Fish_Create,
(process_method_func)daMg_Fish_Delete,
(process_method_func)daMg_Fish_Execute,
(process_method_func)daMg_Fish_IsDelete,
(process_method_func)daMg_Fish_Draw,
};
actor_process_profile_definition g_profile_MG_FISH = {
(uint)fpcLy_CURRENT_e, // mLayerID
7, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_MG_FISH, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(mg_fish_class), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
720, // mPriority
&l_daMg_Fish_Method, // sub_method
0x00040100, // mStatus
fopAc_ACTOR_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};
AUDIO_INSTANCES