diff --git a/configure.py b/configure.py index ae26ab077..c812967ea 100755 --- a/configure.py +++ b/configure.py @@ -1586,8 +1586,8 @@ config.libs = [ ActorRel(NonMatching, "d_a_bwd"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_bwdg"), ActorRel(NonMatching, "d_a_bwds"), - ActorRel(NonMatching, "d_a_daiocta"), - ActorRel(NonMatching, "d_a_daiocta_eye"), + ActorRel(Matching, "d_a_daiocta"), + ActorRel(Matching, "d_a_daiocta_eye"), ActorRel(Matching, "d_a_deku_item"), ActorRel(NonMatching, "d_a_dk"), ActorRel(Matching, "d_a_dummy"), diff --git a/include/d/actor/d_a_daiocta.h b/include/d/actor/d_a_daiocta.h index d5b5a0943..5731bdba5 100644 --- a/include/d/actor/d_a_daiocta.h +++ b/include/d/actor/d_a_daiocta.h @@ -1,7 +1,12 @@ #ifndef D_A_DAIOCTA_H #define D_A_DAIOCTA_H +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_particle.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_hostIO.h" class J3DNode; class dCcD_SrcSph; @@ -9,23 +14,44 @@ class dCcD_SrcCps; class daDaiocta_c : public fopAc_ac_c { public: + enum OctoType_e { + FOUR_EYED = 0, + EIGHT_EYED = 1, + TWELVE_EYED = 2 + }; + enum Proc_e { - + PROC_INIT = 0, + PROC_EXEC = 1 }; enum Mode_e { - + MODE_HIDE = 0, + MODE_APPEAR = 1, + MODE_WAIT = 2, + MODE_DAMAGE = 3, + MODE_DAMAGE_BOMB = 4, + MODE_DELETE = 5, + MODE_DEMO = 6, + MODE_NULL + }; + + struct ModeEntry { + typedef void (daDaiocta_c::*ModeProcFunc)(void); + ModeProcFunc mInitFunc; + ModeProcFunc mUpdFunc; + char* mModeName; }; u8 getSw() { return mSwitchNo; } void _coHit(fopAc_ac_c*); void _nodeControl(J3DNode*, J3DModel*); - void _createHeap(); - void createAwaHeap(); - void createSuikomiHeap(); - void createBodyHeap(); - void createArrowHitHeap(); + BOOL _createHeap(); + BOOL createAwaHeap(); + BOOL createSuikomiHeap(); + BOOL createBodyHeap(); + BOOL createArrowHitHeap(); void setMtx(); void setSuikomiMtx(); void setAwaMtx(); @@ -34,10 +60,10 @@ public: void setAwaRandom(int); void initAwa(); void execAwa(); - void isLivingEye(); - void isDead(); - void isDamageEye(); - void isDamageBombEye(); + bool isLivingEye(); + bool isDead(); + bool isDamageEye(); + bool isDamageBombEye(); void setRotEye(); void setCollision(); void modeHideInit(); @@ -67,20 +93,127 @@ public: cPhs_State _create(); bool _delete(); + static const s32 m_heapsize; + static const char m_arc_name[]; static const dCcD_SrcSph m_sph_src; static const dCcD_SrcCps m_cps_src; public: - /* 0x290 */ u8 field_0x290[0x574 - 0x290]; - /* 0x574 */ u8 mSwitchNo; -}; + // Offsets shown are for retail + /* 0x0290 */ cXyz mSphCenters[37]; + /* 0x044C */ u8 m044C[0x04E0 - 0x044C]; + /* 0x04E0 */ u32 mAnmMtxIndices[12]; + /* 0x0510 */ u8 m0510[0x056C - 0x0510]; + /* 0x056C */ s32 mMode; + /* 0x0570 */ s8 mAnmIdx; + /* 0x0571 */ s8 mPrmIdx; + /* 0x0572 */ s8 mOldPrmIdx; + /* 0x0573 */ u8 mOctoType; + /* 0x0574 */ u8 mSwitchNo; + /* 0x0575 */ u8 m575; + /* 0x0576 */ u8 m0576[0x0578 - 0x0576]; + /* 0x0578 */ f32 mAppearRadius; + /* 0x057C */ u8 m057C; + /* 0x057D */ u8 m057D[0x0580 - 0x057D]; + /* 0x0580 */ request_of_phase_process_class mPhs; + /* 0x0588 */ mDoExt_McaMorf* mpMorf; + /* 0x058C */ mDoExt_brkAnm mBrkAnm1; + /* 0x05A4 */ dCcD_Sph mSph[6]; + /* 0x0CAC */ dCcD_Cps mCps[17]; + /* 0x2164 */ dCcD_Stts mStts; + /* 0x21A0 */ cXyz m21A0; + /* 0x21AC */ cXyz m21AC; + /* 0x21B8 */ cXyz m21B8; + /* 0x21C4 */ cXyz m21C4; + /* 0x21D0 */ cXyz m21D0; + /* 0x21DC */ cXyz m21DC; + /* 0x21E8 */ cXyz m21E8; + /* 0x21F4 */ cXyz m21F4; + /* 0x2200 */ csXyz m2200; + /* 0x2206 */ u8 m2206[0x2208 - 0x2206]; + /* 0x2208 */ f32 m2208; + /* 0x220C */ cXyz m220C; + /* 0x2218 */ dBgS_ObjAcch mAcch; + /* 0x23DC */ dBgS_AcchCir mAcchCir; +#if VERSION > VERSION_DEMO + /* 0x241C */ dPa_followEcallBack mParticleCallback; +#else + JPABaseEmitter* mpEmitter; +#endif + /* 0x2430 */ f32 mWaterY; + /* 0x2434 */ cXyz m2434; + /* 0x2440 */ fpc_ProcID mDaioctaEyePcId[12]; + /* 0x2470 */ bool mEyeAlloc[12]; + /* 0x247C */ u8 m247C[0x26BC - 0x247C]; + /* 0x26BC */ int mRotEyeTimer; + /* 0x26C0 */ u8 m26C0; + /* 0x26C1 */ u8 m26C1; + /* 0x26C2 */ u8 m26C2[0x26C4 - 0x26C2]; + /* 0x26C4 */ fpc_ProcID mpAuzu; + /* 0x26C8 */ JntHit_c* mpJntHit; + /* 0x26CC */ J3DModel* mpSuikomiModel; + /* 0x26D0 */ mDoExt_brkAnm mBrkAnm2; + /* 0x26E8 */ mDoExt_btkAnm mBtkAnm; + /* 0x26FC */ J3DModel* mpAwaModels[30]; + /* 0x2774 */ mDoExt_bckAnm mAwaBckAnms[30]; + /* 0x2954 */ mDoExt_btkAnm mAwaBtkAnms[30]; + /* 0x2BAC */ mDoExt_brkAnm mAwaBrkAnms[30]; + /* 0x2E7C */ int mAwaTimers[30]; + /* 0x2EF4 */ cXyz mAwaTranslation[30]; + /* 0x305C */ cXyz mAwaScale[30]; + /* 0x31C4 */ u8 m31C4; + /* 0x31C5 */ u8 m31C5[0x31C8 - 0x31C5]; +}; // Size: 0x31C8 +STATIC_ASSERT(sizeof(daDaiocta_c) == DEMO_SELECT(0x31B8, 0x31C8)); -class daDaiocta_HIO_c { +class daDaiocta_HIO_c : public mDoHIO_entry_c { public: daDaiocta_HIO_c(); public: - /* Place member variables here */ -}; + /* 0x004 */ u8 m004; + /* 0x005 */ u8 m005; + /* 0x006 */ u8 m006; + /* 0x007 */ u8 m007; + /* 0x008 */ u8 m008; + /* 0x009 */ u8 m009[0x00A - 0x009]; + /* 0x00A */ s16 m00A; + /* 0x00C */ s16 mRotEyeTimerMin; + /* 0x00E */ s16 mRotEyeTimerAddMax; + /* 0x010 */ s16 m010; + /* 0x012 */ s16 m012; + /* 0x014 */ s16 m014; + /* 0x016 */ s16 m016; + /* 0x018 */ s16 m018; + /* 0x01A */ u8 m01A[0x01C - 0x01A]; + /* 0x01C */ f32 mSphRadii[6]; + /* 0x034 */ f32 mCpsRadii[10]; + /* 0x05C */ f32 m05C; + /* 0x060 */ f32 m060; + /* 0x064 */ f32 m064; + /* 0x068 */ f32 m068; + /* 0x06C */ f32 m06C; + /* 0x070 */ f32 m070; + /* 0x074 */ f32 m074; + /* 0x078 */ f32 mDefaultAppearRadius; + /* 0x07C */ f32 mMinAppearRadius; + /* 0x080 */ f32 m080; + /* 0x084 */ f32 m084; + /* 0x088 */ f32 m088; + /* 0x08C */ f32 m08C; + /* 0x090 */ f32 m090; + /* 0x094 */ f32 m094; + /* 0x098 */ f32 m098[9]; + /* 0x0BC */ f32 m0BC[9]; + /* 0x0E0 */ f32 m0E0; + /* 0x0E4 */ f32 m0E4; + /* 0x0E8 */ f32 m0E8; + /* 0x0EC */ f32 m0EC; + /* 0x0F0 */ f32 m0F0; + /* 0x0F4 */ f32 m0F4; + /* 0x0F8 */ f32 m0F8; + /* 0x0FC */ cXyz m0FC; +}; // Size: 0x108 +STATIC_ASSERT(sizeof(daDaiocta_HIO_c) == DEMO_SELECT(0x10C, 0x108)); #endif /* D_A_DAIOCTA_H */ diff --git a/include/d/actor/d_a_daiocta_eye.h b/include/d/actor/d_a_daiocta_eye.h index e3a8f69f4..2d1c6aaea 100644 --- a/include/d/actor/d_a_daiocta_eye.h +++ b/include/d/actor/d_a_daiocta_eye.h @@ -1,16 +1,47 @@ #ifndef D_A_DAIOCTA_EYE_H #define D_A_DAIOCTA_EYE_H +#include "SSystem/SComponent/c_math.h" +#include "d/d_cc_d.h" +#include "d/d_jnt_hit.h" +#include "d/d_particle.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_hostIO.h" class J3DNode; +class daDaiocta_c; class daDaiocta_Eye_c : public fopAc_ac_c { public: - void rndRotEye() {} + enum Mode_e { + MODE_WAIT = 0, + MODE_DAMAGE = 1, + MODE_DEATH = 2 + }; + + typedef void (daDaiocta_Eye_c::*ModeProcFunc)(void); +public: + void rndRotEye() { + mEyeRotTargetX = cM_rndF(mEyeRndRotMaxX); + + if (std::fabsf(mEyeRotTargetX - mCurEyeRot.x) < m2EC) { + mEyeRotTargetX += m2EC; + } + + mEyeRotTargetY = cM_rndF(mEyeRndRotMaxY); + if (std::fabsf(mEyeRotTargetY - mCurEyeRot.y) < m2EE) { + mEyeRotTargetY += m2EE; + } + + mEyeRotTargetZ = cM_rndF(mEyeRndRotMaxZ); + if (std::fabsf(mEyeRotTargetZ - mCurEyeRot.z) < m2F0) { + mEyeRotTargetZ += m2F0; + } + } void _nodeControl(J3DNode*, J3DModel*); - void _createHeap(); + BOOL _createHeap(); void _coHit(fopAc_ac_c*); void setMtx(); void checkTgHit(); @@ -27,16 +58,68 @@ public: cPhs_State _create(); bool _delete(); + static const s32 m_heapsize; + static const char m_arc_name[]; + static const s32 m_scale_damage_time; public: - /* Place member variables here */ -}; + /* 0x290 */ s32 mEyeNo; + /* 0x294 */ bool mbIsDead; + /* 0x295 */ bool m295; + /* 0x296 */ bool mbIsDamaged; + /* 0x297 */ bool mbIsDamagedBomb; + /* 0x298 */ bool mbAppear; + /* 0x299 */ u8 m299[0x29C - 0x299]; + /* 0x29C */ s32 mMode; + /* 0x2A0 */ request_of_phase_process_class mPhs; + /* 0x2A8 */ J3DModel* mpModel; + /* 0x2AC */ J3DAnmTevRegKey* mpBrk; + /* 0x2B0 */ mDoExt_brkAnm mBrkAnm; + /* 0x2C8 */ J3DAnmTextureSRTKey* mpBtk; + /* 0x2CC */ mDoExt_btkAnm mBtkAnm; + /* 0x2E0 */ s16 mEyeRotTargetX; + /* 0x2E2 */ s16 mEyeRotTargetY; + /* 0x2E4 */ s16 mEyeRotTargetZ; + /* 0x2E6 */ csXyz mCurEyeRot; + /* 0x2EC */ s16 m2EC; + /* 0x2EE */ s16 m2EE; + /* 0x2F0 */ s16 m2F0; + /* 0x2F2 */ s16 mEyeRndRotMaxX; + /* 0x2F4 */ s16 mEyeRndRotMaxY; + /* 0x2F6 */ s16 mEyeRndRotMaxZ; + /* 0x2F8 */ dCcD_Sph mSph; + /* 0x424 */ dCcD_Stts mStts; + /* 0x460 */ cXyz mEyeScale; + /* 0x46C */ int mScaleAnimeIdx; + /* 0x470 */ JntHit_c* mpJntHit; + /* 0x474 */ daDaiocta_c* mpParentActor; + /* 0x478 */ dPa_followEcallBack mParticleCallback; + /* 0x48C */ cXyz mParticlePos; + /* 0x48C */ csXyz m498; + /* 0x49E */ u8 m49E[0x4A0 - 0x49E]; +}; // Size: 0x4A0 +STATIC_ASSERT(sizeof(daDaiocta_Eye_c) == 0x4A0); -class daDaiocta_Eye_HIO_c { +class daDaiocta_Eye_HIO_c : public mDoHIO_entry_c { public: daDaiocta_Eye_HIO_c(); - public: - /* Place member variables here */ + s16 m04; + u8 m06[0x08 - 0x06]; + f32 m08; + f32 m0C; + f32 mParticleTranslationX; + f32 mParticleTranslationY; + f32 mParticleTranslationZ; + f32 mSphRadius; + s16 mEyeRotStep; + s16 mEyeRotScale; + s16 m24; + s16 m26; + s16 m28; + s16 mEyeRndRotMaxX; + s16 mEyeRndRotMaxY; + s16 mEyeRndRotMaxZ; + JntHit_HIO_c m30; }; #endif /* D_A_DAIOCTA_EYE_H */ diff --git a/include/d/actor/d_a_obj_auzu.h b/include/d/actor/d_a_obj_auzu.h index a9807e0e0..90495ea72 100644 --- a/include/d/actor/d_a_obj_auzu.h +++ b/include/d/actor/d_a_obj_auzu.h @@ -9,14 +9,14 @@ namespace daObjAuzu { class Act_c : public fopAc_ac_c { public: void attr() const {} - void is_appear() const {} + bool is_appear() const { return field_0x2B4 > 0.999f; } void prm_get_appear() const {} void prm_get_linkID() const {} void prm_get_swSave() const {} void prm_get_type() const {} void prm_make_squid() {} - void to_appear() {} - void to_disappear() {} + void to_appear() { field_0x2B8 = true; } + void to_disappear() { field_0x2B8 = false; } void solidHeapCB(fopAc_ac_c*); void create_heap(); @@ -33,8 +33,11 @@ namespace daObjAuzu { bool _draw(); public: - /* Place member variables here */ - }; + /* 0x290 */ u8 field_0x290[0x2B4 - 0x290]; + /* 0x2B4 */ f32 field_0x2B4; + /* 0x2B8 */ bool field_0x2B8; + /* 0x2B9 */ u8 field_0x2B9[0x2C0 - 0x2B9]; + }; // Size: 0x2C0 }; #endif /* D_A_OBJ_AUZU_H */ diff --git a/src/d/actor/d_a_daiocta.cpp b/src/d/actor/d_a_daiocta.cpp index c25e2aed5..cfcf9c051 100644 --- a/src/d/actor/d_a_daiocta.cpp +++ b/src/d/actor/d_a_daiocta.cpp @@ -5,9 +5,24 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_daiocta.h" +#include "d/actor/d_a_bomb.h" +#include "d/actor/d_a_daiocta_eye.h" +#include "d/actor/d_a_obj_auzu.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_ship.h" #include "d/d_cc_d.h" +#include "d/d_jnt_hit.h" +#include "d/d_lib.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_s_play.h" +#include "d/d_snap.h" +#include "d/res/res_daiocta.h" + +static daDaiocta_HIO_c l_HIO; + +const s32 daDaiocta_c::m_heapsize = 63296; +const char daDaiocta_c::m_arc_name[] = "daiocta"; const dCcD_SrcSph daDaiocta_c::m_sph_src = { // dCcD_SrcGObjInf @@ -72,257 +87,1644 @@ const dCcD_SrcCps daDaiocta_c::m_cps_src = { /* 000000EC-000002B0 .text __ct__15daDaiocta_HIO_cFv */ daDaiocta_HIO_c::daDaiocta_HIO_c() { - /* Nonmatching */ + m004 = 0; + m008 = 0; + m006 = 0; + m005 = 0; + + mSphRadii[0] = 600.0f; + mSphRadii[1] = 500.0f; + mSphRadii[2] = 450.0f; + mSphRadii[3] = 350.0f; + mSphRadii[4] = 350.0f; + mSphRadii[5] = 300.0f; + + mCpsRadii[0] = 60.0f; + mCpsRadii[1] = 60.0f; + mCpsRadii[2] = 60.0f; + mCpsRadii[3] = 60.0f; + mCpsRadii[4] = 60.0f; + mCpsRadii[5] = 60.0f; + mCpsRadii[6] = 60.0f; + mCpsRadii[7] = 60.0f; + mCpsRadii[8] = 60.0f; + mCpsRadii[9] = 60.0f; + + m05C = 100.0f; + m060 = 100.0f; + m064 = 250.0f; + m068 = 100.0f; + m06C = 150.0f; + m070 = 100.0f; + m074 = 150.0f; + mRotEyeTimerMin = 0x1E; + mRotEyeTimerAddMax = 0x3C; + mDefaultAppearRadius = 5000.0f; + mMinAppearRadius = 4500.0f; + m080 = 30.0f; + m010 = 0x100; + m084 = 1800.0f; + m012 = 0x1500; + m088 = 40.0f; + m08C = 1.0f; + m090 = 0.02f; + m094 = 150.0f; + m014 = -0x800; + + m0FC.set(0.0f, 5.0f, 700.0f); + + m0BC[1] = 8.0f; + m0BC[2] = 8.0f; + m0BC[3] = 3.0f; + m0BC[4] = 3.0f; + m0BC[5] = 3.0f; + m0BC[6] = 7.0f; + m0BC[7] = 9.0f; + + m098[1] = 1.0f; + m098[2] = 0.5f; + m098[3] = 0.75f; + m098[4] = 0.625f; + m098[5] = 0.625f; + m098[6] = 0.5f; + m098[7] = 1.0f; + m098[8] = 1.0f; + + m0E0 = 20.0f; + m016 = 0x1E; + m0E4 = 300.0f; + m0E8 = 1200.0f; + m0EC = 1.0f; + m0F0 = 2.0f; + m0F4 = 10.0f; + m0F8 = 30.0f; + m018 = 0x2D; } /* 00000334-00000358 .text coHit_CB__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void coHit_CB(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +static void coHit_CB(fopAc_ac_c* i_this, dCcD_GObjInf*, fopAc_ac_c* i_actor, dCcD_GObjInf*) { + ((daDaiocta_c*)i_this)->_coHit(i_actor); } /* 00000358-000003DC .text _coHit__11daDaiocta_cFP10fopAc_ac_c */ -void daDaiocta_c::_coHit(fopAc_ac_c*) { - /* Nonmatching */ +void daDaiocta_c::_coHit(fopAc_ac_c* i_actor) { + if (i_actor != NULL && fpcM_GetName(i_actor) == PROC_BOMB) { + daBomb_c* bomb_p = (daBomb_c *) i_actor; + if ((mMode == MODE_WAIT || mMode == MODE_DAMAGE_BOMB || + mMode == MODE_APPEAR || mMode == MODE_DAMAGE) && + bomb_p->chk_state(daBomb_c::STATE_4)) { + modeProc(PROC_INIT, MODE_DAMAGE_BOMB); + } + } } /* 000003DC-00000470 .text nodeControl_CB__FP7J3DNodei */ -static BOOL nodeControl_CB(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeControl_CB(J3DNode* i_nodeP, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model_p = j3dSys.getModel(); + daDaiocta_c* daiocta = (daDaiocta_c *) model_p->getUserArea(); + JUT_ASSERT(420, daiocta != NULL); + daiocta->_nodeControl(i_nodeP, model_p); + } + return TRUE; } /* 00000470-0000066C .text _nodeControl__11daDaiocta_cFP7J3DNodeP8J3DModel */ -void daDaiocta_c::_nodeControl(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daDaiocta_c::_nodeControl(J3DNode* i_nodeP, J3DModel* i_modelP) { + J3DJoint* jnt_p = (J3DJoint *) i_nodeP; + s32 jnt_no = jnt_p->getJntNo(); + + mDoMtx_stack_c::copy(i_modelP->getAnmMtx(jnt_no)); + mDoMtx_stack_c::multVecZero(&mSphCenters[jnt_no]); + + cXyz base; + switch (jnt_no) { + case 30: + base.set(450.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21A0); + break; + case 36: + base.set(450.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21AC); + break; + case 20: + base.set(l_HIO.m094, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m2434); + break; + case 6: + base.set(450.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21B8); + break; + case 9: + base.set(300.0f, -200.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21C4); + break; + case 7: + base.set(300.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21D0); + break; + case 10: + base.set(300.0f, 200.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21DC); + break; + case 8: + base.set(300.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVec(&base, &m21E8); + break; + } + + cMtx_copy(mDoMtx_stack_c::get(), j3dSys.mCurrentMtx); + i_modelP->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 0000066C-0000068C .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* i_this) { + return ((daDaiocta_c *)i_this)->_createHeap(); } /* 0000068C-00000708 .text _createHeap__11daDaiocta_cFv */ -void daDaiocta_c::_createHeap() { - /* Nonmatching */ +BOOL daDaiocta_c::_createHeap() { + if (!createBodyHeap()) { + return FALSE; + } + + if (!createSuikomiHeap()) { + return FALSE; + } + + if (!createAwaHeap()) { + return FALSE; + } + + if (!createArrowHitHeap()) { + return FALSE; + } + + return true; } /* 00000708-000009B8 .text createAwaHeap__11daDaiocta_cFv */ -void daDaiocta_c::createAwaHeap() { - /* Nonmatching */ +BOOL daDaiocta_c::createAwaHeap() { + J3DModelData* modelData; + J3DAnmTransform* bck; + J3DAnmTextureSRTKey* btk; + J3DAnmTevRegKey* brk; + + modelData = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BDL_GAWA00)); + JUT_ASSERT(516, modelData != NULL); + + bck = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BCK_GAWA00)); + JUT_ASSERT(520, bck != NULL); + + btk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BTK_GAWA00)); + JUT_ASSERT(524, btk != NULL); + + brk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BRK_GAWA00)); + JUT_ASSERT(528, brk != NULL); + + + for (int i = 0; i < ARRAY_SSIZE(mpAwaModels); i++) { + // "awa" translates to bubbles + mpAwaModels[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000222); + if (mpAwaModels[i] == NULL) { + return FALSE; + } + + if (!mAwaBckAnms[i].init(modelData, bck, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false)) { + return FALSE; + } + + if (!mAwaBtkAnms[i].init(modelData, btk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, FALSE)) { + return FALSE; + } + + if (!mAwaBrkAnms[i].init(modelData, brk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, FALSE)) { + return FALSE; + } + } + + return TRUE; } /* 000009B8-00000ABC .text createSuikomiHeap__11daDaiocta_cFv */ -void daDaiocta_c::createSuikomiHeap() { - /* Nonmatching */ +BOOL daDaiocta_c::createSuikomiHeap() { + J3DModelData* modelData = (J3DModelData * ) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BDL_GDO_SUI00); + JUT_ASSERT(551, modelData != NULL); + + // "suikomi" translates to suction + mpSuikomiModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000222); + + if (!mpSuikomiModel) { + return FALSE; + } + + if (!dLib_brkInit(modelData, &mBrkAnm2, m_arc_name, DAIOCTA_BRK_GDO_SUI00) || + !dLib_btkInit(modelData, &mBtkAnm, m_arc_name, DAIOCTA_BTK_GDO_SUI00)) { + return FALSE; + } + + return TRUE; } /* 00000ABC-00000C04 .text createBodyHeap__11daDaiocta_cFv */ -void daDaiocta_c::createBodyHeap() { - /* Nonmatching */ +BOOL daDaiocta_c::createBodyHeap() { + J3DModelData* modelData = (J3DModelData *) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BDL_DO_MAIN1); + JUT_ASSERT(579, modelData != NULL); + + if (!dLib_brkInit(modelData, &mBrkAnm1, m_arc_name, DAIOCTA_BRK_WAIT1)) { + return FALSE; + } + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, NULL, + ~J3DFrameCtrl::EMode_NONE, + 1.0f, 0, -1, 1, NULL, + 0x80000, 0x11000222 + ); + + + if (!mpMorf || !mpMorf->getModel()) { + return FALSE; + } + + mpMorf->getModel()->setUserArea((u32) this); + + return TRUE; } /* 00000C04-00000C64 .text createArrowHitHeap__11daDaiocta_cFv */ -void daDaiocta_c::createArrowHitHeap() { - /* Nonmatching */ +BOOL daDaiocta_c::createArrowHitHeap() { + static Vec ude_cyl_offset[] = { + { 0.0f, 0.0f, 0.0f }, + { 400.0f, 0.0f, 0.0f } + }; + + static Vec te_cyl_offset[] = { + { 0.0f, 10.0f, 0.0f }, + { 450.0f, 10.0f, 0.0f } + }; + + static Vec body_cyl_offset[] = { + { -200.0f, 0.0f, 0.0f }, + { 200.0f, 0.0f, 0.0f } + }; + + static Vec body_top_cyl_offset[] = { + { -200.0f, 0.0f, 0.0f }, + { 400.0f, 0.0f, 0.0f } + }; + + static Vec hire_cyl_offset[] = { + { -200.0f, 0.0f, 0.0f }, + { 250.0f, 0.0f, 0.0f } + }; + + static __jnt_hit_data_c search_data[17] = { + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 2, + /* mRadius */ 550.0f, + /* mpOffsets */ body_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 3, + /* mRadius */ 450.0f, + /* mpOffsets */ body_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 4, + /* mRadius */ 400.0f, + /* mpOffsets */ body_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 5, + /* mRadius */ 300.0f, + /* mpOffsets */ body_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 6, + /* mRadius */ 200.0f, + /* mpOffsets */ body_top_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 7, + /* mRadius */ 150.0f, + /* mpOffsets */ body_top_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 8, + /* mRadius */ 150.0f, + /* mpOffsets */ body_top_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 9, + /* mRadius */ 100.0f, + /* mpOffsets */ hire_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 10, + /* mRadius */ 100.0f, + /* mpOffsets */ hire_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 30, + /* mRadius */ 40.0f, + /* mpOffsets */ te_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 29, + /* mRadius */ 40.0f, + /* mpOffsets */ ude_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 28, + /* mRadius */ 40.0f, + /* mpOffsets */ ude_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 27, + /* mRadius */ 40.0f, + /* mpOffsets */ ude_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 36, + /* mRadius */ 40.0f, + /* mpOffsets */ te_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 35, + /* mRadius */ 40.0f, + /* mpOffsets */ te_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 34, + /* mRadius */ 40.0f, + /* mpOffsets */ ude_cyl_offset + }, + { + /* mShapeType */ JntHitType_CYL_e, + /* mJointIndex */ 33, + /* mRadius */ 40.0f, + /* mpOffsets */ ude_cyl_offset + } + }; + + mpJntHit = JntHit_create( + mpMorf->getModel(), search_data, + ARRAY_SSIZE(search_data) + ); + + if (!mpJntHit) { + return FALSE; + } + + jntHit = mpJntHit; + + return TRUE; } /* 00000C64-00000D94 .text setMtx__11daDaiocta_cFv */ void daDaiocta_c::setMtx() { - /* Nonmatching */ + for (int i = 0; i < ARRAY_SSIZE(mEyeAlloc); i++) { + fopAc_ac_c* actor_p; + if (mEyeAlloc[i] && fopAcM_SearchByID(mDaioctaEyePcId[i], &actor_p)) { + Mtx mtx; + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(mAnmMtxIndices[i])); + mDoMtx_stack_c::multVecZero(&actor_p->current.pos); + cMtx_inverseTranspose(mDoMtx_stack_c::get(), mtx); + mDoMtx_MtxToRot(mtx, &actor_p->shape_angle); + } + } + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + setSuikomiMtx(); + setAwaMtx(); } /* 00000D94-00000E2C .text setSuikomiMtx__11daDaiocta_cFv */ void daDaiocta_c::setSuikomiMtx() { - /* Nonmatching */ + cXyz pos = current.pos; + pos.y = mWaterY; + mDoMtx_stack_c::transS(pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(l_HIO.m0FC); + mpSuikomiModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000E2C-00000EDC .text setAwaMtx__11daDaiocta_cFv */ void daDaiocta_c::setAwaMtx() { - /* Nonmatching */ + for (int i = 0; i < l_HIO.m016; i++) { + mpAwaModels[i]->setBaseScale(mAwaScale[i]); + mDoMtx_stack_c::transS(mAwaTranslation[i]); + mpAwaModels[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + } } /* 00000EDC-00000F70 .text initMtx__11daDaiocta_cFv */ void daDaiocta_c::initMtx() { - /* Nonmatching */ + mpMorf->getModel()->setBaseScale(scale); + mpSuikomiModel->setBaseScale(scale); + setMtx(); + mpMorf->getModel()->calc(); + mpSuikomiModel->calc(); } /* 00000F70-0000116C .text setEffect__11daDaiocta_cFUs */ -void daDaiocta_c::setEffect(unsigned short) { - /* Nonmatching */ +void daDaiocta_c::setEffect(u16 effect_name) { + GXColor sea_color_ambient; + GXColor sea_color_diffuse; // unused + cXyz particle_pos; + + dKy_get_seacolor(&sea_color_ambient, &sea_color_diffuse); + s32 r = sea_color_ambient.r + l_HIO.m018; + s32 g = sea_color_ambient.g + l_HIO.m018; + s32 b = sea_color_ambient.b + l_HIO.m018; + + if (r >= 0xFF) r = 0xFF; + if (g >= 0xFF) g = 0xFF; + if (b >= 0xFF) b = 0xFF; + + sea_color_ambient.r = r; + sea_color_ambient.g = g; + sea_color_ambient.b = b; + + particle_pos = current.pos; + particle_pos.y = mWaterY; + csXyz particle_angle(shape_angle); + + switch (effect_name) { + case dPa_name::ID_SCENE_81FE: +#if VERSION > VERSION_DEMO + if (!mParticleCallback.getEmitter()) { + dComIfGp_particle_set( + effect_name, &particle_pos, + NULL, NULL, 0xFF, &mParticleCallback, + -1, &sea_color_ambient + ); + } +#else + mpEmitter = dComIfGp_particle_set( + effect_name, &particle_pos, + NULL, NULL, 0xFF, NULL, -1, + &sea_color_ambient + ); +#endif + break; + case dPa_name::ID_SCENE_81FF: + case dPa_name::ID_SCENE_8200: + case dPa_name::ID_SCENE_8201: + case dPa_name::ID_SCENE_8202: + case dPa_name::ID_SCENE_8203: + case dPa_name::ID_SCENE_8204: + case dPa_name::ID_SCENE_8205: + dComIfGp_particle_set( + effect_name, &particle_pos, NULL, NULL, + 0xFF, NULL, -1, &sea_color_ambient + ); + break; + case dPa_name::ID_SCENE_8207: + case dPa_name::ID_SCENE_8208: + case dPa_name::ID_SCENE_8209: + case dPa_name::ID_SCENE_82CC: + dComIfGp_particle_set( + effect_name, &particle_pos, &particle_angle, NULL, + 0xFF, NULL, -1, &sea_color_ambient + ); + break; + default: + break; + } } /* 0000116C-0000129C .text setAwaRandom__11daDaiocta_cFi */ -void daDaiocta_c::setAwaRandom(int) { - /* Nonmatching */ +void daDaiocta_c::setAwaRandom(int i_awaIndex) { +#if VERSION > VERSION_DEMO + f32 f31, f30, f29, f29_2; + f30 = l_HIO.m0EC; + f31 = l_HIO.m0E4; + f29 = l_HIO.m0E8 - f31; + mAwaScale[i_awaIndex].setall(f30 + cM_rndF(l_HIO.m0F0 - f30)); + + f29_2 = f31 + cM_rndF(f29); +#else + f32 f31, f1, f30, f29, f29_2; + f31 = l_HIO.m0EC; + f1 = l_HIO.m0F0 - f31; + + f30 = l_HIO.m0E4; + f29 = l_HIO.m0E8 - f30; + mAwaScale[i_awaIndex].setall(f31 + cM_rndF(f1)); + + f29_2 = f30 + cM_rndF(f29); +#endif + + s16 random_theta = cM_rndF(65536.0f); + + mAwaTranslation[i_awaIndex].x = current.pos.x + f29_2 * cM_ssin(random_theta); + mAwaTranslation[i_awaIndex].y = mWaterY; + mAwaTranslation[i_awaIndex].z = current.pos.z + f29_2 * cM_scos(random_theta); } /* 0000129C-000013D8 .text initAwa__11daDaiocta_cFv */ void daDaiocta_c::initAwa() { - /* Nonmatching */ + for (int i = 0; i < l_HIO.m016; i++) { + setAwaRandom(i); + f32 tmp = l_HIO.m0F4; + f32 tmp2 = cM_rndF(l_HIO.m0F8 - l_HIO.m0F4); + mAwaTimers[i] = tmp + tmp2; + mAwaBckAnms[i].setFrame(mAwaBckAnms[i].getEndFrame()); + mAwaBtkAnms[i].setFrame(mAwaBtkAnms[i].getEndFrame()); + mAwaBrkAnms[i].setFrame(mAwaBrkAnms[i].getEndFrame()); + } } /* 000013D8-00001548 .text execAwa__11daDaiocta_cFv */ void daDaiocta_c::execAwa() { - /* Nonmatching */ + for (int i = 0; i < l_HIO.m016; i++) { + if (cLib_calcTimer(&mAwaTimers[i]) == 0) { + mAwaBckAnms[i].play(); + mAwaBtkAnms[i].play(); + mAwaBrkAnms[i].play(); + if (m31C4 || l_HIO.m008) { + if (mAwaBckAnms[i].isStop()) { + mAwaBckAnms[i].setFrame(0.0f); + mAwaBckAnms[i].setPlaySpeed(1.0f); + + mAwaBtkAnms[i].setFrame(0.0f); + mAwaBtkAnms[i].setPlaySpeed(1.0f); + + mAwaBrkAnms[i].setFrame(0.0f); + mAwaBrkAnms[i].setPlaySpeed(1.0f); + + f32 fVar1 = l_HIO.m0F4; + mAwaTimers[i] = fVar1 + cM_rndF(l_HIO.m0F8 - fVar1); + setAwaRandom(i); + } + } + } + } } /* 00001548-000015E8 .text isLivingEye__11daDaiocta_cFv */ -void daDaiocta_c::isLivingEye() { - /* Nonmatching */ +bool daDaiocta_c::isLivingEye() { + bool is_alive = false; + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (mEyeAlloc[i] == true) { + daDaiocta_Eye_c* big_octo_eye_p = (daDaiocta_Eye_c *) fopAcM_SearchByID(mDaioctaEyePcId[i]); + if (!big_octo_eye_p) { + mEyeAlloc[i] = false; + } else if (big_octo_eye_p->mbIsDead == false) { + is_alive = true; + } + } + } + return is_alive; } /* 000015E8-00001684 .text isDead__11daDaiocta_cFv */ -void daDaiocta_c::isDead() { - /* Nonmatching */ +bool daDaiocta_c::isDead() { + int count = 0; + for (int i = 0; i < ARRAY_SSIZE(mEyeAlloc); i++) { + if (mEyeAlloc[i] == true) { + daDaiocta_Eye_c* big_octo_eye_p = (daDaiocta_Eye_c *) fopAcM_SearchByID(mDaioctaEyePcId[i]); + if (big_octo_eye_p && big_octo_eye_p->mbIsDead == 0) { + count++; + } + } + } + + if (count == 0) { + return true; + } + + return false; } /* 00001684-0000171C .text isDamageEye__11daDaiocta_cFv */ -void daDaiocta_c::isDamageEye() { - /* Nonmatching */ +bool daDaiocta_c::isDamageEye() { + bool is_damaged = false; + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (mEyeAlloc[i] == true) { + daDaiocta_Eye_c* big_octo_eye_p = (daDaiocta_Eye_c *) fopAcM_SearchByID(mDaioctaEyePcId[i]); + if (big_octo_eye_p && big_octo_eye_p->mbIsDamaged) { + is_damaged = true; + } + } + } + return is_damaged; } /* 0000171C-000017B4 .text isDamageBombEye__11daDaiocta_cFv */ -void daDaiocta_c::isDamageBombEye() { - /* Nonmatching */ +bool daDaiocta_c::isDamageBombEye() { + bool is_damaged = false; + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (mEyeAlloc[i] == true) { + daDaiocta_Eye_c* big_octo_eye_p = (daDaiocta_Eye_c *) fopAcM_SearchByID(mDaioctaEyePcId[i]); + if (big_octo_eye_p && big_octo_eye_p->mbIsDamagedBomb != 0) { + is_damaged = true; + } + } + } + return is_damaged; } /* 000017B4-00001A7C .text setRotEye__11daDaiocta_cFv */ void daDaiocta_c::setRotEye() { - /* Nonmatching */ + if (cLib_calcTimer(&mRotEyeTimer) == 0) { + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (mEyeAlloc[i] == true) { + daDaiocta_Eye_c* big_octo_eye_p = (daDaiocta_Eye_c *) fopAcM_SearchByID(mDaioctaEyePcId[i]); + if (big_octo_eye_p && big_octo_eye_p->mbIsDead == 0) { + big_octo_eye_p->mEyeNo = i; + big_octo_eye_p->rndRotEye(); + } + } + } + mRotEyeTimer = l_HIO.mRotEyeTimerMin + cM_rndF(l_HIO.mRotEyeTimerAddMax); + } } /* 00001A7C-00001EA0 .text setCollision__11daDaiocta_cFv */ void daDaiocta_c::setCollision() { - /* Nonmatching */ + for (int i = 0; i < ARRAY_SSIZE(mSph); i++) { + int j; + switch (i) { + case 0: + j = 2; + break; + case 1: + j = 3; + break; + case 2: + j = 4; + break; + case 3: + j = 5; + break; + case 4: + j = 6; + break; + case 5: + j = 20; + break; + } + + mSph[i].SetR(l_HIO.mSphRadii[i]); + mSph[i].SetC(mSphCenters[j]); + dComIfG_Ccsp()->Set(&mSph[i]); + } + + for (int i = 0; i < 10; i++) { + int j, k; + switch (i) { + case 0: + j = 25; + k = 26; + break; + case 1: + j = 26; + k = 27; + break; + case 2: + j = 27; + k = 28; + break; + case 3: + j = 28; + k = 29; + break; + case 4: + j = 29; + k = 30; + break; + case 5: + j = 31; + k = 32; + break; + case 6: + j = 32; + k = 33; + break; + case 7: + j = 33; + k = 34; + break; + case 8: + j = 34; + k = 35; + break; + case 9: + j = 35; + k = 36; + break; + } + + mCps[i].set(mSphCenters[j], mSphCenters[k]); + mCps[i].SetR(l_HIO.mCpsRadii[i]); + dComIfG_Ccsp()->Set(&mCps[i]); + } + + mCps[10].set(mSphCenters[36], m21AC); + mCps[10].SetR(l_HIO.m05C); + dComIfG_Ccsp()->Set(&mCps[10]); + + mCps[11].set(mSphCenters[30], m21A0); + mCps[11].SetR(l_HIO.m060); + dComIfG_Ccsp()->Set(&mCps[11]); + + mCps[12].set(mSphCenters[6], m21B8); + mCps[12].SetR(l_HIO.m064); + dComIfG_Ccsp()->Set(&mCps[12]); + + mCps[13].set(mSphCenters[10], m21DC); + mCps[13].SetR(l_HIO.m068); + dComIfG_Ccsp()->Set(&mCps[13]); + + mCps[14].set(mSphCenters[8], m21E8); + mCps[14].SetR(l_HIO.m06C); + dComIfG_Ccsp()->Set(&mCps[14]); + + mCps[15].set(mSphCenters[9], m21C4); + mCps[15].SetR(l_HIO.m070); + dComIfG_Ccsp()->Set(&mCps[15]); + + mCps[16].set(mSphCenters[7], m21D0); + mCps[16].SetR(l_HIO.m074); + dComIfG_Ccsp()->Set(&mCps[16]); } /* 00001EA0-00001EB8 .text modeHideInit__11daDaiocta_cFv */ void daDaiocta_c::modeHideInit() { - /* Nonmatching */ + current.pos.y = mWaterY - 3000.0f; } /* 00001EB8-00001F34 .text modeHide__11daDaiocta_cFv */ void daDaiocta_c::modeHide() { - /* Nonmatching */ + f32 dist_xz = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + if ((dist_xz < mAppearRadius || dist_xz < l_HIO.mMinAppearRadius) && + dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + modeProc(PROC_INIT, MODE_APPEAR); + } } /* 00001F34-000020C8 .text modeAppearInit__11daDaiocta_cFv */ void daDaiocta_c::modeAppearInit() { - /* Nonmatching */ + fopAcM_SetStatusMap(this, 0); + fopAc_ac_c* player_p = dComIfGp_getPlayer(0); + cXyz dir_to_actor = current.pos - player_p->current.pos; + cXyz new_pos = player_p->current.pos + (dir_to_actor.normZP() * l_HIO.mMinAppearRadius); + current.pos.x = new_pos.x; + current.pos.z = new_pos.z; + attention_info.flags = 0; + + cXyz auzu_pos = current.pos; + auzu_pos.y = mWaterY + 2.0f; + +#if VERSION > VERSION_JPN + fopAc_ac_c* auzu_p; + + if (fopAcM_SearchByID(mpAuzu, &auzu_p) && auzu_p) { + auzu_p->current.pos = auzu_pos; + } +#else + int auzu_parameters = 0x1100FF; + mpAuzu = fopAcM_create(PROC_Obj_Auzu, auzu_parameters, &auzu_pos, tevStr.mRoomNo); +#endif + + setEffect(dPa_name::ID_SCENE_81FE); + mDoAud_bgmAllMute(90); + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + daDaiocta_Eye_c* big_octo_eye_p; + if (fopAcM_SearchByID(mDaioctaEyePcId[i], (fopAc_ac_c**)&big_octo_eye_p)) { + big_octo_eye_p->mbAppear = true; + } + } } /* 000020C8-0000236C .text modeAppear__11daDaiocta_cFv */ void daDaiocta_c::modeAppear() { - /* Nonmatching */ + if (isDamageEye()) { + modeProc(PROC_INIT, MODE_DAMAGE); + } + + if (DEMO_SELECT(mpEmitter, mParticleCallback.getEmitter())) { + GXColor sea_color_ambient; + GXColor sea_color_diffuse; + dKy_get_seacolor(&sea_color_ambient, &sea_color_diffuse); + + int r = sea_color_ambient.r + l_HIO.m018; + int g = sea_color_ambient.g + l_HIO.m018; + int b = sea_color_ambient.b + l_HIO.m018; + + if (r >= 0xFF) r = 0xFF; + if (g >= 0xFF) g = 0xFF; + if (b >= 0xFF) b = 0xFF; + + sea_color_ambient.r = r; + sea_color_ambient.g = g; + sea_color_ambient.b = b; + + DEMO_SELECT(mpEmitter, mParticleCallback.getEmitter())->setGlobalPrmColor( + sea_color_ambient.r, + sea_color_ambient.g, + sea_color_ambient.b + ); + } + + daObjAuzu::Act_c* auzu_p = (daObjAuzu::Act_c *) fopAcM_SearchByID(mpAuzu); + if (auzu_p) { + auzu_p->to_appear(); + if (auzu_p->is_appear()) { + cXyz sp2C = current.pos; + sp2C.y = mWaterY; + cLib_addCalcPos2(¤t.pos, sp2C, 0.1f, l_HIO.m080); + + f32 dist = (current.pos - sp2C).abs(); + if (dist < 1900.0f && m26C0 == 0) { + fopAcM_seStart(this, JA_SE_CM_DO_ENTER, 0); + m26C0 = 1; + mDoAud_subBgmStart(JA_BGM_DIOCTA_BATTLE); + } + + if (dist <= 0.1) { + modeProc(PROC_INIT, MODE_WAIT); + } else { + s16 target = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); + cLib_addCalcAngleS2(&shape_angle.y, target, 4, l_HIO.m010); + } + } + } } /* 0000236C-000023B0 .text modeWaitInit__11daDaiocta_cFv */ void daDaiocta_c::modeWaitInit() { - /* Nonmatching */ + if (isDead()) { + modeProc(PROC_INIT, MODE_DELETE); + } } /* 000023B0-00002458 .text modeWait__11daDaiocta_cFv */ void daDaiocta_c::modeWait() { - /* Nonmatching */ + current.pos.y = mWaterY; + if (isDead() || l_HIO.m006 != 0) { + modeProc(PROC_INIT, MODE_DELETE); + } else if (isDamageEye()) { + modeProc(PROC_INIT, MODE_DAMAGE); + } else if (isDamageBombEye()) { + modeProc(PROC_INIT, MODE_DAMAGE_BOMB); + } } /* 00002458-000024D8 .text modeDamageInit__11daDaiocta_cFv */ void daDaiocta_c::modeDamageInit() { - /* Nonmatching */ + if (isDead()) { + modeProc(PROC_INIT, MODE_DELETE); + } else { + mPrmIdx = 2; + setAnm(); + mPrmIdx = 4; + + setEffect(dPa_name::ID_SCENE_8201); + setEffect(dPa_name::ID_SCENE_8202); + } } /* 000024D8-000025C4 .text modeDamage__11daDaiocta_cFv */ void daDaiocta_c::modeDamage() { - /* Nonmatching */ + current.pos.y = mWaterY; + if (isDead()) { + modeProc(PROC_INIT, MODE_DELETE); + } else if (isDamageEye()) { + modeProc(PROC_INIT, MODE_DAMAGE); + } else if (isDamageBombEye()) { + modeProc(PROC_INIT, MODE_DAMAGE_BOMB); + } + + if (mPrmIdx == 2) { + if (std::fabsf(current.pos.y - mWaterY) <= 0.1) { + modeProc(PROC_INIT, MODE_WAIT); + } else { + modeProc(PROC_INIT, MODE_APPEAR); + } + } } /* 000025C4-0000268C .text modeDamageBombInit__11daDaiocta_cFv */ void daDaiocta_c::modeDamageBombInit() { - /* Nonmatching */ + if (isDead()) { + modeProc(PROC_INIT, MODE_DELETE); + } else { + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + mPrmIdx = 2; + setAnm(); + mPrmIdx = 3; + setEffect(dPa_name::ID_SCENE_81FF); + setEffect(dPa_name::ID_SCENE_8200); + } } /* 0000268C-00002778 .text modeDamageBomb__11daDaiocta_cFv */ void daDaiocta_c::modeDamageBomb() { - /* Nonmatching */ + current.pos.y = mWaterY; + if (isDead()) { + modeProc(PROC_INIT, MODE_DELETE); + } else if (isDamageEye()) { + modeProc(PROC_INIT, MODE_DAMAGE); + } else if (isDamageBombEye()) { + modeProc(PROC_INIT, MODE_DAMAGE_BOMB); + } + + if (mPrmIdx == 2) { + if (std::fabsf(current.pos.y - mWaterY) <= 0.1) { + modeProc(PROC_INIT, MODE_WAIT); + } else { + modeProc(PROC_INIT, MODE_APPEAR); + } + } } /* 00002778-000028FC .text modeDemoInit__11daDaiocta_cFv */ void daDaiocta_c::modeDemoInit() { - /* Nonmatching */ + attention_info.flags = 0; + setEffect(dPa_name::ID_SCENE_8207); + setEffect(dPa_name::ID_SCENE_8208); + setEffect(dPa_name::ID_SCENE_8209); + J3DModelData* model_data_p = mpSuikomiModel->getModelData(); + + J3DAnmTevRegKey* brk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BRK_GDO_SUI00)); + JUT_ASSERT(VERSION_SELECT(1334, 1340, 1350, 1350), brk != NULL); + + J3DAnmTextureSRTKey* btk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BTK_GDO_SUI00)); + JUT_ASSERT(VERSION_SELECT(1337, 1343, 1353, 1353), btk != NULL); + + mBrkAnm2.init( + model_data_p, brk, true, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); + mBtkAnm.init( + model_data_p, btk, true, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); } /* 000028FC-00003150 .text modeDemo__11daDaiocta_cFv */ void daDaiocta_c::modeDemo() { - /* Nonmatching */ + current.pos.y = mWaterY; + daShip_c* ship_p_1 = (daShip_c *) fopAcM_SearchByName(PROC_SHIP); + m21F4 = ship_p_1->current.pos; + m2200 = ship_p_1->current.angle; + + if (eventInfo.checkCommandDemoAccrpt()) { + int staff_id = dComIfGp_evmng_getMyStaffId("Daiocta"); + char* cut_name = dComIfGp_getPEvtManager()->getMyNowCutName(staff_id); + + cXyz current_pos = current.pos; + s16 o_angle; + dComIfGp_getMapTrans( + fopAcM_GetRoomNo(this), + ¤t_pos.x, + ¤t_pos.z, + &o_angle + ); + + s16 rot_y = cLib_targetAngleY(¤t.pos, ¤t_pos); + cLib_distanceAngleS(shape_angle.y, rot_y); + + if (strcmp(cut_name, "SUIKOMI1") == 0) { + mPrmIdx = 6; + if (mPrmIdx == 6) { + mDoAud_seStart( + JA_SE_CM_DO_SUCK_IN, &m2434, 0, + dComIfGp_getReverb(fopAcM_GetRoomNo(this)) + ); + } + + if ((m2434 - m21F4).absXZ() < 80.0f) { + dComIfGp_evmng_cutEnd(staff_id); + } else if (mpMorf->getFrame() == 50.0f) { + mpMorf->setFrame(40.0f); + } + + if (REG12_S(0) != 0) { + return; + } + + s16 target_angle_y = cLib_targetAngleY(¤t.pos, &ship_p_1->current.pos); + s32 distance_angle_s = cLib_distanceAngleS(shape_angle.y + l_HIO.m014, target_angle_y); + cLib_addCalc2(&m2208, l_HIO.m088, l_HIO.m090, l_HIO.m08C); + cLib_chaseF(&m21F4.x, m2434.x, m2208 / 2.0f); + cLib_chaseF(&m21F4.z, m2434.z, m2208); + cLib_addCalcAngleS2(&m2200.y, target_angle_y + 0x8000, 8, 0x400); + + if (distance_angle_s < l_HIO.m012) { + target_angle_y = target_angle_y + 0x4000; + f32 dist = (current.pos - ship_p_1->current.pos).absXZ(); + m21F4.z += (dist / (REG12_F(1) + 60.0f)) * cM_scos(target_angle_y); + m21F4.x += (dist / (REG12_F(1) + 60.0f)) * cM_ssin(target_angle_y); + } + + daShip_c* ship_p_2 = (daShip_c *) fopAcM_SearchByName(PROC_SHIP); + ship_p_2->initStartPos(&m21F4, m2200.y); + } + + if (strcmp(cut_name, "SUIKOMI2") == 0) { + if (mpMorf->getFrame() == 65.0f) { + fopAcM_seStart(this, JA_SE_CM_DO_SUCK_IN_FIN, 0); + } + + s16 target_angle_y = cLib_targetAngleY(¤t.pos, &ship_p_1->current.pos); + cLib_distanceAngleS(shape_angle.y, target_angle_y); + cLib_chasePosXZ(&m21F4, current.pos, m2208); + cLib_addCalcAngleS2(&m2200.y, target_angle_y + 0x8000, 4, 0x800); + + daShip_c* ship_p_2 = (daShip_c *) fopAcM_SearchByName(PROC_SHIP); + ship_p_2->initStartPos(&m21F4, m2200.y); + + if ((current.pos - m21F4).absXZ() < 10.0f && (mpMorf->isStop() || mPrmIdx == 2)) { + shape_angle.y = rot_y; + mpMorf->calc(); + current.pos = m220C; + ship_p_2->initStartPos(¤t.pos, rot_y); + dComIfGp_evmng_cutEnd(staff_id); + } + } + + if (strcmp(cut_name, "HAKIDASU") == 0) { + fopAc_ac_c* actor_p = fopAcM_SearchByID(mpAuzu); + actor_p->current.pos = current.pos; + actor_p->current.pos.y += 20.0f; + if (s32(mpMorf->getFrame()) == 26) { + mDoAud_seStart( + JA_SE_CV_DO_SPIT_SHIP, &m2434, 0, + dComIfGp_getReverb(fopAcM_GetRoomNo(this)) + ); + } + + if (mPrmIdx == 8 && mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(staff_id); +#if VERSION > VERSION_DEMO + mDoAud_subBgmStop(); +#endif + } else if (mpMorf->getFrame() < 10.0f) { + ship_p_1->initStartPos(&m2434, rot_y); + } + mPrmIdx = 8; + } + + if (strcmp(cut_name, "WAIT") == 0) { + mPrmIdx = 2; + } + + if (dComIfGp_evmng_endCheck("DAIOCTA_SUIKOMI")) { +#if VERSION == VERSION_DEMO + mDoAud_subBgmStop(); +#endif + if (m575 == 0xFF) { + daPy_getPlayerLinkActorClass()->startRestartRoom(6, 0xC9, -1.0f, 1); + } else { + dComIfGp_setNextStage( + dComIfGp_getStartStageName(), + m575, fopAcM_GetRoomNo(this), + -1, 0.0f, 6 + ); + } + } + } else { + fopAcM_orderOtherEvent2(this, "DAIOCTA_SUIKOMI", dEvtFlag_NOPARTNER_e); + } } /* 00003150-00003284 .text modeDeleteInit__11daDaiocta_cFv */ void daDaiocta_c::modeDeleteInit() { - /* Nonmatching */ + attention_info.flags = 0; + fopAcM_seStart(this, JA_SE_CV_DO_DIE, 0); + fopAcM_seStart(this, JA_SE_CM_DO_JITABATA, 0); + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + setEffect(dPa_name::ID_SCENE_8203); + setEffect(dPa_name::ID_SCENE_8204); } /* 00003284-000036A8 .text modeDelete__11daDaiocta_cFv */ void daDaiocta_c::modeDelete() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + int staff_id = dComIfGp_evmng_getMyStaffId("Daiocta"); + char* cut_name = dComIfGp_getPEvtManager()->getMyNowCutName(staff_id); + + if (strcmp(cut_name, "DEATH1") == 0) { + current.pos.y = mWaterY; + mPrmIdx = 5; + if (mPrmIdx == 5 && mpMorf->isStop()) { + fopAcM_monsSeStart(this, JA_SE_CV_DO_SINK, 0); + setEffect(dPa_name::ID_SCENE_8205); + daObjAuzu::Act_c* auzu_p = (daObjAuzu::Act_c *) fopAcM_SearchByID(mpAuzu); + auzu_p->to_disappear(); + dComIfGp_getVibration().StartQuake(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + dComIfGp_evmng_cutEnd(staff_id); + } + } + + if (strcmp(cut_name, "DEATH2") == 0) { + cXyz target_pos = current.pos; + target_pos.y = mWaterY - 3000.0f; + mPrmIdx = 7; + cLib_chasePos(¤t.pos, target_pos, l_HIO.m0E0); + + if (std::fabsf(current.pos.y - mWaterY) > 600.0f && m26C1 == 0) { + initAwa(); + fopAcM_seStart(this, JA_SE_CM_DO_SINK_IN_SEA, 0); + m26C1 = 1; + m31C4 = 1; + mDoAud_subBgmStop(); + } + + if ((current.pos - target_pos).abs() < l_HIO.m0E0 * 3.0f) { + if (mSwitchNo != 0xFF) { + m31C4 = 0; + dComIfGp_getVibration().StopQuake(-1); + dComIfGs_onSwitch(mSwitchNo, fopAcM_GetRoomNo(this)); + if (m057C != 1) { + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + fopAcM_ClearStatusMap(this); + } + dComIfGp_evmng_cutEnd(staff_id); + } + } + + if (m057C != 1 && dComIfGp_evmng_endCheck("DAIOCTA_DEAD")) { + dComIfGp_event_reset(); + fopAcM_delete(this); + } + } else if (m057C == 1) { + fopAcM_orderOtherEvent2(this, "DAIOCTA_DEAD_ELF", dEvtFlag_NOPARTNER_e); + } else { + fopAcM_orderOtherEvent2(this, "DAIOCTA_DEAD", dEvtFlag_NOPARTNER_e); + } } /* 000036A8-00003888 .text modeProc__11daDaiocta_cFQ211daDaiocta_c6Proc_eQ211daDaiocta_c6Mode_e */ -void daDaiocta_c::modeProc(daDaiocta_c::Proc_e, daDaiocta_c::Mode_e) { - /* Nonmatching */ +void daDaiocta_c::modeProc(daDaiocta_c::Proc_e i_procType, daDaiocta_c::Mode_e i_modeProc) { + static ModeEntry mode_tbl[7] = { + { &daDaiocta_c::modeHideInit, &daDaiocta_c::modeHide, "HIDE" }, + { &daDaiocta_c::modeAppearInit, &daDaiocta_c::modeAppear, "APPEAR" }, + { &daDaiocta_c::modeWaitInit, &daDaiocta_c::modeWait, "WAIT" }, + { &daDaiocta_c::modeDamageInit, &daDaiocta_c::modeDamage, "DAMAGE" }, + { &daDaiocta_c::modeDamageBombInit, &daDaiocta_c::modeDamageBomb, "DAMAGE_BOMB" }, + { &daDaiocta_c::modeDeleteInit, &daDaiocta_c::modeDelete, "DELETE" }, + { &daDaiocta_c::modeDemoInit, &daDaiocta_c::modeDemo, "DEMO" } + }; + + if (i_procType == PROC_INIT) { + mMode = i_modeProc; + (this->*mode_tbl[mMode].mInitFunc)(); + } else if (i_procType == PROC_EXEC) { + (this->*mode_tbl[mMode].mUpdFunc)(); + } } /* 00003888-00003AF4 .text setAnm__11daDaiocta_cFv */ void daDaiocta_c::setAnm() { - /* Nonmatching */ + static const dLib_anm_idx_c a_anm_idx_tbl[] = { + { 0xD, -1 }, + { 0x6, -1 }, + { 0x7, -1 }, + { 0x8, -1 }, + { 0xC, -1 }, + { 0x9, -1 }, + { 0xB, -1 } + }; + + dLib_anm_prm_c anm_prms[] = { + { 0, -1, 0, 8.0f, 1.0f, J3DFrameCtrl::EMode_NONE }, + { 0, -1, 0, 8.0f, 2.0f, J3DFrameCtrl::EMode_LOOP }, + { 0, -1, 0, 8.0f, 1.0f, J3DFrameCtrl::EMode_LOOP }, + { 1, 2, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_NONE }, + { 2, 2, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_NONE }, + { 3, -1, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_NONE }, + { 4, 2, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_NONE }, + { 5, -1, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_LOOP }, + { 6, -1, 0, 1.0f, 1.0f, J3DFrameCtrl::EMode_NONE } + }; + + for (int i = 1; i < 9; i++) { + anm_prms[i].mMorf = l_HIO.m0BC[i]; + anm_prms[i].mPlaySpeed = l_HIO.m098[i]; + } + + J3DModel* morf_model_p = mpMorf->getModel(); + if (mAnmIdx == 3) { + f32 morf_frame = mpMorf->getFrame(); + if (morf_frame == 10.0f || morf_frame == 25.0f || morf_frame == 45.0f) { + dComIfGp_getVibration().StartShock(6, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + } + } + + if (mAnmIdx == 6) { + if (mpMorf->getFrame() == 1.0f) { + setEffect(dPa_name::ID_SCENE_82CC); + } + if (mpMorf->getFrame() == 26.0f) { + dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + } + } + + static const s32 a_brk_anm_idx_tbl[] = { + DAIOCTA_BRK_WAIT1, + DAIOCTA_BRK_DAMAGE1, + DAIOCTA_BRK_DAMAGE2, + DAIOCTA_BRK_DEATH1, + DAIOCTA_BRK_SUIKOMU1, + DAIOCTA_BRK_DEATH2, + DAIOCTA_BRK_HAKIDASU1 + }; + + static const s32 a_brk_anm_prm_tbl[] = { + 0, 0, 0, 1, 2, + 3, 4, 5, 6 + }; + + s32 idx = a_brk_anm_prm_tbl[mPrmIdx]; + + if (mOldPrmIdx != mPrmIdx && idx != -1) { + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey *) dComIfG_getObjectRes(m_arc_name, + a_brk_anm_idx_tbl[a_brk_anm_prm_tbl[mPrmIdx]]); + JUT_ASSERT(VERSION_SELECT(1760, 1772, 1782, 1782), brk != NULL); + mBrkAnm1.init( + morf_model_p->getModelData(), brk, + TRUE, J3DFrameCtrl::EMode_LOOP, + 1.0f, 0, -1, true, FALSE + ); + } + dLib_setAnm(m_arc_name, mpMorf, &mAnmIdx, &mPrmIdx, &mOldPrmIdx, a_anm_idx_tbl, anm_prms, false); + mBrkAnm1.setFrame(mpMorf->getFrame()); } /* 00003AF4-00003B20 .text setWater__11daDaiocta_cFv */ void daDaiocta_c::setWater() { - /* Nonmatching */ + if (mAcch.GetSeaHeight() != -G_CM3D_F_INF) { + mWaterY = mAcch.GetSeaHeight(); + } else { + mWaterY = 0.0f; + } } /* 00003B20-00003D20 .text _execute__11daDaiocta_cFv */ bool daDaiocta_c::_execute() { - /* Nonmatching */ + if (mMode == MODE_DELETE) { + execAwa(); + } + + if (mMode != MODE_HIDE && DEMO_SELECT(true, mMode != MODE_APPEAR)) { +#if VERSION == VERSION_DEMO + setWater(); + mBrkAnm2.play(); + mBtkAnm.play(); +#endif + f32 dist = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + s16 angle_y = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)); + s32 dist_angle_s = cLib_distanceAngleS(shape_angle.y + l_HIO.m014, angle_y); + if (dist < l_HIO.m084 && + mMode != MODE_DEMO && + mMode != MODE_DELETE && + dist_angle_s < l_HIO.m012) { + modeProc(PROC_INIT, MODE_DEMO); + } +#if VERSION > VERSION_DEMO + } + + if (mMode != MODE_HIDE) { + setWater(); + mBrkAnm2.play(); + mBtkAnm.play(); +#endif + + attention_info.position = current.pos; + eyePos = current.pos; + + isLivingEye(); + mBrkAnm1.play(); + + mpMorf->play(NULL, 0, 0); + mpMorf->calc(); + + setRotEye(); + + mAcch.CrrPos(*dComIfG_Bgsp()); + tevStr.mRoomNo = fopAcM_GetRoomNo(this); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + } + + modeProc(PROC_EXEC, MODE_NULL); + + if (mMode != MODE_HIDE) { + setCollision(); + setAnm(); + setMtx(); + + if (l_HIO.m007 != 0) { + mPrmIdx = l_HIO.m00A; + setAnm(); + } + } + + return false; } /* 00003D20-00003E58 .text drawAwa__11daDaiocta_cFv */ void daDaiocta_c::drawAwa() { - /* Nonmatching */ + dComIfGd_setListBG(); + g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); + + for (int i = 0; i < l_HIO.m016; i++) { + g_env_light.setLightTevColorType(mpAwaModels[i], &tevStr); + mAwaBckAnms[i].entry(mpAwaModels[i]->getModelData()); + mAwaBtkAnms[i].entry(mpAwaModels[i]->getModelData()); + mAwaBrkAnms[i].entry(mpAwaModels[i]->getModelData()); + mDoExt_modelUpdateDL(mpAwaModels[i]); + } + + dComIfGd_setList(); } /* 00003E58-00003F4C .text drawSuikomi__11daDaiocta_cFv */ void daDaiocta_c::drawSuikomi() { - /* Nonmatching */ + dComIfGd_setListBG(); + g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpSuikomiModel, &tevStr); + mBtkAnm.entry(mpSuikomiModel->getModelData()); + mBrkAnm2.entry(mpSuikomiModel->getModelData()); + mDoExt_modelUpdateDL(mpSuikomiModel); + mBtkAnm.remove(mpSuikomiModel->getModelData()); + mBrkAnm2.remove(mpSuikomiModel->getModelData()); + dComIfGd_setList(); } /* 00003F4C-0000412C .text drawDebug__11daDaiocta_cFv */ void daDaiocta_c::drawDebug() { - /* Nonmatching */ + GXColor dummy_1 = { 0x00, 0xFF, 0x00, 0x80 }; + GXColor dummy_2 = { 0xFF, 0xFF, 0x00, 0x80 }; + GXColor dummy_3 = { 0xFF, 0xFF, 0x00, 0x80 }; + GXColor dummy_4 = { 0x00, 0xFF, 0xFF, 0x80 }; + GXColor dummy_5 = { 0xFF, 0x00, 0x00, 0x80 }; + GXColor dummy_6 = { 0x00, 0xFF, 0x00, 0x80 }; + GXColor dummy_7 = { 0xFF, 0x00, 0x00, 0x80 }; + GXColor dummy_8 = { 0xFF, 0x00, 0x00, 0x80 }; + + fopAc_ac_c* player_p; + for (int i = 0; i < ARRAY_SSIZE(mSphCenters); i++) { + player_p = dComIfGp_getPlayer(0); + f32 fVar1 = (player_p->current.pos - mSphCenters[i]).abs(); + } + cXyz sp30 = current.pos; + sp30.y = 50.0f + mWaterY; + + u32 uVar1 = l_HIO.m012; + if (uVar1 - 0x70000 != 0xFFFF || l_HIO.m012 != 0) { + u32 uVar2 = shape_angle.y + l_HIO.m014; + s16 sVar1 = shape_angle.y + l_HIO.m014 + uVar1; + + cXyz sp24 = current.pos; + sp24.z += l_HIO.m084 * cM_scos(sVar1); + sp24.x += l_HIO.m084 * cM_ssin(sVar1); + + cXyz sp18 = current.pos; + sp18.z += l_HIO.m084 * cM_scos(uVar2 - uVar1); + sp18.x += l_HIO.m084 * cM_ssin(uVar2 - uVar1); + } } /* 0000412C-00004244 .text _draw__11daDaiocta_cFv */ bool daDaiocta_c::_draw() { - /* Nonmatching */ + if (l_HIO.m004) { + drawDebug(); + } + + if (mMode == MODE_HIDE) { + return true; + } + + if (mMode == MODE_DEMO) { + drawSuikomi(); + } + + if (mMode == MODE_DELETE) { + drawAwa(); + } + + J3DModel* morf_model_p = mpMorf->getModel(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr); + mBrkAnm1.entry(morf_model_p->getModelData()); + + if (l_HIO.m005 == 0) { + mpMorf->entryDL(); + } + + mBrkAnm1.remove(morf_model_p->getModelData()); + + dSnap_RegistFig(DSNAP_TYPE_UNKC6, this, 1.0f, 1.0f, 1.0f); + + return true; } /* 00004244-00004364 .text getArg__11daDaiocta_cFv */ void daDaiocta_c::getArg() { - /* Nonmatching */ + u8 appear_radius_multiplier; + s16 prm2; + u32 prm; + + prm = fopAcM_GetParam(this); + prm2 = home.angle.z; + + mOctoType = prm; + appear_radius_multiplier = prm >> 8; + m575 = prm >> 16; + mSwitchNo = prm >> 24; + m057C = prm2; + + home.angle.z = 0; + current.angle.z = 0; + shape_angle.z = 0; + + if (appear_radius_multiplier == 0xFF) { + mAppearRadius = l_HIO.mDefaultAppearRadius; + } else { + mAppearRadius = f32(appear_radius_multiplier) * 100.0f; + } + + if (mOctoType > 3) { + mOctoType = 0; + } + + switch (mOctoType) { + case FOUR_EYED: + mEyeAlloc[0] = true; + mEyeAlloc[1] = true; + mEyeAlloc[2] = true; + mEyeAlloc[5] = true; + break; + case EIGHT_EYED: + for (int i = 0; i < 8; i++) { + mEyeAlloc[i] = true; + } + break; + case TWELVE_EYED: + for (int i = 0; i < ARRAY_SSIZE(mEyeAlloc); i++) { + mEyeAlloc[i] = true; + } + break; + } } /* 00004364-00004660 .text createInit__11daDaiocta_cFv */ void daDaiocta_c::createInit() { - /* Nonmatching */ + m220C = current.pos; + initAwa(); + modeProc(PROC_INIT, MODE_HIDE); + initMtx(); + attention_info.flags = 0; + shape_angle = current.angle; + + mAnmMtxIndices[0] = 21; + mAnmMtxIndices[1] = 22; + mAnmMtxIndices[2] = 15; + mAnmMtxIndices[3] = 23; + mAnmMtxIndices[4] = 24; + mAnmMtxIndices[5] = 16; + mAnmMtxIndices[6] = 17; + mAnmMtxIndices[7] = 18; + mAnmMtxIndices[8] = 14; + mAnmMtxIndices[9] = 11; + mAnmMtxIndices[10] = 12; + mAnmMtxIndices[11] = 13; + + static const int NUM_JOINT_NODES = 37; + for (int i = 0; i < NUM_JOINT_NODES; i++) { + mpMorf->getModel() + ->getModelData() + ->getJointNodePointer(i) + ->setCallBack(nodeControl_CB); + } + + mAcchCir.SetWall(30.0f, 30.0f); + mAcch.Set( + fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, 1, &mAcchCir, + fopAcM_GetSpeed_p(this) + ); + mAcch.SetWallNone(); + mAcch.SetRoofNone(); + mAcch.OnSeaCheckOn(); + mAcch.OnSeaWaterHeight(); + + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + + fopAcM_setCullSizeBox( + this, + -2300.0f, -500.0f, -2300.0f, + 2300.0f, 2300.0f, 2300.0f + ); + + fopAcM_setCullSizeFar(this, 10.0f); + + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (mEyeAlloc[i] == true) { + mDaioctaEyePcId[i] = fopAcM_createChild( + PROC_DAIOCTA_EYE, fpcM_GetID(this), + -1, ¤t.pos, + tevStr.mRoomNo, NULL + ); + } + } + +#if VERSION > VERSION_JPN + mpAuzu = fopAcM_create( + PROC_Obj_Auzu, + 0x1100FF, + ¤t.pos, + tevStr.mRoomNo + ); +#endif + mStts.Init(0, 0, this); + + for (int i = 0; i < ARRAY_SSIZE(mSph); i++) { + mSph[i].Set(m_sph_src); + mSph[i].SetStts(&mStts); + mSph[i].SetCoHitCallback(coHit_CB); + } + + for (int i = 0; i < ARRAY_SSIZE(mCps); i++) { + mCps[i].Set(m_cps_src); + mCps[i].SetStts(&mStts); + mCps[i].SetCoHitCallback(coHit_CB); + } + + mPrmIdx = 1; } /* 00004660-00004918 .text _create__11daDaiocta_cFv */ cPhs_State daDaiocta_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daDaiocta_c); + cPhs_State state = dComIfG_resLoad(&mPhs, m_arc_name); + + if (state == cPhs_COMPLEATE_e) { + getArg(); + + if (mSwitchNo != 0xFF && dComIfGs_isSwitch(mSwitchNo, fopAcM_GetRoomNo(this))) { + return cPhs_ERROR_e; + } + + if (!fopAcM_entrySolidHeap(this, createHeap_CB, m_heapsize)) { + return cPhs_ERROR_e; + } + + createInit(); + } + + return state; } /* 00005098-0000513C .text _delete__11daDaiocta_cFv */ bool daDaiocta_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, m_arc_name); +#if VERSION > VERSION_DEMO + mParticleCallback.remove(); +#endif + fopAc_ac_c* actor_p; + for (int i = 0; i < ARRAY_SSIZE(mDaioctaEyePcId); i++) { + if (fopAcM_SearchByID(mDaioctaEyePcId[i], &actor_p)) { + fopAcM_delete(actor_p); + } + } + +#if VERSION > VERSION_DEMO + mDoAud_seDeleteObject(&m2434); +#endif + return true; } /* 0000513C-0000515C .text daDaioctaCreate__FPv */ diff --git a/src/d/actor/d_a_daiocta_eye.cpp b/src/d/actor/d_a_daiocta_eye.cpp index 2b64da667..1b6ff7cb6 100644 --- a/src/d/actor/d_a_daiocta_eye.cpp +++ b/src/d/actor/d_a_daiocta_eye.cpp @@ -5,9 +5,19 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_daiocta_eye.h" +#include "d/actor/d_a_daiocta.h" +#include "d/actor/d_a_bomb.h" +#include "d/actor/d_a_player.h" +#include "d/d_bg_s_func.h" #include "d/d_cc_d.h" +#include "d/d_lib.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_daiocta.h" + +const s32 daDaiocta_Eye_c::m_heapsize = 2848; +const char daDaiocta_Eye_c::m_arc_name[] = "daiocta"; +const s32 daDaiocta_Eye_c::m_scale_damage_time = 8; static dCcD_SrcSph l_sph_src = { // dCcD_SrcGObjInf @@ -38,110 +48,443 @@ static dCcD_SrcSph l_sph_src = { }}, }; +static daDaiocta_Eye_HIO_c l_HIO; /* 000000EC-000001B0 .text __ct__19daDaiocta_Eye_HIO_cFv */ daDaiocta_Eye_HIO_c::daDaiocta_Eye_HIO_c() { - /* Nonmatching */ + mSphRadius = 195.0f; + m04 = 0xF; // unused + m08 = 5.0f; // unused + m0C = 8.0f; // unused + mParticleTranslationX = 0.0f; + mParticleTranslationY = 0.0f; + mParticleTranslationZ = 30.0f; + mEyeRotStep = 0x1000; + mEyeRotScale = 0x4; + m24 = 0x4000; + m26 = 0x1000; + m28 = 0x1000; + mEyeRndRotMaxX = 0x7FFF; + mEyeRndRotMaxY = 0x2000; + mEyeRndRotMaxZ = 0x2000; } /* 000001B0-000001FC .text nodeControl_CB__FP7J3DNodei */ -static BOOL nodeControl_CB(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeControl_CB(J3DNode* i_nodeP, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model_p = j3dSys.getModel(); + daDaiocta_Eye_c* this_p = (daDaiocta_Eye_c *) model_p->getUserArea(); + if (this_p) { + this_p->_nodeControl(i_nodeP, model_p); + } + } + return TRUE; } /* 000001FC-000002B8 .text _nodeControl__15daDaiocta_Eye_cFP7J3DNodeP8J3DModel */ -void daDaiocta_Eye_c::_nodeControl(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daDaiocta_Eye_c::_nodeControl(J3DNode* i_nodeP, J3DModel* i_modelP) { + J3DJoint* jnt_p = (J3DJoint *) i_nodeP; + s32 jnt_no = jnt_p->getJntNo(); + cXyz dummy(0.0f, 0.0f, 0.0f); + mDoMtx_stack_c::copy(i_modelP->getAnmMtx(jnt_no)); + + if (jnt_no == 2) { + mDoMtx_stack_c::ZXYrotM(mCurEyeRot); + mDoMtx_stack_c::scaleM(mEyeScale); + } + + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + i_modelP->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 000002B8-000002D8 .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* i_this) { + return ((daDaiocta_Eye_c *)i_this)->_createHeap(); } /* 000002D8-000004E4 .text _createHeap__15daDaiocta_Eye_cFv */ -void daDaiocta_Eye_c::_createHeap() { - /* Nonmatching */ +BOOL daDaiocta_Eye_c::_createHeap() { + static Vec eye_sph_offset[] = { + { 0.0f, 0.0f, 0.0f }, + }; + + static __jnt_hit_data_c search_data[] = { + { + /* mShapeType */ JntHitType_SPH_e, + /* mJointIndex */ 2, + /* mRadius */ 110.0f, + /* mpOffsets */ eye_sph_offset + } + }; + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BDL_DO_EYE1)); + JUT_ASSERT(0xE9, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000222); + + if (!mpModel) { + return FALSE; + } + + mpModel->setUserArea((u32)this); + + mpBrk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BRK_DAMAGE_EYE_A1)); + + if (!mpBrk) { + return FALSE; + } + + int init_result = init_result = mBrkAnm.init( + modelData, mpBrk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, false, FALSE + ); + + if (init_result == 0) { + return FALSE; + } + + mpBtk = static_cast(dComIfG_getObjectRes(m_arc_name, DAIOCTA_BTK_DAMAGE_EYE_A1)); + + if (!mpBtk) { + return FALSE; + } + + init_result = mBtkAnm.init( + modelData, mpBtk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, false, FALSE + ); + + if (init_result == 0) { + return FALSE; + } + + for (int i = 0; i < 3; i++) { + if (i == 2) modelData->getJointNodePointer(i)->setCallBack(nodeControl_CB); + } + + mpJntHit = JntHit_create(mpModel, search_data, ARRAY_SSIZE(search_data)); + + if (mpJntHit) { + jntHit = mpJntHit; + } else { + return FALSE; + } + + return TRUE; } /* 000004E4-00000510 .text coHit_CB__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void coHit_CB(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void coHit_CB(fopAc_ac_c* i_this, dCcD_GObjInf*, fopAc_ac_c* i_actor, dCcD_GObjInf*) { + if(i_actor) { + ((daDaiocta_Eye_c *)i_this)->_coHit(i_actor); + } } /* 00000510-000005D0 .text _coHit__15daDaiocta_Eye_cFP10fopAc_ac_c */ -void daDaiocta_Eye_c::_coHit(fopAc_ac_c*) { - /* Nonmatching */ +void daDaiocta_Eye_c::_coHit(fopAc_ac_c* i_actor) { + if (fpcM_GetName(i_actor) == PROC_BOMB) { + daBomb_c* bomb_p = (daBomb_c *) i_actor; + if (bomb_p->chk_state(daBomb_c::STATE_4)) { + if (!mbIsDead) { + health = 0; + mbIsDead = true; + m295 = true; + dComIfGp_particle_set( + dPa_name::ID_SCENE_8206, &mParticlePos, &shape_angle, + NULL, 0xFF, &mParticleCallback, fopAcM_GetRoomNo(this) + ); + modeDeathInit(); + } else { + mbIsDamagedBomb = true; + } + } + } } /* 000005D0-000006C0 .text setMtx__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::setMtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM( + l_HIO.mParticleTranslationX, + l_HIO.mParticleTranslationY, + l_HIO.mParticleTranslationZ + ); + mDoMtx_stack_c::multVecZero(&mParticlePos); } /* 000006C0-00000A6C .text checkTgHit__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::checkTgHit() { - /* Nonmatching */ + mStts.Move(); + cCcD_Obj* tg_hit_obj_p = mSph.GetTgHitObj(); + if (tg_hit_obj_p) { + mDoAud_onEnemyDamage(); + bool damaged = false; + + if (tg_hit_obj_p->ChkAtType(AT_TYPE_NORMAL_ARROW)) { + fopAcM_seStart(this, JA_SE_LK_MS_WEP_HIT, 32); + health -= 2; + damaged = true; + } else if (tg_hit_obj_p->ChkAtType(AT_TYPE_ICE_ARROW)) { + fopAcM_seStart(this, JA_SE_LK_MS_WEP_HIT, 32); + health -= 2; + damaged = true; + } else if (tg_hit_obj_p->ChkAtType(AT_TYPE_FIRE_ARROW)) { + fopAcM_seStart(this, JA_SE_LK_MS_WEP_HIT, 32); + health -= 2; + damaged = true; + } else if (tg_hit_obj_p->ChkAtType(AT_TYPE_LIGHT_ARROW)) { + fopAcM_seStart(this, JA_SE_LK_MS_WEP_HIT, 32); + health -= 4; + damaged = true; + } else if (tg_hit_obj_p->ChkAtType(AT_TYPE_HOOKSHOT)) { + fopAcM_seStart(this, JA_SE_LK_MS_WEP_HIT, 32); + health -= 2; + damaged = true; + } else if (tg_hit_obj_p->ChkAtType(AT_TYPE_BOOMERANG)) { + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 32); + health--; + damaged = true; + } + + if (damaged == true) { + daPy_py_c* player_p = daPy_getPlayerActorClass(); + cXyz tg_hit_pos = *mSph.GetTgHitPosP(); + dComIfGp_particle_set(dPa_name::ID_COMMON_0010, &tg_hit_pos); + if (health <= 0) { + cXyz hit_particle_scale(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set( + dPa_name::ID_COMMON_BIG_HIT, + &tg_hit_pos, + &player_p->shape_angle, + &hit_particle_scale + ); + fopAcM_seStart(this, JA_SE_LK_LAST_HIT, 0); + health = 0; + modeDeathInit(); + } else { + modeDamageInit(); + } + } + } } /* 00000A6C-00000A78 .text modeWaitInit__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeWaitInit() { - /* Nonmatching */ + mMode = MODE_WAIT; } /* 00000A78-00000A98 .text modeWait__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeWait() { - /* Nonmatching */ + checkTgHit(); } /* 00000A98-00000BD8 .text modeDamageInit__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeDamageInit() { - /* Nonmatching */ + mMode = MODE_DAMAGE; + mScaleAnimeIdx = m_scale_damage_time; + mbIsDamaged = true; + + J3DModelData* model_data_p = mpModel->getModelData(); + mpBrk = (J3DAnmTevRegKey *) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BRK_DAMAGE_EYE_A1); + mBrkAnm.init( + model_data_p, mpBrk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); + mpBtk = (J3DAnmTextureSRTKey *) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BTK_DAMAGE_EYE_A1); + mBtkAnm.init( + model_data_p, mpBtk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); + + fopAcM_monsSeStart(mpParentActor, JA_SE_CV_DO_DAMAGE, 0); } /* 00000BD8-00000CD0 .text modeDamage__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeDamage() { - /* Nonmatching */ + static float scale_table[] = { + 1.0f, 0.975f, + 1.0f, 0.95f, + 1.0f, 0.9f, + 1.0f, 0.85f + }; + + dLib_scaleAnime( + &mEyeScale.x, scale_table, + ARRAY_SSIZE(scale_table), &mScaleAnimeIdx, + 0.2f, 10.0f, 0.025f + ); + mEyeScale.y = mEyeScale.x; + mEyeScale.z = mEyeScale.x; + + if (mBtkAnm.isStop() && mBrkAnm.isStop() && mScaleAnimeIdx == 0) { + modeWaitInit(); + } else if (mScaleAnimeIdx == 0) { + mScaleAnimeIdx = m_scale_damage_time; + } } /* 00000CD0-00000E20 .text modeDeathInit__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeDeathInit() { - /* Nonmatching */ + mMode = MODE_DEATH; + mbIsDamaged = true; + mEyeScale.setall(1.0f); + mpBrk = (J3DAnmTevRegKey *) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BRK_DAMAGE_EYE_B1); + mBrkAnm.init( + mpModel->getModelData(), mpBrk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); + mpBtk = (J3DAnmTextureSRTKey *) dComIfG_getObjectRes(m_arc_name, DAIOCTA_BTK_DAMAGE_EYE_B1); + mBtkAnm.init( + mpModel->getModelData(), mpBtk, TRUE, + J3DFrameCtrl::EMode_NONE, 1.0f, + 0, -1, true, FALSE + ); + fopAcM_monsSeStart(mpParentActor, JA_SE_CV_DO_EYE_LOSE, 0); } /* 00000E20-00000E2C .text modeDeath__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeDeath() { - /* Nonmatching */ + mbIsDead = true; } /* 00000E2C-00000ED0 .text modeProcCall__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::modeProcCall() { - /* Nonmatching */ + static ModeProcFunc mode_proc[] = { + &daDaiocta_Eye_c::modeWait, + &daDaiocta_Eye_c::modeDamage, + &daDaiocta_Eye_c::modeDeath, + }; + (this->*mode_proc[mMode])(); } /* 00000ED0-00001120 .text _execute__15daDaiocta_Eye_cFv */ bool daDaiocta_Eye_c::_execute() { - /* Nonmatching */ + if (!mbAppear) { + return false; + } + + if (mbIsDead == true) { + mSph.OffTgSPrmBit(cCcD_TgSPrm_Set_e); + } + + m2EC = l_HIO.m24; + m2EE = l_HIO.m26; + m2F0 = l_HIO.m28; + mEyeRndRotMaxX = l_HIO.mEyeRndRotMaxX; + mEyeRndRotMaxY = l_HIO.mEyeRndRotMaxY; + mEyeRndRotMaxZ = l_HIO.mEyeRndRotMaxZ; + + mBrkAnm.play(); + mBtkAnm.play(); + + mbIsDamaged = false; + mbIsDamagedBomb = false; + modeProcCall(); + setMtx(); + + attention_info.position = current.pos; + + attention_info.position.y += 100.0f; + + eyePos = current.pos; + + cLib_addCalcAngleS2(&mCurEyeRot.x, mEyeRotTargetX, l_HIO.mEyeRotScale + 1, l_HIO.mEyeRotStep); + cLib_addCalcAngleS2(&mCurEyeRot.y, mEyeRotTargetY, l_HIO.mEyeRotScale + 1, l_HIO.mEyeRotStep); + cLib_addCalcAngleS2(&mCurEyeRot.z, mEyeRotTargetZ, l_HIO.mEyeRotScale + 1, l_HIO.mEyeRotStep); + mSph.SetR(l_HIO.mSphRadius); + mSph.SetC(current.pos); + dComIfG_Ccsp()->Set(&mSph); + + m498.set(0, shape_angle.y, 0); + + cXyz current_pos = current.pos; + current_pos.y += 1000.0f; + f32 water_height = dBgS_GetWaterHeight(current_pos); + + if (current.pos.y < water_height) { + if (mParticleCallback.getEmitter()) { + mParticleCallback.end(); + } + } else if (mMode != MODE_DEATH) { + attention_info.flags = fopAc_Attn_LOCKON_BATTLE_e; + attention_info.distances[fopAc_Attn_TYPE_BATTLE_e] = 34; + } + + if (mMode == MODE_DEATH || dComIfGp_event_runCheck()) { + attention_info.flags = 0; + } + + return false; } /* 00001120-000011EC .text _draw__15daDaiocta_Eye_cFv */ bool daDaiocta_Eye_c::_draw() { - /* Nonmatching */ + if (!mbAppear) { + return false; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + mBtkAnm.entry(mpModel->getModelData()); + mBrkAnm.entry(mpModel->getModelData()); + + mDoExt_modelUpdateDL(mpModel); + + mBtkAnm.remove(mpModel->getModelData()); + mBrkAnm.remove(mpModel->getModelData()); + + return true; } /* 000011EC-000012D4 .text createInit__15daDaiocta_Eye_cFv */ void daDaiocta_Eye_c::createInit() { - /* Nonmatching */ + mbAppear = false; + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + mStts.Init(0, 0, this); + mSph.Set(l_sph_src); + mSph.SetStts(&mStts); + mSph.SetCoHitCallback(coHit_CB); + max_health = 4; + health = max_health; + mEyeScale.setall(1.0f); + if (parentActorID != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* parent_p = fopAcM_SearchByID(parentActorID); + if (parent_p && fopAc_IsActor(parent_p) && fpcM_GetName(parent_p) == PROC_DAIOCTA) { + mpParentActor = (daDaiocta_c *) parent_p; + } + } } /* 000012D4-00001450 .text _create__15daDaiocta_Eye_cFv */ cPhs_State daDaiocta_Eye_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daDaiocta_Eye_c); + cPhs_State result = dComIfG_resLoad(&mPhs, m_arc_name); + if (result == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, createHeap_CB, m_heapsize)) { + return cPhs_ERROR_e; + } + createInit(); + } + return result; } /* 00001764-000017B4 .text _delete__15daDaiocta_Eye_cFv */ bool daDaiocta_Eye_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, m_arc_name); + mParticleCallback.remove(); + return true; } /* 000017B4-000017D4 .text daDaiocta_EyeCreate__FPv */