From dc8d4d30931eb77ef3661f3bc6b2c30363b22249 Mon Sep 17 00:00:00 2001 From: Noah McQueen <67965519+Yotona@users.noreply.github.com> Date: Tue, 12 Sep 2023 16:20:08 -0600 Subject: [PATCH 1/2] Various fixes in SSystem (#19) * Various fixes in SSystem * Removed unused include in c_xyz.h * Removed unused include in c_xyz.cpp --- configure.py | 8 +++--- include/SSystem/SComponent/c_bg_s_poly_info.h | 10 +++++-- include/SSystem/SComponent/c_data_tbl.h | 6 ++--- src/SSystem/SComponent/c_bg_s_lin_chk.cpp | 12 +++++---- src/SSystem/SComponent/c_lib.cpp | 27 +++++++++---------- src/SSystem/SComponent/c_m3d_g_cyl.cpp | 6 ++--- src/SSystem/SComponent/c_m3d_g_sph.cpp | 6 ++--- src/SSystem/SComponent/c_math.cpp | 4 +-- src/SSystem/SComponent/c_xyz.cpp | 9 +++---- 9 files changed, 47 insertions(+), 41 deletions(-) diff --git a/configure.py b/configure.py index 33c3a6b3f..a52bd174b 100644 --- a/configure.py +++ b/configure.py @@ -238,22 +238,22 @@ LIBS = [ Object(Matching, "SSystem/SComponent/c_tag_iter.cpp"), Object(NonMatching, "SSystem/SComponent/c_xyz.cpp"), Object(Matching, "SSystem/SComponent/c_sxyz.cpp"), - Object(NonMatching, "SSystem/SComponent/c_math.cpp"), + Object(Matching, "SSystem/SComponent/c_math.cpp"), Object(NonMatching, "SSystem/SComponent/c_bg_s.cpp"), Object(Matching, "SSystem/SComponent/c_bg_s_chk.cpp"), Object(NonMatching, "SSystem/SComponent/c_bg_s_gnd_chk.cpp"), - Object(NonMatching, "SSystem/SComponent/c_bg_s_lin_chk.cpp"), + Object(Matching, "SSystem/SComponent/c_bg_s_lin_chk.cpp"), Object(NonMatching, "SSystem/SComponent/c_bg_w.cpp"), Object(NonMatching, "SSystem/SComponent/c_m2d.cpp"), Object(NonMatching, "SSystem/SComponent/c_m2d_g_box.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_aab.cpp"), - Object(NonMatching, "SSystem/SComponent/c_m3d_g_cyl.cpp"), + Object(Matching, "SSystem/SComponent/c_m3d_g_cyl.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_pla.cpp"), Object(NonMatching, "SSystem/SComponent/c_m3d_g_sph.cpp"), Object(Matching, "SSystem/SComponent/c_m3d_g_tri.cpp"), Object(NonMatching, "SSystem/SComponent/c_lib.cpp"), Object(NonMatching, "SSystem/SComponent/c_angle.cpp"), - Object(NonMatching, "SSystem/SComponent/c_data_tbl.cpp"), + Object(Matching, "SSystem/SComponent/c_data_tbl.cpp"), ], }, { diff --git a/include/SSystem/SComponent/c_bg_s_poly_info.h b/include/SSystem/SComponent/c_bg_s_poly_info.h index 55c265b49..2d2da6493 100644 --- a/include/SSystem/SComponent/c_bg_s_poly_info.h +++ b/include/SSystem/SComponent/c_bg_s_poly_info.h @@ -3,16 +3,22 @@ #include "dolphin/types.h" +class cBgW; class cBgS_PolyInfo { private: /* 0x00 */ u16 mPolyIndex; /* 0x02 */ u16 mBgIndex; - /* 0x04 */ void* unk_0x04; + /* 0x04 */ cBgW* mpBgW; /* 0x08 */ unsigned int mActorId; public: cBgS_PolyInfo(); - void ClearPi(); + void ClearPi() { + mPolyIndex = -1; + mBgIndex = 0x100; + mpBgW = NULL; + mActorId = -1; + } void SetPolyInfo(const cBgS_PolyInfo&); void SetActorInfo(int, void*, unsigned int); bool ChkSafe(const void*, unsigned int) const; diff --git a/include/SSystem/SComponent/c_data_tbl.h b/include/SSystem/SComponent/c_data_tbl.h index f231db125..386e189dc 100644 --- a/include/SSystem/SComponent/c_data_tbl.h +++ b/include/SSystem/SComponent/c_data_tbl.h @@ -4,13 +4,13 @@ #include "dolphin/types.h" struct cDT_NamePTbl { + u32 mCount; + char ** mpNames; + cDT_NamePTbl(); virtual ~cDT_NamePTbl(); int GetIndex(const char *pName, int start) const; void Set(u32 count, char** pNames); - - u32 mCount; - char ** mpNames; }; struct cDT_DataSrc { diff --git a/src/SSystem/SComponent/c_bg_s_lin_chk.cpp b/src/SSystem/SComponent/c_bg_s_lin_chk.cpp index 7a36a650f..e35a2f9fd 100644 --- a/src/SSystem/SComponent/c_bg_s_lin_chk.cpp +++ b/src/SSystem/SComponent/c_bg_s_lin_chk.cpp @@ -8,10 +8,11 @@ /* 80247418-80247480 .text ct__11cBgS_LinChkFv */ void cBgS_LinChk::ct() { - mLin.mStart = cXyz::Zero; - mLin.mEnd = cXyz::Zero; - field_0x40 = cXyz::Zero ; - setActorPid(0xFFFFFFFF); + cXyz zero = cXyz::Zero; + mLin.mStart = zero; + mLin.mEnd = zero; + field_0x40 = zero; + setActorPid(-1); field_0x4c = 0; mFrontFlag = 1; mBackFlag = 0; @@ -19,7 +20,8 @@ void cBgS_LinChk::ct() { /* 80247480-80247500 .text Set2__11cBgS_LinChkFP4cXyzP4cXyzUi */ void cBgS_LinChk::Set2(cXyz* pStart, cXyz* pEnd, unsigned int actorPid) { - mLin.SetStartEnd(*pStart, *pEnd); + mLin.mStart.set(*pStart); + mLin.mEnd.set(*pEnd); field_0x40 = *pEnd; setActorPid(actorPid); field_0x4c &= ~0x10; diff --git a/src/SSystem/SComponent/c_lib.cpp b/src/SSystem/SComponent/c_lib.cpp index 9ddb7366e..3678ef251 100644 --- a/src/SSystem/SComponent/c_lib.cpp +++ b/src/SSystem/SComponent/c_lib.cpp @@ -4,10 +4,11 @@ // #include "SSystem/SComponent/c_lib.h" -#include "SSystem/SComponent/c_math.h" #include "MSL_C/string.h" +#include "SSystem/SComponent/c_math.h" #include "dolphin/mtx/mtxvec.h" + /* 802528A4-802528C4 .text cLib_memCpy__FPvPCvUl */ void cLib_memCpy(void* dst, const void* src, unsigned long size) { memcpy(dst, src, size); @@ -202,35 +203,33 @@ void cLib_addCalcAngleS2(s16* pValue, s16 target, s16 scale, s16 maxStep) { } /* 802532C4-8025335C .text cLib_addCalcAngleL__FPlllll */ -s16 cLib_addCalcAngleL(s32* pValue, s32 target, s32 scale, s32 maxStep, s32 minStep) { +s32 cLib_addCalcAngleL(s32* pValue, s32 target, s32 scale, s32 maxStep, s32 minStep) { s32 diff = target - *pValue; if (*pValue != target) { - s32 step = (diff) / scale; - if (step > minStep || step < -minStep) { - if (step > maxStep) { - step = maxStep; + scale = (diff) / scale; + if (scale > minStep || scale < -minStep) { + if (scale > maxStep) { + scale = maxStep; } - if (step < -maxStep) { - step = -maxStep; + if (scale < -maxStep) { + scale = -maxStep; } - *pValue += step; + *pValue += scale; } else { if (0 <= diff) { *pValue += minStep; - diff = target - *pValue; - if (0 >= diff) { + if (0 >= target - *pValue) { *pValue = target; } } else { *pValue -= minStep; - diff = target - *pValue; - if (0 <= diff) { + if (0 <= target - *pValue) { *pValue = target; } } } } - return target - *pValue; + return diff; } /* 8025335C-802533D0 .text cLib_chaseUC__FPUcUcUc */ diff --git a/src/SSystem/SComponent/c_m3d_g_cyl.cpp b/src/SSystem/SComponent/c_m3d_g_cyl.cpp index 799db4b59..8fe53520d 100644 --- a/src/SSystem/SComponent/c_m3d_g_cyl.cpp +++ b/src/SSystem/SComponent/c_m3d_g_cyl.cpp @@ -8,9 +8,9 @@ #include "JSystem/JUtility/JUTAssert.h" #include "MSL_C/float.h" -#define CHECK_FLOAT_CLASS(line, x) JUT_ASSERT(__FILE__, line, !(((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)) ) == 1)); -#define CHECK_FLOAT_RANGE(line, x) JUT_ASSERT(__FILE__, line, -1.0e32f < x && x < 1.0e32f); -#define CHECK_VEC3_RANGE(line, v) JUT_ASSERT(__FILE__, line, -1.0e32f < v.x && v.x < 1.0e32f && -1.0e32f < v.y && v.y < 1.0e32f && -1.0e32f < v.z && v.z < 1.0e32f) +#define CHECK_FLOAT_CLASS(line, x) JUT_ASSERT(line, !(((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)) ) == 1)); +#define CHECK_FLOAT_RANGE(line, x) JUT_ASSERT(line, -1.0e32f < x && x < 1.0e32f); +#define CHECK_VEC3_RANGE(line, v) JUT_ASSERT(line, -1.0e32f < v.x && v.x < 1.0e32f && -1.0e32f < v.y && v.y < 1.0e32f && -1.0e32f < v.z && v.z < 1.0e32f) /* 80251D88-80252020 .text SetC__8cM3dGCylFRC4cXyz */ void cM3dGCyl::SetC(const cXyz& pos) { diff --git a/src/SSystem/SComponent/c_m3d_g_sph.cpp b/src/SSystem/SComponent/c_m3d_g_sph.cpp index e52590819..cd3bd4ae0 100644 --- a/src/SSystem/SComponent/c_m3d_g_sph.cpp +++ b/src/SSystem/SComponent/c_m3d_g_sph.cpp @@ -8,9 +8,9 @@ #include "JSystem/JUtility/JUTAssert.h" #include "MSL_C/float.h" -#define CHECK_FLOAT_CLASS(line, x) JUT_ASSERT(__FILE__, line, !(((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)) ) == 1)); -#define CHECK_FLOAT_RANGE(line, x) JUT_ASSERT(__FILE__, line, -1.0e32f < x && x < 1.0e32f); -#define CHECK_VEC3_RANGE(line, v) JUT_ASSERT(__FILE__, line, -1.0e32f < v.x && v.x < 1.0e32f && -1.0e32f < v.y && v.y < 1.0e32f && -1.0e32f < v.z && v.z < 1.0e32f) +#define CHECK_FLOAT_CLASS(line, x) JUT_ASSERT(line, !(((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)) ) == 1)); +#define CHECK_FLOAT_RANGE(line, x) JUT_ASSERT(line, -1.0e32f < x && x < 1.0e32f); +#define CHECK_VEC3_RANGE(line, v) JUT_ASSERT(line, -1.0e32f < v.x && v.x < 1.0e32f && -1.0e32f < v.y && v.y < 1.0e32f && -1.0e32f < v.z && v.z < 1.0e32f) /* 8025238C-80252624 .text SetC__8cM3dGSphFRC4cXyz */ void cM3dGSph::SetC(const cXyz& pos) { diff --git a/src/SSystem/SComponent/c_math.cpp b/src/SSystem/SComponent/c_math.cpp index 6f6638a60..7f9e190c0 100644 --- a/src/SSystem/SComponent/c_math.cpp +++ b/src/SSystem/SComponent/c_math.cpp @@ -10,8 +10,8 @@ /* 80246044-8024609C .text cM_rad2s__Ff */ s16 cM_rad2s(float f0) { - f32 tmpF = fmod(f0, 6.2831854820251465 /* approx. 2 * PI */); - s32 tmp = (tmpF * 10430.378f /* approx. 32768 / PI */); + f64 tmpF = fmod(f0, 6.2831854820251465 /* approx. 2 * PI */); + s32 tmp = (tmpF * 10430.3779296875 /* approx. 32768 / PI */); if (tmp < -0x8000) { tmp += 0x10000; } else if (tmp > 0x7FFF) { diff --git a/src/SSystem/SComponent/c_xyz.cpp b/src/SSystem/SComponent/c_xyz.cpp index 346d984f2..5f2cac9e8 100644 --- a/src/SSystem/SComponent/c_xyz.cpp +++ b/src/SSystem/SComponent/c_xyz.cpp @@ -4,9 +4,9 @@ // #include "SSystem/SComponent/c_xyz.h" -#include "SSystem/SComponent/c_math.h" -#include "MSL_C/float.h" #include "JSystem/JUtility/JUTAssert.h" +#include "MSL_C/float.h" +#include "SSystem/SComponent/c_math.h" const cXyz cXyz::Zero(0, 0, 0); const cXyz cXyz::BaseX(1, 0, 0); @@ -150,7 +150,6 @@ bool cXyz::operator!=(const Vec& vec) const { /* 80245CE4-80245D48 .text isZero__4cXyzCFv */ bool cXyz::isZero(void) const { - return fabsf(this->x) < 3.814697e-06 && - fabsf(this->y) < 3.814697e-06 && - fabsf(this->z) < 3.814697e-06; + return fabsf(this->x) < 3.814697e-06f && fabsf(this->y) < 3.814697e-06f && + fabsf(this->z) < 3.814697e-06f; } From 7287bab089bea8312cdfcd514324771ee010114b Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Tue, 12 Sep 2023 19:00:03 -0400 Subject: [PATCH 2/2] More d_a_item funcs (#20) * More d_a_item funcs * Fix create and floats --- include/SSystem/SComponent/c_cc_d.h | 10 +- include/d/actor/d_a_item.h | 31 ++- include/d/actor/d_a_itembase.h | 30 +-- include/d/actor/d_a_itembase_static.h | 2 +- include/d/d_com_inf_game.h | 16 ++ include/d/d_item.h | 2 + include/d/d_item_data.h | 33 ++- src/d/actor/d_a_item.cpp | 277 ++++++++++++++++++++++---- src/d/actor/d_a_item_static.cpp | 23 ++- src/d/actor/d_a_itembase_static.cpp | 5 +- src/d/actor/d_a_tag_ret.cpp | 2 +- src/d/d_item.cpp | 4 +- src/d/d_item_data.cpp | 8 +- 13 files changed, 361 insertions(+), 82 deletions(-) diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index e2fd2f853..926469245 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -22,7 +22,15 @@ class cCcD_AabAttr; class cCcD_CylAttr; class cCcD_SphAttr; -enum cCcD_ObjAtType {}; +enum cCcD_ObjAtType { + /* 0x00000002 */ AT_TYPE_SWORD = (1 << 1), + /* 0x00000020 */ AT_TYPE_BOMB = (1 << 5), + /* 0x00000040 */ AT_TYPE_BOOMERANG = (1 << 6), + /* 0x00004000 */ AT_TYPE_NORMAL_ARROW = (1 << 14), + /* 0x00040000 */ AT_TYPE_FIRE_ARROW = (1 << 18), + /* 0x00080000 */ AT_TYPE_ICE_ARROW = (1 << 19), + /* 0x00100000 */ AT_TYPE_LIGHT_ARROW = (1 << 20), +}; class cCcD_ShapeAttr { public: diff --git a/include/d/actor/d_a_item.h b/include/d/actor/d_a_item.h index 589e11240..6e1293951 100644 --- a/include/d/actor/d_a_item.h +++ b/include/d/actor/d_a_item.h @@ -2,6 +2,7 @@ #define D_A_ITEM_H #include "d/actor/d_a_itembase.h" +#include "d/d_particle.h" class daItem_c : public daItemBase_c { public: @@ -28,7 +29,7 @@ public: void itemDefaultRotateY(); bool checkItemDisappear(); void setItemTimer(int); - bool checkPlayerGet(); + BOOL checkPlayerGet(); void itemActionForRupee(); void itemActionForHeart(); void itemActionForKey(); @@ -45,14 +46,36 @@ public: void mode_water(); void initAction(); s32 _daItem_isdelete(); + + s32 checkControl(); + s32 startControl(); + s32 endControl(); + s32 checkLock(); + s32 setLock(); + s32 releaseLock(); + s32 checkActionNow(); public: - u8 temp1[0x20]; + /* 0x648 */ s32 mSwitchId; + /* 0x64C */ s32 mActivationSwitch; + /* 0x650 */ f32 field3_0x650; + /* 0x654 */ u8 field4_0x654[0x658 - 0x654]; + /* 0x658 */ s16 mItemTimer; + /* 0x65A */ s16 field7_0x65a; + /* 0x65C */ s16 field8_0x65c; + /* 0x65E */ u8 field10_0x65e[0x667 - 0x65E]; + /* 0x667 */ u8 mUnknownParam; /* 0x668 */ u8 mItemAction; /* 0x669 */ u8 mStatusFlags; /* 0x66A */ u8 mMode; - /* 0x66B */ u8 mCurAction; - u8 temp2[0x54]; + /* 0x66B */ u8 mCurState; + /* 0x66C */ u8 field23_0x66c[0x6BC - 0x66C]; + // /* 0x674 */ dPa_rippleEcallBack mPtclRippleCb; + // /* 0x688 */ dPa_followEcallBack mPtclFollowCb; + // /* 0x69C */ dPa_smokeEcallBack mPtclSmokeCb; + /* 0x6BC */ JPABaseEmitter* mpParticleEmitter; }; +STATIC_ASSERT(sizeof(daItem_c) == 0x6C0); + #endif /* D_A_ITEM_H */ \ No newline at end of file diff --git a/include/d/actor/d_a_itembase.h b/include/d/actor/d_a_itembase.h index f9584cdbb..adba40c4a 100644 --- a/include/d/actor/d_a_itembase.h +++ b/include/d/actor/d_a_itembase.h @@ -3,6 +3,9 @@ #include "f_op/f_op_actor.h" #include "SSystem/SComponent/c_phase.h" +#include "d/d_bg_s.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" class mDoExt_btkAnm; class mDoExt_brkAnm; @@ -15,17 +18,22 @@ struct daItemBase_c_m_data { /* 0x0C */ float mScaleAnimSpeed; /* 0x10 */ float field4_0x10; /* 0x14 */ short field5_0x14; - /* 0x16 */ short field6_0x16; + /* 0x16 */ short mDuration; /* 0x18 */ short field7_0x18; /* 0x1A */ u8 field8_0x1a; /* 0x1B */ u8 field9_0x1b; /* 0x1C */ short mNumFramesPerFullSpin; - u8 temp1[0x26]; + u8 temp1[0x1A]; + /* 0x38 */ f32 mPickedUpInitialSpeedY; + /* 0x3C */ f32 mPickedUpGravity; + /* 0x40 */ short field45_0x40; /* 0x42 */ short field47_0x42; u8 temp2[0x4]; /* 0x48 */ float mVelocityScale; }; +STATIC_ASSERT(sizeof(daItemBase_c_m_data) == 0x4C); + struct daItemBase_c : public fopAc_ac_c { public: s32 DeleteBase(const char*); @@ -46,12 +54,10 @@ public: void hide(); void show(); void changeDraw(); - void chkDraw(); + bool chkDraw(); void dead(); void chkDead(); void setLoadError(); - void CheckItemCreateHeap(fopAc_ac_c*); - void CheckFieldItemCreateHeap(fopAc_ac_c*); daItemBase_c_m_data* getData(); @@ -66,15 +72,11 @@ public: /* 0x2B0 */ mDoExt_brkAnm* mBrkAnm1; /* 0x2B4 */ mDoExt_brkAnm* mBrkAnm2; /* 0x2B8 */ mDoExt_bckAnm* mBckAnm; - // /* 0x2BC */ dBgS_Acch mAcch; - // /* 0x480 */ dBgS_AcchCir mAcchCir; - // /* 0x4C0 */ dCcD_Stts mStts; - // /* 0x4FC */ dCcD_Cyl mCyl; - // /* 0x62C */ undefined field14_0x62c; - // /* 0x62D */ undefined field15_0x62d; - // /* 0x62E */ undefined field16_0x62e; - // /* 0x62F */ undefined field17_0x62f; - u8 temp[0x374]; + /* 0x2BC */ dBgS_Acch mAcch; + /* 0x480 */ dBgS_AcchCir mAcchCir; + /* 0x4C0 */ dCcD_Stts mStts; + /* 0x4FC */ dCcD_Cyl mCyl; + /* 0x62C */ u8 field14_0x62c[0x630 - 0x62C]; /* 0x630 */ int mPickupFlag; /* 0x634 */ int field19_0x634; /* 0x638 */ short field20_0x638; diff --git a/include/d/actor/d_a_itembase_static.h b/include/d/actor/d_a_itembase_static.h index a24ceccb8..b6405befc 100644 --- a/include/d/actor/d_a_itembase_static.h +++ b/include/d/actor/d_a_itembase_static.h @@ -14,6 +14,6 @@ void dead(); void chkDead(); void setLoadError(); void CheckItemCreateHeap(fopAc_ac_c*); -void CheckFieldItemCreateHeap(fopAc_ac_c*); +s32 CheckFieldItemCreateHeap(fopAc_ac_c*); #endif /* D_A_ITEMBASE_STATIC_H */ \ No newline at end of file diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 022c4f011..8631eb97f 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -428,6 +428,14 @@ inline BOOL dComIfGs_isSwitch(s32 i_no, s32 i_roomNo) { return g_dComIfG_gameInfo.save.isSwitch(i_no, i_roomNo); } +inline void dComIfGs_onItem(int bitNo, int roomNo) { + g_dComIfG_gameInfo.save.onItem(bitNo, roomNo); +} + +inline bool dComIfGs_isItem(int bitNo, int roomNo) { + return g_dComIfG_gameInfo.save.isItem(bitNo, roomNo); +} + /** * === PLAY === */ @@ -507,6 +515,10 @@ inline dBgS* dComIfG_Bgsp() { return &g_dComIfG_gameInfo.play.mBgS; } +inline dCcS* dComIfG_Ccsp() { + return &g_dComIfG_gameInfo.play.mCcS; +} + inline daShip_c* dComIfGp_getShipActor() { return (daShip_c*)g_dComIfG_gameInfo.play.getPlayerPtr(2); } @@ -519,6 +531,10 @@ inline dStage_stageDt_c& dComIfGp_getStage() { return g_dComIfG_gameInfo.play.getStage(); } +inline daPy_py_c* daPy_getPlayerActorClass() { + return (daPy_py_c*)dComIfGp_getPlayer(0); +} + inline daPy_lk_c* daPy_getPlayerLinkActorClass() { return (daPy_lk_c*)g_dComIfG_gameInfo.play.getPlayerPtr(0); } diff --git a/include/d/d_item.h b/include/d/d_item.h index b902b82da..c68847686 100644 --- a/include/d/d_item.h +++ b/include/d/d_item.h @@ -1,6 +1,8 @@ #ifndef D_ITEM_H #define D_ITEM_H +#include "dolphin/types.h" + void execItemGet(u8 itemNo); BOOL checkItemGet(u8 itemNo, BOOL defaultVal); void item_func_heart(); diff --git a/include/d/d_item_data.h b/include/d/d_item_data.h index 077af275f..bcbac46ca 100644 --- a/include/d/d_item_data.h +++ b/include/d/d_item_data.h @@ -282,6 +282,29 @@ struct dItem_data_item_resource { STATIC_ASSERT(sizeof(dItem_data_item_resource) == 0x24); +struct dItem_data_field_item_res { + /* 0x00 */ char * mModelArcName; + /* 0x04 */ short mModelFileId; + /* 0x06 */ short mBtkAnmResIdx1; + /* 0x08 */ short mBtkAnmResIdx2; + /* 0x0A */ short mBrkAnmResIdx1; + /* 0x0C */ short mBrkAnmResIdx2; + /* 0x0E */ short mBckAnmResIdx; + /* 0x10 */ u8 mTevRegAnimFrameIndex; + /* 0x11 */ u8 field8_0x11; + /* 0x12 */ u8 field9_0x12; + /* 0x13 */ u8 field10_0x13; + /* 0x14 */ u8 field11_0x14; + /* 0x15 */ u8 field12_0x15; + /* 0x16 */ u8 field13_0x16; + /* 0x17 */ u8 field14_0x17; + /* 0x18 */ u16 mHeapSize; + /* 0x1A */ u8 field16_0x1a; + /* 0x1B */ u8 field17_0x1b; +}; + +STATIC_ASSERT(sizeof(dItem_data_field_item_res) == 0x1C); + struct dItem_data_item_info { /* 0x00 */ u8 mMaybeShadowRelated; /* 0x01 */ u8 mCollisionH; // Cylinder Height @@ -293,8 +316,14 @@ STATIC_ASSERT(sizeof(dItem_data_item_info) == 0x4); class dItem_data { public: - static dItem_data_item_resource item_resource[0x100]; - static dItem_data_item_info item_info[0x100]; + static dItem_data_item_resource item_resource[0x100]; + static dItem_data_field_item_res field_item_res[0x100]; + static dItem_data_item_info item_info[0x100]; + + static bool checkAppearEffect(u8 itemNo); + static s16 getAppearEffect(u8 itemNo); + static bool checkSpecialEffect(u8 itemNo); + static u16 getSpecialEffect(u8 itemNo); }; #endif /* D_ITEM_DATA_H */ \ No newline at end of file diff --git a/src/d/actor/d_a_item.cpp b/src/d/actor/d_a_item.cpp index 9dc44688e..43a0cd434 100644 --- a/src/d/actor/d_a_item.cpp +++ b/src/d/actor/d_a_item.cpp @@ -5,14 +5,44 @@ #include "d/d_item.h" #include "d/d_item_data.h" +#include "d/actor/d_a_itembase_static.h" #include "d/actor/d_a_item.h" #include "d/actor/d_a_player.h" #include "d/d_com_inf_game.h" +#include "JSystem/JKernel/JKRHeap.h" #include "d/d_procname.h" #include "dolphin/types.h" class dCcD_GObjInf; +static dCcD_SrcCyl m_cyl_src = { + 0, + 0, + 0, + 0, + 0xFFFFFFFF, // Tg damage types + 9, + 0x59, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + + // Cylinder + 0.0, // X + 0.0, // Y + 0.0, // Z + 10.0, // Radius + 50.0, // Height +}; + /* 800F4BC8-800F4BD4 .text getData__12daItemBase_cFv */ daItemBase_c_m_data* daItemBase_c::getData() { return &daItemBase_c::m_data; @@ -27,7 +57,25 @@ void setArrowTrans(short, cXyz) { float daItem_c::getYOffset() { switch (m_itemNo) { case HEART: - return 0.0; + return 0.0f; + case SKULL_NECKLACE: + return 0.0f; + case BOKOBABA_SEED: + return 0.0f; + case GOLDEN_FEATHER: + return 0.0f; + case BOKO_BELT: + return 0.0f; + case RED_JELLY: + case GREEN_JELLY: + case BLUE_JELLY: + return 0.0f; + case SWORD: + return 20.0f; + case SHIELD: + return 23.0f; + case DROPPED_SWORD: + return 10.0f; case GREEN_RUPEE: case BLUE_RUPEE: case YELLOW_RUPEE: @@ -35,33 +83,15 @@ float daItem_c::getYOffset() { case PURPLE_RUPEE: case ORANGE_RUPEE: case SILVER_RUPEE: - return 0.0; + return 0.0f; case KAKERA_HEART: case UTUWA_HEART: - return 0.0; + return 0.0f; case SMALL_KEY: case BOSS_KEY: - return 0.0; - case SWORD: - return 20.0; - case SHIELD: - return 23.0; - case DROPPED_SWORD: - return 10.0; - case SKULL_NECKLACE: - return 0.0; - case BOKOBABA_SEED: - return 0.0; - case GOLDEN_FEATHER: - return 0.0; - case BOKO_BELT: - return 0.0; - case RED_JELLY: - case GREEN_JELLY: - case BLUE_JELLY: - return 0.0; + return 0.0f; default: - return 0.0; + return 0.0f; } } @@ -83,11 +113,120 @@ void itemGetCallBack(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { /* 800F5044-800F53EC .text CreateInit__8daItem_cFv */ void daItem_c::CreateInit() { /* Nonmatching */ + mAcchCir.SetWall(30.0, 30.0); + cXyz* speedPtr = &speed; + mAcch.Set(¤t.pos, &next.pos, this, 1, &mAcchCir, speedPtr, NULL, NULL); + mAcch.m_flags &= ~0x400; + mAcch.m_flags &= ~0x8; + mCullMtx = mModel->mBaseTransformMtx; + mStts.Init(0, 0xFF, this); + mCyl.Set(m_cyl_src); + mCyl.SetCoHitCallback(&itemGetCallBack); + + dItem_data_item_info* item_info = &dItem_data::item_info[m_itemNo]; + f32 height = item_info->mCollisionH; + f32 radius = item_info->mCollisionR; + if (mScale.x > 1.0) { + height *= mScale.x; + radius *= mScale.x; + } + mCyl.SetR(radius); + mCyl.SetH(height); + + mItemTimer = getData()->mDuration; + field7_0x65a = getData()->field7_0x18; + mCurState = 0; + field3_0x650 = speedPtr->y; + mStatusFlags |= 2; + + mUnknownParam = (fpcM_GetParam(this) & 0x03000000) >> 0x18; + mItemAction = (fpcM_GetParam(this) & 0xFC000000) >> 0x1A; + + show(); + + if (dItem_data::checkSpecialEffect(m_itemNo) && (m_itemNo != SMALL_KEY || (mStatusFlags & 2))) { + dItem_data::getSpecialEffect(m_itemNo); + // TODO: dPa_control_c::set + } + + switch (m_itemNo) { + case BOMB_5: + case BOMB_10: + case BOMB_20: + case BOMB_30: + mScaleTarget.x = 0.6; + mScaleTarget.y = 0.6; + mScaleTarget.z = 0.6; + break; + default: + mScaleTarget.x = 1.0; + mScaleTarget.y = 1.0; + mScaleTarget.z = 1.0; + break; + } + + mSwitchId = (fpcM_GetParam(this) & 0x00FF0000) >> 0x10; + if (mSwitchId != 0xFF && i_fopAcM_isSwitch(this, mSwitchId)) { + hide(); + mStatusFlags |= 2; + } + mActivationSwitch = (orig.angle.z & 0x00FF) >> 0; + + initAction(); + + switch (m_itemNo) { + case SHIELD: + mStatus |= 0x4000; + break; + case DROPPED_SWORD: + current.angle.x = 0x4000; + break; + } + + set_mtx(); + animPlay(1.0, 1.0, 1.0, 1.0, 1.0); + + s16 procname = PROC_BST; // Gohdan + if (fopAcIt_Judge(&fpcSch_JudgeForPName, &procname)) { + // TODO: dPa_control_c::set + mpParticleEmitter = 0; + } } /* 800F53EC-800F5668 .text _daItem_create__8daItem_cFv */ s32 daItem_c::_daItem_create() { /* Nonmatching */ + fopAcM_SetupActor(this, daItem_c); + + m_itemNo = (fpcM_GetParam(this) & 0x000000FF) >> 0x00; + + if (!dItem_data::field_item_res[m_itemNo].mModelArcName) { + setLoadError(); + return cPhs_ERROR_e; + } + + mPickupFlag = (fpcM_GetParam(this) & 0x0000FF00) >> 0x08; + if (m_itemNo != BLUE_JELLY) { // Blue Chu Jelly uses mPickupFlag as if it was a switch. + mPickupFlag &= 0x7F; + if (dComIfGs_isItem(mPickupFlag, orig.roomNo) && mPickupFlag != 0x7F) { + // Already picked up, don't create the item again. + setLoadError(); + return cPhs_ERROR_e; + } + } + + s32 phase_state = dComIfG_resLoad(&mPhs, dItem_data::field_item_res[m_itemNo].mModelArcName); + if (phase_state == cPhs_COMPLEATE_e) { + u16 heapSize = dItem_data::field_item_res[m_itemNo].mHeapSize; + s32 result = fopAcM_entrySolidHeap(this, (heapCallbackFunc)&CheckFieldItemCreateHeap, heapSize); + if (!result) { + return cPhs_ERROR_e; + } + + CreateInit(); + } + + return phase_state; } /* 800F5668-800F5834 .text _daItem_execute__8daItem_cFv */ @@ -103,6 +242,20 @@ void daItem_c::mode_proc_call() { /* 800F59CC-800F5AFC .text execInitNormalDirection__8daItem_cFv */ void daItem_c::execInitNormalDirection() { /* Nonmatching */ + daPy_getPlayerActorClass()->getHeadTopPos(); + + field8_0x65c = getData()->field45_0x40; + + f32 speedY = getData()->mPickedUpInitialSpeedY; + speed.x = 0; + speed.y = speedY; + speed.z = 0; + mGravity = getData()->mPickedUpGravity; + + show(); + + // TODO dPa_smokeEcallBack + // TODO mpParticleEmitter } /* 800F5AFC-800F5BC8 .text execMainNormalDirection__8daItem_cFv */ @@ -127,7 +280,10 @@ void daItem_c::execMainGetDemoDirection() { /* 800F5D44-800F5D88 .text execBringNezumi__8daItem_cFv */ void daItem_c::execBringNezumi() { - /* Nonmatching */ + if (mUnknownParam != 1) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + mode_proc_call(); } /* 800F5D88-800F5F40 .text execWaitMain__8daItem_cFv */ @@ -147,17 +303,37 @@ void daItem_c::scaleAnimFromBossItem() { /* 800F60C0-800F6110 .text _daItem_draw__8daItem_cFv */ s32 daItem_c::_daItem_draw() { - /* Nonmatching */ + if (chkDraw()) { + return DrawBase(); + } + return 1; } /* 800F6110-800F61C8 .text setTevStr__8daItem_cFv */ void daItem_c::setTevStr() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, getPositionP(), &mTevStr); + + mTevStr.mColorC0.r = 0x96; + mTevStr.mColorC0.g = 0x96; + mTevStr.mColorC0.b = 0x96; + mTevStr.mColorK0.r = 0xFF; + mTevStr.mColorK0.g = 0xFF; + mTevStr.mColorK0.b = 0xFF; + g_env_light.setLightTevColorType(mModel, &mTevStr); + + for (int i = 0; i < 2; i++) { + if (!mModelArrow[i]) { + continue; + } + g_env_light.setLightTevColorType(mModelArrow[i], &mTevStr); + } } /* 800F61C8-800F6268 .text _daItem_delete__8daItem_cFv */ s32 daItem_c::_daItem_delete() { /* Nonmatching */ + // TODO: dPa_rippleEcallBack::end() + DeleteBase(dItem_data::field_item_res[m_itemNo].mModelArcName); } /* 800F6268-800F6434 .text Reflect__FR4cXyzP4cXyzff */ @@ -181,7 +357,7 @@ void daItem_c::itemDefaultRotateY() { /* 800F6D78-800F6E54 .text checkItemDisappear__8daItem_cFv */ bool daItem_c::checkItemDisappear() { bool disappearing = true; - if (mCurAction == 3) { + if (mCurState == 3) { disappearing = false; show(); } @@ -197,7 +373,7 @@ bool daItem_c::checkItemDisappear() { if (g_dComIfG_gameInfo.play.mEvtCtrl.mMode != 0) { disappearing = false; } - if (mCurAction == 4) { + if (mCurState == 4) { disappearing = false; } if ((mStatusFlags & 0x08) || (mStatusFlags & 0x40) || (mStatus & 0x100000)) { @@ -208,13 +384,23 @@ bool daItem_c::checkItemDisappear() { } /* 800F6E54-800F6E74 .text setItemTimer__8daItem_cFi */ -void daItem_c::setItemTimer(int) { - /* Nonmatching */ +void daItem_c::setItemTimer(int timer) { + if (timer == -1) { + mStatusFlags |= 0x10; + return; + } + mItemTimer = timer; } /* 800F6E74-800F6EC8 .text checkPlayerGet__8daItem_cFv */ -bool daItem_c::checkPlayerGet() { - /* Nonmatching */ +BOOL daItem_c::checkPlayerGet() { + if (field20_0x638 < getData()->field47_0x42) { + return FALSE; + } + if (mCurState == 3) { + return FALSE; + } + return TRUE; } /* 800F6EC8-800F7028 .text itemActionForRupee__8daItem_cFv */ @@ -259,14 +445,23 @@ void daItem_c::set_bound_se() { /* 800F7DDC-800F7E6C .text checkGetItem__8daItem_cFv */ s32 daItem_c::checkGetItem() { - /* Nonmatching */ - if (checkPlayerGet()) { - itemGetExecute(); - - return 1; + if (!checkPlayerGet()) { + return 0; + } + + if (mCyl.ChkTgHit()) { + cCcD_Obj* hitObj = mCyl.GetTgHitObj(); + if (hitObj) { + u32 atType = hitObj->GetAtType(); + if (atType & AT_TYPE_SWORD) { + itemGetExecute(); + return 1; + } else if (atType & AT_TYPE_BOOMERANG) { + mStatusFlags |= 0x08; + } + } } - mStatusFlags |= 0x08; return 0; } @@ -301,8 +496,8 @@ void daItem_c::initAction() { } /* 800F8950-800F8970 .text daItem_Draw__FP8daItem_c */ -void daItem_Draw(daItem_c*) { - /* Nonmatching */ +s32 daItem_Draw(daItem_c* i_this) { + return i_this->_daItem_draw(); } /* 800F8970-800F8990 .text daItem_Execute__FP8daItem_c */ @@ -322,7 +517,7 @@ s32 daItem_Delete(daItem_c* i_this) { /* 800F89D0-800F89F0 .text daItem_Create__FP10fopAc_ac_c */ s32 daItem_Create(fopAc_ac_c* i_this) { - /* Nonmatching */ + return ((daItem_c*)i_this)->_daItem_create(); } /* 800F89F0-800F89F8 .text _daItem_isdelete__8daItem_cFv */ diff --git a/src/d/actor/d_a_item_static.cpp b/src/d/actor/d_a_item_static.cpp index 2039aa74b..725e280ba 100644 --- a/src/d/actor/d_a_item_static.cpp +++ b/src/d/actor/d_a_item_static.cpp @@ -3,41 +3,44 @@ // Translation Unit: d_a_item_static.cpp // -#include "d_a_item_static.h" +// #include "d/actor/d_a_item_static.h" +#include "d/actor/d_a_item.h" #include "dolphin/types.h" /* 80068820-800688A0 .text checkControl__8daItem_cFv */ -void daItem_c::checkControl() { +s32 daItem_c::checkControl() { /* Nonmatching */ } /* 800688A0-800688E8 .text startControl__8daItem_cFv */ -void daItem_c::startControl() { +s32 daItem_c::startControl() { /* Nonmatching */ } /* 800688E8-800688F8 .text endControl__8daItem_cFv */ -void daItem_c::endControl() { - /* Nonmatching */ +s32 daItem_c::endControl() { + mCurState = 0; + return 1; } /* 800688F8-80068950 .text checkLock__8daItem_cFv */ -void daItem_c::checkLock() { +s32 daItem_c::checkLock() { /* Nonmatching */ } /* 80068950-80068998 .text setLock__8daItem_cFv */ -void daItem_c::setLock() { +s32 daItem_c::setLock() { /* Nonmatching */ } /* 80068998-800689A8 .text releaseLock__8daItem_cFv */ -void daItem_c::releaseLock() { - /* Nonmatching */ +s32 daItem_c::releaseLock() { + mCurState = 0; + return 1; } /* 800689A8-800689F0 .text checkActionNow__8daItem_cFv */ -void daItem_c::checkActionNow() { +s32 daItem_c::checkActionNow() { /* Nonmatching */ } diff --git a/src/d/actor/d_a_itembase_static.cpp b/src/d/actor/d_a_itembase_static.cpp index 5ea11b66a..42448a031 100644 --- a/src/d/actor/d_a_itembase_static.cpp +++ b/src/d/actor/d_a_itembase_static.cpp @@ -4,6 +4,7 @@ // #include "d/actor/d_a_itembase_static.h" +#include "d/actor/d_a_itembase.h" #include "dolphin/types.h" /* 80068650-80068658 .text getItemNo__12daItemBase_cFv */ @@ -37,7 +38,7 @@ void daItemBase_c::changeDraw() { } /* 800686F8-80068710 .text chkDraw__12daItemBase_cFv */ -void daItemBase_c::chkDraw() { +bool daItemBase_c::chkDraw() { /* Nonmatching */ } @@ -62,7 +63,7 @@ void CheckItemCreateHeap(fopAc_ac_c*) { } /* 800687B4-80068820 .text CheckFieldItemCreateHeap__FP10fopAc_ac_c */ -void CheckFieldItemCreateHeap(fopAc_ac_c*) { +s32 CheckFieldItemCreateHeap(fopAc_ac_c*) { /* Nonmatching */ } diff --git a/src/d/actor/d_a_tag_ret.cpp b/src/d/actor/d_a_tag_ret.cpp index ce1f38ffb..8e652d529 100644 --- a/src/d/actor/d_a_tag_ret.cpp +++ b/src/d/actor/d_a_tag_ret.cpp @@ -93,7 +93,7 @@ namespace daTagRet { mCyl.SetC(current.pos); mCyl.SetR(1000.0f*mScale.x); mCyl.SetH(100.0f*mScale.y); - g_dComIfG_gameInfo.play.mCcS.Set(&mCyl); + dComIfG_Ccsp()->Set(&mCyl); if (mCyl.ChkCoHit()) { u32 playerId = daObj::PrmAbstract(this, PRM_PLAYER_ID_W, PRM_PLAYER_ID_S); diff --git a/src/d/d_item.cpp b/src/d/d_item.cpp index 152bd200a..ef7a27e6e 100644 --- a/src/d/d_item.cpp +++ b/src/d/d_item.cpp @@ -7,12 +7,12 @@ #include "dolphin/types.h" /* 800C2DFC-800C2E30 .text execItemGet__FUc */ -void execItemGet(unsigned char) { +void execItemGet(u8 itemNo) { /* Nonmatching */ } /* 800C2E30-800C2E7C .text checkItemGet__FUci */ -void checkItemGet(unsigned char, int) { +BOOL checkItemGet(u8, BOOL defaultVal) { /* Nonmatching */ } diff --git a/src/d/d_item_data.cpp b/src/d/d_item_data.cpp index d8a9b5c9e..63d1b6353 100644 --- a/src/d/d_item_data.cpp +++ b/src/d/d_item_data.cpp @@ -7,22 +7,22 @@ #include "dolphin/types.h" /* 800C12F4-800C1334 .text checkAppearEffect__10dItem_dataFUc */ -void dItem_data::checkAppearEffect(unsigned char) { +bool dItem_data::checkAppearEffect(u8 itemNo) { /* Nonmatching */ } /* 800C1334-800C13B4 .text getAppearEffect__10dItem_dataFUc */ -void dItem_data::getAppearEffect(unsigned char) { +s16 dItem_data::getAppearEffect(u8 itemNo) { /* Nonmatching */ } /* 800C13B4-800C13F8 .text checkSpecialEffect__10dItem_dataFUc */ -void dItem_data::checkSpecialEffect(unsigned char) { +bool dItem_data::checkSpecialEffect(u8 itemNo) { /* Nonmatching */ } /* 800C13F8-800C1474 .text getSpecialEffect__10dItem_dataFUc */ -void dItem_data::getSpecialEffect(unsigned char) { +u16 dItem_data::getSpecialEffect(u8 itemNo) { /* Nonmatching */ }