diff --git a/configure.py b/configure.py index e1fe7fc29..801678f78 100644 --- a/configure.py +++ b/configure.py @@ -1597,7 +1597,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_st"), ActorRel(NonMatching, "d_a_steam_tag"), ActorRel(NonMatching, "d_a_swattack"), - ActorRel(NonMatching, "d_a_switem"), + ActorRel(Matching, "d_a_switem", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_swpropeller"), ActorRel(Matching, "d_a_swtact"), ActorRel(NonMatching, "d_a_tag_etc"), diff --git a/include/d/actor/d_a_item.h b/include/d/actor/d_a_item.h index 60eddfcc2..8e2c5bf2c 100644 --- a/include/d/actor/d_a_item.h +++ b/include/d/actor/d_a_item.h @@ -70,6 +70,8 @@ public: BOOL releaseLock(); BOOL checkActionNow(); + u32 getItemNo() { return m_itemNo; } + static dCcD_SrcCyl m_cyl_src; static s32 m_timer_max; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 9fae7c64e..885bfdb5a 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -253,6 +253,15 @@ public: }; STATIC_ASSERT(sizeof(dComIfG_camera_info_class) == 0x34); +// This is /res/ItemTable/item_table.bin +// The real name of this struct is not currently known, this is a fake name. +struct ItemTableList { + u8 mMagic[0xA]; // "ITEM_TABLE" + short mEntryCount; // 0x1E + u32 mPadding; + u8 mItemTables[0x1E][0x10]; +}; + class dComIfG_play_c { public: dComIfG_play_c() { ct(); } @@ -447,7 +456,8 @@ public: void setMsgDt2Archive(JKRArchive * pArc) { mpHyruleTextArchive = pArc; } #endif - void setItemTable(void * pData) { mpItemTable = pData; } + void setItemTable(void * pData) { mpItemTable = (ItemTableList*)pData; } + ItemTableList* getItemTable() { return mpItemTable; } void setFmapData(void * pData) { mpFmapData = pData; } /* 0x0000 */ dBgS mBgS; @@ -622,7 +632,7 @@ public: /* 0x4A66 */ u8 mIkadaShipBeforeRoomId; /* 0x4A67 */ u8 mIkadaShipId; /* 0x4A68 */ cXyz mIkadaLinkPos; - /* 0x4A74 */ void* mpItemTable; + /* 0x4A74 */ ItemTableList* mpItemTable; /* 0x4A78 */ void* mpFmapData; }; @@ -2186,6 +2196,7 @@ inline void dComIfGp_setMsgDt2Archive(JKRArchive * pArc) { g_dComIfG_gameInfo.pl #endif inline void dComIfGp_setItemTable(void * pData) { g_dComIfG_gameInfo.play.setItemTable(pData); } +inline ItemTableList* dComIfGp_getItemTable() { return g_dComIfG_gameInfo.play.getItemTable(); } inline void dComIfGp_setActorData(void * pData) { g_dComIfG_gameInfo.play.mADM.SetData(pData); } inline void dComIfGp_setFmapData(void * pData) { g_dComIfG_gameInfo.play.setFmapData(pData); } diff --git a/src/d/actor/d_a_switem.cpp b/src/d/actor/d_a_switem.cpp index fb007373b..afc260ff9 100644 --- a/src/d/actor/d_a_switem.cpp +++ b/src/d/actor/d_a_switem.cpp @@ -3,171 +3,251 @@ // Translation Unit: d_a_switem.cpp // -#include "d_a_switem.h" -#include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "d/d_procname.h" +#include "d/d_cc_d.h" +#include "f_op/f_op_draw_tag.h" +#include "d/d_com_inf_game.h" +#include "d/d_item.h" +#include "d/actor/d_a_item.h" + +class daSwItem_c : public fopAc_ac_c { +public: + bool _delete(); + BOOL CreateInit(); + s32 _create(); + bool _execute(); + BOOL isRupeeInAllCreateTable(int); + bool _draw(); + +public: + /* 0x290 */ u8 m290[0x29C - 0x290]; + /* 0x29C */ dCcD_Stts mStts; + /* 0x2D8 */ dCcD_Cyl mCyl; + /* 0x408 */ u8 mAtTypeTrigger; + /* 0x409 */ bool mSpawnedItem; + /* 0x40A */ u8 field_40A[0x40C - 0x40A]; +}; + +namespace daSwItem_prm { + inline u32 getAtType(daSwItem_c* item) { return (fopAcM_GetParam(item) >> 0x00) & 0xFF; } + inline u32 getItemTbl(daSwItem_c* item) { return (fopAcM_GetParam(item) >> 0x08) & 0x3F; } + inline u32 getItemBitNo(daSwItem_c* item) { return (fopAcM_GetParam(item) >> 0x0E) & 0x7F; } +} + +static dCcD_SrcCyl l_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ 0x09, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* 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, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 25.0f, + /* Height */ 50.0f, + }, +}; /* 00000078-00000080 .text _delete__10daSwItem_cFv */ -void daSwItem_c::_delete() { - /* Nonmatching */ +bool daSwItem_c::_delete() { + return true; } /* 00000080-00000154 .text CreateInit__10daSwItem_cFv */ -void daSwItem_c::CreateInit() { - /* Nonmatching */ +BOOL daSwItem_c::CreateInit() { + int itemBitNo = daSwItem_prm::getItemBitNo(this); + mAtTypeTrigger = daSwItem_prm::getAtType(this); + + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + mCyl.SetR(mScale.x * 25.0f); + mCyl.SetH(mScale.y * 50.0f); + + if (fopAcM_isItem(this, itemBitNo) && itemBitNo != 0x7F) { + return FALSE; + } + + fopDwTg_DrawQTo(&mDwTg); + return TRUE; } /* 00000154-00000250 .text _create__10daSwItem_cFv */ -void daSwItem_c::_create() { - /* Nonmatching */ -} - -/* 00000250-0000031C .text __dt__8dCcD_CylFv */ -dCcD_Cyl::~dCcD_Cyl() { - /* Nonmatching */ -} - -/* 0000031C-00000364 .text __dt__8cM3dGCylFv */ -cM3dGCyl::~cM3dGCyl() { - /* Nonmatching */ -} - -/* 00000364-000003C0 .text __dt__14cCcD_ShapeAttrFv */ -cCcD_ShapeAttr::~cCcD_ShapeAttr() { - /* Nonmatching */ -} - -/* 000003C0-00000408 .text __dt__8cM3dGAabFv */ -cM3dGAab::~cM3dGAab() { - /* Nonmatching */ +s32 daSwItem_c::_create() { + fopAcM_SetupActor(this, daSwItem_c); + + if (!CreateInit()) { + return cPhs_ERROR_e; + } + + return cPhs_COMPLEATE_e; } /* 00000408-000006DC .text _execute__10daSwItem_cFv */ -void daSwItem_c::_execute() { +bool daSwItem_c::_execute() { /* Nonmatching */ + bool triggered = false; + if (mCyl.ChkTgHit()) { + cCcD_Obj* obj = mCyl.GetTgHitObj(); + if(obj) { + switch (mAtTypeTrigger) { + case 0xFF: + triggered = true; + break; + case 0: + if (obj->ChkAtType(AT_TYPE_SWORD) || obj->ChkAtType(AT_TYPE_BOKO_STICK) || + obj->ChkAtType(AT_TYPE_STALFOS_MACE) || obj->ChkAtType(AT_TYPE_MACHETE) || + obj->ChkAtType(AT_TYPE_DARKNUT_SWORD)) + { + triggered = true; + } + break; + case 1: + if (obj->ChkAtType(AT_TYPE_BOMB)) { + triggered = true; + } + break; + case 2: + if (obj->ChkAtType(AT_TYPE_BOOMERANG)) { + triggered = true; + } + break; + case 3: + if (obj->ChkAtType(AT_TYPE_SKULL_HAMMER)) { + triggered = true; + } + break; + case 4: + if (obj->ChkAtType(AT_TYPE_FIRE_ARROW) || obj->ChkAtType(AT_TYPE_ICE_ARROW) || + obj->ChkAtType(AT_TYPE_LIGHT_ARROW) || obj->ChkAtType(AT_TYPE_NORMAL_ARROW)) + { + triggered = true; + } + break; + case 5: + if (obj->ChkAtType(0x8000)) { + triggered = true; + } + break; + } + } + } + + if (triggered && !mSpawnedItem) { + int itemTbl = daSwItem_prm::getItemTbl(this); + int itemBitNo = daSwItem_prm::getItemBitNo(this); + if (fopAcM_isItem(this, daSwItem_prm::getItemBitNo(this))) { + itemBitNo = 0x7F; + } + + csXyz angle(0, orig.angle.y, 0); + u32 itemProcId = fopAcM_createItemFromTable( + ¤t.pos, itemTbl, itemBitNo, + fopAcM_GetHomeRoomNo(this), 0, &angle, 1, NULL + ); + + daItem_c* item = (daItem_c*)fopAcM_SearchByID(itemProcId); + if(item) { + if (isRupee(item->getItemNo()) || isRupeeInAllCreateTable(itemTbl)) { + fopAcM_seStart(this, JA_SE_OBJ_LUPY_OUT, 0); + } else { + fopAcM_seStart(this, JA_SE_OBJ_ITEM_OUT, 0); + } + } + + mSpawnedItem = true; + } + + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + + return true; } /* 000006DC-0000076C .text isRupeeInAllCreateTable__10daSwItem_cFi */ -void daSwItem_c::isRupeeInAllCreateTable(int) { - /* Nonmatching */ +BOOL daSwItem_c::isRupeeInAllCreateTable(int param_1) { + ItemTableList* itemTableList = dComIfGp_getItemTable(); + if (param_1 >= 0x20 && param_1 <= 0x3E && itemTableList) { + u8* itemNo = itemTableList->mItemTables[param_1 - 0x20]; + for (int i = 0; i < 0x10; i++) { + if (isRupee(*itemNo)) { + return true; + } + itemNo++; + } + } + return false; } /* 0000076C-00000774 .text _draw__10daSwItem_cFv */ -void daSwItem_c::_draw() { - /* Nonmatching */ +bool daSwItem_c::_draw() { + return true; } /* 00000774-00000794 .text daSwItem_Create__FPv */ -void daSwItem_Create(void*) { - /* Nonmatching */ +static BOOL daSwItem_Create(void* i_this) { + return static_cast(i_this)->_create(); } /* 00000794-000007B8 .text daSwItem_Delete__FPv */ -void daSwItem_Delete(void*) { - /* Nonmatching */ +static BOOL daSwItem_Delete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 000007B8-000007DC .text daSwItem_Draw__FPv */ -void daSwItem_Draw(void*) { - /* Nonmatching */ +static BOOL daSwItem_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 000007DC-00000800 .text daSwItem_Execute__FPv */ -void daSwItem_Execute(void*) { - /* Nonmatching */ +static BOOL daSwItem_Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00000800-00000808 .text daSwItem_IsDelete__FPv */ -void daSwItem_IsDelete(void*) { - /* Nonmatching */ +static BOOL daSwItem_IsDelete(void* i_this) { + return TRUE; } -/* 00000808-00000818 .text GetShapeAttr__8dCcD_CylFv */ -void dCcD_Cyl::GetShapeAttr() { - /* Nonmatching */ -} - -/* 00000818-00000820 .text GetCoCP__12cCcD_CylAttrFv */ -void cCcD_CylAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00000820-00000828 .text GetCoCP__12cCcD_CylAttrCFv */ -void cCcD_CylAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00000828-00000830 .text CrossAtTg__12cCcD_CylAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000830-00000838 .text CrossAtTg__12cCcD_CylAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000838-00000870 .text CrossAtTg__12cCcD_CylAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00000870-00000878 .text CrossCo__12cCcD_CylAttrCFRC12cCcD_AabAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000878-00000880 .text CrossCo__12cCcD_CylAttrCFRC12cCcD_TriAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000880-00000888 .text CrossCo__12cCcD_CylAttrCFRC12cCcD_PntAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 00000888-000008C0 .text CrossCo__12cCcD_CylAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 000008C0-000008C4 .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} - -/* 000008C4-000008CC .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} - -/* 000008CC-000008D4 .text CrossAtTg__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_ShapeAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 000008D4-000008DC .text CrossCo__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_ShapeAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 000008DC-000008E8 .text GetCoCP__14cCcD_ShapeAttrFv */ -void cCcD_ShapeAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 000008E8-000008F4 .text GetCoCP__14cCcD_ShapeAttrCFv */ -void cCcD_ShapeAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 000008F4-000008FC .text @280@__dt__8dCcD_CylFv */ -void @280@__dt__8dCcD_CylFv { - /* Nonmatching */ -} - -/* 000008FC-00000904 .text @248@__dt__8dCcD_CylFv */ -void @248@__dt__8dCcD_CylFv { - /* Nonmatching */ -} +static actor_method_class daSwItemMethodTable = { + (process_method_func)daSwItem_Create, + (process_method_func)daSwItem_Delete, + (process_method_func)daSwItem_Execute, + (process_method_func)daSwItem_IsDelete, + (process_method_func)daSwItem_Draw, +}; +actor_process_profile_definition g_profile_SW_ITEM = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_SW_ITEM, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daSwItem_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x013A, + /* Actor SubMtd */ &daSwItemMethodTable, + /* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +};