d_a_switem OK

This commit is contained in:
LagoLunatic
2023-10-27 02:57:29 -04:00
parent 828c8672e0
commit 35e8bd76bd
4 changed files with 228 additions and 135 deletions
+1 -1
View File
@@ -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"),
+2
View File
@@ -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;
+13 -2
View File
@@ -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); }
+212 -132
View File
@@ -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(
&current.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<daSwItem_c*>(i_this)->_create();
}
/* 00000794-000007B8 .text daSwItem_Delete__FPv */
void daSwItem_Delete(void*) {
/* Nonmatching */
static BOOL daSwItem_Delete(void* i_this) {
return static_cast<daSwItem_c*>(i_this)->_delete();
}
/* 000007B8-000007DC .text daSwItem_Draw__FPv */
void daSwItem_Draw(void*) {
/* Nonmatching */
static BOOL daSwItem_Draw(void* i_this) {
return static_cast<daSwItem_c*>(i_this)->_draw();
}
/* 000007DC-00000800 .text daSwItem_Execute__FPv */
void daSwItem_Execute(void*) {
/* Nonmatching */
static BOOL daSwItem_Execute(void* i_this) {
return static_cast<daSwItem_c*>(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,
};