From 4c1290dad7821fda93a215d20c79cdb0c11ad55a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 00:13:28 -0500 Subject: functions declared and empty definitions --- src/REL/d/a/obj/d_a_obj_door.cpp | 455 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 455 insertions(+) (limited to 'src') 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 3f172d1f..a19abfe3 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -1,3 +1,458 @@ #include "d/a/obj/d_a_obj_door.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/d_room.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "sized_string.h" +#include "toBeSorted/event_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); + +namespace { + +const char *const DoorAnim = "DoorAnim"; +const char *const DoorAnimPull = "DoorAnimPull"; +const char *const DoorAnimPush = "DoorAnimPush"; + +struct DoorFileMapping { + const u32 mType; + const char *mResName; + const char *mMdlName; +}; +DoorFileMapping sDoorMappings[8] = { + {0, "DoorA00", "DoorA00"}, + {1, "DoorA01", "DoorA01"}, + {6, "DoorA02", "DoorA02"}, + {4, "DoorB00", "DoorB00"}, + {2, "DoorC00", "DoorC00"}, + {3, "DoorC01", "DoorC01"}, + {5, "DoorE", "DoorE_T"}, + {8, "DoorH", "DoorH"}, +}; + +bool getDoorMapping(u32 type, const DoorFileMapping *&filemap) { + bool found = false; + int i = 0; + while (!found && i <= (int)ARRAY_LENGTH(sDoorMappings) - 1) { + if (sDoorMappings[i].mType == type) { + found = true; + } else { + i++; + } + } + + if (found) { + filemap = &sDoorMappings[i]; + } + + return found; +} + +bool getDoorResName(u32 type, const char *&name) { + const DoorFileMapping *filemap = nullptr; + bool found = getDoorMapping(type, filemap); + if (found) { + name = filemap->mResName; + } + return found; +} + +bool getDoorMdlName(u32 type, const char *&name) { + const DoorFileMapping *filemap = nullptr; + bool found = getDoorMapping(type, filemap); + if (found) { + name = filemap->mMdlName; + } + return found; +} + +static u8 sDoorUnknown[2] = {0, 1}; + +bool getDoorUnknown(u8 search, u8 &idx) { + bool found = false; + int i = 0; + while (!found && i < ARRAY_LENGTH(sDoorUnknown)) { + if (sDoorUnknown[i] == search) { + found = true; + } else { + i++; + } + } + + if (found) { + idx = i; + } + + return found; +} + +static u32 sSpecialDoorMapTypes[5] = { + sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, + sDoorMappings[5].mType, sDoorMappings[6].mType, +}; + +bool isDoorSpecial(u32 type) { + bool found = false; + int i = 0; + while (!found && i <= (int)ARRAY_LENGTH(sSpecialDoorMapTypes) - 1) { + if (sSpecialDoorMapTypes[i] == type) { + found = true; + } else { + i++; + } + } + + return found; +} + +const char *getDoorInteractionName() { + return "DoorTalk"; +} + +const char *const sSandShipOuterStages[2] = {"B301", "D301_1"}; +bool isInOuterSandship() { + bool found = true; + int i = 0; + while (found && i <= (int)ARRAY_LENGTH(sSandShipOuterStages) - 1) { + if (dScGame_c::isCurrentStage(sSandShipOuterStages[i])) { + found = false; + } else { + i++; + } + } + + return !found; +} + +bool isInEvent(const char *eventName) { + return strequals(EventManager::getCurrentEventName(), eventName); +} + +const char *const sTimeDoorEventNames[2] = { + "TimeDoorIn", + "TimeDoorOut", +}; + +bool isInTimeDoorEvent() { + int i = 0; + bool found = true; + while (found && i <= (int)ARRAY_LENGTH(sTimeDoorEventNames) - 1) { + if (isInEvent(sTimeDoorEventNames[i])) { + found = false; + } else { + i++; + } + } + return !found; +} + +bool checkRoom(u8 roomID, bool &b) { + dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(roomID); + if (pRoom == nullptr) { + return false; + } + + b = pRoom->checkFlag(0x1E) != 0; + return true; +} + +} // namespace +const char *const DoorF = "DoorF"; +const char *const DoorF_Open = "DoorF_Open"; +const char *const DoorE_N = "DoorE_N"; + +bool dAcOdoor_c::createHeap() { + s32 type = getFromParams(0, 0x3F); + if (type == 7) { + nw4r::g3d::ResFile resFile(getOarcResFile(DoorF)); + if (!resFile.IsValid()) { + return false; + } + mAnmChr.create(resFile.ptr(), DoorF, DoorF_Open, &mAllocator, 0x120); + } else { + nw4r::g3d::ResFile resFileAnim(getOarcResFile(DoorAnim)); + if (!resFileAnim.IsValid()) { + return false; + } + if (!mAnmChr.create(resFileAnim.ptr(), DoorAnim, DoorAnimPull, &mAllocator, 0)) { + return false; + } + + const char *resFileName = nullptr; + getDoorResName(type, resFileName); + if (resFileName == nullptr) { + return false; + } + + nw4r::g3d::ResFile resFileMdl(getOarcResFile(resFileName)); + if (!resFileMdl.IsValid()) { + return false; + } + + const char *resMdlName = nullptr; + getDoorMdlName(type, resMdlName); + if (resMdlName == nullptr) { + return false; + } + + nw4r::g3d::ResMdl resMdl = resFileMdl.GetResMdl(resMdlName); + if (!resMdl.IsValid()) { + return false; + } + + if (!mMdl0.create(resMdl, &mAllocator, 0x120, 1, nullptr)) { + return false; + } + + if (fn_572_4430()) { + nw4r::g3d::ResMdl resMdl = resFileMdl.GetResMdl(DoorE_N); + if (!resMdl.IsValid()) { + return false; + } + + if (!mMdl1.create(resMdl, &mAllocator, 0x120, 1, nullptr)) { + return false; + } + } + } + + return true; +} + +int dAcOdoor_c::actorCreate() { + mSubtype = getFromParams(0, 0x3F); + changeLoadedEntitiesWithSet(); + + if (mSubtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { + fn_572_4110(); + } else { + fn_572_4120(); + } + + CREATE_ALLOCATOR(dAcOdoor_c); + + // if () +} + +int dAcOdoor_c::actorPostCreate() {} + +int dAcOdoor_c::doDelete() {} + +int dAcOdoor_c::actorExecuteInEvent() {} + +int dAcOdoor_c::actorExecute() {} + +int dAcOdoor_c::draw() {} + +bool dAcOdoor_c::isLocked() {} + +bool dAcOdoor_c::canOpen() {} + +/** fn_572_33E0 - I Think this gets the Door open range*/ +f32 dAcOdoor_c::fn_572_33E0() {} // -80.f + +/** */ +void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) {} + +/** */ +void dAcOdoor_c::startPullEventWithCallback(void *zevData) {} + +/** */ +void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) {} + +/** */ +void dAcOdoor_c::startPushEventWithCallback(void *zevData) {} + +/** */ +void dAcOdoor_c::startPullEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::startPushEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::startOpenEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::doorPullEventCallback(dAcOdoor_c *) {} + +/** */ +void dAcOdoor_c::doorPushEventCallback(dAcOdoor_c *) {} + +/** */ +void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::startLockedEvent(void *zevData) {} + +/** */ +void dAcOdoor_c::pullLockedEventCallback(dAcOdoor_c *) {} + +/** */ +void dAcOdoor_c::pushLockedEventCallback(dAcOdoor_c *) {} + +/** */ +void dAcOdoor_c::startUnlockEvent() {} + +/** */ +void dAcOdoor_c::unlockEventCallback(dAcOdoor_c *) {} + +/** */ +void dAcOdoor_c::openCallbackCommon(dAcOdoor_c *) {} + +void dAcOdoor_c::registerInEvent() { + if (isInTimeDoorEvent()) { + fn_572_40F0(); + } +} + +void dAcOdoor_c::unkVirtFunc_0x6C() {} + +void dAcOdoor_c::doInteraction(s32 interaction) {} + +/** */ +bool dAcOdoor_c::isKeyLocked() {} // getFromParams(6, 0x1) + +/** */ +u8 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF + +/** */ +u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF + +/** fn_572_3F60 */ +u8 dAcOdoor_c::fn_572_3F60() {} // (mRotation.z >> 0) & 0xF + +/** fn_572_3F70 */ +u8 dAcOdoor_c::fn_572_3F70() {} // (mRotation.z >> 4) & 0x3F + +/** fn_572_3F80 */ +u8 dAcOdoor_c::fn_572_3F80() {} // (mRotation.z >> 10) & 0x3F + +/** fn_572_3F90 */ +u8 dAcOdoor_c::fn_572_3F90() {} // (getParams2Lower() >> 0) & 0xFF + +/** fn_572_3FC0 */ +f32 dAcOdoor_c::getInteractionMinX() {} // -80.f + +/** fn_572_3FD0 */ +f32 dAcOdoor_c::getInteractionMaxX() {} // 80.f + +/** fn_572_3FE0 */ +f32 dAcOdoor_c::getInteractionMinZ() {} // -100.f + +/** fn_572_3FF0 */ +f32 dAcOdoor_c::getInteractionMaxZ() {} // 100.f + +/** fn_572_4000 */ +f32 dAcOdoor_c::getInteractionLockMinX() {} // -160.f + +/** fn_572_4010 */ +f32 dAcOdoor_c::getInteractionLockMaxX() {} // 160.f + +/** fn_572_4020 */ +f32 dAcOdoor_c::getInteractionLockMinZ() {} // -100.f + +/** fn_572_4030 */ +f32 dAcOdoor_c::getInteractionLockMaxZ() {} // 100.f + +/** */ +void dAcOdoor_c::setRoomId(s8 roomId) {} // mRoomId = roomId; + +/** fn_572_4050 */ +void dAcOdoor_c::fn_572_4050(u32 flags) {} // field_0x5A8 = flags + +/** fn_572_4060 */ +void dAcOdoor_c::fn_572_4060(u8) {} // field_0x5B3 = in + +/** fn_572_4070 */ +void dAcOdoor_c::fn_572_4070(s8) {} // field_0x5B4 = in + +/** fn_572_4080 */ +void dAcOdoor_c::fn_572_4080(s8) {} // field_0x5B5 = in + +/** fn_572_4090 */ +void dAcOdoor_c::fn_572_4090() {} // field_0x5B7 = true + +/** fn_572_40A0 */ +void dAcOdoor_c::fn_572_40A0() {} // field_0x5B7 = false + +/** fn_572_40B0 */ +void dAcOdoor_c::fn_572_40B0() {} // field_0x5B8 = true + +/** fn_572_40C0 */ +void dAcOdoor_c::fn_572_40C0() {} // field_0x5B8 = false + +/** fn_572_40D0 */ +void dAcOdoor_c::fn_572_40D0() {} // field_0x5B9 = true + +/** fn_572_40E0 */ +bool dAcOdoor_c::fn_572_40E0() const {} // field_0x5A8 & 1 + +/** fn_572_40F0 */ +void dAcOdoor_c::fn_572_40F0() {} // field_0x5A8 |= 1 (Time Door) + +/** fn_572_4100 */ +void dAcOdoor_c::fn_572_4100() {} // field_0x5A8 &= ~1 + +/** fn_572_4110 */ +void dAcOdoor_c::fn_572_4110() {} // field_0x5A8 |= 2 + +/** fn_572_4120 */ +void dAcOdoor_c::fn_572_4120() {} // field_0x5A8 &= ~2 + +/** fn_572_4130 */ +bool dAcOdoor_c::fn_572_4130(bool &b) const {} // checkRoom(field_0x5B4,b) + +/** fn_572_4140 */ +bool dAcOdoor_c::fn_572_4140(bool &b) const {} // checkRoom(field_0x5B5,b) + +/** fn_572_4150 */ +bool dAcOdoor_c::fn_572_4150(bool &b) const {} // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 + +/** */ +void dAcOdoor_c::triggerExit() {} + +/** */ +bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const {} + +/** fn_572_4310 */ +void dAcOdoor_c::transitionPushRoomFlags() const {} + +/** fn_572_4320 */ +void dAcOdoor_c::fn_572_4320() const {} // nop + +/** fn_572_4430 */ +bool dAcOdoor_c::transitionPullRoomFlags() const {} + +/** fn_572_4340 */ +void dAcOdoor_c::fn_572_4340() const {} // nop + +/** fn_572_4370 */ +bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const {} // Is in front of door + +/** */ +bool dAcOdoor_c::isPlayerInFrontOfDoor() const {} + +/** */ +bool dAcOdoor_c::hasFlowEntryPoint() const {} // getFromParams(16, 0xFFFF) + +/** fn_572_4430 */ +bool dAcOdoor_c::fn_572_4430() const {} // field_0x5A8 & 2 + +/** fn_572_4440 */ +void dAcOdoor_c::fn_572_4440() {} // Sets the Postion Copies + +/** */ +bool dAcOdoor_c::isPlayerInteractable() const {} + +/** fn_572_4600 */ +bool dAcOdoor_c::isPlayerInteractableLocked() const {} + +/** */ +void dAcOdoor_c::playInteractionLocked() const {} -- cgit v1.2.3 From c59fe14362b65bf3df8b6bc7f41f73dc0719ee89 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 02:44:18 -0500 Subject: some Progress --- src/REL/d/a/obj/d_a_obj_door.cpp | 222 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 211 insertions(+), 11 deletions(-) (limited to 'src') 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::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)); + } -int dAcOdoor_c::doDelete() {} + 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 -- cgit v1.2.3 From 6052e667c632b4b22deffa42130a7022c35c9507 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 25 Nov 2025 00:37:28 -0500 Subject: updateInEvent --- src/REL/d/a/obj/d_a_obj_door.cpp | 673 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 647 insertions(+), 26 deletions(-) (limited to 'src') 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 1dfaee77..d1cceaa1 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -1,16 +1,21 @@ #include "d/a/obj/d_a_obj_door.h" +#include "c/c_lib.h" #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_fence.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_rumble.h" #include "d/d_sc_game.h" #include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_wzsound.h" #include "egg/math/eggMath.h" #include "f/f_base.h" #include "f/f_manager.h" @@ -20,7 +25,10 @@ #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/math/math_arithmetic.h" +#include "s/s_Math.h" #include "sized_string.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); @@ -51,6 +59,14 @@ DoorFileMapping sDoorMappings[8] = { {8, "DoorH", "DoorH"}, }; +const char *const DoorF = "DoorF"; +const char *const DoorF_Open = "DoorF_Open"; +const char *const DoorF_Close = "DoorF_Close"; +const char *const DoorPull = "DoorPull"; +const char *const DoorPush = "DoorPush"; +const char *const DoorPullLock = "DoorPullLock"; +const char *const DoorPushLock = "DoorPushLock"; + bool getDoorMapping(u32 type, const DoorFileMapping *&filemap) { bool found = false; int i = 0; @@ -87,8 +103,7 @@ bool getDoorMdlName(u32 type, const char *&name) { return found; } -static u8 sDoorUnknown[2] = {0, 1}; - +static const u8 sDoorUnknown[2] = {0, 1}; bool getDoorUnknown(u8 search, u8 &idx) { bool found = false; int i = 0; @@ -167,7 +182,7 @@ bool isInTimeDoorEvent() { return !found; } -bool checkRoom(u8 roomID, bool &b) { +bool checkRoom(s8 roomID, bool &b) { dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(roomID); if (pRoom == nullptr) { return false; @@ -178,8 +193,6 @@ bool checkRoom(u8 roomID, bool &b) { } } // namespace -const char *const DoorF = "DoorF"; -const char *const DoorF_Open = "DoorF_Open"; const char *const DoorE_N = "DoorE_N"; bool dAcOdoor_c::createHeap() { @@ -226,7 +239,7 @@ bool dAcOdoor_c::createHeap() { } if (fn_572_4430()) { - nw4r::g3d::ResMdl resMdl = resFileMdl.GetResMdl(DoorE_N); + nw4r::g3d::ResMdl resMdl = resFileMdl.GetResMdl("DoorE_N"); if (!resMdl.IsValid()) { return false; } @@ -242,8 +255,8 @@ bool dAcOdoor_c::createHeap() { int dAcOdoor_c::actorCreate() { // NONMATCHING - Regalloc issues - s32 subtype = getFromParams(0, 0x3F); - mSubtype = subtype; + s32 subtype = getType(); + mSubtype = getType(); changeLoadedEntitiesWithSet(); if (subtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { @@ -296,7 +309,7 @@ int dAcOdoor_c::actorCreate() { fn_572_40A0(); } - if ((s32)getFromParams(0, 0x3F) == SUBTYPE_7) { + if (getType() == SUBTYPE_7) { mAnmChr.setAnm(DoorF_Open, m3d::PLAY_MODE_4, 0.f); mAnmChr.setFrame(mAnmChr.getAnm().getStartFrame()); mAnmChr.getModel().setPriorityDraw(0x1C, 0); @@ -324,7 +337,7 @@ extern "C" void fn_80067290(dTimeBits *pBits, s32 roomId, const mVec3_c &pos, f3 int dAcOdoor_c::actorPostCreate() { if (field_0x5B7) { - if (true) { + if (!isConnectedToOtherDoor()) { bool foundPair = false; dAcOdoor_c *pDoor = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, nullptr)); @@ -353,10 +366,14 @@ int dAcOdoor_c::actorPostCreate() { fn_572_40B0(); } - bool gndChk = dBgS_ObjGndChk::CheckPos(mPosition + mVec3_c::Ey * 10.f); + mVec3_c pos = mPosition + mVec3_c::Ey * 10.f; + bool gndChk = dBgS_ObjGndChk::CheckPos(pos); + dBgS_ObjGndChk *objGndCheck = dBgS_ObjGndChk::GetPInstance(); if (gndChk) { mLightingInfo.mLightingCode = dBgS_ObjGndChk::GetLightingCode(); - setPolyAttrs(dBgS_ObjGndChk::GetInstance()); + if (objGndCheck != nullptr) { + setPolyAttrs(*objGndCheck); + } } if (isInOuterSandship()) { @@ -365,12 +382,12 @@ int dAcOdoor_c::actorPostCreate() { if (gndChk) { dBgS *pBgS = dBgS::GetInstance(); - if (pBgS != nullptr) { - const dAcObjBase_c *pObj = pBgS->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + if (pBgS != nullptr && objGndCheck != nullptr) { + const dAcObjBase_c *pObj = pBgS->GetActorPointer(*objGndCheck); if (pObj) { mObjRef.link(const_cast(pObj)); - mVec3_c v(mPosition - pObj->mPosition); - v.y = dBgS_ObjGndChk::GetGroundHeight() - pObj->mPosition.y; + mVec3_c v(mPosition.x, dBgS_ObjGndChk::GetGroundHeight(), mPosition.z); + v -= pObj->mPosition; v.rotY(-pObj->mRotation.y); @@ -383,7 +400,7 @@ int dAcOdoor_c::actorPostCreate() { } if (!mObjRef.isLinked()) { - s32 type = getFromParams(0, 0x3F); + s32 type = getType(); updateMatrix(); mAnmChr.getModel().setLocalMtx(mWorldMtx); mAnmChr.getModel().calc(false); @@ -405,27 +422,79 @@ int dAcOdoor_c::actorPostCreate() { 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); + + mVec3_c min, max; + min.set(999999.f, 999999.f, 999999.f); + max.set(-999999.f, -999999.f, -999999.f); if (type == SUBTYPE_7) { mAnmChr.getModel().getBounds(&min, &max); } else { + mVec3_c min_l, max_l; mMtx_c local; - mMdl0.getBounds(&min, &max); + mMdl0.getBounds(&min_l, &max_l); mMdl0.getLocalMtx(local); mMtx_c world = mWorldMtx; world.inverse(); - mVec3_c minPos = min; + mVec3_c minPos = min_l; local.multVec(minPos, minPos); world.multVec(minPos, minPos); - // ... - - mBoundingBox.Set(min, max); + // clang-format off + min.set( + nw4r::ut::Min(minPos.x, min.x), + nw4r::ut::Min(minPos.y, min.y), + nw4r::ut::Min(minPos.z, min.z) + ); + max.set( + nw4r::ut::Max(minPos.x, max.x), + nw4r::ut::Max(minPos.y, max.y), + nw4r::ut::Max(minPos.z, max.z) + ); + // clang-format on + + mVec3_c maxPos = max_l; + local.multVec(maxPos, maxPos); + world.multVec(maxPos, maxPos); + // clang-format off + min.set( + nw4r::ut::Min(maxPos.x, min.x), + nw4r::ut::Min(maxPos.y, min.y), + nw4r::ut::Min(maxPos.z, min.z) + ); + max.set( + nw4r::ut::Max(maxPos.x, max.x), + nw4r::ut::Max(maxPos.y, max.y), + nw4r::ut::Max(maxPos.z, max.z) + ); + // clang-format on + + mVec3_c vecs[6] = { + mVec3_c(min_l.x, min_l.y, max_l.z), mVec3_c(min_l.x, max_l.y, min_l.z), + mVec3_c(min_l.x, max_l.y, max_l.z), mVec3_c(max_l.x, min_l.y, min_l.z), + mVec3_c(max_l.x, min_l.y, max_l.z), mVec3_c(max_l.x, max_l.y, min_l.z), + }; + + for (int i = 0, j = 0; i < (int)ARRAY_LENGTH(vecs); i++, j++) { + local.multVec(vecs[i], vecs[j]); + world.multVec(vecs[i], vecs[j]); + // clang-format off + min.set( + nw4r::ut::Min(vecs[j].x, min.x), + nw4r::ut::Min(vecs[j].y, min.y), + nw4r::ut::Min(vecs[j].z, min.z) + ); + max.set( + nw4r::ut::Max(vecs[j].x, max.x), + nw4r::ut::Max(vecs[j].y, max.y), + nw4r::ut::Max(vecs[j].z, max.z) + ); + // clang-format on + } } + mBoundingBox.Set(min, max); } if (fn_572_4430()) { @@ -442,7 +511,559 @@ int dAcOdoor_c::doDelete() { return SUCCEEDED; } -int dAcOdoor_c::actorExecuteInEvent() {} +int dAcOdoor_c::actorExecuteInEvent() { + if (fn_572_4430()) { + fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); + } + + if (mEventRelated.isAdvance()) { + field_0x5B6 = 0; + } else if (field_0x5B6 < 0xFF) { + field_0x5B6++; + } + + if (fn_572_40E0()) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + + switch (field_0x5B3) { + case 0: { + bool b; + checkRoom(mRoomID, b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + case 1: { + bool b; + fn_572_4150(b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + } + + unsetObjectProperty(OBJ_PROP_0x200); + s32 type = getType(); + + static mVec3_c v1(0.f, 0.f, 70.f); + static mVec3_c v2(0.f, 0.f, -70.f); + + f32 frame0 = -1.f; + f32 frame1 = -1.f; + + switch (mEventRelated.getCurrentEventCommand()) { + case 'pllB': { + f32 frame = dAcPy_c::GetLink()->getCurrentAnimFrame(); + if (mEventRelated.isAdvance()) { + mAnmChr.setAnm(DoorAnimPull, m3d::PLAY_MODE_4); + mAnmChr.setFrame(frame); + field_0x5B0 = 45; + + frame0 = frame; + if (field_0x5B3 == s8(1)) { + fn_572_4340(); + } + } else { + frame0 = mAnmChr.getAnm().getFrame(); + } + mAnmChr.setFrame(frame); + frame1 = mAnmChr.getAnm().getFrame(); + bool old_time = 0 == field_0x5B0; + bool new_time = 0 == sLib::calcTimer(&field_0x5B0); + switch (field_0x5B3) { + case 0: { + if (!old_time && new_time) { + triggerExit(); + } + } break; + case 1: { + if (new_time) { + mEventRelated.advanceNext(); + } + } break; + } + } break; + case 'pllE': { + bool isStop; + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + f32 frame = pPlayer->getCurrentAnimFrame(); + if (mEventRelated.isAdvance()) { + isStop = false; + switch (field_0x5B3) { + case 0: { + frame0 = frame; + } break; + case 1: { + frame0 = mAnmChr.getAnm().getFrame(); + } break; + } + mAnmChr.setAnm(DoorAnimPull, m3d::PLAY_MODE_4); + mAnmChr.setFrame(frame); + } else { + isStop = mAnmChr.getAnm().isStop(); + frame0 = mAnmChr.getAnm().getFrame(); + + if (!isStop) { + mAnmChr.setFrame(frame); + } + } + bool postStop = mAnmChr.getAnm().isStop(); + frame1 = mAnmChr.getAnm().getFrame(); + if (!isStop && postStop) { + if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { + dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B4()); + if (pRoom != nullptr) { + pRoom->setFlag(0x4); + dStage_c::GetInstance()->fn_801B3C60(getField_0x5B5()); + } + } + mEventRelated.advanceNext(); + + bool search = true; + dAcOFence_c *pFence = + static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); + while (search && pFence != nullptr) { + if (mAng::abs(pPlayer->mRotation.y - pFence->mRotation.y) < 0x4000) { + const mVec3_c &posFence = pFence->mPosition; + const mVec3_c &position = mPosition; + if (posFence.squareDistanceToXZ(position) < 22500.f && + nw4r::math::FAbs(posFence.y - position.y) < 500.f) { + search = false; + continue; + } + } + pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, pFence)); + } + + if (!search) { + if (pFence->fn_550_11B0()) { + pFence->changeToRequestConfineEvent(); + } + pFence->fn_550_12C0(); + } + + if (mLock.get() != nullptr) { + mLock.get()->deleteRequest(); + } + } + } break; + case 'pshB': { + f32 frame = dAcPy_c::GetLink()->getCurrentAnimFrame(); + if (mEventRelated.isAdvance()) { + if (type == SUBTYPE_7) { + mAnmChr.setAnm(DoorF_Open, m3d::PLAY_MODE_4); + field_0x5B0 = 120; + } else { + mAnmChr.setAnm(DoorAnimPush, m3d::PLAY_MODE_4); + field_0x5B0 = 45; + } + if (field_0x5B3 == s8(1)) { + transitionPushRoomFlags(); + } + frame0 = frame; + } else { + frame0 = mAnmChr.getAnm().getFrame(); + } + mAnmChr.setFrame(frame); + frame1 = mAnmChr.getAnm().getFrame(); + bool old_time = 0 == field_0x5B0; + bool new_time = 0 == sLib::calcTimer(&field_0x5B0); + switch (field_0x5B3) { + case 0: { + if (!old_time && new_time) { + triggerExit(); + } + } break; + case 1: { + if (new_time) { + mEventRelated.advanceNext(); + } + } break; + } + } break; + case 'pshE': { + bool isStop; + f32 frame = dAcPy_c::GetLink()->getCurrentAnimFrame(); + if (mEventRelated.isAdvance()) { + isStop = false; + switch (field_0x5B3) { + case 0: { + frame0 = frame; + } break; + case 1: { + frame0 = mAnmChr.getAnm().getFrame(); + } break; + } + if (type == SUBTYPE_7) { + mAnmChr.setAnm(DoorF_Close, m3d::PLAY_MODE_4); + } else { + mAnmChr.setAnm(DoorAnimPush, m3d::PLAY_MODE_4); + } + mAnmChr.setFrame(frame); + } else { + isStop = mAnmChr.getAnm().isStop(); + frame0 = mAnmChr.getAnm().getFrame(); + if (!isStop) { + mAnmChr.setFrame(frame); + } + } + bool stop = mAnmChr.getAnm().isStop(); + frame1 = mAnmChr.getAnm().getFrame(); + if (!isStop && stop) { + if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { + dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B5()); + if (pRoom != nullptr) { + pRoom->setFlag(0x1); + dStage_c::GetInstance()->fn_801B3C60(getField_0x5B4()); + } + } + mEventRelated.advanceNext(); + + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + + bool search = true; + dAcOFence_c *pFence = + static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); + while (search && pFence != nullptr) { + if (mAng::abs(pPlayer->mRotation.y - pFence->mRotation.y) < 0x4000) { + const mVec3_c &posFence = pFence->mPosition; + const mVec3_c &position = mPosition; + if (posFence.squareDistanceToXZ(position) < 22500.f && + nw4r::math::FAbs(posFence.y - position.y) < 500.f) { + search = false; + continue; + } + } + pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, pFence)); + } + + if (!search) { + if (pFence->fn_550_11B0()) { + pFence->changeToRequestConfineEvent(); + } + pFence->fn_550_12C0(); + } + + if (mLock.get() != nullptr) { + mLock.get()->deleteRequest(); + } + + if (type == SUBTYPE_7) { + bool b; + if (frame0 == frame1) { + b = frame0 == 55.f; + } else { + b = frame0 < 55.f && 55.f <= frame1; + } + if (b) { + dRumble_c::start(dRumble_c::sRumblePreset5, dRumble_c::FLAG_SLOT0); + } + } + } + } break; + case 'wait': { + mEventRelated.advanceNext(); + } break; + case 'tktn': { + mEventRelated.advanceNext(); + } break; + case 'tkwt': { + mEventRelated.advanceNext(); + } break; + case 'tked': { + mEventRelated.advanceNext(); + } break; + case 'cAna': { + mVec3_c pos; + int rot; + if (type == SUBTYPE_7) { + pos.set(0.f, 0.f, 85.f); + rot = mRotation.y - 0x8000; + } else { + int dir; + mEventRelated.getSingleShortData(&dir, 'dir ', 0); + if (dir == 0) { + pos.set(v1); + rot = mRotation.y - 0x8000; + } else { + pos.set(v2); + rot = mRotation.y; + } + } + stepTowards(pos); + dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); + + if (field_0x5B6 > 0x1E) { + pPlayer->setPosYRot(pos, rot); + mEventRelated.advanceNext(); + } else { + mVec3_c tmp = pPlayer->mPosition; + cLib::addCalcPos(&tmp, pos, 0.25f, 200.f, 0.f); + + mAng ang = pPlayer->mRotation.y; + sLib::addCalcAngle(ang.ref(), rot, 4, 0x7FFF, 0); + + if (pos.squareDistanceToXZ(tmp) < 25.f && mAng(ang - mAng(rot)).abs() < 182) { + pPlayer->setPosYRot(pos, rot); + mEventRelated.advanceNext(); + } else { + pPlayer->setPosYRot(pos, ang); + } + } + } break; + case 'cDeg': { + mVec3_c pos; + mAng rot; + if (mEventRelated.isAdvance()) { + if (type == SUBTYPE_7) { + pos.set(0.f, 0.f, 90.f); + rot = mRotation.y; + } else { + int dir; + mEventRelated.getSingleShortData(&dir, 'dir ', 0); + if (dir == 0) { + pos.set(v1); + rot = mRotation.y - 0x8000; + } else { + pos.set(v2); + rot = mRotation.y; + } + } + stepTowards(pos); + dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); + pPlayer->setPosYRot(pos, rot); + mEventRelated.advanceNext(); + } + } break; + case 'talk': + case 'lock': { + if (mEventRelated.isAdvance()) { + s32 flow = mLock.get() == nullptr ? mParams >> 16 : 4001; + s32 part2 = flow < 10000U ? 1000 : 100; + s32 truncate = (flow / part2); + + u16 lower = flow - truncate * part2; + + s32 part1 = flow < 10000U ? 1000 : 100; + u16 upper = flow / part1; + mFlowMgr.triggerEntryPoint(upper, lower, 0, 0); + } + if (mFlowMgr.checkFinished()) { + mEventRelated.advanceNext(); + } + } break; + case 'unlk': { + dAcOLock_c *pLock = mLock.get(); + if (pLock == nullptr) { + mEventRelated.advanceNext(); + } else { + if (mEventRelated.isAdvance()) { + pLock->setField_0x2090(); + fn_572_4440(); + } + if (pLock->checkField_0x2090()) { + mEventRelated.advanceNext(); + } + } + } break; + default: { + mEventRelated.advanceNext(); + } + case '????': { + } break; + } + + dAcObjBase_c *pObj = mObjRef.get(); + if (pObj != nullptr) { + mMtx_c m = pObj->mWorldMtx; + m += mWorldMtx; + mWorldMtx = m; + mAnmChr.getModel().setLocalMtx(mWorldMtx); + } + + mAnmChr.getModel().calc(false); + + if (type != SUBTYPE_7) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); + nodeMtx.transM(sVecs[0]); + mMdl0.setLocalMtx(nodeMtx); + if (fn_572_4430()) { + mMdl1.setLocalMtx(nodeMtx); + } + } + + if (pObj != nullptr) { + mVec3_c min, max; + min.set(999999.f, 999999.f, 999999.f); + max.set(-999999.f, -999999.f, -999999.f); + + if (type == SUBTYPE_7) { + mAnmChr.getModel().getBounds(&min, &max); + } else { + mVec3_c min_l, max_l; + mMtx_c local; + mMdl0.getBounds(&min_l, &max_l); + mMdl0.getLocalMtx(local); + + mMtx_c world = mWorldMtx; + world.inverse(); + + mVec3_c minPos = min_l; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); + + // clang-format off + min.set( + nw4r::ut::Min(minPos.x, min.x), + nw4r::ut::Min(minPos.y, min.y), + nw4r::ut::Min(minPos.z, min.z) + ); + max.set( + nw4r::ut::Max(minPos.x, max.x), + nw4r::ut::Max(minPos.y, max.y), + nw4r::ut::Max(minPos.z, max.z) + ); + // clang-format on + + mVec3_c maxPos = max_l; + local.multVec(maxPos, maxPos); + world.multVec(maxPos, maxPos); + // clang-format off + min.set( + nw4r::ut::Min(maxPos.x, min.x), + nw4r::ut::Min(maxPos.y, min.y), + nw4r::ut::Min(maxPos.z, min.z) + ); + max.set( + nw4r::ut::Max(maxPos.x, max.x), + nw4r::ut::Max(maxPos.y, max.y), + nw4r::ut::Max(maxPos.z, max.z) + ); + // clang-format on + + mVec3_c vecs[6] = { + mVec3_c(min_l.x, min_l.y, max_l.z), mVec3_c(min_l.x, max_l.y, min_l.z), + mVec3_c(min_l.x, max_l.y, max_l.z), mVec3_c(max_l.x, min_l.y, min_l.z), + mVec3_c(max_l.x, min_l.y, max_l.z), mVec3_c(max_l.x, max_l.y, min_l.z), + }; + + for (int i = 0, j = 0; i < (int)ARRAY_LENGTH(vecs); j++, i++) { + local.multVec(vecs[i], vecs[j]); + world.multVec(vecs[i], vecs[j]); + // clang-format off + min.set( + nw4r::ut::Min(vecs[j].x, min.x), + nw4r::ut::Min(vecs[j].y, min.y), + nw4r::ut::Min(vecs[j].z, min.z) + ); + max.set( + nw4r::ut::Max(vecs[j].x, max.x), + nw4r::ut::Max(vecs[j].y, max.y), + nw4r::ut::Max(vecs[j].z, max.z) + ); + // clang-format on + } + } + mBoundingBox.Set(min, max); + } + + if (mEmmiterL.hasEmitters()) { + int node = mAnmChr.getModel().getNodeID("DoorF_L"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterL.setTransform(nodeMtx); + } + } + if (mEmmiterL.hasEmitters()) { + int node = mAnmChr.getModel().getNodeID("DoorF_R"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterR.setTransform(nodeMtx); + } + } + + switch (mEventRelated.getCurrentEventCommand()) { + case 'pshB': { + if (mEventRelated.isAdvance() && type == SUBTYPE_7) { + int node; + node = mAnmChr.getModel().getNodeID("DoorF_L"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterL.startEffect(PARTICLE_RESOURCE_ID_MAPPING_935_, nodeMtx, nullptr, nullptr); + } + node = mAnmChr.getModel().getNodeID("DoorF_R"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterR.startEffect(PARTICLE_RESOURCE_ID_MAPPING_936_, nodeMtx, nullptr, nullptr); + } + } + } break; + case 'pshE': { + if (mEventRelated.isAdvance() && type == SUBTYPE_7) { + int node; + node = mAnmChr.getModel().getNodeID("DoorF_L"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterL.startEffect(PARTICLE_RESOURCE_ID_MAPPING_933_, nodeMtx, nullptr, nullptr); + } + node = mAnmChr.getModel().getNodeID("DoorF_R"); + if (node >= 0) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(node, nodeMtx); + mEmmiterR.startEffect(PARTICLE_RESOURCE_ID_MAPPING_934_, nodeMtx, nullptr, nullptr); + } + } + } break; + } + + if (type != SUBTYPE_7) { + bool b; + if (frame0 == frame1) { + b = frame0 == 16.f; + } else { + b = frame0 < 16.f && 16.f <= frame1; + } + if (b) { + startSound(SE_Door_W_OPEN); + } + } + + if (type != SUBTYPE_7) { + bool b; + if (frame0 == frame1) { + b = frame0 == 60.f; + } else { + b = frame0 < 60.f && 60.f <= frame1; + } + if (b) { + startSound(SE_Door_W_CLOSE); + } + } + + if (mEventRelated.getCurrentEventCommand() == 'pshB' && type == SUBTYPE_7) { + if (frame0 < 50.f && 50.f <= frame1) { + // ?? + if (&dRumble_c::sRumblePreset3) { + mRumbleIdx = + dRumble_c::start(dRumble_c::sRumblePreset3, dRumble_c::FLAG_SLOT0 | dRumble_c::FLAG_INITIALIZE); + } + } + if (frame0 <= 115.f && 115.f < frame0) { + dRumble_c::stop(mRumbleIdx); + } + } + return SUCCEEDED; +} int dAcOdoor_c::actorExecute() {} @@ -568,7 +1189,7 @@ void dAcOdoor_c::setRoomId(s8 roomId) {} // mRoomId = roomId; void dAcOdoor_c::fn_572_4050(u32 flags) {} // field_0x5A8 = flags /** fn_572_4060 */ -void dAcOdoor_c::fn_572_4060(u8) {} // field_0x5B3 = in +void dAcOdoor_c::fn_572_4060(s8) {} // field_0x5B3 = in /** fn_572_4070 */ void dAcOdoor_c::fn_572_4070(s8) {} // field_0x5B4 = in -- cgit v1.2.3 From dc82ce38db03bc2496c3ed9755f7805be544e995 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 25 Nov 2025 01:11:48 -0500 Subject: symbols --- src/REL/d/a/obj/d_a_obj_door.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'src') 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 d1cceaa1..195d4cc2 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -35,10 +35,6 @@ 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"; @@ -192,6 +188,9 @@ bool checkRoom(s8 roomID, bool &b) { return true; } +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) +}; } // namespace const char *const DoorE_N = "DoorE_N"; @@ -1245,9 +1244,6 @@ bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const {} /** fn_572_4310 */ void dAcOdoor_c::transitionPushRoomFlags() const {} -/** fn_572_4320 */ -void dAcOdoor_c::fn_572_4320() const {} // nop - /** fn_572_4430 */ bool dAcOdoor_c::transitionPullRoomFlags() const {} -- cgit v1.2.3 From d8ede28c570cab681d9cb1aad12e7624e025fae6 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 26 Nov 2025 01:09:04 -0500 Subject: most OK --- src/REL/d/a/obj/d_a_obj_door.cpp | 846 +++++++++++++++++++++++++++++++-------- 1 file changed, 670 insertions(+), 176 deletions(-) (limited to 'src') 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 195d4cc2..834a4f3f 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -3,6 +3,7 @@ #include "c/c_lib.h" #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_fence.h" @@ -14,12 +15,15 @@ #include "d/d_rumble.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/d_stage_mgr.h" #include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_wzsound.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_anmmdl.h" #include "m/m3d/m_fanm.h" #include "m/m_mtx.h" #include "m/m_vec.h" @@ -28,7 +32,9 @@ #include "nw4r/math/math_arithmetic.h" #include "s/s_Math.h" #include "sized_string.h" +#include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" +#include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); @@ -36,6 +42,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); namespace { const char *const DoorAnim = "DoorAnim"; +const char *const DoorAnim_ = "DoorAnim"; const char *const DoorAnimPull = "DoorAnimPull"; const char *const DoorAnimPush = "DoorAnimPush"; @@ -56,12 +63,22 @@ DoorFileMapping sDoorMappings[8] = { }; const char *const DoorF = "DoorF"; +const char *const DoorF_ = "DoorF"; const char *const DoorF_Open = "DoorF_Open"; const char *const DoorF_Close = "DoorF_Close"; + +static const u8 sDoorUnknown[2] = {0, 1}; + +const s32 sSpecialDoorMapTypes[5] = { + sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, + sDoorMappings[5].mType, sDoorMappings[6].mType, +}; + const char *const DoorPull = "DoorPull"; const char *const DoorPush = "DoorPush"; const char *const DoorPullLock = "DoorPullLock"; const char *const DoorPushLock = "DoorPushLock"; +const char *const DoorTalk = "DoorTalk"; bool getDoorMapping(u32 type, const DoorFileMapping *&filemap) { bool found = false; @@ -99,7 +116,6 @@ bool getDoorMdlName(u32 type, const char *&name) { return found; } -static const u8 sDoorUnknown[2] = {0, 1}; bool getDoorUnknown(u8 search, u8 &idx) { bool found = false; int i = 0; @@ -118,11 +134,6 @@ bool getDoorUnknown(u8 search, u8 &idx) { return found; } -static s32 sSpecialDoorMapTypes[5] = { - sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, - sDoorMappings[5].mType, sDoorMappings[6].mType, -}; - bool isDoorSpecial(s32 type) { bool found = false; int i = 0; @@ -136,9 +147,8 @@ bool isDoorSpecial(s32 type) { return found; } - const char *getDoorInteractionName() { - return "DoorTalk"; + return DoorTalk; } const char *const sSandShipOuterStages[2] = {"B301", "D301_1"}; @@ -188,12 +198,29 @@ bool checkRoom(s8 roomID, bool &b) { return true; } -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) -}; } // namespace -const char *const DoorE_N = "DoorE_N"; +void rodata0() { + const f32 a[] = {0.f, 16.f, 60.f, 0.f, 80.f, 100.f, 0.f, 160.f, 100.f}; + const u32 b[] = {0x2D2D7832, 0x73010000, 0x03000000}; +} +static mVec3_c sVec0 = mVec3_c(70.f, 0.f, 0.f); +static mVec3_c sVec1 = mVec3_c(52.f, 110.f, 0.f); + +static mVec3_c sVec2 = mVec3_c(0.f, 0.f, 70.f); +static mVec3_c sVec3 = mVec3_c(0.f, 0.f, -70.f); + +static const InteractionTargetDef sOpenInteraction = { + 0, 2, 1, OPEN, 0, 1000.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f, +}; +static const InteractionTargetDef sLockedInteraction = { + 0, 2, 1, EXAMINE_TALK, 0, 1000.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f, +}; +void rodata1() { + const f32 a[] = {200.f, 0.f}; +} + +SizedString<32> sStageF402("F402"); bool dAcOdoor_c::createHeap() { s32 type = getFromParams(0, 0x3F); if (type == SUBTYPE_7) { @@ -201,13 +228,13 @@ bool dAcOdoor_c::createHeap() { if (!resFile.IsValid()) { return false; } - mAnmChr.create(resFile.ptr(), DoorF, DoorF_Open, &mAllocator, 0x120); + mAnmChr.create(resFile.ptr(), DoorF_, DoorF_Open, &mAllocator, 0x120); } else { nw4r::g3d::ResFile resFileAnim(getOarcResFile(DoorAnim)); if (!resFileAnim.IsValid()) { return false; } - if (!mAnmChr.create(resFileAnim.ptr(), DoorAnim, DoorAnimPull, &mAllocator, 0)) { + if (!mAnmChr.create(resFileAnim.ptr(), DoorAnim_, DoorAnimPull, &mAllocator, 0)) { return false; } @@ -268,7 +295,7 @@ int dAcOdoor_c::actorCreate() { mSceneflag = getSceneflag(); - if (getKeyParameter() == true) { + if (getLockParameter() == LOCK_KEY) { if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { mLock.link( static_cast( @@ -346,7 +373,7 @@ int dAcOdoor_c::actorPostCreate() { foundPair = true; this->getConnectedDoorRef().link(pDoor); pDoor->getConnectedDoorRef().link(this); - if (getKeyParameter() == true) { + if (getLockParameter() == LOCK_KEY) { this->fn_572_40B0(); pDoor->fn_572_40C0(); } else { @@ -407,7 +434,7 @@ int dAcOdoor_c::actorPostCreate() { if (type != SUBTYPE_7) { mMtx_c m; mAnmChr.getModel().getNodeWorldMtx(1, m); - m.transM(sVecs[0]); + m.transM(sVec0); mMdl0.setLocalMtx(m); if (fn_572_4430()) { mMdl1.setLocalMtx(m); @@ -564,7 +591,7 @@ int dAcOdoor_c::actorExecuteInEvent() { frame0 = frame; if (field_0x5B3 == s8(1)) { - fn_572_4340(); + transitionPullRoomFlags(); } } else { frame0 = mAnmChr.getAnm().getFrame(); @@ -716,15 +743,14 @@ int dAcOdoor_c::actorExecuteInEvent() { if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B5()); if (pRoom != nullptr) { - pRoom->setFlag(0x1); + pRoom->setFlag(0x4); dStage_c::GetInstance()->fn_801B3C60(getField_0x5B4()); } } mEventRelated.advanceNext(); - const dAcPy_c *pPlayer = dAcPy_c::GetLink(); - bool search = true; + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); dAcOFence_c *pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); while (search && pFence != nullptr) { @@ -750,17 +776,16 @@ int dAcOdoor_c::actorExecuteInEvent() { if (mLock.get() != nullptr) { mLock.get()->deleteRequest(); } - - if (type == SUBTYPE_7) { - bool b; - if (frame0 == frame1) { - b = frame0 == 55.f; - } else { - b = frame0 < 55.f && 55.f <= frame1; - } - if (b) { - dRumble_c::start(dRumble_c::sRumblePreset5, dRumble_c::FLAG_SLOT0); - } + } + if (type == SUBTYPE_7) { + bool b; + if (frame0 == frame1) { + b = frame0 == 55.f; + } else { + b = frame0 < 55.f && 55.f <= frame1; + } + if (b) { + dRumble_c::start(dRumble_c::sRumblePreset5, dRumble_c::FLAG_SLOT0); } } } break; @@ -778,16 +803,18 @@ int dAcOdoor_c::actorExecuteInEvent() { } break; case 'cAna': { mVec3_c pos; - int rot; + mAng rot; if (type == SUBTYPE_7) { pos.set(0.f, 0.f, 85.f); - rot = mRotation.y - 0x8000; + rot = mAng(0x8000); + rot += mRotation.y; } else { int dir; mEventRelated.getSingleShortData(&dir, 'dir ', 0); if (dir == 0) { pos.set(v1); - rot = mRotation.y - 0x8000; + rot = mAng(0x8000); + rot += mRotation.y; } else { pos.set(v2); rot = mRotation.y; @@ -806,7 +833,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mAng ang = pPlayer->mRotation.y; sLib::addCalcAngle(ang.ref(), rot, 4, 0x7FFF, 0); - if (pos.squareDistanceToXZ(tmp) < 25.f && mAng(ang - mAng(rot)).abs() < 182) { + if (pos.squareDistanceToXZ(tmp) < 25.f && mAng::abs(ang - mAng((s32)rot)) < 182) { pPlayer->setPosYRot(pos, rot); mEventRelated.advanceNext(); } else { @@ -864,7 +891,7 @@ int dAcOdoor_c::actorExecuteInEvent() { pLock->setField_0x2090(); fn_572_4440(); } - if (pLock->checkField_0x2090()) { + if (pLock->checkField_0x2091()) { mEventRelated.advanceNext(); } } @@ -879,7 +906,7 @@ int dAcOdoor_c::actorExecuteInEvent() { dAcObjBase_c *pObj = mObjRef.get(); if (pObj != nullptr) { mMtx_c m = pObj->mWorldMtx; - m += mWorldMtx; + m += mMtx; mWorldMtx = m; mAnmChr.getModel().setLocalMtx(mWorldMtx); } @@ -889,7 +916,7 @@ int dAcOdoor_c::actorExecuteInEvent() { if (type != SUBTYPE_7) { mMtx_c nodeMtx; mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); - nodeMtx.transM(sVecs[0]); + nodeMtx.transM(sVec0); mMdl0.setLocalMtx(nodeMtx); if (fn_572_4430()) { mMdl1.setLocalMtx(nodeMtx); @@ -979,7 +1006,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mEmmiterL.setTransform(nodeMtx); } } - if (mEmmiterL.hasEmitters()) { + if (mEmmiterR.hasEmitters()) { int node = mAnmChr.getModel().getNodeID("DoorF_R"); if (node >= 0) { mMtx_c nodeMtx; @@ -1051,80 +1078,396 @@ int dAcOdoor_c::actorExecuteInEvent() { if (mEventRelated.getCurrentEventCommand() == 'pshB' && type == SUBTYPE_7) { if (frame0 < 50.f && 50.f <= frame1) { - // ?? + // TODO(Zeldex) - Why is this a check - This seems to indicate it was a getter for a pointer if (&dRumble_c::sRumblePreset3) { mRumbleIdx = dRumble_c::start(dRumble_c::sRumblePreset3, dRumble_c::FLAG_SLOT0 | dRumble_c::FLAG_INITIALIZE); } } - if (frame0 <= 115.f && 115.f < frame0) { + if (frame0 <= 115.f && 115.f < frame1) { dRumble_c::stop(mRumbleIdx); } } return SUCCEEDED; } -int dAcOdoor_c::actorExecute() {} +int dAcOdoor_c::actorExecute() { + if (fn_572_4430()) { + fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); + } + switch (field_0x5B3) { + case 0: { + bool b; + checkRoom(mRoomID, b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + case 1: { + bool b; + fn_572_4150(b); + if (b) { + setObjectProperty(OBJ_PROP_0x200); + return SUCCEEDED; + } + } break; + } + unsetObjectProperty(OBJ_PROP_0x200); + s32 type = getType(); + + if (getLockParameter() == LOCK_KEY) { + if (mLock.get() == nullptr) { + if (isPlayerInteractable()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } else { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } + } else { + switch (field_0x5B1) { + case 0: { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + case 1: + case 4: + case 5: + case 6: { + if (isPlayerInFrontOfDoor()) { + if (isLocked()) { + AttentionManager::GetInstance()->addTarget(*this, sLockedInteraction, 0, nullptr); + } else { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } + } break; + case 2: { + if (isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + case 3: { + if (!isLocked() && isPlayerInFrontOfDoor()) { + AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); + } + } break; + } + } + + dAcObjBase_c *pObj = mObjRef.get(); + if (pObj != nullptr) { + mMtx_c m = pObj->mWorldMtx; + m += mMtx; + mWorldMtx = m; + mAnmChr.getModel().setLocalMtx(mWorldMtx); + mAnmChr.getModel().calc(false); + + if (type != SUBTYPE_7) { + mMtx_c nodeMtx; + mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); + nodeMtx.transM(sVec0); + mMdl0.setLocalMtx(nodeMtx); + if (fn_572_4430()) { + mMdl1.setLocalMtx(nodeMtx); + } + } + } + + if (pObj != nullptr) { + mVec3_c min, max; + min.set(999999.f, 999999.f, 999999.f); + max.set(-999999.f, -999999.f, -999999.f); + + if (type == SUBTYPE_7) { + mAnmChr.getModel().getBounds(&min, &max); + } else { + mVec3_c min_l, max_l; + mMtx_c local; + mMdl0.getBounds(&min_l, &max_l); + mMdl0.getLocalMtx(local); + + mMtx_c world = mWorldMtx; + world.inverse(); + + mVec3_c minPos = min_l; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); + + // clang-format off + min.set( + nw4r::ut::Min(minPos.x, min.x), + nw4r::ut::Min(minPos.y, min.y), + nw4r::ut::Min(minPos.z, min.z) + ); + max.set( + nw4r::ut::Max(minPos.x, max.x), + nw4r::ut::Max(minPos.y, max.y), + nw4r::ut::Max(minPos.z, max.z) + ); + // clang-format on + + mVec3_c maxPos = max_l; + local.multVec(maxPos, maxPos); + world.multVec(maxPos, maxPos); + // clang-format off + min.set( + nw4r::ut::Min(maxPos.x, min.x), + nw4r::ut::Min(maxPos.y, min.y), + nw4r::ut::Min(maxPos.z, min.z) + ); + max.set( + nw4r::ut::Max(maxPos.x, max.x), + nw4r::ut::Max(maxPos.y, max.y), + nw4r::ut::Max(maxPos.z, max.z) + ); + // clang-format on + + mVec3_c vecs[6] = { + mVec3_c(min_l.x, min_l.y, max_l.z), mVec3_c(min_l.x, max_l.y, min_l.z), + mVec3_c(min_l.x, max_l.y, max_l.z), mVec3_c(max_l.x, min_l.y, min_l.z), + mVec3_c(max_l.x, min_l.y, max_l.z), mVec3_c(max_l.x, max_l.y, min_l.z), + }; + + for (int i = 0, j = 0; i < (int)ARRAY_LENGTH(vecs); j++, i++) { + local.multVec(vecs[i], vecs[j]); + world.multVec(vecs[i], vecs[j]); + // clang-format off + min.set( + nw4r::ut::Min(vecs[j].x, min.x), + nw4r::ut::Min(vecs[j].y, min.y), + nw4r::ut::Min(vecs[j].z, min.z) + ); + max.set( + nw4r::ut::Max(vecs[j].x, max.x), + nw4r::ut::Max(vecs[j].y, max.y), + nw4r::ut::Max(vecs[j].z, max.z) + ); + // clang-format on + } + } + mBoundingBox.Set(min, max); + } + return SUCCEEDED; +} + +int dAcOdoor_c::draw() { + if (fn_572_4430()) { + if (!mTimeBits.field_0x00) { + drawModelType1(&mMdl1); + } + if (!mTimeBits.field_0x01) { + drawModelType1(&mMdl0); + } + } else { + if (getType() == SUBTYPE_7) { + drawModelType1(&mAnmChr.getModel()); + } else { + drawModelType1(&mMdl0); + } + } + return SUCCEEDED; +} -int dAcOdoor_c::draw() {} +bool dAcOdoor_c::isLocked() { + if (getLockParameter() == LOCK_KEY) { + return mLock.isLinked(); + } -bool dAcOdoor_c::isLocked() {} + switch (field_0x5B1) { + case 0: return false; + case 1: + case 3: return mSceneflag < 0xFF ? !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + case 2: return false; + case 4: return mSceneflag < 0xFF ? SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + case 5: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::DAY; + case 6: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT; + default: return true; + } +} -bool dAcOdoor_c::canOpen() {} +bool dAcOdoor_c::canOpen() { + // NONMATCHING + // https://decomp.me/scratch/dHRfo + // Duplicate load of dStageMgr_c::sInstance for nullptr check and function call + // Happens in d_a_obj_door_boss as well + dStageMgr_c *pStageMgr = dStageMgr_c::GetInstance(); + if (pStageMgr != nullptr && pStageMgr->isAreaTypeDungeonOrBoss()) { + return getLockParameter() == LOCK_KEY && mLock.isLinked(); + } + return isLocked(); +} -/** fn_572_33E0 - I Think this gets the Door open range*/ -f32 dAcOdoor_c::fn_572_33E0() {} // -80.f +f32 dAcOdoor_c::fn_572_33E0() { + return -80.f; +} -/** */ -void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) {} +// HACK +inline u32 createBits(const u32 &a, const u32 &b) { + return a | b; +} -/** */ -void dAcOdoor_c::startPullEventWithCallback(void *zevData) {} +void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) {} +void dAcOdoor_c::startPullEventWithCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startPushEventWithCallback(void *zevData) {} +void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startPullEvent(void *zevData) {} +void dAcOdoor_c::startPushEventWithCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), (void *)doorPushEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startPushEvent(void *zevData) {} +void dAcOdoor_c::startPullEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPullEventWithoutCallback(zevData); break; + case 1: startPullEventWithCallback(zevData); break; + } +} -/** */ -void dAcOdoor_c::startOpenEvent(void *zevData) {} +void dAcOdoor_c::startPushEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPushEventWithoutCallback(zevData); break; + case 1: startPushEventWithCallback(zevData); break; + } +} -/** */ -void dAcOdoor_c::doorPullEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startOpenEvent(void *zevData) { + if (isPlayerInFrontOfDoor()) { + startPullEvent(zevData); + } else if (field_0x5BB) { + Event event("KobunDoorPush", zevData, 100, 0x100001, nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + } else { + startPushEvent(zevData); + } +} -/** */ -void dAcOdoor_c::doorPushEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::doorPullEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} -/** */ -void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) {} +void dAcOdoor_c::doorPushEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} -/** */ -void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) {} +void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) { + Event event(DoorPullLock, zevData, 100, 0x100001, (void *)pullLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startLockedEvent(void *zevData) {} +void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) { + Event event(DoorPushLock, zevData, 100, 0x100001, (void *)pushLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::pullLockedEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startLockedEvent(void *zevData) { + if (isPlayerInFrontOfDoor()) { + startDoorPullLockedEvent(zevData); + } else { + startDoorPushLockedEvent(zevData); + } +} + +void dAcOdoor_c::pullLockedEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + if (pDoor->hasFlowEntryPoint()) { + pDoor->playInteractionLocked(); + } + u16 flag = pDoor->fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + if (flag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); + } +} + +void dAcOdoor_c::pushLockedEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + if (pDoor->hasFlowEntryPoint()) { + pDoor->playInteractionLocked(); + } + u16 flag = pDoor->fn_572_3F90(); + if (flag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); + } +} -/** */ -void dAcOdoor_c::pushLockedEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startUnlockEvent() { + Event event("ShutterUnlock", 100, 0x100001, (void *)unlockEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startUnlockEvent() {} +extern "C" void increaseSmallKeyCounter(int amt); + +void dAcOdoor_c::unlockEventCallback(void *vDoor) { + dAcOdoor_c *pDoor = static_cast(vDoor); + void *zevData = getOarcZev("DoorAnim"); + if (pDoor->isPlayerInFrontOfDoor()) { + switch (pDoor->field_0x5B3) { + case 0: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + case 1: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + } + + } else { + switch (pDoor->field_0x5B3) { + case 0: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + case 1: { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + EventManager::setEvent(pDoor, &event, nullptr); + } break; + } + } -/** */ -void dAcOdoor_c::unlockEventCallback(dAcOdoor_c *) {} + if (pDoor->mSceneflag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, pDoor->mSceneflag); + } -/** */ -void dAcOdoor_c::openCallbackCommon(dAcOdoor_c *) {} + increaseSmallKeyCounter(-1); +} + +void dAcOdoor_c::openCallbackCommon(void *vDoor) { + if (vDoor == nullptr) { + return; + } + dAcOdoor_c *pDoor = static_cast(vDoor); + + bool search = true; + dAcOFence_c *pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, nullptr)); + while (search && pFence != nullptr) { + if (mAng::abs(dAcPy_c::GetLink()->mRotation.y - pFence->mRotation.y) < 0x4000) { + const mVec3_c &posFence = pFence->mPosition; + const mVec3_c &position = pDoor->mPosition; + if (posFence.squareDistanceToXZ(position) < 22500.f && nw4r::math::FAbs(posFence.y - position.y) < 500.f) { + pFence->setObjectProperty(OBJ_PROP_0x200); + pFence->fn_550_1250(); + pFence->fn_550_12B0(); + search = false; + continue; + } + } + pFence = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_FENCE, pFence)); + } +} void dAcOdoor_c::registerInEvent() { if (isInTimeDoorEvent()) { @@ -1132,144 +1475,295 @@ void dAcOdoor_c::registerInEvent() { } } -void dAcOdoor_c::unkVirtFunc_0x6C() {} +void dAcOdoor_c::unkVirtFunc_0x6C() { + fn_572_4100(); +} + +void dAcOdoor_c::doInteraction(s32 interaction) { + if (getType() == SUBTYPE_7) { + void *zevData = getOarcZev("DoorF"); + Event event("FTypeDoorOut", zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + return; + } + + void *zevData = getOarcZev("DoorAnim"); + + switch (interaction) { + case OPEN: { + if (getLockParameter() == LOCK_KEY) { + if (!mLock.isLinked()) { + startOpenEvent(zevData); + } else { + if (dAcItem_c::getSmallKeyCount() != 0) { + if (isConnectedToOtherDoor()) { + if (isPlayerInteractable()) { + startUnlockEvent(); + } else { + dAcOdoor_c *pDoor = getConnectedDoorRef().get(); + pDoor->mLock.link(mLock.get()); + pDoor->startUnlockEvent(); + } + } else { + startOpenEvent(zevData); + } + } else { + Event event(getDoorInteractionName(), 100, 0x100001, nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + } + } + } else { + startOpenEvent(zevData); + if (field_0x5B1 == 2 && mSceneflag < 0xFF) { + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } + } break; + case EXAMINE_TALK: { + startLockedEvent(zevData); + } break; + } +} -void dAcOdoor_c::doInteraction(s32 interaction) {} +s32 dAcOdoor_c::getLockParameter() { + return getFromParams(6, 0x1); +} -/** */ -s32 dAcOdoor_c::getKeyParameter() {} // getFromParams(6, 0x1) +s32 dAcOdoor_c::getSubtype2() { + return (mRotation.x >> 0) & 0xFF; +} -/** */ -s32 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF +u8 dAcOdoor_c::getSceneflag() { + return (mRotation.x >> 8) & 0xFF; +} -/** */ -u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF +u8 dAcOdoor_c::fn_572_3F60() { + return (mRotation.z >> 0) & 0xF; +} -/** fn_572_3F60 */ -u8 dAcOdoor_c::fn_572_3F60() {} // (mRotation.z >> 0) & 0xF +u8 dAcOdoor_c::fn_572_3F70() { + return (mRotation.z >> 4) & 0x3F; +} -/** fn_572_3F70 */ -u8 dAcOdoor_c::fn_572_3F70() {} // (mRotation.z >> 4) & 0x3F +u8 dAcOdoor_c::fn_572_3F80() { + return (mRotation.z >> 10) & 0x3F; +} -/** fn_572_3F80 */ -u8 dAcOdoor_c::fn_572_3F80() {} // (mRotation.z >> 10) & 0x3F +u16 dAcOdoor_c::fn_572_3F90() { + return getParams2Lower() & 0xFF; +} -/** fn_572_3F90 */ -u8 dAcOdoor_c::fn_572_3F90() {} // (getParams2Lower() >> 0) & 0xFF +f32 dAcOdoor_c::getInteractionMinX() { + return -80.f; +} -/** fn_572_3FC0 */ -f32 dAcOdoor_c::getInteractionMinX() {} // -80.f +f32 dAcOdoor_c::getInteractionMaxX() { + return 80.f; +} -/** fn_572_3FD0 */ -f32 dAcOdoor_c::getInteractionMaxX() {} // 80.f +f32 dAcOdoor_c::getInteractionMinZ() { + return -100.f; +} -/** fn_572_3FE0 */ -f32 dAcOdoor_c::getInteractionMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionMaxZ() { + return 100.f; +} -/** fn_572_3FF0 */ -f32 dAcOdoor_c::getInteractionMaxZ() {} // 100.f +f32 dAcOdoor_c::getInteractionLockMinX() { + return -160.f; +} -/** fn_572_4000 */ -f32 dAcOdoor_c::getInteractionLockMinX() {} // -160.f +f32 dAcOdoor_c::getInteractionLockMaxX() { + return 160.f; +} -/** fn_572_4010 */ -f32 dAcOdoor_c::getInteractionLockMaxX() {} // 160.f +f32 dAcOdoor_c::getInteractionLockMinZ() { + return -100.f; +} -/** fn_572_4020 */ -f32 dAcOdoor_c::getInteractionLockMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionLockMaxZ() { + return 100.f; +} -/** fn_572_4030 */ -f32 dAcOdoor_c::getInteractionLockMaxZ() {} // 100.f +void dAcOdoor_c::setRoomId(s8 roomId) { + mRoomID = roomId; +} -/** */ -void dAcOdoor_c::setRoomId(s8 roomId) {} // mRoomId = roomId; +void dAcOdoor_c::fn_572_4050(u32 flags) { + mFlags = flags; +} -/** fn_572_4050 */ -void dAcOdoor_c::fn_572_4050(u32 flags) {} // field_0x5A8 = flags +void dAcOdoor_c::fn_572_4060(u8 in) { + field_0x5B3 = in; +} -/** fn_572_4060 */ -void dAcOdoor_c::fn_572_4060(s8) {} // field_0x5B3 = in +void dAcOdoor_c::fn_572_4070(s8 in) { + field_0x5B4 = in; +} -/** fn_572_4070 */ -void dAcOdoor_c::fn_572_4070(s8) {} // field_0x5B4 = in +void dAcOdoor_c::fn_572_4080(s8 in) { + field_0x5B5 = in; +} -/** fn_572_4080 */ -void dAcOdoor_c::fn_572_4080(s8) {} // field_0x5B5 = in +void dAcOdoor_c::fn_572_4090() { + field_0x5B7 = true; +} -/** fn_572_4090 */ -void dAcOdoor_c::fn_572_4090() {} // field_0x5B7 = true +void dAcOdoor_c::fn_572_40A0() { + field_0x5B7 = false; +} -/** fn_572_40A0 */ -void dAcOdoor_c::fn_572_40A0() {} // field_0x5B7 = false +void dAcOdoor_c::fn_572_40B0() { + field_0x5B8 = true; +} -/** fn_572_40B0 */ -void dAcOdoor_c::fn_572_40B0() {} // field_0x5B8 = true +void dAcOdoor_c::fn_572_40C0() { + field_0x5B8 = false; +} -/** fn_572_40C0 */ -void dAcOdoor_c::fn_572_40C0() {} // field_0x5B8 = false +void dAcOdoor_c::fn_572_40D0() { + field_0x5B9 = true; +} -/** fn_572_40D0 */ -void dAcOdoor_c::fn_572_40D0() {} // field_0x5B9 = true +bool dAcOdoor_c::fn_572_40E0() const { + return mFlags & 1; +} -/** fn_572_40E0 */ -bool dAcOdoor_c::fn_572_40E0() const {} // field_0x5A8 & 1 +void dAcOdoor_c::fn_572_40F0() { + fn_572_4050(mFlags | 1); +} -/** fn_572_40F0 */ -void dAcOdoor_c::fn_572_40F0() {} // field_0x5A8 |= 1 (Time Door) +void dAcOdoor_c::fn_572_4100() { + fn_572_4050(mFlags & ~1); +} -/** fn_572_4100 */ -void dAcOdoor_c::fn_572_4100() {} // field_0x5A8 &= ~1 +void dAcOdoor_c::fn_572_4110() { + fn_572_4050(mFlags | 2); +} -/** fn_572_4110 */ -void dAcOdoor_c::fn_572_4110() {} // field_0x5A8 |= 2 +void dAcOdoor_c::fn_572_4120() { + fn_572_4050(mFlags & ~2); +} -/** fn_572_4120 */ -void dAcOdoor_c::fn_572_4120() {} // field_0x5A8 &= ~2 +bool dAcOdoor_c::fn_572_4130(bool &b) const { + checkRoom(field_0x5B4, b); +} -/** fn_572_4130 */ -bool dAcOdoor_c::fn_572_4130(bool &b) const {} // checkRoom(field_0x5B4,b) +bool dAcOdoor_c::fn_572_4140(bool &b) const { + checkRoom(field_0x5B5, b); +} -/** fn_572_4140 */ -bool dAcOdoor_c::fn_572_4140(bool &b) const {} // checkRoom(field_0x5B5,b) +bool dAcOdoor_c::fn_572_4150(bool &b) const { + bool b0, b1; + if (!fn_572_4130(b0)) { + return false; + } + if (!fn_572_4140(b1)) { + return false; + } + b = b0 && b1; + return true; +} -/** fn_572_4150 */ -bool dAcOdoor_c::fn_572_4150(bool &b) const {} // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 +void dAcOdoor_c::triggerExit() { + if (isLeavingSealedTempleSideDoorPostSkyKeep()) { + dScGame_c::GetInstance()->triggerExit(mRoomID, 11, 2, 2); + } else { + dScGame_c::GetInstance()->triggerExit(mRoomID, getFromParams(8, 0xFF), 2, 2); + } +} -/** */ -void dAcOdoor_c::triggerExit() {} +bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const { + return s32(mParams & 0x3F) == SUBTYPE_4 && field_0x5B5 == 1 && + StoryflagManager::sInstance->getFlag(STORYFLAG_342) && dScGame_c::isCurrentStage(sStageF402); +} -/** */ -bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const {} +void dAcOdoor_c::transitionPushRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B4(), getField_0x5B5()); +} -/** fn_572_4310 */ -void dAcOdoor_c::transitionPushRoomFlags() const {} +void dAcOdoor_c::transitionPullRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B5(), getField_0x5B4()); +} -/** fn_572_4430 */ -bool dAcOdoor_c::transitionPullRoomFlags() const {} +bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const { + s32 diff = mRotation.y - (point - mPosition).atan2sX_Z(); + return mAng::abs(diff) <= 0x4000; +} -/** fn_572_4340 */ -void dAcOdoor_c::fn_572_4340() const {} // nop +bool dAcOdoor_c::isPlayerInFrontOfDoor() const { + return fn_572_4370(dAcPy_c::GetLink()->mPosition); +} -/** fn_572_4370 */ -bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const {} // Is in front of door +bool dAcOdoor_c::hasFlowEntryPoint() { + return getFromParams(16, 0xFFFF); +} -/** */ -bool dAcOdoor_c::isPlayerInFrontOfDoor() const {} +bool dAcOdoor_c::fn_572_4430() const { + return mFlags & 2; +} -/** */ -bool dAcOdoor_c::hasFlowEntryPoint() const {} // getFromParams(16, 0xFFFF) +void dAcOdoor_c::fn_572_4440() { + mVec3_c pos; + if (getType() == SUBTYPE_7) { + pos.set(mPosition); + pos.y += 150.f; + } else { + mMtx_c m; + mAnmChr.getModel().getNodeWorldMtx(1, m); + m.transM(sVec0); + m.multVec(sVec1, pos); + } + mPositionCopy2.set(pos); + mPositionCopy3.set(pos); +} -/** fn_572_4430 */ -bool dAcOdoor_c::fn_572_4430() const {} // field_0x5A8 & 2 +bool dAcOdoor_c::isPlayerInteractable() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); -/** fn_572_4440 */ -void dAcOdoor_c::fn_572_4440() {} // Sets the Postion Copies + if (v.x < getInteractionMinX()) { + return false; + } + if (getInteractionMaxX() < v.x) { + return false; + } + if (v.z < getInteractionMinZ()) { + return false; + } + if (getInteractionMaxZ() < v.z) { + return false; + } + return true; +} -/** */ -bool dAcOdoor_c::isPlayerInteractable() const {} +bool dAcOdoor_c::isPlayerInteractableLocked() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); + v.x += 80.f; -/** fn_572_4600 */ -bool dAcOdoor_c::isPlayerInteractableLocked() const {} + if (v.x < getInteractionLockMinX()) { + return false; + } + if (getInteractionLockMaxX() < v.x) { + return false; + } + if (v.z < getInteractionLockMinZ()) { + return false; + } + if (getInteractionLockMaxZ() < v.z) { + return false; + } + return true; +} -/** */ -void dAcOdoor_c::playInteractionLocked() const {} +void dAcOdoor_c::playInteractionLocked() { + Event event(getDoorInteractionName(), 100, 0x100001, nullptr, nullptr); + EventManager::setEvent(this, &event, nullptr); +} -- cgit v1.2.3 From 8c660e86e8fbdc18c91be780b882e01c9646857a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 26 Nov 2025 17:40:01 -0500 Subject: cleanups and docs --- src/REL/d/a/obj/d_a_obj_door.cpp | 420 ++++++++++++----------- src/REL/d/a/obj/d_a_obj_door_boss.cpp | 4 + src/REL/d/a/obj/d_a_obj_shutter.cpp | 5 + src/REL/d/a/obj/d_a_obj_shutter_change_scene.cpp | 7 + src/REL/d/a/obj/d_a_obj_tr_shutter_cs.cpp | 4 + src/REL/d/a/obj/d_a_obj_trolley_shutter.cpp | 4 + 6 files changed, 250 insertions(+), 194 deletions(-) (limited to 'src') 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 834a4f3f..927461e0 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -47,19 +47,19 @@ const char *const DoorAnimPull = "DoorAnimPull"; const char *const DoorAnimPush = "DoorAnimPush"; struct DoorFileMapping { - const u32 mType; + const dAcOdoor_c::Subtype_e mType; const char *mResName; const char *mMdlName; }; DoorFileMapping sDoorMappings[8] = { - {0, "DoorA00", "DoorA00"}, - {1, "DoorA01", "DoorA01"}, - {6, "DoorA02", "DoorA02"}, - {4, "DoorB00", "DoorB00"}, - {2, "DoorC00", "DoorC00"}, - {3, "DoorC01", "DoorC01"}, - {5, "DoorE", "DoorE_T"}, - {8, "DoorH", "DoorH"}, + { dAcOdoor_c::DOOR_NORMAL, "DoorA00", "DoorA00"}, + { dAcOdoor_c::DOOR_METAL, "DoorA01", "DoorA01"}, + { dAcOdoor_c::DOOR_BATREAUX, "DoorA02", "DoorA02"}, + { dAcOdoor_c::DOOR_TEMPLE_SIDE, "DoorB00", "DoorB00"}, + { dAcOdoor_c::DOOR_DOUBLE, "DoorC00", "DoorC00"}, + { dAcOdoor_c::DOOR_DOUBLE_OUTSIDE, "DoorC01", "DoorC01"}, + {dAcOdoor_c::DOOR_SANDSEA_TIMESHIFT, "DoorE", "DoorE_T"}, + { dAcOdoor_c::DOOR_SPARRING_HALL, "DoorH", "DoorH"}, }; const char *const DoorF = "DoorF"; @@ -67,11 +67,17 @@ const char *const DoorF_ = "DoorF"; const char *const DoorF_Open = "DoorF_Open"; const char *const DoorF_Close = "DoorF_Close"; -static const u8 sDoorUnknown[2] = {0, 1}; +static const u8 sDoorCallbackTypeMap[2] = { + 0, // Doesnt have callbacks + 1 // Has Callbacks +}; -const s32 sSpecialDoorMapTypes[5] = { - sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, - sDoorMappings[5].mType, sDoorMappings[6].mType, +const dAcOdoor_c::Subtype_e sDoubleDoorTypes[5] = { + sDoorMappings[3].mType, // dAcOdoor_c::DOOR_TEMPLE_SIDE + sDoorMappings[4].mType, // dAcOdoor_c::DOOR_DOUBLE + sDoorMappings[5].mType, // dAcOdoor_c::DOOR_DOUBLE_OUTSIDE + sDoorMappings[6].mType, // dAcOdoor_c::DOOR_SANDSEA_TIMESHIFT + sDoorMappings[7].mType, // dAcOdoor_c::DOOR_SPARRING_HALL }; const char *const DoorPull = "DoorPull"; @@ -116,11 +122,11 @@ bool getDoorMdlName(u32 type, const char *&name) { return found; } -bool getDoorUnknown(u8 search, u8 &idx) { +bool getDoorCallbackTypeMapped(u8 search, u8 &idx) { bool found = false; int i = 0; - while (!found && i <= (int)ARRAY_LENGTH(sDoorUnknown) - 1) { - if (sDoorUnknown[i] == search) { + while (!found && i <= (int)ARRAY_LENGTH(sDoorCallbackTypeMap) - 1) { + if (sDoorCallbackTypeMap[i] == search) { found = true; } else { i++; @@ -134,11 +140,11 @@ bool getDoorUnknown(u8 search, u8 &idx) { return found; } -bool isDoorSpecial(s32 type) { +bool isDoubleDoorType(s32 type) { bool found = false; int i = 0; - while (!found && i <= (int)ARRAY_LENGTH(sSpecialDoorMapTypes) - 1) { - if (sSpecialDoorMapTypes[i] == type) { + while (!found && i <= (int)ARRAY_LENGTH(sDoubleDoorTypes) - 1) { + if (sDoubleDoorTypes[i] == type) { found = true; } else { i++; @@ -151,12 +157,12 @@ const char *getDoorInteractionName() { return DoorTalk; } -const char *const sSandShipOuterStages[2] = {"B301", "D301_1"}; -bool isInOuterSandship() { +const char *const sSandShipBossStages[2] = {"B301", "D301_1"}; +bool isInSandshipBoss() { bool found = true; int i = 0; - while (found && i <= (int)ARRAY_LENGTH(sSandShipOuterStages) - 1) { - if (dScGame_c::isCurrentStage(sSandShipOuterStages[i])) { + while (found && i <= (int)ARRAY_LENGTH(sSandShipBossStages) - 1) { + if (dScGame_c::isCurrentStage(sSandShipBossStages[i])) { found = false; } else { i++; @@ -204,11 +210,11 @@ void rodata0() { const f32 a[] = {0.f, 16.f, 60.f, 0.f, 80.f, 100.f, 0.f, 160.f, 100.f}; const u32 b[] = {0x2D2D7832, 0x73010000, 0x03000000}; } -static mVec3_c sVec0 = mVec3_c(70.f, 0.f, 0.f); -static mVec3_c sVec1 = mVec3_c(52.f, 110.f, 0.f); +static mVec3_c sDoorknobOffset0(70.f, 0.f, 0.f); +static mVec3_c sDoorknobOffset1(52.f, 110.f, 0.f); -static mVec3_c sVec2 = mVec3_c(0.f, 0.f, 70.f); -static mVec3_c sVec3 = mVec3_c(0.f, 0.f, -70.f); +static mVec3_c sVec2(0.f, 0.f, 70.f); +static mVec3_c sVec3(0.f, 0.f, -70.f); static const InteractionTargetDef sOpenInteraction = { 0, 2, 1, OPEN, 0, 1000.f, 60.f, 0.f, -100.f, 100.f, 50.f, 1.f, @@ -221,9 +227,10 @@ void rodata1() { } SizedString<32> sStageF402("F402"); + bool dAcOdoor_c::createHeap() { s32 type = getFromParams(0, 0x3F); - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { nw4r::g3d::ResFile resFile(getOarcResFile(DoorF)); if (!resFile.IsValid()) { return false; @@ -264,7 +271,7 @@ bool dAcOdoor_c::createHeap() { return false; } - if (fn_572_4430()) { + if (isTimeEffected()) { nw4r::g3d::ResMdl resMdl = resFileMdl.GetResMdl("DoorE_N"); if (!resMdl.IsValid()) { return false; @@ -282,13 +289,14 @@ bool dAcOdoor_c::createHeap() { int dAcOdoor_c::actorCreate() { // NONMATCHING - Regalloc issues s32 subtype = getType(); - mSubtype = getType(); + setSubtype(subtype); changeLoadedEntitiesWithSet(); - if (subtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { - fn_572_4110(); + if (subtype == DOOR_SANDSEA_TIMESHIFT && + !(dScGame_c::isCurrentStage("B301") || dScGame_c::isCurrentStage("D301_1"))) { + setTimeEffected(); } else { - fn_572_4120(); + setTimeStatic(); } CREATE_ALLOCATOR(dAcOdoor_c); @@ -304,22 +312,22 @@ int dAcOdoor_c::actorCreate() { ); } } else { - u8 type = getSubtype2(); - if (type <= 6) { - field_0x5B1 = type; + u8 type = getLockBehavior(); + if (type <= LOCK_NIGHT) { + mLockBehavior = type; } else { - field_0x5B1 = 0; + mLockBehavior = LOCK_NEVER; } } - u8 idx; - if (!getDoorUnknown(fn_572_3F60(), idx)) { - idx = 0; + u8 callbackType; + if (!getDoorCallbackTypeMapped(getDoorCallbackType(), callbackType)) { + callbackType = 0; // Default to no callback } + setEventCallbackType(callbackType); - fn_572_4060(idx); - fn_572_4070(fn_572_3F70()); - fn_572_4080(fn_572_3F80()); + setFrontRoom(getFrontRoomParam()); + setBackRoom(getBackRoomParam()); mRotation.z = mAng(0); mRotation.x = mAng(0); @@ -329,20 +337,20 @@ int dAcOdoor_c::actorCreate() { setRoomId(roomId); } - if (isDoorSpecial(subtype)) { - fn_572_4090(); + if (isDoubleDoorType(subtype)) { + setDoubleDoor(); } else { - fn_572_40A0(); + setNotDoubleDoor(); } - if (getType() == SUBTYPE_7) { + if (getType() == DOOR_TEMPLE_MAIN) { 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()) { + if (isTimeEffected()) { mMdl0.setPriorityDraw(0xF, 0); mMdl1.setPriorityDraw(0xB, 0); } else { @@ -354,7 +362,7 @@ int dAcOdoor_c::actorCreate() { if (inAcademy) { inAcademy = mVec3_c(1832.5f, 0.f, -1978.0f).squareDistanceToXZ(mPosition) < 100.f; } - field_0x5BB = inAcademy; + mbKobunDoor = inAcademy; return SUCCEEDED; } @@ -362,34 +370,38 @@ int dAcOdoor_c::actorCreate() { extern "C" void fn_80067290(dTimeBits *pBits, s32 roomId, const mVec3_c &pos, f32); int dAcOdoor_c::actorPostCreate() { - if (field_0x5B7) { + if (mbDoubleDoor) { if (!isConnectedToOtherDoor()) { 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() && + if (mID != pDoor->mID && pDoor->mbDoubleDoor && !pDoor->isConnectedToOtherDoor() && mPosition.squareDistance(pDoor->mPosition) < 40000.f) { foundPair = true; this->getConnectedDoorRef().link(pDoor); pDoor->getConnectedDoorRef().link(this); + + // Not really sure the point of this + // How does this prevent Door ordering issues + // This may be why the field goes unused? if (getLockParameter() == LOCK_KEY) { - this->fn_572_40B0(); - pDoor->fn_572_40C0(); + this->setSingleDoor(); + pDoor->setNotSingleDoor(); } else { - this->fn_572_40C0(); - pDoor->fn_572_40B0(); + this->setNotSingleDoor(); + pDoor->setSingleDoor(); } } pDoor = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, pDoor)); } if (!foundPair) { - fn_572_40B0(); + setSingleDoor(); } } } else { - fn_572_40B0(); + setSingleDoor(); } mVec3_c pos = mPosition + mVec3_c::Ey * 10.f; @@ -402,8 +414,8 @@ int dAcOdoor_c::actorPostCreate() { } } - if (isInOuterSandship()) { - fn_572_40D0(); + if (isInSandshipBoss()) { + setInSandshipBoss(); unsetActorProperty(AC_PROP_0x1); if (gndChk) { @@ -431,19 +443,19 @@ int dAcOdoor_c::actorPostCreate() { mAnmChr.getModel().setLocalMtx(mWorldMtx); mAnmChr.getModel().calc(false); - if (type != SUBTYPE_7) { + if (type != DOOR_TEMPLE_MAIN) { mMtx_c m; mAnmChr.getModel().getNodeWorldMtx(1, m); - m.transM(sVec0); + m.transM(sDoorknobOffset0); mMdl0.setLocalMtx(m); - if (fn_572_4430()) { + if (isTimeEffected()) { mMdl1.setLocalMtx(m); } } dAcOLock_c *pLock = mLock.get(); if (pLock == nullptr) { - fn_572_4440(); + setDoorKnobPosition(); } else { mPositionCopy2.set(pLock->mPosition); mPositionCopy3.set(pLock->mPosition); @@ -453,7 +465,7 @@ int dAcOdoor_c::actorPostCreate() { min.set(999999.f, 999999.f, 999999.f); max.set(-999999.f, -999999.f, -999999.f); - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { mAnmChr.getModel().getBounds(&min, &max); } else { mVec3_c min_l, max_l; @@ -523,7 +535,7 @@ int dAcOdoor_c::actorPostCreate() { mBoundingBox.Set(min, max); } - if (fn_572_4430()) { + if (isTimeEffected()) { fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); } @@ -538,22 +550,22 @@ int dAcOdoor_c::doDelete() { } int dAcOdoor_c::actorExecuteInEvent() { - if (fn_572_4430()) { + if (isTimeEffected()) { fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); } if (mEventRelated.isAdvance()) { - field_0x5B6 = 0; - } else if (field_0x5B6 < 0xFF) { - field_0x5B6++; + mFramesInEvent = 0; + } else if (mFramesInEvent < 0xFF) { + mFramesInEvent++; } - if (fn_572_40E0()) { + if (isTimeDoorEventActive()) { setObjectProperty(OBJ_PROP_0x200); return SUCCEEDED; } - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: { bool b; checkRoom(mRoomID, b); @@ -564,7 +576,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } break; case 1: { bool b; - fn_572_4150(b); + checkRooms(b); if (b) { setObjectProperty(OBJ_PROP_0x200); return SUCCEEDED; @@ -587,10 +599,10 @@ int dAcOdoor_c::actorExecuteInEvent() { if (mEventRelated.isAdvance()) { mAnmChr.setAnm(DoorAnimPull, m3d::PLAY_MODE_4); mAnmChr.setFrame(frame); - field_0x5B0 = 45; + mExitTimer = 45; frame0 = frame; - if (field_0x5B3 == s8(1)) { + if (mEventCallbackType == s8(1)) { transitionPullRoomFlags(); } } else { @@ -598,9 +610,9 @@ int dAcOdoor_c::actorExecuteInEvent() { } mAnmChr.setFrame(frame); frame1 = mAnmChr.getAnm().getFrame(); - bool old_time = 0 == field_0x5B0; - bool new_time = 0 == sLib::calcTimer(&field_0x5B0); - switch (field_0x5B3) { + bool old_time = 0 == mExitTimer; + bool new_time = 0 == sLib::calcTimer(&mExitTimer); + switch (mEventCallbackType) { case 0: { if (!old_time && new_time) { triggerExit(); @@ -619,7 +631,7 @@ int dAcOdoor_c::actorExecuteInEvent() { f32 frame = pPlayer->getCurrentAnimFrame(); if (mEventRelated.isAdvance()) { isStop = false; - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: { frame0 = frame; } break; @@ -640,7 +652,7 @@ int dAcOdoor_c::actorExecuteInEvent() { bool postStop = mAnmChr.getAnm().isStop(); frame1 = mAnmChr.getAnm().getFrame(); if (!isStop && postStop) { - if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { + if (mEventCallbackType == 1 && getField_0x5B4() != getField_0x5B5()) { dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B4()); if (pRoom != nullptr) { pRoom->setFlag(0x4); @@ -680,14 +692,14 @@ int dAcOdoor_c::actorExecuteInEvent() { case 'pshB': { f32 frame = dAcPy_c::GetLink()->getCurrentAnimFrame(); if (mEventRelated.isAdvance()) { - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { mAnmChr.setAnm(DoorF_Open, m3d::PLAY_MODE_4); - field_0x5B0 = 120; + mExitTimer = 120; } else { mAnmChr.setAnm(DoorAnimPush, m3d::PLAY_MODE_4); - field_0x5B0 = 45; + mExitTimer = 45; } - if (field_0x5B3 == s8(1)) { + if (mEventCallbackType == s8(1)) { transitionPushRoomFlags(); } frame0 = frame; @@ -696,9 +708,9 @@ int dAcOdoor_c::actorExecuteInEvent() { } mAnmChr.setFrame(frame); frame1 = mAnmChr.getAnm().getFrame(); - bool old_time = 0 == field_0x5B0; - bool new_time = 0 == sLib::calcTimer(&field_0x5B0); - switch (field_0x5B3) { + bool old_time = 0 == mExitTimer; + bool new_time = 0 == sLib::calcTimer(&mExitTimer); + switch (mEventCallbackType) { case 0: { if (!old_time && new_time) { triggerExit(); @@ -716,7 +728,7 @@ int dAcOdoor_c::actorExecuteInEvent() { f32 frame = dAcPy_c::GetLink()->getCurrentAnimFrame(); if (mEventRelated.isAdvance()) { isStop = false; - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: { frame0 = frame; } break; @@ -724,7 +736,7 @@ int dAcOdoor_c::actorExecuteInEvent() { frame0 = mAnmChr.getAnm().getFrame(); } break; } - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { mAnmChr.setAnm(DoorF_Close, m3d::PLAY_MODE_4); } else { mAnmChr.setAnm(DoorAnimPush, m3d::PLAY_MODE_4); @@ -740,7 +752,7 @@ int dAcOdoor_c::actorExecuteInEvent() { bool stop = mAnmChr.getAnm().isStop(); frame1 = mAnmChr.getAnm().getFrame(); if (!isStop && stop) { - if (field_0x5B3 == 1 && getField_0x5B4() != getField_0x5B5()) { + if (mEventCallbackType == 1 && getField_0x5B4() != getField_0x5B5()) { dRoom_c *pRoom = dStage_c::GetInstance()->getRoom(getField_0x5B5()); if (pRoom != nullptr) { pRoom->setFlag(0x4); @@ -777,7 +789,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mLock.get()->deleteRequest(); } } - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { bool b; if (frame0 == frame1) { b = frame0 == 55.f; @@ -804,7 +816,7 @@ int dAcOdoor_c::actorExecuteInEvent() { case 'cAna': { mVec3_c pos; mAng rot; - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { pos.set(0.f, 0.f, 85.f); rot = mAng(0x8000); rot += mRotation.y; @@ -823,7 +835,7 @@ int dAcOdoor_c::actorExecuteInEvent() { stepTowards(pos); dAcPy_c *pPlayer = dAcPy_c::GetLinkM(); - if (field_0x5B6 > 0x1E) { + if (mFramesInEvent > 30) { pPlayer->setPosYRot(pos, rot); mEventRelated.advanceNext(); } else { @@ -837,7 +849,7 @@ int dAcOdoor_c::actorExecuteInEvent() { pPlayer->setPosYRot(pos, rot); mEventRelated.advanceNext(); } else { - pPlayer->setPosYRot(pos, ang); + pPlayer->setPosYRot(tmp, ang); } } } break; @@ -845,7 +857,7 @@ int dAcOdoor_c::actorExecuteInEvent() { mVec3_c pos; mAng rot; if (mEventRelated.isAdvance()) { - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { pos.set(0.f, 0.f, 90.f); rot = mRotation.y; } else { @@ -868,6 +880,7 @@ int dAcOdoor_c::actorExecuteInEvent() { case 'talk': case 'lock': { if (mEventRelated.isAdvance()) { + // Gets the message to show when the door is locked and is failed to be opened s32 flow = mLock.get() == nullptr ? mParams >> 16 : 4001; s32 part2 = flow < 10000U ? 1000 : 100; s32 truncate = (flow / part2); @@ -889,7 +902,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } else { if (mEventRelated.isAdvance()) { pLock->setField_0x2090(); - fn_572_4440(); + setDoorKnobPosition(); } if (pLock->checkField_0x2091()) { mEventRelated.advanceNext(); @@ -913,12 +926,12 @@ int dAcOdoor_c::actorExecuteInEvent() { mAnmChr.getModel().calc(false); - if (type != SUBTYPE_7) { + if (type != DOOR_TEMPLE_MAIN) { mMtx_c nodeMtx; mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); - nodeMtx.transM(sVec0); + nodeMtx.transM(sDoorknobOffset0); mMdl0.setLocalMtx(nodeMtx); - if (fn_572_4430()) { + if (isTimeEffected()) { mMdl1.setLocalMtx(nodeMtx); } } @@ -928,7 +941,7 @@ int dAcOdoor_c::actorExecuteInEvent() { min.set(999999.f, 999999.f, 999999.f); max.set(-999999.f, -999999.f, -999999.f); - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { mAnmChr.getModel().getBounds(&min, &max); } else { mVec3_c min_l, max_l; @@ -1017,7 +1030,7 @@ int dAcOdoor_c::actorExecuteInEvent() { switch (mEventRelated.getCurrentEventCommand()) { case 'pshB': { - if (mEventRelated.isAdvance() && type == SUBTYPE_7) { + if (mEventRelated.isAdvance() && type == DOOR_TEMPLE_MAIN) { int node; node = mAnmChr.getModel().getNodeID("DoorF_L"); if (node >= 0) { @@ -1034,7 +1047,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } } break; case 'pshE': { - if (mEventRelated.isAdvance() && type == SUBTYPE_7) { + if (mEventRelated.isAdvance() && type == DOOR_TEMPLE_MAIN) { int node; node = mAnmChr.getModel().getNodeID("DoorF_L"); if (node >= 0) { @@ -1052,7 +1065,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } break; } - if (type != SUBTYPE_7) { + if (type != DOOR_TEMPLE_MAIN) { bool b; if (frame0 == frame1) { b = frame0 == 16.f; @@ -1064,7 +1077,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } } - if (type != SUBTYPE_7) { + if (type != DOOR_TEMPLE_MAIN) { bool b; if (frame0 == frame1) { b = frame0 == 60.f; @@ -1076,7 +1089,7 @@ int dAcOdoor_c::actorExecuteInEvent() { } } - if (mEventRelated.getCurrentEventCommand() == 'pshB' && type == SUBTYPE_7) { + if (mEventRelated.getCurrentEventCommand() == 'pshB' && type == DOOR_TEMPLE_MAIN) { if (frame0 < 50.f && 50.f <= frame1) { // TODO(Zeldex) - Why is this a check - This seems to indicate it was a getter for a pointer if (&dRumble_c::sRumblePreset3) { @@ -1092,10 +1105,10 @@ int dAcOdoor_c::actorExecuteInEvent() { } int dAcOdoor_c::actorExecute() { - if (fn_572_4430()) { + if (isTimeEffected()) { fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); } - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: { bool b; checkRoom(mRoomID, b); @@ -1106,7 +1119,7 @@ int dAcOdoor_c::actorExecute() { } break; case 1: { bool b; - fn_572_4150(b); + checkRooms(b); if (b) { setObjectProperty(OBJ_PROP_0x200); return SUCCEEDED; @@ -1122,14 +1135,14 @@ int dAcOdoor_c::actorExecute() { AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); } } else { - if (isPlayerInFrontOfDoor()) { + if (isPlayerInteractableLocked()) { AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); } } } else { - switch (field_0x5B1) { + switch (mLockBehavior) { case 0: { - if (isPlayerInFrontOfDoor()) { + if (isPlayerInteractable()) { AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); } } break; @@ -1137,7 +1150,7 @@ int dAcOdoor_c::actorExecute() { case 4: case 5: case 6: { - if (isPlayerInFrontOfDoor()) { + if (isPlayerInteractable()) { if (isLocked()) { AttentionManager::GetInstance()->addTarget(*this, sLockedInteraction, 0, nullptr); } else { @@ -1146,12 +1159,12 @@ int dAcOdoor_c::actorExecute() { } } break; case 2: { - if (isPlayerInFrontOfDoor()) { + if (isPlayerInteractable()) { AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); } } break; case 3: { - if (!isLocked() && isPlayerInFrontOfDoor()) { + if (!isLocked() && isPlayerInteractable()) { AttentionManager::GetInstance()->addTarget(*this, sOpenInteraction, 0, nullptr); } } break; @@ -1166,12 +1179,12 @@ int dAcOdoor_c::actorExecute() { mAnmChr.getModel().setLocalMtx(mWorldMtx); mAnmChr.getModel().calc(false); - if (type != SUBTYPE_7) { + if (type != DOOR_TEMPLE_MAIN) { mMtx_c nodeMtx; mAnmChr.getModel().getNodeWorldMtx(1, nodeMtx); - nodeMtx.transM(sVec0); + nodeMtx.transM(sDoorknobOffset0); mMdl0.setLocalMtx(nodeMtx); - if (fn_572_4430()) { + if (isTimeEffected()) { mMdl1.setLocalMtx(nodeMtx); } } @@ -1182,7 +1195,7 @@ int dAcOdoor_c::actorExecute() { min.set(999999.f, 999999.f, 999999.f); max.set(-999999.f, -999999.f, -999999.f); - if (type == SUBTYPE_7) { + if (type == DOOR_TEMPLE_MAIN) { mAnmChr.getModel().getBounds(&min, &max); } else { mVec3_c min_l, max_l; @@ -1255,7 +1268,7 @@ int dAcOdoor_c::actorExecute() { } int dAcOdoor_c::draw() { - if (fn_572_4430()) { + if (isTimeEffected()) { if (!mTimeBits.field_0x00) { drawModelType1(&mMdl1); } @@ -1263,7 +1276,7 @@ int dAcOdoor_c::draw() { drawModelType1(&mMdl0); } } else { - if (getType() == SUBTYPE_7) { + if (getType() == DOOR_TEMPLE_MAIN) { drawModelType1(&mAnmChr.getModel()); } else { drawModelType1(&mMdl0); @@ -1277,15 +1290,29 @@ bool dAcOdoor_c::isLocked() { return mLock.isLinked(); } - switch (field_0x5B1) { - case 0: return false; - case 1: - case 3: return mSceneflag < 0xFF ? !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; - case 2: return false; - case 4: return mSceneflag < 0xFF ? SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; - case 5: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::DAY; - case 6: return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT; - default: return true; + switch (mLockBehavior) { + case LOCK_NEVER: { + return false; + } + case LOCK_NOT_SET: + case LOCK_TIMESHIFT: { + return mSceneflag < 0xFF ? !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + } + case LOCK_NEVER1: { + return false; + } + case LOCK_SET: { + return mSceneflag < 0xFF ? SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) : true; + } + case LOCK_DAY: { + return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::DAY; + } + case LOCK_NIGHT: { + return dScGame_c::currentSpawnInfo.getTimeOfDay() == SpawnInfo::NIGHT; + } + default: { + return true; + } } } @@ -1331,27 +1358,30 @@ void dAcOdoor_c::startPushEventWithCallback(void *zevData) { } void dAcOdoor_c::startPullEvent(void *zevData) { - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: startPullEventWithoutCallback(zevData); break; case 1: startPullEventWithCallback(zevData); break; } } void dAcOdoor_c::startPushEvent(void *zevData) { - switch (field_0x5B3) { + switch (mEventCallbackType) { case 0: startPushEventWithoutCallback(zevData); break; case 1: startPushEventWithCallback(zevData); break; } } void dAcOdoor_c::startOpenEvent(void *zevData) { - if (isPlayerInFrontOfDoor()) { + if (checkPullDoor()) { startPullEvent(zevData); - } else if (field_0x5BB) { - Event event("KobunDoorPush", zevData, 100, 0x100001, nullptr, nullptr); - mEventRelated.scheduleEvent(event, 0); } else { - startPushEvent(zevData); + // Cawlin and Strich's room has an awkward angle when pushing. + if (mbKobunDoor) { + Event event("KobunDoorPush", zevData, 100, 0x100001, nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); + } else { + startPushEvent(zevData); + } } } @@ -1374,7 +1404,7 @@ void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) { } void dAcOdoor_c::startLockedEvent(void *zevData) { - if (isPlayerInFrontOfDoor()) { + if (checkPullDoor()) { startDoorPullLockedEvent(zevData); } else { startDoorPushLockedEvent(zevData); @@ -1386,7 +1416,7 @@ void dAcOdoor_c::pullLockedEventCallback(void *vDoor) { if (pDoor->hasFlowEntryPoint()) { pDoor->playInteractionLocked(); } - u16 flag = pDoor->fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + u16 flag = pDoor->getFailedToOpenFlag(); if (flag < 0xFF) { SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); } @@ -1397,7 +1427,7 @@ void dAcOdoor_c::pushLockedEventCallback(void *vDoor) { if (pDoor->hasFlowEntryPoint()) { pDoor->playInteractionLocked(); } - u16 flag = pDoor->fn_572_3F90(); + u16 flag = pDoor->getFailedToOpenFlag(); if (flag < 0xFF) { SceneflagManager::sInstance->setFlag(pDoor->mRoomID, flag); } @@ -1413,8 +1443,8 @@ extern "C" void increaseSmallKeyCounter(int amt); void dAcOdoor_c::unlockEventCallback(void *vDoor) { dAcOdoor_c *pDoor = static_cast(vDoor); void *zevData = getOarcZev("DoorAnim"); - if (pDoor->isPlayerInFrontOfDoor()) { - switch (pDoor->field_0x5B3) { + if (pDoor->checkPullDoor()) { + switch (pDoor->mEventCallbackType) { case 0: { Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); EventManager::setEvent(pDoor, &event, nullptr); @@ -1426,7 +1456,7 @@ void dAcOdoor_c::unlockEventCallback(void *vDoor) { } } else { - switch (pDoor->field_0x5B3) { + switch (pDoor->mEventCallbackType) { case 0: { Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); EventManager::setEvent(pDoor, &event, nullptr); @@ -1471,16 +1501,16 @@ void dAcOdoor_c::openCallbackCommon(void *vDoor) { void dAcOdoor_c::registerInEvent() { if (isInTimeDoorEvent()) { - fn_572_40F0(); + setTimeDoorEventActive(); } } void dAcOdoor_c::unkVirtFunc_0x6C() { - fn_572_4100(); + setTimeDoorEventInactive(); } void dAcOdoor_c::doInteraction(s32 interaction) { - if (getType() == SUBTYPE_7) { + if (getType() == DOOR_TEMPLE_MAIN) { void *zevData = getOarcZev("DoorF"); Event event("FTypeDoorOut", zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); mEventRelated.scheduleEvent(event, 0); @@ -1514,7 +1544,7 @@ void dAcOdoor_c::doInteraction(s32 interaction) { } } else { startOpenEvent(zevData); - if (field_0x5B1 == 2 && mSceneflag < 0xFF) { + if (mLockBehavior == LOCK_NEVER1 && mSceneflag < 0xFF) { SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); } } @@ -1529,7 +1559,7 @@ s32 dAcOdoor_c::getLockParameter() { return getFromParams(6, 0x1); } -s32 dAcOdoor_c::getSubtype2() { +s32 dAcOdoor_c::getLockBehavior() { return (mRotation.x >> 0) & 0xFF; } @@ -1537,19 +1567,19 @@ u8 dAcOdoor_c::getSceneflag() { return (mRotation.x >> 8) & 0xFF; } -u8 dAcOdoor_c::fn_572_3F60() { +u8 dAcOdoor_c::getDoorCallbackType() { return (mRotation.z >> 0) & 0xF; } -u8 dAcOdoor_c::fn_572_3F70() { +u8 dAcOdoor_c::getFrontRoomParam() { return (mRotation.z >> 4) & 0x3F; } -u8 dAcOdoor_c::fn_572_3F80() { +u8 dAcOdoor_c::getBackRoomParam() { return (mRotation.z >> 10) & 0x3F; } -u16 dAcOdoor_c::fn_572_3F90() { +u16 dAcOdoor_c::getFailedToOpenFlag() { return getParams2Lower() & 0xFF; } @@ -1589,76 +1619,76 @@ void dAcOdoor_c::setRoomId(s8 roomId) { mRoomID = roomId; } -void dAcOdoor_c::fn_572_4050(u32 flags) { +void dAcOdoor_c::setFlag(u32 flags) { mFlags = flags; } -void dAcOdoor_c::fn_572_4060(u8 in) { - field_0x5B3 = in; +void dAcOdoor_c::setEventCallbackType(u8 in) { + mEventCallbackType = in; } -void dAcOdoor_c::fn_572_4070(s8 in) { - field_0x5B4 = in; +void dAcOdoor_c::setFrontRoom(s8 in) { + mFrontRoomId = in; } -void dAcOdoor_c::fn_572_4080(s8 in) { - field_0x5B5 = in; +void dAcOdoor_c::setBackRoom(s8 in) { + mBackRoomId = in; } -void dAcOdoor_c::fn_572_4090() { - field_0x5B7 = true; +void dAcOdoor_c::setDoubleDoor() { + mbDoubleDoor = true; } -void dAcOdoor_c::fn_572_40A0() { - field_0x5B7 = false; +void dAcOdoor_c::setNotDoubleDoor() { + mbDoubleDoor = false; } -void dAcOdoor_c::fn_572_40B0() { - field_0x5B8 = true; +void dAcOdoor_c::setSingleDoor() { + mbSingleDoor = true; } -void dAcOdoor_c::fn_572_40C0() { - field_0x5B8 = false; +void dAcOdoor_c::setNotSingleDoor() { + mbSingleDoor = false; } -void dAcOdoor_c::fn_572_40D0() { - field_0x5B9 = true; +void dAcOdoor_c::setInSandshipBoss() { + mbInSandshipBoss = true; } -bool dAcOdoor_c::fn_572_40E0() const { +bool dAcOdoor_c::isTimeDoorEventActive() const { return mFlags & 1; } -void dAcOdoor_c::fn_572_40F0() { - fn_572_4050(mFlags | 1); +void dAcOdoor_c::setTimeDoorEventActive() { + setFlag(mFlags | 1); } -void dAcOdoor_c::fn_572_4100() { - fn_572_4050(mFlags & ~1); +void dAcOdoor_c::setTimeDoorEventInactive() { + setFlag(mFlags & ~1); } -void dAcOdoor_c::fn_572_4110() { - fn_572_4050(mFlags | 2); +void dAcOdoor_c::setTimeEffected() { + setFlag(mFlags | 2); } -void dAcOdoor_c::fn_572_4120() { - fn_572_4050(mFlags & ~2); +void dAcOdoor_c::setTimeStatic() { + setFlag(mFlags & ~2); } -bool dAcOdoor_c::fn_572_4130(bool &b) const { - checkRoom(field_0x5B4, b); +bool dAcOdoor_c::checkFrontRoom(bool &b) const { + checkRoom(mFrontRoomId, b); } -bool dAcOdoor_c::fn_572_4140(bool &b) const { - checkRoom(field_0x5B5, b); +bool dAcOdoor_c::checkBackRoom(bool &b) const { + checkRoom(mBackRoomId, b); } -bool dAcOdoor_c::fn_572_4150(bool &b) const { +bool dAcOdoor_c::checkRooms(bool &b) const { bool b0, b1; - if (!fn_572_4130(b0)) { + if (!checkFrontRoom(b0)) { return false; } - if (!fn_572_4140(b1)) { + if (!checkBackRoom(b1)) { return false; } b = b0 && b1; @@ -1674,7 +1704,7 @@ void dAcOdoor_c::triggerExit() { } bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const { - return s32(mParams & 0x3F) == SUBTYPE_4 && field_0x5B5 == 1 && + return s32(mParams & 0x3F) == DOOR_TEMPLE_SIDE && mBackRoomId == 1 && StoryflagManager::sInstance->getFlag(STORYFLAG_342) && dScGame_c::isCurrentStage(sStageF402); } @@ -1692,40 +1722,41 @@ void dAcOdoor_c::transitionPullRoomFlags() const { dStage_c::GetInstance()->updateRoomFlags(getField_0x5B5(), getField_0x5B4()); } -bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const { +bool dAcOdoor_c::isPositionInFrontOfDoor(const mVec3_c &point) const { s32 diff = mRotation.y - (point - mPosition).atan2sX_Z(); return mAng::abs(diff) <= 0x4000; } -bool dAcOdoor_c::isPlayerInFrontOfDoor() const { - return fn_572_4370(dAcPy_c::GetLink()->mPosition); +bool dAcOdoor_c::checkPullDoor() const { + return isPositionInFrontOfDoor(dAcPy_c::GetLink()->mPosition); } bool dAcOdoor_c::hasFlowEntryPoint() { return getFromParams(16, 0xFFFF); } -bool dAcOdoor_c::fn_572_4430() const { +bool dAcOdoor_c::isTimeEffected() const { return mFlags & 2; } -void dAcOdoor_c::fn_572_4440() { +void dAcOdoor_c::setDoorKnobPosition() { mVec3_c pos; - if (getType() == SUBTYPE_7) { + if (getType() == DOOR_TEMPLE_MAIN) { pos.set(mPosition); pos.y += 150.f; } else { mMtx_c m; mAnmChr.getModel().getNodeWorldMtx(1, m); - m.transM(sVec0); - m.multVec(sVec1, pos); + m.transM(sDoorknobOffset0); + m.multVec(sDoorknobOffset1, pos); } mPositionCopy2.set(pos); mPositionCopy3.set(pos); } bool dAcOdoor_c::isPlayerInteractable() const { - mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + mVec3_c v = dAcPy_c::GetLink()->mPosition; + v -= mPosition; v.rotY(-mRotation.y); if (v.x < getInteractionMinX()) { @@ -1744,7 +1775,8 @@ bool dAcOdoor_c::isPlayerInteractable() const { } bool dAcOdoor_c::isPlayerInteractableLocked() const { - mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + mVec3_c v = dAcPy_c::GetLink()->mPosition; + v -= mPosition; v.rotY(-mRotation.y); v.x += 80.f; diff --git a/src/REL/d/a/obj/d_a_obj_door_boss.cpp b/src/REL/d/a/obj/d_a_obj_door_boss.cpp index 3331f488..f218cc76 100644 --- a/src/REL/d/a/obj/d_a_obj_door_boss.cpp +++ b/src/REL/d/a/obj/d_a_obj_door_boss.cpp @@ -18,6 +18,10 @@ STATE_DEFINE(dAcOdoorBoss_c, Close); STATE_DEFINE(dAcOdoorBoss_c, Idle); STATE_DEFINE(dAcOdoorBoss_c, BeforeTimeShift); +bool dAcOdoorBoss_c::canOpen() { + // Not implemented - Used to emit dtor + return true; +} void dAcOdoorBoss_c::initializeState_UnlockWait() {} void dAcOdoorBoss_c::executeState_UnlockWait() {} void dAcOdoorBoss_c::finalizeState_UnlockWait() {} diff --git a/src/REL/d/a/obj/d_a_obj_shutter.cpp b/src/REL/d/a/obj/d_a_obj_shutter.cpp index 15280653..ca344cf2 100644 --- a/src/REL/d/a/obj/d_a_obj_shutter.cpp +++ b/src/REL/d/a/obj/d_a_obj_shutter.cpp @@ -6,6 +6,11 @@ STATE_DEFINE(dAcOShutter_c, Wait); STATE_DEFINE(dAcOShutter_c, Open); STATE_DEFINE(dAcOShutter_c, Close); +bool dAcOShutter_c::canOpen() { + // Not implemented - Used to emit dtor + return true; +} + void dAcOShutter_c::initializeState_Wait() {} void dAcOShutter_c::executeState_Wait() {} void dAcOShutter_c::finalizeState_Wait() {} diff --git a/src/REL/d/a/obj/d_a_obj_shutter_change_scene.cpp b/src/REL/d/a/obj/d_a_obj_shutter_change_scene.cpp index 998f6580..6dfd1877 100644 --- a/src/REL/d/a/obj/d_a_obj_shutter_change_scene.cpp +++ b/src/REL/d/a/obj/d_a_obj_shutter_change_scene.cpp @@ -1,9 +1,16 @@ #include "d/a/obj/d_a_obj_shutter_change_scene.h" +#include "f/f_base.h" + SPECIAL_ACTOR_PROFILE( OBJ_SHUTTER_CHANGE_SCENE, dAcOShutterChangeScene_c, fProfile::OBJ_SHUTTER_CHANGE_SCENE, 0x18A, 0, 6 ); +bool dAcOShutterChangeScene_c::canOpen() { + // Not implemented - Used to emit dtor + return true; +} + STATE_DEFINE(dAcOShutterChangeScene_c, WaitOpenShutter); STATE_DEFINE(dAcOShutterChangeScene_c, WaitOpenShutterForEvent); STATE_DEFINE(dAcOShutterChangeScene_c, OpenShutter); diff --git a/src/REL/d/a/obj/d_a_obj_tr_shutter_cs.cpp b/src/REL/d/a/obj/d_a_obj_tr_shutter_cs.cpp index 9cfaeb74..d7a0e3c6 100644 --- a/src/REL/d/a/obj/d_a_obj_tr_shutter_cs.cpp +++ b/src/REL/d/a/obj/d_a_obj_tr_shutter_cs.cpp @@ -5,6 +5,10 @@ SPECIAL_ACTOR_PROFILE(OBJ_TR_SHUTTER_CS, dAcOTrlyShtrChgScn_c, fProfile::OBJ_TR_ STATE_DEFINE(dAcOTrlyShtrChgScn_c, Wait); STATE_DEFINE(dAcOTrlyShtrChgScn_c, OpenEvent); +bool dAcOTrlyShtrChgScn_c::canOpen() { + // Not implemented - Used to emit dtor + return true; +} void dAcOTrlyShtrChgScn_c::initializeState_Wait() {} void dAcOTrlyShtrChgScn_c::executeState_Wait() {} void dAcOTrlyShtrChgScn_c::finalizeState_Wait() {} diff --git a/src/REL/d/a/obj/d_a_obj_trolley_shutter.cpp b/src/REL/d/a/obj/d_a_obj_trolley_shutter.cpp index d561937e..fbc33114 100644 --- a/src/REL/d/a/obj/d_a_obj_trolley_shutter.cpp +++ b/src/REL/d/a/obj/d_a_obj_trolley_shutter.cpp @@ -5,6 +5,10 @@ SPECIAL_ACTOR_PROFILE(OBJ_TROLLEY_SHUTTER, dAcOTrolleyShutter_c, fProfile::OBJ_T STATE_DEFINE(dAcOTrolleyShutter_c, Wait); STATE_DEFINE(dAcOTrolleyShutter_c, OpenEvent); +bool dAcOTrolleyShutter_c::canOpen() { + // Not implemented - Used to emit dtor + return true; +} void dAcOTrolleyShutter_c::initializeState_Wait() {} void dAcOTrolleyShutter_c::executeState_Wait() {} void dAcOTrolleyShutter_c::finalizeState_Wait() {} -- cgit v1.2.3 From 466ddb54013e1adcbd7eef1a48ddfc9cfc956973 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 27 Nov 2025 10:51:12 +0100 Subject: Fix warnings --- src/REL/d/a/obj/d_a_obj_door.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') 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 927461e0..a0a442b0 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -1676,11 +1676,11 @@ void dAcOdoor_c::setTimeStatic() { } bool dAcOdoor_c::checkFrontRoom(bool &b) const { - checkRoom(mFrontRoomId, b); + return checkRoom(mFrontRoomId, b); } bool dAcOdoor_c::checkBackRoom(bool &b) const { - checkRoom(mBackRoomId, b); + return checkRoom(mBackRoomId, b); } bool dAcOdoor_c::checkRooms(bool &b) const { -- cgit v1.2.3