mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 15:01:33 -04:00
4807 lines
151 KiB
C++
4807 lines
151 KiB
C++
/**
|
|
* d_a_ship.cpp
|
|
* King of Red Lions
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_ship.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_s_play.h" // IWYU pragma: keep
|
|
#include "m_Do/m_Do_mtx.h"
|
|
#include "d/d_drawlist.h"
|
|
#include "f_op/f_op_actor_mng.h"
|
|
#include "f_op/f_op_kankyo_mng.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
#include "d/d_kankyo_wether.h"
|
|
#include "d/actor/d_a_sea.h"
|
|
#include "d/d_path.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
#include "f_op/f_op_camera.h"
|
|
#include "d/actor/d_a_tornado.h"
|
|
#include "SSystem/SComponent/c_counter.h"
|
|
#include "d/actor/d_a_bomb.h"
|
|
#include "d/actor/d_a_grid.h"
|
|
#include "d/res/res_ship.h"
|
|
|
|
static char l_arcName[] = "Ship";
|
|
static Vec l_cannon_top = {85.0f, 0.0f, 10.0f};
|
|
static Vec l_tiller_top_offset = {34.0f, 0.0f, 15.0f};
|
|
|
|
class daShip_HIO_c0 {
|
|
public:
|
|
~daShip_HIO_c0() {}
|
|
|
|
/* 0x00 */ static const s16 tiller_speed;
|
|
/* 0x02 */ static const s16 cannon_no_gravity_timer;
|
|
/* 0x04 */ static const s16 throw_start_angle_speed;
|
|
/* 0x06 */ static const s16 throw_return_angle_speed;
|
|
/* 0x08 */ static const f32 paddle_speed;
|
|
/* 0x0C */ static const f32 min_speed;
|
|
/* 0x10 */ static const f32 wind_inc_speed;
|
|
/* 0x14 */ static const f32 r_inc_speed;
|
|
/* 0x18 */ static const f32 r_wind_inc_speed;
|
|
/* 0x1C */ static const f32 fly_rate;
|
|
/* 0x20 */ static const f32 wind_rate;
|
|
/* 0x24 */ static const f32 ef_dis_speed;
|
|
/* 0x28 */ static const f32 ef_speed_rate;
|
|
/* 0x2C */ static const f32 ef_front_x;
|
|
/* 0x30 */ static const f32 ef_front_y;
|
|
/* 0x34 */ static const f32 ef_front_z;
|
|
/* 0x38 */ static const f32 ef_back_x;
|
|
/* 0x3C */ static const f32 ef_back_y;
|
|
/* 0x40 */ static const f32 ef_back_z;
|
|
/* 0x44 */ static const f32 ef_sp_max_speed;
|
|
/* 0x48 */ static const f32 ef_pitch;
|
|
/* 0x4C */ static const f32 ef_ind_scroll;
|
|
/* 0x50 */ static const f32 ef_ind_scale;
|
|
/* 0x54 */ static const f32 cannon_speed;
|
|
/* 0x58 */ static const f32 cannon_gravity;
|
|
/* 0x5C */ static const f32 whirl_init_speed;
|
|
/* 0x60 */ static const f32 whirl_inc_speed;
|
|
/* 0x64 */ static const f32 whirl_distance;
|
|
/* 0x68 */ static const f32 tornado_init_speed;
|
|
/* 0x6C */ static const f32 tornado_inc_speed;
|
|
/* 0x70 */ static const f32 tornado_distance;
|
|
/* 0x74 */ static const f32 tornado_pull_speed;
|
|
/* 0x78 */ static const f32 throw_start_speedF;
|
|
/* 0x7C */ static const f32 throw_start_speed_y;
|
|
};
|
|
|
|
// TODO: Use these named constants in the code instead of literals
|
|
const s16 daShip_HIO_c0::tiller_speed = 700;
|
|
const s16 daShip_HIO_c0::cannon_no_gravity_timer = 8;
|
|
const s16 daShip_HIO_c0::throw_start_angle_speed = 4500;
|
|
const s16 daShip_HIO_c0::throw_return_angle_speed = 3600;
|
|
const f32 daShip_HIO_c0::paddle_speed = 10.0f; // TODO
|
|
const f32 daShip_HIO_c0::min_speed = 0.0f; // TODO
|
|
const f32 daShip_HIO_c0::wind_inc_speed = 55.0f; // TODO
|
|
const f32 daShip_HIO_c0::r_inc_speed = 0.0f; // TODO
|
|
const f32 daShip_HIO_c0::r_wind_inc_speed = 0.0f; // TODO
|
|
const f32 daShip_HIO_c0::fly_rate = 0.6f; // TODO
|
|
const f32 daShip_HIO_c0::wind_rate = 0.5f; // TODO
|
|
const f32 daShip_HIO_c0::ef_dis_speed = 2.0f;
|
|
const f32 daShip_HIO_c0::ef_speed_rate = 0.7f;
|
|
const f32 daShip_HIO_c0::ef_front_x = -80.0f;
|
|
const f32 daShip_HIO_c0::ef_front_y = -50.0f;
|
|
const f32 daShip_HIO_c0::ef_front_z = -150.0f;
|
|
const f32 daShip_HIO_c0::ef_back_x = -40.0f;
|
|
const f32 daShip_HIO_c0::ef_back_y = -100.0f;
|
|
const f32 daShip_HIO_c0::ef_back_z = -350.0f;
|
|
const f32 daShip_HIO_c0::ef_sp_max_speed = 30.0f;
|
|
const f32 daShip_HIO_c0::ef_pitch = 1.0f; // TODO
|
|
const f32 daShip_HIO_c0::ef_ind_scroll = -0.04f;
|
|
const f32 daShip_HIO_c0::ef_ind_scale = 4.0f;
|
|
const f32 daShip_HIO_c0::cannon_speed = 110.0f;
|
|
const f32 daShip_HIO_c0::cannon_gravity = -2.5f;
|
|
const f32 daShip_HIO_c0::whirl_init_speed = 10.0f; // TODO
|
|
const f32 daShip_HIO_c0::whirl_inc_speed = 30.0f; // TODO
|
|
const f32 daShip_HIO_c0::whirl_distance = 4000.0f;
|
|
const f32 daShip_HIO_c0::tornado_init_speed = 30.0f; // TODO
|
|
const f32 daShip_HIO_c0::tornado_inc_speed = 40.0f; // TODO
|
|
const f32 daShip_HIO_c0::tornado_distance = 6000.0f;
|
|
const f32 daShip_HIO_c0::tornado_pull_speed = 5.0f; // TODO
|
|
const f32 daShip_HIO_c0::throw_start_speedF = 150.0f;
|
|
const f32 daShip_HIO_c0::throw_start_speed_y = 50.0f;
|
|
|
|
static daShip_HIO_c0 l_HIO;
|
|
static cXyz l_rope_base_vec(0.0f, -10.0f, 0.0f);
|
|
|
|
/* 000000EC-0000023C .text bodyJointCallBack__8daShip_cFi */
|
|
BOOL daShip_c::bodyJointCallBack(int jno) {
|
|
J3DModel *pModel = mpBodyAnm->getModel();
|
|
|
|
if ((jno == 10) || (jno == 5)) {
|
|
mDoMtx_stack_c::ZrotS(m0366);
|
|
}
|
|
else if (jno == 7) {
|
|
mDoMtx_stack_c::ZrotS(-mSailAngle);
|
|
}
|
|
else if (jno == 6) {
|
|
mDoMtx_stack_c::ZrotS(0xC000);
|
|
mDoMtx_stack_c::revConcat(pModel->getAnmMtx(jno));
|
|
mpSalvageArmModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mDoMtx_stack_c::YrotM(-0x8000);
|
|
mpCannonModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mDoMtx_stack_c::scaleS(m03E8, m03E8, m03E8);
|
|
}
|
|
mDoMtx_stack_c::revConcat(pModel->getAnmMtx(jno));
|
|
pModel->setAnmMtx(jno, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000023C-00000284 .text daShip_bodyJointCallBack__FP7J3DNodei */
|
|
static BOOL daShip_bodyJointCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = static_cast<J3DJoint*>(node);
|
|
s32 jntNo = joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
daShip_c* i_this = reinterpret_cast<daShip_c*>(model->getUserArea());
|
|
if (i_this) {
|
|
i_this->bodyJointCallBack(jntNo);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000284-0000033C .text cannonJointCallBack__8daShip_cFi */
|
|
BOOL daShip_c::cannonJointCallBack(int jno) {
|
|
if (jno == 1) {
|
|
mDoMtx_stack_c::XrotS(m0394);
|
|
}
|
|
else {
|
|
mDoMtx_stack_c::YrotS(-m0396);
|
|
}
|
|
mDoMtx_stack_c::revConcat(mpCannonModel->getAnmMtx(jno));
|
|
mpCannonModel->setAnmMtx(jno, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000033C-00000380 .text daShip_cannonJointCallBack__FP7J3DNodei */
|
|
static BOOL daShip_cannonJointCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = static_cast<J3DJoint*>(node);
|
|
s32 jntNo = joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
daShip_c* i_this = reinterpret_cast<daShip_c*>(model->getUserArea());
|
|
i_this->cannonJointCallBack(jntNo);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000380-00000414 .text craneJointCallBack__8daShip_cFv */
|
|
BOOL daShip_c::craneJointCallBack() {
|
|
mDoMtx_stack_c::ZrotS(-(m0398 + m039C));
|
|
mDoMtx_stack_c::revConcat(mpSalvageArmModel->getAnmMtx(1));
|
|
mpSalvageArmModel->setAnmMtx(1, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000414-00000450 .text daShip_craneJointCallBack__FP7J3DNodei */
|
|
static BOOL daShip_craneJointCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daShip_c* i_this = reinterpret_cast<daShip_c*>(model->getUserArea());
|
|
i_this->craneJointCallBack();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000450-00000474 .text headJointCallBack0__8daShip_cFv */
|
|
BOOL daShip_c::headJointCallBack0() {
|
|
J3DAnmTransform* tempAnmTransform;
|
|
if (mAnmTransform) {
|
|
tempAnmTransform = mpHeadAnm->getAnm();
|
|
mpHeadAnm->mpAnm = mAnmTransform;
|
|
mAnmTransform = tempAnmTransform;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000474-000004B0 .text daShip_headJointCallBack0__FP7J3DNodei */
|
|
static BOOL daShip_headJointCallBack0(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daShip_c* i_this = reinterpret_cast<daShip_c*>(model->getUserArea());
|
|
i_this->headJointCallBack0();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000004B0-000005E4 .text headJointCallBack1__8daShip_cFi */
|
|
BOOL daShip_c::headJointCallBack1(int jno) {
|
|
MtxP jointAnmMtx = mpHeadAnm->getModel()->getAnmMtx(jno);
|
|
float fVar1 = jointAnmMtx[0][3];
|
|
float fVar2 = jointAnmMtx[1][3];
|
|
float fVar3 = jointAnmMtx[2][3];
|
|
|
|
short sVar5 = shape_angle.y + m03A2 * (jno + -2);
|
|
mDoMtx_stack_c::YrotS(sVar5);
|
|
mDoMtx_stack_c::ZXYrotM(m03A0, m03A2, 0);
|
|
mDoMtx_stack_c::YrotM(-sVar5);
|
|
mDoMtx_stack_c::concat(mpHeadAnm->getModel()->getAnmMtx(jno));
|
|
|
|
mDoMtx_stack_c::get()[0][3] = fVar1;
|
|
mDoMtx_stack_c::get()[1][3] = fVar2;
|
|
mDoMtx_stack_c::get()[2][3] = fVar3;
|
|
|
|
mpHeadAnm->getModel()->setAnmMtx(jno, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000005E4-00000628 .text daShip_headJointCallBack1__FP7J3DNodei */
|
|
static BOOL daShip_headJointCallBack1(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = static_cast<J3DJoint*>(node);
|
|
s32 jntNo = joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
daShip_c* i_this = reinterpret_cast<daShip_c*>(model->getUserArea());
|
|
i_this->headJointCallBack1(jntNo);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000628-00000AD8 .text draw__8daShip_cFv */
|
|
BOOL daShip_c::draw() {
|
|
static GXColor rope_color = {0xC8, 0x96, 0x32, 0xFF};
|
|
J3DModel* model = mpBodyAnm->getModel();
|
|
J3DModel* model_00 = mpHeadAnm->getModel();
|
|
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(model, &tevStr);
|
|
g_env_light.setLightTevColorType(model_00, &tevStr);
|
|
|
|
dComIfGd_setListP1();
|
|
|
|
if (m02A0 && m02A4) {
|
|
j3dSys.onFlag(J3DSysFlag_SkinPosCpu);
|
|
j3dSys.onFlag(J3DSysFlag_SkinNrmCpu);
|
|
|
|
cXyz local_5c(current.pos.x, current.pos.y + m03D8 + 5.0f, current.pos.z);
|
|
|
|
f32 x = local_5c.x;
|
|
f32 y = local_5c.y;
|
|
f32 z = local_5c.z;
|
|
z += cM_scos(m037C) * 10000.0f * cM_scos(shape_angle.y);
|
|
y -= cM_ssin(m037C) * 10000.0f;
|
|
x += cM_scos(m037C) * 10000.0f * cM_ssin(shape_angle.y);
|
|
cXyz local_68(x, y, z);
|
|
Mtx MStack_50;
|
|
cMtx_lookAt(MStack_50, &local_5c, &local_68, m037E);
|
|
mDoMtx_stack_c::YrotS(0xC000);
|
|
mDoMtx_stack_c::XrotM(-0x8000);
|
|
mDoMtx_stack_c::scaleM(1.0f, 2.0f, 0.25f);
|
|
mDoMtx_stack_c::concat(MStack_50);
|
|
mDoMtx_stack_c::revConcat(m02A8);
|
|
m02A0->setEffectMtx(mDoMtx_stack_c::get());
|
|
m02A4->setTranslationX(m03D4);
|
|
}
|
|
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) || dComIfGp_getAttention().Lockon() || daPy_getPlayerLinkActorClass()->getBodyAngleX() > -0x1000) {
|
|
mDoExt_modelEntryDL(model);
|
|
}
|
|
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) || daPy_getPlayerLinkActorClass()->checkNoControll() || !dComIfGp_checkCameraAttentionStatus(0, 0x22)) {
|
|
offStateFlg(daSFLG_HEAD_NO_DRAW_e);
|
|
mDoExt_modelEntryDL(model_00);
|
|
}
|
|
else {
|
|
onStateFlg(daSFLG_HEAD_NO_DRAW_e);
|
|
}
|
|
|
|
if (mPart == PART_CANNON_e) {
|
|
g_env_light.setLightTevColorType(mpCannonModel, &tevStr);
|
|
mDoExt_modelEntryDL(mpCannonModel);
|
|
}
|
|
else if (mPart == PART_CRANE_e) {
|
|
g_env_light.setLightTevColorType(mpSalvageArmModel, &tevStr);
|
|
mDoExt_modelEntryDL(mpSalvageArmModel);
|
|
if (mRopeCnt >= 2) {
|
|
mRopeLine.update(mRopeCnt, 5.0f, rope_color, 0, &tevStr);
|
|
dComIfGd_set3DlineMat(&mRopeLine);
|
|
}
|
|
g_env_light.setLightTevColorType(mpLinkModel, &tevStr);
|
|
mDoExt_modelUpdateDL(mpLinkModel);
|
|
}
|
|
|
|
dComIfGd_setList();
|
|
|
|
mShadowId = dComIfGd_setShadow(mShadowId, 0, model, ¤t.pos, 1500.0f, 250.0f,
|
|
current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd,
|
|
&tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
|
|
if (mShadowId != 0) {
|
|
dComIfGd_addRealShadow(mShadowId, model_00);
|
|
if (mPart == PART_CANNON_e) {
|
|
dComIfGd_addRealShadow(mShadowId, mpCannonModel);
|
|
}
|
|
else if (mPart == PART_CRANE_e) {
|
|
dComIfGd_addRealShadow(mShadowId, mpSalvageArmModel);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000B14-00000B34 .text daShip_Draw__FP8daShip_c */
|
|
static BOOL daShip_Draw(daShip_c* i_this) {
|
|
return ((daShip_c*)i_this)->draw();
|
|
}
|
|
|
|
/* 00000B34-00000DAC .text checkForceMessage__8daShip_cFv */
|
|
BOOL daShip_c::checkForceMessage() {
|
|
if (dComIfGs_isGetItem(1, 0) && !dComIfGs_isEventBit(0x908)) {
|
|
mNextMessageNo = 0x5E0;
|
|
}
|
|
else if (dComIfGs_isSymbol(1) && !dComIfGs_isEventBit(0xA80)) {
|
|
mNextMessageNo = 0x5EC;
|
|
}
|
|
else if (dComIfGs_isSymbol(2) && !dComIfGs_isEventBit(0xA08)) {
|
|
mNextMessageNo = 0x5F6;
|
|
}
|
|
else if (dComIfGs_isEventBit(dSv_evtBit_c::ENDLESS_NIGHT) && !dComIfGs_isEventBit(0xA01)) {
|
|
mNextMessageNo = 0x607;
|
|
}
|
|
else if (dComIfGs_checkGetItem(dItem_BOMB_BAG_e) && !dComIfGs_isEventBit(0x1F02)) {
|
|
mNextMessageNo = 0x624;
|
|
}
|
|
else if (dComIfGs_isSymbol(0) && !dComIfGs_isEventBit(0x2F20)) {
|
|
mNextMessageNo = 0xD5A;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2D10) && !daPy_getPlayerActorClass()->checkMasterSwordEquip()) {
|
|
mNextMessageNo = 0xD65;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3E01) && !dComIfGs_isEventBit(0x3F80)) {
|
|
mNextMessageNo = 0x1688;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2D02) && !dComIfGs_isEventBit(0x3201)) {
|
|
mNextMessageNo = 0x1645;
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000DAC-00001734 .text setInitMessage__8daShip_cFv */
|
|
void daShip_c::setInitMessage() {
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
return;
|
|
}
|
|
else if (!dComIfGs_isGetItem(1, 0)) {
|
|
mNextMessageNo = 0x5de;
|
|
}
|
|
else if (checkForceMessage()) {
|
|
return;
|
|
}
|
|
#if VERSION > VERSION_DEMO
|
|
else if (dComIfGs_isEventBit(0x2110) && !dComIfGs_checkGetItem(dItem_BOMB_BAG_e)) {
|
|
mNextMessageNo = 0x623;
|
|
}
|
|
#endif
|
|
else if (checkStateFlg(daSFLG_UNK800000_e)) {
|
|
mNextMessageNo = 0x636;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3D02)) {
|
|
if (!strcmp(dComIfGp_getStartStageName(), "GanonA") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonB") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonC") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonD") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonE") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonN") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonM") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonL") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonJ") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Xboss0") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Xboss1") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Xboss2") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Xboss3") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GanonK") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "GTower") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Hyrule") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "Hyroom") ||
|
|
!strcmp(dComIfGp_getStartStageName(), "kenroom")) {
|
|
mNextMessageNo = 0xd77;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd78;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2C02)) {
|
|
mNextMessageNo = 0xd76;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2C01)) {
|
|
mNextMessageNo = 0xd75;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2D08)) {
|
|
if (!strcmp(dComIfGp_getStartStageName(), "Hyrule")) {
|
|
mNextMessageNo = 0xd74;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd73;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x4004)) {
|
|
if (dComIfGs_getTriforceNum() == 8) {
|
|
mNextMessageNo = 0xd72;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd71;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2E02)) {
|
|
mNextMessageNo = 0xd70;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1610)) {
|
|
mNextMessageNo = 0xd6f;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3A02)) {
|
|
if (dComIfGs_isTact(4)) {
|
|
mNextMessageNo = 0xd6e;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd6d;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2E04)) {
|
|
mNextMessageNo = 0xd6c;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1620)) {
|
|
mNextMessageNo = 0xd6b;
|
|
}
|
|
else if (dComIfGs_isTact(3) || dComIfGs_isTact(4)) {
|
|
mNextMessageNo = 0xd6a;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3910)) {
|
|
if (!dComIfGs_isEventBit(0x3380)) {
|
|
mNextMessageNo = 0xd7b;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd69;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3040)) {
|
|
mNextMessageNo = 0xd68;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3810)) {
|
|
mNextMessageNo = 0xd67;
|
|
}
|
|
else if (daPy_getPlayerActorClass()->checkMasterSwordEquip()) {
|
|
mNextMessageNo = 0xd66;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2D10)) {
|
|
mNextMessageNo = 0xd65;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1E40)) {
|
|
if (dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) == dStageType_DUNGEON_e) {
|
|
mNextMessageNo = 0xd63;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0xd64;
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2F20)) {
|
|
mNextMessageNo = 0xd62;
|
|
}
|
|
else if (dComIfGs_isSymbol(0)) {
|
|
mNextMessageNo = 0xd5a;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1940)) {
|
|
mNextMessageNo = 0xd61;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3E10)) {
|
|
if (!dComIfGs_isEventBit(0x3E01)) {
|
|
mNextMessageNo = 0x1687;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0x3F80)) {
|
|
mNextMessageNo = 0x1689;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x1688;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1F02)) {
|
|
mNextMessageNo = 0xd60;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1F04)) {
|
|
if (!dComIfGs_isEventBit(0x2110)) {
|
|
mNextMessageNo = 0x621;
|
|
}
|
|
else {
|
|
if (dComIfGs_checkGetItem(dItem_BOMB_BAG_e)) {
|
|
mNextMessageNo = 0x624;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x623;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0xA02)) {
|
|
if (dComIfGs_isEventBit(0x2A01)) {
|
|
mNextMessageNo = 0xd5f;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0xA01)) {
|
|
mNextMessageNo = 0x608;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x607;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0xA08)) {
|
|
if (dComIfGs_isEventBit(0x2A02)) {
|
|
mNextMessageNo = 0xd5e;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0xA04)) {
|
|
mNextMessageNo = 0x5f9;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5f8;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0xA20)) {
|
|
if (dComIfGs_isSymbol(2)) {
|
|
mNextMessageNo = 0x5f6;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0x2B80)) {
|
|
mNextMessageNo = 0x5f5;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5f4;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0xA80)) {
|
|
if (dComIfGs_isEventBit(0x1980)) {
|
|
mNextMessageNo = 0xd5d;
|
|
}
|
|
else {
|
|
cXyz* windVec = dKyw_get_wind_vec();
|
|
if (abs(cM_atan2s(windVec->x, windVec->z)) < 0x1000) {
|
|
mNextMessageNo = 0x5ee;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5ef;
|
|
}
|
|
}
|
|
}
|
|
else if (dComIfGs_isEventBit(0x902)) {
|
|
if (dComIfGs_isSymbol(1)) {
|
|
mNextMessageNo = 0x5ec;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0xA10)) {
|
|
mNextMessageNo = 0x5eb;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5ea;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(dSv_evtBit_c::RODE_KORL)) {
|
|
mNextMessageNo = 0xd5c;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0x908)) {
|
|
mNextMessageNo = 0x5df;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5e0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001734-00001BD0 .text setNextMessage__8daShip_cFP9msg_class */
|
|
BOOL daShip_c::setNextMessage(msg_class* msg) {
|
|
u32 currMessageNo;
|
|
|
|
currMessageNo = mNextMessageNo;
|
|
if (currMessageNo != 0x5dd && currMessageNo != 0x5de && currMessageNo != 0x5df &&
|
|
currMessageNo != 0x5eb && currMessageNo != 0x5ee && currMessageNo != 0x5ef &&
|
|
currMessageNo != 0x5f5 && currMessageNo != 0x5f9 &&
|
|
currMessageNo != 0x608 && currMessageNo != 0x609 && currMessageNo != 0x60a &&
|
|
currMessageNo != 0x621 && currMessageNo != 0x623 && currMessageNo != 0x636 &&
|
|
(currMessageNo < 0xd5c || currMessageNo > 0xd78) &&
|
|
currMessageNo != 0xd7b && currMessageNo != 0x164c &&
|
|
currMessageNo != 0x1650 && currMessageNo != 0x1651 &&
|
|
currMessageNo != 0x1684 && currMessageNo != 0x1685 &&
|
|
currMessageNo != 0x1687 && currMessageNo != 0x1689)
|
|
{
|
|
if (currMessageNo == 0x5e4) {
|
|
dComIfGs_onEventBit(0x908);
|
|
}
|
|
else if (currMessageNo == 0x5ea) {
|
|
dComIfGs_onEventBit(0xa10);
|
|
}
|
|
else if (currMessageNo == 0x5ed) {
|
|
dComIfGs_onEventBit(0xa80);
|
|
}
|
|
else if (currMessageNo == 0x5f4) {
|
|
dComIfGs_onEventBit(0x2b80);
|
|
}
|
|
else if (currMessageNo == 0x5f7) {
|
|
dComIfGs_onEventBit(0xa08);
|
|
}
|
|
else if (currMessageNo == 0x5f8) {
|
|
dComIfGs_onEventBit(0xa04);
|
|
}
|
|
else if (currMessageNo == 0x607) {
|
|
dComIfGs_onEventBit(0xa01);
|
|
}
|
|
else if (currMessageNo == 0x622) {
|
|
dComIfGs_onEventBit(0x1f01);
|
|
}
|
|
else if (currMessageNo == 0x624) {
|
|
dComIfGs_onEventBit(0x1f02);
|
|
}
|
|
else if (currMessageNo == 0xd5b) {
|
|
dComIfGs_onEventBit(0x2f20);
|
|
}
|
|
else if (currMessageNo == 0x1682) {
|
|
dComIfGs_onEventBit(0x3d04);
|
|
#if VERSION > VERSION_DEMO
|
|
mNextMessageNo = 0;
|
|
#endif
|
|
}
|
|
else if (currMessageNo == 0x1688) {
|
|
dComIfGs_onEventBit(0x3f80);
|
|
}
|
|
else {
|
|
if (currMessageNo == 0x168c) {
|
|
dComIfGs_onEventBit(0x3840);
|
|
}
|
|
else {
|
|
if (currMessageNo == 0x5e0) {
|
|
mNextMessageNo = 0x5e1;
|
|
}
|
|
else if (currMessageNo == 0x5e1) {
|
|
mNextMessageNo = 0x5e2;
|
|
}
|
|
else if (currMessageNo == 0x5e2) {
|
|
if (msg->mSelectNum == 0) {
|
|
mNextMessageNo = 0x5e4;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5e3;
|
|
}
|
|
}
|
|
else if (currMessageNo == 0x5e3) {
|
|
mNextMessageNo = 0x5e1;
|
|
}
|
|
else if (currMessageNo == 0x5ec) {
|
|
mNextMessageNo = 0x5ed;
|
|
}
|
|
else if (currMessageNo == 0x5f6) {
|
|
mNextMessageNo = 0x5f7;
|
|
}
|
|
else if (currMessageNo == 0xd5a) {
|
|
mNextMessageNo = 0xd5b;
|
|
}
|
|
else if (currMessageNo == 0x1645) {
|
|
mNextMessageNo = 0x1646;
|
|
}
|
|
else if (currMessageNo == 0x1646) {
|
|
mNextMessageNo = 0x1647;
|
|
}
|
|
else if (currMessageNo == 0x1647) {
|
|
mNextMessageNo = 0x1648;
|
|
}
|
|
else if (currMessageNo == 0x1648) {
|
|
mNextMessageNo = 0x1649;
|
|
}
|
|
else if (currMessageNo == 0x1649) {
|
|
mNextMessageNo = 0x164a;
|
|
}
|
|
else if (currMessageNo == 0x164a) {
|
|
mNextMessageNo = 0x164b;
|
|
}
|
|
else if (currMessageNo == 0x164b) {
|
|
dComIfGs_onEventBit(0x3201);
|
|
mNextMessageNo = 0x164c;
|
|
}
|
|
else if (currMessageNo == 0x164d) {
|
|
mNextMessageNo = 0x164e;
|
|
}
|
|
else if (currMessageNo == 0x164e) {
|
|
mNextMessageNo = 0x164f;
|
|
}
|
|
else if (currMessageNo == 0x164f) {
|
|
dComIfGs_onEventBit(0x3380);
|
|
if (dComIfGs_getTriforceNum() > 0) {
|
|
mNextMessageNo = 0x1650;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x1651;
|
|
}
|
|
}
|
|
else if (currMessageNo == 0x1683) {
|
|
dComIfGs_onEventBit(0x3e20);
|
|
if (dComIfGs_getItem(12) != dItem_NONE_e) {
|
|
mNextMessageNo = 0x1685;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x1684;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001BD0-00001C24 .text seStart__8daShip_cFUlP4cXyz */
|
|
void daShip_c::seStart(u32 i_seNum, cXyz* i_sePos) {
|
|
mDoAud_seStart(i_seNum, i_sePos, 0, m034A);
|
|
}
|
|
|
|
/* 00001C24-00001D50 .text setSailAngle__8daShip_cFv */
|
|
void daShip_c::setSailAngle() {
|
|
short sVar1;
|
|
cXyz* windVec = dKyw_get_wind_vec();
|
|
if (mTornadoActor) {
|
|
sVar1 = (s16)(m03AA + 0x4000) - shape_angle.y;
|
|
}
|
|
else {
|
|
sVar1 = cM_atan2s(windVec->x, windVec->z) - shape_angle.y;
|
|
}
|
|
if (sVar1 > 0x800) {
|
|
m0380 = -0x1555;
|
|
}
|
|
else {
|
|
if (sVar1 < -0x800) {
|
|
m0380 = 0x1555;
|
|
}
|
|
else if (m0380 == 0) {
|
|
if (sVar1 >= 0) {
|
|
m0380 = -0x1555;
|
|
}
|
|
else {
|
|
m0380 = 0x1555;
|
|
}
|
|
}
|
|
}
|
|
cLib_addCalcAngleS(&mSailAngle, m0380, 0x10, 0x800, 0x20);
|
|
m0378 = mSailAngle >> 1;
|
|
if (mSailAngle * m0380 < 0) {
|
|
if (!checkStateFlg(daSFLG_UNK2_e)) {
|
|
seStart(JA_SE_SHIP_SAIL_MOVE, &m0444);
|
|
onStateFlg(daSFLG_UNK2_e);
|
|
}
|
|
}
|
|
else {
|
|
offStateFlg(daSFLG_UNK2_e);
|
|
}
|
|
}
|
|
|
|
/* 00001D50-00001E08 .text setControllAngle__8daShip_cFs */
|
|
void daShip_c::setControllAngle(short angle) {
|
|
short sVar1 = angle - m036C;
|
|
short sVar2 = sVar1 * 0.05f;
|
|
if (sVar2 == 0) {
|
|
if (sVar1 > 0) {
|
|
sVar2 = 1;
|
|
}
|
|
else if (sVar1 < 0) {
|
|
sVar2 = -1;
|
|
}
|
|
}
|
|
m036E += sVar2;
|
|
m036C += m036E;
|
|
cLib_addCalcAngleS(&m036E, 0, 0x14, 0x1000, 4);
|
|
}
|
|
|
|
/* 00001E08-00001E9C .text getMaxWaterY__8daShip_cFP4cXyz */
|
|
void daShip_c::getMaxWaterY(cXyz* shipPos) {
|
|
if (daSea_ChkArea(shipPos->x, shipPos->z)) {
|
|
shipPos->y = daSea_calcWave(shipPos->x, shipPos->z);
|
|
if (m03F8 > shipPos->y) {
|
|
shipPos->y = m03F8;
|
|
}
|
|
}
|
|
else {
|
|
if (m03F8 != -G_CM3D_F_INF) {
|
|
shipPos->y = m03F8;
|
|
}
|
|
else {
|
|
shipPos->y = m03F4;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001E9C-00002314 .text setWaveAngle__8daShip_cFPsPs */
|
|
void daShip_c::setWaveAngle(short* param1, short* param2) {
|
|
static cXyz local_front(0.0f, 0.0f, 180.0f);
|
|
static cXyz local_back(0.0f, 0.0f, -190.0f);
|
|
static cXyz local_right(-80.0f, 0.0f, 0.0f);
|
|
static cXyz local_left(80.0f, 0.0f, 0.0f);
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
|
|
cXyz frontPos;
|
|
cXyz leftPos;
|
|
cXyz rightPos;
|
|
cXyz backPos;
|
|
|
|
mDoMtx_stack_c::multVec(&local_front, &frontPos);
|
|
mDoMtx_stack_c::multVec(&local_back, &backPos);
|
|
mDoMtx_stack_c::multVec(&local_right, &rightPos);
|
|
mDoMtx_stack_c::multVec(&local_left, &leftPos);
|
|
|
|
getMaxWaterY(&frontPos);
|
|
getMaxWaterY(&backPos);
|
|
getMaxWaterY(&rightPos);
|
|
getMaxWaterY(&leftPos);
|
|
|
|
cXyz local_9c = frontPos - backPos;
|
|
cXyz local_a8 = rightPos - leftPos;
|
|
|
|
*param2 = cM_atan2s(-local_a8.y, local_a8.absXZ());
|
|
*param1 = cM_atan2s(-local_9c.y, local_9c.absXZ());
|
|
|
|
s16 iVar2 = *param2 - m0372;
|
|
s16 iVar3 = *param1 - m0370;
|
|
|
|
m0376 += (iVar2 * 0.045f);
|
|
m0372 += m0376;
|
|
|
|
cLib_addCalcAngleS(&m0376, 0, 0x14, 0x1000, 4);
|
|
m0374 += (iVar3 * 0.045f);
|
|
m0370 += m0374;
|
|
cLib_addCalcAngleS(&m0374, 0, 0x14, 0x1000, 4);
|
|
}
|
|
|
|
/* 00002314-000023E0 .text getWaterY__8daShip_cFv */
|
|
f32 daShip_c::getWaterY() {
|
|
f32 waterY;
|
|
BOOL waterHit = mAcch.ChkWaterHit();
|
|
if (waterHit) {
|
|
m03F8 = mAcch.m_wtr.GetHeight();
|
|
}
|
|
else {
|
|
m03F8 = -G_CM3D_F_INF;
|
|
}
|
|
if (daSea_ChkArea(current.pos.x, current.pos.z)) {
|
|
waterY = daSea_calcWave(current.pos.x, current.pos.z);
|
|
if (!waterHit || waterY > m03F8) {
|
|
return waterY;
|
|
}
|
|
}
|
|
if (waterHit) {
|
|
waterY = m03F8;
|
|
}
|
|
else {
|
|
#if VERSION == VERSION_DEMO
|
|
waterY = m03F4;
|
|
#else
|
|
daPy_lk_c* link = daPy_getPlayerLinkActorClass();
|
|
if (link && link->checkBowMiniGame()) {
|
|
waterY = 0.0f;
|
|
}
|
|
else {
|
|
waterY = m03F4;
|
|
}
|
|
#endif
|
|
}
|
|
return waterY;
|
|
}
|
|
|
|
/* 000023E0-00002824 .text setYPos__8daShip_cFv */
|
|
void daShip_c::setYPos() {
|
|
float fVar5;
|
|
float fVar4;
|
|
float fVar2;
|
|
|
|
m03F4 = getWaterY();
|
|
if (!checkStateFlg(daSFLG_UNK10_e)) {
|
|
onStateFlg(daSFLG_UNK10_e);
|
|
if (mCurMode != MODE_START_MODE_WARP_e && mCurMode != MODE_START_MODE_THROW_e && m0351 != DEMO_HWARP_DOWN_e) {
|
|
current.pos.y = m03F4;
|
|
}
|
|
}
|
|
|
|
if (mCurMode == 12 || mCurMode == 15 || mCurMode == 14) {
|
|
return;
|
|
}
|
|
|
|
fVar2 = m03F4 - current.pos.y;
|
|
|
|
if (checkStateFlg(daSFLG_FLY_e)) {
|
|
if (mCurMode == MODE_START_MODE_WARP_e || mCurMode == MODE_START_MODE_THROW_e) {
|
|
return;
|
|
}
|
|
if (fVar2 >= 0.0f) {
|
|
onStateFlg(daSFLG_LAND_e);
|
|
if (!checkStateFlg(daSFLG_UNK2000000_e)) {
|
|
offStateFlg(daSFLG_FLY_e);
|
|
if (speed.y < -15.0f) {
|
|
speed.y = -15.0f;
|
|
}
|
|
m03D0 = speed.y * 0.5f;
|
|
speedF *= 0.85f;
|
|
m0388 = 30;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
f32 f1 = 55.0f;
|
|
fVar2 = std::abs(speedF) / f1;
|
|
if (fVar2 > 1.0f) {
|
|
fVar2 = 1.0f;
|
|
}
|
|
|
|
current.pos.y += fVar2 * ((m03F4 - current.pos.y) * 0.1f);
|
|
m03D0 += (m03F4 - current.pos.y) * 0.05f;
|
|
|
|
if (m03D0 > 20.0f) {
|
|
m03D0 = 20.0f;
|
|
}
|
|
else if (m03D0 < -20.0f) {
|
|
m03D0 = -20.0f;
|
|
}
|
|
|
|
current.pos.y += m03D0;
|
|
m03B0 += 1000.0f + cM_rndF(1000.0f) + 500.0f * fVar2;
|
|
current.pos.y += fVar2 * 0.25f * cM_ssin(m03B0) + 0.6f;
|
|
|
|
cLib_addCalc(&m03D0, 0.0f, 0.05f, 1.0f, 0.05f);
|
|
|
|
fVar4 = current.pos.y;
|
|
fVar5 = m03F4 + 40.0f;
|
|
if (fVar4 > fVar5) {
|
|
current.pos.y = fVar5;
|
|
}
|
|
else {
|
|
fVar5 = m03F4 - 60.0f;
|
|
if (fVar4 < fVar5) {
|
|
current.pos.y = fVar5;
|
|
}
|
|
}
|
|
|
|
m03AE += (fVar2 * 0.5f + 1.0f) * (cM_rndF(800.0f) + 800.0f);
|
|
m03AC += (fVar2 * 0.5f + 1.0f) * (cM_rndF(600.0f) + 600.0f);
|
|
|
|
m0370 += fVar2 * 100.0f * cM_ssin(m03AE) + 30.0f;
|
|
m0372 += fVar2 * 115.0f * cM_ssin(m03AC) + 35.0f;
|
|
}
|
|
}
|
|
|
|
/* 00002824-00002CC4 .text checkOutRange__8daShip_cFv */
|
|
BOOL daShip_c::checkOutRange() {
|
|
dPnt* pnt;
|
|
dPath* path;
|
|
cXyz* closestPoint;
|
|
cXyz* nextPoint;
|
|
cXyz* prevPoint;
|
|
int lastIndex;
|
|
int closestIndex;
|
|
int pathIndex;
|
|
BOOL bVar4;
|
|
BOOL bVar5;
|
|
|
|
if (m034B == 0xFF) {
|
|
return FALSE;
|
|
}
|
|
|
|
pathIndex = 0;
|
|
bVar4 = FALSE;
|
|
bVar5 = dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) == dStageType_SEA_e;
|
|
path = dPath_GetRoomPath(m034B, -1);
|
|
while (path) {
|
|
pnt = path->m_points;
|
|
if (path->m_num < 3) {
|
|
path = dPath_GetNextRoomPath(path, -1);
|
|
pathIndex++;
|
|
continue;
|
|
}
|
|
if (bVar5) {
|
|
if (
|
|
(pathIndex == 0 && dComIfGs_isEventBit(0x902)) ||
|
|
(pathIndex == 1 && dComIfGs_isSymbol(2)) ||
|
|
(pathIndex == 2 && daPy_getPlayerActorClass()->checkMasterSwordEquip())
|
|
) {
|
|
path = dPath_GetNextRoomPath(path, -1);
|
|
pathIndex++;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
float minDist = FLOAT_MAX;
|
|
|
|
for (int i = 0; i < path->m_num; pnt++, i++) {
|
|
float dx = current.pos.x - pnt->m_position.x;
|
|
float dz = current.pos.z - pnt->m_position.z;
|
|
|
|
float distXZ = dx * dx + dz * dz;
|
|
|
|
if (minDist > distXZ) {
|
|
closestIndex = i;
|
|
minDist = distXZ;
|
|
closestPoint = &pnt->m_position;
|
|
}
|
|
}
|
|
|
|
lastIndex = path->m_num - 1;
|
|
|
|
if (closestIndex == lastIndex) {
|
|
nextPoint = &path->m_points->m_position;
|
|
}
|
|
else {
|
|
nextPoint = &(path->m_points + closestIndex + 1)->m_position;
|
|
}
|
|
|
|
if (closestIndex == 0) {
|
|
prevPoint = &(path->m_points + lastIndex)->m_position;
|
|
}
|
|
else {
|
|
prevPoint = &(path->m_points + closestIndex - 1)->m_position;
|
|
}
|
|
|
|
s16 angleNext = cM_atan2s(nextPoint->x - closestPoint->x, nextPoint->z - closestPoint->z);
|
|
s16 anglePrev = cM_atan2s(closestPoint->x - prevPoint->x, closestPoint->z - prevPoint->z);
|
|
s16 angleCurrent = cM_atan2s(current.pos.x - closestPoint->x, current.pos.z - closestPoint->z);
|
|
|
|
s16 diffNext = angleCurrent - angleNext;
|
|
s16 diffPrev = cM_atan2s(current.pos.x - prevPoint->x, current.pos.z - prevPoint->z) - anglePrev;
|
|
|
|
if ((s16)(angleNext - anglePrev) >= 0) {
|
|
if (diffNext < 0) {
|
|
m038C = angleNext + 0x4000;
|
|
bVar4 = TRUE;
|
|
}
|
|
if (diffPrev < 0) {
|
|
m038C = anglePrev + 0x4000;
|
|
bVar4 = TRUE;
|
|
}
|
|
}
|
|
else if (diffNext < 0 && diffPrev < 0) {
|
|
float dxNext = nextPoint->x - current.pos.x;
|
|
float dzNext = nextPoint->z - current.pos.z;
|
|
float distNext = std::sqrtf(dxNext * dxNext + dzNext * dzNext);
|
|
|
|
float dxPrev = prevPoint->x - current.pos.x;
|
|
float dzPrev = prevPoint->z - current.pos.z;
|
|
float distPrev = std::sqrtf(dxPrev * dxPrev + dzPrev * dzPrev);
|
|
|
|
if (distNext > distPrev) {
|
|
m038C = anglePrev + 0x4000;
|
|
}
|
|
else {
|
|
m038C = angleNext + 0x4000;
|
|
}
|
|
|
|
bVar4 = TRUE;
|
|
}
|
|
|
|
if (bVar4) {
|
|
if (dComIfGp_getMiniGameType() == 1) {
|
|
mNextMessageNo = 0x60a;
|
|
}
|
|
else if (bVar5 && pathIndex != 3) {
|
|
mNextMessageNo = 0x609;
|
|
}
|
|
else {
|
|
mNextMessageNo = 0x5dd;
|
|
}
|
|
|
|
onStateFlg(daSFLG_UNK400000_e);
|
|
return TRUE;
|
|
}
|
|
path = dPath_GetNextRoomPath(path, -1);
|
|
pathIndex++;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00002CC4-00002CFC .text decrementShipSpeed__8daShip_cFf */
|
|
void daShip_c::decrementShipSpeed(float decrementSpeed) {
|
|
cLib_addCalc(&speedF, decrementSpeed, 0.05f, 0.1f, 0.015f);
|
|
}
|
|
|
|
/* 00002CFC-00002D5C .text firstDecrementShipSpeed__8daShip_cFf */
|
|
void daShip_c::firstDecrementShipSpeed(float decrementSpeed) {
|
|
if (cLib_addCalc(&speedF, decrementSpeed, 0.1f, 5.0f, 1.0f) < 3.0f) {
|
|
m03E0 = 10000.0f;
|
|
}
|
|
}
|
|
|
|
/* 00002D5C-00002D90 .text getAimControllAngle__8daShip_cFs */
|
|
s16 daShip_c::getAimControllAngle(short referenceAngle) {
|
|
s16 aimControlAngle = (s16)(shape_angle.y - referenceAngle) * 7;
|
|
if (aimControlAngle > 0x600) {
|
|
aimControlAngle = 0x600;
|
|
} else if (aimControlAngle < -0x600) {
|
|
aimControlAngle = -0x600;
|
|
}
|
|
return aimControlAngle;
|
|
}
|
|
|
|
/* 00002D90-00002EE0 .text setMoveAngle__8daShip_cFs */
|
|
void daShip_c::setMoveAngle(short moveAngle) {
|
|
if (!checkForceMove()) {
|
|
s16 initialAngle = shape_angle.y;
|
|
f32 turnRate = 4.0f - std::abs(speedF) / 55.0f * 3.0f;
|
|
if (turnRate > 3.6f) {
|
|
turnRate = 3.6f;
|
|
}
|
|
else if (turnRate < 0.1f) {
|
|
turnRate = 0.1f;
|
|
}
|
|
if (m0388 >= 0xF) {
|
|
turnRate = 3.6f;
|
|
}
|
|
else {
|
|
turnRate += ((3.6f - turnRate) * m0388) / 15.0f;
|
|
}
|
|
s16 temp = -turnRate * (moveAngle >> 6);
|
|
shape_angle.y += temp;
|
|
setControllAngle(getAimControllAngle(initialAngle));
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
}
|
|
|
|
/* 00002EE0-00002FBC .text changeDemoEndProc__8daShip_cFv */
|
|
void daShip_c::changeDemoEndProc() {
|
|
offStateFlg(daSFLG_UNK8000_e);
|
|
if (checkStateFlg(daSFLG_UNK80000_e)) {
|
|
mpHeadAnm->setPlaySpeed(-1.0f);
|
|
offStateFlg(daSFLG_UNK80000_e);
|
|
}
|
|
if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) {
|
|
m0366 = 0;
|
|
offStateFlg(daSFLG_UNK4000000_e);
|
|
}
|
|
gravity = -2.5f;
|
|
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
if (mPart == PART_WAIT_e) {
|
|
procPaddleMove_init();
|
|
}
|
|
else if (mPart == PART_CANNON_e) {
|
|
procCannonReady_init();
|
|
}
|
|
else if (mPart == PART_CRANE_e) {
|
|
procCraneReady_init();
|
|
}
|
|
else {
|
|
procSteerMove_init();
|
|
}
|
|
}
|
|
else {
|
|
procWait_init();
|
|
}
|
|
}
|
|
|
|
/* 00002FBC-000031E4 .text setCrashData__8daShip_cFs */
|
|
void daShip_c::setCrashData(short param1) {
|
|
float fVar1;
|
|
float fVar2;
|
|
s16 iVar5;
|
|
if (!dComIfGp_event_runCheck()) {
|
|
if (!daPy_getPlayerLinkActorClass()->checkNoDamageMode()
|
|
#if VERSION > VERSION_DEMO
|
|
&& !daPy_getPlayerLinkActorClass()->checkNoControll()
|
|
#endif
|
|
) {
|
|
if (!checkForceMove()) {
|
|
daPy_getPlayerLinkActorClass()->onShipDrop(param1);
|
|
procWait_init();
|
|
}
|
|
}
|
|
onStateFlg(daSFLG_UNK8000000_e);
|
|
if (m03B6 == 0) {
|
|
if (speedF > l_HIO.wind_inc_speed) {
|
|
speedF = l_HIO.wind_inc_speed;
|
|
}
|
|
speedF *= l_HIO.ef_speed_rate;
|
|
iVar5 = param1 - shape_angle.y;
|
|
fVar1 = cM_ssin(iVar5);
|
|
fVar2 = cM_scos(iVar5);
|
|
m0370 += fVar2 * 3072.0f;
|
|
m0374 += fVar2 * 500.0f;
|
|
m0372 -= fVar1 * 3072.0f;
|
|
m0376 -= fVar1 * 500.0f;
|
|
m03B6 = 30;
|
|
}
|
|
else {
|
|
m03B6--;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000031E4-00003490 .text checkNextMode__8daShip_cFi */
|
|
BOOL daShip_c::checkNextMode(int i_curMode) {
|
|
if (checkStateFlg(daSFLG_UNK4_e) != 0) {
|
|
setCrashData(shape_angle.y + 0x8000);
|
|
offStateFlg(daSFLG_UNK4_e);
|
|
return TRUE;
|
|
}
|
|
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
if (mNextMode == MODE_GET_OFF_FIRST_e) {
|
|
procGetOff_init();
|
|
}
|
|
else {
|
|
procWait_init();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
if (!dComIfGp_event_runCheck()) {
|
|
cXyz* tgRVecP;
|
|
cXyz* tgHitPos;
|
|
dCcD_GObjInf* tgHitObj;
|
|
|
|
tgRVecP = NULL;
|
|
tgHitPos = NULL;
|
|
tgHitObj = NULL;
|
|
|
|
if (mSph.ChkTgHit()) {
|
|
tgRVecP = mSph.GetTgRVecP();
|
|
tgHitPos = mSph.GetTgHitPosP();
|
|
tgHitObj = mSph.GetTgHitGObj();
|
|
|
|
}
|
|
else {
|
|
dCcD_Cyl* cyl = mCyl;
|
|
for(int i = 0; i < 3; i++, cyl++) {
|
|
if (cyl->ChkTgHit()) {
|
|
tgRVecP = cyl->GetTgRVecP();
|
|
tgHitPos = cyl->GetTgHitPosP();
|
|
tgHitObj = cyl->GetTgHitGObj();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (tgHitObj && !(tgHitObj->GetAtType() - AT_TYPE_WIND)) {
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
onStateFlg((daSHIP_SFLG)(daSFLG_FLY_e | daSFLG_UNK2000000_e));
|
|
}
|
|
}
|
|
else {
|
|
if (tgRVecP) {
|
|
short sVar2;
|
|
if (tgRVecP->abs2XZ() < 0.1f) {
|
|
cXyz local_20 = current.pos - *tgHitPos;
|
|
if (local_20.abs2XZ() < 0.1f) {
|
|
sVar2 = shape_angle.y + 0x8000;
|
|
}
|
|
else {
|
|
sVar2 = cM_atan2s(local_20.x, local_20.z);
|
|
}
|
|
}
|
|
else {
|
|
sVar2 = cM_atan2s(tgRVecP->x, tgRVecP->z);
|
|
}
|
|
setCrashData(sVar2);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (i_curMode == mNextMode) {
|
|
return FALSE;
|
|
}
|
|
else if (mNextMode == MODE_PADDLE_MOVE_e) {
|
|
procPaddleMove_init();
|
|
}
|
|
else if (mNextMode == MODE_STEER_MOVE_e) {
|
|
procSteerMove_init();
|
|
}
|
|
else if (mNextMode == 9) {
|
|
procCannonReady_init();
|
|
}
|
|
else if (mNextMode == 10) {
|
|
procCraneReady_init();
|
|
}
|
|
else if (mNextMode == MODE_TACT_WARP_e) {
|
|
procTactWarp_init();
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003490-0000358C .text setPartOnAnime__8daShip_cFUc */
|
|
void daShip_c::setPartOnAnime(u8 i_part) {
|
|
J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, SHIP_BCK_FN_MAST_ON2);
|
|
mpBodyAnm->setAnm(pAnimRes, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f, 0.0f, -1.0f, NULL);
|
|
m0392 = SHIP_BCK_FN_MAST_ON2;
|
|
mPart = i_part;
|
|
if (mPart == PART_STEER_e) {
|
|
seStart(JA_SE_SHIP_SAIL_OUT, &m0444);
|
|
m03E8 = 1.0f;
|
|
}
|
|
else if (mPart == PART_CANNON_e) {
|
|
seStart(JA_SE_LK_SHIP_CANNON_OUT, &m0444);
|
|
m03E8 = 0.001f;
|
|
}
|
|
else if (mPart == PART_CRANE_e) {
|
|
seStart(JA_SE_LK_SHIP_CRANE_OUT, &m0444);
|
|
m03E8 = 0.001f;
|
|
}
|
|
}
|
|
|
|
/* 0000358C-0000366C .text setPartOffAnime__8daShip_cFv */
|
|
void daShip_c::setPartOffAnime() {
|
|
J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, SHIP_BCK_FN_MAST_OFF2);
|
|
mpBodyAnm->setAnm(pAnimRes, J3DFrameCtrl::EMode_NONE, 3.0f, 1.0f, 0.0f, -1.0f, NULL);
|
|
if (mPart == PART_CRANE_e) {
|
|
seStart(JA_SE_LK_SHIP_CRANE_IN, &m0444);
|
|
}
|
|
else if (mPart == PART_CANNON_e) {
|
|
seStart(JA_SE_LK_SHIP_CANNON_IN, &m0444);
|
|
}
|
|
else {
|
|
seStart(JA_SE_SHIP_SAIL_IN, &m0444);
|
|
}
|
|
m0392 = SHIP_BCK_FN_MAST_OFF2;
|
|
offStateFlg(daSFLG_SAIL_ON_e);
|
|
}
|
|
|
|
/* 0000366C-00003844 .text setPartAnimeInit__8daShip_cFUc */
|
|
void daShip_c::setPartAnimeInit(u8 i_part) {
|
|
float fVar1 = 1.0f - mpBodyAnm->getFrame() / mpBodyAnm->getEndFrame();
|
|
if (i_part == 0) {
|
|
if (m0392 == SHIP_BCK_FN_MAST_ON2) {
|
|
setPartOffAnime();
|
|
mpBodyAnm->setFrame(fVar1 * mpBodyAnm->getEndFrame());
|
|
}
|
|
}
|
|
else if (mPart != i_part) {
|
|
if (m0392 == SHIP_BCK_FN_MAST_ON2) {
|
|
setPartOffAnime();
|
|
mpBodyAnm->setFrame(fVar1 * mpBodyAnm->getEndFrame());
|
|
}
|
|
else if (mpBodyAnm->getPlaySpeed() < 0.01f) {
|
|
setPartOnAnime(i_part);
|
|
}
|
|
}
|
|
else if (m0392 == SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOnAnime(i_part);
|
|
mpBodyAnm->setFrame(fVar1 * mpBodyAnm->getEndFrame());
|
|
}
|
|
}
|
|
|
|
/* 00003844-00003A44 .text setSelfMove__8daShip_cFi */
|
|
void daShip_c::setSelfMove(int param_1) {
|
|
BOOL bVar1;
|
|
short sVar2;
|
|
float fVar6;
|
|
|
|
if (param_1) {
|
|
sVar2 = mStickMVal * 8192.0f * -cM_ssin(mStickMAng);
|
|
}
|
|
else {
|
|
sVar2 = 0;
|
|
}
|
|
cLib_addCalcAngleS(&m0366, sVar2, 4, l_HIO.tiller_speed, 0x100);
|
|
setMoveAngle(m0366);
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000_e) || dComIfGp_event_runCheck() || daPy_getPlayerLinkActorClass()->checkNoControll()) {
|
|
firstDecrementShipSpeed(0.0f);
|
|
}
|
|
else {
|
|
if (m03E0 <= speedF) {
|
|
firstDecrementShipSpeed(m03E0);
|
|
}
|
|
else {
|
|
if (dComIfGp_getDoStatus() == dActStts_STOP_e && (CPad_CHECK_HOLD_A(0))) {
|
|
fVar6 = cLib_addCalc(&speedF, 0.0f, 0.1f, 1.0f, 0.1f);
|
|
}
|
|
else {
|
|
fVar6 = g_mDoCPd_cpadInfo[0].mTriggerRight * 10.0f; //Not sure if this is a macro either
|
|
bVar1 = FALSE;
|
|
if (mAcch.ChkWallHit()) {
|
|
for (int i = 0; i < m03CC; i++) {
|
|
if (mAcchCir[i].ChkWallHit() && cLib_distanceAngleS(mAcchCir[i].GetWallAngleY(), shape_angle.y) > 0x5000) {
|
|
bVar1 = TRUE;
|
|
}
|
|
}
|
|
}
|
|
if (bVar1 && speedF > fVar6) {
|
|
firstDecrementShipSpeed(fVar6);
|
|
}
|
|
else {
|
|
decrementShipSpeed(fVar6);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00003A44-00003AA0 .text procWait_init__8daShip_cFv */
|
|
BOOL daShip_c::procWait_init() {
|
|
mCurMode = MODE_WAIT_e;
|
|
mProc = &daShip_c::procWait;
|
|
m037A = 0;
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003AA0-00003B94 .text procWait__8daShip_cFv */
|
|
BOOL daShip_c::procWait() {
|
|
cLib_addCalc(&speedF, 0.0f, 0.1f, 1.0f, 0.05f);
|
|
|
|
if (mpBodyAnm->getFrame() >= 7.0f) {
|
|
mPart = PART_WAIT_e;
|
|
m03E8 = 1.0f;
|
|
}
|
|
|
|
if (mNextMode == MODE_READY_FIRST_e) {
|
|
procReady_init();
|
|
}
|
|
else if (mNextMode == MODE_PADDLE_MOVE_e) {
|
|
procPaddleMove_init();
|
|
}
|
|
else if (mNextMode == MODE_START_MODE_WARP_e) {
|
|
procStartModeWarp_init();
|
|
}
|
|
else if (mNextMode == MODE_START_MODE_THROW_e) {
|
|
procStartModeThrow_init();
|
|
}
|
|
else {
|
|
setControllAngle(0);
|
|
cLib_addCalcAngleS(&m0366, 0, 2, 0x1000, 0x400);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003B94-00003BC4 .text procReady_init__8daShip_cFv */
|
|
BOOL daShip_c::procReady_init() {
|
|
mProc = &daShip_c::procReady;
|
|
mCurMode = MODE_READY_FIRST_e;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003BC4-00003C7C .text procReady__8daShip_cFv */
|
|
BOOL daShip_c::procReady() {
|
|
short playerAngle;
|
|
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e | daPyStts0_UNK1000000_e)) {
|
|
procWait_init();
|
|
}
|
|
else if (mNextMode == MODE_PADDLE_MOVE_e) {
|
|
procPaddleMove_init();
|
|
}
|
|
else {
|
|
if (mNextMode == 4) {
|
|
mCurMode = 4;
|
|
}
|
|
if (mCurMode == MODE_READY_FIRST_e) {
|
|
playerAngle = fopAcM_searchPlayerAngleY(this);
|
|
if ((s16)(playerAngle - shape_angle.y) > 0) {
|
|
playerAngle = -0x800;
|
|
}
|
|
else {
|
|
playerAngle = 0x800;
|
|
}
|
|
}
|
|
else {
|
|
playerAngle = 0;
|
|
}
|
|
setControllAngle(playerAngle);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003C7C-00003CEC .text procGetOff_init__8daShip_cFv */
|
|
BOOL daShip_c::procGetOff_init() {
|
|
mCurMode = MODE_GET_OFF_FIRST_e;
|
|
mProc = &daShip_c::procGetOff;
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
speedF = 0.0f;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003CEC-00003DEC .text procGetOff__8daShip_cFv */
|
|
BOOL daShip_c::procGetOff() {
|
|
if (mpBodyAnm->getFrame() >= 7.0f) {
|
|
mPart = PART_WAIT_e;
|
|
m03E8 = 1.0f;
|
|
}
|
|
if (mNextMode == MODE_GET_OFF_SECOND_e) {
|
|
mCurMode = MODE_GET_OFF_SECOND_e;
|
|
}
|
|
if (mCurMode == MODE_GET_OFF_SECOND_e) {
|
|
if (m036C > 0x800) {
|
|
procWait_init();
|
|
}
|
|
else {
|
|
setControllAngle(0x1000);
|
|
cLib_addCalcAngleS(&m0366, 0, 2, 0x1000, 0x400);
|
|
}
|
|
}
|
|
else {
|
|
setControllAngle(0);
|
|
cLib_addCalcAngleS(&m0366, 0, 2, 0x1000, 0x400);
|
|
|
|
if (!daPy_getPlayerLinkActorClass()->checkShipGetOff()) {
|
|
procWait_init();
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003DEC-00003F00 .text procPaddleMove_init__8daShip_cFv */
|
|
BOOL daShip_c::procPaddleMove_init() {
|
|
offStateFlg(daSFLG_UNK4_e);
|
|
|
|
mCurMode = MODE_PADDLE_MOVE_e;
|
|
|
|
mProc = &daShip_c::procPaddleMove;
|
|
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
|
|
if (checkStateFlg(daSFLG_JUMP_RIDE_e) != 0) {
|
|
offStateFlg(daSFLG_JUMP_RIDE_e);
|
|
current.pos.y -= 50.0f;
|
|
}
|
|
|
|
dComIfGs_onEventBit(dSv_evtBit_c::RODE_KORL);
|
|
|
|
if (dComIfGs_isEventBit(0xA80)) {
|
|
dComIfGs_onEventBit(0x1980);
|
|
}
|
|
|
|
if (dComIfGs_isEventBit(0xA08)) {
|
|
dComIfGs_onEventBit(0x2A02);
|
|
}
|
|
|
|
if (dComIfGs_isEventBit(0xA02)) {
|
|
dComIfGs_onEventBit(0x2A01);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003F00-00004004 .text procPaddleMove__8daShip_cFv */
|
|
BOOL daShip_c::procPaddleMove() {
|
|
if (checkNextMode(MODE_PADDLE_MOVE_e)) {
|
|
return TRUE;
|
|
}
|
|
if (mpBodyAnm->getFrame() >= 7.0f) {
|
|
mPart = PART_WAIT_e;
|
|
m03E8 = 1.0f;
|
|
}
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_BOW_AIM_e | daPyStts0_HOOKSHOT_AIM_e | daPyStts0_BOOMERANG_AIM_e | daPyStts0_TELESCOPE_LOOK_e | daPyStts0_BOOMERANG_WAIT_e) || dComIfGp_checkPlayerStatus1(0, daPyStts1_PICTO_BOX_AIM_e)) {
|
|
cLib_addCalcAngleS(&m0366, 0, 4, l_HIO.tiller_speed, 0x100);
|
|
if (!dComIfGp_event_runCheck()) {
|
|
setMoveAngle(m0366);
|
|
}
|
|
firstDecrementShipSpeed(0.0f);
|
|
}
|
|
else {
|
|
if (!dComIfGp_event_runCheck()) {
|
|
setSelfMove(1);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004004-00004060 .text procSteerMove_init__8daShip_cFv */
|
|
BOOL daShip_c::procSteerMove_init() {
|
|
offStateFlg(daSFLG_UNK4_e);
|
|
mCurMode = MODE_STEER_MOVE_e;
|
|
mProc = &daShip_c::procSteerMove;
|
|
setPartAnimeInit(PART_STEER_e);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004060-0000451C .text procSteerMove__8daShip_cFv */
|
|
BOOL daShip_c::procSteerMove() {
|
|
if (checkNextMode(MODE_STEER_MOVE_e)) {
|
|
return TRUE;
|
|
}
|
|
cLib_addCalcAngleS(&m0366, mStickMVal * 8192.0f * -cM_ssin(mStickMAng), 4, l_HIO.tiller_speed, 0x100);
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
setMoveAngle(m0366);
|
|
}
|
|
setSailAngle();
|
|
if (m0392 == SHIP_BCK_FN_MAST_ON2 && mpBodyAnm->getFrame() >= 7.0f && mPart == PART_STEER_e) {
|
|
onStateFlg(daSFLG_SAIL_ON_e);
|
|
}
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
cXyz* windVec = dKyw_get_wind_vec();
|
|
float windPower = *dKyw_get_wind_power() / 0.5f;
|
|
int angleDiff = abs((s16)(cM_atan2s(windVec->x, windVec->z) - shape_angle.y));
|
|
|
|
float windFactor;
|
|
if (angleDiff < 0x4000) {
|
|
windFactor = 1.0f - angleDiff * (1.0f / 0x10000);
|
|
} else if (angleDiff <= 0x6000) {
|
|
windFactor = 0.75f - (angleDiff - 0x4000) * 5.493164e-05f;
|
|
} else {
|
|
windFactor = 0.3f - (angleDiff - 0x6000) * 0.00032967035f;
|
|
if (windFactor < 0.0f) {
|
|
windFactor = 0.0f;
|
|
}
|
|
}
|
|
|
|
if (windPower > 1.0f) {
|
|
windPower = 1.0f;
|
|
}
|
|
windPower *= windFactor * 55.0f;
|
|
|
|
if (mpBodyAnm->mFrameCtrl.checkPass(7.0f)) {
|
|
float targetSpeed = windPower * 2.0f;
|
|
if (targetSpeed > 80.0f) {
|
|
targetSpeed = 80.0f;
|
|
}
|
|
if (speedF < targetSpeed) {
|
|
speedF = targetSpeed;
|
|
if (checkForceMove()) {
|
|
m03E0 = 10000.0f;
|
|
} else {
|
|
m03E0 = windPower;
|
|
}
|
|
}
|
|
} else {
|
|
if (m03E0 < speedF) {
|
|
firstDecrementShipSpeed(m03E0);
|
|
} else {
|
|
if (!checkStateFlg(daSFLG_SAIL_ON_e) || windPower <= 0.0f) {
|
|
decrementShipSpeed(mStickMVal * 10.0f * cM_scos(mStickMAng));
|
|
} else if (speedF >= windPower) {
|
|
decrementShipSpeed(windPower);
|
|
} else {
|
|
cLib_addCalc(&speedF, windPower, 0.1f, 0.5f, 0.1f);
|
|
}
|
|
}
|
|
}
|
|
if (!dComIfGp_event_runCheck() &&
|
|
!daPy_getPlayerLinkActorClass()->checkNoControll() &&
|
|
m0392 == SHIP_BCK_FN_MAST_ON2 &&
|
|
mpBodyAnm->getFrame() >= 7.0f &&
|
|
!checkStateFlg(daSFLG_FLY_e) &&
|
|
mFwdVel > 16.5f) {
|
|
if (!checkForceMove() && windPower >= 11.0f) {
|
|
onStateFlg(daSFLG_JUMP_OK_e);
|
|
if (mDoCPd_R_LOCK_TRIGGER(0)) {
|
|
onStateFlg((daSHIP_SFLG)(daSFLG_FLY_e | daSFLG_JUMP_e));
|
|
speed.y = windPower;
|
|
if (speed.y < 15.0f) {
|
|
speed.y = 15.0f;
|
|
} else if (speed.y > 40.0f) {
|
|
speed.y = 40.0f;
|
|
}
|
|
m0386 = 0;
|
|
current.angle.y = shape_angle.y;
|
|
mJumpRate = (speed.y - 11.0f) * 0.014545455f;
|
|
m036C >>= 1;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
setControllAngle(0);
|
|
m036E = 0;
|
|
}
|
|
if (mPart != PART_STEER_e && mpBodyAnm->getPlaySpeed() < 0.01f) {
|
|
setPartOnAnime(PART_STEER_e);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000451C-00004580 .text procCannonReady_init__8daShip_cFv */
|
|
BOOL daShip_c::procCannonReady_init() {
|
|
mCurMode = MODE_CANNON_e;
|
|
mProc = &daShip_c::procCannonReady;
|
|
setPartAnimeInit(PART_CANNON_e);
|
|
m0394 = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004580-00004634 .text procCannonReady__8daShip_cFv */
|
|
BOOL daShip_c::procCannonReady() {
|
|
if (checkNextMode(MODE_CANNON_e)) {
|
|
return TRUE;
|
|
}
|
|
cLib_addCalcAngleS(&m0366, 0, 2, 0x1000, 0x400);
|
|
setMoveAngle(m0366);
|
|
firstDecrementShipSpeed(0.0f);
|
|
if (mpBodyAnm->getPlaySpeed() < 0.01f) {
|
|
if (mPart != PART_CANNON_e) {
|
|
setPartOnAnime(PART_CANNON_e);
|
|
}
|
|
else {
|
|
procCannon_init();
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004634-0000467C .text procCannon_init__8daShip_cFv */
|
|
BOOL daShip_c::procCannon_init() {
|
|
mProc = &daShip_c::procCannon;
|
|
m0366 = 0;
|
|
speedF = 0.0f;
|
|
m03A6 = 0;
|
|
m03A8 = 0;
|
|
m037A = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000467C-00004B08 .text procCannon__8daShip_cFv */
|
|
BOOL daShip_c::procCannon() {
|
|
BOOL bVar1;
|
|
fopAc_ac_c* target;
|
|
cXyz cannonPos;
|
|
|
|
if (checkNextMode(MODE_CANNON_e)) {
|
|
return TRUE;
|
|
}
|
|
setControllAngle(0);
|
|
if (!dComIfGp_event_runCheck() && !daPy_getPlayerLinkActorClass()->checkNoControll()) {
|
|
dAttention_c& attention = dComIfGp_getAttention();
|
|
if (attention.Lockon() && attention.GetLockonList(0) && attention.LockonTruth()) {
|
|
target = attention.GetLockonList(0)->getActor();
|
|
}
|
|
else {
|
|
target = NULL;
|
|
}
|
|
|
|
short prev0396 = m0396;
|
|
short prev0394 = m0394;
|
|
|
|
if (target) {
|
|
mDoMtx_multVecZero(mpCannonModel->getAnmMtx(2), &cannonPos);
|
|
|
|
cannonPos = target->eyePos - cannonPos;
|
|
|
|
cLib_addCalcAngleS(&m0396, cM_atan2s(-cannonPos.y, cannonPos.absXZ()) + 0x4000, 5, 0x180, 0x40);
|
|
cLib_addCalcAngleS(&m0394, cM_atan2s(cannonPos.x, cannonPos.z) - shape_angle.y, 5, 0x180, 0x40);
|
|
|
|
} else if (!mDoCPd_R_LOCK_BUTTON(0)) {
|
|
float adjust = mStickMVal * (m0404 * 4.0f + 1.0f);
|
|
m0396 += (adjust * 384.0f) * cM_scos(mStickMAng);
|
|
m0394 += (s16)((adjust * 384.0f) * cM_ssin(mStickMAng));
|
|
}
|
|
|
|
if (m0396 > 0x4000) {
|
|
m0396 = 0x4000;
|
|
} else if (m0396 < 0x1556) {
|
|
m0396 = 0x1556;
|
|
}
|
|
|
|
if (cLib_distanceAngleS(prev0396, m0396) >= 0x80 || cLib_distanceAngleS(prev0394, m0394) >= 0x80) {
|
|
bVar1 = TRUE;
|
|
} else {
|
|
bVar1 = FALSE;
|
|
}
|
|
if (bVar1) {
|
|
seStart(JA_SE_LK_SHIP_CANNON_MOVE, &m1038);
|
|
}
|
|
|
|
if (m037A == 0 &&
|
|
((CPad_CHECK_TRIG_X(0) && dComIfGp_getSelectItem(0) == dItem_BOMB_BAG_e) ||
|
|
(CPad_CHECK_TRIG_Y(0) && dComIfGp_getSelectItem(1) == dItem_BOMB_BAG_e) ||
|
|
(CPad_CHECK_TRIG_Z(0) && dComIfGp_getSelectItem(2) == dItem_BOMB_BAG_e))) {
|
|
m037A = 30;
|
|
if (dComIfGs_getBombNum() == 0) {
|
|
mDoAud_seStart(JA_SE_ITEM_TARGET_OUT);
|
|
m037A--;
|
|
}
|
|
} else if (m037A > 0) {
|
|
m037A--;
|
|
}
|
|
|
|
if (mDoCPd_R_LOCK_BUTTON(0)) {
|
|
setSelfMove(1);
|
|
} else {
|
|
setSelfMove(0);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* 00004B08-00004B7C .text procCraneReady_init__8daShip_cFv */
|
|
BOOL daShip_c::procCraneReady_init() {
|
|
mCurMode = MODE_CRANE_e;
|
|
mProc = &daShip_c::procCraneReady;
|
|
mCraneBaseAngle = 0x3000;
|
|
m039C = 0;
|
|
setPartAnimeInit(PART_CRANE_e);
|
|
mRopeCnt = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004B7C-00004CD0 .text procCraneReady__8daShip_cFv */
|
|
BOOL daShip_c::procCraneReady() {
|
|
float fVar1;
|
|
|
|
if (checkNextMode(MODE_CRANE_e)) {
|
|
return TRUE;
|
|
}
|
|
cLib_addCalcAngleS(&m0366, 0, 2, 0x1000, 0x400);
|
|
setMoveAngle(m0366);
|
|
firstDecrementShipSpeed(0.0f);
|
|
if (mpBodyAnm->getPlaySpeed() < 0.01f) {
|
|
if (mPart != PART_CRANE_e) {
|
|
setPartOnAnime(PART_CRANE_e);
|
|
}
|
|
else {
|
|
incRopeCnt(2, 0);
|
|
if (mRopeCnt == 20) {
|
|
procCrane_init();
|
|
}
|
|
}
|
|
}
|
|
if (mPart == PART_CRANE_e) {
|
|
fVar1 = (mpBodyAnm->getFrame() - 5.0f) * 0.33333334f;
|
|
if (fVar1 > 1.0f) {
|
|
fVar1 = 1.0f;
|
|
}
|
|
else if (fVar1 < 0.0f) {
|
|
fVar1 = 0.0f;
|
|
}
|
|
m0398 = fVar1 * mCraneBaseAngle;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004CD0-00004D70 .text procCrane_init__8daShip_cFv */
|
|
BOOL daShip_c::procCrane_init() {
|
|
mProc = &daShip_c::procCrane;
|
|
speedF = 0.0f;
|
|
m0366 = 0;
|
|
mRipple.setRate(0.0f);
|
|
offStateFlg(daSFLG_UNK800_e);
|
|
mCurMode = MODE_CRANE_e;
|
|
if (cM_rnd() < 0.5f) {
|
|
m0353 = 1;
|
|
}
|
|
else {
|
|
m0353 = 0;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004D70-000050C4 .text procCrane__8daShip_cFv */
|
|
BOOL daShip_c::procCrane() {
|
|
s16 sVar3;
|
|
s16 sVar1;
|
|
s16 sVar2;
|
|
|
|
if (checkNextMode(MODE_CRANE_e)) {
|
|
offStateFlg(daSFLG_UNK800_e);
|
|
return TRUE;
|
|
}
|
|
setControllAngle(0);
|
|
if (!dComIfGp_event_runCheck() && !daPy_getPlayerLinkActorClass()->checkNoControll()) {
|
|
if (m0398 == mCraneBaseAngle) {
|
|
if(std::fabsf(speedF) < 3.0f &&
|
|
((CPad_CHECK_HOLD_X(0) && dComIfGp_getSelectItem(0) == dItem_GRAPPLING_HOOK_e) ||
|
|
(CPad_CHECK_HOLD_Y(0) && dComIfGp_getSelectItem(1) == dItem_GRAPPLING_HOOK_e) ||
|
|
(CPad_CHECK_HOLD_Z(0) && dComIfGp_getSelectItem(2) == dItem_GRAPPLING_HOOK_e))) {
|
|
sVar1 = mRopeCnt;
|
|
incRopeCnt(2, 0);
|
|
if (mRopeCnt == 250) {
|
|
sVar3 = 0;
|
|
if (mCraneBaseAngle > 0) {
|
|
setControllAngle(0xA00);
|
|
}
|
|
else {
|
|
setControllAngle(-0xA00);
|
|
}
|
|
if (m0353 && (sVar1 != mRopeCnt)) {
|
|
dComIfGp_getVibration().StartShock(5, -0x31, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
}
|
|
else if (mCraneBaseAngle > 0) {
|
|
sVar3 = 0x800;
|
|
}
|
|
else {
|
|
sVar3 = -0x800;
|
|
}
|
|
}
|
|
else {
|
|
incRopeCnt(-2, 20);
|
|
if (mRopeCnt == 20) {
|
|
sVar3 = 0;
|
|
}
|
|
else if (mCraneBaseAngle > 0) {
|
|
sVar3 = -0x800;
|
|
}
|
|
else {
|
|
sVar3 = 0x800;
|
|
}
|
|
}
|
|
cLib_chaseAngleS(&m039C, sVar3, 0x100);
|
|
if (mRopeCnt == 20 && !mDoCPd_R_LOCK_BUTTON(0) && mStickMVal > 0.1f) {
|
|
sVar2 = mCraneBaseAngle;
|
|
if ((mStickMAng < -0x2000) && (mStickMAng > -0x6000)) {
|
|
mCraneBaseAngle = 0x3000;
|
|
m03A6 = 0;
|
|
onStateFlg(daSFLG_UNK10000000_e);
|
|
}
|
|
else if ((mStickMAng > 0x2000) && (mStickMAng < 0x6000)) {
|
|
mCraneBaseAngle = -0x3000;
|
|
m03A6 = 0;
|
|
onStateFlg(daSFLG_UNK10000000_e);
|
|
}
|
|
if (sVar2 * mCraneBaseAngle < 0) {
|
|
seStart(JA_SE_LK_SHIP_CRANE_ARM, &m102C);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
cLib_chaseAngleS(&m03A6, 0x1800, 0x100);
|
|
cLib_addCalcAngleS(&m0398, mCraneBaseAngle, 5, m03A6, 0x100);
|
|
}
|
|
if (mDoCPd_R_LOCK_BUTTON(0) && mRopeCnt == 20) {
|
|
setSelfMove(1);
|
|
if (cM_rnd() < 0.5f) {
|
|
m0353 = 1;
|
|
}
|
|
else {
|
|
m0353 = 0;
|
|
}
|
|
}
|
|
else {
|
|
setSelfMove(0);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000050C4-000051F8 .text procCraneUp_init__8daShip_cFv */
|
|
BOOL daShip_c::procCraneUp_init() {
|
|
if (mProc == &daShip_c::procCraneUp) {
|
|
return FALSE;
|
|
}
|
|
|
|
mProc = &daShip_c::procCraneUp;
|
|
|
|
if (mCraneBaseAngle > 0) {
|
|
m03A6 = 0x800;
|
|
}
|
|
else {
|
|
m03A6 = -0x800;
|
|
}
|
|
|
|
seStart(JA_SE_LK_SHIP_CRANE_SALVAGE, ¤t.pos);
|
|
|
|
mCurMode = MODE_CRANE_UP_e;
|
|
|
|
mRipple.setRate(1.0f);
|
|
|
|
offStateFlg(daSFLG_CRANE_UP_END_e);
|
|
|
|
dComIfGp_getVibration().StartShock(7, -0x31, cXyz(0.0f, 1.0f, 0.0f));
|
|
dComIfGp_getVibration().StartQuake(4, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
speedF = 0.0f;
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000051F8-000053F0 .text procCraneUp__8daShip_cFv */
|
|
BOOL daShip_c::procCraneUp() {
|
|
short sVar1;
|
|
|
|
if (mCraneBaseAngle > 0) {
|
|
sVar1 = 0x800;
|
|
}
|
|
else {
|
|
sVar1 = -0x800;
|
|
}
|
|
cLib_addCalcAngleS(&m039C, sVar1, 5, 0x1800, 0x100);
|
|
if (mRipple.getEmitter() == NULL) {
|
|
setControllAngle(0);
|
|
onStateFlg(daSFLG_CRANE_UP_END_e);
|
|
dComIfGp_getVibration().StopQuake(-1);
|
|
}
|
|
else {
|
|
setControllAngle(m03A6);
|
|
if (cLib_distanceAngleS(m036C, m03A6) < 0x400) {
|
|
if (mCraneBaseAngle > 0) {
|
|
if (m03A6 > 0x400) {
|
|
m03A6 = cM_rnd() * 256.0f;
|
|
}
|
|
else {
|
|
m03A6 = cM_rnd() * 1024.0f + 2048.0f;
|
|
seStart(JA_SE_LK_SHIP_CRANE_SALVAGE, ¤t.pos);
|
|
}
|
|
}
|
|
else {
|
|
if (m03A6 < -0x400) {
|
|
m03A6 = cM_rnd() * -256.0f;
|
|
}
|
|
else {
|
|
m03A6 = -2048.0f - cM_rnd() * 1024.0f;
|
|
seStart(JA_SE_LK_SHIP_CRANE_SALVAGE, ¤t.pos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
incRopeCnt(-1, 20);
|
|
if (mRopeCnt == 20) {
|
|
if (dComIfGp_event_runCheck()) {
|
|
if (daPy_getPlayerLinkActorClass()->getBaseAnimeFrameRate() < 0.01f) {
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
}
|
|
else {
|
|
procCrane_init();
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000053F0-0000542C .text procToolDemo_init__8daShip_cFv */
|
|
BOOL daShip_c::procToolDemo_init() {
|
|
mProc = &daShip_c::procToolDemo;
|
|
mCurMode = 7;
|
|
offStateFlg(daSFLG_FLY_e);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000542C-00005530 .text procToolDemo__8daShip_cFv */
|
|
BOOL daShip_c::procToolDemo() {
|
|
dDemo_actor_c* demoActor = dComIfGp_demo_getActor(demoActorID);
|
|
if (demoActor) {
|
|
if (demoActor->checkEnable(dDemo_actor_c::ENABLE_TRANS_e)) {
|
|
current.pos.x = demoActor->getTrans()->x;
|
|
current.pos.z = demoActor->getTrans()->z;
|
|
}
|
|
if (demoActor->checkEnable(dDemo_actor_c::ENABLE_ROTATE_e)) {
|
|
csXyz demoRot = *demoActor->getRatate();
|
|
short prevShapeAngleY = shape_angle.y;
|
|
shape_angle.y = demoRot.y;
|
|
current.angle.y = shape_angle.y;
|
|
short angleDiff = shape_angle.y - prevShapeAngleY;
|
|
if (angleDiff > 0) {
|
|
angleDiff = 0x2000;
|
|
}
|
|
else if (angleDiff < 0) {
|
|
angleDiff = -0x2000;
|
|
}
|
|
else {
|
|
angleDiff = 0;
|
|
}
|
|
cLib_addCalcAngleS(&m0366, angleDiff, 4, l_HIO.tiller_speed, 0x100);
|
|
setControllAngle(getAimControllAngle(prevShapeAngleY));
|
|
}
|
|
}
|
|
else {
|
|
changeDemoEndProc();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00005530-00005574 .text procZevDemo_init__8daShip_cFv */
|
|
BOOL daShip_c::procZevDemo_init() {
|
|
mProc = &daShip_c::procZevDemo;
|
|
mCurMode = 7;
|
|
offStateFlg(daSFLG_FLY_e);
|
|
m0350 = 4;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00005574-00006310 .text procZevDemo__8daShip_cFv */
|
|
BOOL daShip_c::procZevDemo() {
|
|
float fVar3;
|
|
short sVar5;
|
|
short sVar15;
|
|
float fVar17;
|
|
cXyz local_7c;
|
|
cXyz local_70;
|
|
cXyz local_64;
|
|
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
if (mEvtStaffId != -1) {
|
|
cXyz* posP = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "pos");
|
|
int* angleP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "angle");
|
|
f32* speedP = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "speed");
|
|
int* partP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "part");
|
|
int* talkP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "talk");
|
|
int* atn_actorP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "atn_actor");
|
|
|
|
if (atn_actorP && dComIfGp_event_getPt1()) {
|
|
m0428 = &dComIfGp_event_getPt1()->eyePos;
|
|
}
|
|
else {
|
|
m0428 = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "atn_pos");
|
|
}
|
|
|
|
if (m0351 != DEMO_INIT_e && partP && (m0350 == 4 || m0350 != *partP)) {
|
|
m0350 = *partP;
|
|
setPartAnimeInit(*partP);
|
|
}
|
|
|
|
if (talkP && *talkP == 1) {
|
|
if (!checkStateFlg(daSFLG_UNK8000_e)) {
|
|
m038A = SHIP_BCK_FN_TALK_A;
|
|
mAnmTransform = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, m038A);
|
|
mFrameCtrl.init(mAnmTransform->getFrameMax());
|
|
onStateFlg(daSFLG_UNK8000_e);
|
|
}
|
|
}
|
|
else {
|
|
offStateFlg(daSFLG_UNK8000_e);
|
|
}
|
|
|
|
if (dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "tact")) {
|
|
daPy_getPlayerLinkActorClass()->onNoResetFlg1(daPy_py_c::daPyFlg1_SHIP_TACT);
|
|
}
|
|
else {
|
|
daPy_getPlayerLinkActorClass()->offNoResetFlg1(daPy_py_c::daPyFlg1_SHIP_TACT);
|
|
}
|
|
|
|
if (m0351 == DEMO_INIT_e || m0351 == DEMO_OPEN_e) {
|
|
if (angleP) {
|
|
sVar15 = (s16)*angleP;
|
|
}
|
|
else {
|
|
sVar15 = shape_angle.y;
|
|
}
|
|
|
|
if (posP) {
|
|
initStartPos(posP, sVar15);
|
|
}
|
|
else {
|
|
initStartPos(¤t.pos, sVar15);
|
|
}
|
|
|
|
if (speedP) {
|
|
speedF = *speedP;
|
|
}
|
|
|
|
if (partP || m0351 == DEMO_OPEN_e) {
|
|
if (m0351 == DEMO_OPEN_e) {
|
|
m0350 = 0;
|
|
}
|
|
else {
|
|
m0350 = *partP;
|
|
}
|
|
|
|
mPart = m0350;
|
|
mRopeCnt = 0;
|
|
|
|
u16 fileIndex;
|
|
if (mPart != PART_WAIT_e) {
|
|
fileIndex = SHIP_BCK_FN_MAST_ON2;
|
|
}
|
|
else {
|
|
fileIndex = SHIP_BCK_FN_MAST_OFF2;
|
|
m03E8 = 0.001f;
|
|
}
|
|
if (m0392 != fileIndex) {
|
|
mpBodyAnm->setAnm((J3DAnmTransform *)dComIfG_getObjectRes(l_arcName, fileIndex), J3DFrameCtrl::EMode_NONE, 0.0f, 1.0f, 0.0f, -1.0f, NULL);
|
|
m0392 = fileIndex;
|
|
mpBodyAnm->setFrame(mpBodyAnm->getEndFrame() - 0.001f);
|
|
mpBodyAnm->getAnm()->setFrame(mpBodyAnm->getEndFrame() - 0.001f);
|
|
mpBodyAnm->play(NULL, 0, 0);
|
|
}
|
|
}
|
|
setControllAngle(0);
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else if (m0351 == DEMO_MOVE_e || m0351 == DEMO_UNK03_e) {
|
|
if (posP == NULL) {
|
|
posP = dComIfGp_evmng_getGoal();
|
|
}
|
|
|
|
if (m0351 == DEMO_MOVE_e) {
|
|
local_7c = *posP - current.pos;
|
|
}
|
|
else {
|
|
local_70 = current.pos - *posP;
|
|
|
|
fVar17 = local_70.absXZ();
|
|
|
|
if (!dComIfGp_evmng_getMyFloatP(mEvtStaffId, "rad")) {
|
|
JUT_ASSERT(DEMO_SELECT(3722, 3741), 0);
|
|
}
|
|
|
|
fVar3 = *dComIfGp_evmng_getMyFloatP(mEvtStaffId, "rad");
|
|
|
|
if (fVar17 < 0.1f) {
|
|
sVar15 = 0x4000;
|
|
local_64.set(posP->x, posP->y, posP->z + fVar3);
|
|
}
|
|
else {
|
|
sVar15 = (s16)(cM_atan2s(local_70.x, local_70.z) + 0x4000);
|
|
local_64 = *posP + local_70 * (fVar3 / fVar17);
|
|
}
|
|
|
|
local_64.x += fVar3 * cM_ssin(sVar15);
|
|
local_64.z += fVar3 * cM_scos(sVar15);
|
|
local_7c = local_64 - current.pos;
|
|
}
|
|
|
|
fVar17 = local_7c.absXZ();
|
|
|
|
if (fVar17 < 10.0f) {
|
|
speedF = 0.0f;
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else {
|
|
if (speedP && *speedP <= -0.5f) {
|
|
if (m03E0 <= speedF) {
|
|
firstDecrementShipSpeed(m03E0);
|
|
}
|
|
else {
|
|
if (*speedP < -1.5f) {
|
|
cLib_addCalc(&speedF, 0.0f, 0.1f, 1.0f, 0.1f);
|
|
}
|
|
else {
|
|
decrementShipSpeed(0.0f);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
speedF = fVar17 * 0.2f;
|
|
if (speedP) {
|
|
fVar3 = *speedP;
|
|
}
|
|
else {
|
|
fVar3 = 55.0f;
|
|
}
|
|
if (speedF > fVar3) {
|
|
speedF = fVar3;
|
|
}
|
|
}
|
|
}
|
|
if (fVar17 > 1.0f) {
|
|
sVar15 = shape_angle.y;
|
|
cLib_addCalcAngleS(&shape_angle.y, cM_atan2s(local_7c.x, local_7c.z), 3, 0x2000, 0x80);
|
|
current.angle.y = shape_angle.y;
|
|
|
|
sVar5 = shape_angle.y - sVar15;
|
|
if (sVar5 > 0) {
|
|
sVar5 = 0x2000;
|
|
}
|
|
else if (sVar5 < 0) {
|
|
sVar5 = -0x2000;
|
|
}
|
|
else {
|
|
sVar5 = 0;
|
|
}
|
|
|
|
cLib_addCalcAngleS(&m0366, sVar5, 4, l_HIO.tiller_speed, 0x100);
|
|
setControllAngle(getAimControllAngle(sVar15));
|
|
}
|
|
else {
|
|
setControllAngle(0);
|
|
}
|
|
}
|
|
else if (m0351 == DEMO_RACE_FAIL_e) {
|
|
if (!checkStateFlg(daSFLG_UNK10000_e)) {
|
|
mpHeadAnm->setAnm((J3DAnmTransform *)dComIfG_getObjectRes(l_arcName, SHIP_BCK_FN_LOSE1), J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f, 0.0f, -1.0f, NULL);
|
|
onStateFlg(daSFLG_UNK10000_e);
|
|
m03B4 = SHIP_BCK_FN_LOSE1;
|
|
}
|
|
|
|
speedF = 0.0f;
|
|
setControllAngle(0);
|
|
|
|
if (mpHeadAnm->getPlaySpeed() < 0.01f) {
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
}
|
|
else if (m0351 == DEMO_KEEP_e) {
|
|
if (speedP) {
|
|
firstDecrementShipSpeed(*speedP);
|
|
}
|
|
setControllAngle(0);
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else if (m0351 == DEMO_NECK_e) {
|
|
partP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "prm0");
|
|
|
|
u16 fileIndex;
|
|
if (partP == NULL || !(*partP & 1)) {
|
|
fileIndex = SHIP_BCK_FN_LOOK_R;
|
|
}
|
|
else {
|
|
fileIndex = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
|
|
if (partP && (s32)*partP == 2) {
|
|
fVar17 = -1.0f;
|
|
}
|
|
else {
|
|
fVar17 = 1.0f;
|
|
}
|
|
|
|
if (!checkStateFlg(daSFLG_UNK80000_e) && fVar17 > 0.0f) {
|
|
mpHeadAnm->setAnm((J3DAnmTransform *)dComIfG_getObjectRes(l_arcName, fileIndex), J3DFrameCtrl::EMode_NONE, 5.0f, fVar17, 0.0f, -1.0f, NULL);
|
|
m03B4 = fileIndex;
|
|
onStateFlg(daSFLG_UNK80000_e);
|
|
}
|
|
else if (checkStateFlg(daSFLG_UNK80000_e) && fVar17 < 0.0f) {
|
|
offStateFlg(daSFLG_UNK80000_e);
|
|
mpHeadAnm->setPlaySpeed(-1.0f);
|
|
}
|
|
|
|
setControllAngle(0);
|
|
|
|
if (std::fabsf(mpHeadAnm->getPlaySpeed()) <= 0.1f) {
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
}
|
|
else if (m0351 == DEMO_THROW_e) {
|
|
speedF = l_HIO.throw_start_speedF;
|
|
speedP = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "gravity");
|
|
if (speedP) {
|
|
gravity = *speedP;
|
|
}
|
|
|
|
speed.y = l_HIO.throw_start_speed_y;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
|
|
if (angleP) {
|
|
current.angle.y = (s16)*angleP;
|
|
}
|
|
|
|
shape_angle.y += l_HIO.throw_start_angle_speed;
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else if (m0351 == DEMO_HWARP_UP_e) {
|
|
cLib_addCalcAngleS(&m0370, 0, 10, 0x1000, 0x200);
|
|
cLib_addCalcAngleS(&m0372, 0, 10, 0x1000, 0x200);
|
|
cLib_addCalcAngleS(&m0384, 0, 10, 0x1000, 0x200);
|
|
cLib_addCalcAngleS(&m036C, 0, 10, 0x1000, 0x200);
|
|
|
|
onStateFlg(daSFLG_FLY_e);
|
|
if (speed.y < 15.0f) {
|
|
speed.y += 1.0f;
|
|
}
|
|
|
|
m0366 = 0;
|
|
m036E = 0;
|
|
m0374 = 0;
|
|
m0376 = 0;
|
|
m0386 = 0;
|
|
gravity = 0.0f;
|
|
speedF = 0.0f;
|
|
current.pos.y += speed.y;
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else {
|
|
if (m0351 == DEMO_HWARP_DOWN_e) {
|
|
if (m03F4 > current.pos.y && gravity >= 0.0f) {
|
|
offStateFlg(daSFLG_FLY_e);
|
|
m03F4 = current.pos.y;
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
}
|
|
else {
|
|
m0370 = 0;
|
|
m0372 = 0;
|
|
m0384 = 0;
|
|
m036C = 0;
|
|
m0366 = 0;
|
|
m036E = 0;
|
|
m0374 = 0;
|
|
m0376 = 0;
|
|
m0386 = 0;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
if (gravity < 0.0f) {
|
|
gravity = 0.0f;
|
|
current.pos.y += 500.0f;
|
|
speed.y = 0.0f;
|
|
}
|
|
else {
|
|
speed.y -= 1.0f;
|
|
if (speed.y < -15.0f) {
|
|
speed.y = -15.0f;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
return TRUE;
|
|
}
|
|
}
|
|
if (mpBodyAnm->getPlaySpeed() < 0.01f) {
|
|
if (m0350 != 4 && m0350 != 0 && mPart != m0350) {
|
|
setPartOnAnime(m0350);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
changeDemoEndProc();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006310-00006440 .text procTalkReady_init__8daShip_cFv */
|
|
BOOL daShip_c::procTalkReady_init() {
|
|
J3DAnmTransform* pAnimRes;
|
|
|
|
mProc = &daShip_c::procTalkReady;
|
|
mAnmTransform = NULL;
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
if ((s16)(shape_angle.y - m038C) > 0) {
|
|
m03B4 = SHIP_BCK_FN_LOOK_R;
|
|
}
|
|
else {
|
|
m03B4 = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
}
|
|
else if ((s16)(fopAcM_searchPlayerAngleY(this) - shape_angle.y) > 0) {
|
|
m03B4 = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
else {
|
|
m03B4 = SHIP_BCK_FN_LOOK_R;
|
|
}
|
|
pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, m03B4);
|
|
mpHeadAnm->setAnm(pAnimRes, 0, 5.0f, 1.0f, 0.0f, -1.0f, NULL);
|
|
seStart(JA_SE_SHIP_LOOK_BACK, &eyePos);
|
|
mCurMode = MODE_TALK_e;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006440-000064A8 .text procTalkReady__8daShip_cFv */
|
|
BOOL daShip_c::procTalkReady() {
|
|
firstDecrementShipSpeed(0.0f);
|
|
setMoveAngle(0);
|
|
if (mpHeadAnm->getPlaySpeed() <= 0.1f) {
|
|
procTalk_init();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000064A8-00006558 .text procTalk_init__8daShip_cFv */
|
|
BOOL daShip_c::procTalk_init() {
|
|
mProc = &daShip_c::procTalk;
|
|
mCurMode = MODE_TALK_e;
|
|
m0430 = fpcM_ERROR_PROCESS_ID_e;
|
|
m038A = SHIP_BCK_FN_TALK_A;
|
|
mAnmTransform = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, m038A);
|
|
mFrameCtrl.init(mAnmTransform->getFrameMax());
|
|
setInitMessage();
|
|
onStateFlg(daSFLG_UNK8000_e);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006558-00006720 .text procTalk__8daShip_cFv */
|
|
BOOL daShip_c::procTalk() {
|
|
msg_class *msg;
|
|
u16 fileIndex;
|
|
|
|
firstDecrementShipSpeed(0.0f);
|
|
setMoveAngle(0);
|
|
if (m0430 == fpcM_ERROR_PROCESS_ID_e) {
|
|
if (dComIfGp_checkCameraAttentionStatus(dComIfGp_getPlayerCameraID(0), 4)) {
|
|
m0430 = fopMsgM_messageSet(mNextMessageNo, &eyePos);
|
|
}
|
|
}
|
|
else {
|
|
msg = fopMsgM_SearchByID(m0430);
|
|
if (msg) {
|
|
if (msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) {
|
|
if (setNextMessage(msg)) {
|
|
msg->mStatus = fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else {
|
|
msg->mStatus = fopMsgStts_MSG_CONTINUES_e;
|
|
fopMsgM_messageSet(mNextMessageNo);
|
|
}
|
|
} else if (msg->mStatus == fopMsgStts_BOX_CLOSED_e) {
|
|
msg->mStatus = fopMsgStts_MSG_DESTROYED_e;
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && checkStateFlg(daSFLG_UNK400000_e)){
|
|
return procTurn_init();
|
|
}
|
|
mpHeadAnm->setPlaySpeed(-1.0f);
|
|
dComIfGp_event_onEventFlag(8);
|
|
changeDemoEndProc();
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
if (mFrameCtrl.checkState(2)) {
|
|
if (cM_rndF(2.0f) < 1.0f) {
|
|
fileIndex = SHIP_BCK_FN_TALK_A;
|
|
}
|
|
else {
|
|
fileIndex = SHIP_BCK_FN_TALK_B;
|
|
}
|
|
if (fileIndex != m038A) {
|
|
m038A = fileIndex;
|
|
mAnmTransform = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, m038A);
|
|
mFrameCtrl.init(mAnmTransform->getFrameMax());
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006720-0000686C .text procTurn_init__8daShip_cFv */
|
|
BOOL daShip_c::procTurn_init() {
|
|
m0430 = fpcM_ERROR_PROCESS_ID_e;
|
|
mpHeadAnm->setPlaySpeed(-1.0f);
|
|
seStart(JA_SE_SHIP_LOOK_FORWARD, &eyePos);
|
|
mProc = &daShip_c::procTurn;
|
|
m038E = 0;
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
camera->mCamera.Stop();
|
|
cXyz cameraPos = camera->mCamera.Eye() - camera->mCamera.Center();
|
|
cameraPos.normalize();
|
|
m0450 = camera->mCamera.Center() + (cameraPos * 1600.0f);
|
|
offStateFlg(daSFLG_UNK8000_e);
|
|
m037A = 10;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000686C-00006C78 .text procTurn__8daShip_cFv */
|
|
BOOL daShip_c::procTurn() {
|
|
float fVar2;
|
|
short sVar4;
|
|
float fVar5;
|
|
float fVar6;
|
|
cXyz local_c4;
|
|
cXyz local_b8;
|
|
cXyz local_ac;
|
|
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
local_c4 = current.pos - camera->mCamera.Center();
|
|
fVar5 = local_c4.abs();
|
|
local_ac = camera->mCamera.Center() + (current.pos - m045C);
|
|
local_c4 = m0450 - camera->mCamera.Eye();
|
|
fVar6 = local_c4.abs();
|
|
if (fVar6 > 1.0f) {
|
|
fVar2 = fVar6 * 0.5f;
|
|
if (fVar2 > 60.0f) {
|
|
fVar2 = 60.0f;
|
|
}
|
|
else if (fVar2 < 15.0f) {
|
|
if (fVar6 > 15.0f) {
|
|
fVar2 = 15.0f;
|
|
}
|
|
else {
|
|
fVar2 = fVar6;
|
|
}
|
|
}
|
|
local_b8 = camera->mCamera.Eye() + local_c4.normalize() * fVar2;
|
|
}
|
|
else {
|
|
local_b8 = m0450;
|
|
}
|
|
camera->mCamera.Set(local_ac, local_b8);
|
|
if (fVar6 <= 1.0f) {
|
|
sVar4 = shape_angle.y;
|
|
cLib_addCalcAngleS2(&shape_angle.y, m038C, 8, m038E);
|
|
cLib_addCalcAngleS2(&m038E, 0x800, 8, 0x80);
|
|
current.angle.y = shape_angle.y;
|
|
setControllAngle(getAimControllAngle(sVar4));
|
|
if (abs((s16)(shape_angle.y - m038C)) < 0x200) {
|
|
cLib_addCalc(&speedF, 55.0f, 0.1, 5.0f, 1.0f);
|
|
}
|
|
if (abs((s16)(m038C - shape_angle.y)) < 0x100 && !checkOutRange()) {
|
|
if (m037A <= 0) {
|
|
camera->mCamera.Start();
|
|
camera->mCamera.Reset();
|
|
dComIfGp_event_onEventFlag(8);
|
|
changeDemoEndProc();
|
|
m038E = 0;
|
|
onStateFlg(daSFLG_UNK100000_e);
|
|
}
|
|
else {
|
|
m037A--;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006C78-00006DE0 .text procTornadoUp_init__8daShip_cFv */
|
|
BOOL daShip_c::procTornadoUp_init() {
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
onStateFlg((daSHIP_SFLG)(daSFLG_FLY_e | daSFLG_UNK1000_e));
|
|
mCurMode = 12;
|
|
mProc = &daShip_c::procTornadoUp;
|
|
m037A = 1;
|
|
camera->mCamera.Stop();
|
|
speed.y = 0.0f;
|
|
gravity = 0.0f;
|
|
cXyz tornadoPos(mTornadoActor->current.pos.x, mTornadoActor->current.pos.y + 2500.0f, mTornadoActor->current.pos.z + 4000.0f);
|
|
camera->mCamera.Set(current.pos, tornadoPos);
|
|
m03A6 = 0;
|
|
fopAcM_seStartCurrent(mTornadoActor, 0x186C, 0);
|
|
dComIfGs_onEventBit(0x3E40);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006DE0-00006FDC .text procTornadoUp__8daShip_cFv */
|
|
BOOL daShip_c::procTornadoUp() {
|
|
int iVar1;
|
|
daTornado_c* tornadoActor = mTornadoActor;
|
|
|
|
cLib_addCalc(¤t.pos.x, tornadoActor->getJointXPos(m037A), 0.5f, 80.0f, 20.0f);
|
|
|
|
cLib_addCalc(¤t.pos.z, tornadoActor->getJointZPos(m037A), 0.5f, 80.0f, 20.0f);
|
|
|
|
current.pos.y += speed.y;
|
|
speed.y += 2.0f;
|
|
|
|
if (speed.y > 50.0f) {
|
|
speed.y = 50.0f;
|
|
}
|
|
|
|
if (tornadoActor->getJointYPos(m037A) < current.pos.y && m037A < 11) {
|
|
m037A++;
|
|
}
|
|
|
|
shape_angle.y += 0x1C25;
|
|
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
cXyz local_3c(tornadoActor->current.pos.x, current.pos.y, tornadoActor->current.pos.z);
|
|
camera->mCamera.Set(local_3c, camera->mCamera.Eye());
|
|
|
|
if (m03A6 == 0 && current.pos.y > tornadoActor->current.pos.y + 5000.0f) {
|
|
m03A6 = 1;
|
|
iVar1 = (s32)cM_rndF(8.0f) + 0xC6;
|
|
if (iVar1 >= 0xCE) {
|
|
iVar1 = 0xCD;
|
|
}
|
|
dStage_changeScene(iVar1, 0.0f, 0, 0xFF);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006FDC-0000713C .text procStartModeWarp_init__8daShip_cFv */
|
|
BOOL daShip_c::procStartModeWarp_init() {
|
|
current.pos.y = m03F4 + 5000.0f;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
mProc = &daShip_c::procStartModeWarp;
|
|
mCurMode = MODE_START_MODE_WARP_e;
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
m03A6 = 0x1C25;
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
camera->mCamera.Stop();
|
|
cXyz local_38(current.pos.x, m03F4 + 1500.0f, current.pos.z + 2000.0f);
|
|
camera->mCamera.Set(current.pos, local_38);
|
|
m037A = 0;
|
|
#if VERSION == VERSION_DEMO
|
|
mTactWarpID = fopAcM_create(PROC_TORNADO, 2, ¤t.pos, fopAcM_GetRoomNo(this));
|
|
#endif
|
|
fopAcM_seStartCurrent(this, 0x186D, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000713C-000074D4 .text procStartModeWarp__8daShip_cFv */
|
|
BOOL daShip_c::procStartModeWarp() {
|
|
int iVar5;
|
|
GXColor diff;
|
|
GXColor amb;
|
|
cXyz local_30;
|
|
|
|
daTornado_c* pfVar2 = (daTornado_c*)fopAcM_SearchByID(mTactWarpID);
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
shape_angle.y += m03A6;
|
|
current.angle.y = shape_angle.y;
|
|
if (pfVar2) {
|
|
#if VERSION > VERSION_DEMO
|
|
if (!checkStateFlg(daSFLG_UNK8_e)) {
|
|
onStateFlg(daSFLG_UNK8_e);
|
|
pfVar2->current.pos.x = current.pos.x;
|
|
pfVar2->current.pos.z = current.pos.z;
|
|
}
|
|
#endif
|
|
iVar5 = 0;
|
|
for (int i = 0; i < 11; iVar5++, i++) {
|
|
if (current.pos.y < pfVar2->getJointYPos(i)) break;
|
|
}
|
|
if (iVar5 == 11) {
|
|
iVar5 = 10;
|
|
}
|
|
cLib_chaseF(¤t.pos.x, pfVar2->getJointXPos(iVar5), 50.0f);
|
|
cLib_chaseF(¤t.pos.z, pfVar2->getJointZPos(iVar5), 50.0f);
|
|
local_30.x = pfVar2->current.pos.x;
|
|
local_30.z = pfVar2->current.pos.z;
|
|
}
|
|
else {
|
|
local_30.x = current.pos.x;
|
|
local_30.z = current.pos.z;
|
|
}
|
|
local_30.y = current.pos.y;
|
|
camera->mCamera.Set(local_30, camera->mCamera.Eye());
|
|
if (m037A == 0) {
|
|
if (current.pos.y < m03F4) {
|
|
current.pos.y = m03F4 - 50.0f;
|
|
speed.y = 0.0f;
|
|
offStateFlg(daSFLG_FLY_e);
|
|
m037A = 1;
|
|
if (pfVar2 != NULL) {
|
|
pfVar2->m31c = 1;
|
|
}
|
|
dKy_get_seacolor(&diff, &amb);
|
|
m03BC.x = 0;
|
|
m03BC.y = shape_angle.y + 0x8000;
|
|
m03BC.z = 0;
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0285, ¤t.pos, &shape_angle, NULL, 0xFF, &m1984, -1, &diff);
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0285, ¤t.pos, &m03BC, NULL, 0xFF, &m1998, -1, &diff);
|
|
}
|
|
if (pfVar2 != NULL) {
|
|
pfVar2->current.pos.y = current.pos.y - 700.0f;
|
|
}
|
|
}
|
|
else if (pfVar2 == NULL || pfVar2->mJointScale[10] < 0.8f) {
|
|
if (pfVar2 != NULL) {
|
|
pfVar2->current.pos.y -= 12.0f;
|
|
}
|
|
m03BC.y = shape_angle.y + 0x8000;
|
|
cLib_chaseS(&m03A6, 0, 0x40);
|
|
if (m03A6 < 0x400) {
|
|
camera->mCamera.Start();
|
|
camera->mCamera.Reset();
|
|
mTactWarpID = fpcM_ERROR_PROCESS_ID_e;
|
|
m1984.remove();
|
|
m1998.remove();
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
procPaddleMove_init();
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000074D4-00007684 .text procTactWarp_init__8daShip_cFv */
|
|
BOOL daShip_c::procTactWarp_init() {
|
|
GXColor diff;
|
|
GXColor amb[3];
|
|
|
|
mCurMode = MODE_TACT_WARP_e;
|
|
mProc = &daShip_c::procTactWarp;
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
m03A6 = 0;
|
|
gravity = 0.0f;
|
|
speed.y = 0.0f;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
m037A = 0;
|
|
fopAcM_seStartCurrent(this, 0x186E, 0);
|
|
dCam_getBody()->StartEventCamera(0xe, fopAcM_GetID(this), 0);
|
|
dKy_get_seacolor(amb, &diff);
|
|
m03BC.x = 0;
|
|
m03BC.y = shape_angle.y + 0x8000;
|
|
m03BC.z = 0;
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0285, ¤t.pos, &shape_angle, NULL, 0xFF, &m1984, -1, amb);
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0285, ¤t.pos, &m03BC, NULL, 0xFF, &m1998, -1, amb);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00007684-0000797C .text procTactWarp__8daShip_cFv */
|
|
BOOL daShip_c::procTactWarp() {
|
|
BOOL res;
|
|
int iVar4;
|
|
|
|
shape_angle.y += m03A6;
|
|
current.angle.y = shape_angle.y;
|
|
daTornado_c* mpTornado = (daTornado_c*)fopAcM_SearchByID(mTactWarpID);
|
|
if (mpTornado == NULL || fpcM_IsCreating(mTactWarpID)) {
|
|
if (mTactWarpID == fpcM_ERROR_PROCESS_ID_e) {
|
|
dComIfGp_event_onEventFlag(8);
|
|
m1984.remove();
|
|
m1998.remove();
|
|
procPaddleMove_init();
|
|
dCam_getBody()->EndEventCamera(fopAcM_GetID(this));
|
|
}
|
|
res = FALSE;
|
|
}
|
|
else {
|
|
if (cLib_chaseS(&m03A6, 0x1C25, 0x40) && (mpTornado->mJointScale[10] > 0.8f)) {
|
|
speed.y += 1.0f;
|
|
if (speed.y > 50.0f) {
|
|
speed.y = 50.0f;
|
|
}
|
|
current.pos.y += speed.y;
|
|
mpTornado->current.pos.y = current.pos.y - 700.0f;
|
|
m1984.remove();
|
|
m1998.remove();
|
|
}
|
|
else {
|
|
if ((!m037A) && (m03A6 > 0x1000)) {
|
|
m037A = 1;
|
|
mpTornado->m31c = 1;
|
|
}
|
|
}
|
|
if (m037A == 1) {
|
|
cLib_chaseF(&mpTornado->current.pos.y, current.pos.y - 700.0f, 20.0f);
|
|
iVar4 = 0;
|
|
for (int i = 0; i < 11; iVar4++, i++) {
|
|
if (current.pos.y < mpTornado->getJointYPos(i)) break;
|
|
}
|
|
if (iVar4 == 11) {
|
|
iVar4 = 10;
|
|
}
|
|
cLib_chaseF(¤t.pos.x, mpTornado->getJointXPos(iVar4), 50.0f);
|
|
cLib_chaseF(¤t.pos.z, mpTornado->getJointZPos(iVar4), 50.0f);
|
|
}
|
|
if (m037A != 2 && current.pos.y > m03F4 + 5000.0f ) {
|
|
m037A = 2;
|
|
dStage_changeScene(mTactWarpPosNum + 0xC5, 0.0f, 0, 0xFF);
|
|
mDoAud_taktModeMuteOff();
|
|
}
|
|
m03BC.y = shape_angle.y + 0x8000;
|
|
res = TRUE;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
/* 0000797C-00007A90 .text procWhirlDown_init__8daShip_cFv */
|
|
BOOL daShip_c::procWhirlDown_init() {
|
|
mProc = &daShip_c::procWhirlDown;
|
|
mCurMode = 15;
|
|
gravity = 0.0f;
|
|
speed.y = 0.0f;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
onStateFlg(daSFLG_UNK1000_e);
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
camera->mCamera.Stop();
|
|
cXyz local_38(mWhirlActor->current.pos.x, mWhirlActor->current.pos.y + 2500.0f, mWhirlActor->current.pos.z + 4000.0f);
|
|
camera->mCamera.Set(mWhirlActor->current.pos, local_38);
|
|
m037A = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00007A90-00007BEC .text procWhirlDown__8daShip_cFv */
|
|
BOOL daShip_c::procWhirlDown() {
|
|
shape_angle.y += (m0408 / (2*M_PI)) * 65536.0f;
|
|
if (mWhirlActor) {
|
|
#if VERSION == VERSION_DEMO
|
|
if (cLib_addCalcPosXZ(¤t.pos, mWhirlActor->current.pos, 1.0f, speedF, 10.0f) < 10.0f)
|
|
#else
|
|
speedF = 40.0f;
|
|
if (cLib_addCalcPosXZ(¤t.pos, mWhirlActor->current.pos, 1.0f, 40.0f, 10.0f) < 10.0f)
|
|
#endif
|
|
{
|
|
speed.y -= 0.5f;
|
|
if (speed.y < -10.0f) {
|
|
speed.y = -10.0f;
|
|
}
|
|
current.pos.y += speed.y;
|
|
if (m037A == 0 && current.pos.y < m03F4 - 1000.0f) {
|
|
dComIfGs_onEventBit(0x1940);
|
|
dComIfGp_setNextStage(dComIfGp_getStartStageName(), m03B2, fopAcM_GetRoomNo(this));
|
|
m037A = 1;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00007BEC-00007DC0 .text procStartModeThrow_init__8daShip_cFv */
|
|
BOOL daShip_c::procStartModeThrow_init() {
|
|
current.pos.y = m03F4 + 2500.0f;
|
|
speedF = 100.0f;
|
|
onStateFlg(daSFLG_FLY_e);
|
|
mProc = &daShip_c::procStartModeThrow;
|
|
mCurMode = MODE_START_MODE_THROW_e;
|
|
if (m0392 != SHIP_BCK_FN_MAST_OFF2) {
|
|
setPartOffAnime();
|
|
}
|
|
m03A6 = l_HIO.throw_return_angle_speed;
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
camera->mCamera.Stop();
|
|
cXyz local_38(current.pos.x + cM_scos(current.angle.y) * 300.0f,
|
|
m03F4 + 150.0f,
|
|
current.pos.z - cM_ssin(current.angle.y) * 300.0f);
|
|
camera->mCamera.Set(current.pos, local_38);
|
|
current.pos.x -= cM_ssin(current.angle.y) * 4500.0f;
|
|
current.pos.z -= cM_scos(current.angle.y) * 4500.0f;
|
|
m037A = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00007DC0-0000804C .text procStartModeThrow__8daShip_cFv */
|
|
BOOL daShip_c::procStartModeThrow() {
|
|
GXColor amb;
|
|
GXColor diff;
|
|
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
shape_angle.y += m03A6;
|
|
camera->mCamera.Set(current.pos, camera->mCamera.Eye());
|
|
if (m037A == 0) {
|
|
if (current.pos.y < m03F4) {
|
|
speed.y = 0.0f;
|
|
speedF = 0.0f;
|
|
offStateFlg(daSFLG_FLY_e);
|
|
m037A++;
|
|
dKy_get_seacolor(&amb, &diff);
|
|
amb.r = amb.r * 0.23529412f + 195.0f;
|
|
amb.g = amb.g * 0.23529412f + 195.0f;
|
|
amb.b = amb.b * 0.23529412f + 195.0f;
|
|
current.pos.y = m03F4;
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_82D7, ¤t.pos, &shape_angle, NULL, 0xFF, NULL, -1, &amb);
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_82D8, ¤t.pos, &shape_angle, NULL, 0xFF, NULL, -1, &amb);
|
|
current.pos.y = m03F4 - 50.0f;
|
|
}
|
|
}
|
|
else {
|
|
if (cLib_chaseS(&m03A6, 0, 0x100)) {
|
|
m037A++;
|
|
if(m037A == 45) {
|
|
camera->mCamera.Start();
|
|
camera->mCamera.Reset();
|
|
current.angle.y = shape_angle.y;
|
|
dComIfGp_evmng_cutEnd(mEvtStaffId);
|
|
procPaddleMove_init();
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000804C-000085D8 .text setEffectData__8daShip_cFfs */
|
|
void daShip_c::setEffectData(float param_1, short param_2) {
|
|
static JGeometry::TVec3<f32> wave_l_direction(0.5f, 1.0f, -0.3f);
|
|
static JGeometry::TVec3<f32> wave_r_direction(-0.5f, 1.0f, -0.3f);
|
|
|
|
float fVar1;
|
|
float fVar2;
|
|
float fVar3;
|
|
JPABaseEmitter* mEmitter;
|
|
GXColor amb;
|
|
GXColor diff;
|
|
|
|
if (checkStateFlg(daSFLG_FLY_e) && current.pos.y - 40.0f > param_1) {
|
|
mWaveR.mState = 1;
|
|
mWaveL.mState = 1;
|
|
mSplash.mState = 1;
|
|
mTrack.mState = 1;
|
|
}
|
|
else {
|
|
if (speedF <= 0.0f) {
|
|
mWaveR.mState = 1;
|
|
mWaveL.mState = 1;
|
|
mSplash.mState = 1;
|
|
}
|
|
|
|
}
|
|
fVar3 = speedF + 150.0f;
|
|
mEffPos.set(current.pos.x + fVar3 * cM_ssin(shape_angle.y), param_1, current.pos.z + fVar3 * cM_scos(shape_angle.y));
|
|
getMaxWaterY(&mEffPos);
|
|
if (!checkStateFlg(daSFLG_FLY_e) || param_1 > current.pos.y) {
|
|
if (std::fabsf(mFwdVel) > 3.0f) {
|
|
if (std::fabsf(speedF) > 3.0f && mFwdVel * speedF > 0.0f) {
|
|
if (mFwdVel > 11.0f) {
|
|
if (mWaveL.getEmitter() == NULL) {
|
|
mEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_0037, &mEffPos, &shape_angle, NULL, 0xFF, &mWaveL);
|
|
mWaveL.setTimer(20);
|
|
if (mEmitter) {
|
|
mEmitter->setDirection(wave_l_direction);
|
|
}
|
|
}
|
|
if (mWaveR.getEmitter() == NULL) {
|
|
mEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_0037, &mEffPos, &shape_angle, NULL, 0xFF, &mWaveR);
|
|
mWaveR.setTimer(20);
|
|
if (mEmitter) {
|
|
mEmitter->setDirection(wave_r_direction);
|
|
}
|
|
}
|
|
if (mSplash.getEmitter() == NULL) {
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_0035, &mEffPos, &shape_angle, NULL, 0xFF, &mSplash);
|
|
}
|
|
}
|
|
if (mTrack.getEmitter() == NULL) {
|
|
dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0036, ¤t.pos, &shape_angle, NULL, 0, &mTrack);
|
|
}
|
|
if (checkStateFlg((daSHIP_SFLG)(daSFLG_FLY_e | daSFLG_LAND_e))) {
|
|
dKy_get_seacolor(&amb, &diff);
|
|
mEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_0034, &mEffPos, &shape_angle, NULL, 0xFF, NULL, -1, &amb);
|
|
if (mEmitter) {
|
|
fVar1 = 10.0f;
|
|
fVar2 = (-(speed.y - -15.0f) / 30.0f) * 50.0f + 10.0f;
|
|
if (fVar2 < 10.0f) {
|
|
fVar2 = fVar1;
|
|
}
|
|
else if (fVar2 > 60.0f) {
|
|
fVar2 = 60.0f;
|
|
}
|
|
mEmitter->setRate(fVar2);
|
|
}
|
|
seStart(JA_SE_SHIP_JUMP_ALIGHT, ¤t.pos);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
mTrack.setIndirectTexData(l_HIO.ef_ind_scroll, l_HIO.ef_ind_scale);
|
|
mTrack.setSpeed(mFwdVel);
|
|
|
|
if (mFwdVel >= 0.0f) {
|
|
mWaveR.setSpeed(l_HIO.ef_speed_rate);
|
|
mWaveL.setSpeed(l_HIO.ef_speed_rate);
|
|
}
|
|
else {
|
|
mWaveR.setSpeed(-l_HIO.ef_speed_rate);
|
|
mWaveL.setSpeed(-l_HIO.ef_speed_rate);
|
|
}
|
|
|
|
fVar1 = (s16)(shape_angle.z - param_2) / (f32)0x4000;
|
|
|
|
if (fVar1 > 0.3f) {
|
|
fVar1 = 0.3f;
|
|
}
|
|
else if (fVar1 < -0.3f) {
|
|
fVar1 = -0.3f;
|
|
}
|
|
|
|
mWaveR.setPitch(fVar1 + 1.0f);
|
|
mWaveL.setPitch(1.0f - fVar1);
|
|
|
|
mSplash.setSpeed(mFwdVel);
|
|
mSplash.setMaxSpeed(l_HIO.ef_sp_max_speed);
|
|
|
|
cXyz anchorPos1;
|
|
cXyz anchorPos2;
|
|
|
|
anchorPos1.set(l_HIO.ef_front_x, l_HIO.ef_front_y, l_HIO.ef_front_z);
|
|
anchorPos2.set(l_HIO.ef_back_x, l_HIO.ef_back_y, l_HIO.ef_back_z);
|
|
mWaveR.setAnchor(&anchorPos1, &anchorPos2);
|
|
|
|
anchorPos1.x *= -1.0f;
|
|
anchorPos2.x *= -1.0f;
|
|
mWaveL.setAnchor(&anchorPos1, &anchorPos2);
|
|
|
|
mWaveL.setMaxDisSpeed(l_HIO.ef_dis_speed);
|
|
mWaveR.setMaxDisSpeed(l_HIO.ef_dis_speed);
|
|
|
|
mWaveL.setMaxSpeed(40.0f);
|
|
mWaveR.setMaxSpeed(40.0f);
|
|
}
|
|
|
|
/* 000085D8-00008688 .text setRoomInfo__8daShip_cFv */
|
|
void daShip_c::setRoomInfo() {
|
|
int roomId;
|
|
if (mAcch.GetGroundH() != -G_CM3D_F_INF) {
|
|
roomId = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd);
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd);
|
|
m03C4 = dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd);
|
|
}
|
|
else {
|
|
roomId = dComIfGp_roomControl_getStayNo();
|
|
m03C4 = 0;
|
|
}
|
|
tevStr.mRoomNo = roomId;
|
|
m034A = dComIfGp_getReverb(roomId);
|
|
mStts.SetRoomId(roomId);
|
|
fopAcM_SetRoomNo(this, roomId);
|
|
}
|
|
|
|
/* 00008688-0000882C .text incRopeCnt__8daShip_cFii */
|
|
// Adjusts the length of KORL's Salvage Arm rope
|
|
void daShip_c::incRopeCnt(int lengthChange, int minSegmentLimit) {
|
|
int i;
|
|
cXyz* ropeSegments = mRopeLine.getPos(0);
|
|
int currRopeCnt = mRopeCnt;
|
|
cXyz* currRopeSegment = &mRopeLineSegments[currRopeCnt];
|
|
int targetRopeCnt = currRopeCnt + lengthChange;
|
|
|
|
// Ensure the new segment index is within valid bounds
|
|
if (targetRopeCnt >= (int)ARRAY_SIZE(mRopeLineSegments)) {
|
|
targetRopeCnt = ARRAY_SIZE(mRopeLineSegments);
|
|
}
|
|
else if (targetRopeCnt < minSegmentLimit) {
|
|
targetRopeCnt = minSegmentLimit;
|
|
}
|
|
|
|
lengthChange = targetRopeCnt - currRopeCnt; // Number of segments to increase/decrease the rope by
|
|
|
|
if (lengthChange > 0) {
|
|
// Lengthening the rope: Move all segments down by adding a displacement vector
|
|
cXyz ropeDisplacement = l_rope_base_vec * lengthChange;
|
|
for (i = 0; i < mRopeCnt; i++, ropeSegments++) {
|
|
*ropeSegments += ropeDisplacement;
|
|
}
|
|
}
|
|
else {
|
|
// Shortening the rope: Do nothing except skipping over all existing rope segments
|
|
ropeSegments += currRopeCnt;
|
|
}
|
|
|
|
for (i = mRopeCnt; i < targetRopeCnt; i++, currRopeSegment++, ropeSegments++) {
|
|
currRopeSegment->set(l_rope_base_vec);
|
|
if (mRopeCnt) {
|
|
ropeSegments->set(*(ropeSegments - 1) - l_rope_base_vec);
|
|
}
|
|
}
|
|
|
|
if (lengthChange != 0) {
|
|
if ((minSegmentLimit == 20) && (targetRopeCnt == 20)) {
|
|
seStart(JA_SE_LK_SHIP_CRANE_STOP, &m102C);
|
|
}
|
|
else {
|
|
seStart(JA_SE_LK_SHIP_CRANE_WORK, &m102C);
|
|
}
|
|
}
|
|
|
|
mRopeCnt = targetRopeCnt;
|
|
}
|
|
|
|
/* 0000882C-00009314 .text setRopePos__8daShip_cFv */
|
|
void daShip_c::setRopePos() {
|
|
/* Nonmatching - regalloc */
|
|
float fVar1;
|
|
float fVar2;
|
|
float fVar17;
|
|
|
|
cXyz* r4;
|
|
int iVar11;
|
|
short sVar14;
|
|
int sVar12;
|
|
JPABaseEmitter* emitter;
|
|
cXyz* r3;
|
|
cXyz* ropeSegments;
|
|
cXyz* currentRopeSegment;
|
|
short currentRopeSegmentIndex;
|
|
MtxP pMVar5;
|
|
|
|
cXyz spF8;
|
|
cXyz spEC;
|
|
cXyz spE0;
|
|
cXyz spD0;
|
|
cXyz spC8;
|
|
cXyz spBC;
|
|
|
|
static cXyz ripple_scale(0.6f, 0.6f, 0.6f);
|
|
static Vec rope_offset = {160.0f, 0.0f, 0.0f};
|
|
static Vec water_drop_scale = {1.5f, 1.0f, 1.5f};
|
|
|
|
currentRopeSegmentIndex = mRopeCnt;
|
|
|
|
if (currentRopeSegmentIndex == 0) {
|
|
currentRopeSegment = mRopeLine.getPos(0);
|
|
ropeSegments = mRopeLineSegments;
|
|
}
|
|
else {
|
|
currentRopeSegment = mRopeLine.getPos(0) + currentRopeSegmentIndex - 1;
|
|
ropeSegments = &mRopeLineSegments[currentRopeSegmentIndex - 1];
|
|
}
|
|
|
|
spF8 = *currentRopeSegment;
|
|
|
|
cMtx_multVec(mpSalvageArmModel->getAnmMtx(1), &rope_offset, currentRopeSegment);
|
|
|
|
if (mProc == &daShip_c::procCraneUp) {
|
|
spEC.set(mpLinkModel->getBaseTRMtx()[0][3] - currentRopeSegment->x,
|
|
mpLinkModel->getBaseTRMtx()[1][3] - currentRopeSegment->y,
|
|
mpLinkModel->getBaseTRMtx()[2][3] - currentRopeSegment->z);
|
|
|
|
spEC.normalize();
|
|
|
|
spEC *= 10.0f;
|
|
|
|
currentRopeSegment--;
|
|
ropeSegments--;
|
|
|
|
for (int i = mRopeCnt + -2; i >= 0; i--, currentRopeSegment--, ropeSegments--) {
|
|
currentRopeSegment->set(*(currentRopeSegment + 1) + spEC);
|
|
ropeSegments->set(cXyz::Zero);
|
|
}
|
|
}
|
|
else {
|
|
currentRopeSegment--;
|
|
ropeSegments--;
|
|
|
|
for (int i = mRopeCnt + -2; i >= 0; i--, currentRopeSegment--, ropeSegments--) {
|
|
spF8 = *currentRopeSegment;
|
|
|
|
if (currentRopeSegment->y < m03F4) {
|
|
*ropeSegments *= 0.6f;
|
|
}
|
|
else {
|
|
*ropeSegments *= 0.9f;
|
|
}
|
|
|
|
ropeSegments->y -= 3.0f;
|
|
|
|
*currentRopeSegment += *ropeSegments;
|
|
|
|
spEC.set(*currentRopeSegment - *(currentRopeSegment + 1));
|
|
|
|
fVar17 = std::sqrtf(spEC.abs2());
|
|
|
|
if (fVar17 < 0.01f) {
|
|
currentRopeSegment->set(*(currentRopeSegment + 1) + l_rope_base_vec);
|
|
}
|
|
else {
|
|
currentRopeSegment->set(*(currentRopeSegment + 1) + (spEC * 10.0f)/fVar17);
|
|
}
|
|
|
|
*ropeSegments += (*currentRopeSegment - spF8) * 0.05f;
|
|
}
|
|
if (mRopeCnt == 20 && checkStateFlg(daSFLG_UNK10000000_e)) {
|
|
r4 = mRopeLine.getPos(0);
|
|
mDoMtx_multVecZero(mpSalvageArmModel->getAnmMtx(1), &spE0);
|
|
spE0 -= *r4;
|
|
|
|
if (spE0.abs2XZ() < SQUARE(50.0f)) {
|
|
currentRopeSegment = mRopeLineSegments;
|
|
f32 f2 = cM_scos(shape_angle.x) * 16.0f;
|
|
|
|
if (shape_angle.x <= 0) {
|
|
f2 *= -1.0f;
|
|
}
|
|
|
|
spD0.set(
|
|
f2 * cM_ssin(shape_angle.y),
|
|
0.0f,
|
|
f2 * cM_scos(shape_angle.y)
|
|
);
|
|
|
|
for (int i = 0; i < 20; i++, currentRopeSegment++) {
|
|
*currentRopeSegment += spD0;
|
|
spD0 *= 0.95f;
|
|
}
|
|
|
|
offStateFlg(daSFLG_UNK10000000_e);
|
|
}
|
|
}
|
|
}
|
|
|
|
currentRopeSegment = mRopeLine.getPos(0);
|
|
|
|
if (mRopeCnt > 2) {
|
|
spC8 = *currentRopeSegment - *(currentRopeSegment + 1);
|
|
sVar14 = 0;
|
|
sVar12 = 0;
|
|
}
|
|
else {
|
|
pMVar5 = mpSalvageArmModel->getAnmMtx(1);
|
|
spC8.set(
|
|
currentRopeSegment->x - pMVar5[0][3],
|
|
currentRopeSegment->y - pMVar5[1][3],
|
|
currentRopeSegment->z - pMVar5[2][3]
|
|
);
|
|
sVar14 = 0x7fff;
|
|
iVar11 = 0x8000 - (m0398 * 2);
|
|
sVar12 = iVar11 - (0x8000 - mCraneBaseAngle) * ((float)m0398 / (float)mCraneBaseAngle);
|
|
}
|
|
|
|
fVar17 = mpLinkModel->getBaseTRMtx()[1][3];
|
|
|
|
f32 sin = cM_ssin(shape_angle.y);
|
|
f32 cos = cM_scos(shape_angle.y);
|
|
spBC.x = cos * spC8.x - sin * spC8.z;
|
|
spBC.y = spC8.y;
|
|
spBC.z = sin * spC8.x + cos * spC8.z;
|
|
|
|
mDoMtx_trans(mDoMtx_stack_c::get(), currentRopeSegment->x, currentRopeSegment->y, currentRopeSegment->z);
|
|
fVar1 = std::sqrtf(spBC.y * spBC.y + spBC.z * spBC.z);
|
|
s16 z = sVar12 + cM_atan2s(-spBC.x, fVar1);
|
|
s16 y = shape_angle.y;
|
|
s16 x = sVar14 + cM_atan2s(spBC.z, spBC.y);
|
|
mDoMtx_stack_c::ZXYrotM(x, y, z);
|
|
mDoMtx_stack_c::XrotM(-0x4000);
|
|
|
|
if (m0392 == SHIP_BCK_FN_MAST_ON2) {
|
|
J3DTransformInfo sp104;
|
|
mpBodyAnm->getAnm()->getTransform(6, &sp104);
|
|
mDoMtx_stack_c::scaleM(sp104.mScale.x, sp104.mScale.y, sp104.mScale.z);
|
|
}
|
|
|
|
mpLinkModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
fVar1 = currentRopeSegment->y;
|
|
|
|
getMaxWaterY(currentRopeSegment);
|
|
|
|
fVar2 = currentRopeSegment->y;
|
|
|
|
currentRopeSegment->y = fVar1;
|
|
|
|
if (fVar2 > currentRopeSegment->y) {
|
|
ropeSegments = currentRopeSegment;
|
|
|
|
r3 = currentRopeSegment;
|
|
for (int i = 0; i < mRopeCnt; i++, ropeSegments++) {
|
|
if (ropeSegments->y <= fVar2) {
|
|
r3 = ropeSegments;
|
|
}
|
|
}
|
|
|
|
m1020.x = r3->x;
|
|
m1020.y = fVar2;
|
|
m1020.z = r3->z;
|
|
|
|
if (mRipple.getEmitter() == NULL) {
|
|
dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0033, &m1020, NULL, &ripple_scale, 0xFF, &mRipple);
|
|
|
|
if (mRipple.getEmitter() != NULL) {
|
|
mRipple.setRate(0.0f);
|
|
|
|
if (m034F == 0) {
|
|
fopKyM_createWpillar(&m1020, 0.7f, 0.7f, 0);
|
|
|
|
seStart(JA_SE_LK_SHIP_CRANE_DROP, &m1020);
|
|
|
|
dComIfGp_getVibration().StartShock(3, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (fVar17 < fVar2 && !m034F && mRopeCnt >= 20) {
|
|
m034F = 20;
|
|
|
|
seStart(JA_SE_LK_SHIP_CRANE_LIFTUP, &m1020);
|
|
|
|
if (mCurMode != MODE_CRANE_UP_e) {
|
|
if (m19AC.getEmitter() == NULL) {
|
|
ropeSegments = mRopeLine.getPos(0);
|
|
|
|
emitter = dComIfGp_particle_setP1(dPa_name::ID_COMMON_0038, ropeSegments, NULL, NULL, 0xFF, &m19AC);
|
|
|
|
if(emitter) {
|
|
emitter->setGlobalParticleScale(1.5f, 1.5f);
|
|
emitter->setEmitterScale(water_drop_scale);
|
|
emitter->setLifeTime(30);
|
|
}
|
|
}
|
|
|
|
fopKyM_createWpillar(&m1020, 0.5f, 0.7f, 0);
|
|
|
|
dComIfGp_getVibration().StartShock(3, 1, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
if (m19C0.getEmitter() == NULL) {
|
|
emitter = dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0033, &m1074, NULL, &ripple_scale, 0xFF, &m19C0);
|
|
|
|
if (emitter) {
|
|
emitter->setVolumeSize(30);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
mRipple.remove();
|
|
}
|
|
|
|
if (m034F) {
|
|
m034F--;
|
|
}
|
|
|
|
if (!m19AC.getEmitter()) {
|
|
m19C0.remove();
|
|
}
|
|
|
|
m1074.x = mRopeLine.getPos(0)->x + cM_rndFX(20.0f);
|
|
m1074.y = m03F4;
|
|
m1074.z = mRopeLine.getPos(0)->z + cM_rndFX(20.0f);
|
|
}
|
|
|
|
/* 00009314-00009384 .text getAnglePartRate__8daShip_cFv */
|
|
f32 daShip_c::getAnglePartRate() {
|
|
float fVar1;
|
|
if (m0392 == SHIP_BCK_FN_MAST_OFF2) {
|
|
fVar1 = 0.33333334f * (3.0f - mpBodyAnm->getFrame());
|
|
}
|
|
else {
|
|
fVar1 = 0.33333334f * (mpBodyAnm->getFrame() - 5.0f);
|
|
}
|
|
if (fVar1 > 1.0f) {
|
|
fVar1 = 1.0f;
|
|
}
|
|
else if (fVar1 < 0.0f) {
|
|
fVar1 = 0.0f;
|
|
}
|
|
return fVar1;
|
|
}
|
|
|
|
/* 00009384-000095E4 .text setTornadoActor__8daShip_cFv */
|
|
void daShip_c::setTornadoActor() {
|
|
cXyz local_20;
|
|
|
|
mTornadoActor = (daTornado_c*)fopAcM_SearchByID(mTornadoID);
|
|
if (mTornadoActor == NULL) {
|
|
offTornadoFlg();
|
|
}
|
|
else {
|
|
local_20 = current.pos - mTornadoActor->current.pos;
|
|
m0400 = local_20.absXZ();
|
|
m040C = cM_atan2f(local_20.x, local_20.z);
|
|
|
|
dCam_getBody()->SetTypeForce("Tornado", mTornadoActor);
|
|
m0404 = (l_HIO.tornado_distance - m0400) * 0.0004f;
|
|
if (m0404 < 0.0f) {
|
|
m0404 = 0.0f;
|
|
}
|
|
daTornado_c* pfVar2 = mTornadoActor;
|
|
float dx = pfVar2->getJointXPos(0) - current.pos.x;
|
|
float dz = pfVar2->getJointZPos(0) - current.pos.z;
|
|
float distXZ = std::sqrtf(dx * dx + dz * dz);
|
|
if (!checkStateFlg(daSFLG_UNK1000_e) && distXZ < 3500.0f) {
|
|
if(daPy_getPlayerLinkActorClass()->shipSpecialDemoStart()) {
|
|
procTornadoUp_init();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000095E4-00009790 .text setWhirlActor__8daShip_cFv */
|
|
void daShip_c::setWhirlActor() {
|
|
cXyz local_20;
|
|
|
|
mWhirlActor = (daTornado_c*)fopAcM_SearchByID(mWhirlID);
|
|
if (mWhirlActor == NULL) {
|
|
offWhirlFlg();
|
|
}
|
|
else {
|
|
local_20 = current.pos - mWhirlActor->current.pos;
|
|
m0400 = local_20.absXZ();
|
|
m040C = cM_atan2f(local_20.x, local_20.z);
|
|
dCam_getBody()->SetTypeForce("Tornado", mWhirlActor);
|
|
m0404 = (l_HIO.whirl_distance - m0400) * (1.0f / 3500.0f);
|
|
if (m0404 < 0.0f) {
|
|
m0404 = 0.0f;
|
|
}
|
|
|
|
if (m0400 < 500.0f && !checkStateFlg(daSFLG_UNK1000_e)) {
|
|
if(daPy_getPlayerLinkActorClass()->shipSpecialDemoStart()) {
|
|
procWhirlDown_init();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00009790-00009B4C .text setHeadAnm__8daShip_cFv */
|
|
void daShip_c::setHeadAnm() {
|
|
s32 newFileIndex = -1;
|
|
float speed;
|
|
float morph;
|
|
|
|
if (dComIfGp_event_runCheck()) {
|
|
if (mEvtStaffId == -1 &&
|
|
(dComIfGp_evmng_startCheck("SV_TALK_P1_1ST") ||
|
|
dComIfGp_evmng_startCheck("SV_TALK_P1_2ND") ||
|
|
dComIfGp_evmng_startCheck("SV_TALK_P4_1ST"))) {
|
|
newFileIndex = SHIP_BCK_KYAKKAN1;
|
|
} else if (m03B4 == SHIP_BCK_KYAKKAN1 || m03B4 == SHIP_BCK_DAMAGE1) {
|
|
newFileIndex = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
}
|
|
else if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_BOW_AIM_e | daPyStts0_UNK2000_e | daPyStts0_HOOKSHOT_AIM_e | daPyStts0_BOOMERANG_AIM_e | daPyStts0_TELESCOPE_LOOK_e) ||
|
|
dComIfGp_checkPlayerStatus1(0, daPyStts1_PICTO_BOX_AIM_e) ||
|
|
mCurMode == 9) {
|
|
newFileIndex = SHIP_BCK_KYAKKAN1;
|
|
}
|
|
else if (
|
|
#if VERSION > VERSION_DEMO
|
|
(!dComIfGs_isEventBit(0x3910) || dComIfGs_isEventBit(0x2D02)) &&
|
|
#endif
|
|
(mSph.ChkTgHit() || mCyl[0].ChkTgHit() ||
|
|
mCyl[1].ChkTgHit() || mCyl[2].ChkTgHit())) {
|
|
m03B4 = SHIP_BCK_FN_LOOK_L;
|
|
newFileIndex = SHIP_BCK_DAMAGE1;
|
|
}
|
|
else if (m03B4 != SHIP_BCK_DAMAGE1 || std::fabsf(mpHeadAnm->getPlaySpeed()) < 0.01f) {
|
|
newFileIndex = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
}
|
|
else {
|
|
if (
|
|
#if VERSION > VERSION_DEMO
|
|
(!dComIfGs_isEventBit(0x3910) || dComIfGs_isEventBit(0x2D02)) &&
|
|
#endif
|
|
(mSph.ChkTgHit() || mCyl[0].ChkTgHit() ||
|
|
mCyl[1].ChkTgHit() || mCyl[2].ChkTgHit())) {
|
|
m03B4 = SHIP_BCK_FN_LOOK_L;
|
|
newFileIndex = SHIP_BCK_DAMAGE1;
|
|
}
|
|
else if (m03B4 == SHIP_BCK_DAMAGE1 || m03B4 == SHIP_BCK_AKIBI1) {
|
|
if (mpHeadAnm->getPlaySpeed() < 0.01f) {
|
|
newFileIndex = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
}
|
|
else if ((m03B4 == SHIP_BCK_FN_LOOK_L || m03B4 == SHIP_BCK_FN_LOOK_R) &&
|
|
std::fabsf(mpHeadAnm->getPlaySpeed()) < 0.01f &&
|
|
cM_rnd() < 0.4f && (g_Counter.mTimer & 0x1FF) == 0x1FF &&
|
|
#if VERSION > VERSION_DEMO
|
|
(!dComIfGs_isEventBit(0x3910) || dComIfGs_isEventBit(0x2D02)) &&
|
|
#endif
|
|
!checkStateFlg(daSFLG_UNK40000000_e)) {
|
|
newFileIndex = SHIP_BCK_AKIBI1;
|
|
}
|
|
else if (m03B4 != SHIP_BCK_FN_LOOK_R) {
|
|
newFileIndex = SHIP_BCK_FN_LOOK_L;
|
|
}
|
|
}
|
|
|
|
if (m03B4 != newFileIndex && newFileIndex != -1) {
|
|
if (newFileIndex == SHIP_BCK_AKIBI1) {
|
|
speed = 1.0f;
|
|
morph = 5.0f;
|
|
}
|
|
else if (newFileIndex == SHIP_BCK_DAMAGE1) {
|
|
speed = 1.0f;
|
|
morph = 0.0f;
|
|
}
|
|
else {
|
|
speed = 0.0f;
|
|
morph = 5.0f;
|
|
}
|
|
m03B4 = newFileIndex;
|
|
mpHeadAnm->setAnm((J3DAnmTransform *)dComIfG_getObjectRes(l_arcName, m03B4), 0, morph, speed, 0.0f, -1.0f, NULL);
|
|
}
|
|
}
|
|
|
|
/* 00009B4C-0000B978 .text execute__8daShip_cFv */
|
|
BOOL daShip_c::execute() {
|
|
/* Nonmatching */
|
|
static cXyz sail_offset(0.5f, 155.0f, 50.0f);
|
|
static cXyz sph_offset(-5.0f, 0.0f, 0.0f);
|
|
static f32 cyl_offset[] = {100.0f, -20.0f, -100.0f};
|
|
|
|
f32 prev_fwdvel = mFwdVel;
|
|
f32 prev_speedF = speedF;
|
|
m0351 = -1;
|
|
m0404 = 0.0f;
|
|
m0428 = NULL;
|
|
|
|
if (mTornadoID != fpcM_ERROR_PROCESS_ID_e) {
|
|
setTornadoActor();
|
|
mWhirlActor = NULL;
|
|
}
|
|
else {
|
|
mTornadoActor = NULL;
|
|
if (mWhirlID != fpcM_ERROR_PROCESS_ID_e) {
|
|
setWhirlActor();
|
|
}
|
|
else {
|
|
mWhirlActor = NULL;
|
|
}
|
|
}
|
|
|
|
if (dComIfGp_event_runCheck()) {
|
|
mStickMVal = 0.0f;
|
|
mStickMAng = 0;
|
|
mEvtStaffId = dComIfGp_evmng_getMyStaffId("Ship", this, 0);
|
|
if (mEvtStaffId != -1) {
|
|
char* cutName = dComIfGp_getPEvtManager()->getMyNowCutName(mEvtStaffId);
|
|
if (cutName) {
|
|
m0351 = (cutName[0] - '0') * 10 + (cutName[1] - '0');
|
|
}
|
|
}
|
|
m03B8 = 0;
|
|
offStateFlg(daSFLG_UNK2000000_e);
|
|
}
|
|
else {
|
|
if (daPy_getPlayerLinkActorClass()->checkNoControll()) {
|
|
mStickMVal = 0.0f;
|
|
mStickMAng = 0;
|
|
}
|
|
else {
|
|
mStickMVal = g_mDoCPd_cpadInfo[0].mMainStickValue;
|
|
mStickMAng = g_mDoCPd_cpadInfo[0].mMainStickAngle + 0x8000;
|
|
}
|
|
mEvtStaffId = -1;
|
|
}
|
|
|
|
offStateFlg(daSHIP_SFLG(daSFLG_JUMP_e | daSFLG_LAND_e | daSFLG_UNK100_e | daSFLG_JUMP_OK_e | daSFLG_SHOOT_CANNON_e | daSFLG_UNK100000_e | daSFLG_UNK8000000_e));
|
|
|
|
if (m0388 > 0) {
|
|
m0388--;
|
|
}
|
|
|
|
if (checkStateFlg(daSFLG_UNK20_e) != 0) {
|
|
speed.y = 5.0f;
|
|
offStateFlg(daSFLG_UNK20_e);
|
|
}
|
|
|
|
mpBodyAnm->play(NULL, 0, 0);
|
|
mpHeadAnm->play(NULL, 0, 0);
|
|
|
|
if (
|
|
mCurMode != 12 && mCurMode != 15 &&
|
|
mCurMode != MODE_START_MODE_WARP_e && mCurMode != MODE_START_MODE_THROW_e &&
|
|
mCurMode != 7 && mCurMode != MODE_CRANE_UP_e &&
|
|
mCurMode != 8
|
|
) {
|
|
if(eventInfo.checkCommandTalk()) {
|
|
if (mNextMessageNo == 0x1682) {
|
|
dComIfGp_onMenuCollect();
|
|
}
|
|
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
procTalkReady_init();
|
|
}
|
|
else {
|
|
procTalk_init();
|
|
}
|
|
}
|
|
else {
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && checkOutRange()) {
|
|
if (checkStateFlg(daSFLG_FLY_e)) {
|
|
cLib_addCalcAngleS2(&shape_angle.y, m038C, 8, m038E);
|
|
cLib_addCalcAngleS2(&m038E, 0x1800, 8, 0x200);
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
else {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
fopAcM_orderSpeakEvent(this);
|
|
}
|
|
}
|
|
else {
|
|
if (checkOutRange()) {
|
|
firstDecrementShipSpeed(0.0f);
|
|
}
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
}
|
|
}
|
|
}
|
|
|
|
mpGrid = NULL;
|
|
mpGrid = (daGrid_c*)fopAcM_SearchByID(mGridID);
|
|
dDemo_actor_c* demoActor;
|
|
demoActor = dComIfGp_demo_getActor(demoActorID);
|
|
|
|
if (demoActor) {
|
|
procToolDemo_init();
|
|
}
|
|
else if(mEvtStaffId != -1 && m0351 != DEMO_SALVAGE_e && m0351 != DEMO_TORNADO_S_e) {
|
|
procZevDemo_init();
|
|
}
|
|
else if (m0351 == DEMO_SALVAGE_e) {
|
|
procCraneUp_init();
|
|
}
|
|
|
|
short sVar26;
|
|
sVar26 = m0366;
|
|
|
|
if (mAnmTransform) {
|
|
mFrameCtrl.update();
|
|
mAnmTransform->setFrame(mFrameCtrl.getFrame());
|
|
if (!checkStateFlg(daSFLG_UNK8000_e) && mFrameCtrl.checkState(2)) {
|
|
mAnmTransform = NULL;
|
|
}
|
|
}
|
|
|
|
BOOL r24;
|
|
if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) {
|
|
r24 = TRUE;
|
|
}
|
|
else {
|
|
r24 = FALSE;
|
|
}
|
|
|
|
if (mProc) {
|
|
(this->*mProc)();
|
|
}
|
|
|
|
if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) {
|
|
m0366 = -0x2000;
|
|
sVar26 = m0366;
|
|
}
|
|
else if (r24) {
|
|
m0366 = 0;
|
|
sVar26 = 0;
|
|
}
|
|
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
if (
|
|
mCurMode != 12 && mCurMode != 15 &&
|
|
mCurMode != 7 && mCurMode != MODE_CRANE_UP_e &&
|
|
mCurMode != MODE_START_MODE_WARP_e && mCurMode != MODE_START_MODE_THROW_e &&
|
|
!dComIfGp_event_runCheck()
|
|
) {
|
|
if (mTornadoActor) {
|
|
short sVar16;
|
|
sVar16 = shape_angle.y;
|
|
cLib_addCalcAngleS(&shape_angle.y, m040C * 10430.378f + 20480.0f, 5, 0x2000, 0x200);
|
|
setControllAngle(getAimControllAngle(sVar16));
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
else {
|
|
if (mWhirlActor) {
|
|
s16 sVar16;
|
|
sVar16 = shape_angle.y;
|
|
s16 sVar5;
|
|
if (m0352) {
|
|
sVar5 = m040C * 10430.378f + 20480.0f;
|
|
}
|
|
else {
|
|
sVar5 = m040C * 10430.378f + 32768.0f;
|
|
}
|
|
cLib_addCalcAngleS(&shape_angle.y, sVar5, 5, 0x2000, 0x200);
|
|
setControllAngle(getAimControllAngle(sVar16));
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
}
|
|
}
|
|
s16 sVar16;
|
|
sVar16 = -m0384;
|
|
s16 sVar5;
|
|
sVar5 = sVar16 * 0.05f;
|
|
if (sVar5 == 0) {
|
|
if (sVar16 > 0) {
|
|
sVar5 = 1;
|
|
}
|
|
else if (sVar16 < 0) {
|
|
sVar5 = -1;
|
|
}
|
|
}
|
|
m0386 += sVar5;
|
|
m0384 += m0386;
|
|
cLib_addCalcAngleS(&m0386, 0, 30, 0x1000, 1);
|
|
}
|
|
else {
|
|
cLib_addCalcAngleS(&m0384, -0x800, 3, 0x500, 0x300);
|
|
}
|
|
|
|
m045C = current.pos;
|
|
|
|
if (!checkStateFlg(daSFLG_UNK2000000_e)) {
|
|
cLib_chaseS(&m03B8, 0, 0x80);
|
|
}
|
|
else {
|
|
cLib_chaseS(&m03B8, 0x4E8, 0x80);
|
|
}
|
|
|
|
float fVar4;
|
|
if (mCurMode != 12 && mCurMode != 15) {
|
|
if (mCurMode != 7 && mCurMode != MODE_CRANE_UP_e) {
|
|
if (
|
|
(dComIfGp_event_runCheck() || daPy_getPlayerLinkActorClass()->checkNoControll()) &&
|
|
mEvtStaffId == -1 &&
|
|
mCurMode != MODE_TALK_e &&
|
|
mCurMode != MODE_START_MODE_THROW_e &&
|
|
!checkStateFlg(daSFLG_UNK100000_e)
|
|
) {
|
|
if (checkStateFlg(daSFLG_UNK20000000_e)) {
|
|
if (speedF >= 10.0f) {
|
|
firstDecrementShipSpeed(10.0f);
|
|
}
|
|
}
|
|
else {
|
|
speedF = 0.0f;
|
|
}
|
|
}
|
|
if (!dComIfGp_event_runCheck() && !checkStateFlg(daSFLG_FLY_e) && checkForceMove()) {
|
|
speedF = prev_speedF;
|
|
if (mTornadoActor) {
|
|
fVar4 = m0404 * 40.0f + 30.0f;
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_BOW_AIM_e) || !dComIfGp_checkCameraAttentionStatus(0, 0x20)) {
|
|
fVar4 *= 1.2f;
|
|
}
|
|
}
|
|
else {
|
|
fVar4 = m0404 * 30.0f + 10.0f;
|
|
// Bug? This room check assumes we're on the sea without checking?
|
|
if (dComIfGs_getBombNum() == 0 && fopAcM_GetRoomNo(this) == dIsleRoom_OutsetIsland_e) {
|
|
fVar4 *= 1.2f;
|
|
}
|
|
}
|
|
firstDecrementShipSpeed(fVar4);
|
|
}
|
|
|
|
shape_angle.y += m03B8;
|
|
current.angle.y += m03B8;
|
|
|
|
if (checkStateFlg(daSFLG_FLY_e)) {
|
|
if (checkStateFlg(daSFLG_UNK2000000_e)) {
|
|
cLib_chaseF(&speed.y, 20.0f, 1.0f - gravity);
|
|
speedF = prev_speedF;
|
|
cLib_chaseF(&speedF, 55.0f, 3.0f);
|
|
offStateFlg(daSFLG_UNK2000000_e);
|
|
}
|
|
|
|
if (speed.y > 0.0f && speed.y <= -gravity) {
|
|
onStateFlg(daSFLG_UNK100_e);
|
|
}
|
|
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
|
|
m1044 = cXyz::Zero;
|
|
}
|
|
else if (checkForceMove() && !dComIfGp_event_runCheck()) {
|
|
if (mTornadoActor) {
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_BOW_AIM_e) || !dComIfGp_checkCameraAttentionStatus(0, 0x20)) {
|
|
prev_speedF = 25.0f;
|
|
}
|
|
else {
|
|
prev_speedF = 5.0f;
|
|
}
|
|
}
|
|
else {
|
|
// Bug? This room check assumes we're on the sea without checking?
|
|
if (dComIfGs_getBombNum() == 0 && fopAcM_GetRoomNo(this) == dIsleRoom_OutsetIsland_e) {
|
|
prev_speedF = 10.0f;
|
|
}
|
|
else {
|
|
prev_speedF = 0.6f;
|
|
}
|
|
}
|
|
|
|
cLib_chaseF(&m0400, 0.0f, prev_speedF);
|
|
|
|
m0408 = std::fabsf(speedF) / m0400;
|
|
|
|
m040C += m0408;
|
|
|
|
BOOL r23; // BUG: this var is never initialized to FALSE
|
|
if (mTornadoActor) {
|
|
current.pos.x = mTornadoActor->current.pos.x + (m0400 * cM_fsin(m040C));
|
|
current.pos.z = mTornadoActor->current.pos.z + (m0400 * cM_fcos(m040C));
|
|
r23 = TRUE;
|
|
}
|
|
else if (m0352) {
|
|
current.pos.x = mWhirlActor->current.pos.x + (m0400 * cM_fsin(m040C));
|
|
current.pos.z = mWhirlActor->current.pos.z + (m0400 * cM_fcos(m040C));
|
|
r23 = TRUE;
|
|
}
|
|
else {
|
|
prev_speedF = current.pos.y;
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
current.pos.y = prev_speedF;
|
|
}
|
|
if (r23) {
|
|
cXyz sp114(current.pos - old.pos);
|
|
f32 dVar27;
|
|
dVar27 = sp114.absXZ();
|
|
if (dVar27 > 1.0f) {
|
|
prev_speedF = speedF / dVar27;
|
|
current.pos.x = old.pos.x + sp114.x * prev_speedF;
|
|
current.pos.z = old.pos.z + sp114.z * prev_speedF;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
speed.x = (speedF * cM_ssin(current.angle.y)) * cM_scos(m0370);
|
|
speed.y = -speedF * cM_ssin(m0370);
|
|
speed.z = (speedF * cM_scos(current.angle.y)) * cM_scos(m0370);
|
|
fopAcM_posMove(this, mStts.GetCCMoveP());
|
|
if (dComIfGp_event_runCheck()) {
|
|
m1044 = cXyz::Zero;
|
|
|
|
}
|
|
else {
|
|
cXyz sp108;
|
|
int sp18;
|
|
if (mAcch.GetGroundH() != -G_CM3D_F_INF && dPath_GetPolyRoomPathVec(mAcch.m_gnd, &sp108, &sp18)) {
|
|
sp108.normalizeZP();
|
|
sp108 *= sp18 >> 1;
|
|
cLib_addCalcPosXZ(&m1044, sp108, 0.5f, 5.0f, 1.0f);
|
|
}
|
|
else {
|
|
cLib_addCalcPosXZ(&m1044, cXyz::Zero, 0.05f, 0.1f, 0.02f);
|
|
|
|
}
|
|
current.pos += m1044;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
m1044 = cXyz::Zero;
|
|
if (mEvtStaffId == -1) {
|
|
cXyz spFC(current.pos - old.pos);
|
|
if (checkStateFlg(daSFLG_FLY_e)) {
|
|
speedF = spFC.absXZ();
|
|
}
|
|
else {
|
|
speedF = spFC.abs();
|
|
}
|
|
}
|
|
else {
|
|
speed.x = (speedF * cM_ssin(current.angle.y)) * cM_scos(m0370);
|
|
if (m0351 != DEMO_THROW_e && m0351 != DEMO_HWARP_UP_e && m0351 != DEMO_HWARP_DOWN_e) {
|
|
speed.y = -speedF * cM_ssin(m0370);
|
|
}
|
|
speed.z = (speedF * cM_scos(current.angle.y)) * cM_scos(m0370);
|
|
fopAcM_posMove(this, mStts.GetCCMoveP());
|
|
}
|
|
}
|
|
}
|
|
mStts.ClrCcMove();
|
|
|
|
cXyz spF0 = current.pos;
|
|
|
|
mAcchCir[3].SetWall(-600.0f - current.pos.y, 250.0f);
|
|
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
|
|
if (checkForceMove()) {
|
|
current.pos = spF0;
|
|
}
|
|
|
|
setRoomInfo();
|
|
|
|
if (mCurMode == 14) {
|
|
current.pos.x = spF0.x;
|
|
current.pos.z = spF0.z;
|
|
}
|
|
|
|
setYPos();
|
|
|
|
f32 diff = m03F4 - current.pos.y;
|
|
|
|
mTrack.mBaseY = m03F4;
|
|
mTrack.mMinY = m03F8;
|
|
|
|
s16 sp12;
|
|
s16 sp10;
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
setWaveAngle(&sp12, &sp10);
|
|
}
|
|
else {
|
|
sp12 = m037C;
|
|
sp10 = m037E;
|
|
}
|
|
|
|
diff += 5.0f;
|
|
|
|
if (diff > m03D8) {
|
|
m03D8 = diff;
|
|
}
|
|
else {
|
|
cLib_chaseF(&m03D8, diff, 3.0f);
|
|
}
|
|
|
|
m037C = shape_angle.x;
|
|
m037E = shape_angle.z;
|
|
|
|
if (mCurMode == 14) {
|
|
shape_angle.x = 0;
|
|
shape_angle.z = 0;
|
|
}
|
|
else {
|
|
shape_angle.x = m0370 + m0384;
|
|
shape_angle.z = m036C + m0372;
|
|
}
|
|
|
|
mDoMtx_trans(mDoMtx_stack_c::get(), current.pos.x, current.pos.y, current.pos.z);
|
|
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
|
|
J3DModel* mModel1;
|
|
J3DModel* mModel2;
|
|
mModel1 = mpBodyAnm->getModel();
|
|
mModel2 = mpHeadAnm->getModel();
|
|
|
|
mModel1->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpBodyAnm->calc();
|
|
|
|
setHeadAnm();
|
|
|
|
mModel2->setBaseTRMtx(mModel1->getAnmMtx(4));
|
|
mpHeadAnm->calc();
|
|
|
|
if (mPart == PART_CRANE_e) {
|
|
if (m0392 == SHIP_BCK_FN_MAST_OFF2) {
|
|
f32 rate = getAnglePartRate();
|
|
m0398 = rate * mCraneBaseAngle;
|
|
m039C *= getAnglePartRate();
|
|
incRopeCnt(-20, 0);
|
|
}
|
|
mpSalvageArmModel->calc();
|
|
setRopePos();
|
|
mDoMtx_multVecZero(mpSalvageArmModel->getAnmMtx(1), &m102C);
|
|
if (mProc == &daShip_c::procCrane || mProc == &daShip_c::procCraneUp) {
|
|
m0434 = mRopeLine.getPos(0);
|
|
}
|
|
else {
|
|
m0434 = NULL;
|
|
}
|
|
}
|
|
else {
|
|
m19C0.remove();
|
|
mRipple.remove();
|
|
m19AC.remove();
|
|
|
|
mRopeCnt = 0;
|
|
|
|
m0434 = NULL;
|
|
|
|
if (mPart == PART_CANNON_e) {
|
|
mDoMtx_multVecZero(mpCannonModel->getAnmMtx(2), &m1038);
|
|
|
|
if (mProc != &daShip_c::procCannon) {
|
|
m0396 = getAnglePartRate() * 16384.0f;
|
|
m0394 *= getAnglePartRate();
|
|
|
|
}
|
|
|
|
mpCannonModel->calc();
|
|
|
|
if (m037A == 30) {
|
|
cXyz spE4;
|
|
cMtx_multVec(mpCannonModel->getAnmMtx(2), &l_cannon_top, &spE4);
|
|
|
|
csXyz sp1C;
|
|
sp1C.set(getCannonAngleX(), getCannonAngleY(), shape_angle.z);
|
|
|
|
daBomb_c* bomb = (daBomb_c *)fopAcM_fastCreate(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_4, FALSE, TRUE), &spE4, tevStr.mRoomNo, &sp1C);
|
|
|
|
if (bomb) {
|
|
dCam_getBody()->ForceLockOn(fpcM_GetID(bomb));
|
|
|
|
bomb->setNoGravityTime(l_HIO.cannon_no_gravity_timer);
|
|
|
|
bomb->speedF = cM_scos(sp1C.x) * l_HIO.cannon_speed;
|
|
bomb->speed.y = -(cM_ssin(sp1C.x) * l_HIO.cannon_speed);
|
|
|
|
bomb->gravity = l_HIO.cannon_gravity;
|
|
|
|
seStart(JA_SE_LK_SHIP_CANNON_FIRE, &m1038);
|
|
|
|
onStateFlg(daSFLG_SHOOT_CANNON_e);
|
|
|
|
dComIfGp_setItemBombNumCount(-1);
|
|
|
|
mpHeadAnm->setPlaySpeed(1.0f);
|
|
mpHeadAnm->setFrame(0.0f);
|
|
}
|
|
m037A--;
|
|
}
|
|
}
|
|
}
|
|
|
|
cMtx_multVec(mModel1->getAnmMtx(10), &l_tiller_top_offset, &mTillerTopPos);
|
|
|
|
daGrid_c* grid;
|
|
MtxP mMtx = mModel1->getAnmMtx(7);
|
|
|
|
m0444.x = mMtx[0][3];
|
|
m0444.y = mMtx[1][3];
|
|
m0444.z = mMtx[2][3];
|
|
|
|
cXyz spD8;
|
|
grid = mpGrid;
|
|
if (grid) {
|
|
static cXyz top_offset(0.0f, 0.0f, -365.0f);
|
|
static cXyz XZ_top_offset(265.0f, 0.0f, 0.0f);
|
|
|
|
mpGrid->current.pos = m0444;
|
|
mpGrid->current.angle = shape_angle;
|
|
|
|
cMtx_multVecSR(mMtx, &top_offset, &spD8);
|
|
mpGrid->scale.y = spD8.abs() / 365.0f;
|
|
|
|
cMtx_multVecSR(mModel1->getAnmMtx(8), &XZ_top_offset, &spD8);
|
|
grid->m2200 = 1.0f - (spD8.abs() / 265.0f); // No idea why this is generating an extra lwz instruction for loading mpGrid when the instructions above don't
|
|
|
|
if (mTornadoActor) {
|
|
#if VERSION == VERSION_DEMO
|
|
mpGrid->force_calc_wind_rel_angle(REG4_S(5));
|
|
#else
|
|
mpGrid->force_calc_wind_rel_angle(0x3000);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int iVar23;
|
|
iVar23 = (s16)(m0366 - sVar26);
|
|
int iVar6;
|
|
iVar6 = abs(iVar23);
|
|
iVar23 *= m0366;
|
|
|
|
if (iVar23 > 0 && (float)iVar6 > 420.00003f) {
|
|
seStart(JA_SE_LK_SHIP_RUDDER_OUT, &mTillerTopPos);
|
|
}
|
|
else if (iVar23 < 0 && (float)iVar6 > 525.0f) {
|
|
seStart(JA_SE_LK_SHIP_RUDDER_OUT, &mTillerTopPos);
|
|
}
|
|
|
|
if (!checkStateFlg(daSFLG_FLY_e)) {
|
|
f32 shipCruiseSpeed = std::fabsf(speedF) / 55.0f;
|
|
if (shipCruiseSpeed > 1.0f){
|
|
shipCruiseSpeed = 1.0f;
|
|
}
|
|
else if (shipCruiseSpeed < 0.0f) {
|
|
shipCruiseSpeed = 0.0f;
|
|
}
|
|
mDoAud_shipCruiseSePlay(¤t.pos, shipCruiseSpeed);
|
|
}
|
|
|
|
// This should probably use the mDoMtx_multVecZero inline, but it's not getting inlined
|
|
// mDoMtx_multVecZero(mModel2->getAnmMtx(16), &eyePos);
|
|
MtxP jnt_mtx;
|
|
jnt_mtx = mModel2->getAnmMtx(16);
|
|
eyePos.x = jnt_mtx[0][3];
|
|
eyePos.y = jnt_mtx[1][3];
|
|
eyePos.z = jnt_mtx[2][3];
|
|
|
|
daPy_lk_c* link;
|
|
link = daPy_getPlayerLinkActorClass();
|
|
cXyz spCC;
|
|
spCC = link->current.pos - current.pos;
|
|
f32 distXz = (spCC.x * cM_ssin(shape_angle.y) + spCC.z * cM_scos(shape_angle.y));
|
|
attention_info.flags = 0;
|
|
BOOL r23_2;
|
|
r23_2 = FALSE;
|
|
attention_info.position.set(eyePos.x, eyePos.y + 30.0f, eyePos.z);
|
|
|
|
cXyz spC0;
|
|
if (checkStateFlg(daSFLG_UNK1000000_e)) {
|
|
spC0 = m1068 - eyePos;
|
|
r23_2 = TRUE;
|
|
offStateFlg(daSFLG_UNK1000000_e);
|
|
}
|
|
else if (m0428) {
|
|
spC0 = *m0428 - eyePos;
|
|
r23_2 = TRUE;
|
|
}
|
|
else if ((mCurMode == 10 || mCurMode == 11) && m0434 && mRopeCnt > 0) {
|
|
spC0 = *m0434 - eyePos;
|
|
r23_2 = TRUE;
|
|
}
|
|
else if (mCurMode == 8 || distXz > 125.0f) {
|
|
if (
|
|
(!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) &&
|
|
(!dComIfGs_isEventBit(0x3910) || dComIfGs_isEventBit(0x2D02))) &&
|
|
dComIfGp_getMiniGameType() != 1
|
|
) {
|
|
#if VERSION == VERSION_DEMO
|
|
attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e;
|
|
#endif
|
|
if (fopAcM_searchPlayerDistanceXZ2(this) < SQUARE(500.0f)) {
|
|
spC0 = link->eyePos - eyePos;
|
|
r23_2 = TRUE;
|
|
#if VERSION > VERSION_DEMO
|
|
attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e;
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
attention_info.position = current.pos;
|
|
if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && dComIfGs_isEventBit(0x908) && !checkStateFlg(daSFLG_UNK800000_e)) {
|
|
if (dComIfGs_isEventBit(0x1980) || !dComIfGs_isEventBit(0x902)) {
|
|
attention_info.flags = fopAc_Attn_ACTION_SHIP_e;
|
|
}
|
|
else {
|
|
if (dComIfGs_isEventBit(0xA80)) {
|
|
cXyz* windVec = dKyw_get_wind_vec();
|
|
if (abs(cM_atan2s(windVec->x, windVec->z)) < 0x1000) {
|
|
attention_info.flags = fopAc_Attn_ACTION_SHIP_e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
s16 sVar16;
|
|
s16 sVar5;
|
|
if (r23_2) {
|
|
sVar16 = cM_atan2s(-spC0.y, spC0.absXZ()) - shape_angle.x;
|
|
|
|
if (sVar16 > 0x2000) {
|
|
sVar16 = 0x2000;
|
|
}
|
|
else if (sVar16 < -0x3000) {
|
|
sVar16 = -0x3000;
|
|
}
|
|
|
|
sVar5 = cM_atan2s(spC0.x, spC0.z)- shape_angle.y;
|
|
|
|
if (sVar5 > 0x7800) {
|
|
sVar5 = 0x7800;
|
|
}
|
|
else if (sVar5 < -0x7800) {
|
|
sVar5 = -0x7800;
|
|
}
|
|
|
|
sVar16 = sVar16 / 6;
|
|
sVar5 = sVar5 / 6;
|
|
}
|
|
else {
|
|
sVar16 = 0;
|
|
sVar5 = 0;
|
|
}
|
|
|
|
if (sVar16 == 0 || cLib_distanceAngleS(sVar16, m03A0) > 0x100) {
|
|
cLib_addCalcAngleS(&m03A0, sVar16, 10, 0x400, 4);
|
|
}
|
|
|
|
if (sVar5 == 0 || cLib_distanceAngleS(sVar5, m03A2) > 0x100) {
|
|
cLib_addCalcAngleS(&m03A2, sVar5, 10, 0x400, 4);
|
|
}
|
|
|
|
if (mCurMode != 8 && checkForceMessage()) {
|
|
attention_info.flags &= ~fopAc_Attn_ACTION_SHIP_e;
|
|
cXyz spB4(attention_info.position - link->current.pos);
|
|
if (
|
|
(!dComIfGp_event_runCheck() && dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) ||
|
|
(
|
|
std::fabsf(current.pos.y - link->current.pos.y) < 50.0f &&
|
|
spB4.abs2XZ() < SQUARE(250.0f) &&
|
|
fopAcM_seenPlayerAngleY(this) < 0x6000 &&
|
|
mNextMessageNo != 0xD65
|
|
)
|
|
) {
|
|
fopAcM_orderSpeakEvent(this);
|
|
offStateFlg(daSFLG_UNK400000_e);
|
|
attention_info.flags |= (fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e);
|
|
#if VERSION > VERSION_DEMO
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
#endif
|
|
}
|
|
}
|
|
if (
|
|
(dComIfGs_isEventBit(0x2D10) && !daPy_getPlayerLinkActorClass()->checkMasterSwordEquip()) ||
|
|
(dComIfGs_isEventBit(0x3804) && !dComIfGs_isEventBit(0x2D02)) ||
|
|
(dComIfGs_isEventBit(0x3E10) && !dComIfGs_isEventBit(0x3F80))
|
|
) {
|
|
attention_info.flags &= ~fopAc_Attn_ACTION_SHIP_e;
|
|
}
|
|
if (mCurMode != 8 && dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
BOOL r24_2;
|
|
r24_2 = TRUE;
|
|
if (dComIfGs_isEventBit(0x1E40) && !dComIfGs_isEventBit(0x3840)) {
|
|
mNextMessageNo = 0x168c;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x2D02) && !dComIfGs_isEventBit(0x3201)) {
|
|
mNextMessageNo = 0x1645;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x1820) && !dComIfGs_isEventBit(0x3380)) {
|
|
mNextMessageNo = 0x164d;
|
|
}
|
|
else if(dComIfGs_getTriforceNum() == 8 && !dComIfGs_isEventBit(0x3D04)) {
|
|
mNextMessageNo = 0x1682;
|
|
}
|
|
else if (dComIfGs_isEventBit(0x3E40) && !dComIfGs_isEventBit(0x3E20)) {
|
|
mNextMessageNo = 0x1683;
|
|
}
|
|
else {
|
|
r24_2 = FALSE;
|
|
}
|
|
if (r24_2) {
|
|
fopAcM_orderSpeakEvent(this);
|
|
#if VERSION > VERSION_DEMO
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
#endif
|
|
attention_info.flags |= (fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e);
|
|
offStateFlg(daSFLG_UNK400000_e);
|
|
}
|
|
}
|
|
|
|
mTillerAngleRate = m0366 * (1.0f / 0x2000);
|
|
|
|
prev_speedF = (speedF * 0.1f) / 55.0f;
|
|
|
|
if (prev_speedF > 0.05f) {
|
|
prev_speedF = 0.05f;
|
|
}
|
|
else if (prev_speedF < -0.05f) {
|
|
prev_speedF = -0.05;
|
|
}
|
|
|
|
m03D4 += prev_speedF;
|
|
|
|
if (m03D4 > 1.0f) {
|
|
m03D4 -= 1.0f;
|
|
}
|
|
else if (m03D4 < 0.0f) {
|
|
m03D4 += 1.0f;
|
|
}
|
|
|
|
cXyz spA8(current.pos - old.pos);
|
|
|
|
if (speedF >= 0.0f) {
|
|
mFwdVel = spA8.absXZ();
|
|
}
|
|
else {
|
|
mFwdVel = -spA8.absXZ();
|
|
}
|
|
|
|
mFwdVel += (m1044.x * cM_ssin(current.angle.y) + m1044.z * cM_scos(current.angle.y));
|
|
|
|
if (std::fabsf(mFwdVel) <= 0.01f || prev_fwdvel * mFwdVel < 0.0f || mFwdVel * speedF < 0.0f) {
|
|
mWaveL.mState = 1;
|
|
mWaveR.mState = 1;
|
|
mSplash.mState = 1;
|
|
mTrack.mState = 1;
|
|
}
|
|
|
|
setEffectData(m03F4, sp10);
|
|
|
|
float sin = cM_ssin(shape_angle.y);
|
|
float cos = cM_scos(shape_angle.y);
|
|
|
|
dCcD_Cyl* cyl = mCyl;
|
|
|
|
cXyz sp9C;
|
|
for(int i = 0; i < 3; i++, cyl++) {
|
|
sp9C.x = current.pos.x + sin * cyl_offset[i];
|
|
sp9C.y = current.pos.y - 30.0f;
|
|
sp9C.z = current.pos.z + cos * cyl_offset[i];
|
|
cyl->SetC(sp9C);
|
|
dComIfG_Ccsp()->Set(cyl);
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
cyl->SetTgGrp(cCcD_TgSPrm_IsPlayer_e);
|
|
}
|
|
else {
|
|
cyl->SetTgGrp(cCcD_TgSPrm_IsPlayer_e | cCcD_TgSPrm_IsOther_e);
|
|
}
|
|
}
|
|
|
|
cMtx_multVec(mpHeadAnm->getModel()->getAnmMtx(8), &sph_offset, &sp9C);
|
|
|
|
if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) {
|
|
mSph.SetTgGrp(cCcD_TgSPrm_IsPlayer_e);
|
|
}
|
|
else {
|
|
mSph.SetTgGrp(cCcD_TgSPrm_IsPlayer_e | cCcD_TgSPrm_IsOther_e);
|
|
}
|
|
|
|
mSph.SetC(sp9C);
|
|
|
|
if (mCurMode != 9) {
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
}
|
|
else {
|
|
mSph.ResetTgHit();
|
|
}
|
|
|
|
if (mPart == PART_STEER_e) {
|
|
dComIfGp_setPlayerStatus1(0, daPyStts1_SAIL_e);
|
|
mDoAud_setShipSailState(1);
|
|
|
|
}
|
|
else {
|
|
dComIfGp_clearPlayerStatus1(0, daPyStts1_SAIL_e);
|
|
mDoAud_setShipSailState(0);
|
|
}
|
|
|
|
mNextMode = mCurMode;
|
|
|
|
offStateFlg(daSFLG_UNK40000000_e);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000B9D4-0000B9F4 .text daShip_Execute__FP8daShip_c */
|
|
static BOOL daShip_Execute(daShip_c* i_this) {
|
|
return ((daShip_c*)i_this)->execute();
|
|
}
|
|
|
|
/* 0000B9F4-0000B9FC .text daShip_IsDelete__FP8daShip_c */
|
|
static BOOL daShip_IsDelete(daShip_c*) {
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000B9FC-0000BB1C .text shipDelete__8daShip_cFv */
|
|
BOOL daShip_c::shipDelete() {
|
|
mWaveL.remove();
|
|
mWaveR.remove();
|
|
mSplash.remove();
|
|
mTrack.remove();
|
|
mRipple.remove();
|
|
m1984.remove();
|
|
m1998.remove();
|
|
m19AC.remove();
|
|
m19C0.remove();
|
|
mDoAud_seDeleteObject(&mTillerTopPos);
|
|
mDoAud_seDeleteObject(&m0444);
|
|
mDoAud_seDeleteObject(&m102C);
|
|
mDoAud_seDeleteObject(&m1020);
|
|
mDoAud_seDeleteObject(&m1038);
|
|
dComIfGp_clearPlayerStatus1(0, daPyStts1_SAIL_e);
|
|
dComIfG_resDelete(&mPhs, l_arcName);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000BB1C-0000BB40 .text daShip_Delete__FP8daShip_c */
|
|
static BOOL daShip_Delete(daShip_c* i_this) {
|
|
((daShip_c*)i_this)->shipDelete();
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000BB40-0000BFB8 .text createHeap__8daShip_cFv */
|
|
BOOL daShip_c::createHeap() {
|
|
J3DModelData* modelData;
|
|
|
|
if (checkStateFlg(daSFLG_SAIL_ON_e)) {
|
|
m0392 = SHIP_BCK_FN_MAST_ON2;
|
|
}
|
|
else {
|
|
m0392 = SHIP_BCK_FN_MAST_OFF2;
|
|
}
|
|
modelData = (J3DModelData *)dComIfG_getObjectRes(l_arcName, SHIP_BDL_FN_BODY);
|
|
JUT_ASSERT(DEMO_SELECT(6969, 7004), modelData != NULL);
|
|
|
|
mpBodyAnm = new mDoExt_McaMorf(
|
|
modelData, NULL, NULL,
|
|
(J3DAnmTransformKey*)dComIfG_getObjectRes(l_arcName, m0392),
|
|
J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, 0, NULL,
|
|
0x80000, 0x11200202
|
|
);
|
|
|
|
if (mpBodyAnm && mpBodyAnm->getModel()) {
|
|
J3DModel* pModel = mpBodyAnm->getModel();
|
|
J3DSkinDeform* mSkinDeform = new J3DSkinDeform();
|
|
if (mSkinDeform == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (pModel->setSkinDeform(mSkinDeform, 1) != J3DErrType_Success) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData = (J3DModelData *)dComIfG_getObjectRes(l_arcName, SHIP_BDL_VFNCN);
|
|
JUT_ASSERT(DEMO_SELECT(7006, 7041), modelData != NULL);
|
|
mpCannonModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002);
|
|
|
|
if (mpCannonModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData = (J3DModelData *)dComIfG_getObjectRes(l_arcName, SHIP_BDL_VFNCR);
|
|
JUT_ASSERT(DEMO_SELECT(7019, 7054), modelData != NULL);
|
|
mpSalvageArmModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002);
|
|
|
|
if (mpSalvageArmModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData = (J3DModelData *)dComIfG_getObjectRes("Link", LINK_BDL_ROPEEND);
|
|
JUT_ASSERT(DEMO_SELECT(7032, 7067), modelData != NULL);
|
|
mpLinkModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002);
|
|
|
|
if (mpLinkModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData = (J3DModelData *)dComIfG_getObjectRes(l_arcName, SHIP_BDL_FN_HEAD_H);
|
|
JUT_ASSERT(DEMO_SELECT(7045, 7080), modelData != NULL);
|
|
|
|
m03B4 = SHIP_BCK_FN_LOOK_L;
|
|
|
|
mpHeadAnm = new mDoExt_McaMorf(
|
|
modelData, NULL, NULL,
|
|
(J3DAnmTransformKey*)dComIfG_getObjectRes(l_arcName, SHIP_BCK_FN_LOOK_L),
|
|
J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1, 0, NULL,
|
|
0x80000, 0x11000002
|
|
);
|
|
|
|
if (mpHeadAnm == NULL || mpHeadAnm->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
mpHeadAnm->setMorf(3.0f);
|
|
if (mRopeLine.init(1, 0xFA, (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_ROPE), 0)) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* 0000BFB8-0000BFD8 .text daShip_createHeap__FP10fopAc_ac_c */
|
|
static BOOL daShip_createHeap(fopAc_ac_c* i_this) {
|
|
return ((daShip_c*)i_this)->createHeap();
|
|
}
|
|
|
|
/* 0000BFD8-0000C790 .text create__8daShip_cFv */
|
|
cPhs_State daShip_c::create() {
|
|
J3DModel* pModel;
|
|
J3DMaterial* pMaterial;
|
|
J3DModelData* pModelData;
|
|
s32 res;
|
|
|
|
static dCcD_SrcCyl cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e| cCcD_CoSPrm_VsGrpAll_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ 0,
|
|
/* SrcGObjAt Spl */ 0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ dCcG_SE_UNK23,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ 0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ 0,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 75.0f,
|
|
/* Height */ 115.0f,
|
|
}},
|
|
};
|
|
|
|
static dCcD_SrcSph sph_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e| cCcD_CoSPrm_VsGrpAll_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ 0,
|
|
/* SrcGObjAt Spl */ 0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ dCcG_SE_UNK23,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ 0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ 0,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGSphS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 75.0f,
|
|
}},
|
|
};
|
|
|
|
fopAcM_SetupActor(this, daShip_c);
|
|
|
|
if (!dComIfGs_isEventBit(dSv_evtBit_c::MET_KORL)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
res = dComIfG_resLoad(&mPhs, l_arcName);
|
|
|
|
if (((fopAcM_GetParam(this) >> 8) & 0xFF) == 1) {
|
|
m03E8 = 1.0f;
|
|
onStateFlg(daSFLG_SAIL_ON_e);
|
|
}
|
|
else {
|
|
m03E8 = 0.001f;
|
|
offStateFlg(daSFLG_SAIL_ON_e);
|
|
}
|
|
|
|
if (res == cPhs_COMPLEATE_e) {
|
|
if (!fopAcM_entrySolidHeap(this, daShip_createHeap, 0x20000)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
mpBodyAnm->setFrame(mpBodyAnm->getEndFrame());
|
|
|
|
pModel = mpBodyAnm->getModel();
|
|
pModelData = pModel->getModelData();
|
|
|
|
pModel->setUserArea(reinterpret_cast<u32>(this));
|
|
|
|
fopAcM_SetMtx(this, pModel->getBaseTRMtx());
|
|
|
|
for (u16 jno = 0; jno < pModelData->getJointNum(); jno++) {
|
|
if ((jno == 10) || (jno == 5) || (jno == 7) || (jno == 6)) {
|
|
pModelData->getJointNodePointer(jno)->setCallBack(daShip_bodyJointCallBack);
|
|
}
|
|
}
|
|
|
|
for (u16 mno = 0; mno < pModelData->getMaterialNum(); mno++) {
|
|
pMaterial = pModelData->getMaterialNodePointer(mno);
|
|
for(u32 i = 0; i < 8; i++) {
|
|
J3DTexGenBlock* pTexGenBlock = pMaterial->getTexGenBlock();
|
|
J3DTexMtx* pTexMtx = pTexGenBlock->getTexMtx(i);
|
|
if (pTexMtx && pTexMtx->getTexMtxInfo().mInfo == 8) {
|
|
m02A0 = pTexMtx;
|
|
m02A4 = pTexMtx;
|
|
}
|
|
}
|
|
}
|
|
|
|
C_MTXOrtho(m02A8, 50.0f, -50.0f, -50.0f, 50.0f, 0.1f, 100000.0f);
|
|
|
|
pModel = mpHeadAnm->getModel();
|
|
pModelData = pModel->getModelData();
|
|
|
|
pModel->setUserArea(reinterpret_cast<u32>(this));
|
|
|
|
for (u16 jno = 0; jno < pModelData->getJointNum(); jno++) {
|
|
if (jno == 8 || jno == 10) {
|
|
pModelData->getJointNodePointer(jno)->setCallBack(daShip_headJointCallBack0);
|
|
}
|
|
else if (
|
|
!(jno != 2 && jno != 3 && jno != 4 && jno != 5 && jno != 6) || (jno == 7)
|
|
// Should probably be written as
|
|
// jno == 2 || jno == 3 || jno == 4 || jno == 5 || jno == 6 || jno == 7
|
|
// But the compiler optimizes that differently
|
|
) {
|
|
pModelData->getJointNodePointer(jno)->setCallBack(daShip_headJointCallBack1);
|
|
}
|
|
}
|
|
|
|
mpCannonModel->setUserArea(reinterpret_cast<u32>(this));
|
|
|
|
pModelData = mpCannonModel->getModelData();
|
|
|
|
pModelData->getJointNodePointer(1)->setCallBack(daShip_cannonJointCallBack);
|
|
pModelData->getJointNodePointer(2)->setCallBack(daShip_cannonJointCallBack);
|
|
|
|
mpSalvageArmModel->setUserArea(reinterpret_cast<u32>(this));
|
|
mpSalvageArmModel->getModelData()->getJointNodePointer(1)->setCallBack(daShip_craneJointCallBack);
|
|
|
|
m034B = fopAcM_GetParam(this);
|
|
mPart = PART_WAIT_e;
|
|
mTornadoID = fpcM_ERROR_PROCESS_ID_e;
|
|
mTornadoActor = NULL;
|
|
mWhirlID = fpcM_ERROR_PROCESS_ID_e;
|
|
mWhirlActor = NULL;
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
mTactWarpID = fpcM_ERROR_PROCESS_ID_e;
|
|
#else
|
|
if (mNextMode != MODE_START_MODE_WARP_e) {
|
|
mTactWarpID = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
#endif
|
|
|
|
if (checkStateFlg(daSFLG_SAIL_ON_e) != 0) {
|
|
mPart = PART_STEER_e;
|
|
procSteerMove_init();
|
|
}
|
|
else {
|
|
if (mNextMode == MODE_PADDLE_MOVE_e) {
|
|
procPaddleMove_init();
|
|
}
|
|
else if (mNextMode == MODE_START_MODE_WARP_e) {
|
|
procStartModeWarp_init();
|
|
}
|
|
else if (mNextMode == MODE_START_MODE_THROW_e) {
|
|
procStartModeThrow_init();
|
|
}
|
|
else {
|
|
procWait_init();
|
|
}
|
|
}
|
|
|
|
if (
|
|
(dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) == dStageType_SEA_e)
|
|
|| !strcmp(dComIfGp_getStartStageName(), "Hyrule")
|
|
#if VERSION > VERSION_DEMO
|
|
|| !strcmp(dComIfGp_getStartStageName(), "Ocean")
|
|
#endif
|
|
) {
|
|
m03CC = 4;
|
|
}
|
|
else {
|
|
m03CC = 3;
|
|
}
|
|
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, m03CC, &mAcchCir[0], fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this));
|
|
|
|
mAcchCir[0].SetWall(0.0f, 250.0f);
|
|
mAcchCir[1].SetWall(75.0f, 250.0f);
|
|
mAcchCir[2].SetWall(150.0f, 250.0f);
|
|
mAcchCir[3].SetWall(-600.0f-current.pos.y, 250.0f);
|
|
|
|
mAcch.ClrWaterNone();
|
|
mAcch.SetWaterCheckOffset(10000.0f);
|
|
|
|
attention_info.flags = 0;
|
|
attention_info.position = current.pos;
|
|
|
|
gravity = -2.5f;
|
|
maxFallSpeed = -150.0f;
|
|
mGridID = fopAcM_create(PROC_GRID, 1, ¤t.pos, -1, ¤t.angle);
|
|
|
|
if (mGridID == fpcM_ERROR_PROCESS_ID_e) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
mTactWarpPosNum = -1;
|
|
m03E0 = 10000.0f;
|
|
mStts.Init(0xF0, 0, this);
|
|
|
|
dCcD_Cyl* cyl = mCyl;
|
|
for (int i = 0; i < 3; i++, cyl++) {
|
|
cyl->Set(cyl_src);
|
|
cyl->SetStts((&mStts));
|
|
}
|
|
|
|
mCyl[1].SetR(95.0f);
|
|
mSph.Set(sph_src);
|
|
mSph.SetStts(&mStts);
|
|
|
|
cull.box.min.x = -325.0f;
|
|
cull.box.min.y = -50.0f;
|
|
cull.box.min.z = -325.0f;
|
|
cull.box.max.x = 325.0f;
|
|
cull.box.max.y = 570.0f;
|
|
cull.box.max.z = 240.0f;
|
|
|
|
fopKyM_create(PROC_WIND_ARROW, (s32)this, 0, 0, 0);
|
|
|
|
offStateFlg(daSFLG_UNK2_e);
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
|
|
setRoomInfo();
|
|
|
|
m03F4 = getWaterY();
|
|
|
|
if (mCurMode == MODE_START_MODE_WARP_e) {
|
|
current.pos.y = m03F4 + 5000.0f;
|
|
}
|
|
else if (mCurMode == MODE_START_MODE_THROW_e) {
|
|
current.pos.y = m03F4 + 2500.0f;
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
|
|
mpBodyAnm->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpBodyAnm->play(NULL, 0, 0);
|
|
mpBodyAnm->calc();
|
|
|
|
cMtx_multVec(mpBodyAnm->getModel()->getAnmMtx(10), &l_tiller_top_offset, &mTillerTopPos);
|
|
|
|
mpHeadAnm->play(NULL, 0, 0);
|
|
mpHeadAnm->getModel()->setBaseTRMtx(mpBodyAnm->getModel()->getAnmMtx(4));
|
|
mpHeadAnm->calc();
|
|
|
|
dComIfGp_setShipActor(this);
|
|
|
|
mTrack.mMinVel = 3.0f;
|
|
mWaveL.mMaxParticleVelocity = 40.0f;
|
|
mWaveR.mMaxParticleVelocity = 40.0f;
|
|
m19C0.mRate = 0.0f;
|
|
|
|
if (dStage_stagInfo_GetSTType(dComIfGp_getStageStagInfo()) == dStageType_SEA_e) {
|
|
fopAcM_createChild(PROC_Coming2, fopAcM_GetID(this), 0, ¤t.pos, -1, NULL);
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
/* 0000D018-0000D038 .text daShip_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daShip_Create(fopAc_ac_c* i_this) {
|
|
return ((daShip_c*)i_this)->create();
|
|
}
|
|
|
|
static actor_method_class l_daShip_Method = {
|
|
(process_method_func)daShip_Create,
|
|
(process_method_func)daShip_Delete,
|
|
(process_method_func)daShip_Execute,
|
|
(process_method_func)daShip_IsDelete,
|
|
(process_method_func)daShip_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_SHIP = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0004,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_SHIP,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daShip_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_SHIP,
|
|
/* Actor SubMtd */ &l_daShip_Method,
|
|
/* Status */ 0x02 | fopAcStts_SHOWMAP_e | fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e | fopAcStts_UNK200000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|