From e7e5ea2071a29baabcc4a9163fad90b56edc87d4 Mon Sep 17 00:00:00 2001 From: Daniel Hajjar <33489389+DanTGL@users.noreply.github.com> Date: Wed, 1 May 2024 22:04:57 +0200 Subject: [PATCH] d_a_lbridge (#622) * Started working on d_a_lbridge * Implemented CheckCreateHeap in d_a_lbridge * Added member variables for d_a_lbridge * Implemented daLbridge_c::set_mtx * Implemented daLbridge_c::setMoveBGMtx * Implemented se functions in d_a_lbridge * Implemented daLbridge_c::demo * Implemented daLbridge_c::_create * Refactored daLbridge_c::_create * Added constructor for mDoExt_bpkAnm * daLbridge_c::_draw * daLbridge_c::_execute match * daLbridge_c::CreateInit * daLbridge_c::sw_check match * daLbridge_c::appear_bridge * daLbridge_c::CreateHeap * daLbridge_c::_delete match * daLbridge_c::disappear_bridge match * d_a_lbridge fixes * d_a_lbridge matching * Removed old comments * d_a_lbridge variable renaming * d_a_lbridge PR fixes --- configure.py | 2 +- include/d/actor/d_a_lbridge.h | 26 +++- include/m_Do/m_Do_ext.h | 3 + src/d/actor/d_a_lbridge.cpp | 276 +++++++++++++++++++++++++++++++--- 4 files changed, 279 insertions(+), 28 deletions(-) diff --git a/configure.py b/configure.py index 5585c3752..987a0fb79 100644 --- a/configure.py +++ b/configure.py @@ -1436,7 +1436,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_klft"), ActorRel(NonMatching, "d_a_kmon"), ActorRel(Matching, "d_a_komore", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_lbridge"), + ActorRel(Matching, "d_a_lbridge", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_leaflift"), ActorRel(NonMatching, "d_a_lstair"), ActorRel(NonMatching, "d_a_machine"), diff --git a/include/d/actor/d_a_lbridge.h b/include/d/actor/d_a_lbridge.h index d5818bc53..ea61cc28b 100644 --- a/include/d/actor/d_a_lbridge.h +++ b/include/d/actor/d_a_lbridge.h @@ -1,13 +1,14 @@ #ifndef D_A_LBRIDGE_H #define D_A_LBRIDGE_H +#include "d/d_com_inf_game.h" #include "f_op/f_op_actor.h" class daLbridge_c : public fopAc_ac_c { public: inline BOOL _delete(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); s32 _create(); void set_mtx(); @@ -21,8 +22,29 @@ public: void set_off_se(); BOOL _draw(); + static const char m_arcname[]; + public: - /* Place member variables here */ + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dBgW* mpBgW; + /* 0x2A0 */ Mtx mMtx; + /* 0x2D0 */ mDoExt_btkAnm mBtkAnm; + /* 0x2E4 */ mDoExt_bpkAnm mBpkAnm; + /* 0x2F8 */ mDoExt_brkAnm mBrkAnm; + /* 0x310 */ JPABaseEmitter* mpEmitter; + /* 0x314 */ s32 mSwitchNo; + /* 0x318 */ s16 mAppearEventIdx; + /* 0x31A */ s16 mDisappearEventIdx; + /* 0x31C */ s16 unk31C; + /* 0x31E */ u8 mTimer; + /* 0x31F */ u8 mIsSw; }; +namespace daLbridge_prm { +inline u8 getSwitchNo(daLbridge_c* ac) { + return (fopAcM_GetParam(ac) >> 0) & 0xFF; +} +}; // namespace daLbridge_prm + #endif /* D_A_LBRIDGE_H */ diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index df508abb6..bfc394c75 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -154,12 +154,15 @@ private: class mDoExt_bpkAnm : public mDoExt_baseAnm { public: + mDoExt_bpkAnm() { field_0xc = NULL; } int init(J3DModelData*, J3DAnmColor*, int, int, f32, s16, s16, bool, int); int init(J3DMaterialTable*, J3DAnmColor*, int, int, f32, s16, s16, bool, int); void entry(J3DModelData*, f32); void entry(J3DMaterialTable*, f32); + void entry(J3DModelData* i_modelData) { entry(i_modelData, getFrame()); } + private: /* 0x08 */ J3DAnmColor* mpAnm; /* 0x0C */ J3DMatColorAnm* field_0xc; diff --git a/src/d/actor/d_a_lbridge.cpp b/src/d/actor/d_a_lbridge.cpp index 78237f4fa..6fe78fc17 100644 --- a/src/d/actor/d_a_lbridge.cpp +++ b/src/d/actor/d_a_lbridge.cpp @@ -5,100 +5,326 @@ #include "d/actor/d_a_lbridge.h" #include "d/d_procname.h" +#include "d/res/res_gbrg00.h" + +const char daLbridge_c::m_arcname[] = "Gbrg00"; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 00000098-00000384 .text CreateHeap__11daLbridge_cFv */ -void daLbridge_c::CreateHeap() { - /* Nonmatching */ +BOOL daLbridge_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arcname, GBRG00_BDL_GBRG00); + JUT_ASSERT(0xD6, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000U, 0x11000223U); + + if (!mpModel) { + return FALSE; + } + + J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(m_arcname, GBRG00_BTK_GBRG00); + JUT_ASSERT(0xE8, pbtk != 0); + + if (!mBtkAnm.init(modelData, pbtk, TRUE, 2, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + J3DAnmColor* pbpk = (J3DAnmColor*)dComIfG_getObjectRes(m_arcname, GBRG00_BPK_GBRG00); + JUT_ASSERT(0xF6, pbpk != 0); + + if (!mBpkAnm.init(modelData, pbpk, TRUE, 0, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + mBpkAnm.setFrame(0.0f); + mBpkAnm.setPlaySpeed(1.0f); + + J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arcname, GBRG00_BRK_GBRG00); + JUT_ASSERT(0x106, pbrk != 0); + + if (!mBrkAnm.init(modelData, pbrk, TRUE, 2, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + setMoveBGMtx(); + + mpBgW = new dBgW(); + + if (mpBgW != NULL) { + return mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_arcname, GBRG00_DZB_HHASHI1), cBgW::MOVE_BG_e, &mMtx) == true ? FALSE : TRUE; + } + + return FALSE; } /* 00000384-00000544 .text CreateInit__11daLbridge_cFv */ void daLbridge_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + fopAcM_setCullSizeBox(this, -600.0f, -100.0f, -150.0f, 600.0f, 100.0f, 150.0f); + fopAcM_setCullSizeFar(this, 1.5f); + + mpEmitter = dComIfGp_particle_set(0x810FU, ¤t.pos, ¤t.angle); + + if (mpEmitter != NULL) { + mpEmitter->stopDrawParticle(); + mpEmitter->setGlobalAlpha(0); + } + + mSwitchNo = daLbridge_prm::getSwitchNo(this); + + mIsSw = (bool)fopAcM_isSwitch(this, mSwitchNo); + + mAppearEventIdx = dComIfGp_evmng_getEventIdx("EFFAPPEAR"); + mDisappearEventIdx = dComIfGp_evmng_getEventIdx("BRIDGE_DISAPPEAR"); + + if (fopAcM_isSwitch(this, mSwitchNo) != FALSE || mSwitchNo == 0xFF) { + dComIfG_Bgsp()->Regist(mpBgW, this); + set_mtx(); + + mpBgW->Move(); + + if (mpEmitter != NULL) { + mpEmitter->playDrawParticle(); + mpEmitter->setGlobalAlpha(0xFF); + } + } } /* 00000544-0000063C .text _create__11daLbridge_cFv */ s32 daLbridge_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daLbridge_c); + + s32 ret = dComIfG_resLoad(&mPhs, m_arcname); + + if (ret == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2E10U)) { + return cPhs_ERROR_e; + } + CreateInit(); + } + + return ret; } /* 00000798-00000818 .text set_mtx__11daLbridge_cFv */ void daLbridge_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000818-00000888 .text setMoveBGMtx__11daLbridge_cFv */ void daLbridge_c::setMoveBGMtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::scaleM(scale); + mDoMtx_copy(mDoMtx_stack_c::get(), mMtx); } /* 00000888-00000914 .text _execute__11daLbridge_cFv */ BOOL daLbridge_c::_execute() { - /* Nonmatching */ + bool isSw = fopAcM_isSwitch(this, mSwitchNo); + + sw_check(); + demo(); + mBtkAnm.play(); + mBpkAnm.play(); + mBrkAnm.play(); + set_mtx(); + + mIsSw = isSw; + + return TRUE; } /* 00000914-00000A6C .text sw_check__11daLbridge_cFv */ void daLbridge_c::sw_check() { - /* Nonmatching */ + bool isSw = fopAcM_isSwitch(this, mSwitchNo); + + if (mSwitchNo == 0xFF) { + return; + } + + if (isSw != mIsSw) { + if (isSw) { + appear_bridge(); + } else { + disappear_bridge(); + } + } + + u8 alpha; + + if (!isSw) { + if (mBpkAnm.getFrame() == (f32)mBpkAnm.getFrameCtrl()->getStart()) { + fopAcM_offDraw(this); + } + + if (mpEmitter != NULL) { + alpha = mpEmitter->getGlobalAlpha(); + cLib_chaseUC(&alpha, 0x0, 0x8); + mpEmitter->setGlobalAlpha(alpha); + } + } else { + fopAcM_onDraw(this); + + cLib_calcTimer(&mTimer); + + if (mTimer == 0 && mpEmitter != NULL) { + alpha = mpEmitter->getGlobalAlpha(); + cLib_chaseUC(&alpha, 0xFF, 0x8); + mpEmitter->setGlobalAlpha(alpha); + } + } } /* 00000A6C-00000C18 .text demo__11daLbridge_cFv */ void daLbridge_c::demo() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + if (dComIfGp_evmng_startCheck(mAppearEventIdx) != FALSE && unk31C == 1) { + unk31C = 0; + } + + if (dComIfGp_evmng_startCheck(mDisappearEventIdx) != FALSE && unk31C == 2) { + unk31C = 0; + } + + if (dComIfGp_evmng_endCheck(mAppearEventIdx) != FALSE) { + dComIfGp_event_reset(); + dComIfGs_onEventBit(0xE01U); + } + + if (dComIfGp_evmng_endCheck(mDisappearEventIdx) != FALSE) { + dComIfGp_event_reset(); + dComIfGs_onEventBit(0xF40U); + } + } else { + if (dComIfGs_isEventBit(0xE01U) == FALSE && this->unk31C == 1) { + fopAcM_orderOtherEventId(this, mAppearEventIdx); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } else if (dComIfGs_isEventBit(0xF40U) == FALSE && this->unk31C == 2) { + fopAcM_orderOtherEventId(this, mDisappearEventIdx); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } + } } /* 00000C18-00000D90 .text appear_bridge__11daLbridge_cFv */ void daLbridge_c::appear_bridge() { - /* Nonmatching */ + dComIfG_Bgsp()->Regist(mpBgW, this); + set_mtx(); + mpBgW->Move(); + + cXyz pos1 = current.pos; + cXyz pos2 = current.pos; + + pos1.z += 100.0f; + pos2.z -= 100.0f; + + dComIfGp_particle_setProjection(0x8119U, &pos1, ¤t.angle); + dComIfGp_particle_setProjection(0x8119U, &pos2, ¤t.angle); + + set_on_se(); + + mBpkAnm.setFrame(0.0f); + mBpkAnm.setPlaySpeed(1.0f); + + if (mpEmitter != NULL) { + mpEmitter->playCreateParticle(); + mpEmitter->playDrawParticle(); + } + + mTimer = 0x1F; + unk31C = 1; } /* 00000D90-00000E30 .text disappear_bridge__11daLbridge_cFv */ void daLbridge_c::disappear_bridge() { - /* Nonmatching */ + dComIfG_Bgsp()->Release(mpBgW); + + if (mpEmitter != NULL) { + mpEmitter->stopDrawParticle(); + } + + set_off_se(); + + mBpkAnm.setFrame(mBpkAnm.getEndFrame()); + mBpkAnm.setPlaySpeed(-1.0f); + + unk31C = 2; } /* 00000E30-00000EA0 .text set_on_se__11daLbridge_cFv */ void daLbridge_c::set_on_se() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_L_BRIDGE_ON, 0); } /* 00000EA0-00000F10 .text set_off_se__11daLbridge_cFv */ void daLbridge_c::set_off_se() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_L_BRIDGE_OFF, 0); } /* 00000F10-00000FF8 .text _draw__11daLbridge_cFv */ BOOL daLbridge_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + mBtkAnm.entry(mpModel->getModelData()); + mBpkAnm.entry(mpModel->getModelData()); + mBrkAnm.entry(mpModel->getModelData()); + + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + + return TRUE; +} + +BOOL daLbridge_c::_delete() { + if (mpEmitter != NULL) { + mpEmitter->becomeInvalidEmitter(); + mpEmitter = NULL; + } + + bool isSw = fopAcM_isSwitch(this, mSwitchNo); + + if ((mSwitchNo == 0xFF || isSw == true) && heap != NULL) { + dComIfG_Bgsp()->Release(mpBgW); + } + + dComIfG_resDelete(&mPhs, m_arcname); + + return TRUE; } /* 00000FF8-00001018 .text daLbridge_Create__FPv */ -static s32 daLbridge_Create(void*) { - /* Nonmatching */ +static s32 daLbridge_Create(void* i_this) { + return static_cast(i_this)->_create(); } /* 00001018-000010D4 .text daLbridge_Delete__FPv */ -static BOOL daLbridge_Delete(void*) { - /* Nonmatching */ +static BOOL daLbridge_Delete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 000010D4-000010F8 .text daLbridge_Draw__FPv */ -static BOOL daLbridge_Draw(void*) { - /* Nonmatching */ +static BOOL daLbridge_Draw(void* i_this) { + return (u8) static_cast(i_this)->_draw(); } /* 000010F8-0000111C .text daLbridge_Execute__FPv */ -static BOOL daLbridge_Execute(void*) { - /* Nonmatching */ +static BOOL daLbridge_Execute(void* i_this) { + return (u8) static_cast(i_this)->_execute(); } /* 0000111C-00001124 .text daLbridge_IsDelete__FPv */ static BOOL daLbridge_IsDelete(void*) { - /* Nonmatching */ + return TRUE; } static actor_method_class daLbridgeMethodTable = {