diff --git a/config/D44J01/config.yml b/config/D44J01/config.yml index fe2952108..431939631 100644 --- a/config/D44J01/config.yml +++ b/config/D44J01/config.yml @@ -3197,6 +3197,11 @@ extract: binary: assets/l_sightDL__d_a_boomerang.bin header: assets/l_sightDL__d_a_boomerang.h +- symbol: l_matDL$4433 + binary: assets/l_matDL__draw__18daBoomerang_blur_cFv.bin + header: assets/l_matDL__draw__18daBoomerang_blur_cFv.h + rename: l_matDL + - symbol: l_sightDL!.data:0x80383e00 binary: assets/l_sightDL__d_a_player_main.bin header: assets/l_sightDL__d_a_player_main.h diff --git a/config/GZLE01/config.yml b/config/GZLE01/config.yml index ca10e6e4b..9218a8570 100644 --- a/config/GZLE01/config.yml +++ b/config/GZLE01/config.yml @@ -2775,6 +2775,11 @@ extract: binary: assets/l_sightDL__d_a_boomerang.bin header: assets/l_sightDL__d_a_boomerang.h +- symbol: l_matDL$4438 + binary: assets/l_matDL__draw__18daBoomerang_blur_cFv.bin + header: assets/l_matDL__draw__18daBoomerang_blur_cFv.h + rename: l_matDL + - symbol: l_sightDL!.data:0x8038fc80 binary: assets/l_sightDL__d_a_player_main.bin header: assets/l_sightDL__d_a_player_main.h diff --git a/config/GZLJ01/config.yml b/config/GZLJ01/config.yml index c9d38649c..80fb81101 100644 --- a/config/GZLJ01/config.yml +++ b/config/GZLJ01/config.yml @@ -2359,6 +2359,11 @@ extract: binary: assets/l_sightDL__d_a_boomerang.bin header: assets/l_sightDL__d_a_boomerang.h +- symbol: l_matDL$4438 + binary: assets/l_matDL__draw__18daBoomerang_blur_cFv.bin + header: assets/l_matDL__draw__18daBoomerang_blur_cFv.h + rename: l_matDL + - symbol: l_sightDL!.data:0x80383320 binary: assets/l_sightDL__d_a_player_main.bin header: assets/l_sightDL__d_a_player_main.h diff --git a/config/GZLP01/config.yml b/config/GZLP01/config.yml index 32da8e1d2..93e896dfa 100644 --- a/config/GZLP01/config.yml +++ b/config/GZLP01/config.yml @@ -2371,6 +2371,11 @@ extract: binary: assets/l_sightDL__d_a_boomerang.bin header: assets/l_sightDL__d_a_boomerang.h +- symbol: l_matDL$4438 + binary: assets/l_matDL__draw__18daBoomerang_blur_cFv.bin + header: assets/l_matDL__draw__18daBoomerang_blur_cFv.h + rename: l_matDL + - symbol: l_sightDL!.data:0x80396960 binary: assets/l_sightDL__d_a_player_main.bin header: assets/l_sightDL__d_a_player_main.h diff --git a/configure.py b/configure.py index 0026b4910..9ab337657 100755 --- a/configure.py +++ b/configure.py @@ -573,7 +573,7 @@ config.libs = [ Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_bg.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_bomb.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_bomb2.cpp"), - Object(NonMatching, "d/actor/d_a_boomerang.cpp"), + Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_boomerang.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_dai_item.cpp"), Object(NonMatching, "d/actor/d_a_demo00.cpp"), Object(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d/actor/d_a_disappear.cpp"), @@ -1586,15 +1586,15 @@ 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"), ActorRel(NonMatching, "d_a_fallrock_tag"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_fan"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_fganon"), - ActorRel(NonMatching, "d_a_fgmahou"), + ActorRel(MatchingFor("GZLE01"), "d_a_fgmahou"), ActorRel(Matching, "d_a_fire"), ActorRel(NonMatching, "d_a_fm"), ActorRel(NonMatching, "d_a_gm"), @@ -1667,7 +1667,7 @@ config.libs = [ ActorRel(Matching, "d_a_npc_rsh1"), ActorRel(NonMatching, "d_a_npc_sarace"), ActorRel(NonMatching, "d_a_npc_sv"), - ActorRel(NonMatching, "d_a_npc_tc"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_tc"), ActorRel(NonMatching, "d_a_npc_tt"), ActorRel(NonMatching, "d_a_npc_uk"), ActorRel(NonMatching, "d_a_npc_ym1"), @@ -1684,7 +1684,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_ajav"), ActorRel(NonMatching, "d_a_obj_apzl"), ActorRel(NonMatching, "d_a_obj_ashut"), - ActorRel(NonMatching, "d_a_obj_auzu"), + ActorRel(Matching, "d_a_obj_auzu"), ActorRel(NonMatching, "d_a_obj_buoyflag"), ActorRel(Matching, "d_a_obj_buoyrace"), ActorRel(Matching, "d_a_obj_correct"), @@ -1725,7 +1725,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_kanoke"), ActorRel(Matching, "d_a_obj_ladder"), ActorRel(NonMatching, "d_a_obj_light"), - ActorRel(NonMatching, "d_a_obj_mkie"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mkie"), ActorRel(Matching, "d_a_obj_mkiek"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mknjd"), ActorRel(NonMatching, "d_a_obj_mmrr"), diff --git a/include/d/actor/d_a_boomerang.h b/include/d/actor/d_a_boomerang.h index b53aab5ee..a32f8116b 100644 --- a/include/d/actor/d_a_boomerang.h +++ b/include/d/actor/d_a_boomerang.h @@ -3,9 +3,65 @@ #include "f_op/f_op_actor.h" #include "d/d_cc_d.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" +#include "d/d_bg_s_lin_chk.h" +#include "d/d_bg_s_gnd_chk.h" +#include "d/d_drawlist.h" + +#define BOOMERANG_LOCK_MAX 5 + +class daBoomerang_blur_c : public J3DPacket { +public: + virtual ~daBoomerang_blur_c() {} + void initBlur(MtxP, s16); + void copyBlur(MtxP, s16); + virtual void draw(); + + static const s32 SEGMENTS_PER_STEP = 5; + +public: + /* 0x010 */ void* imageData; + /* 0x014 */ s32 numTrailSegments; + /* 0x018 */ cXyz pos; + /* 0x024 */ cXyz trail0_vtxArr0[12 * SEGMENTS_PER_STEP]; + /* 0x2F4 */ cXyz trail0_vtxArr1[12 * SEGMENTS_PER_STEP]; + /* 0x5C4 */ cXyz trail1_vtxArr0[12 * SEGMENTS_PER_STEP]; + /* 0x894 */ cXyz trail1_vtxArr1[12 * SEGMENTS_PER_STEP]; +}; + +class daBoomerang_sightPacket_c : public dDlst_base_c { +public: + virtual ~daBoomerang_sightPacket_c() {} + virtual void draw(); + void setSight(cXyz*, int); + void play(int); + + void initFrame(int n) { mFrameArr[n] = 0; } + void resetSightOn() { mSightOnFlg = 0; } + void setImage(ResTIMG* i_img) { mImage = i_img; } + void setTex(void* data) { mTex = data; } + + static const s32 ANIM_LENGTH = 26; + static const s32 HALF_ANIM_LENGTH = ANIM_LENGTH / 2; + +private: + /* 0x004 */ Mtx mMtxArr[BOOMERANG_LOCK_MAX]; + /* 0x0F4 */ u8 mFrameArr[BOOMERANG_LOCK_MAX]; + /* 0x0F9 */ u8 mScaleArr[BOOMERANG_LOCK_MAX]; + /* 0x100 */ u32 mSightOnFlg; + /* 0x104 */ void* mTex; + /* 0x108 */ ResTIMG* mImage; +}; class daBoomerang_c : public fopAc_ac_c { public: + typedef BOOL (daBoomerang_c::*daBoomerang_c_ProcFunc)(); + + enum Mode { + Mode_Wait = 0x0, + Mode_Throw = 0x1, + }; + void onCancelFlg() { mCancelFlg = true; } daBoomerang_c(); @@ -15,34 +71,49 @@ public: float getFlyMax(); void rockLineCallback(fopAc_ac_c*); void setAimActor(fopAc_ac_c*); - void setLockActor(fopAc_ac_c*, int); + BOOL setLockActor(fopAc_ac_c* i_actor, BOOL doSoundEffect); void resetLockActor(); void setRoomInfo(); void setKeepMatrix(); void setAimPos(); void checkBgHit(cXyz*, cXyz*); - void procWait(); - void procMove(); - void createHeap(); + BOOL procWait(); + BOOL procMove(); + BOOL createHeap(); public: - /* Place member variables here */ - /* 0x290 */ u8 m290[0xF34 - 0x290]; - /* 0xF34 */ bool mCancelFlg; + /* 0x0290 */ J3DModel* mpModel; + /* 0x0294 */ daBoomerang_sightPacket_c mSightPacket; + /* 0x03A0 */ daBoomerang_blur_c mBlur; + /* 0x0F04 */ fpc_ProcID mLockActorIDs[BOOMERANG_LOCK_MAX]; + /* 0x0F18 */ fopAc_ac_c* mLockActors[BOOMERANG_LOCK_MAX]; + /* 0x0F2C */ bool mIsReturning; + /* 0x0F2D */ bool unused_0xF2D; + /* 0x0F2E */ bool mJustHit; + /* 0x0F2F */ bool mCatchAndDelete; + /* 0x0F30 */ u8 unused_0xF30; + /* 0x0F31 */ u8 mLockCnt; + /* 0x0F32 */ u8 mCurLockIdx; + /* 0x0F33 */ bool mThirdPerson; + /* 0x0F34 */ bool mCancelFlg; + /* 0x0F35 */ u8 mInWater; + /* 0x0F36 */ bool mFreeFlyOut; + /* 0x0F38 */ s16 mModelRotZ; + /* 0x0F3A */ s16 mModelRotY; + /* 0x0F3C */ f32 mGroundY; + /* 0x0F40 */ cXyz mTargetPos; + /* 0x0F4C */ dCcD_Stts mStts; + /* 0x0F88 */ dCcD_Cps mCps; + /* 0x10C0 */ dBgS_BoomerangLinChk mLinChk; + /* 0x112C */ dBgS_ObjGndChk mGndChk; + /* 0x1180 */ daBoomerang_c_ProcFunc mProcFunc; }; -class daBoomerang_blur_c { -public: - void initBlur(MtxP, s16); - void copyBlur(MtxP, s16); - void draw(); -}; - -class daBoomerang_sightPacket_c { -public: - void draw(); - void setSight(cXyz*, int); - void play(int); -}; +STATIC_ASSERT(offsetof(daBoomerang_c, mSightPacket) == 0x294); +STATIC_ASSERT(offsetof(daBoomerang_c, mBlur) == 0x3A0); +STATIC_ASSERT(offsetof(daBoomerang_c, mCancelFlg) == 0xF34); +STATIC_ASSERT(offsetof(daBoomerang_c, mStts) == 0xF4C); +STATIC_ASSERT(offsetof(daBoomerang_c, mCps) == 0xF88); +STATIC_ASSERT(sizeof(daBoomerang_c) == 0x118C); #endif /* D_A_BOOMERANG_H */ 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_fgmahou.h b/include/d/actor/d_a_fgmahou.h index 7ba7dd0a9..19c6ba02f 100644 --- a/include/d/actor/d_a_fgmahou.h +++ b/include/d/actor/d_a_fgmahou.h @@ -2,10 +2,36 @@ #define D_A_FGMAHOU_H #include "f_op/f_op_actor.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_particle.h" class fgmahou_class : public fopAc_ac_c { public: - /* Place member variables here */ -}; + /* 0x290 */ u8 field_0x290[0x2AC - 0x290]; + /* 0x2AC */ request_of_phase_process_class mPhs; + /* 0x2B4 */ u8 mOrbNumber; // which of Phantom Ganon's 8 orbs this is + /* 0x2B8 */ mDoExt_McaMorf* mpMorf; + /* 0x2BC */ mDoExt_btkAnm* mpBtk; + /* 0x2C0 */ mDoExt_brkAnm* mpBrk; + /* 0x2C4 */ s16 mAge; + /* 0x2C6 */ s16 mState; + /* 0x2C8 */ cXyz mTargetPos; + /* 0x2D4 */ s16 field_0x2D4; + /* 0x2D6 */ s16 field_0x2D6; + /* 0x2D8 */ s16 field_0x2D8; + /* 0x2DA */ s16 mTimers[2]; + /* 0x2DE */ s16 field_0x2DE; + /* 0x2E0 */ s16 field_0x2E0; + /* 0x2E2 */ s16 field_0x2E2; + /* 0x2E4 */ JPABaseEmitter* mpEmitter; + /* 0x2E8 */ dBgS_AcchCir mCir; + /* 0x328 */ dBgS_ObjAcch mAcch; + /* 0x4EC */ dCcD_Stts mStts; + /* 0x528 */ dCcD_Sph mAtSph; + /* 0x654 */ dCcD_Sph mTgSph; + /* 0x780 */ s8 field_0x780; +}; // Size: 0x784 #endif /* D_A_FGMAHOU_H */ diff --git a/include/d/actor/d_a_npc_tc.h b/include/d/actor/d_a_npc_tc.h index e0ed05f78..0a38706f4 100644 --- a/include/d/actor/d_a_npc_tc.h +++ b/include/d/actor/d_a_npc_tc.h @@ -2,37 +2,144 @@ #define D_A_NPC_TC_H #include "f_op/f_op_actor.h" +#include "d/d_npc.h" +#include "d/d_particle.h" -class daNpc_Tc_c : public fopAc_ac_c { +namespace daObjSmplbg { class Act_c; }; + +class daNpc_Tc_c : public fopNpc_npc_c { public: - void getAttentionBasePos() {} - void getEyePos() {} - void incAttnSetCount() {} - void setAction(int (daNpc_Tc_c::*)(void*), void*) {} - void _searchTower(fopAc_ac_c*); - void initTexPatternAnm(bool); + enum Status { + STATUS_WAIT = 1, + STATUS_SIT = 2, + STATUS_TALK = 3, + STATUS_JUMP = 4, + STATUS_WALK_TO_JAIL = 5, + STATUS_TALK_NEAR_JAIL = 6, + STATUS_WAIT_NEAR_JAIL = 7, + STATUS_WALK_TO_STOOL = 8, + STATUS_SIT_TO_STOOL = 9, + STATUS_DEMO_JUMP = 10, + STATUS_DEMO_RESCUE = 11, + STATUS_DEMO_TALK = 12, + STATUS_PAY_RUPEE = 13, + STATUS_DEMO_PAY_RUPEE = 14, + STATUS_GET_RUPEE = 15, + STATUS_DEMO_GET_RUPEE = 16, + STATUS_MONUMENT_COMPLETE = 17, + STATUS_DEMO_MONUMENT_COMPLETE = 18, + }; + + enum ActionStatus { + ACTION_STARTING = 0, + ACTION_ONGOING = 1, + ACTION_ENDING = -1, + }; + + enum Type { + TYPE_NORMAL2 = 0, + TYPE_RED = 1, + TYPE_WHITE = 2, + TYPE_BLUE = 3, + TYPE_NORMAL = 4, + }; + + enum BckIdx { + BCK_IDX_WAIT01 = 0, + BCK_IDX_WAIT03 = 1, + BCK_IDX_WAIT02 = 2, + BCK_IDX_TALK01 = 3, + BCK_IDX_WALK01 = 4, + BCK_IDX_JAMP_A = 5, + BCK_IDX_JAMP_B = 6, + BCK_IDX_JAMP_C = 7, + BCK_IDX_GUARD = 8, + BCK_IDX_JTBT = 9, + BCK_IDX_HAPPY = 10, + BCK_IDX_DANCE01 = 11, + BCK_IDX_DANCE02 = 12, + BCK_IDX_GET = 13, + BCK_IDX_MAWASU = 14, + BCK_IDX_WAIT04 = 15, + BCK_IDX_TALK02 = 16, + }; + + enum AnmPrmIdx { + ANM_PRM_IDX_NONE = 0, + ANM_PRM_IDX_WAIT01 = 1, + ANM_PRM_IDX_WAIT03 = 2, + ANM_PRM_IDX_WAIT02 = 3, + ANM_PRM_IDX_TALK01 = 4, + ANM_PRM_IDX_WALK01 = 5, + ANM_PRM_IDX_JAMP_A = 6, + ANM_PRM_IDX_JAMP_B = 7, + ANM_PRM_IDX_JAMP_C1 = 8, + ANM_PRM_IDX_JAMP_C2 = 9, + ANM_PRM_IDX_GUARD = 10, + ANM_PRM_IDX_JTBT = 11, + ANM_PRM_IDX_HAPPY = 12, + ANM_PRM_IDX_DANCE01 = 13, + ANM_PRM_IDX_DANCE02 = 14, + ANM_PRM_IDX_GET = 15, + ANM_PRM_IDX_HAPPY2 = 16, // ANM_PRM_IDX_HAPPY gets set to this + ANM_PRM_IDX_DANCE01_TO_TALK01 = 17, + ANM_PRM_IDX_DANCE02_TO_WAIT03 = 18, + ANM_PRM_IDX_MAWASU = 19, + ANM_PRM_IDX_WAIT04 = 20, + ANM_PRM_IDX_TALK02 = 21, + ANM_PRM_IDX_TALK01_WAIT01 = 22, // loops 3x then -> WAIT01 + ANM_PRM_IDX_TALK01_TALK02 = 23, // loops 5x then -> TALK02 + }; + + typedef int (daNpc_Tc_c::*ActionFunc)(void*); + daNpc_Tc_c(); + + cXyz& getAttentionBasePos() { return mAttPos; } + cXyz& getEyePos() { return mEyePos; } + + void incAttnSetCount() { + if (mAttnSetCount != 0xff) { + mAttnSetCount++; + } + } + + BOOL setAction(ActionFunc actionFunc, void* arg) { + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + mActionStatus = ACTION_ENDING; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + mActionStatus = ACTION_STARTING; + (this->*mCurrActionFunc)(arg); + } + return TRUE; + } + + fopAc_ac_c* _searchTower(fopAc_ac_c*); + BOOL initTexPatternAnm(bool); void playTexPatternAnm(); - void smoke_set(float, float, float, float, float); + void smoke_set(f32, f32, f32, f32, f32); void setAnm(); void setTexAnm(); - void chkAttention(cXyz, short); + bool chkAttention(cXyz, s16); void eventOrder(); void checkOrder(); - void existTcMonument(); - void anmAtr(unsigned short); + bool existTcMonument(); + void anmAtr(u16); void stopTower(); void startTower(); - void next_msgStatusBlue(unsigned long*); - void next_msgStatusNormal(unsigned long*); - void next_msgStatus(unsigned long*); - void setFirstMsg(bool*, unsigned long, unsigned long); - void getMsgNormal(); - void getMsgBlue(); - void getMsg(); + u16 next_msgStatusBlue(u32*); + u16 next_msgStatusNormal(u32*); + u16 next_msgStatus(u32*); + u32 setFirstMsg(bool*, u32, u32); + u32 getMsgNormal(); + u32 getMsgBlue(); + u32 getMsg(); void getArg(); void createInit(); - void searchStoolPos(void*, void*); + static void* searchStoolPos(void*, void*); void setAttention(); void calcMove(); void lookBack(); @@ -54,32 +161,37 @@ public: void statusDemoJump(); void statusDemoRescue(); void statusDemoTalk(); - void help_action(void*); - void wait_action(void*); + BOOL help_action(void*); + BOOL wait_action(void*); void calc_sitpos(); void set_mtx(); BOOL _draw(); void setTower(); BOOL _execute(); BOOL _delete(); - void isCreate(); + bool isCreate(); cPhs_State _create(); - void _createHeap(); - void next_msgStatusNormal2(unsigned long*); - void getMsgNormal2(); - void setRupeeSizeMsg(); - void existUnknownCollectMap(); - void analysisCollectMap(); - void existKnownCollectMap(); - void next_msgStatusWhite(unsigned long*); - void getMsgWhite(); - void next_msgStatusRed(unsigned long*); - void setFinishMsg(); - void getMsgRed(); - void checkMonumentFee(unsigned short, unsigned short); - void checkAllMonumentFee(); - void checkAllMonumentPay(); - void checkMonumentPay(unsigned short, unsigned short); + BOOL _createHeap(); + u16 next_msgStatusNormal2(u32*); + u32 getMsgNormal2(); +#if VERSION != VERSION_DEMO + u32 setRupeeSizeMsg(); +#endif + bool existUnknownCollectMap(); + int analysisCollectMap(); + bool existKnownCollectMap(); + u16 next_msgStatusWhite(u32*); + u32 getMsgWhite(); + u16 next_msgStatusRed(u32*); + u32 setFinishMsg(); + u32 getMsgRed(); + bool checkMonumentFee(u16, u16); + bool checkAllMonumentFee(); +#if VERSION == VERSION_DEMO + bool checkOneMonumentGet(); +#endif + int checkAllMonumentPay(); + bool checkMonumentPay(u16, u16); void cutProc(); void cutSitToJumpStart(int); void cutSitToJumpProc(int); @@ -101,15 +213,78 @@ public: void cutPayProc(int); public: - /* Place member variables here */ -}; - -class daNpc_Tc_HIO_c { -public: - daNpc_Tc_HIO_c(); - -public: - /* Place member variables here */ -}; - + /* 0x6C4 */ u8 field_0x6C4[0x6C8 - 0x6C4]; + /* 0x6C8 */ BOOL field_0x6C8; + /* 0x6CC */ u8 mJtbtTimer; + /* 0x6CD */ u8 mTalk01Wait01Timer; + /* 0x6CE */ u8 mTalk01Talk02Timer; + /* 0x6CF */ s8 mStatus; + /* 0x6D0 */ ActionFunc mCurrActionFunc; + /* 0x6DC */ s8 mActionStatus; + /* 0x6DD */ u8 field_0x6DD[0x6E0 - 0x6DD]; + /* 0x6E0 */ cXyz mSmokePos; + /* 0x6EC */ csXyz mSmokeAngle; + /* 0x6F2 */ u8 field_0x6F2[0x6F4 - 0x6F2]; + /* 0x6F4 */ dPa_smokeEcallBack mSmokeCallBack; + /* 0x714 */ dPa_followEcallBack field_0x714; + /* 0x728 */ dPa_followEcallBack field_0x728; + /* 0x73C */ request_of_phase_process_class mPhs; + /* 0x744 */ u32 mShadowId; +#if VERSION == VERSION_DEMO + /* 0x748 */ J3DModel* mpModel; +#endif + /* 0x748 */ J3DAnmTexPattern* m_head_tex_pattern; + /* 0x74C */ mDoExt_btpAnm mBtpAnm; + /* 0x760 */ u8 mBlinkFrame; + /* 0x761 */ u8 field_0x761[0x762 - 0x761]; + /* 0x762 */ s16 mBlinkTimer; + /* 0x764 */ cXyz mEyePos; + /* 0x770 */ cXyz mAttPos; + /* 0x77C */ u8 mAttnSetCount; + /* 0x77D */ u8 field_0x77D[0x780 - 0x77D]; + /* 0x780 */ cXyz mStoolLookPos; + /* 0x78C */ s16 mMaxHeadTurnVelocity; + /* 0x78E */ u8 field_0x78E[0x790 - 0x78E]; + /* 0x790 */ csXyz field_0x790; + /* 0x796 */ u8 field_0x796[0x798 - 0x796]; + /* 0x798 */ s8 field_0x798; + /* 0x799 */ u8 field_0x799[0x79C - 0x799]; + /* 0x79C */ f32 mTargetSpeed; + /* 0x7A0 */ cXyz mStoolPos; + /* 0x7AC */ cXyz mSitPos; + /* 0x7B8 */ cXyz mWalkToStoolPos; + /* 0x7C4 */ cXyz mDeltaPos; + /* 0x7D0 */ u8 field_0x7D0[0x7DC - 0x7D0]; + /* 0x7DC */ cXyz mParticlePos; + /* 0x7E8 */ bool mHasAttention; + /* 0x7E9 */ bool mTalkingNearJail; + /* 0x7EA */ u8 field_0x7EA[0x7F1 - 0x7EA]; + /* 0x7F1 */ bool mHasTalkedNearJail; + /* 0x7F2 */ bool mHasEnteredSitRadius; + /* 0x7F3 */ s8 mJumpLandingTimer; + /* 0x7F4 */ u8 field_0x7F4[0x7F6 - 0x7F4]; + /* 0x7F6 */ s8 mTexPatternNum; + /* 0x7F7 */ s8 mTexPatternNumIdx; + /* 0x7F8 */ s8 mBckIdx; + /* 0x7F9 */ s8 mAnmPrmIdx; + /* 0x7FA */ s8 mOldAnmPrmIdx; + /* 0x7FB */ s8 mEventIdx; + /* 0x7FC */ u8 mType; + /* 0x7FD */ u8 field_0x7FD[0x804 - 0x7FD]; + /* 0x804 */ daObjSmplbg::Act_c* m_tower_actor; + /* 0x808 */ bool field_0x808; + /* 0x809 */ bool field_0x809; + /* 0x80A */ u8 field_0x80A[0x80B - 0x80A]; + /* 0x80B */ bool field_0x80B; + /* 0x80C */ u8 field_0x80C; + /* 0x80D */ bool field_0x80D; + /* 0x80E */ bool field_0x80E; + /* 0x80F */ bool field_0x80F; + /* 0x810 */ bool field_0x810; + /* 0x811 */ bool field_0x811; + /* 0x812 */ bool field_0x812; + /* 0x813 */ bool field_0x813; + /* 0x814 */ bool field_0x814; + /* 0x815 */ u8 field_0x815[0x81C - 0x815]; +}; // Size: 0x81C #endif /* D_A_NPC_TC_H */ diff --git a/include/d/actor/d_a_obj_auzu.h b/include/d/actor/d_a_obj_auzu.h index a9807e0e0..e32cc5d03 100644 --- a/include/d/actor/d_a_obj_auzu.h +++ b/include/d/actor/d_a_obj_auzu.h @@ -1,40 +1,79 @@ #ifndef D_A_OBJ_AUZU_H #define D_A_OBJ_AUZU_H +#include "d/d_a_obj.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" class J3DMaterial; namespace daObjAuzu { + struct Attr_c { + /* 0x00 */ f32 mRadiusMult; + /* 0x04 */ f32 mOuterActivationMult; + /* 0x08 */ f32 mInnerActivationMult; + /* 0x0C */ f32 mAnmSpeed; + }; + class Act_c : public fopAc_ac_c { public: - void attr() const {} - void is_appear() const {} - 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() {} + enum Prm_e { + PRM_APPEAR_W = 0x1, + PRM_APPEAR_S = 0x10, + + PRM_LINK_ID_W = 0x8, + PRM_LINK_ID_S = 0x8, + + PRM_SWSAVE_W = 0x8, + PRM_SWSAVE_S = 0x0, + + PRM_TYPE_W = 0x4, + PRM_TYPE_S = 0x14 + }; + public: + const Attr_c& attr() const { return M_attr[mType]; } + bool is_appear() const { return mScaleAnimFactor > 0.999f; } + s32 prm_get_appear() const { return daObj::PrmAbstract(this, PRM_APPEAR_W, PRM_APPEAR_S); } + s32 prm_get_linkID() const { return daObj::PrmAbstract(this, PRM_LINK_ID_W, PRM_LINK_ID_S); } + s32 prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } + s32 prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W, PRM_TYPE_S); } + static s32 prm_make_squid() { + return + 0x1 << 20 | // type + 0x1 << 16 | // appear + 0x00 << 8 | // linkID + 0xFF << 0; // swSave + } + void to_appear() { mbToAppear = true; } + void to_disappear() { mbToAppear = false; } - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + bool create_heap(); cPhs_State _create(); bool _delete(); - void is_exist() const; + bool is_exist() const; void set_mtx(); void init_mtx(); void set_state_map(); void ship_whirl(); void bgm_start(); bool _execute(); - void set_material(J3DMaterial*, unsigned char); bool _draw(); - + static BOOL solidHeapCB(fopAc_ac_c*); + static void set_material(J3DMaterial*, u8); + static const char M_arcname[]; + static const Attr_c M_attr[2]; public: - /* Place member variables here */ - }; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ mDoExt_btkAnm mBtkAnm; + /* 0x2B0 */ s32 mType; + /* 0x2B4 */ f32 mScaleAnimFactor; + /* 0x2B8 */ bool mbToAppear; + /* 0x2B9 */ bool mbIsExist; + /* 0x2BA */ bool mbBgmStarted; + /* 0x2BB */ /* 1 byte of alignment padding */ + /* 0x2BC */ fpc_ProcID mKytagPcId; + }; // Size: 0x2C0 }; #endif /* D_A_OBJ_AUZU_H */ diff --git a/include/d/actor/d_a_obj_mkie.h b/include/d/actor/d_a_obj_mkie.h index 410b2b2bb..25e7ab247 100644 --- a/include/d/actor/d_a_obj_mkie.h +++ b/include/d/actor/d_a_obj_mkie.h @@ -2,52 +2,93 @@ #define D_A_OBJ_MKIE_H #include "d/d_bg_s_movebg_actor.h" +#include "m_Do/m_Do_ext.h" namespace daObjMkie { - class Act_c : public dBgS_MoveBgActor { - public: - static u32 prm_make(u8 eventId, int swNo) { - return swNo << 0x10 | (eventId | 0x3000); - } - - void setup(const cXyz* pos) { - current.pos = *pos; - mF58 = 1; - } - void attr() const {} - void prm_get_correct() const {} - void prm_get_evId() const {} - void prm_get_swSave() const {} - void prm_get_type() const {} - - virtual BOOL CreateHeap(); - void init_cc(); - void set_cc_pos(); - virtual BOOL Create(); - cPhs_State Mthd_Create(); - virtual BOOL Delete(); - BOOL Mthd_Delete(); - void set_mtx(); - void init_mtx(); - void chk_light(); - void eff_break(); - void sound_melt(); - void sound_break(); - void vib_break(); - void mode_wait(); - void mode_demoWait_init(); - void mode_demoWait(); - void mode_demo_init(); - void mode_demo(); - void mode_proc_call(); - virtual BOOL Execute(Mtx**); - virtual BOOL Draw(); - - public: - /* 0x2C8 */ u8 m2C8[0xF58 - 0x2C8]; - /* 0xF58 */ u8 mF58; - /* 0xF59 */ u8 mF59[0xF64 - 0xF59]; +class Act_c : public dBgS_MoveBgActor { +public: + static Mtx M_tmp_mtx; + static u32 prm_make(u8 eventId, int swNo) { return swNo << 0x10 | (eventId | 0x3000); }; + + void setup(const cXyz* pos) { + current.pos = *pos; + mCcInit = 1; }; -}; + + struct Attr_c { + const char* name; + float mScale; + Vec table[8][3]; + }; + + enum Prm_e { + PRM_CORRECT_W = 0x01, + PRM_CORRECT_S = 0xc, + + PRM_EVID_W = 0x08, + PRM_EVID_S = 0x0, + + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x10, + + PRM_TYPE_W = 0x01, + PRM_TYPE_S = 0x08, + + PRM_FLAG_W = 0x01, + PRM_FLAG_S = 0x0d, + }; + + BOOL prm_get_correct() const { return daObj::PrmAbstract(this, PRM_CORRECT_W, PRM_CORRECT_S); } + u8 prm_get_evId() const { return daObj::PrmAbstract(this, PRM_EVID_W, PRM_EVID_S); } + int prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } + int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W, PRM_TYPE_S); } + + virtual BOOL CreateHeap(); + void init_cc(); + void set_cc_pos(); + virtual BOOL Create(); + cPhs_State Mthd_Create(); + virtual BOOL Delete(); + BOOL Mthd_Delete(); + void set_mtx(); + void init_mtx(); + BOOL chk_light(); + void eff_break(); + void sound_melt(); + void sound_break(); + void vib_break(); + void mode_wait(); + void mode_demoWait_init(); + void mode_demoWait(); + void mode_demo_init(); + void mode_demo(); + void mode_proc_call(); + virtual BOOL Execute(Mtx**); + virtual BOOL Draw(); + + static const char M_arcname[]; + static const dCcD_SrcTri M_tri_src; + static const Attr_c M_attr[]; + +public: + /* 0x2C8 */ request_of_phase_process_class mPhs; + /* 0x2D0 */ J3DModel* mModelBase; + /* 0x2D4 */ J3DModel* mModelVan; + /* 0x2D8 */ mDoExt_brkAnm mBrkVan; + /* 0x2F0 */ dCcD_Tri mTri[8]; + /* 0xD70 */ dCcD_Stts mStts[8]; + /* 0xF50 */ int mModeProc; + /* 0xF54 */ int mType; + /* 0xF58 */ bool mCcInit; + /* 0xF59 */ bool mStatueDelete; + /* 0xF5A */ bool mEvtPlaying; + /* 0xF5B */ bool mBaseAnmPlaying; + /* 0xF5C */ s16 mState; + /* 0xF5E */ s16 mLightCnt; + /* 0xF60 */ s16 mEvtIdx; + /* 0xF62 */ bool mSwitch; + /* 0xF63 */ bool mBroken; +}; // Size: 0xF64 +}; // namespace daObjMkie #endif /* D_A_OBJ_MKIE_H */ diff --git a/include/d/actor/d_a_obj_smplbg.h b/include/d/actor/d_a_obj_smplbg.h index 138e71133..9fee21479 100644 --- a/include/d/actor/d_a_obj_smplbg.h +++ b/include/d/actor/d_a_obj_smplbg.h @@ -33,9 +33,9 @@ namespace daObjSmplbg { static const Attr_c M_attr[]; inline const Attr_c& attr() const { return M_attr[mType]; } - void isStop() {} - void offStop() {} - void onStop() {} + bool isStop() { return mIsStop; } + void offStop() { mIsStop = false; } + void onStop() { mIsStop = true; } int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W , PRM_TYPE_S);} virtual BOOL CreateHeap(); @@ -53,7 +53,7 @@ namespace daObjSmplbg { /* 0x2C8 */ request_of_phase_process_class mPhs; /* 0x2D0 */ J3DModel* mpModel; /* 0x2D4 */ int mType; - /* 0x2D8 */ u8 field_0x2D8; + /* 0x2D8 */ bool mIsStop; /* 0x2D9 */ u8 field_0x2D9[0x2DC - 0x2D9]; }; // Size: 0x2DC }; diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index f7be09693..29ca6c4b6 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -58,6 +58,8 @@ public: } } + cXyz getPos() { return mPos; } + private: /* 0x04 */ bool mDrawFlag; /* 0x05 */ bool mLockFlag; @@ -1276,7 +1278,7 @@ public: void setDamageEmitter(); void endFlameDamageEmitter(); void endDamageEmitter(); - static u32 setItemWaterEffect(fopAc_ac_c*, int, int); + static BOOL setItemWaterEffect(fopAc_ac_c* i_actor, BOOL inWater, BOOL triggerOnExit); fopAc_ac_c* getDemoLookActor(); void setTinkleCeiverModel(); void setTalismanModel(); @@ -1608,7 +1610,7 @@ public: BOOL procRopeUpHang(); BOOL checkBoomerangAnime() const; void throwBoomerang(); - int returnBoomerang(); + BOOL returnBoomerang(); BOOL checkNextActionBoomerangReady(); void checkNextActionBoomerangFly(); BOOL checkNextBoomerangMode(); @@ -1846,8 +1848,8 @@ public: BOOL checkNoControll() const { return dComIfGp_getPlayer(0) != this; } void exchangeGrabActor(fopAc_ac_c* actor) { mActorKeepGrab.setData(actor); } void getDekuLeafWindPos() const {} - void getBoomerangCatchPos() const {} - void getLineTopPos() {} + cXyz getBoomerangCatchPos() const { return mBoomerangCatchPos; } + cXyz getLineTopPos() { return mSightPacket.getPos(); } cXyz getHookshotRootPos() const { return mHookshotRootPos; } void getIceParticleBtk() {} void getIceWaterParticleBtk() {} @@ -2294,7 +2296,7 @@ public: /* 0x36D0 */ cXyz m36D0; /* 0x36DC */ cXyz m36DC; /* 0x36E8 */ cXyz mHookshotRootPos; - /* 0x36F4 */ cXyz m36F4; + /* 0x36F4 */ cXyz mBoomerangCatchPos; /* 0x3700 */ cXyz m3700; /* 0x370C */ cXyz m370C; /* 0x3718 */ cXyz m3718; diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index 596fbb999..47d5651c4 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -186,8 +186,16 @@ public: void onShortHitFlg() { onStateFlg(daSFLG_UNK20_e); } void onStateFlg(daSHIP_SFLG flag) { mStateFlag |= flag; } void onTornadoFlg(u32 tornadoID) { mTornadoID = tornadoID; } - void onWhirlFlg(u32, s16) {} - void onWhirlFlgDirect(u32, s16) {} + void onWhirlFlg(u32 whirlID, s16 linkID) { + mWhirlID = whirlID; + m03B2 = linkID; + m0352 = 1; + } + void onWhirlFlgDirect(u32 whirlID, s16 linkID) { + mWhirlID = whirlID; + m03B2 = linkID; + m0352 = 0; + } void setAtnPos(const cXyz* pPos) { onStateFlg(daSFLG_UNK1000000_e); m1068 = *pPos; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 7209c51c6..69f2e1f8f 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1108,6 +1108,10 @@ inline BOOL dComIfGs_isCollectMapTriforce(int i_no) { return g_dComIfG_gameInfo.save.getPlayer().getMap().isTriforce(i_no - 1); } +inline void dComIfGs_onCollectMapTriforce(int i_no) { + g_dComIfG_gameInfo.save.getPlayer().getMap().onTriforce(i_no -1); +} + inline void dComIfGs_offCollectMapTriforce(int i_no) { g_dComIfG_gameInfo.save.getPlayer().getMap().offTriforce(i_no - 1); } diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 6db4ab716..be3d14419 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -161,6 +161,10 @@ public: return mpEvtStaffName; } + int getNowCut() { + return mCurActIdx; + } + bool getAttnFlag() { return mbAttention; } @@ -169,6 +173,14 @@ public: mbAttention = flag; } + void setAttnNoTurnFlag(bool flag) { + mbNoTurn = flag; + } + + f32 getMoveSpeed() { + return mSpeed; + } + cXyz getAttnPos() { return mPos; } diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 340fa1341..5f677ad68 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -126,10 +126,10 @@ enum { /* 0x76 */ DSNAP_TYPE_UNK76, /* 0x77 */ DSNAP_TYPE_UNK77, /* 0x78 */ DSNAP_TYPE_UNK78, - /* 0x79 */ DSNAP_TYPE_UNK79, - /* 0x7A */ DSNAP_TYPE_UNK7A, - /* 0x7B */ DSNAP_TYPE_UNK7B, - /* 0x7C */ DSNAP_TYPE_UNK7C, + /* 0x79 */ DSNAP_TYPE_TC_NORMAL, + /* 0x7A */ DSNAP_TYPE_TC_RED, + /* 0x7B */ DSNAP_TYPE_TC_BLUE, + /* 0x7C */ DSNAP_TYPE_TC_WHITE, /* 0x7D */ DSNAP_TYPE_UNK7D, /* 0x7E */ DSNAP_TYPE_ROTEN, /* 0x7F */ DSNAP_TYPE_UNK7F, diff --git a/include/dolphin/gf/GFGeometry.h b/include/dolphin/gf/GFGeometry.h index 32d68cace..416942dca 100644 --- a/include/dolphin/gf/GFGeometry.h +++ b/include/dolphin/gf/GFGeometry.h @@ -8,4 +8,30 @@ void GFSetVtxAttrFmtv(GXVtxFmt, GXVtxAttrFmtList*); void GFSetArray(GXAttr, void*, u8); void GFSetCullMode(GXCullMode); +inline void GFBegin(GXPrimitive type, GXVtxFmt fmt, u16 vert_num) { + GXFIFO.u8 = fmt | type; + GXFIFO.u16 = vert_num; +} + +inline void GFEnd() {} + +inline void GFWrite_f32(f32 f) { + GX_WRITE_U32(*reinterpret_cast(&f)); +} + +inline void GFWrite_s16(s16 s) { + GXFIFO.s16 = s; +} + +inline void GFPosition3f32(f32 x, f32 y, f32 z) { + GFWrite_f32(x); + GFWrite_f32(y); + GFWrite_f32(z); +} + +inline void GFTexCoord2s16(s16 u, s16 v) { + GFWrite_s16(u); + GFWrite_s16(v); +} + #endif /* GFGEOMETRY_H */ diff --git a/include/f_pc/f_pc_manager.h b/include/f_pc/f_pc_manager.h index 5bbcdf60e..8c5e61060 100644 --- a/include/f_pc/f_pc_manager.h +++ b/include/f_pc/f_pc_manager.h @@ -18,6 +18,9 @@ typedef int (*fpcM_DrawIteraterFunc)(void*, void*); inline fpc_ProcID fpcM_GetID(void* pProc) { return pProc != NULL ? ((base_process_class*)pProc)->mBsPcId : fpcM_ERROR_PROCESS_ID_e; } +inline BOOL fpcM_IsErrorID(fpc_ProcID id) { + return id == fpcM_ERROR_PROCESS_ID_e ? TRUE : FALSE; +} inline s16 fpcM_GetName(void* pProc) { return ((base_process_class*)pProc)->mProcName; } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 012abe0d3..d0e433d55 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -370,7 +370,7 @@ public: void changeAnm(J3DAnmTransform* bckAnm) { mpAnm = bckAnm; } J3DAnmTransform* getAnm() { return mpAnm; } f32 getMorfRatio() { return mCurMorf; } - BOOL isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); } + bool isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); } BOOL isMorf() { return mCurMorf < 1.0f; } private: diff --git a/src/d/actor/d_a_beam.cpp b/src/d/actor/d_a_beam.cpp index 18ca2d9e5..cdc957ee9 100644 --- a/src/d/actor/d_a_beam.cpp +++ b/src/d/actor/d_a_beam.cpp @@ -263,7 +263,7 @@ cPhs_State daBeam_c::CreateInit() { fopAcM_SetMtx(this, M_mdl->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -50.0f, -50.0f, 0.0f, 50.0f, 50.0f, 2000.0f); - if (parentActorID == -1) { + if (parentActorID == fpcM_ERROR_PROCESS_ID_e) { u8 params1 = fopAcM_GetParam(this) & 0xFF; s8 params2 = (fopAcM_GetParam(this) >> 8) & 0xFF; params1 = cLib_maxLimit(params1, 2); diff --git a/src/d/actor/d_a_boomerang.cpp b/src/d/actor/d_a_boomerang.cpp index a012ab5be..26a122bfa 100644 --- a/src/d/actor/d_a_boomerang.cpp +++ b/src/d/actor/d_a_boomerang.cpp @@ -5,13 +5,766 @@ #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_boomerang.h" +#include "d/d_camera.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "d/d_material.h" +#include "d/actor/d_a_player_main.h" +#include "d/res/res_link.h" +#include "dolphin/gf/GF.h" +#include "f_op/f_op_camera.h" +#include "f_op/f_op_camera_mng.h" +#include "m_Do/m_Do_lib.h" + +static cXyz l_blur_top(40.0f, 0.0f, 0.0f); +static cXyz l_blur_root(-40.0f, 0.0f, 0.0f); + +/* 800E0C08-800E0D44 .text initBlur__18daBoomerang_blur_cFPA4_fs */ +void daBoomerang_blur_c::initBlur(MtxP mtx, s16 yRot) { + cMtx_multVec(mtx, &l_blur_top, &trail0_vtxArr0[0]); + cMtx_multVec(mtx, &l_blur_root, &trail0_vtxArr1[0]); + trail0_vtxArr0[1] = trail0_vtxArr0[0]; + trail0_vtxArr1[1] = trail0_vtxArr1[0]; + + numTrailSegments = 0; + + pos.x = mtx[0][3]; + pos.y = mtx[1][3]; + pos.z = mtx[2][3]; + + mDoMtx_stack_c::copy(mtx); + mDoMtx_stack_c::YrotM(-(yRot * 2)); + mDoMtx_stack_c::multVec(&l_blur_top, &trail1_vtxArr0[0]); + mDoMtx_stack_c::multVec(&l_blur_root, &trail1_vtxArr1[0]); + trail1_vtxArr0[1] = trail1_vtxArr0[0]; + trail1_vtxArr1[1] = trail1_vtxArr1[0]; +} + +/* 800E0D44-800E101C .text copyBlur__18daBoomerang_blur_cFPA4_fs */ +void daBoomerang_blur_c::copyBlur(MtxP mtx, s16 yRot) { + for (int i = 54; i >= 0; i--) { + trail0_vtxArr0[SEGMENTS_PER_STEP + i] = trail0_vtxArr0[i]; + trail0_vtxArr1[SEGMENTS_PER_STEP + i] = trail0_vtxArr1[i]; + trail1_vtxArr0[SEGMENTS_PER_STEP + i] = trail1_vtxArr0[i]; + trail1_vtxArr1[SEGMENTS_PER_STEP + i] = trail1_vtxArr1[i]; + } + + float t = 0.0f; + + cXyz inPos; + inPos.x = mtx[0][3]; + inPos.y = mtx[1][3]; + inPos.z = mtx[2][3]; + + cXyz diff = pos - inPos; + + pos = inPos; + + mDoMtx_stack_c::push(); + + s16 yRotPerStep = 0x633; + + int i; + for (i = 0; i < SEGMENTS_PER_STEP; i++) { + mDoMtx_stack_c::multVec(&l_blur_top, &trail0_vtxArr0[i]); + mDoMtx_stack_c::multVec(&l_blur_root, &trail0_vtxArr1[i]); + trail0_vtxArr0[i] += diff * t; + trail0_vtxArr1[i] += diff * t; + t += 1.0f / SEGMENTS_PER_STEP; + mDoMtx_stack_c::YrotM(yRotPerStep); + } + + t = 0.0f; + + mDoMtx_stack_c::pop(); + + mDoMtx_stack_c::YrotM(-(yRot * 2)); + + for (i = 0; i < SEGMENTS_PER_STEP; i++) { + mDoMtx_stack_c::multVec(&l_blur_top, &trail1_vtxArr0[i]); + mDoMtx_stack_c::multVec(&l_blur_root, &trail1_vtxArr1[i]); + trail1_vtxArr0[i] += diff * t; + trail1_vtxArr1[i] += diff * t; + t += 1.0f / SEGMENTS_PER_STEP; + mDoMtx_stack_c::YrotM(-yRotPerStep); + } + + numTrailSegments += SEGMENTS_PER_STEP; + + if (numTrailSegments >= 59) { + numTrailSegments = 58; + } +} + +/* 800E101C-800E13A4 .text draw__18daBoomerang_blur_cFv */ +void daBoomerang_blur_c::draw() { +#include "assets/l_matDL__draw__18daBoomerang_blur_cFv.h" + + static GXVtxDescList l_vtxDescList[] ALIGN_DECL(32) = { + {GX_VA_POS, GX_DIRECT}, + {GX_VA_TEX0, GX_DIRECT}, + {GX_VA_NULL, GX_NONE}, + }; + + static GXVtxAttrFmtList l_vtxAttrFmtList[] ALIGN_DECL(32) = { + {GX_VA_POS, GX_POS_XYZ, GX_F32, 0x00}, + {GX_VA_TEX0, GX_TEX_ST, GX_S16, 0x08}, + {GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00}, + }; + + static GXTexObj texObj; + +#if VERSION > VERSION_JPN + j3dSys.reinitGX(); + GXSetNumIndStages(0); +#endif + + GXInitTexObj(&texObj, imageData, 16, 4, GX_TF_I4, GX_CLAMP, GX_CLAMP, FALSE); + GXInitTexObjLOD(&texObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&texObj, GX_TEXMAP0); + + GXCallDisplayList(l_matDL, 0x80); + + // Light yellow color for the trail. + static GXColor color0 = {0xFF, 0xFF, 0x7B, 0x96}; + GFSetTevColor(GX_TEVREG0, color0); + + const s32 uCoordStep = 0xFF / ((numTrailSegments >> 1) + 1); + s16 uCoord1 = uCoordStep; + s16 uCoord0 = 0; + + GFSetVtxDescv(l_vtxDescList); + GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList); + + GFLoadPosMtxImm(j3dSys.getViewMtx(), GX_PNMTX0); + +#define QUAD_VTX(xyz, u, v) \ + GFPosition3f32((xyz).x, (xyz).y, (xyz).z); \ + GFTexCoord2s16((u), (v)) + + { + GFBegin(GX_QUADS, GX_VTXFMT0, numTrailSegments * 4 + 4); + + for (int i = numTrailSegments; i >= 0; i--) { + QUAD_VTX(trail0_vtxArr0[i], uCoord1, 0x00); + QUAD_VTX(trail0_vtxArr1[i], uCoord1, 0xFF); + QUAD_VTX(trail0_vtxArr1[i + 1], uCoord0, 0xFF); + QUAD_VTX(trail0_vtxArr0[i + 1], uCoord0, 0x00); + + uCoord0 = uCoord1; + uCoord1 += uCoordStep; + } + + GFEnd(); + } + + { + uCoord1 = uCoordStep; + uCoord0 = 0; + + GFBegin(GX_QUADS, GX_VTXFMT0, numTrailSegments * 4 + 4); + + for (int i = numTrailSegments; i >= 0; i--) { + QUAD_VTX(trail1_vtxArr0[i], uCoord1, 0x00); + QUAD_VTX(trail1_vtxArr1[i], uCoord1, 0xFF); + QUAD_VTX(trail1_vtxArr1[i + 1], uCoord0, 0xFF); + QUAD_VTX(trail1_vtxArr0[i + 1], uCoord0, 0x00); + + uCoord0 = uCoord1; + uCoord1 += uCoordStep; + } + + GFEnd(); + } + +#if VERSION > VERSION_JPN + J3DShape::resetVcdVatCache(); +#endif +} #include "assets/l_sightMatDL.h" #include "assets/l_sightDL__d_a_boomerang.h" +/* 800E13A4-800E14F0 .text draw__25daBoomerang_sightPacket_cFv */ +void daBoomerang_sightPacket_c::draw() { + static GXVtxDescList l_vtxDescList[] ALIGN_DECL(32) = { + {GX_VA_POS, GX_DIRECT}, + {GX_VA_TEX0, GX_DIRECT}, + {GX_VA_NULL, GX_NONE}, + }; + + static GXVtxAttrFmtList l_vtxAttrFmtList[] ALIGN_DECL(32) = { + {GX_VA_POS, GX_POS_XYZ, GX_S8, 0x00}, + {GX_VA_TEX0, GX_TEX_ST, GX_U8, 0x00}, + {GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00}, + }; + + GXTexObj texObj; + + const GXBool mipmap = mImage->mipmapCount > 1 ? TRUE : FALSE; + GXInitTexObj(&texObj, mTex, mImage->width, mImage->height, GXTexFmt(mImage->format), GXTexWrapMode(mImage->wrapS), GXTexWrapMode(mImage->wrapT), mipmap); + GXInitTexObjLOD(&texObj, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, FALSE, FALSE, GX_ANISO_1); + GXLoadTexObj(&texObj, GX_TEXMAP0); + + GXCallDisplayList(l_sightMatDL, 0x60); + GFSetVtxDescv(l_vtxDescList); + GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList); + + GXColor color0 = {0xFF, 0xFF, 0x32, 0xFF}; + GXColor color1 = {0xFF, 0xFF, 0x32, 0xFF}; + + for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { + if (mSightOnFlg & (1 << i)) { + color0.a = mScaleArr[i]; + color1.a = mScaleArr[i]; + GFSetTevColor(GX_TEVREG0, color0); + GFSetTevColor(GX_TEVREG1, color1); + GFLoadPosMtxImm(mMtxArr[i], GX_PNMTX0); + GXCallDisplayList(l_sightDL, 0x20); + } + } +} + +/* 800E14F0-800E1718 .text setSight__25daBoomerang_sightPacket_cFP4cXyzi */ +void daBoomerang_sightPacket_c::setSight(cXyz* pPos, int n) { + if (pPos != NULL) { + s32 animFrame = mFrameArr[n]; + f32 pingPongAnim; + f32 imageRot; + if (animFrame < (u32)HALF_ANIM_LENGTH) { + pingPongAnim = 1.0f - animFrame / (f32)HALF_ANIM_LENGTH; + imageRot = -pingPongAnim; + } else { + pingPongAnim = (animFrame - HALF_ANIM_LENGTH) / (f32)HALF_ANIM_LENGTH; + imageRot = pingPongAnim; + } + mScaleArr[n] = pingPongAnim * 30.0f + 150.0f; + + f32 scale = (pingPongAnim * 35.0f + 65.0f) * 0.01f; + f32 scaleX = scale * mImage->width; + f32 scaleY = scale * mImage->height; + + cXyz proj; + mDoLib_project(pPos, &proj); + mDoMtx_stack_c::transS(proj); + mDoMtx_stack_c::scaleM(scaleX, scaleY, scale); + + mDoMtx_stack_c::ZrotM(cM_ssin(imageRot * 16384.0f) * 32768.0f); + MTXCopy(mDoMtx_stack_c::get(), mMtxArr[n]); + + mSightOnFlg |= 1 << n; + } else { + mSightOnFlg &= ~(1 << n); + } +} + +/* 800E1718-800E1754 .text play__25daBoomerang_sightPacket_cFi */ +void daBoomerang_sightPacket_c::play(int n) { + u8* p = &mFrameArr[0]; + for (int i = 0; i < n; i++) { + *p = *p + 1; + if (*p == ANIM_LENGTH) { + *p = 0; + } + p++; + } +} + +/* 800E1754-800E1998 .text draw__13daBoomerang_cFv */ +BOOL daBoomerang_c::draw() { + dComIfGd_setListP1(); + + if (!mThirdPerson && mLockCnt != 0) { + mSightPacket.resetSightOn(); + for (int i = mCurLockIdx; i < mLockCnt; i++) { + fopAc_ac_c* pActor = mLockActors[i]; + if (pActor) { + mSightPacket.setSight(&pActor->eyePos, i); + } else { + mSightPacket.setSight(NULL, i); + } + } + + dComIfGd_set2DXlu(&mSightPacket); + } + + if (mBlur.numTrailSegments > 0) { + dComIfGd_entryZSortXluList(&mBlur, current.pos); + } + + if (daPy_getPlayerActorClass()->checkPlayerNoDraw() && fopAcM_GetParam(this) == Mode_Wait) { + dComIfGd_setList(); + return TRUE; + } + + dKy_getEnvlight().settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + dKy_getEnvlight().setLightTevColorType(mpModel, &tevStr); + + if (fopAcM_GetParam(this) == Mode_Wait && daPy_getPlayerLinkActorClass()->checkFreezeState()) { + dMat_control_c::iceUpdateDL(mpModel, -1, NULL); + } else { + mDoExt_modelUpdateDL(mpModel); + } + + dComIfGd_setList(); + + if (mGroundY != -G_CM3D_F_INF && fopAcM_GetParam(this) == Mode_Throw) { + cXyz* pFloorNrm = dComIfG_Bgsp()->GetTriPla(mGndChk)->GetNP(); + if (pFloorNrm) { + dComIfGd_setSimpleShadow(¤t.pos, mGroundY, 30.0f, pFloorNrm); + } + } + + return TRUE; +} + +/* 800E1998-800E19B8 .text daBoomerang_Draw__FP13daBoomerang_c */ +static BOOL daBoomerang_Draw(daBoomerang_c* i_this) { + return i_this->draw(); +} + +/* 800E19B8-800E1A14 .text getFlyMax__13daBoomerang_cFv */ +float daBoomerang_c::getFlyMax() { + if (dComIfGp_checkPlayerStatus0(0, 0x10000) != 0) { + return 5000.0f; + } + + if (strcmp(dComIfGp_getStartStageName(), "GanonK") != 0) { + return 2500.0f; + } + + return 5000.0f; +} + +/* 800E1A14-800E1AAC .text rockLineCallback__13daBoomerang_cFP10fopAc_ac_c */ +void daBoomerang_c::rockLineCallback(fopAc_ac_c* pHitActor) { + if (fopAcM_GetParam(this) == Mode_Wait) { + if (pHitActor) { + setLockActor(pHitActor, TRUE); + } + } else { + for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { + if (mLockActors[i] == pHitActor) { + mLockActorIDs[i] = -1; + mLockActors[i] = NULL; + if (i == mCurLockIdx) { + mJustHit = true; + mCurLockIdx++; + } + } + } + } +} + +/* 800E1AAC-800E1AD0 .text daBoomerang_rockLineCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ +void daBoomerang_rockLineCallback(fopAc_ac_c* i_actor, dCcD_GObjInf*, fopAc_ac_c* i_hit, dCcD_GObjInf*) { + ((daBoomerang_c*)i_actor)->rockLineCallback(i_hit); +} + +/* 800E1AD0-800E1B20 .text setAimActor__13daBoomerang_cFP10fopAc_ac_c */ +void daBoomerang_c::setAimActor(fopAc_ac_c* i_actor) { + resetLockActor(); + mThirdPerson = true; + setLockActor(i_actor, FALSE); +} + +/* 800E1B20-800E1C20 .text setLockActor__13daBoomerang_cFP10fopAc_ac_ci */ +BOOL daBoomerang_c::setLockActor(fopAc_ac_c* i_actor, BOOL doSoundEffect) { + if (mLockCnt >= BOOMERANG_LOCK_MAX) { + return FALSE; + } + + fpc_ProcID id = fopAcM_GetID(i_actor); + + for (int i = 0; i < mLockCnt; i++) { + if (mLockActorIDs[i] == id) { + return FALSE; + } + } + + mLockActorIDs[mLockCnt] = id; + mLockActors[mLockCnt] = i_actor; + mSightPacket.initFrame(mLockCnt); + + if (doSoundEffect) { + static const u32 se_flg[BOOMERANG_LOCK_MAX] = { + JA_SE_BOOM_LOCK_ON_1, + JA_SE_BOOM_LOCK_ON_2, + JA_SE_BOOM_LOCK_ON_3, + JA_SE_BOOM_LOCK_ON_4, + JA_SE_BOOM_LOCK_ON_5, + }; + + mDoAud_seStart(se_flg[mLockCnt]); + } + + mLockCnt++; + return TRUE; +} + +/* 800E1C20-800E1C58 .text resetLockActor__13daBoomerang_cFv */ +void daBoomerang_c::resetLockActor() { + for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { + mLockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; + mLockActors[i] = NULL; + } + + mLockCnt = 0; + mCurLockIdx = 0; +} + +/* 800E1C58-800E1CFC .text setRoomInfo__13daBoomerang_cFv */ +void daBoomerang_c::setRoomInfo() { + mGndChk.SetPos(¤t.pos); + + f32 groundY = dComIfG_Bgsp()->GroundCross(&mGndChk); + s32 roomNo; + if (groundY != -G_CM3D_F_INF) { + roomNo = dComIfG_Bgsp()->GetRoomId(mGndChk); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mGndChk); + } else { + roomNo = dComIfGp_roomControl_getStayNo(); + } + + tevStr.mRoomNo = roomNo; + mStts.SetRoomId(roomNo); + current.roomNo = roomNo; +} + +/* 800E1CFC-800E1DA8 .text setKeepMatrix__13daBoomerang_cFv */ +void daBoomerang_c::setKeepMatrix() { + // Transform the boomerang to Link's hand. + mDoMtx_stack_c::copy(daPy_getPlayerActorClass()->getLeftHandMatrix()); + mDoMtx_stack_c::transM(10.3f, 36.6f, 1.1f); + mDoMtx_stack_c::XYZrotM(-0x39f4, -0x357, -0x2af3); + MtxP mtx = mDoMtx_stack_c::get(); + mpModel->setBaseTRMtx(mtx); + current.pos.set(mtx[0][3], mtx[1][3], mtx[2][3]); +} + +/* 800E1DA8-800E1E6C .text setAimPos__13daBoomerang_cFv */ +void daBoomerang_c::setAimPos() { + if (mIsReturning) { + mTargetPos = daPy_getPlayerLinkActorClass()->getBoomerangCatchPos(); + } else { + for (int i = mCurLockIdx; i < mLockCnt; i++) { + if (mLockActors[i] != NULL) { + mTargetPos = mLockActors[i]->eyePos; + return; + } + mCurLockIdx++; + } + } +} + +/* 800E1E6C-800E1F94 .text checkBgHit__13daBoomerang_cFP4cXyzP4cXyz */ +void daBoomerang_c::checkBgHit(cXyz* pi_start, cXyz* pi_end) { + mLinChk.Set(pi_start, pi_end, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + current.pos.set(mLinChk.GetCross()); + dComIfGp_particle_setP1(dPa_name::ID_COMMON_PURPLE_HIT, ¤t.pos); + mIsReturning = true; + current.angle.y += 0x8000; + shape_angle.y = current.angle.y; + resetLockActor(); + u32 mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mLinChk); + s8 roomNo = current.roomNo; + s8 reverb = dComIfGp_getReverb(roomNo); + mDoAud_seStart(JA_SE_LK_W_WEP_HIT, &eyePos, mtrlSndId, reverb); + } +} + +/* 800E1F94-800E239C .text procWait__13daBoomerang_cFv */ +BOOL daBoomerang_c::procWait() { + daPy_lk_c* pPlayer = daPy_getPlayerLinkActorClass(); + speedF = 0.0f; + setKeepMatrix(); + + if (mBlur.numTrailSegments > 0) { + mBlur.numTrailSegments -= daBoomerang_blur_c::SEGMENTS_PER_STEP; + } + + if (fopAcM_GetParam(this) == Mode_Throw) { + speedF = 60.0f; + mCps.ResetAtHit(); + mCps.OffAtNoTgHitInfSet(); + mIsReturning = false; + unused_0xF2D = true; + mJustHit = false; + mCurLockIdx = 0; + + setAimPos(); + + if (mCurLockIdx == mLockCnt) { + resetLockActor(); + + s16 angleY = pPlayer->getBodyAngleY() + pPlayer->shape_angle.y; + s16 angleX = pPlayer->getBodyAngleX(); + + f32 flyMax = getFlyMax(); + + mTargetPos.set( + current.pos.x + flyMax * cM_ssin(angleY) * cM_scos(angleX), + current.pos.y - flyMax * cM_ssin(angleX), + current.pos.z + flyMax * cM_scos(angleY) * cM_scos(angleX) + ); + } + + mModelRotY = 0; + + cXyz diff = mTargetPos - current.pos; + + s16 angle = cM_atan2s(-diff.y, diff.absXZ()); + current.angle.x = angle; + if (mLockCnt == 0) { + current.angle.y = cM_atan2s(diff.x, diff.z) + 0x3000; + if (mThirdPerson) { + mFreeFlyOut = false; + } else { + mFreeFlyOut = true; + } + } else { + current.angle.y = cM_atan2s(diff.x, diff.z); + mFreeFlyOut = false; + } + + shape_angle.x = current.angle.x; + shape_angle.y = current.angle.y; + shape_angle.z = 0x2000; + mModelRotZ = 0x2000; + + mProcFunc = &daBoomerang_c::procMove; + + mCancelFlg = false; + + mBlur.initBlur(mpModel->getBaseTRMtx(), mModelRotY); + + cXyz bgHitPos(pPlayer->current.pos.x, pPlayer->current.pos.y + 60.0f, pPlayer->current.pos.z); + checkBgHit(&bgHitPos, ¤t.pos); + + procMove(); + } else { + if (dCam_getBody()->mCurMode != 0xB) { + resetLockActor(); + } else { + bool isAiming = (pPlayer->mCurProc == daPy_lk_c::daPyProc_BOOMERANG_SUBJECT_e || pPlayer->mCurProc == daPy_lk_c::daPyProc_SHIP_BOOMERANG_e) && + pPlayer->mSightPacket.getDrawFlg(); + + if (isAiming) { + camera_class* pCamera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + cXyz eyePos = *fopCamM_GetEye_p(pCamera); + cXyz topPos = pPlayer->getLineTopPos(); + mCps.OnAtNoTgHitInfSet(); + mCps.cM3dGCps::Set(eyePos, topPos, 3.0f); + + mCps.CalcAtVec(); + mCps.SetAtHitCallback(&daBoomerang_rockLineCallback); + + dComIfG_Ccsp()->Set(&mCps); + } + } + } + + return TRUE; +} + +/* 800E239C-800E2AF4 .text procMove__13daBoomerang_cFv */ +BOOL daBoomerang_c::procMove() { + static cXyz at_offset; // Never used. + + if (mCatchAndDelete) { + fopAcM_delete(this); + return TRUE; + } + + if (dComIfGp_event_getMode() == dEvtMode_NONE_e) { + daPy_lk_c* pPlayer = daPy_getPlayerLinkActorClass(); + s16 s = mModelRotY; + mModelRotY -= 0x1F00; + if (s >= 0 && mModelRotY < 0) { + s8 roomNo = current.roomNo; + mDoAud_seStart(JA_SE_LK_BOOM_FLY, &eyePos, 0, dComIfGp_getReverb(roomNo)); + } + setAimPos(); + + cXyz diff = mTargetPos - current.pos; + f32 dist = diff.abs(); + cXyz norm; + if (dist > 0.1f) { + norm = diff / dist; + } else { + norm = diff; + } + + s16 angle = cM_atan2s(norm.x, norm.z); + s16 currentAngle = angle - current.angle.y; + + if (mJustHit) { + mJustHit = false; + if (s16(angle - current.angle.y) > 0) { + current.angle.y = angle - 0x3000; + } else { + current.angle.y = angle + 0x3000; + } + currentAngle = angle - current.angle.y; + } + + if (mIsReturning) { + if (dist < speedF * 2.0f) { + if (pPlayer->returnBoomerang()) { + fopAcM_SetParam(this, Mode_Wait); + mThirdPerson = false; + mProcFunc = &daBoomerang_c::procWait; + mCps.SetAtHitCallback(NULL); + } else { + mCatchAndDelete = true; + } + } + } else { + if (dist < speedF || (mCps.ChkAtHit() && mCps.GetAtHitAc() == mLockActors[mCurLockIdx])) { + // Boomerang hit its current target. + mJustHit = true; + mLockActors[mCurLockIdx] = NULL; + mLockActorIDs[mCurLockIdx] = fpcM_ERROR_PROCESS_ID_e; + mCurLockIdx++; + mFreeFlyOut = false; + } + } + + if (!mIsReturning && (mCancelFlg || (!mFreeFlyOut && mLockCnt <= mCurLockIdx) || mCps.ChkAtShieldHit())) { + // Boomerang should return. It either was canceled, hit its last target, or hit a shield. + mJustHit = true; + mIsReturning = true; + resetLockActor(); + mCancelFlg = false; + mFreeFlyOut = false; + } + + if (mJustHit) { + current.angle.y = angle; + } else { + s16 newAngle; + if (!mThirdPerson) { + f32 a = 20.0f - dist * 2.0f / speedF; + if (a < 0.0f) { + a = 0.0f; + } else if (a > 18.0f) { + a = 20.0f + 40.0f * (a - 18.0f); + } + newAngle = a * 256.0f + 1024.0f; + } else { + newAngle = 0x4000; + } + + if (currentAngle > newAngle) { + currentAngle = newAngle; + } else if (currentAngle < -newAngle) { + currentAngle = -newAngle; + } + current.angle.y += currentAngle; + } + + angle = cM_atan2s(-norm.y, norm.absXZ()); + current.angle.x = angle; + + current.pos.x += speedF * cM_scos(current.angle.x) * cM_ssin(current.angle.y); + current.pos.y -= speedF * cM_ssin(current.angle.x); + current.pos.z += speedF * cM_scos(current.angle.x) * cM_scos(current.angle.y); + + shape_angle.y = current.angle.y; + shape_angle.x = current.angle.x; + + if (!mIsReturning) { + checkBgHit(&old.pos, ¤t.pos); + } + + currentAngle = -(currentAngle * 2); + + if (currentAngle > 0x100) { + currentAngle = 0x2000; + } else if (currentAngle < -0x100) { + currentAngle = -0x2000; + } else { + currentAngle = mModelRotZ; + } + + mModelRotZ = currentAngle; + cLib_addCalcAngleS(&shape_angle.z, currentAngle, 0x10, 0x1000, 0x10); + } + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::YrotM(mModelRotY); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mCps.cM3dGCps::Set(old.pos, current.pos, 30.0f); + mCps.CalcAtVec(); + + if (dComIfGp_event_getMode() == dEvtMode_NONE_e) { + mBlur.copyBlur(mDoMtx_stack_c::get(), mModelRotY); + dComIfG_Ccsp()->Set(&mCps); + dComIfG_Ccsp()->SetMass(&mCps, 1); + } else { + mBlur.copyBlur(mDoMtx_stack_c::get(), 0); + mCps.ResetAtHit(); + } + + mInWater = daPy_lk_c::setItemWaterEffect(this, mInWater, TRUE); + + return TRUE; +} + +/* 800E2AF4-800E2BD0 .text execute__13daBoomerang_cFv */ +BOOL daBoomerang_c::execute() { + for (int i = 0; i < mLockCnt; i++) { + mLockActors[i] = fopAcM_SearchByID(mLockActorIDs[i]); + } + + if (mProcFunc) { + (this->*mProcFunc)(); + } + + attention_info.position = current.pos; + eyePos = current.pos; + + setRoomInfo(); + mSightPacket.play(mLockCnt); + + return TRUE; +} + +/* 800E2BD0-800E2BF0 .text daBoomerang_Execute__FP13daBoomerang_c */ +static BOOL daBoomerang_Execute(daBoomerang_c* i_this) { + return i_this->execute(); +} + +/* 800E2BF0-800E2BF8 .text daBoomerang_IsDelete__FP13daBoomerang_c */ +static BOOL daBoomerang_IsDelete(daBoomerang_c*) { + return TRUE; +} + +/* 800E2BF8-800E2C00 .text daBoomerang_Delete__FP13daBoomerang_c */ +static BOOL daBoomerang_Delete(daBoomerang_c*) { + return TRUE; +} + +/* 800E2C00-800E2CC8 .text createHeap__13daBoomerang_cFv */ +BOOL daBoomerang_c::createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Link", LINK_BDL_BOOMERANG); + + JUT_ASSERT(VERSION_SELECT(1543, 1539, 1546, 1546), modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x37220202); + if (mpModel == NULL) + return FALSE; + return TRUE; +} + +/* 800E2CC8-800E2CE8 .text daBoomerang_createHeap__FP10fopAc_ac_c */ +static BOOL daBoomerang_createHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); +} + static dCcD_SrcCps l_at_cps_src = { // dCcD_SrcGObjInf { @@ -42,140 +795,54 @@ static dCcD_SrcCps l_at_cps_src = { }}, }; - -/* 800E0C08-800E0D44 .text initBlur__18daBoomerang_blur_cFPA4_fs */ -void daBoomerang_blur_c::initBlur(MtxP, s16) { - /* Nonmatching */ -} - -/* 800E0D44-800E101C .text copyBlur__18daBoomerang_blur_cFPA4_fs */ -void daBoomerang_blur_c::copyBlur(MtxP, s16) { - /* Nonmatching */ -} - -/* 800E101C-800E13A4 .text draw__18daBoomerang_blur_cFv */ -void daBoomerang_blur_c::draw() { - /* Nonmatching */ -} - -/* 800E13A4-800E14F0 .text draw__25daBoomerang_sightPacket_cFv */ -void daBoomerang_sightPacket_c::draw() { - /* Nonmatching */ -} - -/* 800E14F0-800E1718 .text setSight__25daBoomerang_sightPacket_cFP4cXyzi */ -void daBoomerang_sightPacket_c::setSight(cXyz*, int) { - /* Nonmatching */ -} - -/* 800E1718-800E1754 .text play__25daBoomerang_sightPacket_cFi */ -void daBoomerang_sightPacket_c::play(int) { - /* Nonmatching */ -} - -/* 800E1754-800E1998 .text draw__13daBoomerang_cFv */ -BOOL daBoomerang_c::draw() { - /* Nonmatching */ -} - -/* 800E1998-800E19B8 .text daBoomerang_Draw__FP13daBoomerang_c */ -static BOOL daBoomerang_Draw(daBoomerang_c* i_this) { - return ((daBoomerang_c*)i_this)->draw(); -} - -/* 800E19B8-800E1A14 .text getFlyMax__13daBoomerang_cFv */ -float daBoomerang_c::getFlyMax() { - /* Nonmatching */ -} - -/* 800E1A14-800E1AAC .text rockLineCallback__13daBoomerang_cFP10fopAc_ac_c */ -void daBoomerang_c::rockLineCallback(fopAc_ac_c*) { - /* Nonmatching */ -} - -/* 800E1AAC-800E1AD0 .text daBoomerang_rockLineCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daBoomerang_rockLineCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ -} - -/* 800E1AD0-800E1B20 .text setAimActor__13daBoomerang_cFP10fopAc_ac_c */ -void daBoomerang_c::setAimActor(fopAc_ac_c*) { - /* Nonmatching */ -} - -/* 800E1B20-800E1C20 .text setLockActor__13daBoomerang_cFP10fopAc_ac_ci */ -void daBoomerang_c::setLockActor(fopAc_ac_c*, int) { - /* Nonmatching */ -} - -/* 800E1C20-800E1C58 .text resetLockActor__13daBoomerang_cFv */ -void daBoomerang_c::resetLockActor() { - /* Nonmatching */ -} - -/* 800E1C58-800E1CFC .text setRoomInfo__13daBoomerang_cFv */ -void daBoomerang_c::setRoomInfo() { - /* Nonmatching */ -} - -/* 800E1CFC-800E1DA8 .text setKeepMatrix__13daBoomerang_cFv */ -void daBoomerang_c::setKeepMatrix() { - /* Nonmatching */ -} - -/* 800E1DA8-800E1E6C .text setAimPos__13daBoomerang_cFv */ -void daBoomerang_c::setAimPos() { - /* Nonmatching */ -} - -/* 800E1E6C-800E1F94 .text checkBgHit__13daBoomerang_cFP4cXyzP4cXyz */ -void daBoomerang_c::checkBgHit(cXyz*, cXyz*) { - /* Nonmatching */ -} - -/* 800E1F94-800E239C .text procWait__13daBoomerang_cFv */ -void daBoomerang_c::procWait() { - /* Nonmatching */ -} - -/* 800E239C-800E2AF4 .text procMove__13daBoomerang_cFv */ -void daBoomerang_c::procMove() { - /* Nonmatching */ -} - -/* 800E2AF4-800E2BD0 .text execute__13daBoomerang_cFv */ -BOOL daBoomerang_c::execute() { - /* Nonmatching */ -} - -/* 800E2BD0-800E2BF0 .text daBoomerang_Execute__FP13daBoomerang_c */ -static BOOL daBoomerang_Execute(daBoomerang_c* i_this) { - return ((daBoomerang_c*)i_this)->execute(); -} - -/* 800E2BF0-800E2BF8 .text daBoomerang_IsDelete__FP13daBoomerang_c */ -static BOOL daBoomerang_IsDelete(daBoomerang_c*) { - return TRUE; -} - -/* 800E2BF8-800E2C00 .text daBoomerang_Delete__FP13daBoomerang_c */ -static BOOL daBoomerang_Delete(daBoomerang_c*) { - return TRUE; -} - -/* 800E2C00-800E2CC8 .text createHeap__13daBoomerang_cFv */ -void daBoomerang_c::createHeap() { - /* Nonmatching */ -} - -/* 800E2CC8-800E2CE8 .text daBoomerang_createHeap__FP10fopAc_ac_c */ -static BOOL daBoomerang_createHeap(fopAc_ac_c*) { - /* Nonmatching */ -} - /* 800E2CE8-800E2EF0 .text create__13daBoomerang_cFv */ cPhs_State daBoomerang_c::create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daBoomerang_c); + + if (!fopAcM_entrySolidHeap(this, daBoomerang_createHeap, 0xD40)) { + return cPhs_ERROR_e; + } + + setKeepMatrix(); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + mProcFunc = &daBoomerang_c::procWait; + mStts.Init(0x3C, 0xFF, this); + + mCps.Set(l_at_cps_src); + mCps.SetStts(&mStts); + mCps.SetAtHitCallback(&daBoomerang_rockLineCallback); + + mLinChk.ClrSttsRoofOff(); + + for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { + mLockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; + } + + { + ResTIMG* tmp_img = (ResTIMG*)dComIfG_getObjectRes("Link", LINK_BTI_BLUR); + + JUT_ASSERT(VERSION_SELECT(1626, 1622, 1629, 1629), tmp_img != NULL); + + mBlur.imageData = (u8*)tmp_img + tmp_img->imageOffset; + } + + { + ResTIMG* tmp_img = (ResTIMG*)dComIfG_getObjectRes("Link", LINK_BTI_ROCK_MARK); + + JUT_ASSERT(VERSION_SELECT(1634, 1630, 1637, 1637), tmp_img != NULL); + + mSightPacket.setTex((u8*)tmp_img + tmp_img->imageOffset); + mSightPacket.setImage(tmp_img); + } + + setRoomInfo(); + model = mpModel; + + return cPhs_COMPLEATE_e; +} + +/* 800E2EF0-800E329C .text __ct__13daBoomerang_cFv */ +daBoomerang_c::daBoomerang_c() { } /* 800E33F0-800E3410 .text daBoomerang_Create__FP10fopAc_ac_c */ diff --git a/src/d/actor/d_a_dai.cpp b/src/d/actor/d_a_dai.cpp index 3ea07d4e9..e0cf866af 100644 --- a/src/d/actor/d_a_dai.cpp +++ b/src/d/actor/d_a_dai.cpp @@ -268,7 +268,7 @@ void daDai_c::proc() { } } - if ((m84C != 0) && talk(1) == 0x12) { + if ((m84C != 0) && talk(1) == fopMsgStts_BOX_CLOSED_e) { dComIfGp_event_reset(); m84C = 0; } 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 */ diff --git a/src/d/actor/d_a_fgmahou.cpp b/src/d/actor/d_a_fgmahou.cpp index 778c8edb1..6daccac7a 100644 --- a/src/d/actor/d_a_fgmahou.cpp +++ b/src/d/actor/d_a_fgmahou.cpp @@ -8,45 +8,337 @@ #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "d/d_s_play.h" +#include "d/d_particle_name.h" +#include "d/actor/d_a_fganon.h" +#include "d/res/res_fganon.h" /* 00000078-000000E4 .text daFgmahou_Draw__FP13fgmahou_class */ -static BOOL daFgmahou_Draw(fgmahou_class*) { - /* Nonmatching */ +static BOOL daFgmahou_Draw(fgmahou_class* i_this) { + J3DModel* pModel = i_this->mpMorf->getModel(); + i_this->mpBrk->entry(pModel->getModelData()); + i_this->mpBtk->entry(pModel->getModelData()); + i_this->mpMorf->entryDL(); + + return TRUE; } /* 000000E4-00000130 .text boss_s_sub__FPvPv */ -void boss_s_sub(void*, void*) { - /* Nonmatching */ +static void* boss_s_sub(void* param_1, void*) { + if(fopAc_IsActor(param_1) && fopAcM_GetName(param_1) == PROC_FGANON) { + return param_1; + } + + return NULL; } /* 00000130-00000C14 .text move__FP13fgmahou_class */ -void move(fgmahou_class*) { - /* Nonmatching */ +static void move(fgmahou_class* i_this) { + static float spdd[] = { + 0.65f, + 0.3f, + 0.1f, + 0.0f, + 0.0f, + 0.1f, + 0.3f, + 0.65f, + }; + static s16 angXd[] = { + 0x0000, + 0xF400, + 0xE800, + 0xE000, + 0xE000, + 0xE800, + 0xF400, + 0x0000 + }; + + fopAc_ac_c* pPlayer = dComIfGp_getPlayer(0); + + cXyz diff2; + cXyz diff3; + int temp2 = 1; + f32 temp3; + fganon_class* fganon2; + + i_this->mStts.Move(); + + switch(i_this->mState) { + case 0: + i_this->mState = 1; + i_this->field_0x2D4 = i_this->mOrbNumber * REG6_S(2) - REG6_S(3); + i_this->field_0x2D6 = cM_rndF(65536.0f); + + i_this->speedF = REG0_F(0xD) + 50.0f; + i_this->speedF *= (0.2f + REG0_F(4)) * spdd[i_this->mOrbNumber] + 1.0f; + i_this->mTargetPos = pPlayer->eyePos; + + diff2 = i_this->mTargetPos - i_this->current.pos; + i_this->home.angle.y = i_this->mOrbNumber * (REG8_S(2) + 0x1400) - (REG8_S(3) + 0x4000) + cM_atan2s(diff2.x, diff2.z); + i_this->home.angle.x = angXd[i_this->mOrbNumber]; + i_this->shape_angle = i_this->home.angle; + i_this->mTimers[0] = REG8_S(9) + 5; + i_this->mTimers[1] = 0x14; + + i_this->mpEmitter = dComIfGp_particle_set(dPa_name::ID_SCENE_821E, &i_this->current.pos); + + i_this->mTgSph.SetR(REG6_F(5) + 110.0f); + + temp2 = REG0_S(2) + 2; + case 1: + case 2: + diff3 = i_this->mTargetPos - i_this->current.pos; + temp3 = diff3.abs(); + if(i_this->mTimers[0] != 0) { + break; + } + + if(temp3 > REG0_F(0x11) + 500.0f && i_this->mState < 2) { + diff2 = i_this->mTargetPos - i_this->current.pos; + cLib_addCalcAngleS2(&i_this->home.angle.y, cM_atan2s(diff2.x, diff2.z), 2, REG8_S(4) + 0x500); + cLib_addCalcAngleS2(&i_this->home.angle.x, -cM_atan2s(diff2.y, std::sqrtf(diff2.x * diff2.x + diff2.z * diff2.z)), 2, REG8_S(4) + 0x500); + } + else { + i_this->mState = 2; + } + + if(i_this->mAtSph.ChkAtHit()) { + i_this->mAtSph.GetAtHitObj(); + fganon_class* fganon = (fganon_class*)fpcEx_Search(boss_s_sub, i_this); + if(fganon != NULL) { + fganon->m68B = 1; + + break; + } + } + + if(!i_this->mTgSph.ChkTgHit()) { + break; + } + + dComIfGp_particle_set(dPa_name::ID_SCENE_8244, &i_this->current.pos, &i_this->home.angle); + fopAcM_seStartCurrent(i_this, JA_SE_LK_PG_BOMB_STRIKE, 0); + + i_this->mState = 5; + case 5: + fganon2 = (fganon_class*)fpcEx_Search(boss_s_sub, i_this); + if(fganon2 == NULL) { + i_this->field_0x780 = 0x32; + break; + } + + i_this->mTargetPos = fganon2->eyePos; + i_this->mTargetPos.y -= cM_rndFX(50.0f) + 50.0f; + i_this->home.angle.y -= 0x8000; + i_this->home.angle.x *= -1; + i_this->mTimers[0] = REG8_S(9) + 5; + i_this->field_0x2E0 = 1; + i_this->field_0x2E2 = 0x8000; + i_this->shape_angle = i_this->home.angle; + i_this->mState = 6; + i_this->mAtSph.SetR(60.0f); + case 6: + case 7: + diff3 = i_this->mTargetPos - i_this->current.pos; + temp3 = diff3.abs(); + if(i_this->mTimers[0] != 0) { + break; + } + + if(temp3 > REG0_F(0x11) + 500.0f && i_this->mState < 7) { + diff2 = i_this->mTargetPos - i_this->current.pos; + cLib_addCalcAngleS2(&i_this->home.angle.y, cM_atan2s(diff2.x, diff2.z), 2, REG8_S(4) + 0x500); + cLib_addCalcAngleS2(&i_this->home.angle.x, -cM_atan2s(diff2.y, std::sqrtf(diff2.x * diff2.x + diff2.z * diff2.z)), 2, REG8_S(4) + 0x500); + } + else { + i_this->mState = 7; + } + + break; + case 10: + if(i_this->mTimers[0] == 0) { + fopAcM_delete(i_this); + } + + return; + case 3: + case 4: + case 8: + case 9: + break; + } + + f32 temp4 = temp3 * (REG0_F(3) + 3.0f); + if(temp4 > REG0_F(8) + 8000.0f) { + temp4 = REG0_F(8) + 8000.0f; + } + + i_this->field_0x2D4 += REG0_S(6) + 0xDAC; + i_this->field_0x2D6 += REG0_S(7) + 0xCE4; + + f32 temp5 = cM_ssin(i_this->field_0x2D4); + f32 temp7 = cM_ssin(i_this->field_0x2D6); + i_this->shape_angle.y = i_this->home.angle.y + (s16)(temp4 * temp5); + i_this->shape_angle.x = i_this->home.angle.x + (s16)(temp4 * temp7 * 0.75f); + + diff2.x = 0.0f; + diff2.y = 0.0f; + diff2.z = i_this->speedF; + mDoMtx_YrotS(*calc_mtx, i_this->shape_angle.y); + mDoMtx_XrotM(*calc_mtx, i_this->shape_angle.x); + MtxPosition(&diff2, &i_this->speed); + + if(temp2 <= 1) { + i_this->current.pos += i_this->speed; + } + else { + for(int i = 0; i < temp2; i++) { + i_this->current.pos += i_this->speed; + } + } + + cXyz temp6 = i_this->current.pos; + + if(i_this->mTimers[1] == 0) { + i_this->mTgSph.SetC(temp6); + dComIfG_Ccsp()->Set(&i_this->mTgSph); + i_this->mAtSph.SetC(temp6); + dComIfG_Ccsp()->Set(&i_this->mAtSph); + i_this->mAcch.CrrPos(*dComIfG_Bgsp()); + + if(fopAcM_searchPlayerDistance(i_this) > 5000.0f || i_this->mAtSph.ChkAtHit() || i_this->mAcch.ChkGroundHit() || i_this->mAcch.ChkWallHit() || i_this->mAcch.ChkRoofHit()) { + i_this->field_0x780 = 0x32; + i_this->health = 1; + + JPABaseEmitter* pEmtr = dComIfGp_particle_set(dPa_name::ID_SCENE_8245, &i_this->current.pos); + pEmtr->setGlobalRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(1)); + JPABaseEmitter* pEmtr2 = dComIfGp_particle_set(dPa_name::ID_SCENE_8246, &i_this->current.pos); + pEmtr2->setGlobalRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(1)); + + fopAcM_seStartCurrent(i_this, JA_SE_OBJ_PG_EBALL_EXP_L, 0); + } + } + + if(i_this->field_0x2E0 != 0) { + i_this->field_0x2E0++; + if(i_this->field_0x2E0 > 8) { + i_this->field_0x2E0 = 0; + } + } } /* 00000C14-00000DD8 .text daFgmahou_Execute__FP13fgmahou_class */ -static BOOL daFgmahou_Execute(fgmahou_class*) { - /* Nonmatching */ +static BOOL daFgmahou_Execute(fgmahou_class* i_this) { + cXyz temp(0.0f, 0.0f, 0.0f); + + i_this->mAge++; + + for(int i = 0; i < 2; i++) { + if(i_this->mTimers[i]) { + i_this->mTimers[i]--; + } + } + + if(i_this->field_0x2DE) { + i_this->field_0x2DE--; + } + + if(i_this->field_0x780 == 0) { + move(i_this); + } + else { + i_this->field_0x780--; + if(i_this->field_0x780 == 0) { + fopAcM_delete(i_this); + + return TRUE; + } + } + + i_this->mpBrk->play(); + i_this->mpBtk->play(); + J3DModel* pModel = i_this->mpMorf->getModel(); + mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z); + mDoMtx_stack_c::YrotM(i_this->shape_angle.y); + mDoMtx_stack_c::XrotM(i_this->shape_angle.x); + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); + i_this->mpMorf->calc(); + + if(i_this->mpEmitter) { + i_this->mpEmitter->setGlobalRTMatrix(i_this->mpMorf->getModel()->getAnmMtx(1)); + + if(i_this->field_0x780 != 0 && i_this->field_0x780 == 0x32) { + i_this->mpEmitter->becomeInvalidEmitter(); + i_this->mpEmitter = NULL; + i_this->mpBrk->setPlaySpeed(-1.0f); + } + } + + i_this->eyePos = i_this->current.pos; + + return TRUE; } /* 00000DD8-00000DE0 .text daFgmahou_IsDelete__FP13fgmahou_class */ -static BOOL daFgmahou_IsDelete(fgmahou_class*) { +static BOOL daFgmahou_IsDelete(fgmahou_class* i_this) { return TRUE; } /* 00000DE0-00000E3C .text daFgmahou_Delete__FP13fgmahou_class */ -static BOOL daFgmahou_Delete(fgmahou_class*) { - /* Nonmatching */ +static BOOL daFgmahou_Delete(fgmahou_class* i_this) { + dComIfG_resDelete(&i_this->mPhs, "Fganon"); + + if(i_this->mpEmitter) { + i_this->mpEmitter->becomeInvalidEmitter(); + } + + return TRUE; } /* 00000E3C-0000109C .text useHeapInit__FP10fopAc_ac_c */ -static BOOL useHeapInit(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL useHeapInit(fopAc_ac_c* a_this) { + fgmahou_class* i_this = static_cast(a_this); + + i_this->mpMorf = new mDoExt_McaMorf( + (J3DModelData*)dComIfG_getObjectRes("Fganon", FGANON_BDL_YDKSP00), + NULL, NULL, + NULL, + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + NULL, + 0, + 0x11020203 + ); + + if(i_this->mpMorf == NULL || i_this->mpMorf->getModel() == NULL) { + return FALSE; + } + + J3DModelData* pModelData = i_this->mpMorf->getModel()->getModelData(); + + i_this->mpBtk = new mDoExt_btkAnm(); + if(i_this->mpBtk == NULL) { + return FALSE; + } + if(!i_this->mpBtk->init(pModelData, (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Fganon", FGANON_BTK_YDKSP00), true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + i_this->mpBrk = new mDoExt_brkAnm(); + if(i_this->mpBrk == NULL) { + return FALSE; + } + if(!i_this->mpBrk->init(pModelData, (J3DAnmTevRegKey*)dComIfG_getObjectRes("Fganon", FGANON_BRK_YDKSP00), true, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + i_this->mpBrk->setFrame(6.999f); + + return TRUE; } /* 000010E4-0000135C .text daFgmahou_Create__FP10fopAc_ac_c */ -static cPhs_State daFgmahou_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daFgmahou_Create(fopAc_ac_c* a_this) { static dCcD_SrcSph tg_sph_src = { // dCcD_SrcGObjInf { @@ -103,6 +395,31 @@ static cPhs_State daFgmahou_Create(fopAc_ac_c*) { /* Radius */ 30.0f, }}, }; + + fgmahou_class* i_this = static_cast(a_this); + + fopAcM_SetupActor(i_this, fgmahou_class); + + cPhs_State phase_state = dComIfG_resLoad(&i_this->mPhs, "Fganon"); + if(phase_state == cPhs_COMPLEATE_e) { + i_this->mOrbNumber = fopAcM_GetParam(i_this) & 0xF; + + if(!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x19000)) { + return cPhs_ERROR_e; + } + i_this->mAcch.Set(fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this), i_this, 1, &i_this->mCir, fopAcM_GetSpeed_p(i_this)); + i_this->mCir.SetWall(50.0f, 50.0f); + i_this->mAcch.ClrRoofNone(); + i_this->mAcch.SetRoofCrrHeight(REG0_F(7) + 70.0f); + i_this->mStts.Init(0xFA, 0xFF, i_this); + i_this->mTgSph.Set(tg_sph_src); + i_this->mTgSph.SetStts(&i_this->mStts); + i_this->mTgSph.OnTgNoHitMark(); + i_this->mAtSph.Set(at_sph_src); + i_this->mAtSph.SetStts(&i_this->mStts); + } + + return phase_state; } static actor_method_class l_daFgmahou_Method = { diff --git a/src/d/actor/d_a_npc_rsh1.cpp b/src/d/actor/d_a_npc_rsh1.cpp index f3a01504d..e25e8a174 100644 --- a/src/d/actor/d_a_npc_rsh1.cpp +++ b/src/d/actor/d_a_npc_rsh1.cpp @@ -879,7 +879,7 @@ u16 daNpc_Rsh1_c::shop_talk() { /* 00001DE4-00001FE0 .text talk__12daNpc_Rsh1_cFv */ u16 daNpc_Rsh1_c::talk() { - u16 result = 0xFF; + u16 status = 0xFF; if (m961 == 0) { l_msgId = fpcM_ERROR_PROCESS_ID_e; @@ -904,10 +904,10 @@ u16 daNpc_Rsh1_c::talk() { setAnmFromMsgTag(); switch (m961) { case 2: - result = normal_talk(); + status = normal_talk(); break; case 3: - result = shop_talk(); + status = shop_talk(); break; } if (dComIfGp_checkMesgSendButton()) { @@ -933,7 +933,7 @@ u16 daNpc_Rsh1_c::talk() { mShopCamAct.m54 = mpShopItems->mSelectedItemIdx; } - return result; + return status; } /* 00001FE0-00002358 .text CreateInit__12daNpc_Rsh1_cFv */ diff --git a/src/d/actor/d_a_npc_tc.cpp b/src/d/actor/d_a_npc_tc.cpp index bdc2b59ab..5e4e22b8f 100644 --- a/src/d/actor/d_a_npc_tc.cpp +++ b/src/d/actor/d_a_npc_tc.cpp @@ -8,300 +8,1930 @@ #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_tc.h" +#include "d/d_s_play.h" +#include "d/d_snap.h" +#include "d/actor/d_a_obj_smplbg.h" +#include "d/d_lib.h" + + +#if VERSION == VERSION_DEMO +static f32 lbl_285_data_1C[] = { + 0.0f, + 2.125f, + 0.0f, + 1.75f, + 0.0f +}; +#endif + +class daNpc_Tc_HIO_c : public mDoHIO_entry_c{ +public: + daNpc_Tc_HIO_c(); + virtual ~daNpc_Tc_HIO_c() {} + + void genMessage(JORMContext* ctx) {} + +public: + /* 0x04 */ dNpc_HIO_c mNpc; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ u8 field_0x34; + /* 0x35 */ u8 field_0x35[0x38 - 0x35]; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ bool field_0x44; + /* 0x45 */ u8 field_0x45[0x48 - 0x45]; + /* 0x48 */ f32 field_0x48; + /* 0x4C */ f32 field_0x4C; + /* 0x50 */ f32 field_0x50; + /* 0x54 */ f32 field_0x54; + /* 0x58 */ f32 field_0x58; + /* 0x5C */ f32 field_0x5C; + /* 0x60 */ cXyz field_0x60; + /* 0x6C */ cXyz field_0x6C; + /* 0x78 */ s16 field_0x78; + /* 0x7A */ s16 field_0x7A; + /* 0x7C */ u8 field_0x7C; + /* 0x7D */ u8 field_0x7D; + /* 0x7E */ u8 field_0x7E; + /* 0x7F */ u8 field_0x7F[8]; + /* 0x87 */ u8 field_0x87[8]; + /* 0x8F */ u8 field_0x8F; + /* 0x90 */ u8 field_0x90; + /* 0x91 */ u8 field_0x91; + /* 0x92 */ u8 field_0x92; + /* 0x93 */ u8 field_0x93; + /* 0x94 */ f32 field_0x94[24]; +}; // Size: 0xF4 + +static daNpc_Tc_HIO_c l_HIO; + +#include "d/actor/d_a_npc_tc_msg_normal2.inc" + +#include "d/actor/d_a_npc_tc_msg_white.inc" + +#include "d/actor/d_a_npc_tc_msg_red.inc" /* 000000EC-00000394 .text __ct__14daNpc_Tc_HIO_cFv */ daNpc_Tc_HIO_c::daNpc_Tc_HIO_c() { - /* Nonmatching */ + field_0x60.set(-100.0f, 1700.0f, -50.0f); + field_0x6C.set(100.0f, 1700.0f, 50.0f); + + field_0x7A = 0; + field_0x78 = -0x8000; + field_0x7C = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80); + field_0x7D = dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20); + field_0x7E = dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708); + + for (int i = 0; i < 8; i++) { + field_0x87[i] = dComIfGs_isGetCollectMap(i+1); + } + + for (int i = 0; i < 8; i++) { + field_0x7F[i] = dComIfGs_isCollectMapTriforce(i+1); + } + + field_0x8F = dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xf); + field_0x90 = dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xf); + field_0x91 = dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xf); + field_0x92 = dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xf); + field_0x93 = dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xf); + + mNpc.m04 = -20.0f; + mNpc.mMaxHeadX = 0x1FFE; + mNpc.mMaxHeadY = 10000; + mNpc.mMaxBackboneX = 0; + mNpc.mMaxBackboneY = 0x1C70; + mNpc.mMinHeadX = -0x9C4; + mNpc.mMinHeadY = -10000; + mNpc.mMinBackboneX = 0; + mNpc.mMinBackboneY = -0x1C70; + mNpc.mMaxTurnStep = 3000; + mNpc.mMaxHeadTurnVel = 0x800; + mNpc.mAttnYOffset = 65.0f; + mNpc.mMaxAttnAngleY = 0x4000; + mNpc.m22 = 0; + mNpc.mMaxAttnDistXZ = 400.0f; + + field_0x2C = 900.0f; + field_0x30 = 400.0f; + field_0x34 = 0; + field_0x38 = 20.0f; + field_0x40 = 14.0f; + field_0x3C = -2.5f; + field_0x48 = -25.0f; + field_0x50 = 8.0f; + field_0x4C = -2.5f; + field_0x54 = 0.35f; + field_0x58 = 4.0f; + field_0x5C = 8.0f; + field_0x94[0] = 0.0f; + field_0x94[1] = 8.0f; + field_0x94[2] = 8.0f; + field_0x94[3] = 5.0f; + field_0x94[4] = 8.0f; + field_0x94[5] = 4.0f; + field_0x94[6] = 0.0f; + field_0x94[7] = 6.0f; + field_0x94[8] = 6.0f; + field_0x94[9] = 0.0f; + field_0x94[10] = 8.0f; + field_0x94[11] = 8.0f; + field_0x94[12] = 8.0f; + field_0x94[13] = 8.0f; + field_0x94[14] = 8.0f; + field_0x94[15] = 8.0f; + field_0x94[16] = 8.0f; + field_0x94[17] = 8.0f; + field_0x94[18] = 8.0f; + field_0x94[19] = 8.0f; + field_0x94[20] = 8.0f; + field_0x94[21] = 8.0f; + field_0x94[23] = 8.0f; + field_0x94[22] = 8.0f; } +static const int l_btp_ix_tbl[] = { + TC_BTP_MABA01 +}; + /* 000003D0-0000059C .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Tc_c* i_this = (daNpc_Tc_c*)model->getUserArea(); + + if(i_this != NULL) { + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + if(jntNo == i_this->m_jnt.getHeadJntNum()) { + static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f); + static cXyz l_offsetEyePos(24.0f, -16.0f, 0.0f); + mDoMtx_stack_c::multVec(&l_offsetAttPos, &i_this->getAttentionBasePos()); + mDoMtx_stack_c::YrotM(-i_this->m_jnt.getHead_y()); + mDoMtx_stack_c::ZrotM(-i_this->m_jnt.getHead_x()); + mDoMtx_stack_c::multVec(&l_offsetEyePos, &i_this->getEyePos()); + i_this->incAttnSetCount(); + } else if(jntNo == i_this->m_jnt.getBackboneJntNum()) { + mDoMtx_stack_c::XrotM((int)i_this->m_jnt.getBackbone_y()); + mDoMtx_stack_c::ZrotM((int)i_this->m_jnt.getBackbone_x()); + } + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + } + } + return TRUE; } /* 0000059C-000005C8 .text searchTower_CB__FPvPv */ -void searchTower_CB(void*, void*) { - /* Nonmatching */ +static void* searchTower_CB(void* i_actor, void* i_this) { + return static_cast(i_this)->_searchTower(static_cast(i_actor)); } /* 000005C8-00000630 .text _searchTower__10daNpc_Tc_cFP10fopAc_ac_c */ -void daNpc_Tc_c::_searchTower(fopAc_ac_c*) { - /* Nonmatching */ +fopAc_ac_c* daNpc_Tc_c::_searchTower(fopAc_ac_c* i_actor) { + if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Obj_Smplbg && ((daObjSmplbg::Act_c*)i_actor)->prm_get_type() == 0) { + return i_actor; + } + return NULL; } + + /* 00000630-00000744 .text initTexPatternAnm__10daNpc_Tc_cFb */ -void daNpc_Tc_c::initTexPatternAnm(bool) { - /* Nonmatching */ +BOOL daNpc_Tc_c::initTexPatternAnm(bool param_1) { + J3DModelData* modeldata = mpMorf->getModel()->getModelData(); + + m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Tc", l_btp_ix_tbl[mTexPatternNum]); + JUT_ASSERT(0x188, m_head_tex_pattern != NULL); + + if(mBtpAnm.init(modeldata, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, param_1, FALSE) == FALSE) { + return FALSE; + } + mBlinkFrame = 0; + mBlinkTimer = 0; + return TRUE; } /* 00000744-000007D0 .text playTexPatternAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::playTexPatternAnm() { - /* Nonmatching */ + if (cLib_calcTimer(&mBlinkTimer) == 0) { + if (mBlinkFrame >= m_head_tex_pattern->getFrameMax()) { + mBlinkFrame -= m_head_tex_pattern->getFrameMax(); + mBlinkTimer = cM_rndF(100.0f) + 30.0f; + } else { + mBlinkFrame++; + } + } } /* 000007D0-00000948 .text smoke_set__10daNpc_Tc_cFfffff */ -void daNpc_Tc_c::smoke_set(float, float, float, float, float) { - /* Nonmatching */ +void daNpc_Tc_c::smoke_set(f32 i_rate, f32 i_spread, f32 i_initialVelOmni, f32 i_initialVelAxis, f32 i_initialVelDir) { + static JGeometry::TVec3 smoke_scale(1.0f, 1.0f, 1.0); + if(mSmokeCallBack.getEmitter() == NULL) { + dComIfGp_particle_setToon(dPa_name::ID_COMMON_2022, &mSmokePos, &mSmokeAngle, NULL, 0xB9, &mSmokeCallBack, fopAcM_GetRoomNo(this)); + } + + if(mSmokeCallBack.getEmitter() != NULL) { + mSmokeCallBack.getEmitter()->setRate(i_rate); + mSmokeCallBack.getEmitter()->setSpread(i_spread); + mSmokeCallBack.getEmitter()->setAwayFromCenterSpeed(i_initialVelOmni); + mSmokeCallBack.getEmitter()->setAwayFromAxisSpeed(i_initialVelAxis); + mSmokeCallBack.getEmitter()->setDirectionalSpeed(i_initialVelDir); + mSmokeCallBack.getEmitter()->setGlobalScale(smoke_scale); + } } /* 00000948-00001168 .text setAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::setAnm() { + static const int a_anm_bck_tbl[] = { + TC_BCK_WAIT01, + TC_BCK_WAIT03, + TC_BCK_WAIT02, + TC_BCK_TALK01, + TC_BCK_WALK01, + TC_BCK_JAMP_A, + TC_BCK_JAMP_B, + TC_BCK_JAMP_C, + TC_BCK_GUARD, + TC_BCK_JTBT, + TC_BCK_HAPPY, + TC_BCK_DANCE01, + TC_BCK_DANCE02, + TC_BCK_GET, + TC_BCK_MAWASU, + TC_BCK_WAIT04, + TC_BCK_TALK02, + }; + + dLib_anm_prm_c a_anm_prm_tbl[24] = { + { + /* mBckIdx */ -1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 0.0f, + /* mPlaySpeed */ 0.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_WAIT01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT03, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_JAMP_A, + /* mNextPrmIdx */ ANM_PRM_IDX_JAMP_B, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_B, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 6.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_C, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 6.0f, + /* mPlaySpeed */ 0.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_C, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_GUARD, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_JTBT, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_HAPPY, + /* mNextPrmIdx */ ANM_PRM_IDX_HAPPY2, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_GET, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_HAPPY, + /* mNextPrmIdx */ ANM_PRM_IDX_TALK01, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE01, + /* mNextPrmIdx */ ANM_PRM_IDX_TALK01, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE02, + /* mNextPrmIdx */ ANM_PRM_IDX_WAIT03, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_MAWASU, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT04, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + }; + + if (mAnmPrmIdx == ANM_PRM_IDX_TALK01_WAIT01) { + if (mpMorf->isLoop()) { + mTalk01Wait01Timer++; + if(mTalk01Wait01Timer >= 3) { + mTalk01Wait01Timer = 0; + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } + } else { + mTalk01Wait01Timer = 0; + } + + if (mAnmPrmIdx == ANM_PRM_IDX_TALK01_TALK02) { + if (mpMorf->isLoop()) { + mTalk01Talk02Timer++; + if(mTalk01Talk02Timer >= 5) { + mTalk01Talk02Timer = 0; + mAnmPrmIdx = ANM_PRM_IDX_TALK02; + } + } + } else { + mTalk01Talk02Timer = 0; + } + + if (mAnmPrmIdx == ANM_PRM_IDX_JTBT) { + if (mpMorf->isLoop()) { + mJtbtTimer++; + if(mJtbtTimer >= 4) { + mJtbtTimer = 0; + mAnmPrmIdx = ANM_PRM_IDX_TALK01; + } + } + } else { + mJtbtTimer = 0; + } + + for (int i = 0; i < 24; i++) { + a_anm_prm_tbl[i].mMorf = l_HIO.field_0x94[i]; + } + +#if VERSION != VERSION_DEMO + if (mBckIdx == BCK_IDX_MAWASU && (int)mpMorf->getFrame() == 1) { + if(mType == TYPE_RED) { + fopAcM_monsSeStart(this, JA_SE_CV_TC_B_PUSH_BAR, 0); + } else if(mType == TYPE_WHITE) { + fopAcM_monsSeStart(this, JA_SE_CV_TC_T_PUSH_BAR, 0); + } + } +#endif + + if (mBckIdx == BCK_IDX_JAMP_C) { + if (mpMorf->getFrame() == 1.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(10.0f, 0.25f, 0.0f, 2.0f, 15.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mBckIdx == BCK_IDX_DANCE01) { + mParticlePos.setall(0.0f); + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(11)); + mDoMtx_stack_c::multVec(&mParticlePos, &mParticlePos); + cXyz pos; + + pos.setall(1.0f); + + if (mpMorf->getFrame() == 1.0f) { + dComIfGp_particle_set(dPa_name::ID_SCENE_8189, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818A, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818B, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818C, &mParticlePos, NULL, NULL, 0xff, &field_0x714, fopAcM_GetRoomNo(this)); + dComIfGp_particle_set(dPa_name::ID_SCENE_818D, &mParticlePos, NULL, NULL, 0xff, &field_0x728, fopAcM_GetRoomNo(this)); + } + + if (mpMorf->getFrame() == 88.0f) { + f32 sin = cM_ssin(current.angle.y); + f32 cos = cM_scos(current.angle.y); + + cXyz tempPos(current.pos.x + sin * 10.0f, current.pos.y, current.pos.z + cos * 10.0f); + mSmokePos = tempPos; + mSmokeAngle = current.angle; + + smoke_set(5.0f, 0.25f, 0.0f, 10.0f, 1.0f); + } else if (mpMorf->getFrame() == 143.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(10.0f, 0.25f, 0.0f, 15.0f, 1.0f); + } else { + mSmokeCallBack.end(); + } + if (mpMorf->getFrame() == 178.0f) { + field_0x714.end(); + field_0x728.end(); + } + } + + if (mBckIdx == BCK_IDX_JTBT) { + if (mpMorf->getFrame() == 0.0f || mpMorf->getFrame() == 12.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 1.0f, 10.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mBckIdx == BCK_IDX_HAPPY) { + if (mpMorf->getFrame() == 24.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(4.0f, 0.25f, 0.0f, 2.0f, 10.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mOldAnmPrmIdx != mAnmPrmIdx) { + if (mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + cXyz particlePos(current.pos); + particlePos.y -= 80.0f; + cXyz particleScale; + particleScale.setall(1.0f); + + JPABaseEmitter* pEmitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8152, &particlePos, NULL, &particleScale); + + pEmitter->setGlobalParticleScale(0.62f, 0.6f); + fopAcM_seStart(this, JA_SE_CM_CMN_NOTICE, 0); // regswap for demo likely happens here, daNpc_Tc_c::cutEffectStart also has a regswap with identical code + } + mSmokeCallBack.end(); + } + dLib_bcks_setAnm("Tc", mpMorf, &mBckIdx, &mAnmPrmIdx, &mOldAnmPrmIdx, a_anm_bck_tbl, a_anm_prm_tbl, false); /* Nonmatching */ } /* 00001168-000011C0 .text setTexAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::setTexAnm() { - /* Nonmatching */ + static s8 a_tex_pattern_num_tbl[2] = { + 0xFF, + 0x00, + }; + + s8 texPatternNum = a_tex_pattern_num_tbl[mTexPatternNumIdx]; + if (texPatternNum != mTexPatternNum && texPatternNum != -1) { + mTexPatternNum = texPatternNum; + initTexPatternAnm(true); + } } /* 000011C0-0000136C .text chkAttention__10daNpc_Tc_cF4cXyzs */ -void daNpc_Tc_c::chkAttention(cXyz, short) { - /* Nonmatching */ +bool daNpc_Tc_c::chkAttention(cXyz param_1, s16 param_2) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + f32 maxAttnDist = l_HIO.mNpc.mMaxAttnDistXZ; + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + maxAttnDist = l_HIO.mNpc.mMaxAttnDistXZ; + maxAttnDist *= 0.5f; + break; + } + + if (mStatus == STATUS_WALK_TO_JAIL || mStatus == STATUS_JUMP || mStatus == STATUS_SIT) { + maxAttnDist = l_HIO.field_0x2C; + } + + int maxAttnAngleY = l_HIO.mNpc.mMaxAttnAngleY; + cXyz temp; + temp.x = player->current.pos.x - param_1.x; + temp.z = player->current.pos.z - param_1.z; + f32 temp2 = std::sqrtf(temp.x * temp.x + temp.z * temp.z); + s16 temp3 = cM_atan2s(temp.x, temp.z); + + if (mHasAttention) { + maxAttnDist += 40.0f; + maxAttnAngleY += 0x71C; + } + + temp3 -= param_2; + return maxAttnAngleY > abs(temp3) && maxAttnDist > temp2; } +#include "d/actor/d_a_npc_tc_cut.inc" + /* 0000136C-00001424 .text eventOrder__10daNpc_Tc_cFv */ void daNpc_Tc_c::eventOrder() { - /* Nonmatching */ + static char* a_demo_name_tbl[] = { + "TC_JUMP_DEMO", + "TC_RESCUE", + "TC_TALK_NEAR_JAIL", + "TC_TALK_NEAR_JAIL_S", + "TC_TALK_NEAR_JAIL2", + "TC_GET_RUPEE", + "TC_PAY_RUPEE" + }; + + + if (mEventIdx == 1 || mEventIdx == 2) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if (mEventIdx == 1) { + fopAcM_orderSpeakEvent(this); + } + } else if (mEventIdx == 8 || mEventIdx == 9) { + fopAcM_orderOtherEvent(this, a_demo_name_tbl[mEventIdx - 3], 0x14F); + } + else if (mEventIdx >= 3) { + fopAcM_orderOtherEvent(this, a_demo_name_tbl[mEventIdx - 3]); + } } /* 00001424-00001470 .text checkOrder__10daNpc_Tc_cFv */ void daNpc_Tc_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + mEventIdx = 0; + return; + } + + if (eventInfo.mCommand != dEvtCmd_INTALK_e) { + return; + } + + if (mEventIdx != 1 && mEventIdx != 2) { + return; + } + mEventIdx = 0; + mTalkingNearJail = true; } /* 00001470-000014FC .text existTcMonument__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existTcMonument() { - /* Nonmatching */ +bool daNpc_Tc_c::existTcMonument() { + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) + || dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF) + || dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF)) { + return true; + } + return false; } /* 000014FC-0000156C .text anmAtr__10daNpc_Tc_cFUs */ -void daNpc_Tc_c::anmAtr(unsigned short) { - /* Nonmatching */ +void daNpc_Tc_c::anmAtr(u16 i_msgStatus) { + static const s8 anm_atr[] = { + ANM_PRM_IDX_WAIT01, + ANM_PRM_IDX_WAIT02, + ANM_PRM_IDX_WAIT03, + ANM_PRM_IDX_TALK01, + ANM_PRM_IDX_GUARD, + ANM_PRM_IDX_JTBT, + ANM_PRM_IDX_HAPPY, + ANM_PRM_IDX_DANCE01, + ANM_PRM_IDX_DANCE02, + ANM_PRM_IDX_HAPPY2, + ANM_PRM_IDX_DANCE02_TO_WAIT03, + ANM_PRM_IDX_DANCE01_TO_TALK01, + ANM_PRM_IDX_TALK01_WAIT01, + ANM_PRM_IDX_TALK01_TALK02, + ANM_PRM_IDX_TALK02, + ANM_PRM_IDX_WAIT04 + }; + + switch (i_msgStatus) { + case fopMsgStts_MSG_TYPING_e: { + if(field_0x6C8) { + return; + } + u8 msgAnmAtr = dComIfGp_getMesgAnimeAttrInfo(); + field_0x6C8 = TRUE; + if(anm_atr[msgAnmAtr] == ANM_PRM_IDX_HAPPY2 && mAnmPrmIdx == ANM_PRM_IDX_TALK01) { + return; + } + mAnmPrmIdx = anm_atr[msgAnmAtr]; + break; + } + case fopMsgStts_MSG_DISPLAYED_e: + field_0x6C8 = FALSE; + break; + } } /* 0000156C-00001618 .text stopTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::stopTower() { - /* Nonmatching */ + JUT_ASSERT(VERSION_SELECT(0x3F5, 0x3F4, 0x3F4, 0x3F4), m_tower_actor != NULL); + + daObjSmplbg::Act_c* tower = m_tower_actor; + switch (mType) { + case TYPE_RED: + case TYPE_WHITE: + m_jnt.offHeadLock(); + mAnmPrmIdx = ANM_PRM_IDX_WAIT04; + tower->onStop(); + break; + case TYPE_NORMAL2: + tower->onStop(); + break; + } } /* 00001618-000017A4 .text startTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::startTower() { - /* Nonmatching */ + JUT_ASSERT(VERSION_SELECT(0x408, 0x407, 0x407, 0x407), m_tower_actor != NULL); + daObjSmplbg::Act_c* tower = m_tower_actor; + + cXyz temp; + s16 temp2; + switch(mType) { + case TYPE_WHITE: + temp = l_HIO.field_0x60; + temp2 = l_HIO.field_0x7A; + break; + case TYPE_RED: + temp = l_HIO.field_0x6C; + temp2 = l_HIO.field_0x78; + break; + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + m_jnt.onHeadLock(); + mDoMtx_stack_c::transS(m_tower_actor->current.pos); + mDoMtx_stack_c::ZXYrotM(m_tower_actor->shape_angle); + temp2 = m_tower_actor->shape_angle.y + temp2; + cLib_addCalcAngleS2(¤t.angle.y, temp2, 4, 0x400); + if(cLib_distanceAngleS(current.angle.y, temp2) < 0x600) { + tower->offStop(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + } + break; + default: + tower->offStop(); + break; + } } /* 000017A4-00001900 .text next_msgStatusBlue__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusBlue(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatusBlue(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { + case 0xDDD: + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF)) { + *pMsgNo = 0xDDE; + } else { + *pMsgNo = 0xDF9; + } + break; + case 0xDDE: + *pMsgNo = 0xDDF; + break; + case 0xDDF: + *pMsgNo = 0xDE0; + break; + case 0xDF9: + *pMsgNo = 0xDFA; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; } /* 00001900-00001AEC .text next_msgStatusNormal__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusNormal(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatusNormal(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch(*pMsgNo) { + case 0x10CD: + *pMsgNo = 0x10CE; + break; + case 0x10DF: + *pMsgNo = 0x10CE; + break; + case 0x10CE: + *pMsgNo = 0x10CF; + break; + case 0x10CF: + *pMsgNo = 0x10D0; + break; + case 0x10D0: + *pMsgNo = 0x10D1; + break; + case 0x10D1: + *pMsgNo = 0x10D2; + break; + case 0x10D3: + *pMsgNo = 0x10D2; + break; + case 0x10D4: + *pMsgNo = 0x10D5; + break; + case 0x10D5: + *pMsgNo = 0x10D6; + break; + case 0x10D6: + *pMsgNo = 0x10D7; + break; + case 0x10D7: + *pMsgNo = 0x10D8; + break; + case 0x10D9: + *pMsgNo = 0x10D8; + break; + case 0x10DA: + *pMsgNo = 0x10DB; + break; + case 0x10DB: + *pMsgNo = 0x10DC; + break; + case 0x10DD: + *pMsgNo = 0x10DE; + break; + case 0xDAD: + *pMsgNo = 0xDAE; + break; + case 0xDAF: + *pMsgNo = 0xDB0; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; } /* 00001AEC-00001B64 .text next_msgStatus__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatus(u32* pMsgNo) { + u16 msg; + switch(mType) { + case TYPE_NORMAL: + msg = next_msgStatusNormal(pMsgNo); + break; + case TYPE_NORMAL2: + msg = next_msgStatusNormal2(pMsgNo); + break; + case TYPE_BLUE: + msg = next_msgStatusBlue(pMsgNo); + break; + case TYPE_RED: + msg = next_msgStatusRed(pMsgNo); + break; + case TYPE_WHITE: + msg = next_msgStatusWhite(pMsgNo); + break; + default: + msg = fopMsgStts_MSG_ENDS_e; + break; + } + return msg; } /* 00001B64-00001B88 .text setFirstMsg__10daNpc_Tc_cFPbUlUl */ -void daNpc_Tc_c::setFirstMsg(bool*, unsigned long, unsigned long) { - /* Nonmatching */ +u32 daNpc_Tc_c::setFirstMsg(bool* param_1, u32 param_2, u32 param_3) { + if (!*param_1) { + *param_1 = true; + } else { + param_2 = param_3; + } + return param_2; } /* 00001B88-00001BE0 .text getMsgNormal__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgNormal() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsgNormal() { + u32 msg; + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40)) { + msg = 0x10D3; + mHasTalkedNearJail = true; + } else { + msg= 0x10D9; + } + return msg; } /* 00001BE0-00001BE8 .text getMsgBlue__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgBlue() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsgBlue() { + return 0xDDD; } /* 00001BE8-00001C74 .text getMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsg() { + u32 msg = 0; + switch(mType) { + case TYPE_NORMAL: + msg = getMsgNormal(); + break; + case TYPE_NORMAL2: + msg = getMsgNormal2(); + break; + case TYPE_BLUE: + msg = getMsgBlue(); + break; + case TYPE_RED: + msg = getMsgRed(); + break; + case TYPE_WHITE: + msg = getMsgWhite(); + break; + } + return msg; } /* 00001C74-00001C98 .text getArg__10daNpc_Tc_cFv */ void daNpc_Tc_c::getArg() { - /* Nonmatching */ + mType = fopAcM_GetParam(this) & 0xf; + if(mType != 0xF) { + return; + } + mType = TYPE_NORMAL; } +extern dCcD_SrcCyl dNpc_cyl_src; /* 00001C98-0000202C .text createInit__10daNpc_Tc_cFv */ void daNpc_Tc_c::createInit() { - /* Nonmatching */ +#if VERSION != VERSION_DEMO + if (mType == TYPE_NORMAL) { + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + } +#endif + field_0x790 = current.angle; + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + mAttPos.set(current.pos); + mEyePos.set(current.pos); +#if VERSION == VERSION_DEMO + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); +#endif + mStts.Init(0xFE, 0xFE, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + mHasTalkedNearJail = false; + mTexPatternNumIdx = 1; + switch (mType) { + case TYPE_NORMAL: + mAnmPrmIdx = ANM_PRM_IDX_WAIT02; + fopAcM_Search(&searchStoolPos, this); + if (setAction(&daNpc_Tc_c::help_action, NULL)) { + gravity = 0.0f; + mAcchCir.SetWall(60.0f, 50.0f); + } + + break; + case TYPE_BLUE: + case TYPE_NORMAL2: + gravity = -9.0f; + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + if (setAction(&daNpc_Tc_c::wait_action, NULL)) { + mAcchCir.SetWall(60.0f, 50.0f); + } + break; + case TYPE_RED: + case TYPE_WHITE: + gravity = -9.0f; + m_jnt.onHeadLock(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + if (setAction(&daNpc_Tc_c::wait_action, NULL)) { + mAcchCir.SetWall(60.0f, 10.0f); + } + break; + } +#if VERSION != VERSION_DEMO + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), ¤t.angle, &shape_angle); +#endif + mOldAnmPrmIdx = 0; + setTexAnm(); + setAnm(); + set_mtx(); + mpMorf->calc(); + mEventCut.setActorInfo2("Tc", this); } /* 0000202C-000020C4 .text searchStoolPos__10daNpc_Tc_cFPvPv */ -void daNpc_Tc_c::searchStoolPos(void*, void*) { - /* Nonmatching */ +void* daNpc_Tc_c::searchStoolPos(void* i_actor, void* i_this) { + fopAc_ac_c* actor = static_cast(i_actor); + daNpc_Tc_c* a_this = static_cast(i_this); + + dStage_objectNameInf* inf = dStage_searchName("Ostool"); + + if(inf == NULL) { + return NULL; + } + + if(inf->procname == fopAcM_GetProfName(i_actor) && inf->argument == actor->argument) { + a_this->mStoolPos.set(actor->current.pos); + } + return NULL; } /* 000020C4-00002148 .text setAttention__10daNpc_Tc_cFv */ void daNpc_Tc_c::setAttention() { - /* Nonmatching */ + s8 temp = mAnmPrmIdx; + if (temp != ANM_PRM_IDX_WAIT01 && temp != ANM_PRM_IDX_WALK01 && temp != ANM_PRM_IDX_TALK01 && temp != ANM_PRM_IDX_GUARD && + temp != ANM_PRM_IDX_MAWASU && temp != ANM_PRM_IDX_TALK02 && temp != ANM_PRM_IDX_WAIT04) { + return; + } + + eyePos.set(mEyePos.x, mEyePos.y, mEyePos.z); + attention_info.position.set(mAttPos.x, mAttPos.y + l_HIO.mNpc.mAttnYOffset, mAttPos.z); } /* 00002148-00002220 .text calcMove__10daNpc_Tc_cFv */ void daNpc_Tc_c::calcMove() { - /* Nonmatching */ + f32 speed; + if (mAnmPrmIdx != ANM_PRM_IDX_WALK01) { + return; + } + cLib_chaseF(&speedF, mTargetSpeed, 0.1f); + if (mEventCut.getMoveSpeed() != 0.0f) { + switch(mEventCut.getNowCut()) { + case 2: + case 4: + speed = l_HIO.field_0x54 * mEventCut.getMoveSpeed(); + break; + } + } else { + speed = speedF * l_HIO.field_0x54; + } + if(speed < 0.5f) { + speed = 0.5f; + } + mpMorf->setPlaySpeed(speed); } /* 00002220-000024C4 .text lookBack__10daNpc_Tc_cFv */ void daNpc_Tc_c::lookBack() { - /* Nonmatching */ + cXyz temp6; + cXyz temp3(0.0f, 0.0f, 0.0f); + cXyz* dstPos = NULL; + s16 desiredYRot = current.angle.y; + s16 target; + if (mStatus == STATUS_TALK) { + m_jnt.setTrn(); + } + if (mStatus == STATUS_WALK_TO_JAIL || mStatus == STATUS_WAIT_NEAR_JAIL || mStatus == STATUS_SIT) { + m_jnt.setTrn(); + mHasAttention = true; + } + + if (mType == TYPE_WHITE || mType == TYPE_RED) { + if (mStatus == STATUS_WAIT) { + if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + m_jnt.onBackBoneLock(); + m_jnt.clrTrn(); + } + } else if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + m_jnt.onBackBoneLock(); + m_jnt.clrTrn(); + } else { + m_jnt.offBackBoneLock(); + m_jnt.setTrn(); + mHasAttention = true; + } + } + + if (mStatus == 8) { + m_jnt.setTrn(); + temp6 = mStoolLookPos; + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + } else if (mEventCut.getAttnFlag()) { + m_jnt.setTrn(); + temp6 = mEventCut.getAttnPos(); + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + + } else if (mHasAttention){ + temp6 = dNpc_playerEyePos(l_HIO.mNpc.m04); + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + } + + if (m_jnt.trnChk()) { + target = l_HIO.mNpc.mMaxHeadTurnVel; + + s16 temp4 = mEventCut.getTurnSpeed(); + if (temp4 != 0) { + target = temp4; + } + cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, target, 4, 0x800); + } else { + mMaxHeadTurnVelocity = 0; + } + m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp3, desiredYRot, mMaxHeadTurnVelocity, false); } /* 000024C4-00002594 .text statusWait__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWait() { - /* Nonmatching */ + if (mType == TYPE_WHITE || mType == TYPE_RED) { + JUT_ASSERT(VERSION_SELECT(0x5FE, 0x601, 0x601, 0x601), m_tower_actor != NULL); + + if (m_tower_actor->isStop()) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT04; + } else { + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + } + } + + if (mTalkingNearJail) { + mStatus = STATUS_TALK; + } else if (mHasAttention) { + mEventIdx = 2; + } } /* 00002594-000026E4 .text statusSit__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusSit() { - /* Nonmatching */ + mSmokeCallBack.end(); + calc_sitpos(); + current.pos.set(mSitPos); + gravity = 0.0f; + + if(mAnmPrmIdx != ANM_PRM_IDX_JAMP_A) { + if(dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x2C, 100.0f)) { + if (!mHasEnteredSitRadius) { + mHasEnteredSitRadius = true; + mEventIdx = 3; + mStatus = STATUS_DEMO_JUMP; + return; + } + mAnmPrmIdx = ANM_PRM_IDX_JAMP_A; + } + } + + if(mpMorf->isStop() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + speedF = l_HIO.field_0x38; + speed.y = l_HIO.field_0x40; + gravity = l_HIO.field_0x3C; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_B; + mStatus = STATUS_JUMP; + } } /* 000026E4-00002798 .text statusJump__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusJump() { - /* Nonmatching */ + if (speed.y <= 0.0f && mAnmPrmIdx == ANM_PRM_IDX_JAMP_B) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C1; + } + + if (mObjAcch.ChkGroundHit() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C1) { + speedF = 0.0f; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C2; + mJumpLandingTimer = 0x33; + return; + } + + if (cLib_calcTimer(&mJumpLandingTimer) == 0 && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C2) { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mStatus = STATUS_WALK_TO_JAIL; + } } /* 00002798-000029B0 .text statusWalkToJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWalkToJail() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + s16 angle = cLib_targetAngleY(¤t.pos, &player->current.pos); + if (mObjAcch.ChkWallHit()) { + if (mTalkingNearJail) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + + if (!mHasTalkedNearJail || l_HIO.field_0x44 != 0) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT03; + dComIfGp_event_reset(); + mStatus = STATUS_DEMO_TALK; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40) == 0) { + if (dComIfGs_getClearCount() != 0) { + mEventIdx = 6; + } else { + mEventIdx = 5; + } + } else { + mEventIdx = 7; + } + + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B40); + mHasTalkedNearJail = true; + return; + + } + mStatus = STATUS_TALK_NEAR_JAIL; + } else if (mHasAttention) { + mEventIdx = 2; + } + } + + if (mObjAcch.ChkWallHit() && std::fabsf(cM_scos(angle)) > 0.9f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + if (speedF == 0.0f) { + speedF = l_HIO.field_0x5C; + } + } + if (mObjAcch.ChkWallHit()) { + if(!dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x30, 100.0f)) { + mStatus = STATUS_WALK_TO_STOOL; + } + } } /* 000029B0-00002A20 .text statusTalkNearJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusTalkNearJail() { - /* Nonmatching */ + mTargetSpeed = 0.0f; + speedF = 0.0f; + if (talk(1) == fopMsgStts_BOX_CLOSED_e) { + mStatus = STATUS_WAIT_NEAR_JAIL; + dComIfGp_event_reset(); + mTalkingNearJail = false; + } } /* 00002A20-00002BD4 .text statusWaitNearJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWaitNearJail() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + s16 angle = cLib_targetAngleY(¤t.pos, &player->current.pos); + if (mObjAcch.ChkWallHit()) { + if (mTalkingNearJail) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + + if (!mHasTalkedNearJail || l_HIO.field_0x44 != 0) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT03; + dComIfGp_event_reset(); + mStatus = STATUS_DEMO_TALK; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40) == 0) { + mEventIdx = 5; + } else { + mEventIdx = 7; + } + + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B40); + mHasTalkedNearJail = true; + return; + + } + mStatus = STATUS_TALK_NEAR_JAIL; + } else if (mHasAttention) { + mEventIdx = 2; + } + } + + if (mObjAcch.ChkWallHit() && std::fabsf(cM_scos(angle)) > 0.9f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + if (speedF == 0.0f) { + speedF = l_HIO.field_0x5C; + } + } } /* 00002BD4-00002D80 .text statusWalkToStool__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWalkToStool() { - /* Nonmatching */ + calc_sitpos(); + if(dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x30, 100.0f)) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mStatus = STATUS_WALK_TO_JAIL; + } + + } else { + mStoolLookPos.set(mStoolPos); + cLib_targetAngleY(¤t.pos, &mWalkToStoolPos); + cLib_addCalcPosXZ2(¤t.pos, mWalkToStoolPos, 0.1f, speedF); + f32 temp = (mWalkToStoolPos - current.pos).absXZ(); + if(temp < 5.0f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + mStatus = STATUS_SIT_TO_STOOL; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + } + } } /* 00002D80-00002F94 .text statusSitToStool__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusSitToStool() { - /* Nonmatching */ + calc_sitpos(); + cLib_addCalcAngleS2(¤t.angle.y, field_0x790.y, 4, 0x800); + + if (std::fabsf(field_0x790.y - current.angle.y) < 16.0f) { + if (speed.y == 0.0f && mObjAcch.ChkGroundHit()) { + speed.y = 22.0f; + gravity = -2.5f; + } + + if (speed.y < 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT02; + } + + if (speed.y < 0.0f && current.pos.y < mSitPos.y) { + gravity = 0.0f; + speed.y = 0.0f; + current.pos.y = mSitPos.y; + } + + cLib_addCalcPosXZ2(¤t.pos, mSitPos, 0.1f, 4.0f); + f32 diff = (mSitPos - current.pos).absXZ(); + if (current.pos.y == mSitPos.y && diff < 5.0f) { + mSmokePos.set(current.pos); + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 5.0f, 20.0f); + mStatus = STATUS_SIT; + } + } } /* 00002F94-00003028 .text statusTalk__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusTalk() { - /* Nonmatching */ + if(talk(1) != fopMsgStts_BOX_CLOSED_e) { + return; + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + startTower(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + // fallthrough + case TYPE_NORMAL2: + startTower(); + // fallthrough + default: + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + mStatus = STATUS_WAIT; + dComIfGp_event_reset(); + mTalkingNearJail = false; + break; + } } /* 00003028-00003088 .text statusPayRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusPayRupee() { - /* Nonmatching */ + if(talk(1) == fopMsgStts_BOX_CLOSED_e) { + dComIfGp_event_reset(); + mEventIdx = 9; + mStatus = STATUS_DEMO_PAY_RUPEE; + } } /* 00003088-000030F8 .text statusDemoPayRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoPayRupee() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_PAY_RUPEE")) { + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000030F8-00003158 .text statusGetRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusGetRupee() { - /* Nonmatching */ + if(talk(1) == fopMsgStts_BOX_CLOSED_e) { + dComIfGp_event_reset(); + mEventIdx = 8; + mStatus = STATUS_DEMO_GET_RUPEE; + } } /* 00003158-000031CC .text statusDemoGetRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoGetRupee() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_GET_RUPEE")) { + field_0x812 = true; + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000031CC-0000322C .text statusMonumentComplete__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusMonumentComplete() { - /* Nonmatching */ + if(talk(1) == fopMsgStts_BOX_CLOSED_e) { + dComIfGp_event_reset(); + mEventIdx = 8; + mStatus = STATUS_DEMO_MONUMENT_COMPLETE; + } } /* 0000322C-000032A0 .text statusDemoMonumentComplete__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoMonumentComplete() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_GET_RUPEE")) { + field_0x813 = true; + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000032A0-00003308 .text statusDemoJump__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoJump() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_JUMP_DEMO")) { + mStatus = STATUS_WALK_TO_JAIL; + dComIfGp_event_reset(); + } } /* 00003308-00003384 .text statusDemoRescue__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoRescue() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_RESCUE")) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B80); + dComIfGp_event_reset(); + fopAcM_delete(this); + } } /* 00003384-00003430 .text statusDemoTalk__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoTalk() { - /* Nonmatching */ + if (dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL") || dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL_S") || dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL2")) { + mStatus = STATUS_WAIT_NEAR_JAIL; + dComIfGp_event_reset(); + mTalkingNearJail = false; + } } /* 00003430-00003610 .text help_action__10daNpc_Tc_cFPv */ -void daNpc_Tc_c::help_action(void*) { - /* Nonmatching */ +BOOL daNpc_Tc_c::help_action(void*) { + if (mActionStatus == ACTION_STARTING) { + mStatus = STATUS_SIT; + mActionStatus++; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + fopAcM_delete(this); + } + if (dComIfGp_evmng_endCheck("OpenDoor")) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + mEventIdx = 4; + mStatus = STATUS_DEMO_RESCUE; + return true; + } else { + s16 temp = m_jnt.getHead_y() + current.angle.y+ m_jnt.getBackbone_y(); + mHasAttention = chkAttention(current.pos, temp); + mEventIdx = 0; + switch(mStatus) { + case STATUS_WAIT: + statusWait(); + break; + case STATUS_TALK: + statusTalk(); + break; + case STATUS_SIT: + statusSit(); + break; + case STATUS_JUMP: + statusJump(); + break; + case STATUS_WALK_TO_JAIL: + statusWalkToJail(); + break; + case STATUS_TALK_NEAR_JAIL: + statusTalkNearJail(); + break; + case STATUS_WAIT_NEAR_JAIL: + statusWaitNearJail(); + break; + case STATUS_WALK_TO_STOOL: + statusWalkToStool(); + break; + case STATUS_SIT_TO_STOOL: + statusSitToStool(); + break; + case STATUS_DEMO_JUMP: + statusDemoJump(); + break; + case STATUS_DEMO_RESCUE: + statusDemoRescue(); + break; + case STATUS_DEMO_TALK: + statusDemoTalk(); + break; + } + calcMove(); + lookBack(); + setAttention(); + } + } + return true; } /* 00003610-0000374C .text wait_action__10daNpc_Tc_cFPv */ -void daNpc_Tc_c::wait_action(void*) { - /* Nonmatching */ +BOOL daNpc_Tc_c::wait_action(void*) { + if (mActionStatus == ACTION_STARTING) { + mStatus = STATUS_WAIT; + mActionStatus++; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + s16 temp = m_jnt.getHead_y() + current.angle.y+ m_jnt.getBackbone_y(); + mHasAttention = chkAttention(current.pos, temp); + mEventIdx = 0; + switch(mStatus) { + case STATUS_WAIT: + statusWait(); + break; + case STATUS_TALK: + statusTalk(); + break; + case STATUS_PAY_RUPEE: + statusPayRupee(); + break; + case STATUS_DEMO_PAY_RUPEE: + statusDemoPayRupee(); + break; + case STATUS_GET_RUPEE: + statusGetRupee(); + break; + case STATUS_DEMO_GET_RUPEE: + statusDemoGetRupee(); + break; + case STATUS_MONUMENT_COMPLETE: + statusMonumentComplete(); + break; + case STATUS_DEMO_MONUMENT_COMPLETE: + statusDemoMonumentComplete(); + break; + } + calcMove(); + lookBack(); + setAttention(); + } + return TRUE; } /* 0000374C-00003830 .text calc_sitpos__10daNpc_Tc_cFv */ void daNpc_Tc_c::calc_sitpos() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz temp3; + cXyz temp4; + + cXyz temp; + cXyz temp2; + + temp.set(0.0f, 80.0f, -25.0f); + temp3.set(0.0f, 80.0f, -25.0f); + + temp2.set(0.0f, 0.0f, -60.0f); + temp4.set(0.0f, 0.0f, -60.0f); + + s16 angle = cLib_targetAngleY(&player->current.pos, &mStoolPos); + mDoMtx_stack_c::transS(mStoolPos); + mDoMtx_stack_c::YrotM(angle); + mDoMtx_stack_c::multVec(&temp3, &mSitPos); + mDoMtx_stack_c::multVec(&temp4, &mWalkToStoolPos); } /* 00003830-000038A0 .text set_mtx__10daNpc_Tc_cFv */ void daNpc_Tc_c::set_mtx() { - /* Nonmatching */ + J3DModel* model = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000038A0-00003A40 .text _draw__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_draw() { - /* Nonmatching */ + static const int a_bmt_tbl[5] = { + -1, + TC_BMT_TCB, + TC_BMT_TCC, + TC_BMT_TCA, + -1 + }; + + static const u8 a_snap_tbl[] = { + DSNAP_TYPE_TC_NORMAL, + DSNAP_TYPE_TC_RED, + DSNAP_TYPE_TC_WHITE, + DSNAP_TYPE_TC_BLUE, + DSNAP_TYPE_TC_NORMAL, + }; + + static const u32 dummy[] = { + 0xFF000080, + 0x0000FF80, + 0xFF000080, + 0xFF000080, + 0xFF000080, + 0x00FF0080, + }; + + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* pModelData = pModel->getModelData(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + mBtpAnm.entry(pModelData, mBlinkFrame); + if (a_bmt_tbl[mType] != -1) { + J3DMaterialTable* bmt = (J3DMaterialTable*)dComIfG_getObjectRes("Tc", a_bmt_tbl[mType]); + mpMorf->entryDL(bmt); + } else { + mpMorf->entryDL(); + } + mBtpAnm.remove(pModelData); + +#if VERSION == VERSION_DEMO + dNpc_setShadowModel(mpModel, pModelData, pModel); + + cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z); + + mShadowId = dComIfGd_setRealShadow(mShadowId,1,mpModel,&shadowPos,800.0f,current.pos.y-mObjAcch.GetGroundH(),NULL); + if(mShadowId == 0){ + dComIfGd_setSimpleShadow( + ¤t.pos, + mObjAcch.GetGroundH(), + 40.0f, + dComIfG_Bgsp()->GetTriPla(mObjAcch.m_gnd)->GetNP() + ); + } +#else + cXyz shadowPos(current.pos.x, current.pos.y + 150.0f + REG8_F(18), current.pos.z); + mShadowId = dComIfGd_setShadow( + mShadowId, 1, mpMorf->getModel(), &shadowPos, REG8_F(19) + 800.0f, 20.0f, + current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex() + ); +#endif + +#if VERSION <= VERSION_JPN + dSnap_RegistFig(a_snap_tbl[mType], this, 1.0f, 1.0f, 1.0f); +#else + dSnap_RegistFig(a_snap_tbl[mType], this, current.pos, current.angle.y, 1.0f, 1.0f, 1.0f); +#endif + if (l_HIO.field_0x34 != 0) { + mEventCut.getAttnPos(); + } + return TRUE; } + /* 00003A40-00003BE0 .text setTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::setTower() { - /* Nonmatching */ + m_tower_actor = (daObjSmplbg::Act_c*)fopAcM_Search(&searchTower_CB, this); + JUT_ASSERT(VERSION_SELECT(0x8EB, 0x8E9, 0x8E9, 0x8E9), m_tower_actor != NULL); + cXyz temp; + s16 temp2; + switch(mType) { + case TYPE_WHITE: + temp = l_HIO.field_0x60; + temp2 = l_HIO.field_0x7A; + break; + case TYPE_RED: + temp = l_HIO.field_0x6C; + temp2 = l_HIO.field_0x78; + break; + + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + mDoMtx_stack_c::transS(m_tower_actor->current.pos); + mDoMtx_stack_c::ZXYrotM(m_tower_actor->shape_angle); + mDoMtx_stack_c::multVec(&temp, ¤t.pos); + + s16 temp3 = m_tower_actor->shape_angle.y + temp2; + if (m_tower_actor->isStop()) { + if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + cLib_addCalcAngleS2(¤t.angle.y, temp3, 4, 0x800); + } + } else { + current.angle.y = temp3; + } + break; + } } /* 00003BE0-00003E90 .text _execute__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_execute() { - /* Nonmatching */ + // dComIfGs_onGetCollectMap mentioned in debug? + if (mType == TYPE_WHITE || mType == TYPE_RED || mType == TYPE_NORMAL2) { + setTower(); + } + + m_jnt.setParam( + l_HIO.mNpc.mMaxBackboneX, l_HIO.mNpc.mMaxBackboneY, l_HIO.mNpc.mMinBackboneX, + l_HIO.mNpc.mMinBackboneY, l_HIO.mNpc.mMaxHeadX, l_HIO.mNpc.mMaxHeadY, + l_HIO.mNpc.mMinHeadX, l_HIO.mNpc.mMinHeadY, l_HIO.mNpc.mMaxTurnStep); + + playTexPatternAnm(); + + s8 roomNo = fopAcM_GetRoomNo(this); + u32 mtrlSndId = mObjAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd) : 0; + + field_0x798 = mpMorf->play(&eyePos, mtrlSndId, dComIfGp_getReverb(roomNo)); + mpMorf->calc(); + checkOrder(); + + (this->*mCurrActionFunc)(NULL); + + if (mStatus != STATUS_WAIT) { + if (!mEventCut.cutProc()) { + cutProc(); + } else { + if (mEventCut.getNowCut() != -1) { + switch(mEventCut.getNowCut()) { + case 2: + case 4: + if (mEventCut.getMoveSpeed() == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + } + break; + case 0: + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + break; + + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } + } + + if (!dComIfGp_event_runCheck()) { + mEventCut.setAttnNoTurnFlag(false); + mEventCut.setAttnFlag(false); + } + + eventOrder(); + setAnm(); + setTexAnm(); + + if (mStatus != STATUS_WALK_TO_STOOL) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + cXyz tempPos = current.pos; + + mObjAcch.CrrPos(*dComIfG_Bgsp()); + + mDeltaPos = current.pos - tempPos; + + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + + set_mtx(); + + if (mType == TYPE_NORMAL) { + if (mStatus == STATUS_DEMO_RESCUE) { + setCollision(60.0f, 150.0f); + } + } else { + setCollision(60.0f, 150.0f); + } + return TRUE; } /* 00003E90-00003F1C .text _delete__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Tc"); + mSmokeCallBack.remove(); + field_0x714.remove(); + field_0x728.remove(); +#if VERSION == VERSION_DEMO + if(mpMorf != NULL) { +#else + if(heap != NULL) { +#endif + mpMorf->stopZelAnime(); + } + return TRUE; } /* 00003F1C-00003F3C .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c*i_this) { + return static_cast(i_this)->_createHeap(); } /* 00003F3C-00003FC0 .text isCreate__10daNpc_Tc_cFv */ -void daNpc_Tc_c::isCreate() { - /* Nonmatching */ +bool daNpc_Tc_c::isCreate() { + switch(mType) { + case TYPE_BLUE: + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + return false; + } + break; + + case TYPE_NORMAL2: + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + return false; + } + break; + } + return true; } /* 00003FC0-00004090 .text _create__10daNpc_Tc_cFv */ cPhs_State daNpc_Tc_c::_create() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Tc"); + if(phase_state == cPhs_COMPLEATE_e) { + fopAcM_SetupActor(this, daNpc_Tc_c); + +#else + fopAcM_SetupActor(this, daNpc_Tc_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Tc"); + if(phase_state == cPhs_COMPLEATE_e) { +#endif + getArg(); + + if(!isCreate()) { + return cPhs_ERROR_e; + } + + if(!fopAcM_entrySolidHeap(this, createHeap_CB, VERSION_SELECT(0xCDA0, 0x1C80, 0x1C80, 0x1C80))) { + return cPhs_ERROR_e; + } + + cullMtx = mpMorf->getModel()->getBaseTRMtx(); + createInit(); + } + return phase_state; } +daNpc_Tc_c::daNpc_Tc_c() {} /* 000045D0-000047DC .text _createHeap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::_createHeap() { - /* Nonmatching */ +BOOL daNpc_Tc_c::_createHeap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Tc", TC_BDL_TC)); + JUT_ASSERT(VERSION_SELECT(0xA26, 0xA30, 0xA30, 0xA30), modelData != NULL); + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, NULL, + J3DFrameCtrl::EMode_NULL, 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x15021222 + ); + + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + m_jnt.setHeadJntNum(2); + + JUT_ASSERT(VERSION_SELECT(0xA36, 0xA40, 0xA40, 0xA40), m_jnt.getHeadJntNum() >= 0); + + m_jnt.setBackboneJntNum(1); + JUT_ASSERT(VERSION_SELECT(0xA38, 0xA42, 0xA42, 0xA42), m_jnt.getBackboneJntNum() >= 0); + modelData->getJointNodePointer(2)->setCallBack(nodeCallBack); + modelData->getJointNodePointer(1)->setCallBack(nodeCallBack); + mpMorf->getModel()->setUserArea(reinterpret_cast(this)); + + mTexPatternNum = 0; + if (!initTexPatternAnm(false)) { + return FALSE; + } + +#if VERSION == VERSION_DEMO + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + return mpModel != NULL ? TRUE : FALSE; +#else + return TRUE; +#endif } /* 000047DC-000047FC .text daNpc_Tc_Create__FP10fopAc_ac_c */ @@ -329,176 +1959,6 @@ static BOOL daNpc_Tc_IsDelete(daNpc_Tc_c*) { return TRUE; } -/* 00004BAC-00004E6C .text next_msgStatusNormal2__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusNormal2(unsigned long*) { - /* Nonmatching */ -} - -/* 00004E6C-00004F68 .text getMsgNormal2__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgNormal2() { - /* Nonmatching */ -} - -/* 00004F68-00004FD8 .text setRupeeSizeMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::setRupeeSizeMsg() { - /* Nonmatching */ -} - -/* 00004FD8-00005054 .text existUnknownCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existUnknownCollectMap() { - /* Nonmatching */ -} - -/* 00005054-000050DC .text analysisCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::analysisCollectMap() { - /* Nonmatching */ -} - -/* 000050DC-00005158 .text existKnownCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existKnownCollectMap() { - /* Nonmatching */ -} - -/* 00005158-000053D4 .text next_msgStatusWhite__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusWhite(unsigned long*) { - /* Nonmatching */ -} - -/* 000053D4-00005498 .text getMsgWhite__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgWhite() { - /* Nonmatching */ -} - -/* 00005498-00005720 .text next_msgStatusRed__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusRed(unsigned long*) { - /* Nonmatching */ -} - -/* 00005720-00005730 .text setFinishMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::setFinishMsg() { - /* Nonmatching */ -} - -/* 00005730-00005944 .text getMsgRed__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgRed() { - /* Nonmatching */ -} - -/* 00005944-000059A8 .text checkMonumentFee__10daNpc_Tc_cFUsUs */ -void daNpc_Tc_c::checkMonumentFee(unsigned short, unsigned short) { - /* Nonmatching */ -} - -/* 000059A8-00005A50 .text checkAllMonumentFee__10daNpc_Tc_cFv */ -void daNpc_Tc_c::checkAllMonumentFee() { - /* Nonmatching */ -} - -/* 00005A50-00005B10 .text checkAllMonumentPay__10daNpc_Tc_cFv */ -void daNpc_Tc_c::checkAllMonumentPay() { - /* Nonmatching */ -} - -/* 00005B10-00005B98 .text checkMonumentPay__10daNpc_Tc_cFUsUs */ -void daNpc_Tc_c::checkMonumentPay(unsigned short, unsigned short) { - /* Nonmatching */ -} - -/* 00005C58-00005E60 .text cutProc__10daNpc_Tc_cFv */ -void daNpc_Tc_c::cutProc() { - /* Nonmatching */ -} - -/* 00005E60-00005E6C .text cutSitToJumpStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSitToJumpStart(int) { - /* Nonmatching */ -} - -/* 00005E6C-00005FA4 .text cutSitToJumpProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSitToJumpProc(int) { - /* Nonmatching */ -} - -/* 00005FA4-00005FA8 .text cutPresentStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPresentStart(int) { - /* Nonmatching */ -} - -/* 00005FA8-00006174 .text cutPresentProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPresentProc(int) { - /* Nonmatching */ -} - -/* 00006174-000061F0 .text cutSetAnmStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSetAnmStart(int) { - /* Nonmatching */ -} - -/* 000061F0-000062A0 .text cutSetAnmProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSetAnmProc(int) { - /* Nonmatching */ -} - -/* 000062A0-000062D8 .text cutBackJumpStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutBackJumpStart(int) { - /* Nonmatching */ -} - -/* 000062D8-000063BC .text cutBackJumpProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutBackJumpProc(int) { - /* Nonmatching */ -} - -/* 000063BC-000064C8 .text cutEffectStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutEffectStart(int) { - /* Nonmatching */ -} - -/* 000064C8-000064F4 .text cutEffectProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutEffectProc(int) { - /* Nonmatching */ -} - -/* 000064F4-00006564 .text cutDoorOpenStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorOpenStart(int) { - /* Nonmatching */ -} - -/* 00006564-00006590 .text cutDoorOpenProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorOpenProc(int) { - /* Nonmatching */ -} - -/* 00006590-00006600 .text cutDoorCloseStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorCloseStart(int) { - /* Nonmatching */ -} - -/* 00006600-0000662C .text cutDoorCloseProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorCloseProc(int) { - /* Nonmatching */ -} - -/* 0000662C-0000669C .text cutDoorClose2Start__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorClose2Start(int) { - /* Nonmatching */ -} - -/* 0000669C-000066C8 .text cutDoorClose2Proc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorClose2Proc(int) { - /* Nonmatching */ -} - -/* 000066C8-000066E0 .text cutPayStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPayStart(int) { - /* Nonmatching */ -} - -/* 000066E0-0000670C .text cutPayProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPayProc(int) { - /* Nonmatching */ -} - static actor_method_class l_daNpc_Tc_Method = { (process_method_func)daNpc_Tc_Create, (process_method_func)daNpc_Tc_Delete, diff --git a/src/d/actor/d_a_npc_tc_cut.inc b/src/d/actor/d_a_npc_tc_cut.inc new file mode 100644 index 000000000..7f77bfed8 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_cut.inc @@ -0,0 +1,312 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "cut" functions +// are in a separate .text section from the rest of its functions. + +/* 00005C58-00005E60 .text cutProc__10daNpc_Tc_cFv */ +void daNpc_Tc_c::cutProc() { + static char* action_table[] = { + "SIT_TO_JUMP", + "PRESENT", + "SET_ANM", + "BACKJUMP", + "EFFECT", + "DOOR_OPEN", + "DOOR_CLOSE", + "DOOR_CLOSE2", + "PAY", + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId("Tc"); + if (staffIdx != -1) { + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), TRUE, 0); + + if (actIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(actIdx) { + case 0: + cutSitToJumpStart(staffIdx); + break; + case 1: + cutPresentStart(staffIdx); + break; + case 2: + cutSetAnmStart(staffIdx); + break; + case 3: + cutBackJumpStart(staffIdx); + break; + case 4: + cutEffectStart(staffIdx); + break; + case 5: + cutDoorOpenStart(staffIdx); + break; + case 6: + cutDoorCloseStart(staffIdx); + break; + case 7: + cutDoorClose2Start(staffIdx); + break; + case 8: + cutPayStart(staffIdx); + break; + } + } + switch(actIdx) { + case 0: + cutSitToJumpProc(staffIdx); + break; + case 1: + cutPresentProc(staffIdx); + break; + case 2: + cutSetAnmProc(staffIdx); + break; + case 3: + cutBackJumpProc(staffIdx); + break; + case 4: + cutEffectProc(staffIdx); + break; + case 5: + cutDoorOpenProc(staffIdx); + break; + case 6: + cutDoorCloseProc(staffIdx); + break; + case 7: + cutDoorClose2Proc(staffIdx); + break; + case 8: + cutPayProc(staffIdx); + } + } + } +} + +/* 00005E60-00005E6C .text cutSitToJumpStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSitToJumpStart(int) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_A; +} + +/* 00005E6C-00005FA4 .text cutSitToJumpProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSitToJumpProc(int i_staffIdx) { + if (mpMorf->isStop() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + speedF = l_HIO.field_0x38; + speed.y = l_HIO.field_0x40; + gravity = l_HIO.field_0x3C; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_B; + } + + if(speed.y <= 0.0f && mAnmPrmIdx == ANM_PRM_IDX_JAMP_B) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C1; + } + + if(mObjAcch.ChkGroundHit() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C1) { + speedF = 0.0f; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C2; + mJumpLandingTimer = 0x33; + return; + } + if (cLib_calcTimer(&mJumpLandingTimer) == 0 && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C2) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 00005FA4-00005FA8 .text cutPresentStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPresentStart(int) { +} + +/* 00005FA8-00006174 .text cutPresentProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPresentProc(int i_staffIdx) { + int* pItemType = dComIfGp_evmng_getMyIntegerP(i_staffIdx, "ItemType"); + int temp; + if(pItemType == NULL) { + temp = 0; + } else { + temp = *pItemType; + } + int itemNo; + switch(temp) { + case 0: + itemNo = dItem_TINGLE_TUNER_e; + break; + + case 1: + itemNo = dItem_COLLECT_MAP_35_e; + break; + + case 2: + if (mType == TYPE_RED) { + if (checkAllMonumentFee()) { + itemNo = TINCLE_RUPEE6; + } else { + switch (checkAllMonumentPay()) { + case 1: + itemNo = TINCLE_RUPEE1; + break; + case 2: + itemNo = TINCLE_RUPEE2; + break; + case 3: + itemNo = TINCLE_RUPEE3; + break; + case 4: + itemNo = TINCLE_RUPEE4; + break; + case 5: + itemNo = TINCLE_RUPEE5; + break; + } + } + } else if (mType == TYPE_NORMAL2) { + switch (analysisCollectMap()) { + case 1: + itemNo = TRIFORCE_MAP1; + break; + case 2: + itemNo = TRIFORCE_MAP2; + break; + case 3: + itemNo = TRIFORCE_MAP3; + break; + case 4: + itemNo = TRIFORCE_MAP4; + break; + case 5: + itemNo = TRIFORCE_MAP5; + break; + case 6: + itemNo = TRIFORCE_MAP6; + break; + case 7: + itemNo = TRIFORCE_MAP7; + break; + case 8: + itemNo = TRIFORCE_MAP8; + break; + } + } + break; + } +#if VERSION == VERSION_DEMO + fpc_ProcID itemPID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1); +#else + fpc_ProcID itemPID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, current.roomNo); +#endif + if(itemPID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemPID); + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 00006174-000061F0 .text cutSetAnmStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSetAnmStart(int i_staffIdx) { + const char* pName = dComIfGp_evmng_getMyStringP(i_staffIdx, "Name"); + if(pName != NULL && strcmp(pName, "GET") == 0) { + mAnmPrmIdx = ANM_PRM_IDX_GET; + } else { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } +} + +/* 000061F0-000062A0 .text cutSetAnmProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSetAnmProc(int i_staffIdx) { + dComIfGp_evmng_getMyStringP(i_staffIdx, "Name"); + if (mAnmPrmIdx == ANM_PRM_IDX_GET) { + dComIfGp_evmng_cutEnd(i_staffIdx); + } + if(mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 000062A0-000062D8 .text cutBackJumpStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutBackJumpStart(int) { + mTargetSpeed = 0.0f; + speedF = l_HIO.field_0x48; + speed.y = l_HIO.field_0x50; + gravity = l_HIO.field_0x4C; + mAnmPrmIdx = ANM_PRM_IDX_GUARD; +} + +/* 000062D8-000063BC .text cutBackJumpProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutBackJumpProc(int i_staffIdx) { + mSmokeCallBack.end(); + if (mObjAcch.ChkGroundLanding()) { + speedF = 0.0f; + speed.y = 0.0f; + mSmokePos.set(current.pos); + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 5.0f, 20.0f); + } else if (mObjAcch.ChkGroundHit() && speed.y == 0.0f){ + speedF = 0.0f; + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 000063BC-000064C8 .text cutEffectStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutEffectStart(int) { + // regswap for demo daNpc_Tc_c::setAnm also has a regswap with identical code + cXyz pos; + pos.x = current.pos.x; + pos.y = current.pos.y; + pos.z = current.pos.z; + + pos.y -= 80.0f; + cXyz particleScale; + + particleScale.setall(1.0f); + + JPABaseEmitter* pEmitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8152, &pos, NULL, &particleScale); + pEmitter->setGlobalParticleScale(0.62f, 0.6f); + fopAcM_seStart(this, JA_SE_CM_CMN_NOTICE, 0); + /* Nonmatching */ +} + +/* 000064C8-000064F4 .text cutEffectProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutEffectProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 000064F4-00006564 .text cutDoorOpenStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorOpenStart(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_OPEN, 0); +} + +/* 00006564-00006590 .text cutDoorOpenProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorOpenProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 00006590-00006600 .text cutDoorCloseStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorCloseStart(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_CLOSE_1, 0); +} + +/* 00006600-0000662C .text cutDoorCloseProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorCloseProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 0000662C-0000669C .text cutDoorClose2Start__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorClose2Start(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_CLOSE_2, 0); +} + +/* 0000669C-000066C8 .text cutDoorClose2Proc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorClose2Proc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 000066C8-000066E0 .text cutPayStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPayStart(int i_param) { + dComIfGp_setItemRupeeCount(-398); +} + +/* 000066E0-0000670C .text cutPayProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPayProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} diff --git a/src/d/actor/d_a_npc_tc_msg_normal2.inc b/src/d/actor/d_a_npc_tc_msg_normal2.inc new file mode 100644 index 000000000..203b5e336 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_normal2.inc @@ -0,0 +1,205 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "normal2's" functions +// are in a separate .text section from the rest of its functions. + +#include "d/actor/d_a_npc_tc.h" +#include "d/d_com_inf_game.h" + +/* 00004BAC-00004E6C .text next_msgStatusNormal2__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusNormal2(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { +#if VERSION > VERSION_JPN + case 0x38AA: + case 0x38AB: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3020)) { + *pMsgNo = 0x38AC; + } else { + *pMsgNo = 0x38AD; + } + break; + case 0x38AC: + case 0x38AD: + if (existKnownCollectMap()) { + *pMsgNo = 0xDBA; + } else { + *pMsgNo = 0xDB5; + } + break; +#endif + case 0xDB2: + case 0xDB3: + case 0xDFB: + *pMsgNo = 0xDB4; + break; + + case 0xDB4: + *pMsgNo = getMsgNormal2(); + break; + + case 0xDB5: + *pMsgNo = 0xDBA; + break; + + case 0xDBB: + *pMsgNo = 0xDBC; + break; + + case 0xDBC: + *pMsgNo = 0xDBD; + break; + + case 0xDBD: + *pMsgNo = 0xDBE; + break; + + case 0xDBE: + if (mpCurrMsg->mSelectNum == 0) { + if ((u16)dComIfGs_getRupee() >= 398) { + mStatus = STATUS_PAY_RUPEE; + field_0x80D = true; + field_0x80C = true; + msgStatus = fopMsgStts_MSG_ENDS_e; + } else { + *pMsgNo = 0xDC0; + } + } else { + *pMsgNo = 0xDBF; + } + break; + + case 0xDC0: + if (field_0x80B) { + *pMsgNo = 0xDC4; + } else { + *pMsgNo = 0xDC1; + } + break; + + case 0xDBF: + *pMsgNo = 0xDC1; + break; + + case 0xDC3: + if (mpCurrMsg->mSelectNum == 0) { + if ((u16)dComIfGs_getRupee() >= 398) { + mStatus = STATUS_PAY_RUPEE; + field_0x80D = true; + field_0x80C = true; + msgStatus = fopMsgStts_MSG_ENDS_e; + } else { + field_0x80B = true; + *pMsgNo = 0xDC0; + } + } else { + *pMsgNo = 0xDC4; + } + break; + case 0xDC4: + field_0x80D = false; + field_0x80B = false; + // fallthrough + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 00004E6C-00004F68 .text getMsgNormal2__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgNormal2() { + u32 msg; + stopTower(); + if (field_0x80D) { + if (existUnknownCollectMap()) { + msg = 0xDC3; + field_0x80D = false; + } else { + msg = 0xDC4; + + } + } else if (!field_0x808) { + field_0x808 = true; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + msg = 0xDB3; + } else { + msg = 0xDFB; + } + } else { + msg = 0xDB2; + } + } else if (existUnknownCollectMap()) { + if (!field_0x809) { + field_0x809 = true; + msg = 0xDBB; + } else { + msg = 0xDBE; + } + } else { +#if VERSION <= VERSION_JPN + if(existKnownCollectMap()) { + msg = 0xDBA; + } else { + msg = 0xDB5; + } +#else + msg = setRupeeSizeMsg(); +#endif + } + return msg; +} + +#if VERSION > VERSION_JPN +/* 00004F68-00004FD8 .text setRupeeSizeMsg__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::setRupeeSizeMsg() { + u32 msgNo = 0xDB5; + if (dComIfGs_getWalletSize() == 0) { + msgNo = 0x38AA; + } else if (dComIfGs_getWalletSize() == 1) { + msgNo = 0x38AB; + } + else if (dComIfGs_getWalletSize() == 2) { + if (existKnownCollectMap()) { + msgNo = 0xDBA; + } else { + msgNo = 0xDB5; + } + } + return msgNo; +} +#endif + +/* 00004FD8-00005054 .text existUnknownCollectMap__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::existUnknownCollectMap() { + for(int i = 1; i <= 8; i++) { + if(!dComIfGs_isCollectMapTriforce(i) && dComIfGs_isGetCollectMap(i)) { + return true; + } + } + return false; +} + +/* 00005054-000050DC .text analysisCollectMap__10daNpc_Tc_cFv */ +int daNpc_Tc_c::analysisCollectMap() { + for(int i = 1; i <= 8; i++) { + if(!dComIfGs_isCollectMapTriforce(i) && dComIfGs_isGetCollectMap(i)) { + dComIfGs_onCollectMapTriforce(i); + return i; + } + } + return 0; +} + +/* 000050DC-00005158 .text existKnownCollectMap__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::existKnownCollectMap() { + for(int i = 1; i <= 8; i++) { + if(dComIfGs_isGetCollectMap(i) && dComIfGs_isCollectMapTriforce(i)) { + return true; + } + } + return false; +} diff --git a/src/d/actor/d_a_npc_tc_msg_red.inc b/src/d/actor/d_a_npc_tc_msg_red.inc new file mode 100644 index 000000000..fdb39f569 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_red.inc @@ -0,0 +1,251 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "red's" functions +// are in a separate .text section from the rest of its functions. + +#include "d/actor/d_a_npc_tc.h" +#include "d/d_com_inf_game.h" + +/* 00005498-00005720 .text next_msgStatusRed__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusRed(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch(*pMsgNo) { + case 0xDB7: + case 0xDE1: + *pMsgNo = 0xDE2; + break; + + case 0xDE2: + if (dComIfGs_getClearCount() != 0) { + *pMsgNo = 0xDB8; + } else { + *pMsgNo = 0xDE3; + } + break; + case 0xDB8: + case 0xDE3: + *pMsgNo = 0xDE4; + break; + case 0xDE4: + *pMsgNo = setFinishMsg(); + break; + case 0xDE5: + *pMsgNo = setFinishMsg(); + break; + case 0xDE6: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + *pMsgNo = 0xDEB; + } else { + *pMsgNo = 0xDE7; + } + field_0x814 = true; + break; + case 0xDEB: + if (field_0x814) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + *pMsgNo = 0xDEC; + } else { + *pMsgNo = setFinishMsg(); + } + } else { + *pMsgNo = setFinishMsg(); + } + break; + case 0xDEC: + *pMsgNo = 0xDED; + break; + case 0xDED: + *pMsgNo = setFinishMsg(); + break; + case 0xDE7: + *pMsgNo = 0xDE8; + break; + case 0xDE8: + *pMsgNo = 0xDE9; + break; + case 0xDE9: + *pMsgNo = 0xDEA; + break; + case 0xDEA: + *pMsgNo = setFinishMsg(); + break; + case 0xDEE: + *pMsgNo = 0xDEF; + break; + case 0xDEF: + mStatus = STATUS_GET_RUPEE; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDF1: + *pMsgNo = 0xDF2; + break; + case 0xDF2: + mStatus = STATUS_MONUMENT_COMPLETE; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDF3: + *pMsgNo = 0xDF4; + break; + case 0xDF4: + *pMsgNo = 0xDF5; + break; + case 0xDF5: + *pMsgNo = setFinishMsg(); + break; + case 0xDF0: + *pMsgNo = setFinishMsg(); + break; + case 0xDC7: + m_jnt.onHeadLock(); + msgStatus = fopMsgStts_MSG_ENDS_e; + field_0x814 = false; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 00005720-00005730 .text setFinishMsg__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::setFinishMsg() { + m_jnt.onHeadLock(); + return 0xDC7; +} + +/* 00005730-00005944 .text getMsgRed__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgRed() { + stopTower(); + if (field_0x813) { + field_0x813 = false; + return 0xDF3; + } + + if (field_0x812) { + field_0x812 = false; + switch(checkAllMonumentFee()) { // fake? + default: + return 0xDF1; + case false: + return 0xDF0; + } + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + + if (!field_0x810) { + field_0x810 = true; +#if VERSION == VERSION_DEMO + if(checkAllMonumentFee() || !checkOneMonumentGet()) { + return 0xDE6; + } + return 0xDEE; +#else + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1240)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D08)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D04)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF)&& !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D02)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D01)) { + return 0xDEE; + } + return 0xDE6; +#endif + } + + switch(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { // fake? + default: + return 0xDEB; + case false: + return 0xDEA; + + } + } + + if (dComIfGs_getClearCount() != 0) { + return setFirstMsg(&field_0x811, 0xDB7U, 0xDE5); + } + return setFirstMsg(&field_0x811, 0xDE1U, 0xDE5); +} + +/* 00005944-000059A8 .text checkMonumentFee__10daNpc_Tc_cFUsUs */ +bool daNpc_Tc_c::checkMonumentFee(u16 i_stageNo, u16 i_eventId) { + if (dComIfGs_isStageTbox(i_stageNo, 0xf)) { + return dComIfGs_isEventBit(i_eventId); + } + return false; +} + +/* 000059A8-00005A50 .text checkAllMonumentFee__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::checkAllMonumentFee() { + if(checkMonumentFee(dSv_save_c::STAGE_DRC, dSv_event_flag_c::UNK_1240) && + checkMonumentFee(dSv_save_c::STAGE_FW, dSv_event_flag_c::UNK_1D08) && + checkMonumentFee(dSv_save_c::STAGE_TOTG, dSv_event_flag_c::UNK_1D04) && + checkMonumentFee(dSv_save_c::STAGE_WT, dSv_event_flag_c::UNK_1D02) && + checkMonumentFee(dSv_save_c::STAGE_ET, dSv_event_flag_c::UNK_1D01)) { + return true; + } + return false; +} + +#if VERSION == VERSION_DEMO +bool daNpc_Tc_c::checkOneMonumentGet() { + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xf)) { + return true; + } + return false; +} +#endif +/* 00005A50-00005B10 .text checkAllMonumentPay__10daNpc_Tc_cFv */ +int daNpc_Tc_c::checkAllMonumentPay() { + int amountOfMonumentsPaid = 0; + if(checkMonumentPay(dSv_save_c::STAGE_DRC, dSv_event_flag_c::UNK_1240)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_FW, dSv_event_flag_c::UNK_1D08)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_TOTG, dSv_event_flag_c::UNK_1D04)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_WT, dSv_event_flag_c::UNK_1D02)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_ET, dSv_event_flag_c::UNK_1D01)) { + amountOfMonumentsPaid++; + } + return amountOfMonumentsPaid; +} + +/* 00005B10-00005B98 .text checkMonumentPay__10daNpc_Tc_cFUsUs */ +bool daNpc_Tc_c::checkMonumentPay(u16 i_stageNo, u16 i_eventId) { + if(dComIfGs_isEventBit(i_eventId)) { + return false; + } + if(dComIfGs_isStageTbox(i_stageNo, 0xF)) { + dComIfGs_onEventBit(i_eventId); + return true; + } + return false; +} diff --git a/src/d/actor/d_a_npc_tc_msg_white.inc b/src/d/actor/d_a_npc_tc_msg_white.inc new file mode 100644 index 000000000..df6359f48 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_white.inc @@ -0,0 +1,134 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "white's" functions +// are in a separate .text section from the rest of its functions. + +#include "d/actor/d_a_npc_tc.h" +#include "d/d_com_inf_game.h" + +/* 00005158-000053D4 .text next_msgStatusWhite__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusWhite(u32* pMsgNo) { + m_jnt.offHeadLock(); + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { + case 0xDC5: + *pMsgNo = 0xDC6; + break; + case 0xDC6: + *pMsgNo = setFinishMsg(); + break; + case 0xDC8: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + if (!field_0x80E) { + field_0x80E = true; + *pMsgNo = 0xDD7; + } + } else if (!field_0x80F) { + field_0x80F = true; + *pMsgNo = 0xDC9; + } + break; + case 0xDD7: + *pMsgNo = 0xDD8; + break; + case 0xDD8: + *pMsgNo = setFinishMsg(); + break; + case 0xDC9: + if (mpCurrMsg->mSelectNum == 0) { + *pMsgNo = 0xDCA; + } else { + *pMsgNo = 0xDD3; + } + break; + case 0xDCA: + *pMsgNo = 0xDCB; + break; + case 0xDCB: + *pMsgNo = 0xDCC; + break; + case 0xDCC: + *pMsgNo = 0xDCD; + break; + case 0xDCD: + *pMsgNo = 0xDCE; + break; + case 0xDCE: + *pMsgNo = 0xDCF; + break; + case 0xDCF: + *pMsgNo = 0xDD0; + break; + case 0xDD0: + *pMsgNo = 0xDD1; + break; + case 0xDD1: + *pMsgNo = 0xDD2; + break; + case 0xDD2: + *pMsgNo = setFinishMsg(); + break; + case 0xDD3: + *pMsgNo = 0xDD4; + break; + case 0xDD4: + *pMsgNo = 0xDD5; + break; + case 0xDD5: + *pMsgNo = setFinishMsg(); + break; + case 0xDC7: + m_jnt.onHeadLock(); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDD9: + *pMsgNo = 0xDDA; + break; + case 0xDDA: + if (existTcMonument()) { + *pMsgNo = setFinishMsg(); + } else { + *pMsgNo = 0xDDB; + } + break; + case 0xDDB: + *pMsgNo = 0xDDC; + break; + case 0xDDC: + *pMsgNo = setFinishMsg(); + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 000053D4-00005498 .text getMsgWhite__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgWhite() { + u32 msg; + stopTower(); + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + msg = 0xDD9; + m_jnt.onHeadLock(); + + } else { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + if (!field_0x80E) { + msg = 0xDC8; + m_jnt.onHeadLock(); + } else { + msg = 0xDD6; + } + } else if (!field_0x80F) { + msg = 0xDC8; + m_jnt.onHeadLock(); + } else { + msg = 0xDC5; + m_jnt.onHeadLock(); + } + } + return msg; +} diff --git a/src/d/actor/d_a_obj_auzu.cpp b/src/d/actor/d_a_obj_auzu.cpp index 361e03dfe..06c4e122a 100644 --- a/src/d/actor/d_a_obj_auzu.cpp +++ b/src/d/actor/d_a_obj_auzu.cpp @@ -5,72 +5,285 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_auzu.h" +#include "d/actor/d_a_kytag01.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_ship.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_auzu.h" + +namespace daObjAuzu { +namespace { +f32 L_radius = 2500.0f; +}; + +const char Act_c::M_arcname[] = "Auzu"; +const Attr_c Act_c::M_attr[2] = { + { + /* mRadiusMult */ 1.5f, + /* mOuterActivationMult */ 1.5f, + /* mInnerActivationMult */ 1.3f, + /* mAnmSpeed */ 0.5f + }, + { + /* mRadiusMult */ 2.0f, + /* mOuterActivationMult */ 2.0f, + /* mInnerActivationMult */ 2.0f, + /* mAnmSpeed */ 1.0f + } +}; +}; /* 00000078-0000009C .text solidHeapCB__Q29daObjAuzu5Act_cFP10fopAc_ac_c */ -void daObjAuzu::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjAuzu::Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((Act_c*)i_this)->create_heap(); } /* 0000009C-000001F8 .text create_heap__Q29daObjAuzu5Act_cFv */ -void daObjAuzu::Act_c::create_heap() { - /* Nonmatching */ +bool daObjAuzu::Act_c::create_heap() { + bool create_result = false; + J3DModelData* mdl_data = static_cast(dComIfG_getObjectRes(M_arcname, AUZU_BDL_AUZU)); + JUT_ASSERT(226, mdl_data != NULL); + mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, 0x11000222); + + J3DAnmTextureSRTKey* btk_data = static_cast(dComIfG_getObjectRes(M_arcname, AUZU_BTK_AUZU)); + JUT_ASSERT(236, btk_data != NULL); + + int init_result = mBtkAnm.init( + mdl_data, btk_data, TRUE, + J3DFrameCtrl::EMode_LOOP, attr().mAnmSpeed, + 0, -1, false, FALSE + ); + + if (mpModel && init_result != 0) { + create_result = true; + } + + return create_result; } /* 000001F8-000003B8 .text _create__Q29daObjAuzu5Act_cFv */ cPhs_State daObjAuzu::Act_c::_create() { - /* Nonmatching */ + cPhs_State state = cPhs_ERROR_e; + mType = prm_get_type(); + fopAcM_SetupActor(this, daObjAuzu::Act_c); + + mbIsExist = is_exist(); + if (mbIsExist != 0) { + state = dComIfG_resLoad(&mPhs, M_arcname); + if (state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, solidHeapCB, 3456)) { + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + f32 cull_xz = attr().mRadiusMult * 3000.0f; + fopAcM_setCullSizeBox(this, + -cull_xz, -30.0f, -cull_xz, + cull_xz, 30.0f, cull_xz + ); + mbToAppear = false; + + if (prm_get_appear() == 1) { + mScaleAnimFactor = 0.0f; + } else { + if (fopAcM_isSwitch(this, prm_get_swSave())) { + mScaleAnimFactor = 0.0f; + } else { + mScaleAnimFactor = 1.0f; + } + } + + mbBgmStarted = false; + mKytagPcId = fpcM_ERROR_PROCESS_ID_e; + set_state_map(); + } else { + state = cPhs_ERROR_e; + } + } + } + + return state; } /* 0000045C-00000498 .text _delete__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_delete() { - /* Nonmatching */ + if (mbIsExist != 0) { + dComIfG_resDeleteDemo(&mPhs, M_arcname); + } + return true; } /* 00000498-000004E8 .text is_exist__Q29daObjAuzu5Act_cCFv */ -void daObjAuzu::Act_c::is_exist() const { - /* Nonmatching */ +bool daObjAuzu::Act_c::is_exist() const { + if (mType == 0) { + return dComIfGs_isEventBit(dSv_event_flag_c::ENDLESS_NIGHT); + } + return true; } /* 000004E8-00000554 .text set_mtx__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000554-000005B8 .text init_mtx__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale( + cXyz( + scale.x * attr().mRadiusMult, + scale.y, + scale.z * attr().mRadiusMult + ) + ); + set_mtx(); } /* 000005B8-00000624 .text set_state_map__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::set_state_map() { - /* Nonmatching */ + if (prm_get_appear() != 1) { + if (is_appear()) { + fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); + } else { + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); + } + } } /* 00000624-00000788 .text ship_whirl__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::ship_whirl() { - /* Nonmatching */ + daShip_c* ship_p = dComIfGp_getShipActor(); + if (ship_p && fopAcM_GetName(ship_p) == PROC_SHIP) { + f32 sqr_mag_xz = fopAcM_searchActorDistanceXZ2(this, ship_p); +#if VERSION > VERSION_DEMO + f32 inner_activation = (daObjAuzu::L_radius * attr().mInnerActivationMult) * + (daObjAuzu::L_radius * attr().mInnerActivationMult); + + f32 outer_activation = (daObjAuzu::L_radius * attr().mOuterActivationMult) * + (daObjAuzu::L_radius * attr().mOuterActivationMult); +#else + f32 outer_activation = (daObjAuzu::L_radius * attr().mOuterActivationMult) * + (daObjAuzu::L_radius * attr().mOuterActivationMult); + + f32 inner_activation = (daObjAuzu::L_radius * attr().mInnerActivationMult) * + (daObjAuzu::L_radius * attr().mInnerActivationMult); +#endif + if (sqr_mag_xz < outer_activation) { + if (mScaleAnimFactor > 0.01f) { + bgm_start(); + if (sqr_mag_xz < inner_activation) { + ship_p->onWhirlFlg(fopAcM_GetID(this), prm_get_linkID()); + } else { + ship_p->onWhirlFlgDirect(fopAcM_GetID(this), prm_get_linkID()); + } + } else { + ship_p->offWhirlFlg(); + } + } + } } /* 00000788-000007DC .text bgm_start__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::bgm_start() { - /* Nonmatching */ + if (mType == 0 && !mbBgmStarted) { + mbBgmStarted = true; + mDoAud_subBgmStart(JA_BGM_DIOCTA_BATTLE); + } } /* 000007DC-00000AF8 .text _execute__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_execute() { - /* Nonmatching */ + f32 scale_target; +#if VERSION > VERSION_JPN + set_mtx(); +#endif + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { + ship_whirl(); + } else { + if (DEMO_SELECT(true, mScaleAnimFactor > 0.01f)) { + daPy_lk_c* link_p = daPy_getPlayerLinkActorClass(); + fopAcM_searchActorDistanceXZ2(this, daPy_getPlayerLinkActorClass()); + if ( + fopAcM_searchActorDistanceXZ2(this, link_p) < + ((daObjAuzu::L_radius * attr().mOuterActivationMult) * + (daObjAuzu::L_radius * attr().mOuterActivationMult)) + ) { + link_p->setWhirlId(fopAcM_GetID(this)); + } + } + } + + mBtkAnm.play(); + + if (prm_get_appear() == 1) { + if (mbToAppear) { + scale_target = 1.0f; + } else { + scale_target = 0.0f; + } + } else { + if (fopAcM_isSwitch(this, prm_get_swSave())) { + scale_target = 0.0f; + } else { + scale_target = 1.0f; + } + } + + cLib_chaseF(&mScaleAnimFactor, scale_target, 0.02f); + s8 param = s8(100.0f * mScaleAnimFactor); + fopAcM_seStart(this, JA_SE_ATM_SWIRL, param); + + if (mScaleAnimFactor > 0.0f && fpcM_IsErrorID(mKytagPcId)) { + cXyz scaleXZ; + scaleXZ.x = (mScaleAnimFactor * (daObjAuzu::L_radius * attr().mRadiusMult)) / 5000.0f; + scaleXZ.z = (mScaleAnimFactor * ((daObjAuzu::L_radius + 500.0f) * attr().mRadiusMult)) / 5000.0f; + mKytagPcId = fopAcM_create( + PROC_KYTAG01, -1, ¤t.pos, + tevStr.mRoomNo, ¤t.angle, &scaleXZ + ); + } else if (mScaleAnimFactor > 0.0f && fpcM_IsErrorID(mKytagPcId) == FALSE) { + kytag01_class* kytag01_p = (kytag01_class *) fopAcM_SearchByID(mKytagPcId); + if (kytag01_p){ + kytag01_p->mWaveInfo.mInnerRadius = mScaleAnimFactor * (daObjAuzu::L_radius * attr().mRadiusMult); + kytag01_p->mWaveInfo.mOuterRadius = mScaleAnimFactor * ((daObjAuzu::L_radius + 500.0f) * attr().mRadiusMult); + } + } else if (mScaleAnimFactor == 0.0f && fpcM_IsErrorID(mKytagPcId) == FALSE) { + kytag01_class* kytag01_p = (kytag01_class *) fopAcM_SearchByID(mKytagPcId); + if (kytag01_p){ + fopAcM_delete(kytag01_p); + } + } + + set_state_map(); + return true; } /* 00000AF8-00000B88 .text set_material__Q29daObjAuzu5Act_cFP11J3DMaterialUc */ -void daObjAuzu::Act_c::set_material(J3DMaterial*, unsigned char) { - /* Nonmatching */ +void daObjAuzu::Act_c::set_material(J3DMaterial* i_materialP, u8 i_alphaVal) { + while (i_materialP != NULL) { + if (i_alphaVal == 0) { + i_materialP->getShape()->hide(); + } else { + i_materialP->getShape()->show(); + i_materialP->getTevKColor(3)->mColor.a = i_alphaVal; + } + i_materialP = i_materialP->getNext(); + } } /* 00000B88-00000C38 .text _draw__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mBtkAnm.entry(mpModel->getModelData()); + J3DModelData* model_data_p = mpModel->getModelData(); + u8 alpha = u8(mScaleAnimFactor * 255.5f) & 0xFF; + set_material( + model_data_p->getJointNodePointer(0)->getMesh(), + alpha + ); + mDoExt_modelUpdateDL(mpModel); + return true; } namespace daObjAuzu { diff --git a/src/d/actor/d_a_obj_mkie.cpp b/src/d/actor/d_a_obj_mkie.cpp index c6381b8da..674d7079f 100644 --- a/src/d/actor/d_a_obj_mkie.cpp +++ b/src/d/actor/d_a_obj_mkie.cpp @@ -1,121 +1,442 @@ -// -// Generated by dtk -// Translation Unit: d_a_obj_mkie.cpp -// +/** + * d_a_obj_mkie.cpp + * Elephant statue in Earth Temple, that dissolves when hit with light. + */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_mkie.h" +#include "d/res/res_mkieb.h" #include "d/d_procname.h" #include "d/d_priority.h" +Mtx daObjMkie::Act_c::M_tmp_mtx; +const char daObjMkie::Act_c::M_arcname[] = "MkieB"; +const dCcD_SrcTri daObjMkie::Act_c::M_tri_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_LIGHT, + /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_ShieldFrontRange_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGTriS + {{ + /* a */ {0.0f, 0.0f, 0.0f}, + /* b */ {0.0f, 0.0f, 0.0f}, + /* c */ {0.0f, 0.0f, 0.0f}, + }}, +}; +const daObjMkie::Act_c::Attr_c daObjMkie::Act_c::M_attr[2] = { + { + "MkieB_die", + 1.0f, + { + { + {-30.0f, 190.0f, 40.0f}, + {-65.0f, 50.0f, 75.0f}, + {65.0f, 50.0f, 75.0f}, + }, + { + {-30.0f, 190.0f, 40.0f}, + {65.0f, 50.0f, 75.0f}, + {30.0f, 190.0f, 40.0f}, + }, + { + {38.0f, 190.0f, 20.0f}, + {75.0f, 50.0f, 65.0f}, + {75.0f, 50.0f, -65.0f}, + }, + { + {38.0f, 190.0f, 20.0f}, + {75.0f, 50.0f, -65.0f}, + {38.0f, 190.0f, -40.0f}, + }, + { + {30.0f, 190.0f, -60.0f}, + {65.0f, 50.0f, -75.0f}, + {-65.0f, 50.0f, -75.0f}, + }, + { + {30.0f, 190.0f, -60.0f}, + {-65.0f, 50.0f, -75.0f}, + {-30.0f, 190.0f, -60.0f}, + }, + { + {-38.0f, 190.0f, -40.0f}, + {-75.0f, 50.0f, -65.0f}, + {-75.0f, 50.0f, 65.0f}, + }, + {{-38.0f, 190.0f, -40.0f}, {-75.0f, 50.0f, 65.0f}, {-38.0f, 190.0f, 20.0f}}, + }, + }, + {"MkieBAB_die", + 3.0f, + {{ + {-90.0f, 570.0f, 170.0f}, + {-195.0f, 150.0f, 225.0f}, + {195.0f, 150.0f, 225.0f}, + }, + { + {-90.0f, 570.0f, 170.0f}, + {195.0f, 150.0f, 225.0f}, + {90.0f, 570.0f, 170.0f}, + }, + { + {120.0f, 570.0f, 60.0f}, + {225.f, 150.0f, 195.0f}, + {225.0f, 150.0f, -195.0f}, + }, + { + {120.0f, 570.0f, 60.0f}, + {225.0f, 150.0f, -195.0f}, + {120.0f, 570.0f, -120.0f}, + }, + { + {90.0f, 570.0f, -180.0f}, + {195.0f, 150.0f, -225.0f}, + {-195.0f, 150.0f, -225.0f}, + }, + { + {90.0f, 570.0f, -180.0f}, + {-195.0f, 150.0f, -225.0f}, + {-90.0f, 570.0f, -180.0f}, + }, + { + {-120.0f, 570.0f, -120.0f}, + {-225.0f, 150.0f, -195.0f}, + {-225.0f, 150.0f, 195.0f}, + }, + {{-120.0f, 570.0f, -120.0f}, {-225.0f, 150.0f, 195.0f}, {-120.0f, 570.0f, 60.0f}}}} +}; + /* 00000078-00000250 .text CreateHeap__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEB_BDL_MKIEB); + JUT_ASSERT(0x192, model_data != NULL); + mModelBase = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022); + + J3DModelData* model_data_van = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEB_BDL_YLSMF00); + JUT_ASSERT(0x19b, model_data_van != NULL); + mModelVan = mDoExt_J3DModel__create(model_data_van, 0x80000, 0x11000022); + + J3DAnmTevRegKey* brk_van = (J3DAnmTevRegKey*)dComIfG_getObjectRes(M_arcname, MKIEB_BRK_YLSMF00); + JUT_ASSERT(0x1a5, brk_van != NULL); + int init = mBrkVan.init(model_data_van, brk_van, true, 0, 1.0f, 0, -1, false, 0); + + bool ret = false; + if (mModelBase != NULL && mModelVan != NULL && init != 0) { + ret = true; + } + return ret; } /* 00000250-000002EC .text init_cc__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_cc() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + mStts[i].Init(0xff, 0xff, this); + mTri[i].Set(M_tri_src); + mTri[i].SetStts(&mStts[i]); + mTri[i].OnTgNoHitMark(); + } + set_cc_pos(); } /* 000002EC-00000420 .text set_cc_pos__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_cc_pos() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + Vec src[3]; + Vec dst[3]; + src[0] = M_attr[mType].table[i][0]; + src[1] = M_attr[mType].table[i][1]; + src[2] = M_attr[mType].table[i][2]; + mDoMtx_multVecArray(mModelBase->getBaseTRMtx(), src, dst, 3); + mTri[i].setPos(&dst[0], &dst[1], &dst[2]); + } } /* 00000420-00000568 .text Create__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Create() { - /* Nonmatching */ + fopAcM_SetMtx(this, mModelBase->getBaseTRMtx()); + init_mtx(); + { + const Attr_c* mAttrPtr = M_attr + mType; + float initialScale = mAttrPtr->mScale; + fopAcM_setCullSizeBox( + this, initialScale * -80.0f, initialScale * -1.0f, initialScale * -80.0f, initialScale * 80.0f, initialScale * 230.0f, initialScale * 80.0f + ); + } + init_cc(); + + if (daObj::PrmAbstract(this, PRM_FLAG_W, PRM_FLAG_S) != 0) { + actor_status &= ~0x3F; + gbaName = 0; + } + + mCcInit = false; + mBaseAnmPlaying = false; + + { + const Attr_c* mAttrPtr = M_attr + mType; + attention_info.position.y = current.pos.y + mAttrPtr->mScale * 130.0f; + } + eyePos = attention_info.position; + mEvtIdx = dComIfGp_evmng_getEventIdx(M_attr[mType].name, prm_get_evId()); + return true; } /* 00000568-00000754 .text Mthd_Create__Q29daObjMkie5Act_cFv */ cPhs_State daObjMkie::Act_c::Mthd_Create() { - /* Nonmatching */ + cPhs_State phase_state = cPhs_ERROR_e; + fopAcM_SetupActor(this, daObjMkie::Act_c); + mSwitch = !fopAcM_isSwitch(this, prm_get_swSave()); + if (mSwitch && (phase_state = dComIfG_resLoad(&mPhs, M_arcname), phase_state == cPhs_COMPLEATE_e)) { + mType = prm_get_type(); + const Attr_c* mAttrPtr = M_attr + mType; + float initialScale = mAttrPtr->mScale; + scale.setall(initialScale); + phase_state = MoveBGCreate(M_arcname, MKIEB_DZB_MKIEB, dBgS_MoveBGProc_Trans, 0x1b20); + JUT_ASSERT(0x216, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + return phase_state; } /* 00000BF0-00000BF8 .text Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Delete() { - /* Nonmatching */ + return true; } /* 00000BF8-00000C54 .text Mthd_Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Mthd_Delete() { - /* Nonmatching */ + BOOL ret = true; + if (mSwitch != false) { + ret = MoveBGDelete(); + dComIfG_resDelete(&mPhs, M_arcname); + } + return ret; } /* 00000C54-00000CF8 .text set_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mModelBase->setBaseTRMtx(mDoMtx_stack_c::get()); + mModelVan->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::scaleM(scale); + cMtx_copy(mDoMtx_stack_c::now, M_tmp_mtx); } /* 00000CF8-00000D50 .text init_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_mtx() { - /* Nonmatching */ + mModelBase->setBaseScale(scale); + mModelVan->setBaseScale(scale); + set_mtx(); } /* 00000D50-00000DF4 .text chk_light__Q29daObjMkie5Act_cFv */ -void daObjMkie::Act_c::chk_light() { - /* Nonmatching */ +BOOL daObjMkie::Act_c::chk_light() { + BOOL ret = false; + + if (dComIfGp_getDetect().chk_light(&eyePos)) { + ret = true; + } else { + for (int i = 0; i < 8; i++) { + if (mTri[i].ChkTgHit()) { + mTri[i].ClrTgHit(); + ret = true; + } + } + } + return ret; } /* 00000DF4-00000E84 .text eff_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::eff_break() { - /* Nonmatching */ + _GXColor envColor; + envColor.r = (u8)tevStr.mColorC0.r; + envColor.g = (u8)tevStr.mColorC0.g; + envColor.b = (u8)tevStr.mColorC0.b; + envColor.a = (u8)tevStr.mColorC0.a; + + dComIfGp_particle_set(dPa_name::ID_SCENE_81A0, ¤t.pos, &shape_angle, &scale, 0xff, NULL, -1, &tevStr.mColorK0, &envColor, NULL); } /* 00000E84-00000EF4 .text sound_melt__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_melt() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_L_OBJ_BRK_TAME, 0); } /* 00000EF4-00000F7C .text sound_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_break() { - /* Nonmatching */ + static const u32 se_break[] = { + JA_SE_OBJ_L_STATUE_BREAK, + JA_SE_OBJ_L_STATUE_L_BREAK, + }; + fopAcM_seStart(this, se_break[mType], 0); } /* 00000F7C-00000FD0 .text vib_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::vib_break() { - /* Nonmatching */ + dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } /* 00000FD0-00001094 .text mode_wait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_wait() { - /* Nonmatching */ + if (chk_light() & 0xff) { + mLightCnt += 1; + } else { + mLightCnt = 0; + } + + if (mLightCnt > 20) { + mode_demoWait_init(); + } else { + if (mCcInit != false) { + set_cc_pos(); + } + if (!fopAcM_cullingCheck(this)) { + for (int i = 0; i < 8; i++) { + dComIfG_Ccsp()->Set(&mTri[i]); + } + } + } } /* 00001094-000010A8 .text mode_demoWait_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait_init() { - /* Nonmatching */ + mEvtPlaying = false; + mModeProc = 1; } /* 000010A8-00001168 .text mode_demoWait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait() { - /* Nonmatching */ + bool demo = false; + + if (dComIfGp_evmng_existence(mEvtIdx)) { + if (eventInfo.checkCommandDemoAccrpt()) { + demo = true; + mEvtPlaying = true; + } else { + fopAcM_orderOtherEventId(this, mEvtIdx, prm_get_evId()); + eventInfo.onCondition(2); + } + } else { + demo = true; + } + + if (demo) { + mode_demo_init(); + } } /* 00001168-000011FC .text mode_demo_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo_init() { - /* Nonmatching */ + mModeProc = 2; + mState = 10; + if (!prm_get_correct()) { + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + mBroken = false; + mBaseAnmPlaying = false; } /* 000011FC-00001338 .text mode_demo__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo() { - /* Nonmatching */ + if (mState > 0 && (mState -= 1, mState == 0)) { + eff_break(); + sound_melt(); + fopAcM_onSwitch(this, prm_get_swSave()); + } + + if (mState == 0) { + mBaseAnmPlaying = mBrkVan.play(); + if (!mBroken && mBaseAnmPlaying) { + sound_break(); + vib_break(); + mBroken = true; + } + } + + if (mEvtPlaying && dComIfGp_evmng_endCheck(mEvtIdx)) { + dComIfGp_event_reset(); + mEvtPlaying = false; + } + + if (!mEvtPlaying && mState == 0 && mBaseAnmPlaying) { + mStatueDelete = true; + } } /* 00001338-000013DC .text mode_proc_call__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_proc_call() { - /* Nonmatching */ + static void (Act_c::* mode_proc[])() = { + &Act_c::mode_wait, + &Act_c::mode_demoWait, + &Act_c::mode_demo, + }; + + (this->*mode_proc[mModeProc])(); } /* 000013DC-000014A0 .text Execute__Q29daObjMkie5Act_cFPPA3_A4_f */ -BOOL daObjMkie::Act_c::Execute(Mtx**) { - /* Nonmatching */ +BOOL daObjMkie::Act_c::Execute(Mtx** pMtx) { + attention_info.position.x = current.pos.x; + const Attr_c* mAttrPtr = M_attr + mType; + attention_info.position.y = current.pos.y + mAttrPtr->mScale * 130.0f; + attention_info.position.z = current.pos.z; + + eyePos = attention_info.position; + mode_proc_call(); + if (mStatueDelete) { + fopAcM_delete(this); + } + mCcInit = false; + set_mtx(); + *pMtx = &M_tmp_mtx; + return true; } /* 000014A0-000015B8 .text Draw__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Draw() { - /* Nonmatching */ + if (!mBaseAnmPlaying) { + bool flagVan = false; + if (mModeProc == 2) { + if (mState == 0) { + flagVan = true; + } + } + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + if (flagVan) { + g_env_light.setLightTevColorType(mModelVan, &tevStr); + J3DModelData* modelData = mModelVan->getModelData(); + mBrkVan.entry(modelData, mBrkVan.getFrame()); + } else { + g_env_light.setLightTevColorType(mModelBase, &tevStr); + } + + dComIfGd_setListBG(); + if (flagVan) { + mDoExt_modelUpdateDL(mModelVan); + } else { + mDoExt_modelUpdateDL(mModelBase); + } + dComIfGd_setList(); + } + + return true; } namespace daObjMkie { @@ -137,7 +458,7 @@ BOOL Mthd_Execute(void* i_this) { /* 00001618-00001644 .text Mthd_Draw__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { - return ((daObjMkie::Act_c*)i_this)->Draw(); + return ((daObjMkie::Act_c*)i_this)->MoveBGDraw(); } /* 00001644-00001670 .text Mthd_IsDelete__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ diff --git a/src/d/actor/d_a_obj_smplbg.cpp b/src/d/actor/d_a_obj_smplbg.cpp index 7e45302b0..18e880a2d 100644 --- a/src/d/actor/d_a_obj_smplbg.cpp +++ b/src/d/actor/d_a_obj_smplbg.cpp @@ -99,7 +99,7 @@ void daObjSmplbg::Act_c::init_mtx() { /* 00000594-0000061C .text exec_qtkhd__Q211daObjSmplbg5Act_cFv */ void daObjSmplbg::Act_c::exec_qtkhd() { - if(field_0x2D8 == 0){ + if(!mIsStop) { shape_angle.y += 0x5b; fopAcM_seStart(this, JA_SE_OBJ_TC_TOWER_ROUND, 0); } diff --git a/src/d/actor/d_a_player_boomerang.inc b/src/d/actor/d_a_player_boomerang.inc index 6849cd812..7792e9ef9 100644 --- a/src/d/actor/d_a_player_boomerang.inc +++ b/src/d/actor/d_a_player_boomerang.inc @@ -24,7 +24,7 @@ BOOL daPy_lk_c::checkBoomerangAnime() const { void daPy_lk_c::throwBoomerang() { daBoomerang_c* boomerang = (daBoomerang_c*)mActorKeepEquip.getActor(); - fopAcM_SetParam(boomerang, 1); + fopAcM_SetParam(boomerang, daBoomerang_c::Mode_Throw); if (mpAttnActorLockOn != NULL) { boomerang->setAimActor(mpAttnActorLockOn); } @@ -47,7 +47,7 @@ void daPy_lk_c::throwBoomerang() { } /* 80149698-801497A4 .text returnBoomerang__9daPy_lk_cFv */ -int daPy_lk_c::returnBoomerang() { +BOOL daPy_lk_c::returnBoomerang() { dComIfGp_clearPlayerStatus0(0, daPyStts0_BOOMERANG_WAIT_e); if (mEquipItem == daPyItem_NONE_e && !checkNoControll() && !dComIfGp_event_runCheck() && mDemo.getDemoType() == 0 && diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index 129889c31..7b3185168 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -11650,7 +11650,7 @@ BOOL daPy_lk_c::execute() { checkRoofRestart(); mDoMtx_multVecZero(mpCLModel->getAnmMtx(0x08), &mLeftHandPos); mDoMtx_multVecZero(mpCLModel->getAnmMtx(0x0C), &mRightHandPos); - cMtx_multVec(mpCLModel->getAnmMtx(0x00), &boomerang_catch, &m36F4); + cMtx_multVec(mpCLModel->getAnmMtx(0x00), &boomerang_catch, &mBoomerangCatchPos); cMtx_multVec(mpCLModel->getAnmMtx(0x08), &hookshot_root, &mHookshotRootPos); mpKatsuraModel->setBaseTRMtx(mpCLModel->getAnmMtx(0x0F)); mpKatsuraModel->calc(); diff --git a/src/d/actor/d_a_player_particle.inc b/src/d/actor/d_a_player_particle.inc index 79cc71153..f72fa684b 100644 --- a/src/d/actor/d_a_player_particle.inc +++ b/src/d/actor/d_a_player_particle.inc @@ -1276,16 +1276,19 @@ void daPy_lk_c::endDamageEmitter() { } /* 8012CA44-8012CD60 .text setItemWaterEffect__9daPy_lk_cFP10fopAc_ac_cii */ -u32 daPy_lk_c::setItemWaterEffect(fopAc_ac_c* i_actor, int param_1, int param_2) { +BOOL daPy_lk_c::setItemWaterEffect(fopAc_ac_c* i_actor, BOOL inWater, BOOL triggerOnExit) { static cXyz eff_scale0(0.5f, 0.5f, 0.5f); static cXyz eff_scale2(0.13f, 0.13f, 0.13f); static JGeometry::TVec3 direction(0.0f, 1.0f, 0.0f); f32 waterY; - if (fopAcM_getWaterY(&i_actor->current.pos, &waterY) && ((param_1 != 0 && i_actor->current.pos.y > waterY) || (param_1 == 0 && waterY >= i_actor->current.pos.y))) { - param_1 ^= 1; - if (param_1 == 0 && param_2 == 0) { - return param_1; + if (fopAcM_getWaterY(&i_actor->current.pos, &waterY) && + ((inWater && i_actor->current.pos.y > waterY) || (!inWater && waterY >= i_actor->current.pos.y))) + { + // Item entered or exited the water. + inWater ^= 1; + if (!inWater && !triggerOnExit) { + return inWater; } f32 deltaY = std::fabsf(i_actor->old.pos.y - i_actor->current.pos.y); @@ -1321,5 +1324,5 @@ u32 daPy_lk_c::setItemWaterEffect(fopAc_ac_c* i_actor, int param_1, int param_2) } } - return param_1; + return inWater; } diff --git a/src/d/actor/d_a_tag_hint.cpp b/src/d/actor/d_a_tag_hint.cpp index a04049fc2..5296788dd 100644 --- a/src/d/actor/d_a_tag_hint.cpp +++ b/src/d/actor/d_a_tag_hint.cpp @@ -496,7 +496,7 @@ void daTag_Hint_c::talkInit() { /* 000018C0-00001A00 .text talk__12daTag_Hint_cFv */ u16 daTag_Hint_c::talk() { - u16 sVar3 = 0xff; + u16 status = 0xff; if (m294 == 0) { l_msgId = fpcM_ERROR_PROCESS_ID_e; m290 = getMsg(); @@ -513,13 +513,13 @@ u16 daTag_Hint_c::talk() { } break; case 2: - sVar3 = l_msg->mStatus; - if (sVar3 == fopMsgStts_MSG_DISPLAYED_e) { + status = l_msg->mStatus; + if (status == fopMsgStts_MSG_DISPLAYED_e) { l_msg->mStatus = next_msgStatus(&m290); if (l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { fopMsgM_messageSet(m290); } - } else if (sVar3 == fopMsgStts_BOX_CLOSED_e) { + } else if (status == fopMsgStts_BOX_CLOSED_e) { l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; m294 = -1; } @@ -527,7 +527,7 @@ u16 daTag_Hint_c::talk() { } } } - return sVar3; + return status; } /* 00001A00-00001D98 .text actionEvent__12daTag_Hint_cFv */ @@ -573,7 +573,7 @@ BOOL daTag_Hint_c::actionEvent() { switch (iVar2) { case 1: sVar3 = talk(); - if (sVar3 == 0x12) { + if (sVar3 == fopMsgStts_BOX_CLOSED_e) { mDoAud_seStart(JA_SE_ITM_OMAMORI_ED_TALK); dComIfGp_evmng_cutEnd(m29C); setActio(1); diff --git a/src/d/actor/d_a_tag_island.cpp b/src/d/actor/d_a_tag_island.cpp index 5bacf50f1..ad2a30ca8 100644 --- a/src/d/actor/d_a_tag_island.cpp +++ b/src/d/actor/d_a_tag_island.cpp @@ -154,7 +154,7 @@ void daTag_Island_c::talkInit() { /* 0000056C-000006AC .text talk__14daTag_Island_cFv */ u16 daTag_Island_c::talk() { - u16 ret = 0xFF; + u16 status = 0xFF; if (mTalkState == 0) { l_msgId = fpcM_ERROR_PROCESS_ID_e; @@ -171,13 +171,13 @@ u16 daTag_Island_c::talk() { mTalkState = 2; break; case 2: - ret = l_msg->mStatus; - if (ret == fopMsgStts_MSG_DISPLAYED_e) { + status = l_msg->mStatus; + if (status == fopMsgStts_MSG_DISPLAYED_e) { l_msg->mStatus = next_msgStatus(&mMsg); if (l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { fopMsgM_messageSet(mMsg); } - } else if (ret == fopMsgStts_BOX_CLOSED_e) { + } else if (status == fopMsgStts_BOX_CLOSED_e) { l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; mTalkState = -1; } @@ -186,7 +186,7 @@ u16 daTag_Island_c::talk() { } } - return ret; + return status; } /* 000006AC-00000778 .text demoInitTact_Bf__14daTag_Island_cFv */