From c59fe14362b65bf3df8b6bc7f41f73dc0719ee89 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 02:44:18 -0500 Subject: [PATCH] some Progress --- include/d/a/obj/d_a_obj_base.h | 5 + include/d/a/obj/d_a_obj_door.h | 50 +++++-- src/REL/d/a/obj/d_a_obj_door.cpp | 222 +++++++++++++++++++++++++++++-- 3 files changed, 255 insertions(+), 22 deletions(-) diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 3deba1ae..039def40 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -181,6 +181,11 @@ public: const char *name, u32 roomId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, const mVec3_c *scale, u32 params2, u16 id, s8 viewclipId ); + static dAcObjBase_c *create( + dAcObjBase_c *, fProfile::PROFILE_NAME_e actorId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, + const mVec3_c *scale, u32 params2, u32 roomId + ); + static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiNdBa_c *refList, dAcObjBase_c *parent); static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent); bool isPlayer(); diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index d3da304f..1c3eebca 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -2,26 +2,37 @@ #define D_A_OBJ_DOOR_H #include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_door_base.h" #include "m/m3d/m_anmmdl.h" #include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" #include "m/m_vec.h" #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/d_flow_mgr.h" +struct dTimeBits { + dTimeBits() : field_0x00(false), field_0x01(false) {} + bool field_0x00; + bool field_0x01; +}; + +class dAcOLock_c; + class dAcOdoor_c : public dAcObjDoor_c { public: enum Subtype_e { - SUBTYPE_0, - SUBTYPE_1, - SUBTYPE_2, - SUBTYPE_3, - SUBTYPE_4, - SUBTYPE_5, - SUBTYPE_6, - SUBTYPE_7, - SUBTYPE_8, + SUBTYPE_0, ///< DoorA00 + SUBTYPE_1, ///< DoorA01 + SUBTYPE_2, ///< DoorC00 + SUBTYPE_3, ///< DoorC01 + SUBTYPE_4, ///< DoorB00 + SUBTYPE_5, ///< DoorE + SUBTYPE_6, ///< DoorA02 + SUBTYPE_7, ///< DoorF + SUBTYPE_8, ///< DoorH }; public: @@ -98,10 +109,10 @@ public: static void openCallbackCommon(dAcOdoor_c *); /** */ - bool isKeyLocked(); // getFromParams(6, 0x1) + s32 getKeyParameter(); // getFromParams(6, 0x1) /** */ - u8 getSubtype2(); // (mRotation.x >> 0) & 0xFF + s32 getSubtype2(); // (mRotation.x >> 0) & 0xFF /** */ u8 getSceneflag(); // (mRotation.x >> 8) & 0xFF @@ -238,6 +249,11 @@ public: /** */ void playInteractionLocked() const; +public: + // defined in main dol + bool isConnectedToOtherDoor() const; + dAcRef_c &getConnectedDoorRef(); // return mConnectedDoor; + private: /* 0x33C */ m3d::smdl_c mMdl0; /* 0x358 */ m3d::smdl_c mMdl1; @@ -246,6 +262,18 @@ private: /* 0x42C */ dFlowMgr_c mFlowMgr; /* 0x4E8 */ dEmitter_c mEmmiter0; /* 0x51C */ dEmitter_c mEmmiter1; + /* 0x550 */ dTimeBits mTimeBits; + /* 0x554 */ dAcRef_c mConnectedDoor; + /* 0x560 */ dAcRef_c mLock; + /* 0x56C */ dAcRef_c mObjRef; + /* 0x578 */ mMtx_c mMtx; + /* 0x5A8 */ u8 _0x584[0x5B1 - 0x5A8]; + /* 0x5B1 */ u8 field_0x5B1; ///< + /* 0x5B2 */ u8 mSceneflag; ///< Used for unlocking the door + /* 0x5B3 */ u8 _0x5B3[0x5B7 - 0x5B3]; + /* 0x5B7 */ bool field_0x5B7; + /* 0x5B8 */ u8 _0x5B8[0x5BB - 0x5B8]; + /* 0x5BB */ bool field_0x5BB; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_door.cpp b/src/REL/d/a/obj/d_a_obj_door.cpp index a19abfe3..1dfaee77 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -1,10 +1,23 @@ #include "d/a/obj/d_a_obj_door.h" #include "common.h" +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_lock.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_m3d_g_aab.h" #include "d/d_room.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "egg/math/eggMath.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "sized_string.h" @@ -14,6 +27,10 @@ SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); namespace { +static mVec3_c sVecs[] = { + mVec3_c(70.f, 0.f, 0.f), mVec3_c(52.f, 110.f, 0.f), mVec3_c(0.f, 0.f, 70.f), mVec3_c(0.f, 0.f, -70.f) +}; + const char *const DoorAnim = "DoorAnim"; const char *const DoorAnimPull = "DoorAnimPull"; const char *const DoorAnimPush = "DoorAnimPush"; @@ -75,7 +92,7 @@ static u8 sDoorUnknown[2] = {0, 1}; bool getDoorUnknown(u8 search, u8 &idx) { bool found = false; int i = 0; - while (!found && i < ARRAY_LENGTH(sDoorUnknown)) { + while (!found && i <= (int)ARRAY_LENGTH(sDoorUnknown) - 1) { if (sDoorUnknown[i] == search) { found = true; } else { @@ -90,12 +107,12 @@ bool getDoorUnknown(u8 search, u8 &idx) { return found; } -static u32 sSpecialDoorMapTypes[5] = { +static s32 sSpecialDoorMapTypes[5] = { sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, sDoorMappings[5].mType, sDoorMappings[6].mType, }; -bool isDoorSpecial(u32 type) { +bool isDoorSpecial(s32 type) { bool found = false; int i = 0; while (!found && i <= (int)ARRAY_LENGTH(sSpecialDoorMapTypes) - 1) { @@ -167,7 +184,7 @@ const char *const DoorE_N = "DoorE_N"; bool dAcOdoor_c::createHeap() { s32 type = getFromParams(0, 0x3F); - if (type == 7) { + if (type == SUBTYPE_7) { nw4r::g3d::ResFile resFile(getOarcResFile(DoorF)); if (!resFile.IsValid()) { return false; @@ -224,10 +241,12 @@ bool dAcOdoor_c::createHeap() { } int dAcOdoor_c::actorCreate() { - mSubtype = getFromParams(0, 0x3F); + // NONMATCHING - Regalloc issues + s32 subtype = getFromParams(0, 0x3F); + mSubtype = subtype; changeLoadedEntitiesWithSet(); - if (mSubtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { + if (subtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { fn_572_4110(); } else { fn_572_4120(); @@ -235,12 +254,193 @@ int dAcOdoor_c::actorCreate() { CREATE_ALLOCATOR(dAcOdoor_c); - // if () + mSceneflag = getSceneflag(); + + if (getKeyParameter() == true) { + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + mLock.link( + static_cast( + create(this, fProfile::OBJ_SHUTTER_LOCK, 0, nullptr, nullptr, nullptr, 0, 0x3F) + ) + ); + } + } else { + u8 type = getSubtype2(); + if (type <= 6) { + field_0x5B1 = type; + } else { + field_0x5B1 = 0; + } + } + + u8 idx; + if (!getDoorUnknown(fn_572_3F60(), idx)) { + idx = 0; + } + + fn_572_4060(idx); + fn_572_4070(fn_572_3F70()); + fn_572_4080(fn_572_3F80()); + + mRotation.z = mAng(0); + mRotation.x = mAng(0); + { + s32 roomId = mRoomID; + addActorToRoom(-1); + setRoomId(roomId); + } + + if (isDoorSpecial(subtype)) { + fn_572_4090(); + } else { + fn_572_40A0(); + } + + if ((s32)getFromParams(0, 0x3F) == SUBTYPE_7) { + mAnmChr.setAnm(DoorF_Open, m3d::PLAY_MODE_4, 0.f); + mAnmChr.setFrame(mAnmChr.getAnm().getStartFrame()); + mAnmChr.getModel().setPriorityDraw(0x1C, 0); + } else { + mAnmChr.setAnm(DoorAnimPull, m3d::PLAY_MODE_4, 0.f); + mAnmChr.setFrame(mAnmChr.getAnm().getStartFrame()); + if (fn_572_4430()) { + mMdl0.setPriorityDraw(0xF, 0); + mMdl1.setPriorityDraw(0xB, 0); + } else { + mMdl0.setPriorityDraw(0x1C, 0); + } + } + + bool inAcademy = dScGame_c::isCurrentStage("F001r"); + if (inAcademy) { + inAcademy = mVec3_c(1832.5f, 0.f, -1978.0f).squareDistanceToXZ(mPosition) < 100.f; + } + field_0x5BB = inAcademy; + + return SUCCEEDED; } -int dAcOdoor_c::actorPostCreate() {} +extern "C" void fn_80067290(dTimeBits *pBits, s32 roomId, const mVec3_c &pos, f32); -int dAcOdoor_c::doDelete() {} +int dAcOdoor_c::actorPostCreate() { + if (field_0x5B7) { + if (true) { + bool foundPair = false; + dAcOdoor_c *pDoor = + static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, nullptr)); + while (!foundPair && pDoor != nullptr) { + if (mID != pDoor->mID && pDoor->field_0x5B7 && !pDoor->isConnectedToOtherDoor() && + mPosition.squareDistance(pDoor->mPosition) < 40000.f) { + foundPair = true; + this->getConnectedDoorRef().link(pDoor); + pDoor->getConnectedDoorRef().link(this); + if (getKeyParameter() == true) { + this->fn_572_40B0(); + pDoor->fn_572_40C0(); + } else { + this->fn_572_40C0(); + pDoor->fn_572_40B0(); + } + } + pDoor = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, pDoor)); + } + + if (!foundPair) { + fn_572_40B0(); + } + } + } else { + fn_572_40B0(); + } + + bool gndChk = dBgS_ObjGndChk::CheckPos(mPosition + mVec3_c::Ey * 10.f); + if (gndChk) { + mLightingInfo.mLightingCode = dBgS_ObjGndChk::GetLightingCode(); + setPolyAttrs(dBgS_ObjGndChk::GetInstance()); + } + + if (isInOuterSandship()) { + fn_572_40D0(); + unsetActorProperty(AC_PROP_0x1); + + if (gndChk) { + dBgS *pBgS = dBgS::GetInstance(); + if (pBgS != nullptr) { + const dAcObjBase_c *pObj = pBgS->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + if (pObj) { + mObjRef.link(const_cast(pObj)); + mVec3_c v(mPosition - pObj->mPosition); + v.y = dBgS_ObjGndChk::GetGroundHeight() - pObj->mPosition.y; + + v.rotY(-pObj->mRotation.y); + + mAng rotY = mRotation.y - pObj->mRotation.y; + mMtx.transS(v); + mMtx.YrotM(rotY); + } + } + } + } + + if (!mObjRef.isLinked()) { + s32 type = getFromParams(0, 0x3F); + updateMatrix(); + mAnmChr.getModel().setLocalMtx(mWorldMtx); + mAnmChr.getModel().calc(false); + + if (type != SUBTYPE_7) { + mMtx_c m; + mAnmChr.getModel().getNodeWorldMtx(1, m); + m.transM(sVecs[0]); + mMdl0.setLocalMtx(m); + if (fn_572_4430()) { + mMdl1.setLocalMtx(m); + } + } + + dAcOLock_c *pLock = mLock.get(); + if (pLock == nullptr) { + fn_572_4440(); + } else { + mPositionCopy2.set(pLock->mPosition); + mPositionCopy3.set(pLock->mPosition); + } + mVec3_c max(999999.f, 999999.f, 999999.f); + mVec3_c min(-999999.f, -999999.f, -999999.f); + + if (type == SUBTYPE_7) { + mAnmChr.getModel().getBounds(&min, &max); + } else { + mMtx_c local; + mMdl0.getBounds(&min, &max); + mMdl0.getLocalMtx(local); + + mMtx_c world = mWorldMtx; + world.inverse(); + + mVec3_c minPos = min; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); + + // ... + + mBoundingBox.Set(min, max); + } + } + + if (fn_572_4430()) { + fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); + } + + mCullingDistance = EGG::Math::maxNumber(); + + return SUCCEEDED; +} + +int dAcOdoor_c::doDelete() { + changeLoadedEntitiesNoSet(); + return SUCCEEDED; +} int dAcOdoor_c::actorExecuteInEvent() {} @@ -317,10 +517,10 @@ void dAcOdoor_c::unkVirtFunc_0x6C() {} void dAcOdoor_c::doInteraction(s32 interaction) {} /** */ -bool dAcOdoor_c::isKeyLocked() {} // getFromParams(6, 0x1) +s32 dAcOdoor_c::getKeyParameter() {} // getFromParams(6, 0x1) /** */ -u8 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF +s32 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF /** */ u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF