d_a_rd work

This commit is contained in:
LagoLunatic
2023-11-12 02:33:14 -05:00
parent 1778dea96c
commit 8ab08c8844
6 changed files with 372 additions and 42 deletions
+15 -12
View File
@@ -47,25 +47,28 @@ public:
class daRd_c : public fopEn_enemy_c {
public:
enum Proc_e {
PROC_INIT = 0,
PROC_EXEC = 1
};
typedef void (daRd_c::*ModeFunc)();
static const u32 m_heapsize;
static const char m_arc_name[];
static const dCcD_SrcCyl m_cyl_src;
daRd_c() {}
void isAnm(s8) {}
void isIkari() {}
void modeProcInit(int) {}
void offIkari() {}
void onIkari() {}
bool isIkari() { return mbIkari; }
void modeProcInit(int newMode) { modeProc(PROC_INIT, newMode); }
void offIkari() { mbIkari = false; }
void onIkari() { mbIkari = true; }
void _searchNearDeadRd(fopAc_ac_c*);
void _nodeControl(J3DNode*, J3DModel*);
void _nodeHeadControl(J3DNode*, J3DModel*);
fopAc_ac_c* _searchNearDeadRd(fopAc_ac_c*);
BOOL _nodeControl(J3DNode*, J3DModel*);
BOOL _nodeHeadControl(J3DNode*, J3DModel*);
BOOL _createHeap();
void createArrowHeap();
bool createArrowHeap();
void checkPlayerInAttack();
void checkPlayerInCry();
void lookBack();
@@ -105,7 +108,7 @@ public:
bool _execute();
void debugDraw();
bool _draw();
void isLinkControl();
bool isLinkControl();
void createInit();
void getArg();
s32 _create();
@@ -127,7 +130,7 @@ public:
/* 0x300 */ u8 m300[0x310 - 0x300];
/* 0x310 */ int m310;
/* 0x314 */ int m314;
/* 0x318 */ u8 m318[0x31C - 0x318];
/* 0x318 */ int m318;
/* 0x31C */ dBgS_ObjAcch mAcch;
/* 0x4E0 */ dBgS_AcchCir mAcchCir;
/* 0x520 */ dCcD_Stts mStts;
@@ -159,7 +162,7 @@ public:
/* 0xD1C */ s16 mD1C;
/* 0xD1E */ s16 mD1E;
/* 0xD20 */ u8 mD20[0xD34 - 0xD20];
/* 0xD34 */ bool mD34;
/* 0xD34 */ bool mbIkari;
/* 0xD35 */ u8 mD35[0xD44 - 0xD35];
};
+2 -2
View File
@@ -110,8 +110,8 @@ inline u32 fopAcM_GetParam(void* pActor) {
return fpcM_GetParam(pActor);
}
inline u32 fopAcM_GetParamBit(void* ac, u8 shift, u8 bit) {
return (fopAcM_GetParam(ac) >> shift) & ((1 << bit) - 1);
inline u32 fopAcM_GetParamBit(u32 param, u8 shift, u8 bit) {
return (param >> shift) & ((1 << bit) - 1);
}
inline void fopAcM_SetParam(void* p_actor, u32 param) {
+1 -1
View File
@@ -295,7 +295,7 @@ s32 daObj_Hole_c::_createHeap() {
/* 00000928-0000096C .text getArg__12daObj_Hole_cFv */
void daObj_Hole_c::getArg() {
u32 param = fopAcM_GetParamBit(this, 0, 0xFFFF);
u32 param = fopAcM_GetParamBit(fopAcM_GetParam(this), 0, 0xFFFF);
mExitIdx = param & 0xFF;
mHasModel = param >> 8;
+347 -20
View File
@@ -15,6 +15,8 @@ static Vec dummy2 = {1.0f, 1.0f, 1.0f};
static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01};
static f64 dummy4[2] = {3.0, 0.5};
static daRd_HIO_c l_HIO;
const u32 daRd_c::m_heapsize = 0x2520;
const char daRd_c::m_arc_name[] = "Rd";
const dCcD_SrcCyl daRd_c::m_cyl_src = {
@@ -127,32 +129,54 @@ daRd_HIO_c::daRd_HIO_c() {
}
/* 0000027C-000002A8 .text searchNeadDeadRd_CB__FPvPv */
static void searchNeadDeadRd_CB(void*, void*) {
/* Nonmatching */
static fopAc_ac_c* searchNeadDeadRd_CB(void* i_actor, void* i_this) {
return static_cast<daRd_c*>(i_this)->_searchNearDeadRd(static_cast<fopAc_ac_c*>(i_actor));
}
/* 000002A8-0000030C .text _searchNearDeadRd__6daRd_cFP10fopAc_ac_c */
void daRd_c::_searchNearDeadRd(fopAc_ac_c*) {
/* Nonmatching */
fopAc_ac_c* daRd_c::_searchNearDeadRd(fopAc_ac_c* i_actor) {
if (fopAcM_GetName(i_actor) == PROC_RD) {
daRd_c* other = static_cast<daRd_c*>(i_actor);
if (other->mMode == 3) {
if (fopAcM_searchActorDistanceXZ(this, i_actor) < l_HIO.m34) {
return i_actor;
}
}
}
return FALSE;
}
/* 0000030C-00000358 .text nodeControl_CB__FP7J3DNodei */
static void nodeControl_CB(J3DNode*, int) {
/* Nonmatching */
static BOOL nodeControl_CB(J3DNode* node, int param_1) {
if (!param_1) {
J3DModel* model = j3dSys.getModel();
daRd_c* i_this = reinterpret_cast<daRd_c*>(model->getUserArea());
if (i_this) {
i_this->_nodeControl(node, model);
}
}
return TRUE;
}
/* 00000358-00000514 .text _nodeControl__6daRd_cFP7J3DNodeP8J3DModel */
void daRd_c::_nodeControl(J3DNode*, J3DModel*) {
BOOL daRd_c::_nodeControl(J3DNode* node, J3DModel* model) {
/* Nonmatching */
}
/* 00000550-0000059C .text nodeHeadControl_CB__FP7J3DNodei */
static void nodeHeadControl_CB(J3DNode*, int) {
/* Nonmatching */
static BOOL nodeHeadControl_CB(J3DNode* node, int param_1) {
if (!param_1) {
J3DModel* model = j3dSys.getModel();
daRd_c* i_this = reinterpret_cast<daRd_c*>(model->getUserArea());
if (i_this) {
i_this->_nodeHeadControl(node, model);
}
}
return TRUE;
}
/* 0000059C-000006A0 .text _nodeHeadControl__6daRd_cFP7J3DNodeP8J3DModel */
void daRd_c::_nodeHeadControl(J3DNode*, J3DModel*) {
BOOL daRd_c::_nodeHeadControl(J3DNode* node, J3DModel* model) {
/* Nonmatching */
}
@@ -163,12 +187,203 @@ static BOOL createHeap_CB(fopAc_ac_c* i_this) {
/* 000006C0-0000096C .text _createHeap__6daRd_cFv */
BOOL daRd_c::_createHeap() {
/* Nonmatching */
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, RD_BDL_RD));
JUT_ASSERT(504, modelData != 0);
mpMorf = new mDoExt_McaMorf(
modelData,
NULL, NULL,
static_cast<J3DAnmTransformKey*>(dComIfG_getObjectRes(m_arc_name, RD_BCK_SUWARIP)),
J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1,
NULL,
0x00080000,
0x37441622
);
if (mpMorf == NULL || mpMorf->getModel() == NULL) {
return FALSE;
}
mpMorf->getModel()->setUserArea(reinterpret_cast<u32>(this));
if (!mInvisModel.create(mpMorf->getModel())) {
return FALSE;
}
J3DAnmTextureSRTKey* btk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(m_arc_name, RD_BTK_RD_CLOSE));
JUT_ASSERT(525, btk != 0);
if (!mBtkAnm.init(modelData, btk, true, 0, 1.0f, 0, -1, false, 0)) {
return FALSE;
}
modelData->getJointNodePointer(0x0C)->setCallBack(nodeHeadControl_CB);
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(m_arc_name, RD_BRK_NML));
JUT_ASSERT(550, brk != 0);
if (!mBrkAnm.init(modelData, brk, true, 0, 1.0f, 0, -1, false, 0)) {
return FALSE;
}
return createArrowHeap() ? TRUE : FALSE;
}
/* 0000096C-000009D0 .text createArrowHeap__6daRd_cFv */
void daRd_c::createArrowHeap() {
/* Nonmatching */
bool daRd_c::createArrowHeap() {
static Vec sebone_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}};
static Vec muneA_cyl_offset[] = {{5.0f, -5.0f, 0.0f}, {20.0f, -5.0f, 0.0f}};
static Vec muneB1_cyl_offset[] = {{15.0, 0.0, -15.0}, {50.0, 0.0, -15.0}};
static Vec muneB2_cyl_offset[] = {{15.0f, 0.0f, 0.0f}, {50.0f, 0.0f, 0.0f}};
static Vec muneB3_cyl_offset[] = {{15.0f, 0.0f, 15.0f}, {50.0f, 0.0f, 15.0f}};
static Vec kosi1_cyl_offset[] = {{0.0f, 0.0f, -10.0f}, {20.0f, 0.0f, -10.0f}};
static Vec kosi2_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {20.0f, 0.0f, 0.0f}};
static Vec kosi3_cyl_offset[] = {{0.0f, 0.0f, 10.0f}, {20.0f, 0.0f, 10.0f}};
static Vec asi1_cyl_offset[] = {{-8.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}};
static Vec asi2_cyl_offset[] = {{-3.0f, 0.0f, 0.0f}, {15.0f, 0.0f, 0.0f}};
static Vec asi3_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {11.0f, 0.0f, 0.0f}};
static Vec head_sph_offset[] = {{30.0f, 0.0f, -5.0f}};
static Vec ude1_cyl_offset[] = {{-5.0f, -8.0f, -1.0f}, {60.0f, 4.0f, 1.0f}};
static Vec ude2_cyl_offset[] = {{-3.0f, 0.0f, 0.0f}, {55.0f, 0.0f, 0.0f}};
static Vec te_cyl_offset[] = {{8.0f, 2.0f, 0.0f}, {30.0f, 2.0f, 0.0f}};
static Vec yubi_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {17.0f, 0.0f, 0.0f}};
static __jnt_hit_data_c search_data[] = {
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x01,
/* mRadius */ 4.0f,
/* mpOffsets */ (cXyz*)&kosi1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x01,
/* mRadius */ 4.0f,
/* mpOffsets */ (cXyz*)&kosi2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x01,
/* mRadius */ 4.0f,
/* mpOffsets */ (cXyz*)&kosi3_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x02,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x03,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x04,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi3_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x05,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x06,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x07,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&asi3_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x08,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&sebone_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x09,
/* mRadius */ 10.0f,
/* mpOffsets */ (cXyz*)&muneA_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x09,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&muneB1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x09,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&muneB2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x09,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&muneB3_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x0F,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&ude1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x10,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&ude2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x11,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&te_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x12,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&yubi_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x13,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&ude1_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x14,
/* mRadius */ 2.0f,
/* mpOffsets */ (cXyz*)&ude2_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x15,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&te_cyl_offset,
},
{
/* mShapeType */ 0, // Cylinder
/* mJointIndex */ 0x16,
/* mRadius */ 6.0f,
/* mpOffsets */ (cXyz*)&yubi_cyl_offset,
},
};
mpJntHit = JntHit_create(mpMorf->getModel(), search_data, ARRAY_SIZE(search_data));
if (mpJntHit) {
mJntHit = mpJntHit;
} else {
return false;
}
return true;
}
/* 000009D0-00000A38 .text checkPlayerInAttack__6daRd_cFv */
@@ -213,7 +428,8 @@ void daRd_c::setMtx() {
/* 000019F8-00001A3C .text modeWaitInit__6daRd_cFv */
void daRd_c::modeWaitInit() {
/* Nonmatching */
mAcchCir.SetWallR(60.0f);
speedF = 0.0f;
}
/* 00001A3C-00001DDC .text modeWait__6daRd_cFv */
@@ -273,7 +489,8 @@ void daRd_c::modeCry() {
/* 000028B8-000028CC .text modeCryWaitInit__6daRd_cFv */
void daRd_c::modeCryWaitInit() {
/* Nonmatching */
m310 = 60;
m314 = 45;
}
/* 000028CC-000029E4 .text modeCryWait__6daRd_cFv */
@@ -283,7 +500,12 @@ void daRd_c::modeCryWait() {
/* 000029E4-00002A58 .text modeAttackInit__6daRd_cFv */
void daRd_c::modeAttackInit() {
/* Nonmatching */
mAcchCir.SetWallR(70.0f);
m310 = l_HIO.m52;
m318 = l_HIO.m50;
m314 = 30;
setAnm(6, false);
speedF = 0.0f;
}
/* 00002A58-00002F30 .text modeAttack__6daRd_cFv */
@@ -330,8 +552,99 @@ void daRd_c::modeKanoke() {
}
/* 0000355C-000038D4 .text modeProc__6daRd_cFQ26daRd_c6Proc_ei */
void daRd_c::modeProc(daRd_c::Proc_e, int) {
void daRd_c::modeProc(daRd_c::Proc_e proc, int newMode) {
/* Nonmatching */
struct ModeEntry {
ModeFunc init;
ModeFunc run;
const char* name;
};
static ModeEntry mode_tbl[] = {
{
&modeWaitInit,
&modeWait,
"WAIT",
},
{
&modeDamageInit,
&modeDamage,
"DAMAGE",
},
{
&modeParalysisInit,
&modeParalysis,
"PARALYSIS",
},
{
&modeDeathInit,
&modeDeath,
"DEATH",
},
{
&modeMoveInit,
&modeMove,
"MOVE",
},
{
&modeCryInit,
&modeCry,
"CRY",
},
{
&modeCryWaitInit,
&modeCryWait,
"CRY_WAIT",
},
{
&modeAttackInit,
&modeAttack,
"ATTACK",
},
{
&modeReturnInit,
&modeReturn,
"RETURN",
},
{
&modeSilentPrayInit,
&modeSilentPray,
"SILENT_PRAY",
},
{
&modeSwWaitInit,
&modeSwWait,
"SW_WAIT",
},
{
&modeKanokeInit,
&modeKanoke,
"KANOKE",
},
};
if (proc == PROC_INIT) {
if (newMode == 5 || newMode == 7) {
onIkari();
setBtkAnm(3);
} else if (newMode != 1) {
offIkari();
setBtkAnm(4);
}
if (newMode == 3 || newMode == 0xA) {
fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e);
cLib_offBit<u32>(mAttentionInfo.mFlags, fopAc_Attn_LOCKON_ENEMY_e);
} else {
fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e);
cLib_onBit<u32>(mAttentionInfo.mFlags, fopAc_Attn_LOCKON_ENEMY_e);
}
mMode = newMode;
(this->*mode_tbl[mMode].init)();
} else if (proc == PROC_EXEC) {
(this->*mode_tbl[mMode].run)();
}
}
/* 000038D4-000039AC .text setBrkAnm__6daRd_cFSc */
@@ -365,8 +678,8 @@ bool daRd_c::_draw() {
}
/* 00004318-00004338 .text isLinkControl__6daRd_cFv */
void daRd_c::isLinkControl() {
/* Nonmatching */
bool daRd_c::isLinkControl() {
return dComIfGp_getPlayer(0) != dComIfGp_getLinkPlayer();
}
/* 00004338-000046A4 .text createInit__6daRd_cFv */
@@ -377,6 +690,15 @@ void daRd_c::createInit() {
/* 000046A4-00004720 .text getArg__6daRd_cFv */
void daRd_c::getArg() {
/* Nonmatching */
u32 params = fopAcM_GetParam(this);
m2B4 = fopAcM_GetParamBit(params, 0x00, 1);
int areaRadius = fopAcM_GetParamBit(params, 0x01, 7);
m2BC = fopAcM_GetParamBit(params, 0x08, 8);
mSwNo = fopAcM_GetParamBit(params, 0x18, 8);
if (areaRadius == 0x7F) {
areaRadius = 0;
}
mAreaRadius = l_HIO.m30 + areaRadius;
}
/* 00004720-000047C8 .text _create__6daRd_cFv */
@@ -400,7 +722,12 @@ s32 daRd_c::_create() {
/* 00004F60-00004FB8 .text _delete__6daRd_cFv */
bool daRd_c::_delete() {
/* Nonmatching */
dComIfG_resDelete(&mPhs, m_arc_name);
enemy_fire_remove(&mEnemyFire);
if (heap) {
mpMorf->stopZelAnime();
}
return true;
}
/* 00004FB8-00004FD8 .text daRdCreate__FPv */
+4 -4
View File
@@ -19,7 +19,7 @@ const char daShopItem_c::m_cloth_arcname[] = "Cloth";
const f32 daShopItem_c::m_cullfar_max = 5000.0f;
char* daShopItem_c::getShopArcname() {
u8 type = fopAcM_GetParamBit(this, 8, 4);
u8 type = fopAcM_GetParamBit(fopAcM_GetParam(this), 8, 4);
if(type == 1 || (type == 0 && mModelType[m_itemNo] == 0x01)) {
return dItem_data::getFieldArc(m_itemNo);
}
@@ -29,7 +29,7 @@ char* daShopItem_c::getShopArcname() {
}
s16 daShopItem_c::getShopBmdIdx() {
u8 type = fopAcM_GetParamBit(this, 8, 4);
u8 type = fopAcM_GetParamBit(fopAcM_GetParam(this), 8, 4);
if(type == 1 || (type == 0 && mModelType[m_itemNo] == 0x01)) {
return dItem_data::getFieldBmdIdx(m_itemNo);
}
@@ -172,7 +172,7 @@ static int daShopItem_Create(void* i_this) {
int daShopItem_c::_create() {
fopAcM_SetupActor(this, daShopItem_c);
m_itemNo = fopAcM_GetParamBit(this, 0, 8);
m_itemNo = fopAcM_GetParamBit(fopAcM_GetParam(this), 0, 8);
const char* arcName = getShopArcname();
if (getShopBmdIdx() == -1 || arcName == 0) {
@@ -194,7 +194,7 @@ int daShopItem_c::_create() {
return result2;
}
else if(result == cPhs_COMPLEATE_e && result2 == cPhs_COMPLEATE_e) {
u8 type = fopAcM_GetParamBit(this, 8, 4);
u8 type = fopAcM_GetParamBit(fopAcM_GetParam(this), 8, 4);
if(type == 2 || (type == 0 && mModelType[m_itemNo] == 0x02)) {
if(fopAcM_entrySolidHeap(this, &CheckItemCreateHeap, dItem_data::getHeapSize(m_itemNo)) == 0) {
return cPhs_ERROR_e;
+3 -3
View File
@@ -22,10 +22,10 @@ bool daTagKbItem_c::_delete() {
/* 000000C8-0000010C .text CreateInit__13daTagKbItem_cFv */
void daTagKbItem_c::CreateInit() {
field_0x2a0 = fopAcM_GetParam(this);
s8 paramBit = fopAcM_GetParamBit(this, 8, 8);
s8 paramBit = fopAcM_GetParamBit(fopAcM_GetParam(this), 8, 8);
field_0x29c = paramBit;
field_0x2a1 = fopAcM_GetParamBit(this, 0x10, 8);
field_0x2a4 = fopAcM_GetParamBit(this, 0x18, 8);
field_0x2a1 = fopAcM_GetParamBit(fopAcM_GetParam(this), 0x10, 8);
field_0x2a4 = fopAcM_GetParamBit(fopAcM_GetParam(this), 0x18, 8);
field_0x298 = 0;
field_0x299 = 0;
mpActor = NULL;