From ec93cb6da5404fc0506210a20ea629ff9d34d5af Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 29 Jun 2024 19:38:18 -0700 Subject: [PATCH] d_door work --- include/d/d_com_inf_game.h | 2 +- include/d/d_door.h | 27 ++-- src/d/d_door.cpp | 283 ++++++++++++++++++++++++++++++++----- 3 files changed, 266 insertions(+), 46 deletions(-) diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index e94e1dd54..7801a6d15 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -367,7 +367,7 @@ public: void setItemNameMessageID(u32 id) { mItemNameMessageID = id; } s16 getItemKeyNumCount() { return mItemKeyNumCount; } - void setItemKeyNumCount(s16 num) { mItemKeyNumCount += num; } + void setItemKeyNumCount(s16 num) { mItemKeyNumCount = num; } void setItemBeastNumCount(int i_idx, s16 num) { mItemBeastNumCounts[i_idx] += num; } s16 getItemBeastNumCount(int i_idx) { return mItemBeastNumCounts[i_idx]; } diff --git a/include/d/d_door.h b/include/d/d_door.h index b58c57c4a..204ddfeef 100644 --- a/include/d/d_door.h +++ b/include/d/d_door.h @@ -5,6 +5,8 @@ #include "d/d_particle.h" #include "SSystem/SComponent/c_phase.h" +class msg_class; + class dDoor_info_c : public fopAc_ac_c { public: void valShipId() {} @@ -29,7 +31,7 @@ public: void makeEventId(int); void initProc(int); void initOpenDemo(int); - void checkArea(f32, f32, f32); + BOOL checkArea(f32, f32, f32); void openInitCom(int); void openProcCom(); void closeEndCom(); @@ -98,14 +100,14 @@ class dDoor_stop_c { public: void calcMtx(dDoor_info_c*); void closeInit(dDoor_info_c*); - void closeProc(dDoor_info_c*); + s32 closeProc(dDoor_info_c*); void openInit(dDoor_info_c*); - void openProc(dDoor_info_c*); - void create(); + s32 openProc(dDoor_info_c*); + BOOL create(); public: /* 0x0 */ J3DModel* mpModel; - /* 0x4 */ f32 m4; + /* 0x4 */ f32 mOffsY; /* 0x8 */ u8 m8; /* 0x9 */ u8 mFrontCheck; /* 0xA */ u8 mA; @@ -115,14 +117,13 @@ public: class dDoor_msg_c { public: void init(s16); - void proc(cXyz*); + BOOL proc(cXyz*); public: - /* 0x0 */ u32 m0; - /* 0x4 */ int mMsg; - /* 0x8 */ s8 m8; - /* 0x9 */ u8 m9[0xA - 0x9]; - /* 0xA */ s16 mA; + /* 0x0 */ uint mMsgPId; + /* 0x4 */ msg_class* m_msg; + /* 0x8 */ u8 mState; + /* 0xA */ s16 mMsgId; }; class dDoor_hkyo_c { @@ -133,13 +134,13 @@ public: s32 resLoad(); void resDelete(); - void create(); + BOOL create(); void setAnm(u8); void init(); void calcMtx(dDoor_info_c*, f32); void draw(dDoor_info_c*); void proc(dDoor_info_c*); - void chkFirst(); + BOOL chkFirst(); void onFirst(); BOOL chkStart(); diff --git a/src/d/d_door.cpp b/src/d/d_door.cpp index 782ff00dc..a0b2fe3e3 100644 --- a/src/d/d_door.cpp +++ b/src/d/d_door.cpp @@ -5,7 +5,9 @@ #include "d/d_door.h" #include "d/d_com_inf_game.h" +#include "d/d_vibration.h" #include "d/res/res_key.h" +#include "d/res/res_hkyo.h" #include "d/actor/d_a_player.h" /* 8006B39C-8006B3A8 .text getSwbit__12dDoor_info_cFv */ @@ -232,8 +234,29 @@ void dDoor_info_c::initOpenDemo(int evt) { } /* 8006BC50-8006BDBC .text checkArea__12dDoor_info_cFfff */ -void dDoor_info_c::checkArea(f32, f32, f32) { - /* Nonmatching */ +BOOL dDoor_info_c::checkArea(f32 f1, f32 f2, f32 distXZSqMax) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz delta = player->current.pos - current.pos; + f32 distXZSq = delta.abs2XZ(); + if (distXZSq > distXZSqMax) + return FALSE; + + delta.normalize(); + f32 dot = delta.x * mAngleVec.x + delta.z * mAngleVec.z; + f32 d3 = distXZSq * dot * dot; + if (d3 > f2) + return FALSE; + + if (distXZSq - d3 > f1) + return FALSE; + + s16 checkAngle = current.angle.y; + if (mFrontCheck == 1) + checkAngle += 0x7FFF; + if (abs((s16)(checkAngle - player->current.angle.y)) < 0x5000) + return FALSE; + + return TRUE; } /* 8006BDBC-8006BE94 .text openInitCom__12dDoor_info_cFi */ @@ -527,45 +550,143 @@ void dDoor_key2_c::draw(dDoor_info_c* door) { /* 8006CA78-8006CB28 .text calcMtx__12dDoor_stop_cFP12dDoor_info_c */ void dDoor_stop_c::calcMtx(dDoor_info_c* door) { - /* Nonmatching */ + if (m8 == 0 || mpModel == NULL) + return; + mDoMtx_stack_c::transS(door->current.pos.x, door->current.pos.y + mOffsY, door->current.pos.z); + mDoMtx_stack_c::YrotM(door->current.angle.y); + if (mFrontCheck == 1) + mDoMtx_stack_c::YrotM(0x7FFF); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 8006CB28-8006CBFC .text closeInit__12dDoor_stop_cFP12dDoor_info_c */ -void dDoor_stop_c::closeInit(dDoor_info_c*) { - /* Nonmatching */ +void dDoor_stop_c::closeInit(dDoor_info_c* door) { + mOffsY = 300.0f; + fopAcM_SetSpeedF(door, 0.0f); + if (door->getArg1() == 17) { + fopAcM_seStart(door, JA_SE_OBJ_CAGE_CLOSE, 0); + } else { + fopAcM_seStart(door, JA_SE_OBJ_STN_DOOR_STL_BAR, 0); + } + mB = 1; } /* 8006CBFC-8006CC80 .text closeProc__12dDoor_stop_cFP12dDoor_info_c */ -void dDoor_stop_c::closeProc(dDoor_info_c*) { - /* Nonmatching */ +s32 dDoor_stop_c::closeProc(dDoor_info_c* door) { + if (!mB) + return 1; + + cLib_chaseF(&door->speedF, 60.0f, 6.0f); + if (cLib_chaseF(&mOffsY, 0.0f, door->speedF)) { + mB = FALSE; + return 2; + } else { + return 0; + } } /* 8006CC80-8006CD50 .text openInit__12dDoor_stop_cFP12dDoor_info_c */ -void dDoor_stop_c::openInit(dDoor_info_c*) { - /* Nonmatching */ +void dDoor_stop_c::openInit(dDoor_info_c* door) { + mOffsY = 0.0f; + fopAcM_SetSpeedF(door, 0.0f); + if (door->getArg1() == 17) { + fopAcM_seStart(door, JA_SE_OBJ_CAGE_OPEN, 0); + } else { + fopAcM_seStart(door, JA_SE_OBJ_STN_DOOR_STL_BAR, 0); + } + mB = 1; } /* 8006CD50-8006CDD8 .text openProc__12dDoor_stop_cFP12dDoor_info_c */ -void dDoor_stop_c::openProc(dDoor_info_c*) { - /* Nonmatching */ +s32 dDoor_stop_c::openProc(dDoor_info_c* door) { + if (!mB) + return 1; + + cLib_chaseF(&door->speedF, 30.0f, 4.0f); + if (cLib_chaseF(&mOffsY, 300.0f, door->speedF)) { + mB = FALSE; + m8 = FALSE; + return 2; + } else { + return 0; + } } /* 8006CDD8-8006CE8C .text create__12dDoor_stop_cFv */ -void dDoor_stop_c::create() { - /* Nonmatching */ +BOOL dDoor_stop_c::create() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getStageRes("Stage", "stop10.bmd"); + if (modelData == NULL) + modelData = (J3DModelData*)dComIfG_getStageRes("Stage", "stop10.bdl"); + + if (modelData != NULL) { + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpModel == NULL) + return FALSE; + } + + return TRUE; } /* 8006CE8C-8006CEA8 .text init__11dDoor_msg_cFs */ -void dDoor_msg_c::init(s16 param_1) { - mA = param_1; - m0 = -1; - mMsg = 0; - m8 = 0; +void dDoor_msg_c::init(s16 msg_id) { + mMsgId = msg_id; + mMsgPId = fpcM_ERROR_PROCESS_ID_e; + m_msg = NULL; + mState = 0; } /* 8006CEA8-8006D0DC .text proc__11dDoor_msg_cFP4cXyz */ -void dDoor_msg_c::proc(cXyz*) { - /* Nonmatching */ +BOOL dDoor_msg_c::proc(cXyz* pos) { + switch (mState) { + case 0: + mMsgPId = fopMsgM_messageSet(mMsgId, pos); + if (mMsgPId != fpcM_ERROR_PROCESS_ID_e) + mState++; + break; + case 1: + m_msg = fopMsgM_SearchByID(mMsgPId); + if (m_msg != NULL) + mState++; + break; + case 2: + JUT_ASSERT(0x3ba, m_msg); + if (m_msg->mStatus == fopMsgStts_MSG_TYPING_e) { + switch (mMsgId) { + case 0x1BBD: + case 0x06A8: + dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + break; + } + mState++; + } + break; + case 3: + JUT_ASSERT(0x3ca, m_msg); + if (m_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + switch (mMsgId) { + case 0x1BBD: + case 0x1BC0: + case 0x1BC1: + case 0x1BC2: + mMsgId++; + m_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + fopMsgM_messageSet(mMsgId); + break; + default: + mState++; + m_msg->mStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + break; + } + + if (m_msg != NULL && m_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { + m_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + return TRUE; + } else { + return FALSE; + } } /* 8006D0DC-8006D11C .text resLoad__12dDoor_hkyo_cFv */ @@ -585,13 +706,47 @@ void dDoor_hkyo_c::resDelete() { } /* 8006D154-8006D2D4 .text create__12dDoor_hkyo_cFv */ -void dDoor_hkyo_c::create() { - /* Nonmatching */ +BOOL dDoor_hkyo_c::create() { + if (m11 == 0) + return TRUE; + + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Hkyo", HKYO_BDL_HKYO1); + JUT_ASSERT(0x41c, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202); + if (mpModel == NULL) + return FALSE; + + mpBrkAnm = new mDoExt_brkAnm(); + if (mpBrkAnm == NULL) + return FALSE; + + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Hkyo", HKYO_BRK_HKYO1B); + if (!mpBrkAnm->init(modelData, brk, TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false, 0)) + return FALSE; + + return TRUE; } /* 8006D2D4-8006D3A8 .text setAnm__12dDoor_hkyo_cFUc */ -void dDoor_hkyo_c::setAnm(u8) { - /* Nonmatching */ +void dDoor_hkyo_c::setAnm(u8 idx) { + if (mAnmIdx == idx) + return; + + mAnmIdx = idx; + if (idx == 0) + return; + + u32 fileIndex; + switch (idx) { + case 1: fileIndex = HKYO_BRK_HKYO1A; break; + case 2: fileIndex = HKYO_BRK_HKYO1B; break; + default: fileIndex = HKYO_BRK_HKYO1C; break; + } + + J3DModelData* modelData = mpModel->getModelData(); + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Hkyo", fileIndex); + mpBrkAnm->init(modelData, brk, TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, true, 0); } /* 8006D3A8-8006D3B4 .text init__12dDoor_hkyo_cFv */ @@ -600,28 +755,92 @@ void dDoor_hkyo_c::init() { } /* 8006D3B4-8006D464 .text calcMtx__12dDoor_hkyo_cFP12dDoor_info_cf */ -void dDoor_hkyo_c::calcMtx(dDoor_info_c*, f32) { - /* Nonmatching */ +void dDoor_hkyo_c::calcMtx(dDoor_info_c* door, f32 offsY) { + if (m11 == 0 || mpModel == NULL) + return; + mDoMtx_stack_c::transS(door->current.pos); + mDoMtx_stack_c::YrotM(door->current.angle.y); + mDoMtx_stack_c::transM(0.0f, offsY, 0.0f); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 8006D464-8006D500 .text draw__12dDoor_hkyo_cFP12dDoor_info_c */ -void dDoor_hkyo_c::draw(dDoor_info_c*) { - /* Nonmatching */ +void dDoor_hkyo_c::draw(dDoor_info_c* door) { + if (m11 == 0 || mAnmIdx == 0 || mpModel == NULL) + return; + if (!chkFirst()) { + J3DModelData* modelData = mpModel->getModelData(); + g_env_light.setLightTevColorType(mpModel, &door->tevStr); + mpBrkAnm->entry(modelData); + mDoExt_modelUpdateDL(mpModel); + } } /* 8006D500-8006D71C .text proc__12dDoor_hkyo_cFP12dDoor_info_c */ -void dDoor_hkyo_c::proc(dDoor_info_c*) { - /* Nonmatching */ +void dDoor_hkyo_c::proc(dDoor_info_c* door) { + if (m11 == 0 || mpModel == NULL) + return; + + switch (m11) { + case 1: + if (dComIfGs_isTmpBit(0x108)) + setAnm(1); + else if (dComIfGs_isTmpBit(0x110)) + setAnm(2); + else + setAnm(0); + break; + case 4: + if (dComIfGs_isEventBit(0x1710)) + setAnm(0); + else + setAnm(3); + break; + case 3: + if (!dComIfGs_isTact(2) || dComIfGs_isEventBit(0x1704)) + setAnm(0); + else + setAnm(3); + break; + case 2: + if (!dComIfGs_isEventBit(0x1704) || dComIfGs_isEventBit(0x1b01)) + setAnm(0); + else + setAnm(3); + break; + default: + setAnm(0); + break; + } + + if (mAnmIdx != 0) { + mpBrkAnm->play(); + fopAcM_seStart(door, JA_SE_OBJ_RES_DOOR_BLINK, 0); + } } /* 8006D71C-8006D784 .text chkFirst__12dDoor_hkyo_cFv */ -void dDoor_hkyo_c::chkFirst() { - /* Nonmatching */ +BOOL dDoor_hkyo_c::chkFirst() { + if (m11 != 1) + return FALSE; + + switch (mAnmIdx) { + case 1: + if (!dComIfGs_isEventBit(0x2602)) + return TRUE; + break; + } + + return FALSE; } /* 8006D784-8006D7E8 .text onFirst__12dDoor_hkyo_cFv */ void dDoor_hkyo_c::onFirst() { /* Nonmatching */ + switch (mAnmIdx) { + case 1: dComIfGs_onEventBit(0x2602); break; + case 2: dComIfGs_onEventBit(0x2601); break; + } } /* 8006D7E8-8006D800 .text chkStart__12dDoor_hkyo_cFv */