diff --git a/configure.py b/configure.py index fbdbcc37d..a99537bc6 100755 --- a/configure.py +++ b/configure.py @@ -1410,7 +1410,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_hfuck1", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_hole", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_ice", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_obj_ikada"), + ActorRel(NonMatching, "d_a_obj_ikada", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_kanat"), ActorRel(NonMatching, "d_a_obj_leaves"), ActorRel(NonMatching, "d_a_obj_lpalm"), diff --git a/include/d/actor/d_a_majuu_flag.h b/include/d/actor/d_a_majuu_flag.h index 858d05612..265653c12 100644 --- a/include/d/actor/d_a_majuu_flag.h +++ b/include/d/actor/d_a_majuu_flag.h @@ -51,18 +51,18 @@ public: /* 0x798 */ s16 m798; /* 0x79A */ u8 mCurArr; /* 0x79B */ u8 m79B; -}; // size >= 0x7A0 +}; // size = 0x79C class daMajuu_Flag_c : public fopAc_ac_c { public: - void setBaseScale(float) {} - void setOtherMatrix(Mtx*) {} - void setOtherOffset(cXyz*) {} + void setBaseScale(float scale) { mFlagScale = scale; } + void setOtherMatrix(Mtx* mtx) { mpParentMtx = *mtx; } + void setOtherOffset(cXyz* pos) { mpParentPos = pos; } public: /* 0x290 */ u8 m290[0x2A0 - 0x290]; /* 0x2A0 */ daMajuu_Flag_packet_c mPacket; - /* 0xA3D */ u8 mA3D[0xA40 - 0xA3D]; + /* 0xA3C */ u8 mA3C[0xA40 - 0xA3C]; /* 0xA40 */ request_of_phase_process_class mPhsCloth; /* 0xA48 */ request_of_phase_process_class mPhsFlag; /* 0xA50 */ u8 mA50[0xA58 - 0xA50]; diff --git a/include/d/actor/d_a_obj_ikada.h b/include/d/actor/d_a_obj_ikada.h index 28c625324..891d4552f 100644 --- a/include/d/actor/d_a_obj_ikada.h +++ b/include/d/actor/d_a_obj_ikada.h @@ -10,31 +10,33 @@ #include "SSystem/SComponent/c_phase.h" #include "d/d_path.h" #include "d/d_lib.h" +#include "m_Do/m_Do_hostIO.h" class daObj_Ikada_c : public fopAc_ac_c { public: enum Proc_e { - + PROC_00_e = 0, + PROC_01_e = 1, }; void getCranePos() {} void getFrame() {} void getMode() {} void getSvDirection() {} - void isBonbori() {} - void isCrane() {} - void isFlag() {} - void isWave() {} - void modeProcInit(int) {} + bool isBonbori() { return mType == 3 || mType == 1; } + bool isCrane() {return mType == 4; } + bool isFlag() { return mType == 0 || mType == 4; } + bool isWave() {} + void modeProcInit(int idx) { modeProc(PROC_00_e, idx); } void setInitPos() {} void setStart() {} void setStop() {} void _nodeControl(J3DNode*, J3DModel*); - void _pathMove(cXyz*, cXyz*, cXyz*); + BOOL _pathMove(cXyz*, cXyz*, cXyz*); void _ride(fopAc_ac_c*); void setCollision(); - void checkTgHit(); + bool checkTgHit(); void pathMove(); void HandleRight(); void HandleLeft(); @@ -76,14 +78,20 @@ public: bool _draw(); void getArg(); void createInit(); - void _createHeap(); + BOOL _createHeap(); cPhs_State _create(); bool _delete(); - const static dCcD_SrcSph m_sph_src; + static cXyz m_rope_base_vec; + static cXyz m_crane_offset; + static const dCcD_SrcSph m_sph_src; + static const u32 m_heapsize[]; + static const char m_arc_name[]; + static const f32 m_rope_joint_len; + static const s32 m_rope_min_cnt; public: - /* 0x0290 */ u32 mType; + /* 0x0290 */ s32 mType; /* 0x0294 */ u32 m0294; /* 0x0298 */ u32 m0298; /* 0x029C */ u32 m029C; @@ -102,14 +110,15 @@ public: /* 0x02E8 */ u8 m02E8[0x02EC - 0x02E8]; /* 0x02EC */ u8 mbCraneMode; /* 0x02ED */ u8 m02ED[0x02F0 - 0x02ED]; - /* 0x02F0 */ int mCurMode; - /* 0x02F4 */ int m02F4; + /* 0x02F0 */ s32 mCurMode; + /* 0x02F4 */ s32 m02F4; /* 0x02F8 */ dPa_waveEcallBack mWaveLCallback; /* 0x035C */ dPa_waveEcallBack mWaveRCallback; /* 0x03C0 */ dPa_splashEcallBack mSplashCallBack; /* 0x03DC */ dPa_trackEcallBack mTrackCallBack; /* 0x042C */ dPa_rippleEcallBack mRippleCallBack; - /* 0x0440 */ u8 m0440[0x0450 - 0x0440]; + /* 0x0440 */ u8 m0440; + /* 0x0444 */ cXyz m0444; /* 0x0450 */ cXyz mWavePos; /* 0x045C */ csXyz mWaveRot; /* 0x0462 */ u8 m0462[0x0464 - 0x0462]; @@ -137,11 +146,10 @@ public: /* 0x0520 */ u8 m0520[0x0528 - 0x0520]; /* 0x0528 */ s16 mLightRotX; /* 0x052A */ s16 mLightRotY; - /* 0x052C */ request_of_phase_process_class mPhs; + /* 0x052C */ request_of_phase_process_class mPhase; /* 0x0534 */ J3DModel* mpModel; /* 0x0538 */ mDoExt_bckAnm mBckAnm; - /* 0x0548 */ u8 mbIsLinkRiding; - /* 0x0549 */ u8 m0549[0x054C - 0x0549]; + /* 0x0548 */ bool mbIsLinkRiding; /* 0x054C */ dBgW* mpBgW; /* 0x0550 */ Mtx mMtx; /* 0x0580 */ dBgS_ObjAcch mObjAcch; @@ -151,10 +159,10 @@ public: /* 0x0794 */ f32 mFlagScale; /* 0x0798 */ J3DModel* mpRopeEnd; /* 0x079C */ mDoExt_3DlineMat1_c mRopeLine; - /* 0x07D8 */ int m07D8; + /* 0x07D8 */ s32 m07D8; /* 0x07DC */ cXyz m07DC[200]; /* 0x113C */ csXyz mJointRot[4]; - /* 0x1154 */ u32 m1154; + /* 0x1154 */ s32 m1154; /* 0x1158 */ s16 m1158; /* 0x115A */ s16 m115A; /* 0x115C */ s16 m115C; @@ -164,11 +172,11 @@ public: /* 0x1164 */ s16 mWaveAnimTimer; /* 0x1166 */ u8 m1166; /* 0x1167 */ u8 m1167[0x1168 - 0x1167]; - /* 0x1168 */ int m1168; - /* 0x116C */ int mSvId[4]; + /* 0x1168 */ s32 m1168; + /* 0x116C */ s32 mSvId[4]; /* 0x117C */ dCcD_Sph mSph; /* 0x12A8 */ dCcD_Stts mStts; - /* 0x12E4 */ u8 m12E4[0x12E8 - 0x12E4]; + /* 0x12E4 */ int m12E4; /* 0x12E8 */ cXyz mSePos; /* 0x12F4 */ int mStopTimer; /* 0x12F8 */ dLib_wave_c mWave; @@ -177,12 +185,54 @@ public: /* 0x1328 */ cXyz mInitPos; }; -class daObj_Ikada_HIO_c { +class daObj_Ikada_HIO_c : public mDoHIO_entry_c { public: daObj_Ikada_HIO_c(); + virtual ~daObj_Ikada_HIO_c() {} + + void genMessage(JORMContext* ctx); public: - /* Place member variables here */ -}; + /* 0x04 */ u8 mbDebugDraw; + /* 0x05 */ u8 m05; + /* 0x06 */ u8 m06; + /* 0x07 */ u8 mbNoRotAnim; + /* 0x08 */ u8 m08; + /* 0x09 */ u8 m09[0x0C - 0x09]; + /* 0x0C */ Vec mFlagOffset; + /* 0x18 */ f32 mFlagScale; + /* 0x1C */ s16 m1C; + /* 0x1E */ s16 m1E; + /* 0x20 */ f32 m20; + /* 0x24 */ s16 m24; + /* 0x26 */ u8 m26[0x28 - 0x26]; + /* 0x28 */ f32 m28; + /* 0x2C */ f32 mShipOffsY_Attention; + /* 0x30 */ f32 mShipOffsY_Eye; + /* 0x34 */ f32 mTerryWaveOffsZ; + /* 0x38 */ f32 mTerryWaveOffsY; + /* 0x3C */ f32 mTerryTrackOffsZ; + /* 0x40 */ f32 mSvWaveOffsX; + /* 0x44 */ f32 mSvTrackOffsX; + /* 0x48 */ f32 mSvOffsX[4]; + /* 0x58 */ f32 mTrackIndTransY; + /* 0x5C */ f32 mTrackIndScaleY; + /* 0x60 */ f32 mSplashScaleMax; + /* 0x64 */ f32 mSplashMaxScaleTimer; + /* 0x68 */ f32 mWaveVelFade; + /* 0x6C */ f32 mTrackVel; + /* 0x70 */ f32 mWaveVelSpeed; + /* 0x74 */ f32 mWaveVelOffs; + /* 0x78 */ f32 mWaveMaxVelocity; + /* 0x7C */ Vec mWaveCollapsePos[2]; + /* 0x94 */ s16 m94; + /* 0x96 */ s16 mPlayerStopDistance; + /* 0x98 */ s16 m98; + /* 0x9A */ s16 m9A; + /* 0x9C */ f32 m9C; + /* 0xA0 */ f32 mVelocityTargetTerry1; + /* 0xA4 */ f32 mVelocityTargetTerry3; + /* 0xA8 */ f32 mA8; +}; // size = 0xAC #endif /* D_A_OBJ_IKADA_H */ diff --git a/include/d/d_bg_w.h b/include/d/d_bg_w.h index 822a7c99e..ec3797c21 100644 --- a/include/d/d_bg_w.h +++ b/include/d/d_bg_w.h @@ -100,7 +100,7 @@ public: void OnMoveFlag() {} void RoofChk(dBgS_RoofChk*) {} void RwgCaptPoly(int, dBgS_CaptPoly&) {} - void SetGrpRoomInf(int) {} + void SetGrpRoomInf(int room) { mRoomNo2 = room; } void SetOldShapeAngleY(s16) {} void SetRoomId(u16 roomNo) { mRoomNo = roomNo; } void SphChk(dBgS_SphChk*, void*) {} diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 1cc625213..fcc40c01c 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -125,12 +125,12 @@ public: void draw(JPABaseEmitter*); JPABaseEmitter* getEmitter() { return mpBaseEmitter; } - void setTimer (s16 timerVal) { mFadeTimer = timerVal; } - void setSpeed (f32 vel) { mVelFade1 = vel; } - void setPitch (f32 pitch) { mVelFade2 = pitch; } - void setMaxSpeed (f32 vel) { mMaxParticleVelocity = vel; } - void setMaxDisSpeed (f32 vel) { mVelSpeed = vel; } - void setAnchor (cXyz* anchorPos1, cXyz* anchorPos2) { mCollapsePos[0].set(*anchorPos1); mCollapsePos[1].set(*anchorPos2); } + void setTimer(s16 timerVal) { mFadeTimer = timerVal; } + void setSpeed(f32 vel) { mVelFade1 = vel; } + void setPitch(f32 pitch) { mVelFade2 = pitch; } + void setMaxSpeed(f32 vel) { mMaxParticleVelocity = vel; } + void setMaxDisSpeed(f32 vel) { mVelSpeed = vel; } + void setAnchor(const cXyz* anchorPos1, const cXyz* anchorPos2) { mCollapsePos[0].set(*anchorPos1); mCollapsePos[1].set(*anchorPos2); } virtual ~dPa_waveEcallBack() {} @@ -175,10 +175,14 @@ public: void remove(); void execute(JPABaseEmitter*); void draw(JPABaseEmitter*); + void stop() { mState = 1; } JPABaseEmitter* getEmitter() { return mpBaseEmitter; } - void setIndirectTexData (f32 exTransY, f32 exScaleY) { mExTransY = exTransY; mExScaleY = exScaleY; } - void setSpeed (f32 vel) { mVel = vel; } + void setIndirectTexData(f32 exTransY, f32 exScaleY) { mExTransY = exTransY; mExScaleY = exScaleY; } + void setSpeed(f32 vel) { mVel = vel; } + void setLimitSpeed(f32 vel) { mMinVel = vel; } + void setWaterY(f32 y) { mBaseY = y; } + void setWaterFlatY(f32 y) { mMinY = y; } virtual ~dPa_trackEcallBack() {} diff --git a/src/d/actor/d_a_obj_ikada.cpp b/src/d/actor/d_a_obj_ikada.cpp index 24f4c1958..f9f931f01 100644 --- a/src/d/actor/d_a_obj_ikada.cpp +++ b/src/d/actor/d_a_obj_ikada.cpp @@ -4,9 +4,35 @@ */ #include "d/actor/d_a_obj_ikada.h" -#include "d/d_procname.h" -#include "d/d_priority.h" +#include "d/actor/d_a_bomb.h" +#include "d/actor/d_a_majuu_flag.h" +#include "d/actor/d_a_player.h" +#include "d/d_bg_s_movebg_actor.h" #include "d/d_cc_d.h" +#include "d/d_com_inf_game.h" +#include "d/d_lib.h" +#include "d/d_priority.h" +#include "d/d_procname.h" +#include "d/d_s_play.h" +#include "d/d_snap.h" +#include "d/res/res_always.h" +#include "d/res/res_ikadah.h" +#include "d/res/res_link.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_kankyo_mng.h" + +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep + +cXyz daObj_Ikada_c::m_rope_base_vec(0.0f, -10.0f, 0.0f); +cXyz daObj_Ikada_c::m_crane_offset(200.0f, -340.0f, 0.0f); +static daObj_Ikada_HIO_c l_HIO; + +#include "weak_data_1811.h" // IWYU pragma: keep + +const u32 daObj_Ikada_c::m_heapsize[] = {0x1D00, 0x2F60, 0x2E20, 0x32E0, 0x6D60}; +const char daObj_Ikada_c::m_arc_name[] = "IkadaH"; +const f32 daObj_Ikada_c::m_rope_joint_len = 10.0f; +const s32 daObj_Ikada_c::m_rope_min_cnt = 15; const dCcD_SrcSph daObj_Ikada_c::m_sph_src = { // dCcD_SrcGObjInf @@ -37,275 +63,1503 @@ const dCcD_SrcSph daObj_Ikada_c::m_sph_src = { }}, }; - /* 000000EC-00000254 .text __ct__17daObj_Ikada_HIO_cFv */ daObj_Ikada_HIO_c::daObj_Ikada_HIO_c() { - /* Nonmatching */ + mbDebugDraw = 0; + m05 = 0; + m06 = 0; + mbNoRotAnim = 0; + m08 = 0; + mShipOffsY_Attention = 900.0f; + mShipOffsY_Eye = 300.0f; + mSvWaveOffsX = -320.0f; + mSvTrackOffsX = 240.0f; + mTerryWaveOffsZ = 660.0f; + mTerryWaveOffsY = 20.0f; + mTerryTrackOffsZ = -180.0f; + m24 = 0x3c; + mSvOffsX[0] = 265.0f; + mSvOffsX[1] = -18.0f; + mSvOffsX[2] = -97.0f; + mSvOffsX[3] = -175.0f; + mFlagScale = 0.0f; + mFlagOffset.x = 0.0f; + mFlagOffset.y = 0.0f; + mFlagOffset.z = 0.0f; + m1C = 0; + m20 = 1.5f; + m1E = 100; + m28 = 100.0f; + mTrackIndTransY = -0.04; + mTrackIndScaleY = 4.0f; + mSplashScaleMax = 200.0f; + mSplashMaxScaleTimer = 300.0f; + mWaveVelFade = 2.0f; + mTrackVel = 300.0f; + mWaveVelSpeed = 2.0f; + mWaveMaxVelocity = 15.0f; + mWaveVelOffs = 0.0f; + mWaveCollapsePos[0].x = -80.0f; + mWaveCollapsePos[0].y = -50.0f; + mWaveCollapsePos[0].z = -150.0f; + mWaveCollapsePos[1].x = -40.0f; + mWaveCollapsePos[1].y = -100.0f; + mWaveCollapsePos[1].z = -350.0f; + m94 = 3000; + mPlayerStopDistance = 6000; + m98 = 1000; + m9A = 1000; + m9C = 300.0f; + mVelocityTargetTerry1 = 12.0f; + mVelocityTargetTerry3 = 15.0f; + mA8 = 30.0f; } /* 000002D8-00000324 .text nodeControl_CB__FP7J3DNodei */ -static BOOL nodeControl_CB(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeControl_CB(J3DNode* node, int arg1) { + J3DJoint* joint = (J3DJoint*)node; + if (arg1 == 0) { + daObj_Ikada_c* i_this = (daObj_Ikada_c*)j3dSys.getModel()->getUserArea(); + if (i_this != NULL) { + i_this->_nodeControl(joint, j3dSys.getModel()); + } + } + return TRUE; } /* 00000324-00000458 .text _nodeControl__13daObj_Ikada_cFP7J3DNodeP8J3DModel */ -void daObj_Ikada_c::_nodeControl(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daObj_Ikada_c::_nodeControl(J3DNode* node, J3DModel* model) { + J3DJoint* joint = (J3DJoint*)node; + s32 uVar1 = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(uVar1)); + mDoMtx_stack_c::ZXYrotM(mJointRot[uVar1].x, mJointRot[uVar1].y, mJointRot[uVar1].z); + if (uVar1 == 1) { + mDoMtx_stack_c::XrotM(m115A + this->m115E * (REG12_S(5) + 5) * cM_ssin(m115C)); + } + MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(uVar1, mDoMtx_stack_c::get()); } /* 00000458-00000494 .text pathMove_CB__FP4cXyzP4cXyzP4cXyzPv */ -void pathMove_CB(cXyz*, cXyz*, cXyz*, void*) { - /* Nonmatching */ +BOOL pathMove_CB(cXyz* arg1, cXyz* arg2, cXyz* arg3, void* v_this) { + return ((daObj_Ikada_c*)v_this)->_pathMove(arg1, arg2, arg3); } /* 00000494-000007A0 .text _pathMove__13daObj_Ikada_cFP4cXyzP4cXyzP4cXyz */ -void daObj_Ikada_c::_pathMove(cXyz*, cXyz*, cXyz*) { - /* Nonmatching */ +BOOL daObj_Ikada_c::_pathMove(cXyz* arg1, cXyz* arg2, cXyz* arg3) { + s8 index; + if (mCurPathPoint < mpPath->m_num - 1) { + index = mCurPathPoint + 1; + } else { + index = 0; + } + + if (mpPath->m_points[index].mArg3 != 0xff) { + mbCraneMode = 1; + } else { + mbCraneMode = 0; + } + + mCurPathP0 = *arg2; + mCurPathP0.y = current.pos.y; + mCurPathP1 = *arg3; + mCurPathP1.y = current.pos.y; + + cXyz sp4C = mCurPathP1 - mCurPathP0; + if (!sp4C.normalizeRS()) { + return TRUE; + } + + s16 uVar3 = cLib_addCalcAngleS(¤t.angle.y, cM_atan2s(sp4C.x, sp4C.z), 8, 0x200, 8); + f32 speed = speedF * std::fabsf(cM_scos(uVar3)); + cLib_chasePosXZ(arg1, mCurPathP1, speed); + + if ((*arg1 - mCurPathP1).absXZ() < speed * (REG12_F(2) + 1.0f) || (*arg1 - mCurPathP1).absXZ() == 0.0f) { + if (mbCraneMode != 0) { + modeProc(PROC_00_e, 5); + } + return TRUE; + } + return FALSE; } /* 000007A0-000007C8 .text ride_CB__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ -void ride_CB(dBgW*, fopAc_ac_c*, fopAc_ac_c*) { - /* Nonmatching */ +void ride_CB(dBgW*, fopAc_ac_c* ac1, fopAc_ac_c* ac2) { + ((daObj_Ikada_c*)ac1)->_ride(ac2); } /* 000007C8-00000A00 .text _ride__13daObj_Ikada_cFP10fopAc_ac_c */ -void daObj_Ikada_c::_ride(fopAc_ac_c*) { - /* Nonmatching */ +void daObj_Ikada_c::_ride(fopAc_ac_c* actor) { + if (mType == 1) { + if (actor == dComIfGp_getLinkPlayer()) { + mbIsLinkRiding = true; + } + + if (fopAcM_GetName(actor) == PROC_BOMB) { + daBomb_c* bomb = (daBomb_c*)actor; + + if (bomb->getBombRestTime() <= 1) { + cXyz sp24 = actor->current.pos; + dComIfGp_particle_set(dPa_name::ID_COMMON_0010, &sp24); + + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz sp18(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, &sp24, &player->shape_angle, &sp18); + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + + if (mBombSmokeEasterEgg.getEmitter() == NULL) { + mBombSmokeAngle = cLib_targetAngleY(¤t.pos, &sp24) - shape_angle.y; + mBombSmokeRot = shape_angle; + mBombSmokeRot.y += mBombSmokeAngle; + mBombSmokePos = current.pos; + dComIfGp_particle_setShipTail( + dPa_name::ID_COMMON_03E1, &mBombSmokePos, &mBombSmokeRot, &scale, 0xff, &mBombSmokeEasterEgg, fopAcM_GetRoomNo(this) + ); + m04A8 = 230; + } + + mLinkRideRockAmpl = 300; + modeProc(PROC_00_e, 12); + } + } + } } /* 00000A00-00000A20 .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* a_this) { + return ((daObj_Ikada_c*)a_this)->_createHeap(); } /* 00000A20-00000AA4 .text setCollision__13daObj_Ikada_cFv */ void daObj_Ikada_c::setCollision() { - /* Nonmatching */ + if (!mbIsLinkRiding && !dComIfGp_checkPlayerStatus0(0, daPyStts0_HOOKSHOT_AIM_e)) { + mSph.SetR(l_HIO.m9C * scale.x); + mSph.SetC(current.pos); + dComIfG_Ccsp()->Set(&mSph); + } } /* 00000AA4-00000DFC .text checkTgHit__13daObj_Ikada_cFv */ -void daObj_Ikada_c::checkTgHit() { - /* Nonmatching */ +bool daObj_Ikada_c::checkTgHit() { + cCcD_Obj* sp64; + cXyz sp58; + cXyz sp4C; + cXyz sp40; + daPy_py_c* player = daPy_getPlayerActorClass(); + + if (player->checkHammerQuake()) { + sp58 = player->getSwordTopPos(); + f32 abs = (sp58 - current.pos).absXZ(); + if (abs < 1000.0f && mbIsLinkRiding) { + mLinkRideRockAmpl = 200; + modeProc(PROC_00_e, 11); + return true; + } + } + + mStts.Move(); + if (cLib_calcTimer(&m12E4) == 0) { + cCcD_Obj* pcVar3 = mSph.GetTgHitObj(); + sp4C = *mSph.GetTgHitPosP(); + sp64 = mSph.GetTgHitObj(); + if (pcVar3 == NULL) { + return false; + } + + bool ret = true; + if ((s32)pcVar3->GetAtType() != AT_TYPE_BOMB) { + ret = false; + } + + if (ret) { + m12E4 = 5; + dComIfGp_particle_set(dPa_name::ID_COMMON_0010, &sp4C); + daPy_py_c* player = daPy_getPlayerActorClass(); + sp40.set(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, &sp4C, &player->shape_angle, &sp40); + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + + if (mBombSmokeEasterEgg.getEmitter() == NULL) { + mBombSmokeAngle = cLib_targetAngleY(¤t.pos, &sp4C) - shape_angle.y; + mBombSmokeRot = shape_angle; + mBombSmokeRot.y += mBombSmokeAngle; + mBombSmokePos = current.pos; + dComIfGp_particle_setShipTail( + dPa_name::ID_COMMON_03E1, &mBombSmokePos, &mBombSmokeRot, &scale, 0xff, &mBombSmokeEasterEgg, fopAcM_GetRoomNo(this) + ); + m04A8 = 230; + } + mLinkRideRockAmpl = 300; + modeProc(PROC_00_e, 0xc); + return true; + } + } + return false; } /* 00000E38-00000F04 .text pathMove__13daObj_Ikada_cFv */ void daObj_Ikada_c::pathMove() { - /* Nonmatching */ + cLib_addCalc2(&speedF, mVelocityFwdTarget, 0.1f, 2.0f); + dLib_pathMove(&mPathPosTarget, &mCurPathPoint, mpPath, speedF, pathMove_CB, this); + cLib_addCalcPosXZ2(¤t.pos, mPathPosTarget, REG12_F(0) + 0.01f, speedF); + if (speedF != 0.0f && mVelocityFwdTarget != 0.0f) { + cLib_addCalcAngleS2(&shape_angle.y, cLib_targetAngleY(¤t.pos, &mPathPosTarget), 8, 0x100); + } } /* 00000F04-00000FBC .text HandleRight__13daObj_Ikada_cFv */ void daObj_Ikada_c::HandleRight() { - /* Nonmatching */ + m1154 += l_HIO.m20; + if (m1154 >= mBckAnm.getEndFrame()) { + m1154 = mBckAnm.getStartFrame(); + } } /* 00000FBC-00001074 .text HandleLeft__13daObj_Ikada_cFv */ void daObj_Ikada_c::HandleLeft() { - /* Nonmatching */ + m1154 -= l_HIO.m20; + if (m1154 <= mBckAnm.getStartFrame()) { + m1154 = mBckAnm.getEndFrame(); + } } /* 00001074-000012EC .text createWave__13daObj_Ikada_cFv */ void daObj_Ikada_c::createWave() { - /* Nonmatching */ + static JGeometry::TVec3 wave_l_direction(0.5f, 1.0f, -0.3f); + static JGeometry::TVec3 wave_r_direction(-0.5f, 1.0f, -0.3f); + + if (mWaveLCallback.getEmitter() == NULL) { + dComIfGp_particle_set(dPa_name::ID_COMMON_0037, &mWavePos, &mWaveRot, NULL, 0xff, &mWaveLCallback); + if (mWaveLCallback.getEmitter() != NULL) { + mWaveLCallback.getEmitter()->setDirection(wave_l_direction); + } + } + + if (mWaveRCallback.getEmitter() == NULL) { + dComIfGp_particle_set(dPa_name::ID_COMMON_0037, &mWavePos, &mWaveRot, NULL, 0xff, &mWaveRCallback); + if (mWaveRCallback.getEmitter() != NULL) { + mWaveRCallback.getEmitter()->setDirection(wave_r_direction); + } + } + + if (mSplashCallBack.getEmitter() == NULL) { + dComIfGp_particle_set(dPa_name::ID_COMMON_0035, &mWavePos, &mWaveRot, NULL, 0xff, &mSplashCallBack); + } + + if (mTrackCallBack.getEmitter() == NULL) { + dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0036, &mTrackPos, &shape_angle, NULL, 0x0, &mTrackCallBack); + + JPABaseEmitter* emitter = mTrackCallBack.getEmitter(); + if (emitter != NULL) { + JGeometry::TVec3 scale = (Vec){1.0f, 1.0f, 1.0f}; + emitter->setGlobalDynamicsScale(scale); + emitter->setGlobalParticleScale(scale); + } + } } /* 000012EC-00001528 .text setWave__13daObj_Ikada_cFv */ void daObj_Ikada_c::setWave() { - /* Nonmatching */ + f32 fVar2 = l_HIO.mTrackVel; + f32 fVar1 = l_HIO.mWaveVelFade; + f32 target = l_HIO.mSplashScaleMax; + f32 fVar4 = l_HIO.mWaveMaxVelocity; + + if (speedF <= 2.0f) { + fVar1 = 0.0f; + target = fVar1; + mTrackCallBack.stop(); + } else { + createWave(); + } + + mWavePos.y = dLib_getWaterY(mWavePos, mObjAcch); + mWaveRot.y = shape_angle.y; + + if (mTrackCallBack.getEmitter() != NULL) { + mTrackCallBack.setIndirectTexData(l_HIO.mTrackIndTransY, l_HIO.mTrackIndScaleY); + mTrackCallBack.setSpeed(fVar2); + mTrackCallBack.setWaterY(mWavePos.y); + if (mObjAcch.ChkWaterHit()) { + fVar2 = mObjAcch.m_wtr.GetHeight(); + } else { + fVar2 = -G_CM3D_F_INF; + } + mTrackCallBack.setWaterFlatY(fVar2); + mTrackCallBack.setLimitSpeed(3.0f); + } + mWaveRCallback.setSpeed(fVar1); + mWaveLCallback.setSpeed(fVar1); + mWaveRCallback.setMaxSpeed(fVar4); + mWaveLCallback.setMaxSpeed(fVar4); + mWaveRCallback.setPitch(l_HIO.mWaveVelOffs + 1.0f); + mWaveLCallback.setPitch(1.0f - l_HIO.mWaveVelOffs); + + cXyz sp2C = l_HIO.mWaveCollapsePos[0]; + cXyz sp20 = l_HIO.mWaveCollapsePos[1]; + cXyz sp14 = l_HIO.mWaveCollapsePos[0]; + cXyz sp08 = l_HIO.mWaveCollapsePos[1]; + + mWaveRCallback.setAnchor(&sp2C, &sp20); + sp14.x = (f32)(f64)sp14.x * -1.0f; + sp08.x = (f32)(f64)sp08.x * -1.0f; + mWaveLCallback.setAnchor(&sp14, &sp08); + + mWaveRCallback.setMaxDisSpeed(l_HIO.mWaveVelSpeed); + mWaveLCallback.setMaxDisSpeed(l_HIO.mWaveVelSpeed); + cLib_addCalc2(&mSplashScaleTimer, target, 0.1f, 10.0f); + mSplashCallBack.setSpeed(mSplashScaleTimer); + mSplashCallBack.setMaxSpeed(l_HIO.mSplashMaxScaleTimer); } /* 00001528-00001690 .text incRopeCnt__13daObj_Ikada_cFii */ -void daObj_Ikada_c::incRopeCnt(int, int) { - /* Nonmatching */ +void daObj_Ikada_c::incRopeCnt(int arg1, int arg2) { + cXyz* pcVar5 = &mRopeLine.mpLines->mpSegments[0]; + cXyz* pcVar4 = &m07DC[m07D8]; + s32 i; + + s32 iVar3 = m07D8 + arg1; + if (iVar3 >= 200) { + iVar3 = 200; + } else if (iVar3 < arg2) { + iVar3 = arg2; + } + + s32 iVar2 = iVar3 - m07D8; + if (iVar2 > 0) { + cXyz sp20 = m_rope_base_vec * iVar2; + for (i = 0; i < m07D8; i++, pcVar5++) { + *pcVar5 += sp20; + } + } else { + pcVar5 += m07D8; + } + + for (i = m07D8; i < iVar3; i++, pcVar4++, pcVar5++) { + *pcVar4 = m_rope_base_vec; + if (m07D8 != 0) { + *pcVar5 = pcVar5[-1] - m_rope_base_vec; + } + } + m07D8 = (s16)iVar3; } /* 00001690-00001DEC .text setRopePos__13daObj_Ikada_cFv */ void daObj_Ikada_c::setRopePos() { - /* Nonmatching */ + static cXyz ripple_scale(0.6f, 0.6f, 0.6f); + + cXyz spBC; + cXyz spB0; + cXyz spA4; + cXyz sp98; + MtxP ropeEndMtx; + cXyz* pcVar6; + cXyz* pcVar7; + + if (m07D8 == 0) { + pcVar6 = &mRopeLine.mpLines->mpSegments[0]; + pcVar7 = &m07DC[0]; + } else { + pcVar6 = &mRopeLine.mpLines->mpSegments[m07D8] - 1; + pcVar7 = &m07DC[m07D8 - 1]; + } + + spBC = *pcVar6; + + mDoMtx_stack_c::copy(mpModel->getAnmMtx(1)); + mDoMtx_stack_c::transM(m_crane_offset.x, m_crane_offset.y, m_crane_offset.z); + + pcVar6->x = mDoMtx_stack_c::get()[0][3]; + pcVar6->y = mDoMtx_stack_c::get()[1][3]; + pcVar6->z = mDoMtx_stack_c::get()[2][3]; + + if (mCurMode == 1) { + ropeEndMtx = mpRopeEnd->getBaseTRMtx(); + spB0.set(ropeEndMtx[0][3] - pcVar6->x, ropeEndMtx[1][3] - pcVar6->y, ropeEndMtx[2][3] - pcVar6->z); + spB0.normalizeZP(); + spB0 *= 10.0f; + + pcVar6--; + pcVar7--; + for (s32 i = m07D8 - 2; i >= 0; i--, pcVar6--, pcVar7--) { + *pcVar6 = pcVar6[1] + spB0; + *pcVar7 = cXyz::Zero; + } + } else { + pcVar6--; + pcVar7--; + + for (s32 i = m07D8 - 2; i >= 0; i--, pcVar6--, pcVar7--) { + spBC = *pcVar6; + if (pcVar6->y < dLib_getWaterY(*pcVar6, mObjAcch)) { + *pcVar7 *= 0.6f; + } else { + *pcVar7 *= 0.9f; + } + pcVar7->y -= 3.0f; + *pcVar6 += *pcVar7; + + spB0 = pcVar6[0] - pcVar6[1]; + f32 abs = spB0.abs(); + if (abs < 0.01f) { + *pcVar6 = pcVar6[1] + m_rope_base_vec; + } else { + *pcVar6 = pcVar6[1] + spB0 * 10.0f / abs; + } + + *pcVar7 += (*pcVar6 - spBC) * 0.05f; + } + } + + s16 iVar3; + s16 iVar4; + pcVar7 = mRopeLine.mpLines->mpSegments; + if (m07D8 > 1) { + spA4 = pcVar7[0] - pcVar7[1]; + iVar3 = 0; + iVar4 = 0; + } else { + mDoMtx_stack_c::copy(mpModel->getAnmMtx(1)); + mDoMtx_stack_c::transM(m_crane_offset.x, m_crane_offset.y, m_crane_offset.z); + cMtx_copy(mDoMtx_stack_c::get(), ropeEndMtx); + spA4.set(pcVar7->x - ropeEndMtx[0][3], pcVar7->y - ropeEndMtx[1][3], pcVar7->z - ropeEndMtx[2][3]); + iVar3 = 0; + iVar4 = 0; + } + + f32 sin = cM_ssin(shape_angle.y); + f32 cos = cM_scos(shape_angle.y); + + sp98.x = cos * spA4.x - sin * spA4.z; + sp98.y = spA4.y; + sp98.z = sin * spA4.x + cos * spA4.z; + mDoMtx_stack_c::transS(pcVar7->x, pcVar7->y, pcVar7->z); + + mDoMtx_stack_c::ZXYrotM(cM_atan2s(sp98.z, sp98.y) + iVar3, shape_angle.y, cM_atan2s(-sp98.x, std::sqrtf(sp98.y * sp98.y + sp98.z * sp98.z)) + iVar4); + mDoMtx_stack_c::XrotM(-0x4000); + + m0474.x = mDoMtx_stack_c::get()[0][3]; + m0474.y = mDoMtx_stack_c::get()[1][3]; + m0474.z = mDoMtx_stack_c::get()[2][3]; + + mpRopeEnd->setBaseTRMtx(mDoMtx_stack_c::get()); + f32 fVar9 = pcVar7->y; + pcVar7->y = dLib_getWaterY(*pcVar7, mObjAcch); + f32 fVar1 = pcVar7->y; + pcVar7->y = fVar9; + + if (fVar1 > pcVar7->y) { + cXyz* ptr = pcVar7; + for (s32 i = m07D8; i > 0; i--, pcVar7++) { + if (pcVar7->y <= fVar1) { + ptr = pcVar7; + } + } + + m0444.x = ptr->x; + m0444.y = fVar1; + m0444.z = ptr->z; + + if (mRippleCallBack.getEmitter() == NULL) { + dComIfGp_particle_setShipTail(dPa_name::ID_COMMON_0033, &m0444, NULL, &ripple_scale, 0xff, &mRippleCallBack); + if (mRippleCallBack.getEmitter() != NULL) { + mRippleCallBack.setRate(0.0f); + if (m0440 == 0) { + fopKyM_createWpillar(&m0444, 1.0f, 0.7f, 0); + m0440 = 0x14; + } + } + } + } else { + mRippleCallBack.remove(); + } + + if (m0440 != 0) { + m0440--; + } } /* 00001DEC-000024A4 .text setMtx__13daObj_Ikada_cFv */ void daObj_Ikada_c::setMtx() { - /* Nonmatching */ + dLib_waveRot(¤t.pos, 0.0f, &mWave); + s16 waveAnim2Ampl = (mLinkRideRockAmpl * (REG12_S(5) + 10)) * cM_ssin(mLinkRideRockTimer); + s32 waveAnim1X = (REG8_S(5) + 200) * cM_ssin(mWaveAnimTimer); + s32 waveAnim1Z = (REG8_S(6) + 60) * cM_ssin(mWaveAnimTimer); + s16 angleY = fopAcM_searchPlayerAngleY(this) + shape_angle.y; + s32 waveAnim2X = waveAnim2Ampl * cM_scos(angleY); + s32 waveAnim2Z = waveAnim2Ampl * cM_ssin(angleY); + + if (l_HIO.mbNoRotAnim == 0) { + shape_angle.x = mWave.mRotX + waveAnim2X + waveAnim1X; + shape_angle.z = mWave.mRotZ + waveAnim2Z + waveAnim1Z; + } + + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::XYZrotM(shape_angle.x, 0, shape_angle.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + + if (mType == 4) { + mDoMtx_stack_c::transM(0.0f, 30.0f, -260.0f); + } + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + if (mType == 4) { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::XYZrotM(shape_angle.x, 0, shape_angle.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::YrotM(0x4000); + + for (s32 i = 0; i < 4; i++) { + Vec sp3C = {l_HIO.mSvOffsX[i], 0.0f, 0.0f}; + fopAc_ac_c* ac; + if (fopAcM_SearchByID(mSvId[i], &ac)) { + mDoMtx_stack_c::multVec(&sp3C, &ac->current.pos); + } + } + + Vec sp30 = {l_HIO.mSvWaveOffsX, 0.0f, 0.0f}; + mDoMtx_stack_c::multVec(&sp30, &mWavePos); + sp30.x = l_HIO.mSvTrackOffsX; + mDoMtx_stack_c::multVec(&sp30, &mTrackPos); + } + + cMtx_copy(mDoMtx_stack_c::get(), mMtx); + + bool bIsTerry = (mType == 3) || (mType == 1); + if (bIsTerry) { + mLightRotY += 0xd0; + mLightRotX += 0x100; +#if VERSION == VERSION_DEMO + cXyz sp24; + sp24.x = REG12_F(2); + sp24.y = REG12_F(3) + 340.0f; + sp24.z = REG12_F(4) + 200.0f; +#else + cXyz sp24(REG12_F(2), REG12_F(3) + 340.0f, REG12_F(4) + 200.0f); +#endif + + mDoMtx_stack_c::copy(mpModel->getBaseTRMtx()); + mDoMtx_stack_c::multVec(&sp24, &mFirePos); + mDoMtx_stack_c::transM(sp24.x, sp24.y, sp24.z); + mDoMtx_stack_c::YrotM(mLightRotY); + mDoMtx_stack_c::XrotM(mLightRotX); + mDoMtx_stack_c::scaleM(mLightPower, mLightPower, mLightPower); + cMtx_copy(mDoMtx_stack_c::get(), mLightMtx); + mPLight.mPos.x = mDoMtx_stack_c::get()[0][3]; + mPLight.mPos.y = mDoMtx_stack_c::get()[1][3]; + mPLight.mPos.z = mDoMtx_stack_c::get()[2][3]; + mPLight.mColor.r = 600; + mPLight.mColor.g = 400; + mPLight.mColor.b = 120; + mPLight.mFluctuation = 250.0f; + } + + if ((this->mType == 1) || (this->mType == 3)) { +#if VERSION == VERSION_DEMO + cXyz sp18; + sp18.x = REG12_F(2) - 105.0f; + sp18.y = REG12_F(3) + 380.0f; + sp18.z = REG12_F(4) + 40.0f; +#else + cXyz sp18(REG12_F(2) - 105.0f, REG12_F(3) + 380.0f, REG12_F(4) + 40.0f); +#endif + mDoMtx_stack_c::copy(mpModel->getBaseTRMtx()); + mDoMtx_stack_c::multVec(&sp18, &mSePos); + } + + bool bIsShip = (mType == 4) || (mType == 3) || (mType == 1); + if (bIsShip) { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::XYZrotM(shape_angle.x, 0, shape_angle.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + + Vec sp0C = {0.0f, l_HIO.mShipOffsY_Attention, 0.0f}; + mDoMtx_stack_c::multVec(&sp0C, &attention_info.position); + sp0C.y = l_HIO.mShipOffsY_Eye; + mDoMtx_stack_c::multVec(&sp0C, &eyePos); + sp0C.y = 0.0f; + + if (mType != 4) { + f32 fVar1 = REG8_F(5) + 5.0f; + if (mCurMode == 10) { + fVar1 = REG8_F(5) + 20.0f; + } + sp0C.z = l_HIO.mTerryWaveOffsZ + fVar1; + sp0C.y = l_HIO.mTerryWaveOffsY; + mDoMtx_stack_c::multVec(&sp0C, &mWavePos); + sp0C.z = l_HIO.mTerryTrackOffsZ; + sp0C.y = 0.0f; + mDoMtx_stack_c::multVec(&sp0C, &mTrackPos); + } + } } /* 000024A4-000027A4 .text modeProc__13daObj_Ikada_cFQ213daObj_Ikada_c6Proc_ei */ -void daObj_Ikada_c::modeProc(daObj_Ikada_c::Proc_e, int) { - /* Nonmatching */ +void daObj_Ikada_c::modeProc(daObj_Ikada_c::Proc_e proc, int mode) { + typedef void (daObj_Ikada_c::*modeFunc)(); + struct ModeFuncs { + /* 0x00 */ modeFunc init; + /* 0x0C */ modeFunc exec; + /* 0x18 */ const char* name; + }; // size = 0x1C + + static ModeFuncs mode_tbl[] = { + {&daObj_Ikada_c::modeWaitInit, &daObj_Ikada_c::modeWait, "WAIT"}, + {&daObj_Ikada_c::modeCraneUpInit, &daObj_Ikada_c::modeCraneUp, "CRANE_UP"}, + {&daObj_Ikada_c::modeCraneUpWaitInit, &daObj_Ikada_c::modeCraneUpWait, "CRANE_UP_WAIT"}, + {&daObj_Ikada_c::modeCraneDownInit, &daObj_Ikada_c::modeCraneDown, "CRANE_DOWN"}, + {&daObj_Ikada_c::modeCraneDownWaitInit, &daObj_Ikada_c::modeCraneDownWait, "CRANE_DOWN_WAIT"}, + {&daObj_Ikada_c::modeCraneTurnInit, &daObj_Ikada_c::modeCraneTurn, "CRANE_TURN"}, + {&daObj_Ikada_c::modeCraneResetInit, &daObj_Ikada_c::modeCraneReset, "CRANE_RESET"}, + {&daObj_Ikada_c::modeCraneWaitInit, &daObj_Ikada_c::modeCraneWait, "CRANE_WAIT"}, + {&daObj_Ikada_c::modePathMoveInit, &daObj_Ikada_c::modePathMove, "PATH_MOVE"}, + {&daObj_Ikada_c::modeStopInit, &daObj_Ikada_c::modeStop, "STOP"}, + {&daObj_Ikada_c::modePathMoveTerryInit, &daObj_Ikada_c::modePathMoveTerry, "PATH_MOVE_TERRY"}, + {&daObj_Ikada_c::modeStopTerryInit, &daObj_Ikada_c::modeStopTerry, "STOP"}, + {&daObj_Ikada_c::modeStopBombTerryInit, &daObj_Ikada_c::modeStopBombTerry, "STOP_BOMB"}, + }; + + if (proc == PROC_00_e) { + mCurMode = mode; + (this->*mode_tbl[mCurMode].init)(); + } else if (proc == PROC_01_e) { + (this->*mode_tbl[mCurMode].exec)(); + } } /* 000027A4-000027A8 .text modeWaitInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeWaitInit() { - /* Nonmatching */ } /* 000027A8-00002840 .text modeWait__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeWait() { - /* Nonmatching */ + if (mType == 4) { + if (l_HIO.m1C != 0) { + if (m07D8 > l_HIO.m1C) { + incRopeCnt(-1, 0); + } else if (m07D8 < l_HIO.m1C) { + incRopeCnt(1, 0); + } + } + + if (REG12_S(4) != 0) { + modeProcInit(1); + } + } } /* 00002840-00002844 .text modeCraneUpInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneUpInit() { - /* Nonmatching */ } /* 00002844-0000289C .text modeCraneUp__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneUp() { - /* Nonmatching */ + if (m07D8 > 15) { + HandleRight(); + incRopeCnt(-1, 0); + } else { + modeProcInit(2); + } } /* 0000289C-000028B0 .text modeCraneUpWaitInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneUpWaitInit() { - /* Nonmatching */ + mTimer = l_HIO.m24; } /* 000028B0-000028F8 .text modeCraneUpWait__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneUpWait() { - /* Nonmatching */ + if (cLib_calcTimer(&mTimer) == 0) { + modeProcInit(6); + } } /* 000028F8-00002904 .text modeCraneDownInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneDownInit() { - /* Nonmatching */ + m115E = 150; } /* 00002904-000029B0 .text modeCraneDown__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneDown() { - /* Nonmatching */ + cLib_addCalcAngleS2(&m115E, 0, 10, 10); + if (m115E < 0x14) { + HandleLeft(); + if (this->m07D8 < l_HIO.m1E) { + incRopeCnt(1, 0); + } else { + modeProcInit(7); + } + } else { + m115C += REG12_S(2) + 0x1830; + } } /* 000029B0-000029C4 .text modeCraneDownWaitInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneDownWaitInit() { - /* Nonmatching */ + mTimer = l_HIO.m24; } /* 000029C4-00002A0C .text modeCraneDownWait__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneDownWait() { - /* Nonmatching */ + if (cLib_calcTimer(&mTimer) == 0) { + modeProcInit(3); + } } /* 00002A0C-00002A24 .text modeCraneTurnInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneTurnInit() { - /* Nonmatching */ + m115E = 150; + speedF = 0.0f; } /* 00002A24-00002AEC .text modeCraneTurn__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneTurn() { - /* Nonmatching */ + cLib_addCalcAngleS2(&m115E, 0, 10, 10); + if (m115E < 0x14) { + HandleRight(); + if (m1168 == 1) { + m1158 = 0x4000; + } else { + m1158 = -0x4000; + } + cLib_addCalcAngleS2(&m115A, m1158, 10, 0x100); + if (cLib_distanceAngleS(m115A, m1158) <= 0x100) { + modeProcInit(4); + } + } else { + m115C += REG12_S(2) + 0x1830; + } } /* 00002AEC-00002B04 .text modeCraneResetInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneResetInit() { - /* Nonmatching */ + m115E = 150; + speedF = 0.0f; } /* 00002B04-00002BB4 .text modeCraneReset__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneReset() { - /* Nonmatching */ + cLib_addCalcAngleS2(&m115E, 0, 10, 10); + if (m115E < 20) { + HandleLeft(); + m1158 = 0; + cLib_addCalcAngleS2(&m115A, m1158, 10, 0x100); + if (cLib_distanceAngleS(m115A, m1158) <= 0x100) { + modeProcInit(8); + } + } else { + m115C += REG12_S(2) + 0x1830; + } } /* 00002BB4-00002BC0 .text modeCraneWaitInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneWaitInit() { - /* Nonmatching */ + mTimer = 600; } /* 00002BC0-00002C08 .text modeCraneWait__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeCraneWait() { - /* Nonmatching */ + if (cLib_calcTimer(&mTimer) == 0) { + modeProcInit(1); + } } /* 00002C08-00002C60 .text modePathMoveInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modePathMoveInit() { - /* Nonmatching */ + if (cM_rndF(1.0f) < 0.5) { + m1168 = 0; + } else { + m1168 = 1; + } } /* 00002C60-00002DC0 .text modePathMove__13daObj_Ikada_cFv */ void daObj_Ikada_c::modePathMove() { - /* Nonmatching */ + if (l_HIO.m06 != 0) { + HandleRight(); + } + + if (l_HIO.m05 != 0) { + HandleLeft(); + } + + if (l_HIO.m08 == 0 && mPathId != 0xFF) { + if (mbCraneMode != 0) { + if ((mCurPathP1 - current.pos).absXZ() < 50.0f) { + mVelocityFwdTarget = 1.0f; + } else { + mVelocityFwdTarget = 8.0f; + } + } else { + mVelocityFwdTarget = 8.0f; + } + pathMove(); + } } /* 00002DC0-00002DC4 .text modeStopInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStopInit() { - /* Nonmatching */ } /* 00002DC4-00002F04 .text modeStop__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStop() { - /* Nonmatching */ + if (l_HIO.m06 != 0) { + HandleRight(); + } + + if (l_HIO.m05 != 0) { + HandleLeft(); + } + + if (m02F4 == 8) { + mVelocityFwdTarget = 0.0f; + if (mPathId != 0xff) { + pathMove(); + } + } + + if (m1166 == 0) { + if (m07D8 <= 15) { + HandleLeft(); + incRopeCnt(1, 0); + } else if (m02F4 != 9) { + if (m02F4 == 7) { + modeProcInit(3); + } else { + modeProcInit(m02F4); + } + } else { + modeProcInit(8); + } + } else if (m07D8 > 2) { + HandleRight(); + incRopeCnt(-2, 0); + if (m07D8 < 2) { + m07D8 = 2; + } + } } /* 00002F04-00002F10 .text modePathMoveTerryInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modePathMoveTerryInit() { - /* Nonmatching */ + mTimer = 10; } /* 00002F10-00003228 .text modePathMoveTerry__13daObj_Ikada_cFv */ void daObj_Ikada_c::modePathMoveTerry() { - /* Nonmatching */ + setCollision(); + if (!checkTgHit()) { + bool bPlayerNear = false; + f32 dVar4 = fopAcM_searchPlayerDistanceXZ(this); + if ((dVar4 < l_HIO.mPlayerStopDistance) && cLib_calcTimer(&mStopTimer) == 0) { + mStopTimer = cM_rndF(120.0f) + 240.0f; + if (cM_rndF(100.0f) < 50.0f) { + mDoAud_seStart(JA_SE_OBJ_BS_MELODY_1, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } else { + mDoAud_seStart(JA_SE_OBJ_BS_MELODY_2, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } + } + + if (mType == 1) { + mVelocityFwdTarget = l_HIO.mVelocityTargetTerry1; + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + if (dVar4 < l_HIO.m94) { + bPlayerNear = true; + } + } else if (dVar4 < l_HIO.m9A) { + bPlayerNear = true; + } + } else if (mType == 3) { + mVelocityFwdTarget = l_HIO.mVelocityTargetTerry3; + if (dVar4 < l_HIO.mPlayerStopDistance) { + mVelocityFwdTarget = l_HIO.mA8; + } + + if (dVar4 < l_HIO.m98) { + bPlayerNear = true; + } + } + + if (mbIsLinkRiding) { + mTimer = 30; + } else if (cLib_calcTimer(&mTimer) == 0 && bPlayerNear) { + modeProcInit(11); + return; + } + mLinkRideRockTimer += REG12_S(2) + 0x1830; + cLib_addCalcAngleS2(&mLinkRideRockAmpl, 0, 10, 10); + if (mLinkRideRockAmpl <= 10) { + mLinkRideRockAmpl = 0; + } + + if (mPathId != 0xff) { + pathMove(); + } + } } /* 00003228-00003234 .text modeStopTerryInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStopTerryInit() { - /* Nonmatching */ + mTimer = 210; } /* 00003234-0000342C .text modeStopTerry__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStopTerry() { - /* Nonmatching */ + setCollision(); + if (!checkTgHit()) { + bool bVar1 = false; + f32 dVar4 = fopAcM_searchPlayerDistanceXZ(this); + + if (mType == 1) { + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + if (dVar4 >= l_HIO.m94) { + bVar1 = true; + } + } else if (dVar4 >= l_HIO.m9A) { + bVar1 = true; + } + } else if (mType == 3 && dVar4 >= l_HIO.m98) { + bVar1 = true; + } + + if (bVar1) { + modeProcInit(10); + } else { + if (mbIsLinkRiding) { + if (cLib_calcTimer(&mTimer) == 0) { + modeProcInit(10); + return; + } + } else { + mTimer = 300; + } + + mLinkRideRockTimer += REG12_S(2) + 0x1830; + cLib_addCalcAngleS2(&mLinkRideRockAmpl, 0, 10, 10); + if (mLinkRideRockAmpl <= 10) { + mLinkRideRockAmpl = 0; + } + + mVelocityFwdTarget = 0.0f; + + if (mPathId != 0xff) { + pathMove(); + } + } + } } /* 0000342C-00003430 .text modeStopBombTerryInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStopBombTerryInit() { - /* Nonmatching */ } /* 00003430-000034D0 .text modeStopBombTerry__13daObj_Ikada_cFv */ void daObj_Ikada_c::modeStopBombTerry() { - /* Nonmatching */ + setCollision(); + if (!checkTgHit()) { + mLinkRideRockTimer += REG12_S(2) + 0x1830; + cLib_addCalcAngleS2(&mLinkRideRockAmpl, 0, 10, 10); + if (mLinkRideRockAmpl <= 10) { + mLinkRideRockAmpl = 0; + } + + mVelocityFwdTarget = 0.0f; + + if (mPathId != 0xff) { + pathMove(); + } + } } /* 000034D0-00003750 .text epProc__13daObj_Ikada_cFv */ void daObj_Ikada_c::epProc() { - /* Nonmatching */ + if (dKy_daynight_check() == dKy_TIME_DAY_e) { + mFireParticle.remove(); + mPLight.mPower = 0.0f; + } else { + if (mFireParticle.getEmitter() == NULL) { + static cXyz fire_scale(0.5f, 0.5f, 0.5f); + + fire_scale.x = REG12_F(10) + 0.5f; + fire_scale.y = fire_scale.x; + fire_scale.z = fire_scale.x; + dComIfGp_particle_set(dPa_name::ID_COMMON_01EA, &mFirePos, NULL, &fire_scale, 0xff, &mFireParticle); + } + + if (mFireParticle.getEmitter() != NULL) { + cXyz sp18 = mFirePos; + sp18.y += 20.0f; + + dComIfGp_particle_setSimple(dPa_name::ID_COMMON_4004, &sp18); + + if (cLib_calcTimer(&mEpTimer0) == 0) { + mEpTimer0 = (s16)(REG0_F(3) + cM_rndF(REG0_F(2) + 5.0f)); + m050C = REG0_F(7) + (cM_rndF(REG0_F(6) + 4.0f) + 8.0f); + } + + if (cLib_calcTimer(&mEpTimer1) == 0) { + mEpTimer1 = (s16)(cM_rndF(6.0f) + 3.0f); + mLightPowerTarget = cM_rndF(0.075f) + 0.75f; + } + + cLib_addCalc2(&m0508, m050C, 1.0, REG0_F(4) + 0.1f + 0.9f); + cLib_addCalc2(&mLightPower, mLightPowerTarget, 0.4f, 0.04f); + mPLight.mPower = mLightPower * 150.0f; + } + } } /* 00003750-00003CA0 .text _execute__13daObj_Ikada_cFv */ bool daObj_Ikada_c::_execute() { - /* Nonmatching */ + mWaveAnimTimer += REG8_S(4) + 0x200; + f32 fVar9 = 5.0f + REG8_F(5); + if (mCurMode == 10) { + fVar9 = 20.0f + REG8_F(5); + } + f32 fVar8 = fVar9 * cM_ssin(mWaveAnimTimer); + + if (mBombSmokeEasterEgg.getEmitter() != NULL) { + mBombSmokeRot = shape_angle; + mBombSmokeRot.y += mBombSmokeAngle; + + JGeometry::TVec3 scale = (Vec){3.0f, 3.0f, 3.0f}; + JPABaseEmitter* emitter = mBombSmokeEasterEgg.getEmitter(); + emitter->setGlobalDynamicsScale(scale); + emitter->setGlobalParticleScale(scale); + + mBombSmokePos = current.pos; + mBombSmokePos.y = l_HIO.m28; + + if (cLib_calcTimer(&m04A8) == 0) { + mBombSmokeEasterEgg.remove(); + } + } + + if ((m1166 == 1) && (mCurMode != 9)) { + m02F4 = mCurMode; + modeProcInit(9); + } + + if (isBonbori()) { + epProc(); + } + + if (mType == 4) { + setRopePos(); + } + + if (mType == 4) { + mBckAnm.setFrame(m1154); + if (REG12_S(0) != 0) { + mJointRot[REG12_S(0)].x = REG12_S(1); + mJointRot[REG12_S(0)].y = REG12_S(2); + mJointRot[REG12_S(0)].z = REG12_S(3); + } + } + + modeProc(PROC_01_e, 13); + + current.pos.y = fVar8 + dLib_getWaterY(current.pos, mObjAcch); + setMtx(); + mpModel->calc(); + + bool bVar2 = (mType == 4) || (mType == 3) || (mType == 1); + if (bVar2) { + f32 s = scale.x; + s32 uVar5 = fopAcM_checkCullingBox(mpModel->getBaseTRMtx(), s * -1000.0f, s * -50.0f, s * -1000.0f, s * 1000.0f, s * 1000.0f, s * 1000.0f); + if (speedF <= 2.0f || uVar5 & 0xFF || fopAcM_searchPlayerDistanceXZ(this) > 18000.0f) { + mWaveRCallback.remove(); + mWaveLCallback.remove(); + mSplashCallBack.remove(); + mTrackCallBack.stop(); + } else { + setWave(); + } + } + + mpBgW->Move(); + + if (isFlag()) { + fopAc_ac_c* ac = (daMajuu_Flag_c*)fopAcM_SearchByID(mFlagPcId); + if (ac != NULL) { + daMajuu_Flag_c* pfVar6 = (daMajuu_Flag_c*)ac; + pfVar6->setOtherMatrix(&mMtx); + + if (l_HIO.mFlagOffset.x || l_HIO.mFlagOffset.y || l_HIO.mFlagOffset.z) { + mFlagOffset = l_HIO.mFlagOffset; + } + + if (l_HIO.mFlagScale) { + mFlagScale = l_HIO.mFlagScale; + } + + pfVar6->setBaseScale(mFlagScale); + pfVar6->setOtherOffset(&mFlagOffset); + } + } + + mbIsLinkRiding = false; + + if (mType == 1 || mType == 3) { + f32 sqrt = (current.pos - old.pos).abs(); + f32 fVar1 = sqrt / 30.0f; + + if (fVar1 <= 0.0f) { + fVar1 = 0.0f; + } else if (fVar1 >= 1.0f) { + fVar1 = 1.0f; + } + s8 reverb = fVar1 * 100.0f; + fopAcM_seStart(this, JA_SE_OBJ_BS_BOAT_CRUISE, reverb); + } + return false; } +const u32 unused_5617[] = { + 0xFFFF0080, + 0xFF80, + 0xFF80, + 0xFF000080, + 0xFF000080, + 0xFF80, + 0xFF000080, + 0xFF000080, + 0xFF000080, +}; + /* 00003CA0-00003CD4 .text debugDraw__13daObj_Ikada_cFv */ void daObj_Ikada_c::debugDraw() { - /* Nonmatching */ + cXyz sp08 = current.pos; + sp08.y += 20.0f; } /* 00003CD4-00003EE0 .text _draw__13daObj_Ikada_cFv */ bool daObj_Ikada_c::_draw() { - /* Nonmatching */ + if (l_HIO.mbDebugDraw) { + debugDraw(); + } + + if (mFireParticle.getEmitter() != NULL) { + GXColor color; + color.r = 0xEB; + color.g = 0x7D; + color.b = 0; + color.a = 0; + dComIfGd_setAlphaModelColor(color); + dComIfGd_setAlphaModel(dDlst_alphaModel_c::TYPE_SPHERE, mLightMtx, m0508); + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + dComIfGd_setListBG(); + + if (mType == 4) { + J3DModelData* modelData = mpModel->getModelData(); + mBckAnm.entry(modelData, mBckAnm.getFrame()); + mDoExt_modelUpdateDL(mpModel); + mpModel->getModelData()->getJointNodePointer(0)->setMtxCalc(NULL); + } else { + mDoExt_modelUpdateDL(mpModel); + } + + dComIfGd_setList(); + + if (isCrane()) { + if (m07D8 >= 2) { + static GXColor rope_color = {200, 150, 50, 255}; + + mRopeLine.update(m07D8, 5.0f, rope_color, 0, &tevStr); + dComIfGd_set3DlineMat(&mRopeLine); + } + g_env_light.setLightTevColorType(mpRopeEnd, &tevStr); + mDoExt_modelUpdateDL(mpRopeEnd); + } + + if (isCrane()) { + dSnap_RegistFig(DSNAP_TYPE_UNK83, this, 1.0f, 1.0f, 1.0f); + } + + return true; } /* 00003EE0-00003F34 .text getArg__13daObj_Ikada_cFv */ void daObj_Ikada_c::getArg() { - /* Nonmatching */ + u32 uVar2 = fopAcM_GetParam(this); + u32 sVar1 = home.angle.x; + + mType = uVar2 & 0xF; + if (mType != 4) { + m0294 = (uVar2 >> 4) & 0x3F; + m0298 = (uVar2 >> 10) & 0xFF; + m02A0 = (uVar2 >> 18) & 0xFF; + m029C = (sVar1 >> 0) & 0xFF; + mPathId = (sVar1 >> 8) & 0xFF; + } else { + mPathId = (uVar2 >> 0x10) & 0xFF; + } } /* 00003F34-00004838 .text createInit__13daObj_Ikada_cFv */ void daObj_Ikada_c::createInit() { - /* Nonmatching */ + mInitPos = current.pos; + mStopTimer = cM_rndF(120.0f) + 240.0f; + + if ((mType == 1) || (mType == 2) || (mType == 0)) { + fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e | 0x5); + } + mPathPosTarget = current.pos; + if (mPathId != 0xFF && (mType == 4 || mType == 1 || mType == 3)) { + mpPath = dPath_GetRoomPath(mPathId, current.roomNo); + if (mType == 4) { + modeProcInit(8); + } + } else { + modeProcInit(0); + } + + if (mType == 1 || mType == 3) { + modeProcInit(11); + } + + if (mType == 4) { + mSvId[0] = fopAcM_createChild("Sv0", fopAcM_GetID(this), 0xffffffff, ¤t.pos, tevStr.mRoomNo, 0, 0, 0); + mSvId[1] = fopAcM_createChild("Sv1", fopAcM_GetID(this), 0xffffffff, ¤t.pos, tevStr.mRoomNo, 0, 0, 0); + mSvId[2] = fopAcM_createChild("Sv2", fopAcM_GetID(this), 0xffffffff, ¤t.pos, tevStr.mRoomNo, 0, 0, 0); + mSvId[3] = fopAcM_createChild("Sv3", fopAcM_GetID(this), 0xffffffff, ¤t.pos, tevStr.mRoomNo, 0, 0, 0); + } + + mLightRotY = cM_rndF(32768.0f); + mLightRotX = cM_rndF(32768.0f); + + current.pos.y = dLib_getWaterY(current.pos, mObjAcch); + mpBgW->SetGrpRoomInf(fopAcM_GetRoomNo(this)); + + if (mType != 4) { + setMtx(); + mpBgW->Move(); + } + + dComIfG_Bgsp()->Regist(mpBgW, this); + + if (mType == 1) { + mpBgW->SetRideCallback(ride_CB); + } + + if (mType == 1) { + mpBgW->SetCrrFunc(dBgS_MoveBGProc_TypicalRotY); + } else { + mpBgW->SetCrrFunc(dBgS_MoveBGProc_Typical); + } + mAcchCir.SetWall(30.0f, 30.0f); + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); + mObjAcch.SetWallNone(); + mObjAcch.SetRoofNone(); + + bool bVar1 = (mType == 4) || (mType == 3) || (mType == 1); + if (bVar1) { + createWave(); + } + + bVar1 = (mType == 3) || (mType == 1); + if (bVar1) { + dKy_plight_set(&mPLight); + } + + fopAcM_SetGravity(this, 0.0f); + fopAcM_posMoveF(this, NULL); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, scale.x * -1000.0f, scale.x * -50.0f, scale.x * -1000.0f, scale.x * 1000.0f, scale.x * 1000.0f, scale.x * 1000.0f); + fopAcM_setCullSizeFar(this, 10.0f); + + bVar1 = mType == 0 || mType == 4; + if (bVar1) { + static const cXyz flag_offset[] = { + cXyz(0.0f, 700.0f, 0.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(0.0f, 0.0f, 0.0f), + cXyz(100.0f, 530.0f, 0.0f), + }; + static const u32 params[] = {4, 4, 4, 4, 0x2000000}; + static const f32 flag_scale[] = {0.2f, 0.0f, 0.0f, 0.0f, 0.12f}; + + mFlagPcId = fopAcM_create(PROC_MAJUU_FLAG, params[mType], ¤t.pos, tevStr.mRoomNo, ¤t.angle); + mFlagOffset = flag_offset[mType]; + mFlagScale = flag_scale[mType]; + } + + mWave.mAnimX = cM_rndF(32768.0f); + mWave.mAnimZ = cM_rndF(32768.0f); + + if (mType == 4) { + mpModel->calc(); + m07D8 = 15; + + cXyz* pcVar8 = &mRopeLine.mpLines->mpSegments[m07D8] - 1; + cXyz* pcVar7 = &m07DC[m07D8 - 1]; + + mDoMtx_stack_c::copy(mpModel->getAnmMtx(1)); + mDoMtx_stack_c::transM(m_crane_offset.x, m_crane_offset.y, m_crane_offset.z); + pcVar8->x = mDoMtx_stack_c::get()[0][3]; + pcVar8->y = mDoMtx_stack_c::get()[1][3]; + pcVar8->z = mDoMtx_stack_c::get()[2][3]; + + cXyz sp80(0.0f, -1.0f, 0.0f); + sp80 *= 10.0f; + + pcVar8--; + pcVar7--; + + for (s32 i = m07D8 - 2; i >= 0; i--, pcVar8--, pcVar7--) { + *pcVar8 = pcVar8[1] + sp80; + *pcVar7 = cXyz::Zero; + } + + pcVar8 = &mRopeLine.mpLines->mpSegments[0]; + cXyz sp74 = mRopeLine.mpLines->mpSegments[0] - mRopeLine.mpLines->mpSegments[1]; + + f32 sin = cM_ssin(shape_angle.y); + f32 cos = cM_scos(shape_angle.y); +#if VERSION == VERSION_DEMO + cXyz sp68; + sp68.x = cos * sp74.x - sin * sp74.z; + sp68.y = sp74.y; + sp68.z = sin * sp74.x + cos * sp74.z; +#else + cXyz sp68(cos * sp74.x - sin * sp74.z, sp74.y, sin * sp74.x + cos * sp74.z); +#endif + + mDoMtx_stack_c::transS(pcVar8->x, pcVar8->y, pcVar8->z); + mDoMtx_stack_c::ZXYrotM((s16)cM_atan2s(sp68.z, sp68.y), shape_angle.y, (s16)cM_atan2s(-sp68.x, std::sqrtf(sp68.y * sp68.y + sp68.z * sp68.z))); + mDoMtx_stack_c::XrotM(-0x4000); + m0474.x = mDoMtx_stack_c::get()[0][3]; + m0474.y = mDoMtx_stack_c::get()[1][3]; + m0474.z = mDoMtx_stack_c::get()[2][3]; + mpRopeEnd->setBaseTRMtx(mDoMtx_stack_c::get()); + } + + mStts.Init(0xff, 0xff, this); + mSph.Set(m_sph_src); + mSph.SetStts(&mStts); } /* 00004838-00004B60 .text _createHeap__13daObj_Ikada_cFv */ -void daObj_Ikada_c::_createHeap() { - /* Nonmatching */ +BOOL daObj_Ikada_c::_createHeap() { + static const s32 bdl[] = {IKADAH_BDL_VIKAE, IKADAH_BDL_VTSP, IKADAH_BDL_VIKAH, IKADAH_BDL_VTSP2, IKADAH_BDL_VSVSP}; + static const s32 dzb[] = {IKADAH_DZB_VIKAE, IKADAH_DZB_VTSP, IKADAH_DZB_VIKAH, IKADAH_DZB_VTSP, IKADAH_DZB_VSVSP}; + + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, bdl[mType]); + JUT_ASSERT(2170, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + if (mpModel == NULL) { + return FALSE; + } + + if (mType == 4) { + J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(m_arc_name, IKADAH_BCK_SVSHIP_KAITEN); + JUT_ASSERT(2180, bck != NULL); + + if (!mBckAnm.init(modelData, bck, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false)) { + return FALSE; + } + } + + mpModel->setUserArea((u32)this); + + if (mType == 4) { + for (u16 i = 0; i < modelData->getJointNum(); i++) { + switch (i) { + case 1: + case 2: + case 3: + modelData->getJointTree().getJointNodePointer(i)->setCallBack(nodeControl_CB); + break; + } + } + } + + setMtx(); + + mpBgW = new dBgW(); + if (mpBgW == NULL) { + return FALSE; + } + + cBgD_t* cbgd = (cBgD_t*)dComIfG_getObjectRes(m_arc_name, dzb[mType]); + if (mpBgW->Set(cbgd, cBgW::MOVE_BG_e, &mMtx) == true) { + return FALSE; + } + + if (mType == 4) { + ResTIMG* pImg = (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_ROPE); + if (!mRopeLine.init(1, 200, pImg, 0)) { + return FALSE; + } + +#if VERSION > VERSION_DEMO + J3DModelData* +#endif + modelData = (J3DModelData*)dComIfG_getObjectRes("Link", LINK_BDL_ROPEEND); + JUT_ASSERT(2228, modelData != NULL); + + mpRopeEnd = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002); + if (mpRopeEnd == NULL) { + return FALSE; + } + } + return TRUE; } /* 00004B60-00004C18 .text _create__13daObj_Ikada_cFv */ cPhs_State daObj_Ikada_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObj_Ikada_c); + + cPhs_State ret = dComIfG_resLoad(&mPhase, m_arc_name); + if (ret == cPhs_COMPLEATE_e) { + getArg(); + if (!fopAcM_entrySolidHeap(this, createHeap_CB, m_heapsize[mType])) { + return cPhs_ERROR_e; + } + createInit(); + } + return ret; } /* 00005320-0000543C .text _delete__13daObj_Ikada_cFv */ bool daObj_Ikada_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhase, m_arc_name); + + mWaveRCallback.remove(); + mWaveLCallback.remove(); + mSplashCallBack.remove(); + mTrackCallBack.remove(); + mRippleCallBack.remove(); + mFireParticle.remove(); + mBombSmokeEasterEgg.remove(); + +#if VERSION > VERSION_DEMO + mDoAud_seDeleteObject(&mSePos); +#endif + + bool bVar1 = (mType == 3) || (mType == 1); + if (bVar1) { + dKy_plight_cut(&mPLight); + } + +#if VERSION == VERSION_DEMO + if (mpBgW != NULL) { +#else + if (heap != NULL && mpBgW != NULL) { +#endif + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + } + return true; } /* 0000543C-0000545C .text daObj_IkadaCreate__FPv */