mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-16 14:30:33 -04:00
d_a_switem OK
This commit is contained in:
+1
-1
@@ -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"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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<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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user