diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index 926469245..6c1ff3403 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -346,10 +346,12 @@ public: void setRPrm(s32 rprm) { mRPrm = rprm; } s32 getRPrm() const { return mRPrm; } cCcD_Obj* GetHitObj() { return mHitObj; } + void ClrObj() { mHitObj = NULL; } u32 MskSPrm(u32 mask) const { return mSPrm & mask; } u32 MskRPrm(u32 mask) { return mRPrm & mask; } void OnSPrmBit(u32 flag) { mSPrm |= flag; } void OffSPrmBit(u32 flag) { mSPrm &= ~flag; } + void ClrRPrm(u32 flag) { mRPrm &= ~flag; } void Set(cCcD_SrcObjCommonBase const& src) { mSPrm = src.mSPrm; @@ -364,7 +366,7 @@ public: virtual ~cCcD_ObjAt() {} void SetHit(cCcD_Obj*); void Set(cCcD_SrcObjAt const&); - void ClrHit(); + void ClrHit() { ClrObj(); } int GetType() const { return mType; } u32 GetGrp() const { return MskSPrm(0x1E); } bool ChkSet() const { return MskSPrm(1); } @@ -373,6 +375,7 @@ public: void SetType(u32 type) { mType = type; } void SetAtp(int atp) { mAtp = atp; } void ClrSet() { OffSPrmBit(1); } + void OffHitBit() { ClrRPrm(1); } u32 ChkHit() { return MskRPrm(1); } protected: @@ -470,6 +473,7 @@ public: void SetTgType(u32 type) { mObjTg.SetType(type); } void OnTgSPrmBit(u32 flag) { mObjTg.OnSPrmBit(flag); } void OffAtSetBit() { mObjAt.ClrSet(); } + void OffAtHitBit() { mObjAt.OffHitBit(); } void OnTgSetBit() { mObjTg.OnSPrmBit(1); } void OffTgSetBit() { mObjTg.ClrSet(); } void OnCoSetBit() { mObjCo.OnSPrmBit(1); } diff --git a/include/SSystem/SComponent/c_m3d_g_lin.h b/include/SSystem/SComponent/c_m3d_g_lin.h index f7ebd875f..1b780b078 100644 --- a/include/SSystem/SComponent/c_m3d_g_lin.h +++ b/include/SSystem/SComponent/c_m3d_g_lin.h @@ -15,7 +15,10 @@ public: cM3dGLin() {} cM3dGLin(const cXyz&, const cXyz&); virtual ~cM3dGLin() {} - void SetStartEnd(const cXyz&, const cXyz&); + void SetStartEnd(const cXyz& start, const cXyz& end) { + mStart = start; + mEnd = end; + } void SetStartEnd(const Vec&, const Vec&); void CalcPos(Vec*, f32) const; void CalcVec(Vec* pOut) const { VECSubtract(&this->mEnd, &this->mStart, pOut); } diff --git a/include/d/actor/d_a_arrow.h b/include/d/actor/d_a_arrow.h index 8be7fd254..e766313ce 100644 --- a/include/d/actor/d_a_arrow.h +++ b/include/d/actor/d_a_arrow.h @@ -1,3 +1,5 @@ +#ifndef D_A_ARROW_H +#define D_A_ARROW_H #include "f_op/f_op_actor_mng.h" #include "d/d_cc_d.h" @@ -6,15 +8,20 @@ #include "d/d_particle.h" #include "dolphin/types.h" +class J3DAnmTextureSRTKey; +class J3DMaterial; + class daArrow_c : fopAc_ac_c { public: enum ArrowType { - NORMAL_ARROWS = 0, - FIRE_ARROWS = 1, - ICE_ARROWS = 2, - LIGHT_ARROWS = 3, + TYPE_NORMAL = 0, + TYPE_FIRE = 1, + TYPE_ICE = 2, + TYPE_LIGHT = 3, }; + typedef BOOL (daArrow_c::*daArrow_c_ProcFunc)(); + BOOL _createHeap(); void _atHit(dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*); void checkCreater(); @@ -33,26 +40,40 @@ public: void setRoomInfo(); void setKeepMatrix(); void setStopActorMatrix(); - void procWait(); - void procMove(); - void procReturn(); - void procStop_BG(); - void procStop_Actor(); - void procWater(); + BOOL procWait(); + BOOL procMove(); + BOOL procReturn(); + BOOL procStop_BG(); + BOOL procStop_Actor(); + BOOL procWater(); void checkRestMp(); void setTypeByPlayer(); - void createInit(); + BOOL createInit(); BOOL _execute(); BOOL _draw(); s32 _create(); daArrow_c(); BOOL _delete(); + + // TODO inlines + // setAtHitPosBuff__9daArrow_cFP4cXyz + // setAtHitNormal__9daArrow_cFv + // setAtHitNormalActor__9daArrow_cFP10fopAc_ac_c + // clrAtHitNormal__9daArrow_cFv + // isSetByZelda__9daArrow_cFv + // clrAtHitPosBuff__9daArrow_cFP4cXyz + // getAtHitPosBuffP__9daArrow_cFv + // getAtHitNormalActor__9daArrow_cFv + // chkAtHitNormal__9daArrow_cFv + // isLinkReflect__9daArrow_cFv + // ArrowAtOff__9daArrow_cFv public: /* 0x290 */ bool mbShotByZelda; /* 0x291 */ u8 field_0x291[0x294 - 0x291]; /* 0x294 */ J3DModel* mpModel; - /* 0x298 */ u8 field_0x298[0x2A0 - 0x298]; + /* 0x298 */ J3DMaterial* mpTipMat; + /* 0x29C */ J3DAnmTextureSRTKey* mpBtk; /* 0x2A0 */ dBgS_ArrowLinChk mLinChk; /* 0x30C */ dBgS_ObjGndChk mGndChk; /* 0x360 */ dCcD_Stts mStts; @@ -62,20 +83,37 @@ public: /* 0x601 */ u8 mArrowType; /* 0x602 */ s16 field_0x602; /* 0x604 */ s16 field_0x604; - /* 0x606 */ u8 field_0x606[0x610 - 0x606]; + /* 0x606 */ u8 field_0x606[0x608 - 0x606]; + /* 0x608 */ s16 field_0x608; + /* 0x60A */ u8 field_0x60A[0x60C - 0x60A]; + /* 0x60C */ JPABaseEmitter* mpSparkleEmitter; /* 0x610 */ s32 mHitActorProcID; /* 0x614 */ s32 mHitJointIndex; /* 0x618 */ cXyz field_0x618; - /* 0x624 */ u8 field_0x624[0x668 - 0x624]; + /* 0x624 */ u8 field_0x624[0x660 - 0x624]; + /* 0x660 */ f32 mBtkFrame; + /* 0x664 */ u8 field_0x664; + /* 0x665 */ u8 field_0x665[0x668 - 0x665]; /* 0x668 */ dPa_followEcallBack mPtclFollowCb; /* 0x67C */ csXyz field_0x67c; /* 0x682 */ u8 field_0x682; /* 0x683 */ u8 field_0x683[0x684 - 0x683]; /* 0x684 */ u32 field_0x684; /* 0x688 */ bool field_0x688; - /* 0x689 */ u8 field_0x689[0x6A8 - 0x689]; + /* 0x689 */ u8 field_0x689[0x68C - 0x689]; + /* 0x68C */ daArrow_c_ProcFunc mCurrProcFunc; + /* 0x698 */ u8 field_0x698; + /* 0x699 */ u8 field_0x699; + /* 0x69A */ u8 field_0x69a; + /* 0x69B */ u8 field_0x69B[0x69C - 0x69B]; + /* 0x69C */ s16 field_0x69c; + /* 0x69E */ u8 field_0x69E[0x6A0 - 0x69E]; + /* 0x6A0 */ s32 field_0x6a0; + /* 0x6A4 */ s32 mInWaterTimer; /* 0x6A8 */ cXyz field_0x6a8; - /* 0x6B4 */ u8 field_0x6B4[0x6E6 - 0x6B4]; + /* 0x6B4 */ u8 field_0x6B4[0x6E4 - 0x6B4]; + /* 0x6E4 */ u8 field_0x6e4; + /* 0x6E5 */ u8 field_0x6E5[0x6E6 - 0x6E5]; /* 0x6E6 */ csXyz field_0x6e6; /* 0x6EC */ fopAc_ac_c* field_0x6ec; /* 0x6F0 */ cXyz mNearestHitPos; @@ -84,7 +122,15 @@ public: /* 0x701 */ u8 field_0x701[0x704 - 0x701]; static u8 m_keep_type; + static s16 m_count; static const char m_arc_name[]; + static const dCcD_SrcCps m_at_cps_src; + static const dCcD_SrcSph m_co_sph_src; }; +// Intellisense doesn't understand PTMF sizes +#ifndef __INTELLISENSE__ STATIC_ASSERT(sizeof(daArrow_c) == 0x704); +#endif + +#endif /* D_A_ARROW_H */ diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index b7635d71a..f57ed7a8b 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -79,7 +79,8 @@ public: /* 0x2A8 */ f32 field_0x2a8; /* 0x2AC */ u8 field_0x2AC[0x2B0 - 0x2AC]; /* 0x2B0 */ f32 field_0x2b0; - /* 0x2B4 */ u8 field_0x2B4[0x2BC - 0x2B4]; + /* 0x2B4 */ csXyz mBodyAngle; + /* 0x2BA */ u8 field_0x2BA[0x2BC - 0x2BA]; /* 0x2BC */ cXyz mHeadTopPos; /* 0x2C8 */ cXyz mSwordTopPos; /* 0x2D4 */ cXyz field_0x2d4; @@ -90,6 +91,9 @@ public: /* 0x300 */ f32 field_0x300; /* 0x304 */ daPy_demo_c mDemo; + s16 getBodyAngleX() { return mBodyAngle.x; } + s16 getBodyAngleY() { return mBodyAngle.y; } + virtual MtxP getLeftHandMatrix() = 0; virtual MtxP getRightHandMatrix() = 0; virtual void getGroundY() = 0; diff --git a/include/d/actor/d_a_player_link.h b/include/d/actor/d_a_player_link.h index d9bc7ba9e..3f6acbef1 100644 --- a/include/d/actor/d_a_player_link.h +++ b/include/d/actor/d_a_player_link.h @@ -1002,6 +1002,8 @@ public: void checkNoControll() const; J3DAnmTevRegKey* getBombBrk() { return mpBombBrk; } + J3DAnmTextureSRTKey* getIceArrowBtk() { return mpIceArrowBtk; } + J3DAnmTextureSRTKey* getLightArrowBtk() { return mpLightArrowBtk; } virtual MtxP getLeftHandMatrix(); virtual MtxP getRightHandMatrix(); @@ -1099,7 +1101,10 @@ public: /* 0x2EB0 */ J3DAnmTevRegKey* mpBombBrk; /* 0x2EB4 */ J3DAnmTevRegKey* mpGwp00BrkData; /* 0x2EB8 */ J3DAnmTextureSRTKey* mpGwp00BtkData; - /* 0x2EBC */ u8 field_0x2EBC[0x2ED4 - 0x2EBC]; + /* 0x2EBC */ u8 field_0x2EBC[0x2EC0 - 0x2EBC]; + /* 0x2EC0 */ J3DAnmTextureSRTKey* mpIceArrowBtk; + /* 0x2EC4 */ J3DAnmTextureSRTKey* mpLightArrowBtk; + /* 0x2EC8 */ u8 field_0x2EC8[0x2ED4 - 0x2EC8]; /* 0x2ED4 */ J3DAnmTextureSRTKey* mpHeldItemModelAnimTexEx; /* 0x2ED8 */ J3DAnmTextureSRTKey* mpSwordAnimBTK; /* 0x2EDC */ J3DAnmTevRegKey* mpHeldItemAnimBRK; diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index f2fb07ea4..40d8b8485 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -68,7 +68,7 @@ struct dCcD_SrcCps { class dCcD_GStts : public cCcD_GStts { public: dCcD_GStts(); - virtual ~dCcD_GStts() {} + virtual ~dCcD_GStts(); void Ct(); void Move(); @@ -108,7 +108,7 @@ public: virtual void Ct(); virtual void ClrAt(); virtual void ClrTg(); - virtual ~dCcD_Stts() {} + virtual ~dCcD_Stts(); }; // Size = 0x3C @@ -129,15 +129,18 @@ public: public: dCcD_GAtTgCoCommonBase() { ct(); } - void ClrActorInfo(); + void ClrActorInfo() { + mApid = -1; + mAc = NULL; + } void ct(); void SetHitApid(unsigned int); fopAc_ac_c* GetAc(); void Set(dCcD_SrcGAtTgCoCommonBase const&); void SetEffCounterTimer(); - void SubtractEffCounter(); - bool ChkEffCounter(); - virtual ~dCcD_GAtTgCoCommonBase() {} + void SubtractEffCounter() { mEffCounter -= 1; } + bool ChkEffCounter() { return mEffCounter >= 0; } + virtual ~dCcD_GAtTgCoCommonBase(); void ClrEffCounter() { mEffCounter = 0; } u32 GetGFlag() const { return mGFlag; } @@ -152,14 +155,13 @@ public: bool ChkRPrm(u32 flag) const { return MskRPrm(flag); } void SetHitCallback(dCcD_HitCallback callback) { mHitCallback = callback; } dCcD_HitCallback GetHitCallback() { return mHitCallback; } - void ClrHit() { ClrActorInfo(); } }; // Size = 0x1C // Attack (At) Collider class dCcD_GObjAt : public dCcD_GAtTgCoCommonBase { public: void Set(dCcD_SrcGObjAt const&); - virtual ~dCcD_GObjAt() {} + virtual ~dCcD_GObjAt(); void SetVec(cXyz& vec) { mVec = vec; } cXyz& GetVec() { return mVec; } cXyz* GetVecP() { return &mVec; } @@ -174,6 +176,7 @@ public: void SetRVec(cXyz& vec) { mRVec = vec; } void SetHitPos(cXyz& pos) { mHitPos = pos; } cXyz* GetHitPosP() { return &mHitPos; } + void ClrHit() { ClrActorInfo(); } // private: /* 0x1C */ u8 mSe; @@ -189,7 +192,7 @@ public: class dCcD_GObjTg : public dCcD_GAtTgCoCommonBase { public: void Set(dCcD_SrcGObjTg const&); - virtual ~dCcD_GObjTg() {} + virtual ~dCcD_GObjTg(); void SetSe(u8 se) { mSe = se; } void SetVec(cXyz& vec) { mVec = vec; } cXyz& GetVec() { return mVec; } @@ -219,7 +222,7 @@ private: // Correction (Co) Collider class dCcD_GObjCo : public dCcD_GAtTgCoCommonBase { public: - virtual ~dCcD_GObjCo() {} + virtual ~dCcD_GObjCo(); void Set(dCcD_SrcGObjCo const& pSrc) { dCcD_GAtTgCoCommonBase::Set(pSrc.mBase); } }; // Size = 0x1C ? @@ -363,6 +366,8 @@ public: void Set(dCcD_SrcCyl const&); cCcD_ShapeAttr* GetShapeAttr() { return this; } void StartCAt(cXyz&); + void StartCTg(cXyz&); + void MoveCAtTg(cXyz&); void MoveCAt(cXyz&); void MoveCTg(cXyz&); virtual ~dCcD_Cyl() {} @@ -385,7 +390,10 @@ class dCcD_Cps : public dCcD_GObjInf, public cCcD_CpsAttr { public: void Set(dCcD_SrcCps const&); cCcD_ShapeAttr* GetShapeAttr() { return (cCcD_ShapeAttr*)this; } - void CalcAtVec(); + void CalcAtVec() { + cXyz* atVecP = GetAtVecP(); + CalcVec(atVecP); + } void CalcTgVec(); virtual ~dCcD_Cps() {} dCcD_Cps() {} diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 56f5dc5bb..73522c788 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -360,7 +360,9 @@ public: /* 0x49B0 */ u8 field_0x49B0[0x4A24 - 0x49B0]; /* 0x4A24 */ daAgb_c* mpAgb; /* 0x4A28 */ u32 mPlayerStatus[2][2]; - /* 0x4A38 */ u8 field_0x4A38[0x4A40 - 0x4A38]; + /* 0x4A38 */ u8 field_0x4A38[0x4A3A - 0x4A38]; + /* 0x4A3A */ u8 mMiniGameType; + /* 0x4A3B */ u8 field_0x4A3B[0x4A40 - 0x4A3B]; /* 0x4A40 */ __d_timer_info_c mTimerInfo; /* 0x4A54 */ dDlst_window_c* mCurrentWindow; /* 0x4A58 */ view_class* mCurrentView; @@ -1094,6 +1096,11 @@ inline void dComIfGp_setCurrentGrafPort(J2DOrthoGraph* i_graf) { g_dComIfG_gameInfo.play.setCurrentGrafPort(i_graf); } +inline u8 dComIfGp_getMiniGameType() { + // TODO add enum for minigame type. + // 0 for none, 8 for shooting the fishman, 2/6 for orca, 7 for mail sorting, etc + return g_dComIfG_gameInfo.play.mMiniGameType; +} /** * === EVENT ===*/ diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 45e75568e..89c6aad1a 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -537,8 +537,8 @@ inline f32 fopAcM_searchPlayerDistance(fopAc_ac_c* actor) { s8 dComIfGp_getReverb(int roomNo); inline void fopAcM_seStartCurrent(fopAc_ac_c* actor, u32 sfxID, u32 param_2) { - s8 roomNo = fopAcM_GetRoomNo(actor); - mDoAud_seStart(sfxID, &actor->current.pos, param_2, dComIfGp_getReverb(roomNo)); + s8 reverb = dComIfGp_getReverb(fopAcM_GetRoomNo(actor)); + mDoAud_seStart(sfxID, &actor->current.pos, param_2, reverb); } inline void fopAcM_seStart(fopAc_ac_c* actor, u32 sfxID, u32 param_2) { diff --git a/src/d/actor/d_a_arrow.cpp b/src/d/actor/d_a_arrow.cpp index 1e3061296..f7416f835 100644 --- a/src/d/actor/d_a_arrow.cpp +++ b/src/d/actor/d_a_arrow.cpp @@ -9,12 +9,80 @@ #include "d/d_com_inf_game.h" #include "d/d_procname.h" #include "d/d_npc.h" +#include "d/d_item_data.h" #include "d/actor/d_a_player.h" +#include "d/actor/d_a_player_link.h" #include "d/d_jnt_hit.h" +#include "d/d_s_play.h" #include "dolphin/types.h" +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; + +s16 daArrow_c::m_count; + const char daArrow_c::m_arc_name[] = "Link"; +const dCcD_SrcCps daArrow_c::m_at_cps_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_NORMAL_ARROW, + /* SrcObjAt Atp */ 2, + /* SrcObjAt SPrm */ 0xB, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 7, + /* SrcGObjAt HitMark */ 0xD, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGCpsS + { + /* Start */ 0.0f, 0.0f, 0.0f, + /* End */ 0.0f, 0.0f, 0.0f, + /* Radius */ 5.0f, + }, +}; + +const dCcD_SrcSph daArrow_c::m_co_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0x119, + /* SrcGObjAt Se */ 7, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0x04, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 25.0f, + }, +}; + /* 800D455C-800D457C .text createHeap_CB__FP10fopAc_ac_c */ static BOOL createHeap_CB(fopAc_ac_c* i_this) { return ((daArrow_c*)i_this)->_createHeap(); @@ -23,7 +91,7 @@ static BOOL createHeap_CB(fopAc_ac_c* i_this) { /* 800D457C-800D4648 .text _createHeap__9daArrow_cFv */ BOOL daArrow_c::_createHeap() { // arrowglitter.bdl for Light Arrows, arrow.bdl otherwise. - s32 modelFileIndex = (mArrowType == LIGHT_ARROWS ? 0x38 : 0x37) & 0xFFFF; + s32 modelFileIndex = (mArrowType == TYPE_LIGHT ? 0x38 : 0x37) & 0xFFFF; J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, modelFileIndex); JUT_ASSERT(190, modelData != 0); @@ -82,7 +150,7 @@ void daArrow_c::checkCreater() { /* 800D4814-800D48E8 .text setLightEffect__9daArrow_cFv */ void daArrow_c::setLightEffect() { if (field_0x682 == mArrowType) { - if (mArrowType == NORMAL_ARROWS) { + if (mArrowType == TYPE_NORMAL) { return; } if (!field_0x688) { @@ -129,17 +197,112 @@ void daArrow_c::createBlur() { /* 800D4A04-800D4ADC .text setArrowShootSe__9daArrow_cFv */ void daArrow_c::setArrowShootSe() { - /* Nonmatching */ + static const s32 se[8] = { + 0, + 0, + JA_SE_LK_FIT_FIRE_ARROW, + JA_SE_LK_SHOOT_FIRE_ARROW, + JA_SE_LK_FIT_ICE_ARROW, + JA_SE_LK_SHOOT_ICE_ARROW, + JA_SE_LK_FIT_LIGHT_ARROW, + JA_SE_LK_SHOOT_LIGHT_ARROW, + }; + + if (mArrowType == TYPE_NORMAL) { + return; + } + + fopAcM_seStartCurrent(this, se[mArrowType*2+0], 0); + + fopAcM_seStartCurrent(this, se[mArrowType*2+1], 0); } /* 800D4ADC-800D4B70 .text setDrawShapeMaterial__9daArrow_cFv */ void daArrow_c::setDrawShapeMaterial() { - /* Nonmatching */ + struct ArrowAttackInfo { + u32 mAtType; + u8 mAtp; + u16 mTipJointIdx; + }; + static const ArrowAttackInfo arrow_mat[] = { + { + /* mAtType */ AT_TYPE_NORMAL_ARROW, + /* mAtp */ 2, + /* mTipJointIdx */ 4, + }, + { + /* mAtType */ AT_TYPE_FIRE_ARROW, + /* mAtp */ 4, + /* mTipJointIdx */ 2, + }, + { + /* mAtType */ AT_TYPE_ICE_ARROW, + /* mAtp */ 4, + /* mTipJointIdx */ 3, + }, + { + /* mAtType */ AT_TYPE_LIGHT_ARROW, + /* mAtp */ 0xFF, + /* mTipJointIdx */ 0, + }, + }; + + mCps.SetAtType(arrow_mat[mArrowType].mAtType); + mCps.SetAtAtp(arrow_mat[mArrowType].mAtp); + + if (mbShotByZelda) { + mCps.SetAtAtp(4); + mCps.SetAtType(arrow_mat[0].mAtType); + mCps.OnAtSPrmBit(0xE); + } + + if (arrow_mat[mArrowType].mTipJointIdx != 0) { + J3DModelData* modelData = mpModel->getModelData(); + J3DJoint* tipJoint = modelData->getJointNodePointer(arrow_mat[mArrowType].mTipJointIdx); + mpTipMat = tipJoint->getMesh(); + } } /* 800D4B70-800D4D98 .text arrowShooting__9daArrow_cFv */ void daArrow_c::arrowShooting() { - /* Nonmatching */ + field_0x6a8 = current.pos; + f32 xCos = cM_scos(current.angle.x); + speed.x = 200.0f * cM_ssin(current.angle.y) * xCos; + speed.y = 200.0f * cM_ssin(current.angle.x); + speed.z = 200.0f * cM_scos(current.angle.y) * xCos; + + setArrowShootSe(); + + if (mArrowType == TYPE_LIGHT && !mbShotByZelda) { + if (strcmp(dComIfGp_getStartStageName(), "GanonK") != 0) { + // Not in Puppet Ganon's boss room. + mCps.SetAtSpl((dCcG_At_Spl)0xB); + } + } + + field_0x67c = shape_angle; + + createBlur(); + + field_0x602 = m_count; + m_count += 1; + if (m_count == 5) { + m_count = 0; + } + + cXyz end = current.pos + speed*1.25f; + mCps.SetStartEnd(current.pos, end); + mCps.SetR(5.0f); + mCps.CalcAtVec(); + + dComIfG_Ccsp()->Set(&mCps); + // Using the dComIfG_Ccsp inline here breaks the match. + // dComIfG_Ccsp()->SetMass(&mCps, 1); + g_dComIfG_gameInfo.play.mCcS.SetMass(&mCps, 1); + + mbHitActor = false; + mNearestHitPos = end; + mNearestHitDist = MAXFLOAT; } /* 800D4D98-800D4DC0 .text arrowUseMp__9daArrow_cFv */ @@ -151,13 +314,57 @@ void daArrow_c::arrowUseMp() { -2, // Light Arrows }; - s32 magic = dComIfGp_getItemMagicCount(); - dComIfGp_setItemMagicCount(magic + use_mp[mArrowType]); + dComIfGp_setItemMagicCount(use_mp[mArrowType]); +} + +// This is a fake inline (not present in debug maps) which is required for ShieldReflect to match. +inline void setSphereCoordsFromXYAngles(cXyz& xyz, f32 mag, s16 targetAngleX, s16 targetAngleY) { + f32 normZ; + f32 normY; + f32 normX; + normX = cM_ssin(targetAngleY) * cM_scos(targetAngleX); + normY = -cM_ssin(targetAngleX); + normZ = cM_scos(targetAngleY) * cM_scos(targetAngleX); + xyz.x = normX * mag; + xyz.y = normY * mag; + xyz.z = normZ * mag; } /* 800D4DC0-800D50A0 .text ShieldReflect__9daArrow_cFv */ void daArrow_c::ShieldReflect() { - /* Nonmatching */ + f32 vel = speed.abs(); + + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + s16 targetAngleY = link->shape_angle.y + link->getBodyAngleY(); + s16 targetAngleX = link->getBodyAngleX(); + + fopAc_ac_c* ganondorf; + if (fopAcM_SearchByName(PROC_GND, &ganondorf) && dComIfGp_getAttention().LockonTruth() && dComIfGp_getAttention().LockonTarget(0) == ganondorf) { + cXyz ganondorfChestPos = ganondorf->current.pos; + ganondorfChestPos.y = g_regHIO.mChild[8].mFloatRegs[0] + 130.0f; + targetAngleX = -cLib_targetAngleX(&link->current.pos, &ganondorfChestPos); + fpcM_SetParam(ganondorf, 0x23); + field_0x608 = g_regHIO.mChild[0].mShortRegs[3] + 15; + mpSparkleEmitter = dComIfGp_particle_set(0x3EE, &link->current.pos, NULL, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); + } + + // // Regswaps without creating a fake inline. + // // f1 -> f3: normY + // // f3 -> f1: normZ + // f32 normZ; + // f32 normY; + // f32 normX; + // normX = cM_ssin(targetAngleY) * cM_scos(targetAngleX); + // normY = -cM_ssin(targetAngleX); + // normZ = cM_scos(targetAngleY) * cM_scos(targetAngleX); + // speed.x = normX * vel; + // speed.y = normY * vel; + // speed.z = normZ * vel; + setSphereCoordsFromXYAngles(speed, vel, targetAngleX, targetAngleY); + + shape_angle.x = cM_atan2s(-speed.y, -speed.absXZ()); + shape_angle.y = cM_atan2s(-speed.x, -speed.z); + shape_angle.z = 0; } /* 800D50A0-800D5388 .text check_water_in__9daArrow_cFv */ @@ -178,7 +385,29 @@ void daArrow_c::changeArrowType() { /* 800D553C-800D560C .text changeArrowTypeNotReady__9daArrow_cFv */ void daArrow_c::changeArrowTypeNotReady() { - /* Nonmatching */ + if (m_keep_type == TYPE_NORMAL) { + if (dComIfGs_getMagic() < 1) { + return; + } + if (dComIfGs_getItem(0xC) == MAGIC_ARROW || dComIfGs_getItem(0xC) == LIGHT_ARROW) { + m_keep_type = TYPE_FIRE; + } + } else if (m_keep_type == TYPE_FIRE) { + if (dComIfGs_getMagic() < 1) { + return; + } + if (dComIfGs_getItem(0xC) == MAGIC_ARROW || dComIfGs_getItem(0xC) == LIGHT_ARROW) { + m_keep_type = TYPE_ICE; + } + } else if (m_keep_type == TYPE_ICE) { + if (dComIfGs_getMagic() >= 2 && dComIfGs_getItem(0xC) == LIGHT_ARROW) { + m_keep_type = TYPE_LIGHT; + } else { + m_keep_type = TYPE_NORMAL; + } + } else if (m_keep_type == TYPE_LIGHT) { + m_keep_type = TYPE_NORMAL; + } } /* 800D560C-800D56B0 .text setRoomInfo__9daArrow_cFv */ @@ -201,7 +430,6 @@ void daArrow_c::setRoomInfo() { /* 800D56B0-800D5854 .text setKeepMatrix__9daArrow_cFv */ void daArrow_c::setKeepMatrix() { - /* Nonmatching */ // Transform the arrow onto its archer's hand. if (mbShotByZelda) { fopNpc_npc_c* zelda; @@ -283,33 +511,39 @@ void daArrow_c::setStopActorMatrix() { } /* 800D5A70-800D5B20 .text procWait__9daArrow_cFv */ -void daArrow_c::procWait() { +BOOL daArrow_c::procWait() { /* Nonmatching */ } /* 800D5B20-800D6BF4 .text procMove__9daArrow_cFv */ -void daArrow_c::procMove() { +BOOL daArrow_c::procMove() { /* Nonmatching */ } /* 800D6BF4-800D6E70 .text procReturn__9daArrow_cFv */ -void daArrow_c::procReturn() { +BOOL daArrow_c::procReturn() { /* Nonmatching */ } /* 800D6E70-800D71F8 .text procStop_BG__9daArrow_cFv */ -void daArrow_c::procStop_BG() { +BOOL daArrow_c::procStop_BG() { /* Nonmatching */ } /* 800D71F8-800D727C .text procStop_Actor__9daArrow_cFv */ -void daArrow_c::procStop_Actor() { +BOOL daArrow_c::procStop_Actor() { /* Nonmatching */ } /* 800D727C-800D72BC .text procWater__9daArrow_cFv */ -void daArrow_c::procWater() { - /* Nonmatching */ +BOOL daArrow_c::procWater() { + if (mInWaterTimer <= 0) { + fopAcM_delete(this); + return TRUE; + } + + mInWaterTimer--; + return TRUE; } /* 800D72BC-800D72EC .text checkRestMp__9daArrow_cFv */ @@ -334,8 +568,54 @@ void daArrow_c::setTypeByPlayer() { } /* 800D7320-800D74FC .text createInit__9daArrow_cFv */ -void daArrow_c::createInit() { - /* Nonmatching */ +BOOL daArrow_c::createInit() { + if (mArrowType == TYPE_LIGHT) { + mpBtk = daPy_getPlayerLinkActorClass()->getLightArrowBtk(); + } else { + mpBtk = daPy_getPlayerLinkActorClass()->getIceArrowBtk(); + } + + mCurrProcFunc = &procWait; + + setKeepMatrix(); + mCullMtx = mpModel->getBaseTRMtx(); + mCull.mBox.mMin.x = -6.0f; + mCull.mBox.mMin.y = -6.0f; + mCull.mBox.mMin.z = 0.0f; + mCull.mBox.mMax.x = 6.0f; + mCull.mBox.mMax.y = 6.0f; + mCull.mBox.mMax.z = 65.0f; + + mStts.Init(10, 0xFF, this); + mCps.Set(m_at_cps_src); + mCps.SetStts(&mStts); + mCps.SetAtHitCallback(&atHit_CB); + mSph.Set(m_co_sph_src); + mSph.SetStts(&mStts); + + field_0x602 = -1; + + if (mArrowType != TYPE_LIGHT) { + J3DModelData* modelData = mpModel->getModelData(); + modelData->getJointNodePointer(4)->getMesh()->getShape()->hide(); + modelData->getJointNodePointer(2)->getMesh()->getShape()->hide(); + modelData->getJointNodePointer(3)->getMesh()->getShape()->hide(); + modelData->getJointNodePointer(3)->getMesh()->getNext()->getShape()->hide(); + } + setDrawShapeMaterial(); + + field_0x698 = 1; + field_0x699 = 0; + field_0x69a = 0; + field_0x69c = 0; + field_0x6a0 = 300; + mInWaterTimer = 0; + field_0x6e4 = 0; + field_0x688 = 0; + field_0x664 = 0; + field_0x604 = 0; + + return TRUE; } /* 800D74FC-800D7820 .text _execute__9daArrow_cFv */ @@ -345,12 +625,66 @@ BOOL daArrow_c::_execute() { /* 800D7820-800D7960 .text _draw__9daArrow_cFv */ BOOL daArrow_c::_draw() { - /* Nonmatching */ + if (!field_0x698) { + return TRUE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + + if (mArrowType != TYPE_LIGHT) { + mpTipMat->getShape()->show(); + J3DMaterial* nextMat = mpTipMat->getNext(); + if (nextMat) { + nextMat->getShape()->show(); + } + } + + mpBtk->setFrame(mBtkFrame); + dComIfGd_setListP1(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + + if (mArrowType != TYPE_LIGHT) { + mpTipMat->getShape()->hide(); + J3DMaterial* nextMat = mpTipMat->getNext(); + if (nextMat) { + nextMat->getShape()->hide(); + } + } + + return TRUE; } /* 800D7960-800D7A38 .text _create__9daArrow_cFv */ s32 daArrow_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daArrow_c); + + checkCreater(); + + if (mbShotByZelda) { + mArrowType = TYPE_LIGHT; + } else { + setTypeByPlayer(); + } + + if (dComIfGp_getMiniGameType() == 8) { + mArrowType = TYPE_NORMAL; + } + + const static u32 heap_size[] = { + 0x1300, + 0x1300, + 0x1300, + 0x820, + }; + if (!fopAcM_entrySolidHeap(this, (heapCallbackFunc)&createHeap_CB, heap_size[mArrowType])) { + return cPhs_ERROR_e; + } + + // Using the enum here breaks the match. + // return createInit() ? cPhs_COMPLEATE_e : cPhs_ERROR_e; + return createInit() ? 4 : 5; } /* 800D7A38-800D7DB4 .text __ct__9daArrow_cFv */ @@ -364,19 +698,16 @@ BOOL daArrow_c::_delete() { /* 800D8200-800D8220 .text daArrowCreate__FPv */ s32 daArrowCreate(void* i_this) { - /* Nonmatching */ return ((daArrow_c*)i_this)->_create(); } /* 800D8220-800D8240 .text daArrowDelete__FPv */ BOOL daArrowDelete(void* i_this) { - /* Nonmatching */ return ((daArrow_c*)i_this)->_delete(); } /* 800D8240-800D8260 .text daArrowExecute__FPv */ BOOL daArrowExecute(void* i_this) { - /* Nonmatching */ return ((daArrow_c*)i_this)->_execute(); } diff --git a/src/d/actor/d_a_mozo.cpp b/src/d/actor/d_a_mozo.cpp index fd256d8e7..ab57828d1 100644 --- a/src/d/actor/d_a_mozo.cpp +++ b/src/d/actor/d_a_mozo.cpp @@ -238,7 +238,7 @@ s32 daMozo_c::CreateInit() { // TODO: insert missing assignment here - mAnimMorf->getModel()->setUserArea(this); + mAnimMorf->getModel()->setUserArea((u32)this); for (int i = 0; i < mdlData->getJointNum(); i++) { if (i == 2) { mdlData->getJointNodePointer(2)->setCallBack((J3DNodeCallBack)daMozo_nodeCallBack); diff --git a/src/d/actor/d_a_obj_Ygush00.cpp b/src/d/actor/d_a_obj_Ygush00.cpp index 13ff1a2cd..631871a20 100644 --- a/src/d/actor/d_a_obj_Ygush00.cpp +++ b/src/d/actor/d_a_obj_Ygush00.cpp @@ -15,7 +15,7 @@ struct daObjGryw00_c { public: - f32 get_draw_water_lvl(void *i_this); + f32 get_draw_water_lv(void *i_this); }; struct daObjYgush00_c : public fopAc_ac_c { @@ -30,23 +30,29 @@ public: bool _execute(); bool _draw(); bool create_heap(); - static s32 solidHeapCB(fopAc_ac_c*); + static BOOL solidHeapCB(fopAc_ac_c*); public: - request_of_phase_process_class mPhs; - J3DModel * mpModel; - mDoExt_btkAnm mBtkAnm; - mDoExt_bckAnm mBckAnm; - s32 mType; - daObjGryw00_c * mpGryw00; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModel; + /* 0x29C */ mDoExt_btkAnm mBtkAnm; + /* 0x2B0 */ mDoExt_bckAnm mBckAnm; + /* 0x2C0 */ s32 mType; + /* 0x2C4 */ daObjGryw00_c * mpGryw00; }; namespace { static const char l_arcname[] = "Ygush00"; }; +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0, 0.5}; + /* 00000078-0000009C .text solidHeapCB__14daObjYgush00_cFP10fopAc_ac_c */ -s32 daObjYgush00_c::solidHeapCB(fopAc_ac_c* ac) { +BOOL daObjYgush00_c::solidHeapCB(fopAc_ac_c* ac) { return ((daObjYgush00_c*)ac)->create_heap(); } @@ -56,25 +62,28 @@ bool daObjYgush00_c::create_heap() { static u32 btk_table[] = { 0x0E, 0x0D, 0x0D, 0x0D }; static u32 bck_table[] = { 0x06, 0x05, 0x05, 0x05 }; + J3DModelData * pModelData; bool ret = true; - - J3DModelData * pModelData = (J3DModelData *)dComIfG_getObjectRes(l_arcname, mdl_table[mType]); + + // TODO regswap + // r29 -> r30: g_dComIfG_gameInfo.mResControl.mObjectInfo / btkRet + // r30 -> r29: pModelData + pModelData = (J3DModelData *)dComIfG_getObjectRes(l_arcname, mdl_table[mType]); J3DAnmTextureSRTKey * pBtk = (J3DAnmTextureSRTKey *)dComIfG_getObjectRes(l_arcname, btk_table[mType]); J3DAnmTransform * pBck = (J3DAnmTransform *)dComIfG_getObjectRes(l_arcname, bck_table[mType]); if (!pModelData || !pBtk || !pBck) { JUT_ASSERT(207, 0); ret = false; - return ret; + } else { + mpModel = mDoExt_J3DModel__create(pModelData, 0x80000, 0x11000222); + s32 btkRet = mBtkAnm.init(pModelData, pBtk, 1, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false, 0); + s32 bckRet = mBckAnm.init(pModelData, pBck, 1, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false); + + if (!mpModel || !btkRet || !bckRet) + ret = false; } - mpModel = mDoExt_J3DModel__create(pModelData, 0x80000, 0x11000222); - s32 btkRet = mBtkAnm.init(pModelData, pBtk, true, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false, false); - s32 bckRet = mBckAnm.init(pModelData, pBck, true, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false); - - if (!mpModel || !btkRet || !bckRet) - ret = false; - return ret; } @@ -124,7 +133,7 @@ bool daObjYgush00_c::_execute() { if (mType == 1) { if (mpGryw00 != NULL) { - if (mpGryw00->get_draw_water_lvl(mpGryw00) <= getPosition().y) { + if (mpGryw00->get_draw_water_lv(mpGryw00) <= getPosition().y) { fopAcM_seStartCurrent(this, 0x61fe, 0); } } else { @@ -148,27 +157,27 @@ bool daObjYgush00_c::_draw() { } /* 000006FC-0000071C .text daObjYgush00_Create__FP14daObjYgush00_c */ -s32 daObjYgush00_Create(daObjYgush00_c* i_this) { +static s32 daObjYgush00_Create(daObjYgush00_c* i_this) { return i_this->_create(); } /* 0000071C-00000740 .text daObjYgush00_Delete__FP14daObjYgush00_c */ -s32 daObjYgush00_Delete(daObjYgush00_c* i_this) { +static s32 daObjYgush00_Delete(daObjYgush00_c* i_this) { return i_this->_delete(); } /* 00000740-00000764 .text daObjYgush00_Execute__FP14daObjYgush00_c */ -s32 daObjYgush00_Execute(daObjYgush00_c* i_this) { +static s32 daObjYgush00_Execute(daObjYgush00_c* i_this) { return i_this->_execute(); } /* 00000764-00000788 .text daObjYgush00_Draw__FP14daObjYgush00_c */ -s32 daObjYgush00_Draw(daObjYgush00_c* i_this) { +static s32 daObjYgush00_Draw(daObjYgush00_c* i_this) { return i_this->_draw(); } /* 00000788-00000790 .text daObjYgush00_IsDelete__FP14daObjYgush00_c */ -s32 daObjYgush00_IsDelete(daObjYgush00_c* i_this) { +static s32 daObjYgush00_IsDelete(daObjYgush00_c* i_this) { return 1; } diff --git a/src/d/d_cc_d.cpp b/src/d/d_cc_d.cpp index 9ad40c914..0377e51df 100644 --- a/src/d/d_cc_d.cpp +++ b/src/d/d_cc_d.cpp @@ -3,22 +3,41 @@ // Translation Unit: d_cc_d.cpp // -#include "d_cc_d.h" +#include "d/d_cc_d.h" +#include "f_op/f_op_actor_mng.h" #include "dolphin/types.h" +#include "JSystem/JUtility/JUTAssert.h" /* 800AB2AC-800AB328 .text GetAc__22dCcD_GAtTgCoCommonBaseFv */ -void dCcD_GAtTgCoCommonBase::GetAc() { - /* Nonmatching */ +fopAc_ac_c* dCcD_GAtTgCoCommonBase::GetAc() { + if (mApid == -1) { + return NULL; + } + if (mAc == NULL) { + mAc = fopAcM_SearchByID(mApid); + if (mAc == NULL) { + mApid = -1; + } + } + return mAc; } /* 800AB328-800AB334 .text SetEffCounterTimer__22dCcD_GAtTgCoCommonBaseFv */ void dCcD_GAtTgCoCommonBase::SetEffCounterTimer() { - /* Nonmatching */ + mEffCounter = 5; } /* 800AB334-800AB384 .text __ct__10dCcD_GSttsFv */ dCcD_GStts::dCcD_GStts() { - /* Nonmatching */ + mAt = 0; + mTg = 0; + mRoomId = 0; + field_0x08 = -1; + mAtApid = -1; + mAtOldApid = -1; + mTgApid = -1; + mTgOldApid = -1; + field_0x1C = 0; } /* 800AB384-800AB3BC .text Ct__10dCcD_GSttsFv */ @@ -28,12 +47,34 @@ void dCcD_GStts::Ct() { /* 800AB3BC-800AB3DC .text Move__10dCcD_GSttsFv */ void dCcD_GStts::Move() { - /* Nonmatching */ + mAtOldApid = mAtApid; + mAtApid = NULL; + mTgOldApid = mTgApid; + mTgApid = NULL; } /* 800AB3DC-800AB46C .text Init__9dCcD_SttsFiiP10fopAc_ac_c */ -void dCcD_Stts::Init(int, int, fopAc_ac_c*) { - /* Nonmatching */ +void dCcD_Stts::Init(int param_0, int param_1, fopAc_ac_c* pActor) { + u32 procId; + if (pActor) { + procId = fpcM_GetID(pActor); + } else { + procId = -1; + } + cCcD_Stts::Init(param_0, param_1, pActor, procId); + + s32 roomNo; + if (pActor) { + roomNo = pActor->current.roomNo; + } else { + roomNo = 0; + OnNoActor(); + } + if (roomNo != -1) { + SetRoomId(roomNo); + } else { + SetRoomId(0); + } } /* 800AB46C-800AB4A0 .text Ct__9dCcD_SttsFv */ @@ -62,38 +103,53 @@ dCcD_GObjInf::~dCcD_GObjInf() { } /* 800AB7C0-800AB7C4 .text GetGObjInf__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetGObjInf() { - /* Nonmatching */ +cCcD_GObjInf* dCcD_GObjInf::GetGObjInf() { + return (cCcD_GObjInf*)this; } /* 800AB7C4-800AB81C .text ClrAtHit__12dCcD_GObjInfFv */ void dCcD_GObjInf::ClrAtHit() { - /* Nonmatching */ + OffAtHitBit(); + cCcD_Obj::ClrAtHit(); + mGObjAt.ClrHit(); + OffAtShieldHit(); + OffAtHitNoActor(); + SubtractAtEffCounter(); + if (!ChkAtEffCounter()) { + ClrAtEffCounter(); + } } +#if VERSION != VERSION_JPN /* 800AB81C-800AB874 .text ChkAtHit__12dCcD_GObjInfFv */ -void dCcD_GObjInf::ChkAtHit() { +u32 dCcD_GObjInf::ChkAtHit() { /* Nonmatching */ } +#endif /* 800AB874-800AB8B4 .text ResetAtHit__12dCcD_GObjInfFv */ void dCcD_GObjInf::ResetAtHit() { - /* Nonmatching */ + ClrAtHit(); + ClrAtEffCounter(); } /* 800AB8B4-800AB904 .text GetAtHitObj__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetAtHitObj() { +cCcD_Obj* dCcD_GObjInf::GetAtHitObj() { /* Nonmatching */ } /* 800AB904-800AB938 .text GetAtHitGObj__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetAtHitGObj() { - /* Nonmatching */ +cCcD_GObjInf* dCcD_GObjInf::GetAtHitGObj() { + cCcD_Obj* atHitObj = GetAtHitObj(); + if (atHitObj == NULL) { + return NULL; + } + return dCcD_GetGObjInf(atHitObj); } /* 800AB938-800AB958 .text ChkAtNoGuard__12dCcD_GObjInfFv */ -void dCcD_GObjInf::ChkAtNoGuard() { - /* Nonmatching */ +u8 dCcD_GObjInf::ChkAtNoGuard() { + return GetAtSpl() >= 8; } /* 800AB958-800AB9B0 .text ClrTgHit__12dCcD_GObjInfFv */ @@ -101,10 +157,12 @@ void dCcD_GObjInf::ClrTgHit() { /* Nonmatching */ } +#if VERSION != VERSION_JPN /* 800AB9B0-800ABA08 .text ChkTgHit__12dCcD_GObjInfFv */ -void dCcD_GObjInf::ChkTgHit() { +u32 dCcD_GObjInf::ChkTgHit() { /* Nonmatching */ } +#endif /* 800ABA08-800ABA48 .text ResetTgHit__12dCcD_GObjInfFv */ void dCcD_GObjInf::ResetTgHit() { @@ -112,17 +170,17 @@ void dCcD_GObjInf::ResetTgHit() { } /* 800ABA48-800ABA98 .text GetTgHitObj__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetTgHitObj() { +cCcD_Obj* dCcD_GObjInf::GetTgHitObj() { /* Nonmatching */ } /* 800ABA98-800ABACC .text GetTgHitGObj__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetTgHitGObj() { +dCcD_GObjInf* dCcD_GObjInf::GetTgHitGObj() { /* Nonmatching */ } /* 800ABACC-800ABB00 .text GetTgHitObjSe__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetTgHitObjSe() { +u8 dCcD_GObjInf::GetTgHitObjSe() { /* Nonmatching */ } @@ -131,13 +189,15 @@ void dCcD_GObjInf::ClrCoHit() { /* Nonmatching */ } +#if VERSION != VERSION_JPN /* 800ABB4C-800ABBA4 .text ChkCoHit__12dCcD_GObjInfFv */ -void dCcD_GObjInf::ChkCoHit() { +u32 dCcD_GObjInf::ChkCoHit() { /* Nonmatching */ } +#endif /* 800ABBA4-800ABBF4 .text GetCoHitObj__12dCcD_GObjInfFv */ -void dCcD_GObjInf::GetCoHitObj() { +cCcD_Obj* dCcD_GObjInf::GetCoHitObj() { /* Nonmatching */ } @@ -147,8 +207,10 @@ void dCcD_GObjInf::Set(const dCcD_SrcGObjInf&) { } /* 800ABC54-800ABCC4 .text dCcD_GetGObjInf__FP8cCcD_Obj */ -void dCcD_GetGObjInf(cCcD_Obj*) { +dCcD_GObjInf* dCcD_GetGObjInf(cCcD_Obj* pobj) { /* Nonmatching */ + JUT_ASSERT(531, pobj != 0); + return (dCcD_GObjInf*)pobj->GetGObjInf(); } /* 800ABCC4-800ABD34 .text Set__8dCcD_CpsFRC11dCcD_SrcCps */ @@ -206,85 +268,85 @@ void dCcD_Sph::MoveCAt(cXyz&) { /* Nonmatching */ } -/* 800AC0E8-800AC130 .text __dt__10cCcD_GSttsFv */ -cCcD_GStts::~cCcD_GStts() { - /* Nonmatching */ -} +// /* 800AC0E8-800AC130 .text __dt__10cCcD_GSttsFv */ +// cCcD_GStts::~cCcD_GStts() { +// /* Nonmatching */ +// } -/* 800AC130-800AC228 .text __dt__12cCcD_GObjInfFv */ -cCcD_GObjInf::~cCcD_GObjInf() { - /* Nonmatching */ -} +// /* 800AC130-800AC228 .text __dt__12cCcD_GObjInfFv */ +// cCcD_GObjInf::~cCcD_GObjInf() { +// /* Nonmatching */ +// } -/* 800AC228-800AC310 .text __dt__8cCcD_ObjFv */ -cCcD_Obj::~cCcD_Obj() { - /* Nonmatching */ -} +// /* 800AC228-800AC310 .text __dt__8cCcD_ObjFv */ +// cCcD_Obj::~cCcD_Obj() { +// /* Nonmatching */ +// } -/* 800AC310-800AC3D0 .text __dt__14cCcD_ObjHitInfFv */ -cCcD_ObjHitInf::~cCcD_ObjHitInf() { - /* Nonmatching */ -} +// /* 800AC310-800AC3D0 .text __dt__14cCcD_ObjHitInfFv */ +// cCcD_ObjHitInf::~cCcD_ObjHitInf() { +// /* Nonmatching */ +// } -/* 800AC3D0-800AC42C .text __dt__10cCcD_ObjCoFv */ -cCcD_ObjCo::~cCcD_ObjCo() { - /* Nonmatching */ -} +// /* 800AC3D0-800AC42C .text __dt__10cCcD_ObjCoFv */ +// cCcD_ObjCo::~cCcD_ObjCo() { +// /* Nonmatching */ +// } -/* 800AC42C-800AC488 .text __dt__10cCcD_ObjTgFv */ -cCcD_ObjTg::~cCcD_ObjTg() { - /* Nonmatching */ -} +// /* 800AC42C-800AC488 .text __dt__10cCcD_ObjTgFv */ +// cCcD_ObjTg::~cCcD_ObjTg() { +// /* Nonmatching */ +// } -/* 800AC488-800AC4E4 .text __dt__10cCcD_ObjAtFv */ -cCcD_ObjAt::~cCcD_ObjAt() { - /* Nonmatching */ -} +// /* 800AC488-800AC4E4 .text __dt__10cCcD_ObjAtFv */ +// cCcD_ObjAt::~cCcD_ObjAt() { +// /* Nonmatching */ +// } -/* 800AC4E4-800AC52C .text __dt__18cCcD_ObjCommonBaseFv */ -cCcD_ObjCommonBase::~cCcD_ObjCommonBase() { - /* Nonmatching */ -} +// /* 800AC4E4-800AC52C .text __dt__18cCcD_ObjCommonBaseFv */ +// cCcD_ObjCommonBase::~cCcD_ObjCommonBase() { +// /* Nonmatching */ +// } -/* 800AC52C-800AC534 .text GetGObjInf__8cCcD_ObjFv */ -void cCcD_Obj::GetGObjInf() { - /* Nonmatching */ -} +// /* 800AC52C-800AC534 .text GetGObjInf__8cCcD_ObjFv */ +// cCcD_GObjInf* cCcD_Obj::GetGObjInf() { +// /* Nonmatching */ +// } -/* 800AC534-800AC538 .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} +// /* 800AC534-800AC538 .text GetGObjInf__12cCcD_GObjInfCFv */ +// cCcD_GObjInf const* cCcD_GObjInf::GetGObjInf() const { +// /* Nonmatching */ +// } -/* 800AC538-800AC540 .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} +// /* 800AC538-800AC540 .text GetShapeAttr__8cCcD_ObjCFv */ +// cCcD_ShapeAttr const* cCcD_Obj::GetShapeAttr() const { +// /* Nonmatching */ +// } -/* 800AC540-800AC558 .text ClrAtHit__12cCcD_GObjInfFv */ -void cCcD_GObjInf::ClrAtHit() { - /* Nonmatching */ -} +// /* 800AC540-800AC558 .text ClrAtHit__12cCcD_GObjInfFv */ +// void cCcD_GObjInf::ClrAtHit() { +// /* Nonmatching */ +// } -/* 800AC558-800AC570 .text ClrTgHit__12cCcD_GObjInfFv */ -void cCcD_GObjInf::ClrTgHit() { - /* Nonmatching */ -} +// /* 800AC558-800AC570 .text ClrTgHit__12cCcD_GObjInfFv */ +// void cCcD_GObjInf::ClrTgHit() { +// /* Nonmatching */ +// } -/* 800AC570-800AC588 .text ClrCoHit__12cCcD_GObjInfFv */ -void cCcD_GObjInf::ClrCoHit() { - /* Nonmatching */ -} +// /* 800AC570-800AC588 .text ClrCoHit__12cCcD_GObjInfFv */ +// void cCcD_GObjInf::ClrCoHit() { +// /* Nonmatching */ +// } -/* 800AC588-800AC58C .text GetGObjInf__12cCcD_GObjInfFv */ -void cCcD_GObjInf::GetGObjInf() { - /* Nonmatching */ -} +// /* 800AC588-800AC58C .text GetGObjInf__12cCcD_GObjInfFv */ +// cCcD_GObjInf* cCcD_GObjInf::GetGObjInf() { +// /* Nonmatching */ +// } -/* 800AC58C-800AC594 .text GetGObjInf__8cCcD_ObjCFv */ -void cCcD_Obj::GetGObjInf() const { - /* Nonmatching */ -} +// /* 800AC58C-800AC594 .text GetGObjInf__8cCcD_ObjCFv */ +// cCcD_GObjInf const* cCcD_Obj::GetGObjInf() const { +// /* Nonmatching */ +// } /* 800AC594-800AC5F0 .text __dt__11dCcD_GObjCoFv */ dCcD_GObjCo::~dCcD_GObjCo() { @@ -307,7 +369,7 @@ dCcD_GAtTgCoCommonBase::~dCcD_GAtTgCoCommonBase() { } /* 800AC6F0-800AC700 .text GetGStts__9dCcD_SttsFv */ -void dCcD_Stts::GetGStts() { +cCcD_GStts* dCcD_Stts::GetGStts() { /* Nonmatching */ } @@ -330,9 +392,3 @@ dCcD_Stts::~dCcD_Stts() { dCcD_GStts::~dCcD_GStts() { /* Nonmatching */ } - -/* 800AC808-800AC810 .text @28@__dt__9dCcD_SttsFv */ -void @28@__dt__9dCcD_SttsFv { - /* Nonmatching */ -} -