From 6ed56c2bad174adc4d11c2a731a57f19519380cf Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sat, 6 Sep 2025 03:56:31 +0100 Subject: [PATCH] d_a_door12 (#870) --- configure.py | 2 +- include/d/actor/d_a_door12.h | 54 ++- src/d/actor/d_a_door12.cpp | 828 ++++++++++++++++++++++++++++++++--- 3 files changed, 798 insertions(+), 86 deletions(-) diff --git a/configure.py b/configure.py index f7e56a296..801a529ce 100755 --- a/configure.py +++ b/configure.py @@ -1501,7 +1501,7 @@ config.libs = [ ActorRel(Matching, "d_a_cc"), ActorRel(Matching, "d_a_dai"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_demo_item"), - ActorRel(NonMatching, "d_a_door12"), + ActorRel(Matching, "d_a_door12"), ActorRel(Matching, "d_a_fallrock"), ActorRel(Matching, "d_a_ff"), ActorRel(Matching, "d_a_gy_ctrl"), diff --git a/include/d/actor/d_a_door12.h b/include/d/actor/d_a_door12.h index 215f30517..e996a9164 100644 --- a/include/d/actor/d_a_door12.h +++ b/include/d/actor/d_a_door12.h @@ -8,49 +8,55 @@ class daDoor12_c : public dDoor_info_c { public: - void checkFlag(unsigned short) {} + bool checkFlag(unsigned short flag) { return (m316 & flag) != 0; } inline BOOL execute(); - void offFlag(unsigned short) {} - void onFlag(unsigned short) {} - void setAction(unsigned char) {} + void offFlag(unsigned short flag) { m316 &= ~flag; } + void onFlag(unsigned short flag) { m316 |= flag; } + void setAction(unsigned char action) { m314 = action; } - void chkMakeKey(); + s32 chkMakeKey(); void setKey(); - void chkMakeStop(); - void chkStopF(); - void chkStopB(); + BOOL chkMakeStop(); + s32 chkStopF(); + s32 chkStopB(); void setStop(); - void chkStopOpen(); + BOOL chkStopOpen(); void setStopDemo(); - void chkStopClose(); - void CreateHeap(); - void getShapeType(); - void getArcName(); - void getBdlLf(); - void getBdlRt(); - void getDzb(); - void openWide(); + BOOL chkStopClose(); + BOOL CreateHeap(); + u8 getShapeType(); + char* getArcName(); + s32 getBdlLf(); + s32 getBdlRt(); + s32 getDzb(); + f32 openWide(); void setEventPrm(); void openInit(); - void openProc(); + BOOL openProc(); void openEnd(); void closeInit(); - void closeProc(); + BOOL closeProc(); void closeEnd(); void calcMtx(); - void CreateInit(); + BOOL CreateInit(); cPhs_State create(); void demoProc(); BOOL draw(); public: - /* 0x2D0 */ request_of_phase_process_class m2D0; + /* 0x2D0 */ request_of_phase_process_class mPhase; /* 0x2D8 */ J3DModel* mpLeftModel; /* 0x2DC */ J3DModel* mpRightModel; - /* 0x2E0 */ dBgW* m2E0; + /* 0x2E0 */ dBgW* mpBgw; /* 0x2E4 */ dDoor_key2_c mKeyLock; /* 0x308 */ dDoor_stop_c mStopBars; - /* 0x314 */ u8 m314[0x35C - 0x314]; -}; + /* 0x314 */ u8 m314; + /* 0x315 */ u8 m315[0x1]; + /* 0x316 */ u16 m316; + #if VERSION > VERSION_DEMO + /* 0x318 */ s32 m318; + #endif + /* 0x31C */ f32 m31C; +}; // size = 0x320 #endif /* D_A_DOOR12_H */ diff --git a/src/d/actor/d_a_door12.cpp b/src/d/actor/d_a_door12.cpp index 597543450..b95f46be1 100644 --- a/src/d/actor/d_a_door12.cpp +++ b/src/d/actor/d_a_door12.cpp @@ -5,182 +5,861 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_door12.h" +#include "d/actor/d_a_player.h" +#include "d/res/res_door12.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_actor_mng.h" + +#if VERSION == VERSION_DEMO +#include "m_Do/m_Do_hostIO.h" + +class daDoor12_HIO_c : public JORReflexible { +public: + daDoor12_HIO_c(); + virtual ~daDoor12_HIO_c() {} + + void genMessage(JORMContext*); + +public: + /* 0x04 */ s8 mNo; + /* 0x08 */ f32 m08; + /* 0x0C */ u8 m0C; +}; + +static daDoor12_HIO_c l_HIO; + +daDoor12_HIO_c::daDoor12_HIO_c() { + mNo = -1; + m08 = 200.0f; + m0C = 0; +} + +#endif /* 00000078-000000C0 .text chkMakeKey__10daDoor12_cFv */ -void daDoor12_c::chkMakeKey() { - /* Nonmatching */ +s32 daDoor12_c::chkMakeKey() { + u8 type = getType(); + if (type == 1) { + return TRUE; + } + + if (type == 3) { + return 2; + } + return 0; } /* 000000C0-000001A0 .text setKey__10daDoor12_cFv */ void daDoor12_c::setKey() { - /* Nonmatching */ + if (chkMakeKey() == 1) { + if (!dComIfGs_isSwitch(getSwbit(), -1)) { + mKeyLock.keyOn(); + return; + } + } + + if (chkMakeKey() == 2) { + if (getSwbit() == 0xff) { + mKeyLock.keyOff(); + return; + } + + if (getSwbit() >= 0x80 || !dComIfGs_isSwitch(getSwbit(), -1)) { + mKeyLock.keyOn(); + return; + } + } + + mKeyLock.keyOff(); } /* 000001A0-00000210 .text chkMakeStop__10daDoor12_cFv */ -void daDoor12_c::chkMakeStop() { - /* Nonmatching */ +BOOL daDoor12_c::chkMakeStop() { + if (getSwbit2() != 0xFF) { + return TRUE; + } + + if (!chkMakeKey() && getSwbit() != 0xFF) { + return TRUE; + } + return FALSE; } /* 00000210-000002DC .text chkStopF__10daDoor12_cFv */ -void daDoor12_c::chkStopF() { - /* Nonmatching */ +s32 daDoor12_c::chkStopF() { + u8 uVar2 = getType(); + u8 bVar3 = getSwbit(); + u8 uVar1 = getFRoomNo(); + if (bVar3 == 0xff) { + return 0; + } + + switch (uVar2) { + case 0: + case 2: + if (!dComIfGp_roomControl_checkStatusFlag(uVar1, 1)) { + return -1; + } else { + return !dComIfGs_isSwitch(bVar3, uVar1); + } + break; + case 1: + break; + } + return 0; } /* 000002DC-0000036C .text chkStopB__10daDoor12_cFv */ -void daDoor12_c::chkStopB() { - /* Nonmatching */ +s32 daDoor12_c::chkStopB() { + u8 uVar1 = getSwbit2(); + u8 uVar2 = getBRoomNo(); + if (uVar1 == 0xff) { + return 0; + } + + if (!dComIfGp_roomControl_checkStatusFlag(uVar2, 1)) { + return -1; + } + + return !dComIfGs_isSwitch(uVar1, uVar2); } /* 0000036C-00000400 .text setStop__10daDoor12_cFv */ void daDoor12_c::setStop() { - /* Nonmatching */ + if (chkMakeStop() && mStopBars.mpModel != NULL) { + mStopBars.mFrontCheck = mFrontCheck; + if (mFrontCheck == 0) { + mStopBars.m8 = chkStopF(); + mStopBars.mA = chkStopB(); + } else { + mStopBars.m8 = chkStopB(); + mStopBars.mA = chkStopF(); + } + mStopBars.mOffsY = 0.0f; + } } /* 00000400-0000055C .text chkStopOpen__10daDoor12_cFv */ -void daDoor12_c::chkStopOpen() { - /* Nonmatching */ +BOOL daDoor12_c::chkStopOpen() { + u8 cVar4 = getType(); + u8 uVar2; + u8 bVar5; + + if (mFrontCheck == 0) { + uVar2 = getSwbit(); + bVar5 = getFRoomNo(); + } else { + uVar2 = getSwbit2(); + bVar5 = getBRoomNo(); + } + + if (mFrontCheck == 0 && cVar4 == 2) { +#if VERSION == VERSION_DEMO + if (dComIfGp_event_runCheck() == FALSE && dComIfGp_roomControl_checkRoomDisp(bVar5) && fopAcM_myRoomSearchEnemy(bVar5) == NULL) { + if (m2A1 != 0) { + m2A1--; + return FALSE; + } + + if (uVar2 != 0xff) { + dComIfGs_onSwitch(uVar2, bVar5); + } + return TRUE; + } + m2A1 = 0x41; +#else + if (!dComIfGp_event_runCheck() != FALSE || m2A1 == 0) { + if (dComIfGp_roomControl_checkRoomDisp(bVar5) && fopAcM_myRoomSearchEnemy(bVar5) == NULL) { + if (m2A1 != 0) { + m2A1--; + return FALSE; + } + + if (uVar2 != 0xff) { + dComIfGs_onSwitch(uVar2, bVar5); + } + return TRUE; + } + m2A1 = 0x41; + } +#endif + } else if (uVar2 != 0xff && dComIfGs_isSwitch(uVar2, bVar5)) { + return TRUE; + } + return FALSE; } /* 0000055C-00000580 .text setStopDemo__10daDoor12_cFv */ void daDoor12_c::setStopDemo() { - /* Nonmatching */ + if (mFrontCheck == 0) { + m2C6 = 0; + } else { + m2C6 = 1; + } } /* 00000580-00000658 .text chkStopClose__10daDoor12_cFv */ -void daDoor12_c::chkStopClose() { - /* Nonmatching */ +BOOL daDoor12_c::chkStopClose() { + u8 uVar3 = getType(); + + if (mStopBars.mpModel == NULL) { + return FALSE; + } else if (uVar3 == 3) { + return FALSE; + } + + u8 uVar1; + u8 uVar2; + if (mFrontCheck == 0) { + if (uVar3 == 2) { + return FALSE; + } + uVar1 = getSwbit(); + uVar2 = getFRoomNo(); + } else { + uVar1 = getSwbit2(); + uVar2 = getBRoomNo(); + } + + if (uVar1 == 0xff) { + return FALSE; + } else if (!dComIfGs_isSwitch(uVar1, uVar2)) { + return TRUE; + } + return FALSE; } /* 00000658-00000678 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daDoor12_c*)a_this)->CreateHeap(); } /* 00000678-000008F8 .text CreateHeap__10daDoor12_cFv */ -void daDoor12_c::CreateHeap() { - /* Nonmatching */ +BOOL daDoor12_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(getArcName(), getBdlLf()); + JUT_ASSERT(DEMO_SELECT(360, 362), modelData != NULL); + + mpLeftModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpLeftModel == NULL) { + return FALSE; + } + + modelData = (J3DModelData*)dComIfG_getObjectRes(getArcName(), getBdlRt()); + JUT_ASSERT(DEMO_SELECT(369, 371), modelData != NULL); + + mpRightModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpRightModel == NULL) { + return FALSE; + } + + mpBgw = new dBgW(); + if (mpBgw == NULL) { + return FALSE; + } + + cBgD_t* pData = (cBgD_t*)dComIfG_getObjectRes(getArcName(), getDzb()); + if (pData == NULL) { + return FALSE; + } + + calcMtx(); + + if (mpBgw->Set(pData, cBgW::MOVE_BG_e, &mpLeftModel->getBaseTRMtx()) == true) { + return FALSE; + } + + switch (chkMakeKey()) { + case 1: + if (!mKeyLock.keyCreate(0)) { + return FALSE; + } + break; + + case 2: + if (!mKeyLock.keyCreate(1)) { + return FALSE; + } + break; + } + + if (chkMakeStop() && !mStopBars.create()) { + return FALSE; + } + + mKeyLock.calcMtx(this); + mStopBars.calcMtx(this); + return TRUE; } /* 000008F8-00000974 .text getShapeType__10daDoor12_cFv */ -void daDoor12_c::getShapeType() { - /* Nonmatching */ +u8 daDoor12_c::getShapeType() { + switch (getArg1()) { + case 8: + return 1; + case 9: + return 2; + case 10: + return 3; + case 11: + return 4; + case 12: + return 5; + } + + return 0; } /* 00000974-000009B0 .text getArcName__10daDoor12_cFv */ -void daDoor12_c::getArcName() { - /* Nonmatching */ +char* daDoor12_c::getArcName() { + u8 uVar2 = getShapeType(); + char* pcVar1; + + if (uVar2 >= 3) { + pcVar1 = "door13"; + } else { + pcVar1 = "door12"; + } + return pcVar1; } /* 000009B0-000009E0 .text getBdlLf__10daDoor12_cFv */ -void daDoor12_c::getBdlLf() { - /* Nonmatching */ +s32 daDoor12_c::getBdlLf() { + static s32 bldLf_table[] = { + DOOR12_BDL_DOOR12_GL, DOOR12_BDL_DOOR12M_L, DOOR12_BDL_DOOR12B_L, DOOR12_BDL_DOOR12_GR, DOOR12_BDL_DOOR12M_R, DOOR12_BDL_DOOR12B_R + }; + return bldLf_table[getShapeType()]; } /* 000009E0-00000A10 .text getBdlRt__10daDoor12_cFv */ -void daDoor12_c::getBdlRt() { - /* Nonmatching */ +s32 daDoor12_c::getBdlRt() { + static s32 bldRf_table[] = { + DOOR12_BDL_DOOR12_GR, DOOR12_BDL_DOOR12M_R, DOOR12_BDL_DOOR12B_R, DOOR12_BDL_DOOR12_GL, DOOR12_BDL_DOOR12M_L, DOOR12_BDL_DOOR12B_L + }; + return bldRf_table[getShapeType()]; } /* 00000A10-00000A6C .text getDzb__10daDoor12_cFv */ -void daDoor12_c::getDzb() { - /* Nonmatching */ +s32 daDoor12_c::getDzb() { + switch (getShapeType()) { + case 2: + return DOOR12_DZB_DOOR12_B; + case 3: + case 4: + return DOOR12_DZB_DOOR12_G; + + case 5: + return DOOR12_DZB_DOOR12_B; + } + + return DOOR12_DZB_DOOR12_G; } /* 00000A6C-00000ACC .text openWide__10daDoor12_cFv */ -void daDoor12_c::openWide() { - /* Nonmatching */ +f32 daDoor12_c::openWide() { +#if VERSION == VERSION_DEMO + return l_HIO.m08; +#else + f32 uVar2; + + switch (getShapeType()) { + case 3: + case 4: + uVar2 = 140.0f; + break; + + case 5: + uVar2 = 220.0f; + break; + + default: + uVar2 = 200.0f; + break; + } + return uVar2; +#endif } /* 00000ACC-00000CD0 .text setEventPrm__10daDoor12_cFv */ void daDoor12_c::setEventPrm() { - /* Nonmatching */ + if (mFrontCheck == 0) { + m2C6 = 2; + if (mStopBars.mA == 0xff) { + mStopBars.mA = chkStopB(); + } + } else { + m2C6 = 3; + if (getType() == 3) { + return; + } + + if (mStopBars.mA == 0xff) { + mStopBars.mA = chkStopF(); + } + } + + if (mStopBars.m8 == 0) { + if (getType() == 3) { + m2C6 = 6; + } else if (mStopBars.mA == 1) { + m2C6 += 2; + } + + if (getShapeType() == 1 || getShapeType() == 2 || getShapeType() == 4 || getShapeType() == 5) { + if (fopAcM_SearchByID(daPy_getPlayerActorClass()->getGrabActorID()) != NULL) { + m2C6 = 0xb; + } + } + + if (mKeyLock.mbEnabled) { + switch (getType()) { + case 3: + if (dComIfGs_isDungeonItemBossKey() == 0) { + return; + } + break; + + default: + if (dComIfGs_getKeyNum() == 0) { + return; + } + break; + } + } + + if (checkArea(12100.0f, 12100.0f, 62500.0f)) { + eventInfo.setEventId(mEventIdx[m2C6]); + eventInfo.setToolId(mToolId[m2C6]); + eventInfo.onCondition(dEvtCnd_CANDOOR_e); + } + } } /* 00000CD0-00000DB0 .text openInit__10daDoor12_cFv */ void daDoor12_c::openInit() { - /* Nonmatching */ + openInitCom(1); + onFlag(1); + dComIfG_Bgsp()->Release(mpBgw); + m31C = 0.0f; + speedF = 0.0f; + +#if VERSION > VERSION_DEMO + if ((getArg1() != 8 && getArg1() != 0xb) || m318 != 1) +#endif + { + fopAcM_seStart(this, JA_SE_OBJ_STN_DOOR_MOVE_U, 0); + } } /* 00000DB0-00000E50 .text openProc__10daDoor12_cFv */ -void daDoor12_c::openProc() { - /* Nonmatching */ +BOOL daDoor12_c::openProc() { + BOOL ret = FALSE; + + switch (m2C6) { + case 2: + case 3: + case 11: + openProcCom(); + break; + } + + cLib_chaseF(&speedF, 20.0f, 2.0f); + if (cLib_chaseF(&m31C, 200.0f, speedF)) { + ret = TRUE; + } + + calcMtx(); + return ret; } /* 00000E50-00000F14 .text openEnd__10daDoor12_cFv */ void daDoor12_c::openEnd() { - /* Nonmatching */ +#if VERSION > VERSION_DEMO + if ((getArg1() != 8 && getArg1() != 0xb) || m318 != 1) +#endif + { + fopAcM_seStart(this, JA_SE_OBJ_STN_DOOR_STOP_U, 0); + } + + offFlag(1); + m31C = 200.0f; + speedF = 0.0f; } /* 00000F14-00001020 .text closeInit__10daDoor12_cFv */ void daDoor12_c::closeInit() { - /* Nonmatching */ + onFlag(2); + bool rt = dComIfG_Bgsp()->Regist(mpBgw, this); + JUT_ASSERT(DEMO_SELECT(649, 661), !rt); + + dComIfGp_map_clrAGBMapSendStopFlg(); + +#if VERSION > VERSION_DEMO + if ((getArg1() != 8 && getArg1() != 0xb) || m318 == 1) +#endif + { + fopAcM_seStart(this, JA_SE_OBJ_STN_DOOR_MOVE_D, 0); + } } /* 00001020-00001094 .text closeProc__10daDoor12_cFv */ -void daDoor12_c::closeProc() { - /* Nonmatching */ +BOOL daDoor12_c::closeProc() { + BOOL ret = FALSE; + cLib_chaseF(&speedF, 20.0f, 2.0f); + if (cLib_chaseF(&m31C, 0.0f, speedF)) { + ret = TRUE; + } + calcMtx(); + return ret; } /* 00001094-00001180 .text closeEnd__10daDoor12_cFv */ void daDoor12_c::closeEnd() { - /* Nonmatching */ + offFlag(2); + closeEndCom(); + dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + +#if VERSION > VERSION_DEMO + if ((getArg1() != 8 && getArg1() != 0xb) || m318 == 1) +#endif + { + fopAcM_seStart(this, JA_SE_OBJ_STN_DOOR_STOP_D, 0); + } } /* 00001180-00001254 .text calcMtx__10daDoor12_cFv */ void daDoor12_c::calcMtx() { - /* Nonmatching */ + f32 fVar1 = m31C * 0.005f * openWide(); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::YrotM(home.angle.y); + + mDoMtx_stack_c::transM(fVar1, 0.0f, 0.0f); + mpRightModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + mDoMtx_stack_c::transM(-fVar1 * 2.0f, 0.0f, 0.0f); + mpLeftModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00001254-0000134C .text CreateInit__10daDoor12_cFv */ -void daDoor12_c::CreateInit() { - /* Nonmatching */ +BOOL daDoor12_c::CreateInit() { + if (dComIfG_Bgsp()->Regist(mpBgw, this)) { + JUT_ASSERT(DEMO_SELECT(726, 748), FALSE); + } + + tevStr.mRoomNo = current.roomNo; + m31C = 0.0f; + setAction(0); + attention_info.position.y += 150.0f; + eyePos.y += 150.0f; + attention_info.flags = fopAc_Attn_ACTION_DOOR_e; + + calcMtx(); + mpBgw->Move(); + + mpBgw->SetRoomId(getFRoomNo()); + initProc(2); + +#if VERSION > VERSION_DEMO + m2A1 = 0x41; +#endif + +#if VERSION == VERSION_DEMO + if (l_HIO.mNo < 0) { + l_HIO.mNo = mDoHIO_createChild("両開きドア", &l_HIO); + } +#endif + + return TRUE; } /* 0000134C-0000144C .text create__10daDoor12_cFv */ cPhs_State daDoor12_c::create() { - /* Nonmatching */ + cPhs_State PVar2 = dComIfG_resLoad(&mPhase, getArcName()); + + if (PVar2 != cPhs_COMPLEATE_e) { + return PVar2; + } + + if (getArg1() == 9 || getArg1() == 0xc) { + setType(3); + } + + if (getArg1() == 8) { + dComIfGs_offTmpBit(0x440); + } + + if (chkMakeKey()) { + cPhs_State pVar3 = mKeyLock.keyResLoad(); + if (pVar3 != cPhs_COMPLEATE_e) { + return pVar3; + } + } + + fopAcM_SetRoomNo(this, getFRoomNo()); + + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2700)) { + return cPhs_ERROR_e; + } + + CreateInit(); + return cPhs_COMPLEATE_e; } /* 0000144C-0000171C .text demoProc__10daDoor12_cFv */ void daDoor12_c::demoProc() { - /* Nonmatching */ + s32 iVar1 = getDemoAction(); + + if (dComIfGp_evmng_getIsAddvance(mStaffId)) { + switch (iVar1) { + case 3: + openInit(); + break; + + case 4: + closeInit(); + break; + + case 7: + setGoal(); + break; + + case 8: + mKeyLock.keyInit(this); + break; + + case 2: + setStop(); + if (mStopBars.m8) { + mStopBars.closeInit(this); + } + break; + + case 1: + mStopBars.openInit(this); + break; + + case 0x14: + setPlayerAngle(0); + break; + + case 0x15: + setPlayerAngle(1); + break; + } + } + + switch (iVar1) { + case 3: + if (checkFlag(1)) { + if (openProc()) { + openEnd(); + dComIfGp_evmng_cutEnd(mStaffId); + } + } else { + dComIfGp_evmng_cutEnd(mStaffId); + } + break; + + case 4: + if (checkFlag(2)) { + if (closeProc()) { + closeEnd(); + dComIfGp_evmng_cutEnd(mStaffId); + } + } else { + dComIfGp_evmng_cutEnd(mStaffId); + } + break; + + case 8: + if (mKeyLock.keyProc()) { + dComIfGp_evmng_cutEnd(mStaffId); + } + mKeyLock.calcMtx(this); + break; + + case 2: + iVar1 = mStopBars.closeProc(this); + if (iVar1 == 2 && getArg1() == 8) { + dComIfGs_onTmpBit(0x440); + } + + if (iVar1 != 0) { + dComIfGp_evmng_cutEnd(mStaffId); + } + + mStopBars.calcMtx(this); + break; + + case 1: + if (mStopBars.openProc(this)) { + dComIfGp_evmng_cutEnd(mStaffId); + } + mStopBars.calcMtx(this); + break; + + case 0x13: + if (dComIfGp_event_chkEventFlag(dEvtFlag_NOPARTNER_e)) { + setAction(1); + dComIfGp_event_reset(); + shape_angle.y = current.angle.y; + dComIfGp_event_offEventFlag(dEvtFlag_NOPARTNER_e); + if (dComIfGp_evmng_checkStartDemo()) { + dComIfGp_evmng_cancelStartDemo(); + } + } + dComIfGp_evmng_cutEnd(mStaffId); + break; + + default: + dComIfGp_evmng_cutEnd(mStaffId); + break; + } } /* 0000171C-00001868 .text daDoor12_actionWait__FP10daDoor12_c */ -void daDoor12_actionWait(daDoor12_c*) { - /* Nonmatching */ +BOOL daDoor12_actionWait(daDoor12_c* i_this) { + if (i_this->eventInfo.checkCommandDoor()) { + i_this->initOpenDemo(1); + i_this->setAction(3); + i_this->demoProc(); + } else if (i_this->mStopBars.m8 != 0) { + if (i_this->eventInfo.checkCommandDemoAccrpt()) { + i_this->mStaffId = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR"); + i_this->shape_angle.y = i_this->current.angle.y; + if (i_this->mFrontCheck == 1) { + i_this->shape_angle.y += 0x7FFF; + } + i_this->setAction(3); + i_this->demoProc(); + } else if (i_this->chkStopOpen()) { + i_this->setStopDemo(); + fopAcM_orderOtherEventId(i_this, i_this->mEventIdx[i_this->m2C6], i_this->mToolId[i_this->m2C6]); + } + } else if (i_this->chkStopClose()) { + i_this->mStopBars.m8 = 1; + i_this->mStopBars.closeInit(i_this); + i_this->mStopBars.calcMtx(i_this); + i_this->setAction(2); + } else { + i_this->setEventPrm(); + } + return TRUE; } /* 00001868-000018EC .text daDoor12_actionDemo__FP10daDoor12_c */ -void daDoor12_actionDemo(daDoor12_c*) { - /* Nonmatching */ +BOOL daDoor12_actionDemo(daDoor12_c* i_this) { + if (dComIfGp_evmng_endCheck(i_this->mEventIdx[i_this->m2C6])) { + i_this->setAction(1); + dComIfGp_event_reset(); + i_this->shape_angle.y = i_this->current.angle.y; + } else { + i_this->demoProc(); + } + return TRUE; } /* 000018EC-00001940 .text daDoor12_actionStopClose__FP10daDoor12_c */ -void daDoor12_actionStopClose(daDoor12_c*) { - /* Nonmatching */ +BOOL daDoor12_actionStopClose(daDoor12_c* i_this) { + if (i_this->mStopBars.closeProc(i_this)) { + i_this->setAction(1); + } + i_this->mStopBars.calcMtx(i_this); + return TRUE; } /* 00001940-000019A0 .text daDoor12_actionInit__FP10daDoor12_c */ -void daDoor12_actionInit(daDoor12_c*) { - /* Nonmatching */ +BOOL daDoor12_actionInit(daDoor12_c* i_this) { + i_this->setKey(); + i_this->mKeyLock.calcMtx(i_this); + i_this->setStop(); + i_this->mStopBars.calcMtx(i_this); + daDoor12_actionWait(i_this); + i_this->setAction(1); + return TRUE; } /* 000019A0-00001AD0 .text draw__10daDoor12_cFv */ BOOL daDoor12_c::draw() { - /* Nonmatching */ + if (!drawCheck(getType() == 3)) { + return TRUE; + } + +#if VERSION == VERSION_DEMO + if (l_HIO.m0C != 0) { + return FALSE; + } +#endif + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + dComIfGd_setListBG(); + + g_env_light.setLightTevColorType(mpLeftModel, &tevStr); + mDoExt_modelUpdateDL(mpLeftModel); + + g_env_light.setLightTevColorType(mpRightModel, &tevStr); + mDoExt_modelUpdateDL(mpRightModel); + + dComIfGd_setList(); + + if (mKeyLock.mbEnabled) { + mKeyLock.draw(this); + } + + if (mStopBars.m8 != 0 && mStopBars.mpModel != NULL) { + g_env_light.setLightTevColorType(mStopBars.mpModel, &tevStr); + mDoExt_modelUpdateDL(mStopBars.mpModel); + } + return TRUE; } /* 00001AD0-00001AF0 .text daDoor12_Draw__FP10daDoor12_c */ static BOOL daDoor12_Draw(daDoor12_c* i_this) { - return ((daDoor12_c*)i_this)->draw(); + return i_this->draw(); +} + +BOOL daDoor12_c::execute() { + typedef BOOL (*ActionFunc)(daDoor12_c*); + static ActionFunc l_action[] = { + daDoor12_actionInit, + daDoor12_actionWait, + daDoor12_actionStopClose, + daDoor12_actionDemo, + }; + + s32 tmp = checkExecute(); + +#if VERSION > VERSION_DEMO + m318 = tmp; +#endif + + switch (tmp) { + case 0: + setAction(0); + break; + + case 2: + l_action[m314](this); + break; + + case 1: + startDemoProc(); + demoProc(); + break; + + default: + JUT_ASSERT(DEMO_SELECT(1054, 1078), FALSE); + break; + } + + mRoomNo2 = dComIfGp_roomControl_getStayNo(); + return TRUE; } /* 00001AF0-00001BC8 .text daDoor12_Execute__FP10daDoor12_c */ -static BOOL daDoor12_Execute(daDoor12_c*) { - /* Nonmatching */ +static BOOL daDoor12_Execute(daDoor12_c* i_this) { + return i_this->execute(); } /* 00001BC8-00001BD0 .text daDoor12_IsDelete__FP10daDoor12_c */ @@ -189,13 +868,40 @@ static BOOL daDoor12_IsDelete(daDoor12_c*) { } /* 00001BD0-00001CC4 .text daDoor12_Delete__FP10daDoor12_c */ -static BOOL daDoor12_Delete(daDoor12_c*) { - /* Nonmatching */ +static BOOL daDoor12_Delete(daDoor12_c* i_this) { +#if VERSION > VERSION_DEMO + if (i_this->heap != NULL) +#endif + { + if (i_this->mpBgw != NULL) { + if (i_this->mpBgw->ChkUsed()) { + dComIfG_Bgsp()->Release(i_this->mpBgw); + } + } + } + + dComIfG_resDelete(&i_this->mPhase, i_this->getArcName()); + + if (i_this->chkMakeKey()) { + i_this->mKeyLock.keyResDelete(); + } + + i_this->~daDoor12_c(); + +#if VERSION == VERSION_DEMO + if (l_HIO.mNo >= 0) { + mDoHIO_deleteChild(l_HIO.mNo); + l_HIO.mNo = -1; + } +#endif + return TRUE; } /* 00001CC4-00001D3C .text daDoor12_Create__FP10fopAc_ac_c */ -static cPhs_State daDoor12_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daDoor12_Create(fopAc_ac_c* a_this) { + fopAcM_SetupActor(a_this, daDoor12_c); + + return ((daDoor12_c*)a_this)->create(); } static actor_method_class l_daDoor12_Method = {