diff --git a/include/SSystem/SComponent/c_xyz.h b/include/SSystem/SComponent/c_xyz.h index 02332ba7d..4ca69ae2f 100644 --- a/include/SSystem/SComponent/c_xyz.h +++ b/include/SSystem/SComponent/c_xyz.h @@ -138,6 +138,7 @@ struct cXyz : Vec { f32 getDotProduct(const Vec& other) const { return VECDotProduct(this, &other); } f32 inprod(const Vec& other) const { return getDotProduct(other); } + f32 inprodXZ(const Vec& other) const { return x * other.x + z * other.z; } // TODO // void inprodXZ(const Vec&) const {} diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index e94e1dd54..88d9124f7 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1076,6 +1076,10 @@ inline s16 dComIfGs_getStartPoint() { return g_dComIfG_gameInfo.save.getRestart().getStartPoint(); } +inline void dComIfGs_setRestartRoom(const cXyz& i_pos, s16 i_angle, s8 i_roomNo) { + g_dComIfG_gameInfo.save.getRestart().setRoom(i_pos, i_angle, i_roomNo); +} + inline void dComIfGs_setRestartRoomParam(u32 i_param) { g_dComIfG_gameInfo.save.getRestart().setRoomParam(i_param); } diff --git a/include/d/d_door.h b/include/d/d_door.h index 204ddfeef..c5a6bda67 100644 --- a/include/d/d_door.h +++ b/include/d/d_door.h @@ -9,7 +9,7 @@ class msg_class; class dDoor_info_c : public fopAc_ac_c { public: - void valShipId() {} + BOOL valShipId() { return getShipId() != 0x3F; } u8 getSwbit(); u8 getSwbit2(); diff --git a/src/d/d_door.cpp b/src/d/d_door.cpp index 02b71d368..97e0d248d 100644 --- a/src/d/d_door.cpp +++ b/src/d/d_door.cpp @@ -75,7 +75,7 @@ BOOL dDoor_info_c::adjoinPlayer() { /* 8006B4C4-8006B554 .text getViewRoomNo__12dDoor_info_cFv */ u8 dDoor_info_c::getViewRoomNo() { cXyz delta = dComIfGd_getView()->mLookat.mEye - current.pos; - if (delta.x * mAngleVec.x + delta.z * mAngleVec.z < 0.0f) + if (delta.inprodXZ(mAngleVec) < 0.0f) return getBRoomNo(); else return getFRoomNo(); @@ -83,11 +83,10 @@ u8 dDoor_info_c::getViewRoomNo() { /* 8006B554-8006B5E4 .text frontCheckOld__12dDoor_info_cFv */ 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); + angle1 = (globe.U() - current.angle.y); s16 angle = angle1.Abs(); if (angle < 0x4000 && angle >= 0) return 0; @@ -180,7 +179,6 @@ void dDoor_info_c::startDemoProc() { /* 8006BA30-8006BB5C .text makeEventId__12dDoor_info_cFi */ void dDoor_info_c::makeEventId(int spl) { - /* Nonmatching */ static const char* table[] = { "DEFAULT_STOP_OPEN", "DEFAULT_STOP_OPEN", @@ -242,7 +240,7 @@ BOOL dDoor_info_c::checkArea(f32 f1, f32 f2, f32 distXZSqMax) { return FALSE; delta.normalize(); - f32 dot = delta.x * mAngleVec.x + delta.z * mAngleVec.z; + f32 dot = delta.inprodXZ(mAngleVec); f32 d3 = distXZSq * dot * dot; if (d3 > f2) return FALSE; @@ -261,7 +259,6 @@ BOOL dDoor_info_c::checkArea(f32 f1, f32 f2, f32 distXZSqMax) { /* 8006BDBC-8006BE94 .text openInitCom__12dDoor_info_cFi */ void dDoor_info_c::openInitCom(int ship) { - /* Nonmatching */ if (mFrontCheck == 0) { mFromRoomNo = getFRoomNo(); mToRoomNo = getBRoomNo(); @@ -273,7 +270,7 @@ void dDoor_info_c::openInitCom(int ship) { if (mFromRoomNo != mToRoomNo && mFromRoomNo != 0x3F && mToRoomNo != 0x3F) dComIfGp_roomControl_offStatusFlag(mToRoomNo, 0x08); - if (ship && getShipId() != 0x3F) + if (ship && valShipId()) dStage_setShipPos(getShipId(), mToRoomNo); } @@ -293,23 +290,23 @@ void dDoor_info_c::openProcCom() { /* 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; + f32 dot = delta.inprodXZ(mAngleVec); + f32 rad = dot < 0.0f ? 180.0f : -180.0f; cXyz pos(current.pos.x - rad * mAngleVec.x, current.pos.y, current.pos.z - rad * mAngleVec.z); - g_dComIfG_gameInfo.save.getRestart().setRoom(pos, - dot > 0.0f ? current.angle.y : (s16)(current.angle.y + 0x8000), - fopAcM_GetRoomNo(player)); + s8 roomNo = fopAcM_GetRoomNo(player); + s16 angle; + if (dot > 0.0f) { + angle = current.angle.y; + } else { + angle = current.angle.y + 0x8000; + } + dComIfGs_setRestartRoom(pos, angle, roomNo); } /* 8006C0A4-8006C0EC .text getDemoAction__12dDoor_info_cFv */ @@ -384,10 +381,9 @@ void dDoor_info_c::setPosAndAngle(cXyz* pPos, s16 angle) { /* 8006C2BC-8006C388 .text smokeInit__13dDoor_smoke_cFP12dDoor_info_c */ void dDoor_smoke_c::smokeInit(dDoor_info_c* door) { - /* Nonmatching */ mPos = door->current.pos; mRot.y = door->shape_angle.y; - JPABaseEmitter* emtr = dComIfGp_particle_set(0x2022, &mPos, &mRot, NULL, 0xAA, &mSmokeCb, door->current.roomNo); + JPABaseEmitter* emtr = dComIfGp_particle_set(0x2022, &mPos, &mRot, NULL, 0xAA, &mSmokeCb, fopAcM_GetRoomNo(door)); m34 = 0; m35 = 0; if (emtr != NULL) { @@ -404,10 +400,8 @@ void dDoor_smoke_c::smokeInit(dDoor_info_c* door) { /* 8006C388-8006C41C .text smokeProc__13dDoor_smoke_cFP12dDoor_info_c */ void dDoor_smoke_c::smokeProc(dDoor_info_c* door) { - /* Nonmatching */ if (m35 != 0) { - f32 sign = (m34 & 1) ? 1.0f : -1.0f; - f32 wave = (m34 * 20) * sign; + f32 wave = (m34 * 20) * ((m34 & 1) ? 1.0f : -1.0f); m34++; mPos.x += wave * door->mAngleVec.z; mPos.z += wave * door->mAngleVec.x; @@ -433,9 +427,8 @@ void dDoor_key2_c::keyResDelete() { /* 8006C4A8-8006C5E8 .text keyInit__12dDoor_key2_cFP12dDoor_info_c */ void dDoor_key2_c::keyInit(dDoor_info_c* door) { - /* Nonmatching */ if (mpModel != NULL && mbEnabled && !door->mFrontCheck) { - if (door->getSwbit() < 0x80) + if ((int)door->getSwbit() < 0x80) dComIfGs_onSwitch(door->getSwbit(), -1); if (!mbIsBossDoor) dComIfGp_setItemKeyNumCount(-1); @@ -509,7 +502,6 @@ BOOL dDoor_key2_c::keyCreate_Bkey() { /* 8006C910-8006C948 .text keyCreate__12dDoor_key2_cFi */ BOOL dDoor_key2_c::keyCreate(int type) { - /* Nonmatching */ mbIsBossDoor = type; switch (type) { case 1: return keyCreate_Bkey(); @@ -836,7 +828,6 @@ BOOL dDoor_hkyo_c::chkFirst() { /* 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;