/** * 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(node); s32 jntNo = joint->getJntNo(); J3DModel* model = j3dSys.getModel(); daShip_c* i_this = reinterpret_cast(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(node); s32 jntNo = joint->getJntNo(); J3DModel* model = j3dSys.getModel(); daShip_c* i_this = reinterpret_cast(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(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(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(node); s32 jntNo = joint->getJntNo(); J3DModel* model = j3dSys.getModel(); daShip_c* i_this = reinterpret_cast(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 wave_l_direction(0.5f, 1.0f, -0.3f); static JGeometry::TVec3 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(JGeometry::TVec3(1.5f, 1.5f, 1.0f)); 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(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(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(this)); pModelData = mpCannonModel->getModelData(); pModelData->getJointNodePointer(1)->setCallBack(daShip_cannonJointCallBack); pModelData->getJointNodePointer(2)->setCallBack(daShip_cannonJointCallBack); mpSalvageArmModel->setUserArea(reinterpret_cast(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, };