From 89ca32a65cfea06462c4efafed45631eaf6cca11 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 7 Feb 2024 22:16:39 -0800 Subject: [PATCH] d_door work --- include/d/d_com_inf_game.h | 4 + include/d/d_door.h | 39 +++---- include/d/d_map.h | 7 +- include/d/d_stage.h | 4 +- src/d/d_door.cpp | 228 +++++++++++++++++++++++++++++++++---- 5 files changed, 230 insertions(+), 52 deletions(-) diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 26b5a45f2..c5685c6b6 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -2502,6 +2502,10 @@ inline s16 dComIfGp_evmng_getEventIdx(const char* pName, u8 evNo) { return g_dComIfG_gameInfo.play.getEvtManager().getEventIdx(pName, evNo); } +inline int dComIfGp_evmng_getToolId(u8 idx, int sub) { + return dComIfGp_getPEvtManager()->getToolId(idx, sub); +} + inline int dComIfGp_evmng_getMyStaffId(const char* pName, fopAc_ac_c* pActor = NULL, int staffType = 0) { return dComIfGp_getPEvtManager()->getMyStaffId(pName, pActor, staffType); } diff --git a/include/d/d_door.h b/include/d/d_door.h index 29f24e326..d62b36e77 100644 --- a/include/d/d_door.h +++ b/include/d/d_door.h @@ -19,12 +19,12 @@ public: u8 getShipId(); u8 getArg1(); BOOL adjoinPlayer(); - void getViewRoomNo(); - void frontCheckOld(); - void frontCheck(); - void drawCheck_local(); - void drawCheck(int); - void checkExecute(); + u8 getViewRoomNo(); + s32 frontCheckOld(); + s32 frontCheck(); + s32 drawCheck_local(); + u8 drawCheck(int); + u8 checkExecute(); void startDemoProc(); void makeEventId(int); void initProc(int); @@ -33,34 +33,25 @@ public: void openInitCom(int); void openProcCom(); void closeEndCom(); - void getDemoAction(); + s32 getDemoAction(); void setGoal(); void setPlayerAngle(int); void setPosAndAngle(cXyz*, s16); public: - /* 0x290 */ u8 mRoomNo2; - /* 0x291 */ u8 mFRoomNo; - /* 0x292 */ u8 mBRoomNo; + /* 0x290 */ s8 mRoomNo2; + /* 0x291 */ u8 mFromRoomNo; + /* 0x292 */ u8 mToRoomNo; /* 0x293 */ u8 m293[0x294 - 0x293]; /* 0x294 */ cXyz mAngleVec; /* 0x2A0 */ u8 mFrontCheck; /* 0x2A1 */ u8 m2A1; - /* 0x2A2 */ u8 m2A2[0x2A4 - 0x2A2]; - /* 0x2A4 */ void* m2A4; - /* 0x2A8 */ s16 m2A8; - /* 0x2AA */ u8 m2AA[0x2AC - 0x2AA]; - /* 0x2AC */ void* m2AC; - /* 0x2B0 */ void* m2B0; - /* 0x2B4 */ void* m2B4; - /* 0x2B8 */ void* m2B8; - /* 0x2BC */ u8 m2BC; - /* 0x2BD */ u8 m2BD; - /* 0x2BE */ u8 m2BE[0x2C0 - 0x2BE]; - /* 0x2C0 */ void* m2C0; - /* 0x2C4 */ void* m2C4; + /* 0x2A2 */ u16 mEventIdx[12]; + /* 0x2BA */ u8 mToolId[12]; + /* 0x2C6 */ u8 field_0x2c6; + /* 0x2C7 */ u8 field_0x2c7; /* 0x2C8 */ int mStaffId; - /* 0x2CC */ u8 mRoomNo; + /* 0x2CC */ s8 mRoomNo; /* 0x2CD */ u8 m2CD[0x2D0 - 0x2CD]; }; diff --git a/include/d/d_map.h b/include/d/d_map.h index 06f8b6cca..18fb632f8 100644 --- a/include/d/d_map.h +++ b/include/d/d_map.h @@ -169,9 +169,9 @@ public: static u8 getIconDispMode() { return mIconDispMode; } static void setIconDispMode(u8 mode) { mIconDispMode = mode; } - static void setAGBMapSendStopFlg() {} - static void clrAGBMapSendStopFlg() {} - static void isAGBMapSendStopFlg() {} + static void setAGBMapSendStopFlg() { mAGBMapSendStopFlg = true; } + static void clrAGBMapSendStopFlg() { mAGBMapSendStopFlg = false; } + static bool isAGBMapSendStopFlg() { return mAGBMapSendStopFlg; } static void getMapDspSizeHeight() {} static void getMapDspSizeWidth() {} static void getNowRoom() {} @@ -257,6 +257,7 @@ public: static u8 mIconSelfAlpha; static f32 mIconSelfScale; static u8 mIconDispMode; + static bool mAGBMapSendStopFlg; }; inline void dMap_drawPoint(u8 param_1, f32 param_2, f32 param_3, f32 param_4, s8 param_5, s16 param_6, u8 param_7, u8 param_8, u8 param_9) { diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 4e260de50..d16299899 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -1078,11 +1078,9 @@ inline u32 dStage_FileList_dt_GetParticleNo(dStage_FileList_dt_c* i_fili) { } bool dStage_chkPlayerId(int playerId, int room_no); - int dStage_changeScene(int i_exitId, f32 speed, u32 mode, s8 room_no); - void dStage_restartRoom(u32 roomParam, u32 mode); - +bool dStage_setShipPos(int param_0, int i_roomNo); BOOL dStage_checkRestart(); void dStage_Create(); void dStage_Delete(); diff --git a/src/d/d_door.cpp b/src/d/d_door.cpp index 6e66e91a8..1eda6bc91 100644 --- a/src/d/d_door.cpp +++ b/src/d/d_door.cpp @@ -70,53 +70,164 @@ BOOL dDoor_info_c::adjoinPlayer() { } /* 8006B4C4-8006B554 .text getViewRoomNo__12dDoor_info_cFv */ -void dDoor_info_c::getViewRoomNo() { - /* Nonmatching */ +u8 dDoor_info_c::getViewRoomNo() { + cXyz delta = dComIfGd_getView()->mLookat.mEye - current.pos; + if (delta.x * mAngleVec.x + delta.z * mAngleVec.z < 0.0f) + return getBRoomNo(); + else + return getFRoomNo(); } /* 8006B554-8006B5E4 .text frontCheckOld__12dDoor_info_cFv */ -void dDoor_info_c::frontCheckOld() { +s32 dDoor_info_c::frontCheckOld() { /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cSGlobe globe(player->current.pos - current.pos); + cSAngle angle1; + angle1 = (globe.U() - player->current.angle.y); + s16 angle = angle1.Abs(); + if (angle < 0x4000 && angle >= 0) + return 0; + else + return 1; } /* 8006B65C-8006B6F4 .text frontCheck__12dDoor_info_cFv */ -void dDoor_info_c::frontCheck() { - /* Nonmatching */ +s32 dDoor_info_c::frontCheck() { + s32 stayNo = dComIfGp_roomControl_getStayNo(); + if (getFRoomNo() == getBRoomNo()) + return frontCheckOld(); + + return stayNo == getFRoomNo() ? 0 : + stayNo == getBRoomNo() ? 1 : 2; } /* 8006B6F4-8006B824 .text drawCheck_local__12dDoor_info_cFv */ -void dDoor_info_c::drawCheck_local() { - /* Nonmatching */ +s32 dDoor_info_c::drawCheck_local() { + if (!adjoinPlayer() && !mEvtInfo.checkCommandDemoAccrpt() && !mEvtInfo.checkCommandDoor()) + return 0; + + if (getFRoomNo() == 0x3F || getBRoomNo() == 0x3F) + mTevStr.mRoomNo = dComIfGp_roomControl_getStayNo(); + else + mTevStr.mRoomNo = getViewRoomNo(); + + current.roomNo = mTevStr.mRoomNo; + + u8 front = frontCheck(); + if (front == 2) + mRoomNo = -1; + else + mRoomNo = dComIfGp_roomControl_getStayNo(); + + if (!dComIfGp_roomControl_checkRoomDisp(mTevStr.mRoomNo)) + return 1; + + if (getViewRoomNo() == 0x3F && (getFRoomNo() != 0x3F || getBRoomNo() != 0x3F)) + return 1; + else + return 2; } /* 8006B824-8006B8AC .text drawCheck__12dDoor_info_cFi */ -void dDoor_info_c::drawCheck(int) { - /* Nonmatching */ +u8 dDoor_info_c::drawCheck(int mode) { + s32 rt = drawCheck_local(); + if (rt != 0) { + if (mode) { + fopAcM_SetStatusMap(this, 0x0A); + } else { + fopAcM_SetStatusMap(this, 0x09); + } + } else { + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); + } + return rt == 2; } /* 8006B8AC-8006B954 .text checkExecute__12dDoor_info_cFv */ -void dDoor_info_c::checkExecute() { - /* Nonmatching */ +u8 dDoor_info_c::checkExecute() { + mFrontCheck = frontCheck(); + if (fopAcM_checkStatus(this, fopAcStts_UNK1000_e)) + return 1; + + if (mEvtInfo.checkCommandDemoAccrpt() || mEvtInfo.checkCommandDoor()) + return 2; + + if (mRoomNo2 != dComIfGp_roomControl_getStayNo()) + return 0; + + if (mFrontCheck != 2 && adjoinPlayer()) + return 2; + + return 0; } /* 8006B954-8006BA30 .text startDemoProc__12dDoor_info_cFv */ void dDoor_info_c::startDemoProc() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + mStaffId = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR"); + shape_angle.y = current.angle.y; + JUT_ASSERT(0x112, player); + s16 delta = player->home.angle.y - home.angle.y; + if (delta < 0) + delta = -delta; + if (delta < 0x1000 && delta > -1000) + shape_angle.y += 0x7FFF; } /* 8006BA30-8006BB5C .text makeEventId__12dDoor_info_cFi */ -void dDoor_info_c::makeEventId(int) { +void dDoor_info_c::makeEventId(int spl) { /* Nonmatching */ + static const char* table[] = { + "DEFAULT_STOP_OPEN", + "DEFAULT_STOP_OPEN", + "DEFAULT_SHUTTER_DOOR_F", + "DEFAULT_SHUTTER_DOOR_F", + "DEFAULT_SHUTTER_DOOR_F_STOP", + "DEFAULT_SHUTTER_DOOR_F_STOP", + "DEFAULT_BS_SHUTTER_F", + "DEFAULT_KNOB_DOOR_F_OPEN", + "DEFAULT_KNOB_DOOR_B_OPEN", + "DEFAULT_KNOB_TALK", + "HKYO_DOOR", + "SHUTTER_DROP_CARRY", + }; + + for (s32 i = 0; i < 12; i++) { + mToolId[i] = dComIfGp_evmng_getToolId(getEventNo(), i); + mEventIdx[i] = dComIfGp_evmng_getEventIdx(table[i], mToolId[i]); + } + + switch (spl) { + case 1: + mEventIdx[2] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_10", mToolId[2]); + mEventIdx[3] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_10", mToolId[3]); + break; + case 2: + mEventIdx[2] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_12", mToolId[2]); + mEventIdx[3] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_12", mToolId[3]); + break; + } } /* 8006BB5C-8006BBB0 .text initProc__12dDoor_info_cFi */ -void dDoor_info_c::initProc(int) { - /* Nonmatching */ +void dDoor_info_c::initProc(int spl) { + mAngleVec.set(cM_ssin(home.angle.y), 0.0f, cM_scos(home.angle.y)); + makeEventId(spl); } /* 8006BBB0-8006BC50 .text initOpenDemo__12dDoor_info_cFi */ -void dDoor_info_c::initOpenDemo(int) { - /* Nonmatching */ +void dDoor_info_c::initOpenDemo(int evt) { + if (field_0x2c6 != 9) + dComIfGp_map_setAGBMapSendStopFlg(); + + shape_angle.y = current.angle.y; + if (mFrontCheck == 1) + shape_angle.y += 0x7FFF; + + mStaffId = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR"); + if (evt) + dComIfGp_event_onEventFlag(2); } /* 8006BC50-8006BDBC .text checkArea__12dDoor_info_cFfff */ @@ -125,28 +236,101 @@ void dDoor_info_c::checkArea(f32, f32, f32) { } /* 8006BDBC-8006BE94 .text openInitCom__12dDoor_info_cFi */ -void dDoor_info_c::openInitCom(int) { +void dDoor_info_c::openInitCom(int ship) { /* Nonmatching */ + if (mFrontCheck == 0) { + mFromRoomNo = getFRoomNo(); + mToRoomNo = getBRoomNo(); + } else { + mFromRoomNo = getBRoomNo(); + mToRoomNo = getFRoomNo(); + } + + if (mFromRoomNo != mToRoomNo && mFromRoomNo != 0x3F && mToRoomNo != 0x3F) + dComIfGp_roomControl_offStatusFlag(mToRoomNo, 0x08); + + if (ship && getShipId() != 0x3F) + dStage_setShipPos(getShipId(), mToRoomNo); } /* 8006BE94-8006BF74 .text openProcCom__12dDoor_info_cFv */ void dDoor_info_c::openProcCom() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + s16 angle = shape_angle.y + 0x7FFF; + cXyz target; + cXyz playerPos = player->current.pos; + target = current.pos; + target.x += cM_ssin(angle) * -100.0f; + target.z += cM_scos(angle) * -100.0f; + playerPos.x = playerPos.x * 0.9f + target.x * 0.1f; + playerPos.z = playerPos.z * 0.9f + target.z * 0.1f; + player->setPlayerPosAndAngle(&playerPos, player->current.angle.y); } /* 8006BF74-8006C0A4 .text closeEndCom__12dDoor_info_cFv */ void dDoor_info_c::closeEndCom() { /* Nonmatching */ + if (mFromRoomNo != mToRoomNo && mFromRoomNo != 0x3F && mToRoomNo != 0x3F) + dComIfGp_roomControl_onStatusFlag(mFromRoomNo, 0x08); + + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz delta = player->current.pos - current.pos; + f32 rad; + f32 dot = delta.x * mAngleVec.x + delta.z * mAngleVec.z; + if (dot < 0.0f) + rad = 180.0f; + else + rad = -180.0f; + + cXyz pos(player->current.pos.x - rad * mAngleVec.x, player->current.pos.y, player->current.pos.z - rad * mAngleVec.z); + g_dComIfG_gameInfo.save.getRestart().setRoom(pos, + dot > 0.0f ? player->current.angle.y : (s16)(player->current.angle.y + 0x8000), + fopAcM_GetRoomNo(player)); } /* 8006C0A4-8006C0EC .text getDemoAction__12dDoor_info_cFv */ -void dDoor_info_c::getDemoAction() { - /* Nonmatching */ +s32 dDoor_info_c::getDemoAction() { + static char* action_table[] = { + "WAIT", + "STOP_OPEN", + "STOP_CLOSE", + "OPEN", + "CLOSE", + "SMOKE", + "SMOKE_END", + "SETGOAL", + "UNLOCK", + "SETSTART", + "SETANGLE", + "ADJUSTMENT", + "OPEN_PUSH", + "OPEN_PULL", + "OPEN_PUSH2", + "OPEN_PULL2", + "TALK", + "SETSTART_PUSH", + "SETSTART_PULL", + "END_CHECK", + "DROP_BF", + "DROP_AF", + }; + + return dComIfGp_evmng_getMyActIdx(mStaffId, action_table, ARRAY_SIZE(action_table), 0, 0); } /* 8006C0EC-8006C1D8 .text setGoal__12dDoor_info_cFv */ void dDoor_info_c::setGoal() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz playerPos = player->current.pos; + cXyz target = current.pos; + s16 angle = shape_angle.y + 0x7FFF; + playerPos.x += cM_ssin(angle) * 350.0f; + playerPos.z += cM_scos(angle) * 350.0f; + target.x += cM_ssin(angle) * 250.0f; + target.z += cM_scos(angle) * 250.0f; + playerPos.x = playerPos.x * 0.8f + target.x * 0.2f; + playerPos.z = playerPos.z * 0.8f + target.z * 0.2f; + dComIfGp_evmng_setGoal(&playerPos); } /* 8006C1D8-8006C200 .text setPlayerAngle__12dDoor_info_cFi */