From a211d2fd0721ea2a579a8eba789f626502b39ca2 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Wed, 30 Jul 2025 00:27:12 +0100 Subject: [PATCH] d_a_mdoor (#825) --- configure.py | 2 +- include/d/actor/d_a_mdoor.h | 60 ++++-- src/d/actor/d_a_mdoor.cpp | 404 ++++++++++++++++++++++++++++++++---- 3 files changed, 409 insertions(+), 57 deletions(-) diff --git a/configure.py b/configure.py index 1d183de1e..341e81819 100755 --- a/configure.py +++ b/configure.py @@ -1390,7 +1390,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lwood"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_magma"), ActorRel(NonMatching, "d_a_majuu_flag"), - ActorRel(NonMatching, "d_a_mdoor"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mdoor", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("D44J01"), "d_a_msw", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mtoge"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_AjavW", extra_cflags=['-pragma "nosyminline on"']), diff --git a/include/d/actor/d_a_mdoor.h b/include/d/actor/d_a_mdoor.h index 92d170258..07351f687 100644 --- a/include/d/actor/d_a_mdoor.h +++ b/include/d/actor/d_a_mdoor.h @@ -2,31 +2,65 @@ #define D_A_MDOOR_H #include "f_op/f_op_actor.h" +#include "d/d_particle.h" + +class dBgW; class daMdoor_c : public fopAc_ac_c { public: - void chkFlag(unsigned short) {} - void clrFlag(unsigned short) {} + enum Action_e { + ACT_WAIT0_e = 0, + ACT_DEMO_WAIT_e = 1, + ACT_DEMO_e = 2, + ACT_WAIT3_e = 3, + ACT_GENOCIDE_e = 4, + ACT_READY5_e = 5, + ACT_EVENT6_e = 6, + ACT_WAIT7_e = 7, + ACT_SWITCH8_e = 8, + ACT_READY9_e = 9, + ACT_EVENT10_e = 10, + ACT_WAIT11_e = 11, + ACT_SWITCH12_e = 12, + ACT_READY_OPEN_e = 13, + ACT_OPEN_e = 14, + ACT_WAIT15_e = 15, + }; + + bool chkFlag(unsigned short bit) { return (m2CA & bit) == bit; } + void clrFlag(unsigned short bit) { m2CA &= ~bit; } inline BOOL draw(); inline BOOL execute(); - void nextAction() {} - void setAction(unsigned char) {} - void setFlag(unsigned short) {} + void nextAction() { mAction++; } + void setAction(unsigned char action) { mAction = action; } + void setFlag(unsigned short bit) { m2CA |= bit; } - void getSwbit(); - void getType(); - void getToolId(); - void getShapeType(); - void CreateHeap(); + u8 getSwbit(); + u8 getType(); + u8 getToolId(); + u8 getShapeType(); + BOOL CreateHeap(); void calcMtx(); void smokeInit(); void smokeEnd(); - void CreateInit(); + BOOL CreateInit(); cPhs_State create(); void demoProc(); + static const char M_arcname[]; + public: - /* Place member variables here */ -}; + /* 0x290 */ dPa_smokeEcallBack m290; + /* 0x2B0 */ request_of_phase_process_class mPhase; + /* 0x2B8 */ J3DModel* mpModel; + /* 0x2BC */ dBgW* mpBgW; + /* 0x2C0 */ s32 m2C0; + /* 0x2C4 */ s16 m2C4; + /* 0x2C6 */ s16 m2C6; + /* 0x2C8 */ u8 m2C8; + /* 0x2C9 */ u8 mAction; + /* 0x2CA */ u16 m2CA; + /* 0x2CC */ f32 m2CC; +}; // size = 0x2D0 #endif /* D_A_MDOOR_H */ diff --git a/src/d/actor/d_a_mdoor.cpp b/src/d/actor/d_a_mdoor.cpp index d7edc0bd4..35e3753bc 100644 --- a/src/d/actor/d_a_mdoor.cpp +++ b/src/d/actor/d_a_mdoor.cpp @@ -6,120 +6,424 @@ #include "d/actor/d_a_mdoor.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_bg_w.h" +#include "d/d_com_inf_game.h" +#include "d/res/res_mdoor.h" +#include "f_op/f_op_actor_mng.h" + +const char daMdoor_c::M_arcname[] = "Mdoor"; /* 00000078-00000084 .text getSwbit__9daMdoor_cFv */ -void daMdoor_c::getSwbit() { - /* Nonmatching */ +u8 daMdoor_c::getSwbit() { + return (fopAcM_GetParam(this) >> 0) & 0xFF; } /* 00000084-00000090 .text getType__9daMdoor_cFv */ -void daMdoor_c::getType() { - /* Nonmatching */ +u8 daMdoor_c::getType() { + return (fopAcM_GetParam(this) >> 8) & 0xFF; } /* 00000090-0000009C .text getToolId__9daMdoor_cFv */ -void daMdoor_c::getToolId() { - /* Nonmatching */ +u8 daMdoor_c::getToolId() { + return (fopAcM_GetParam(this) >> 16) & 0xFF; } /* 0000009C-000000A8 .text getShapeType__9daMdoor_cFv */ -void daMdoor_c::getShapeType() { - /* Nonmatching */ +u8 daMdoor_c::getShapeType() { + return (fopAcM_GetParam(this) >> 24) & 0xFF; } /* 000000A8-000000C8 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daMdoor_c*)a_this)->CreateHeap(); } /* 000000C8-00000230 .text CreateHeap__9daMdoor_cFv */ -void daMdoor_c::CreateHeap() { - /* Nonmatching */ +BOOL daMdoor_c::CreateHeap() { + s32 modelRes; + s32 bgdRes; + + switch (getShapeType()) { + case 1: + modelRes = MDOOR_BDL_MORI2; + bgdRes = MDOOR_DZB_MORI2; + break; + + default: + modelRes = MDOOR_BDL_MORI1; + bgdRes = MDOOR_DZB_MORI1; + break; + } + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(M_arcname, modelRes)); + JUT_ASSERT(144, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpModel == NULL) { + return FALSE; + } + + mpBgW = new dBgW(); + if (mpBgW == NULL) { + return FALSE; + } + + cBgD_t* pData = (cBgD_t*)dComIfG_getObjectRes(M_arcname, bgdRes); + if (pData == NULL) { + return FALSE; + } + + calcMtx(); + + if (mpBgW->Set(pData, cBgW::MOVE_BG_e, &mpModel->getBaseTRMtx()) == TRUE) { + return FALSE; + } + return TRUE; } /* 00000230-0000029C .text calcMtx__9daMdoor_cFv */ void daMdoor_c::calcMtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos.x, current.pos.y + m2CC, current.pos.z); + mDoMtx_stack_c::YrotM(home.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 0000029C-00000344 .text smokeInit__9daMdoor_cFv */ void daMdoor_c::smokeInit() { - /* Nonmatching */ + JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_COMMON_2022, ¤t.pos, &shape_angle, NULL, 0xAA, &m290, fopAcM_GetRoomNo(this)); + if (emitter != NULL) { + emitter->setRate(16.0f); + emitter->setSpread(0.35f); + + JGeometry::TVec3 vec; + vec.set(2.0f, 2.0f, 2.0f); + emitter->setGlobalScale(vec); + } } /* 00000344-00000370 .text smokeEnd__9daMdoor_cFv */ void daMdoor_c::smokeEnd() { - /* Nonmatching */ + m290.remove(); } /* 00000370-000005E0 .text CreateInit__9daMdoor_cFv */ -void daMdoor_c::CreateInit() { - /* Nonmatching */ +BOOL daMdoor_c::CreateInit() { + fopAc_ac_c* a_this = (fopAc_ac_c*)this; + s32 uVar1; + u8 bVar5; + + uVar1 = getSwbit(); + bVar5 = getType(); + + if (dComIfG_Bgsp()->Regist(mpBgW, a_this)) { + JUT_ASSERT(236, FALSE); + } + + a_this->tevStr.mRoomNo = fopAcM_GetRoomNo(a_this); + m2CC = 0.0f; + m2C8 = 0xFF; + + switch (bVar5) { + case 0: + if (dComIfGs_isEventBit(0x1101)) { + setAction(daMdoor_c::ACT_WAIT3_e); + } else { + setAction(daMdoor_c::ACT_DEMO_WAIT_e); + m2CC = 280.0f; + } + m2C6 = dComIfGp_evmng_getEventIdx("MORI1_EVENT", 0xFF); + break; + + case 1: + if (dComIfGs_isEventBit(0x1101)) { + setAction(daMdoor_c::ACT_WAIT7_e); + m2CC = 280.0f; + } else { + dComIfGs_offEventBit(0x1140); + setAction(daMdoor_c::ACT_GENOCIDE_e); + m2C6 = dComIfGp_evmng_getEventIdx("DEFAULT_STOP_OPEN", 0xFF); + m2C4 = 1; + } + break; + + case 2: + if (uVar1 == 0xFF || dComIfGs_isSwitch(uVar1, fopAcM_GetRoomNo(a_this))) { + setAction(daMdoor_c::ACT_WAIT11_e); + m2CC = 280.0f; + } else { + m2C8 = getToolId(); + m2C6 = dComIfGp_evmng_getEventIdx("DEFAULT_STOP_OPEN", getToolId()); + if (m2C8 != 0xFF) { + setAction(daMdoor_c::ACT_SWITCH12_e); + } else { + setAction(daMdoor_c::ACT_SWITCH8_e); + } + } + break; + + default: + setAction(daMdoor_c::ACT_WAIT0_e); + break; + } + + a_this->attention_info.position.y += 150.0f; + a_this->eyePos.y += 150.0f; + calcMtx(); + mpBgW->Move(); + return TRUE; } /* 000005E0-00000698 .text create__9daMdoor_cFv */ cPhs_State daMdoor_c::create() { - /* Nonmatching */ + cPhs_State ret = dComIfG_resLoad(&mPhase, M_arcname); +#if VERSION == VERSION_DEMO + if (ret != cPhs_COMPLEATE_e) { + return ret; + } + fopAcM_SetupActor(this, daMdoor_c); +#else + fopAcM_SetupActor(this, daMdoor_c); + if (ret != cPhs_COMPLEATE_e) { + return ret; + } +#endif + + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x1640)) { + return cPhs_ERROR_e; + } + + CreateInit(); + return cPhs_COMPLEATE_e; } /* 00000698-00000958 .text demoProc__9daMdoor_cFv */ void daMdoor_c::demoProc() { - /* Nonmatching */ + static char* action_table[] = { + "WAIT", "CLOSE", "STOP_OPEN", + }; + + s32 actIdx = dComIfGp_evmng_getMyActIdx(m2C0, action_table, 3, 0, 0); + + if (dComIfGp_evmng_getIsAddvance(m2C0)) { + switch (actIdx) { + case 1: + speedF = 0.0f; + setFlag(1); + fopAcM_seStart(this, JA_SE_OBJ_CAGE_CLOSE, 0); + break; + + case 2: + speedF = 0.0f; + if (getShapeType() != 1) { + dComIfGp_particle_set(dPa_name::ID_SCENE_81B2, ¤t.pos, ¤t.angle); + } + fopAcM_seStart(this, JA_SE_OBJ_CAGE_OPEN, 0); + break; + } + } + + switch (actIdx) { + case 1: + cLib_chaseF(&speedF, 60.0f, 6.0f); + if (cLib_chaseF(&m2CC, 0.0f, speedF)) { + dComIfGp_evmng_cutEnd(m2C0); + if (chkFlag(1)) { + clrFlag(1); + if (getShapeType() != 1) { + dComIfGp_particle_set(dPa_name::ID_SCENE_81B2, ¤t.pos, ¤t.angle); + } + smokeInit(); + } + } + calcMtx(); + mpBgW->Move(); + break; + + case 2: + cLib_chaseF(&speedF, 30.0f, 3.0f); + if (cLib_chaseF(&m2CC, 280.0f, speedF)) { + dComIfGp_evmng_cutEnd(m2C0); + } + calcMtx(); + mpBgW->Move(); + break; + + default: + dComIfGp_evmng_cutEnd(m2C0); + break; + } } /* 00000958-00000960 .text daMdoor_actionWait__FP9daMdoor_c */ -void daMdoor_actionWait(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionWait(daMdoor_c*) { + return TRUE; } /* 00000960-000009E8 .text daMdoor_actionDemoWait__FP9daMdoor_c */ -void daMdoor_actionDemoWait(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionDemoWait(daMdoor_c* i_this) { + if (dComIfGp_evmng_startCheck(i_this->m2C6)) { + i_this->nextAction(); + i_this->m2C0 = dComIfGp_evmng_getMyStaffId("Mori1", NULL, 0); + i_this->demoProc(); + } + return TRUE; } /* 000009E8-00000A4C .text daMdoor_actionDemo__FP9daMdoor_c */ -void daMdoor_actionDemo(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionDemo(daMdoor_c* i_this) { + if (dComIfGp_evmng_endCheck(i_this->m2C6)) { + i_this->nextAction(); + return TRUE; + } + i_this->demoProc(); + return TRUE; } /* 00000A4C-00000AF4 .text daMdoor_actionGenocide__FP9daMdoor_c */ -void daMdoor_actionGenocide(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionGenocide(daMdoor_c* i_this) { + if (fopAcM_myRoomSearchEnemy(fopAcM_GetRoomNo(i_this)) == NULL) { + if (i_this->m2C4 > 0) { + i_this->m2C4--; + } else { + switch (i_this->getType()) { + case 1: + mDoAud_subBgmStop(); + break; + } + fopAcM_orderOtherEventId(i_this, i_this->m2C6, i_this->m2C8, 0xFFFF, 0, 1); + i_this->nextAction(); + } + } + return TRUE; } /* 00000AF4-00000C6C .text daMdoor_actionOpen__FP9daMdoor_c */ -void daMdoor_actionOpen(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionOpen(daMdoor_c* i_this) { + if (dComIfGp_evmng_endCheck(i_this->m2C6)) { + i_this->nextAction(); + dComIfGp_event_reset(); + return TRUE; + } + + if (i_this->m2C4 > 0) { + i_this->m2C4--; + if (i_this->m2C4 == 0) { + i_this->speedF = 0.0f; + if (i_this->getShapeType() != 1) { + dComIfGp_particle_set(dPa_name::ID_SCENE_81B2, &i_this->current.pos, &i_this->current.angle); + } + fopAcM_seStart(i_this, JA_SE_OBJ_CAGE_OPEN, 0); + } + } + + if (i_this->m2C4 == 0) { + cLib_chaseF(&i_this->speedF, 30.0f, 3.0f); + cLib_chaseF(&i_this->m2CC, 280.0f, i_this->speedF); + i_this->calcMtx(); + i_this->mpBgW->Move(); + } + return TRUE; } /* 00000C6C-00000CE8 .text daMdoor_actionSwitch__FP9daMdoor_c */ -void daMdoor_actionSwitch(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionSwitch(daMdoor_c* i_this) { + s32 uVar1 = i_this->getSwbit(); + if (dComIfGs_isSwitch(uVar1, fopAcM_GetRoomNo(i_this))) { + fopAcM_orderOtherEventId(i_this, i_this->m2C6, i_this->m2C8, 0xFFFF, 0, 1); + i_this->nextAction(); + } + return TRUE; } /* 00000CE8-00000DD0 .text daMdoor_actionReady__FP9daMdoor_c */ -void daMdoor_actionReady(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionReady(daMdoor_c* i_this) { + if (i_this->eventInfo.checkCommandDemoAccrpt()) { + i_this->m2C0 = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR", NULL, 0); + i_this->demoProc(); + i_this->nextAction(); + s32 uVar2 = i_this->getSwbit(); + if (uVar2 != 0xFF) { + dComIfGs_isSwitch(uVar2, fopAcM_GetRoomNo(i_this)); + } + + switch (i_this->getType()) { + case 1: + dComIfGs_onEventBit(0x1140); + break; + } + } else { + fopAcM_orderOtherEventId(i_this, i_this->m2C6, i_this->m2C8, 0xFFFF, 0, 1); + } + return TRUE; } /* 00000DD0-00000E60 .text daMdoor_actionReadyOpen__FP9daMdoor_c */ -void daMdoor_actionReadyOpen(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionReadyOpen(daMdoor_c* i_this) { + if (i_this->eventInfo.checkCommandDemoAccrpt()) { + i_this->nextAction(); + s32 uVar1 = i_this->getSwbit(); + if (uVar1 != 0xFF) { + dComIfGs_isSwitch(uVar1, fopAcM_GetRoomNo(i_this)); + } + i_this->m2C4 = 0x14; + } else { + fopAcM_orderOtherEventId(i_this, i_this->m2C6, i_this->m2C8, 0xFFFF, 0, 1); + } + return TRUE; } /* 00000E60-00000ED4 .text daMdoor_actionEvent__FP9daMdoor_c */ -void daMdoor_actionEvent(daMdoor_c*) { - /* Nonmatching */ +BOOL daMdoor_actionEvent(daMdoor_c* i_this) { + if (dComIfGp_evmng_endCheck(i_this->m2C6)) { + i_this->nextAction(); + dComIfGp_event_reset(); + } else { + i_this->demoProc(); + } + return TRUE; +} + +BOOL daMdoor_c::draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + return TRUE; } /* 00000ED4-00000F34 .text daMdoor_Draw__FP9daMdoor_c */ -static BOOL daMdoor_Draw(daMdoor_c*) { - /* Nonmatching */ +static BOOL daMdoor_Draw(daMdoor_c* i_this) { + return i_this->draw(); +} + +BOOL daMdoor_c::execute() { + typedef BOOL (*actionFunc)(daMdoor_c*); + static actionFunc l_action[] = { + daMdoor_actionWait, + daMdoor_actionDemoWait, + daMdoor_actionDemo, + daMdoor_actionWait, + daMdoor_actionGenocide, + daMdoor_actionReady, + daMdoor_actionEvent, + daMdoor_actionWait, + daMdoor_actionSwitch, + daMdoor_actionReady, + daMdoor_actionEvent, + daMdoor_actionWait, + daMdoor_actionSwitch, + daMdoor_actionReadyOpen, + daMdoor_actionOpen, + daMdoor_actionWait, + }; + + smokeEnd(); + l_action[mAction](this); + return TRUE; } /* 00000F34-00000F84 .text daMdoor_Execute__FP9daMdoor_c */ -static BOOL daMdoor_Execute(daMdoor_c*) { - /* Nonmatching */ +static BOOL daMdoor_Execute(daMdoor_c* i_this) { + return i_this->execute(); } /* 00000F84-00000F8C .text daMdoor_IsDelete__FP9daMdoor_c */ @@ -128,8 +432,22 @@ static BOOL daMdoor_IsDelete(daMdoor_c*) { } /* 00000F8C-00001054 .text daMdoor_Delete__FP9daMdoor_c */ -static BOOL daMdoor_Delete(daMdoor_c*) { - /* Nonmatching */ +static BOOL daMdoor_Delete(daMdoor_c* i_this) { +#if VERSION > VERSION_DEMO + if (i_this->heap != NULL) +#endif + { + dComIfG_Bgsp()->Release(i_this->mpBgW); + } + +#if VERSION > VERSION_DEMO + i_this->smokeEnd(); +#endif + dComIfG_resDelete(&i_this->mPhase, daMdoor_c::M_arcname); + + i_this->~daMdoor_c(); + + return TRUE; } /* 00001054-00001074 .text daMdoor_Create__FP10fopAc_ac_c */