d_a_pedestal Work (#623)

* Started work on d_a_pedestal

* daPedestal::daPds_infiniteEcallBack_c matching

* daPedestal::daPds_c::_delete matching

* d_a_pedestal removed static function declarations

* daPedestal::CheckCreateHeap matching

* daPedestal::daPds_c::getMyStaffId matching

* daPedestal::daPds_c::CreateInit match

* daPedestal::daPds_c::finishCheck Changed return values

* daPedestal::daPds_c::CreateHeap matching

* daPedestal::daPds_c::_create matching

* daPedestal::daPds_c::set_mtx matching

* daPedestal::daPds_c::_execute matching

* daPedestal::daPds_c Started working on events

* daPedestal::daPds_c::setAction matching

* d_a_pedestal WIP

* daPedestal::daPds_infiniteEcallBack_c WIP

* daPedestal::daPds_c::_draw matching

* daPedestal::daPds_c::action matching

* daPedestal::daPds_c::waitAction matching

* daPedestal::daPds_c::eventProc matching

* daPedestal::daPds_c::initialMoveEvent matching

* daPedestal::daPds_c::actionMoveEvent matching

* daPedestal::ChunkCreateHeap Fixed match

* daPedestal::daPds_c::initialDefault matching

* daPedestal::daPds_c::initialEffectSet matching

* daPedestal::daPds_c::initialEffectEnd matching

* daPedestal::daPds_c::playBrkAnm matching

* daPedestal::daPds_c::initBrkAnm matching

* daPedestal::daPds_c Removed auto-generated comments

* d_a_pedestal Added dummy data

* d_a_pedestal Moved event tables to daPedestal

* d_a_pedestal Removed daPds__prm::getParam

* daPedestal::daPds_c Padded end of class

* daPedestal::daPds_c::CreateHeap Fixed conversion matching

* d_a_pedestal Code cleanup

* daPedestal::daPds_infiniteEcallBack_c Inlined setup function

* daPedestal::daPds_infiniteEcallBack_c Added explicit destructor
This commit is contained in:
Daniel Hajjar
2024-05-06 17:57:31 +02:00
committed by GitHub
parent e7e5ea2071
commit 7bc933412b
2 changed files with 447 additions and 110 deletions
+70 -46
View File
@@ -1,63 +1,87 @@
#ifndef D_A_PEDESTAL_H
#define D_A_PEDESTAL_H
#include "f_op/f_op_actor.h"
#include "d/d_bg_w.h"
#include "d/d_com_inf_game.h"
#include "f_op/f_op_actor.h"
#include "d/d_particle.h"
#include "m_Do/m_Do_ext.h"
namespace daPedestal {
static BOOL CheckCreateHeap(fopAc_ac_c*);
static s32 daPds_Create(void*);
static BOOL daPds_Delete(void*);
static BOOL daPds_Draw(void*);
static BOOL daPds_Execute(void*);
static BOOL daPds_IsDelete(void*);
class daPds_c : public fopAc_ac_c {
public:
BOOL _delete();
void CreateHeap();
void CreateInit();
s32 _create();
void getMyStaffId();
void wakeupCheck();
void finishCheck();
void setAction(int (daPedestal::daPds_c::*)(void*), void*);
void action(void*);
void waitAction(void*);
void eventProc();
void initialDefault(int);
void actionDefault(int);
void initialMoveEvent(int);
void actionMoveEvent(int);
void initialEffectSet(int);
void initialEffectEnd(int);
void set_mtx();
void initBrkAnm(unsigned char, bool);
void playBrkAnm();
BOOL _execute();
BOOL _draw();
public:
/* 0x290 */ u8 m290[0x298 - 0x290];
/* 0x298 */ J3DModel* mpModel;
/* 0x29C */ mDoExt_brkAnm mBrk;
/* 0x2B4 */ u8 m2B4[0x2E4 - 0x2B4];
/* 0x2E4 */ dBgW* mpBgW;
/* 0x2E8 */ u8 m2E8[0x324 - 0x2E8];
};
class daPds_infiniteEcallBack_c : public dPa_levelEcallBack {
public:
virtual ~daPds_infiniteEcallBack_c() {}
void execute(JPABaseEmitter*);
void end();
void makeEmitter(unsigned short, const cXyz*, const csXyz*, const cXyz*);
void getEmitter() {}
void setAngle(const csXyz*) {}
void setPos(const cXyz*) {}
void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) {}
JPABaseEmitter* getEmitter() { return mpEmitter; }
void setAngle(const csXyz* angle) { mpAngle = angle; }
void setPos(const cXyz* pos) { mpPos = pos; }
void setup(JPABaseEmitter* emitter, const cXyz*, const csXyz*, signed char) {
mpEmitter = emitter;
}
private:
/* 0x04 */ JPABaseEmitter* mpEmitter;
/* 0x08 */ const cXyz* mpPos;
/* 0x08 */ const csXyz* mpAngle;
};
};
class daPds_c : public fopAc_ac_c {
public:
typedef int (daPds_c::* ActionFunc_t)(void*);
BOOL _delete();
BOOL CreateHeap();
void CreateInit();
s32 _create();
int getMyStaffId();
BOOL wakeupCheck();
BOOL finishCheck();
BOOL setAction(ActionFunc_t, void*);
void action(void*);
BOOL waitAction(void*);
BOOL eventProc();
void initialDefault(int);
BOOL actionDefault(int);
void initialMoveEvent(int);
BOOL actionMoveEvent(int);
void initialEffectSet(int);
void initialEffectEnd(int);
void set_mtx();
BOOL initBrkAnm(u8, bool);
void playBrkAnm();
BOOL _execute();
BOOL _draw();
static const char m_arcname[];
public:
/* 0x290 */ request_of_phase_process_class mPhs;
/* 0x298 */ J3DModel* mpModel;
/* 0x29C */ mDoExt_brkAnm mBrk;
/* 0x2B4 */ Mtx mMtx;
/* 0x2E4 */ dBgW* mpBgW;
/* 0x2E8 */ daPds_infiniteEcallBack_c mInfiniteEcallBack;
/* 0x2F8 */ ActionFunc_t mAction;
/* 0x304 */ f32 unk304;
/* 0x308 */ f32 unk308;
/* 0x30C */ s8 unk30C;
/* 0x30D */ u8 mParam;
/* 0x30E */ u8 unk30E;
/* 0x30F */ s8 unk30F;
/* 0x310 */ s16 unk310;
/* 0x312 */ s16 unk312;
/* 0x314 */ s16 unk314;
/* 0x316 */ s16 unk316;
/* 0x318 */ u8 pad318[4];
/* 0x31C */ f32 unk31C;
/* 0x320 */ u8 pad320[4];
};
}; // namespace daPedestal
#endif /* D_A_PEDESTAL_H */
+377 -64
View File
@@ -5,162 +5,475 @@
#include "d/actor/d_a_pedestal.h"
#include "d/d_procname.h"
#include "d/res/res_hdai1.h"
namespace daPedestal {
// Needed for the .data section to match.
static f32 dummy1[3] = {1.0f, 1.0f, 1.0f};
static f32 dummy2[3] = {1.0f, 1.0f, 1.0f};
static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01};
static f64 dummy4[2] = {3.0, 0.5};
const char daPedestal::daPds_c::m_arcname[] = "Hdai1";
/* 00000078-000000DC .text _delete__Q210daPedestal7daPds_cFv */
BOOL daPds_c::_delete() {
/* Nonmatching */
BOOL daPedestal::daPds_c::_delete() {
if (heap != NULL) {
dComIfG_Bgsp()->Release(mpBgW);
}
mInfiniteEcallBack.end();
dComIfG_resDelete(&mPhs, m_arcname);
return TRUE;
}
namespace daPedestal {
/* 000000DC-000000FC .text CheckCreateHeap__10daPedestalFP10fopAc_ac_c */
BOOL CheckCreateHeap(fopAc_ac_c*) {
/* Nonmatching */
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
return static_cast<daPds_c*>(i_this)->CreateHeap();
}
} // namespace daPedestal
/* 000000FC-00000244 .text CreateHeap__Q210daPedestal7daPds_cFv */
void daPds_c::CreateHeap() {
/* Nonmatching */
BOOL daPedestal::daPds_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arcname, HDAI1_BDL_HDAI1);
JUT_ASSERT(0xC1, modelData != 0);
mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203U);
if (!mpModel) {
return FALSE;
}
if(!initBrkAnm(3, false)) {
return FALSE;
}
mpBgW = new dBgW();
if (mpBgW != NULL) {
return mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_arcname, HDAI1_DZB_HDAI), cBgW::MOVE_BG_e, &mMtx) == true ? FALSE : TRUE;
}
return FALSE;
}
/* 00000244-00000380 .text CreateInit__Q210daPedestal7daPds_cFv */
void daPds_c::CreateInit() {
/* Nonmatching */
void daPedestal::daPds_c::CreateInit() {
static char* l_os_name[] = {
"Os",
"Os1",
"Os2"
};
mParam = fopAcM_GetParam(this) & 0xFF;
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
fopAcM_setCullSizeBox(this, -150.0f, -20.0f, -150.0f, 150.0f, 250.0f, 150.0f);
if (!mParam) {
if (wakeupCheck()) {
if (subtype <= 2) {
fopAc_ac_c* pActor = fopAcM_searchFromName(l_os_name[subtype], 0, 0);
if (pActor != NULL && fopAcM_searchActorDistanceXZ(this, pActor) < 100.0f) {
pActor->current.pos.y = current.pos.y;
}
}
current.pos.y -= 240.0f;
}
} else if (mParam == 1 && finishCheck()) {
current.pos.y += 240.0f;
}
set_mtx();
dComIfG_Bgsp()->Regist(mpBgW, this);
mpBgW->Move();
}
/* 00000380-00000474 .text _create__Q210daPedestal7daPds_cFv */
s32 daPds_c::_create() {
/* Nonmatching */
s32 daPedestal::daPds_c::_create() {
fopAcM_SetupActor(this, daPedestal::daPds_c);
s32 phase_state = dComIfG_resLoad(&mPhs, m_arcname);
if (phase_state == cPhs_COMPLEATE_e) {
if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2000)) {
mpBgW = NULL;
return cPhs_ERROR_e;
}
CreateInit();
}
return phase_state;
}
/* 00000474-0000052C .text getMyStaffId__Q210daPedestal7daPds_cFv */
void daPds_c::getMyStaffId() {
/* Nonmatching */
int daPedestal::daPds_c::getMyStaffId() {
if (subtype == 0) {
return dComIfGp_evmng_getMyStaffId("Hdai1");
} else if (subtype == 1) {
return dComIfGp_evmng_getMyStaffId("Hdai2");
} else if (subtype == 2) {
return dComIfGp_evmng_getMyStaffId("Hdai3");
}
return -1;
}
/* 0000052C-000005D8 .text wakeupCheck__Q210daPedestal7daPds_cFv */
void daPds_c::wakeupCheck() {
/* Nonmatching */
BOOL daPedestal::daPds_c::wakeupCheck() {
if (subtype == 0) {
if (dComIfGs_isEventBit(0x1780)) {
return TRUE;
}
} else if (subtype == 1) {
if (dComIfGs_isEventBit(0x1740)) {
return TRUE;
}
} else if (subtype == 2) {
if (dComIfGs_isEventBit(0x1720)) {
return TRUE;
}
}
return FALSE;
}
/* 000005D8-00000684 .text finishCheck__Q210daPedestal7daPds_cFv */
void daPds_c::finishCheck() {
/* Nonmatching */
BOOL daPedestal::daPds_c::finishCheck() {
if (subtype == 0) {
if (dComIfGs_isEventBit(0x1710)) {
return TRUE;
}
} else if (subtype == 1) {
if (dComIfGs_isEventBit(0x1704)) {
return TRUE;
}
} else if (subtype == 2) {
if (dComIfGs_isEventBit(0x1B01)) {
return TRUE;
}
}
return FALSE;
}
/* 00000684-0000073C .text setAction__Q210daPedestal7daPds_cFMQ210daPedestal7daPds_cFPCvPvPv_iPv */
void daPds_c::setAction(int (daPds_c::*)(void*), void*) {
/* Nonmatching */
BOOL daPedestal::daPds_c::setAction(ActionFunc_t action, void* param_1) {
if (mAction != NULL) {
unk30C = 0xFF;
(this->*mAction)(param_1);
}
mAction = action;
unk30C = 0;
unk310 = 0;
unk312 = 0;
unk314 = 0;
unk316 = 0;
unk31C = 0.0f;
(this->*mAction)(param_1);
return TRUE;
}
/* 0000073C-000007C4 .text action__Q210daPedestal7daPds_cFPv */
void daPds_c::action(void*) {
/* Nonmatching */
void daPedestal::daPds_c::action(void* param_1) {
if (!mAction) {
setAction(&waitAction, NULL);
}
(this->*mAction)(param_1);
}
/* 000007C4-000007E0 .text waitAction__Q210daPedestal7daPds_cFPv */
void daPds_c::waitAction(void*) {
/* Nonmatching */
BOOL daPedestal::daPds_c::waitAction(void*) {
if (unk30C == 0) {
unk30C += 1;
}
return TRUE;
}
namespace daPedestal {
typedef void (daPds_c::* eventInitFunc)(int);
static eventInitFunc event_init_tbl[] = {
daPds_c::initialDefault,
daPds_c::initialMoveEvent,
daPds_c::initialEffectSet,
daPds_c::initialEffectEnd,
};
typedef BOOL (daPds_c::* eventActionFunc)(int);
static eventActionFunc event_action_tbl[] = {
&daPds_c::actionDefault,
&daPds_c::actionMoveEvent,
&daPds_c::actionDefault,
&daPds_c::actionDefault,
};
static char* cut_name_tbl[] = {
"WAIT",
"MOVE",
"EFFSET",
"EFFEND"
};
}; // namespace daPedestal
/* 000007E0-000008E4 .text eventProc__Q210daPedestal7daPds_cFv */
void daPds_c::eventProc() {
/* Nonmatching */
BOOL daPedestal::daPds_c::eventProc() {
int staffIdx = getMyStaffId();
if (dComIfGp_event_runCheck()) {
if (staffIdx != -1) {
int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0);
if (actIdx == -1) {
dComIfGp_evmng_cutEnd(staffIdx);
} else {
if(dComIfGp_evmng_getIsAddvance(staffIdx)) {
(this->*event_init_tbl[actIdx])(staffIdx);
}
if((this->*event_action_tbl[actIdx])(staffIdx)) {
dComIfGp_evmng_cutEnd(staffIdx);
}
}
}
return TRUE;
}
return FALSE;
}
/* 000008E4-000008E8 .text initialDefault__Q210daPedestal7daPds_cFi */
void daPds_c::initialDefault(int) {
/* Nonmatching */
}
void daPedestal::daPds_c::initialDefault(int) {}
/* 000008E8-000008F0 .text actionDefault__Q210daPedestal7daPds_cFi */
void daPds_c::actionDefault(int) {
/* Nonmatching */
BOOL daPedestal::daPds_c::actionDefault(int) {
return TRUE;
}
/* 000008F0-000009A8 .text initialMoveEvent__Q210daPedestal7daPds_cFi */
void daPds_c::initialMoveEvent(int) {
/* Nonmatching */
void daPedestal::daPds_c::initialMoveEvent(int staffIdx) {
f32* pSpeed = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed");
if (pSpeed) {
speed.y = *pSpeed;
} else {
speed.y = 1.0f;
}
f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist");
if (pDist) {
unk304 = current.pos.y + *pDist;
} else {
unk304 = current.pos.y;
}
}
/* 000009A8-00000AEC .text actionMoveEvent__Q210daPedestal7daPds_cFi */
void daPds_c::actionMoveEvent(int) {
/* Nonmatching */
BOOL daPedestal::daPds_c::actionMoveEvent(int) {
current.pos.y += speed.y;
BOOL ret = FALSE;
if (speed.y < 0.0f) {
if (current.pos.y <= unk304) {
current.pos.y = unk304;
speed.y = 0.0f;
ret = TRUE;
}
} else if (speed.y > 0.0f) {
if (current.pos.y >= unk304) {
current.pos.y = unk304;
speed.y = 0.0f;
ret = TRUE;
}
} else {
current.pos.y = unk304;
ret = TRUE;
}
if (ret) {
fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_STOP, 0);
} else {
fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_MOVE, 0);
}
return ret;
}
/* 00000AEC-00000B40 .text initialEffectSet__Q210daPedestal7daPds_cFi */
void daPds_c::initialEffectSet(int) {
/* Nonmatching */
void daPedestal::daPds_c::initialEffectSet(int) {
mInfiniteEcallBack.makeEmitter(0x826DU, &current.pos, &shape_angle, NULL);
initBrkAnm(0, true);
}
/* 00000B40-00000B80 .text initialEffectEnd__Q210daPedestal7daPds_cFi */
void daPds_c::initialEffectEnd(int) {
/* Nonmatching */
void daPedestal::daPds_c::initialEffectEnd(int) {
mInfiniteEcallBack.end();
initBrkAnm(2, true);
}
/* 00000B80-00000C10 .text set_mtx__Q210daPedestal7daPds_cFv */
void daPds_c::set_mtx() {
/* Nonmatching */
void daPedestal::daPds_c::set_mtx() {
mpModel->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
mDoMtx_copy(mDoMtx_stack_c::get(), mMtx);
}
/* 00000C10-00000D58 .text initBrkAnm__Q210daPedestal7daPds_cFUcb */
void daPds_c::initBrkAnm(unsigned char, bool) {
/* Nonmatching */
BOOL daPedestal::daPds_c::initBrkAnm(u8 param_1, bool param_2) {
struct AnmTableEntry {
/* 0x00 */ int loopMode;
/* 0x04 */ f32 speed;
/* 0x08 */ s32 unk_4;
}; // Size: 0x0C
static AnmTableEntry brkAnmTbl[] = {
{J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0},
{J3DFrameCtrl::LOOP_ONCE_e, 0.0f, 0},
{J3DFrameCtrl::LOOP_ONCE_e, 0.0f, 0},
{J3DFrameCtrl::LOOP_ONCE_e, 0.0f, -1},
};
J3DModelData* modelData = mpModel->getModelData();
bool ret = false;
J3DAnmTevRegKey* a_brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arcname, HDAI1_BRK_HDAI1);
JUT_ASSERT(0x28C, a_brk != 0);
if (mBrk.init(modelData, a_brk, TRUE, brkAnmTbl[param_1].loopMode, brkAnmTbl[param_1].speed, 0, -1, param_2, 0)) {
unk30E = param_1;
if (brkAnmTbl[param_1].unk_4 < 0) {
mBrk.setFrame(mBrk.getEndFrame());
}
unk308 = mBrk.getFrame();
ret = true;
}
return ret;
}
/* 00000D58-00000D98 .text playBrkAnm__Q210daPedestal7daPds_cFv */
void daPds_c::playBrkAnm() {
/* Nonmatching */
void daPedestal::daPds_c::playBrkAnm() {
unk30F = mBrk.play();
unk308 = mBrk.getFrame();
}
/* 00000D98-00000E48 .text _execute__Q210daPedestal7daPds_cFv */
BOOL daPds_c::_execute() {
/* Nonmatching */
BOOL daPedestal::daPds_c::_execute() {
playBrkAnm();
if (!eventProc()) {
action(NULL);
}
set_mtx();
mpBgW->Move();
if (mInfiniteEcallBack.getEmitter() != NULL) {
fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_LIGHT, 0);
}
return TRUE;
}
/* 00000E48-00000F10 .text _draw__Q210daPedestal7daPds_cFv */
BOOL daPds_c::_draw() {
/* Nonmatching */
BOOL daPedestal::daPds_c::_draw() {
g_env_light.settingTevStruct(TEV_TYPE_BG0, &current.pos, &tevStr);
g_env_light.setLightTevColorType(mpModel, &tevStr);
dComIfGd_setListBG();
J3DModelData* modelData = mpModel->getModelData();
mBrk.entry(modelData);
mDoExt_modelUpdateDL(mpModel);
modelData->getMaterialTable().removeTevRegAnimator(mBrk.getBrkAnm());
dComIfGd_setList();
return TRUE;
}
/* 00000F10-00000F30 .text daPds_Create__10daPedestalFPv */
s32 daPds_Create(void*) {
/* Nonmatching */
namespace daPedestal {
/* 00000F10-00000F30 .text daPedestal::daPds_create__10daPedestalFPv */
static s32 daPds_Create(void* i_this) {
return static_cast<daPds_c*>(i_this)->_create();
}
/* 00000F30-00000F54 .text daPds_Delete__10daPedestalFPv */
BOOL daPds_Delete(void*) {
/* Nonmatching */
static BOOL daPds_Delete(void* i_this) {
return (u8) static_cast<daPds_c*>(i_this)->_delete();
}
/* 00000F54-00000F78 .text daPds_Draw__10daPedestalFPv */
BOOL daPds_Draw(void*) {
/* Nonmatching */
static BOOL daPds_Draw(void* i_this) {
return (u8) static_cast<daPds_c*>(i_this)->_draw();
}
/* 00000F78-00000F9C .text daPds_Execute__10daPedestalFPv */
BOOL daPds_Execute(void*) {
/* Nonmatching */
static BOOL daPds_Execute(void* i_this) {
return (u8) static_cast<daPds_c*>(i_this)->_execute();
}
/* 00000F9C-00000FA4 .text daPds_IsDelete__10daPedestalFPv */
BOOL daPds_IsDelete(void*) {
/* Nonmatching */
static BOOL daPds_IsDelete(void*) {
return TRUE;
}
/* 00000FA4-00001008 .text execute__Q210daPedestal25daPds_infiniteEcallBack_cFP14JPABaseEmitter */
void daPds_infiniteEcallBack_c::execute(JPABaseEmitter*) {
/* Nonmatching */
void daPds_infiniteEcallBack_c::execute(JPABaseEmitter* emitter) {
if (mpPos != NULL) {
emitter->setGlobalTranslation(mpPos->x, mpPos->y, mpPos->z);
}
if (mpAngle != NULL) {
JGeometry::TVec3<s16> rot;
rot.x = mpAngle->x;
rot.y = mpAngle->y;
rot.z = mpAngle->z;
emitter->setGlobalRotation(rot);
}
}
/* 00001008-00001044 .text end__Q210daPedestal25daPds_infiniteEcallBack_cFv */
void daPds_infiniteEcallBack_c::end() {
/* Nonmatching */
if (mpEmitter != NULL) {
mpEmitter->becomeInvalidEmitter();
mpEmitter->setEmitterCallBackPtr(NULL);
mpEmitter = NULL;
mpPos = NULL;
mpAngle = NULL;
}
}
/* 00001044-000010D4 .text makeEmitter__Q210daPedestal25daPds_infiniteEcallBack_cFUsPC4cXyzPC5csXyzPC4cXyz */
void daPds_infiniteEcallBack_c::makeEmitter(unsigned short, const cXyz*, const csXyz*, const cXyz*) {
/* Nonmatching */
void daPds_infiniteEcallBack_c::makeEmitter(unsigned short particleID, const cXyz* pos, const csXyz* angle, const cXyz* scale) {
end();
dComIfGp_particle_set(particleID, pos, angle, scale, 0xFF, this);
setPos(pos);
setAngle(angle);
}
static actor_method_class daActMethodTable = {