diff --git a/include/d/actor/d_a_pedestal.h b/include/d/actor/d_a_pedestal.h index 0ea786d05..7d8214537 100644 --- a/include/d/actor/d_a_pedestal.h +++ b/include/d/actor/d_a_pedestal.h @@ -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 */ diff --git a/src/d/actor/d_a_pedestal.cpp b/src/d/actor/d_a_pedestal.cpp index 91ff6f00c..cb02c1760 100644 --- a/src/d/actor/d_a_pedestal.cpp +++ b/src/d/actor/d_a_pedestal.cpp @@ -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(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, ¤t.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, ¤t.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(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(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(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(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 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 = {