From 4c1290dad7821fda93a215d20c79cdb0c11ad55a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 00:13:28 -0500 Subject: [PATCH 1/8] functions declared and empty definitions --- include/d/a/obj/d_a_obj_door.h | 237 ++++++++++++++- include/d/a/obj/d_a_obj_door_base.h | 19 +- src/REL/d/a/obj/d_a_obj_door.cpp | 455 ++++++++++++++++++++++++++++ 3 files changed, 709 insertions(+), 2 deletions(-) diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index 6681801e..d3da304f 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -1,16 +1,251 @@ #ifndef D_A_OBJ_DOOR_H #define D_A_OBJ_DOOR_H +#include "common.h" #include "d/a/obj/d_a_obj_door_base.h" +#include "m/m3d/m_anmmdl.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/d_flow_mgr.h" class dAcOdoor_c : public dAcObjDoor_c { public: - dAcOdoor_c() {} + enum Subtype_e { + SUBTYPE_0, + SUBTYPE_1, + SUBTYPE_2, + SUBTYPE_3, + SUBTYPE_4, + SUBTYPE_5, + SUBTYPE_6, + SUBTYPE_7, + SUBTYPE_8, + }; + +public: + dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiter0(this), mEmmiter1(this) {} virtual ~dAcOdoor_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual int actorExecuteInEvent() override; + virtual void registerInEvent() override; + virtual void unkVirtFunc_0x6C() override; + virtual void doInteraction(s32 /* InteractionType */) override; + virtual bool canOpen() override; + + /** */ bool isLocked(); + /** fn_572_33E0 - I Think this gets the Door open range*/ + static f32 fn_572_33E0(); // -80.f + + /** */ + void startPullEventWithoutCallback(void *zevData); + + /** */ + void startPullEventWithCallback(void *zevData); + + /** */ + void startPushEventWithoutCallback(void *zevData); + + /** */ + void startPushEventWithCallback(void *zevData); + + /** */ + void startPullEvent(void *zevData); + + /** */ + void startPushEvent(void *zevData); + + /** */ + void startOpenEvent(void *zevData); + + /** */ + static void doorPullEventCallback(dAcOdoor_c *); + + /** */ + static void doorPushEventCallback(dAcOdoor_c *); + + /** */ + void startDoorPullLockedEvent(void *zevData); + + /** */ + void startDoorPushLockedEvent(void *zevData); + + /** */ + void startLockedEvent(void *zevData); + + /** */ + static void pullLockedEventCallback(dAcOdoor_c *); + + /** */ + static void pushLockedEventCallback(dAcOdoor_c *); + + /** */ + void startUnlockEvent(); + + /** */ + static void unlockEventCallback(dAcOdoor_c *); + + /** */ + static void openCallbackCommon(dAcOdoor_c *); + + /** */ + bool isKeyLocked(); // getFromParams(6, 0x1) + + /** */ + u8 getSubtype2(); // (mRotation.x >> 0) & 0xFF + + /** */ + u8 getSceneflag(); // (mRotation.x >> 8) & 0xFF + + /** fn_572_3F60 */ + u8 fn_572_3F60(); // (mRotation.z >> 0) & 0xF + + /** fn_572_3F70 */ + u8 fn_572_3F70(); // (mRotation.z >> 4) & 0x3F + + /** fn_572_3F80 */ + u8 fn_572_3F80(); // (mRotation.z >> 10) & 0x3F + + /** fn_572_3F90 */ + u8 fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + + /** fn_572_3FC0 */ + static f32 getInteractionMinX(); // -80.f + + /** fn_572_3FD0 */ + static f32 getInteractionMaxX(); // 80.f + + /** fn_572_3FE0 */ + static f32 getInteractionMinZ(); // -100.f + + /** fn_572_3FF0 */ + static f32 getInteractionMaxZ(); // 100.f + + /** fn_572_4000 */ + static f32 getInteractionLockMinX(); // -160.f + + /** fn_572_4010 */ + static f32 getInteractionLockMaxX(); // 160.f + + /** fn_572_4020 */ + static f32 getInteractionLockMinZ(); // -100.f + + /** fn_572_4030 */ + static f32 getInteractionLockMaxZ(); // 100.f + + /** */ + void setRoomId(s8 roomId); // mRoomId = roomId; + + /** fn_572_4050 */ + void fn_572_4050(u32 flags); // field_0x5A8 = flags + + /** fn_572_4060 */ + void fn_572_4060(u8); // field_0x5B3 = in + + /** fn_572_4070 */ + void fn_572_4070(s8); // field_0x5B4 = in + + /** fn_572_4080 */ + void fn_572_4080(s8); // field_0x5B5 = in + + /** fn_572_4090 */ + void fn_572_4090(); // field_0x5B7 = true + + /** fn_572_40A0 */ + void fn_572_40A0(); // field_0x5B7 = false + + /** fn_572_40B0 */ + void fn_572_40B0(); // field_0x5B8 = true + + /** fn_572_40C0 */ + void fn_572_40C0(); // field_0x5B8 = false + + /** fn_572_40D0 */ + void fn_572_40D0(); // field_0x5B9 = true + + /** fn_572_40E0 */ + bool fn_572_40E0() const; // field_0x5A8 & 1 + + /** fn_572_40F0 */ + void fn_572_40F0(); // field_0x5A8 |= 1 + + /** fn_572_4100 */ + void fn_572_4100(); // field_0x5A8 &= ~1 + + /** fn_572_4110 */ + void fn_572_4110(); // field_0x5A8 |= 2 + + /** fn_572_4120 */ + void fn_572_4120(); // field_0x5A8 &= ~2 + + /** fn_572_4130 */ + bool fn_572_4130(bool &b) const; // checkRoom(field_0x5B4,b) + + /** fn_572_4140 */ + bool fn_572_4140(bool &b) const; // checkRoom(field_0x5B5,b) + + /** fn_572_4150 */ + bool fn_572_4150(bool &b) const; // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 + + /** */ + void triggerExit(); + + /** */ + bool isLeavingSealedTempleSideDoorPostSkyKeep() const; + + /** fn_572_4310 */ + void transitionPushRoomFlags() const; + + /** fn_572_4320 */ + void fn_572_4320() const; // nop + + /** fn_572_4430 */ + bool transitionPullRoomFlags() const; + + /** fn_572_4340 */ + void fn_572_4340() const; // nop + + /** fn_572_4370 */ + bool fn_572_4370(const mVec3_c &point) const; // Is in front of door + + /** */ + bool isPlayerInFrontOfDoor() const; + + /** */ + bool hasFlowEntryPoint() const; // getFromParams(16, 0xFFFF) + + /** fn_572_4430 */ + bool fn_572_4430() const; // field_0x5A8 & 2 + + /** fn_572_4440 */ + void fn_572_4440(); // Sets the Postion Copies + + /** */ + bool isPlayerInteractable() const; + + /** fn_572_4600 */ + bool isPlayerInteractableLocked() const; + + /** */ + void playInteractionLocked() const; + private: + /* 0x33C */ m3d::smdl_c mMdl0; + /* 0x358 */ m3d::smdl_c mMdl1; + /* 0x374 */ m3d::mdlAnmChr mAnmChr; + /* 0x3DC */ ActorEventRelated mEventRelated; + /* 0x42C */ dFlowMgr_c mFlowMgr; + /* 0x4E8 */ dEmitter_c mEmmiter0; + /* 0x51C */ dEmitter_c mEmmiter1; }; #endif diff --git a/include/d/a/obj/d_a_obj_door_base.h b/include/d/a/obj/d_a_obj_door_base.h index 5cfc1110..854c1ba2 100644 --- a/include/d/a/obj/d_a_obj_door_base.h +++ b/include/d/a/obj/d_a_obj_door_base.h @@ -1,11 +1,28 @@ #ifndef D_A_OBJ_DOOR_BASE_H #define D_A_OBJ_DOOR_BASE_H +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "f/f_list_mg.h" // Ghidra: ActorDoorBase // size: // non-official name -class dAcObjDoor_c : public dAcObjBase_c {}; +class dAcObjDoor_c : public dAcObjBase_c { +public: + dAcObjDoor_c(); + ~dAcObjDoor_c() {} + + virtual bool canOpen() = 0; + virtual bool hasVisitedRoom(); + virtual void vt_0x88(); + virtual void vt_0x8C(); + +protected: + dAcRef_c mDoorRef; + +private: + static fLiMgBa_c sDoorList; +}; #endif diff --git a/src/REL/d/a/obj/d_a_obj_door.cpp b/src/REL/d/a/obj/d_a_obj_door.cpp index 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 {} From c59fe14362b65bf3df8b6bc7f41f73dc0719ee89 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 02:44:18 -0500 Subject: [PATCH 2/8] some Progress --- include/d/a/obj/d_a_obj_base.h | 5 + include/d/a/obj/d_a_obj_door.h | 50 +++++-- src/REL/d/a/obj/d_a_obj_door.cpp | 222 +++++++++++++++++++++++++++++-- 3 files changed, 255 insertions(+), 22 deletions(-) diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 3deba1ae..039def40 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -181,6 +181,11 @@ public: const char *name, u32 roomId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, const mVec3_c *scale, u32 params2, u16 id, s8 viewclipId ); + static dAcObjBase_c *create( + dAcObjBase_c *, fProfile::PROFILE_NAME_e actorId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, + const mVec3_c *scale, u32 params2, u32 roomId + ); + static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiNdBa_c *refList, dAcObjBase_c *parent); static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent); bool isPlayer(); diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index d3da304f..1c3eebca 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -2,26 +2,37 @@ #define D_A_OBJ_DOOR_H #include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_door_base.h" #include "m/m3d/m_anmmdl.h" #include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" #include "m/m_vec.h" #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/d_flow_mgr.h" +struct dTimeBits { + dTimeBits() : field_0x00(false), field_0x01(false) {} + bool field_0x00; + bool field_0x01; +}; + +class dAcOLock_c; + class dAcOdoor_c : public dAcObjDoor_c { public: enum Subtype_e { - SUBTYPE_0, - SUBTYPE_1, - SUBTYPE_2, - SUBTYPE_3, - SUBTYPE_4, - SUBTYPE_5, - SUBTYPE_6, - SUBTYPE_7, - SUBTYPE_8, + SUBTYPE_0, ///< DoorA00 + SUBTYPE_1, ///< DoorA01 + SUBTYPE_2, ///< DoorC00 + SUBTYPE_3, ///< DoorC01 + SUBTYPE_4, ///< DoorB00 + SUBTYPE_5, ///< DoorE + SUBTYPE_6, ///< DoorA02 + SUBTYPE_7, ///< DoorF + SUBTYPE_8, ///< DoorH }; public: @@ -98,10 +109,10 @@ public: static void openCallbackCommon(dAcOdoor_c *); /** */ - bool isKeyLocked(); // getFromParams(6, 0x1) + s32 getKeyParameter(); // getFromParams(6, 0x1) /** */ - u8 getSubtype2(); // (mRotation.x >> 0) & 0xFF + s32 getSubtype2(); // (mRotation.x >> 0) & 0xFF /** */ u8 getSceneflag(); // (mRotation.x >> 8) & 0xFF @@ -238,6 +249,11 @@ public: /** */ void playInteractionLocked() const; +public: + // defined in main dol + bool isConnectedToOtherDoor() const; + dAcRef_c &getConnectedDoorRef(); // return mConnectedDoor; + private: /* 0x33C */ m3d::smdl_c mMdl0; /* 0x358 */ m3d::smdl_c mMdl1; @@ -246,6 +262,18 @@ private: /* 0x42C */ dFlowMgr_c mFlowMgr; /* 0x4E8 */ dEmitter_c mEmmiter0; /* 0x51C */ dEmitter_c mEmmiter1; + /* 0x550 */ dTimeBits mTimeBits; + /* 0x554 */ dAcRef_c mConnectedDoor; + /* 0x560 */ dAcRef_c mLock; + /* 0x56C */ dAcRef_c mObjRef; + /* 0x578 */ mMtx_c mMtx; + /* 0x5A8 */ u8 _0x584[0x5B1 - 0x5A8]; + /* 0x5B1 */ u8 field_0x5B1; ///< + /* 0x5B2 */ u8 mSceneflag; ///< Used for unlocking the door + /* 0x5B3 */ u8 _0x5B3[0x5B7 - 0x5B3]; + /* 0x5B7 */ bool field_0x5B7; + /* 0x5B8 */ u8 _0x5B8[0x5BB - 0x5B8]; + /* 0x5BB */ bool field_0x5BB; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_door.cpp b/src/REL/d/a/obj/d_a_obj_door.cpp index a19abfe3..1dfaee77 100644 --- a/src/REL/d/a/obj/d_a_obj_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_door.cpp @@ -1,10 +1,23 @@ #include "d/a/obj/d_a_obj_door.h" #include "common.h" +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_lock.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_m3d_g_aab.h" #include "d/d_room.h" #include "d/d_sc_game.h" #include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "egg/math/eggMath.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "sized_string.h" @@ -14,6 +27,10 @@ SPECIAL_ACTOR_PROFILE(OBJ_DOOR, dAcOdoor_c, fProfile::OBJ_DOOR, 0x188, 0, 7); namespace { +static mVec3_c sVecs[] = { + mVec3_c(70.f, 0.f, 0.f), mVec3_c(52.f, 110.f, 0.f), mVec3_c(0.f, 0.f, 70.f), mVec3_c(0.f, 0.f, -70.f) +}; + const char *const DoorAnim = "DoorAnim"; const char *const DoorAnimPull = "DoorAnimPull"; const char *const DoorAnimPush = "DoorAnimPush"; @@ -75,7 +92,7 @@ static u8 sDoorUnknown[2] = {0, 1}; bool getDoorUnknown(u8 search, u8 &idx) { bool found = false; int i = 0; - while (!found && i < ARRAY_LENGTH(sDoorUnknown)) { + while (!found && i <= (int)ARRAY_LENGTH(sDoorUnknown) - 1) { if (sDoorUnknown[i] == search) { found = true; } else { @@ -90,12 +107,12 @@ bool getDoorUnknown(u8 search, u8 &idx) { return found; } -static u32 sSpecialDoorMapTypes[5] = { +static s32 sSpecialDoorMapTypes[5] = { sDoorMappings[3].mType, sDoorMappings[3].mType, sDoorMappings[4].mType, sDoorMappings[5].mType, sDoorMappings[6].mType, }; -bool isDoorSpecial(u32 type) { +bool isDoorSpecial(s32 type) { bool found = false; int i = 0; while (!found && i <= (int)ARRAY_LENGTH(sSpecialDoorMapTypes) - 1) { @@ -167,7 +184,7 @@ const char *const DoorE_N = "DoorE_N"; bool dAcOdoor_c::createHeap() { s32 type = getFromParams(0, 0x3F); - if (type == 7) { + if (type == SUBTYPE_7) { nw4r::g3d::ResFile resFile(getOarcResFile(DoorF)); if (!resFile.IsValid()) { return false; @@ -224,10 +241,12 @@ bool dAcOdoor_c::createHeap() { } int dAcOdoor_c::actorCreate() { - mSubtype = getFromParams(0, 0x3F); + // NONMATCHING - Regalloc issues + s32 subtype = getFromParams(0, 0x3F); + mSubtype = subtype; changeLoadedEntitiesWithSet(); - if (mSubtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { + if (subtype == SUBTYPE_5 && !dScGame_c::isCurrentStage("B301") && !dScGame_c::isCurrentStage("D301_1")) { fn_572_4110(); } else { fn_572_4120(); @@ -235,12 +254,193 @@ int dAcOdoor_c::actorCreate() { CREATE_ALLOCATOR(dAcOdoor_c); - // if () + mSceneflag = getSceneflag(); + + if (getKeyParameter() == true) { + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + mLock.link( + static_cast( + create(this, fProfile::OBJ_SHUTTER_LOCK, 0, nullptr, nullptr, nullptr, 0, 0x3F) + ) + ); + } + } else { + u8 type = getSubtype2(); + if (type <= 6) { + field_0x5B1 = type; + } else { + field_0x5B1 = 0; + } + } + + u8 idx; + if (!getDoorUnknown(fn_572_3F60(), idx)) { + idx = 0; + } + + fn_572_4060(idx); + fn_572_4070(fn_572_3F70()); + fn_572_4080(fn_572_3F80()); + + mRotation.z = mAng(0); + mRotation.x = mAng(0); + { + s32 roomId = mRoomID; + addActorToRoom(-1); + setRoomId(roomId); + } + + if (isDoorSpecial(subtype)) { + fn_572_4090(); + } else { + fn_572_40A0(); + } + + if ((s32)getFromParams(0, 0x3F) == SUBTYPE_7) { + mAnmChr.setAnm(DoorF_Open, m3d::PLAY_MODE_4, 0.f); + mAnmChr.setFrame(mAnmChr.getAnm().getStartFrame()); + mAnmChr.getModel().setPriorityDraw(0x1C, 0); + } else { + mAnmChr.setAnm(DoorAnimPull, m3d::PLAY_MODE_4, 0.f); + mAnmChr.setFrame(mAnmChr.getAnm().getStartFrame()); + if (fn_572_4430()) { + mMdl0.setPriorityDraw(0xF, 0); + mMdl1.setPriorityDraw(0xB, 0); + } else { + mMdl0.setPriorityDraw(0x1C, 0); + } + } + + bool inAcademy = dScGame_c::isCurrentStage("F001r"); + if (inAcademy) { + inAcademy = mVec3_c(1832.5f, 0.f, -1978.0f).squareDistanceToXZ(mPosition) < 100.f; + } + field_0x5BB = inAcademy; + + return SUCCEEDED; } -int dAcOdoor_c::actorPostCreate() {} +extern "C" void fn_80067290(dTimeBits *pBits, s32 roomId, const mVec3_c &pos, f32); -int dAcOdoor_c::doDelete() {} +int dAcOdoor_c::actorPostCreate() { + if (field_0x5B7) { + if (true) { + bool foundPair = false; + dAcOdoor_c *pDoor = + static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, nullptr)); + while (!foundPair && pDoor != nullptr) { + if (mID != pDoor->mID && pDoor->field_0x5B7 && !pDoor->isConnectedToOtherDoor() && + mPosition.squareDistance(pDoor->mPosition) < 40000.f) { + foundPair = true; + this->getConnectedDoorRef().link(pDoor); + pDoor->getConnectedDoorRef().link(this); + if (getKeyParameter() == true) { + this->fn_572_40B0(); + pDoor->fn_572_40C0(); + } else { + this->fn_572_40C0(); + pDoor->fn_572_40B0(); + } + } + pDoor = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_DOOR, pDoor)); + } + + if (!foundPair) { + fn_572_40B0(); + } + } + } else { + fn_572_40B0(); + } + + bool gndChk = dBgS_ObjGndChk::CheckPos(mPosition + mVec3_c::Ey * 10.f); + if (gndChk) { + mLightingInfo.mLightingCode = dBgS_ObjGndChk::GetLightingCode(); + setPolyAttrs(dBgS_ObjGndChk::GetInstance()); + } + + if (isInOuterSandship()) { + fn_572_40D0(); + unsetActorProperty(AC_PROP_0x1); + + if (gndChk) { + dBgS *pBgS = dBgS::GetInstance(); + if (pBgS != nullptr) { + const dAcObjBase_c *pObj = pBgS->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + if (pObj) { + mObjRef.link(const_cast(pObj)); + mVec3_c v(mPosition - pObj->mPosition); + v.y = dBgS_ObjGndChk::GetGroundHeight() - pObj->mPosition.y; + + v.rotY(-pObj->mRotation.y); + + mAng rotY = mRotation.y - pObj->mRotation.y; + mMtx.transS(v); + mMtx.YrotM(rotY); + } + } + } + } + + if (!mObjRef.isLinked()) { + s32 type = getFromParams(0, 0x3F); + updateMatrix(); + mAnmChr.getModel().setLocalMtx(mWorldMtx); + mAnmChr.getModel().calc(false); + + if (type != SUBTYPE_7) { + mMtx_c m; + mAnmChr.getModel().getNodeWorldMtx(1, m); + m.transM(sVecs[0]); + mMdl0.setLocalMtx(m); + if (fn_572_4430()) { + mMdl1.setLocalMtx(m); + } + } + + dAcOLock_c *pLock = mLock.get(); + if (pLock == nullptr) { + fn_572_4440(); + } else { + mPositionCopy2.set(pLock->mPosition); + mPositionCopy3.set(pLock->mPosition); + } + mVec3_c max(999999.f, 999999.f, 999999.f); + mVec3_c min(-999999.f, -999999.f, -999999.f); + + if (type == SUBTYPE_7) { + mAnmChr.getModel().getBounds(&min, &max); + } else { + mMtx_c local; + mMdl0.getBounds(&min, &max); + mMdl0.getLocalMtx(local); + + mMtx_c world = mWorldMtx; + world.inverse(); + + mVec3_c minPos = min; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); + + // ... + + mBoundingBox.Set(min, max); + } + } + + if (fn_572_4430()) { + fn_80067290(&mTimeBits, mRoomID, mPosition, 200.f); + } + + mCullingDistance = EGG::Math::maxNumber(); + + return SUCCEEDED; +} + +int dAcOdoor_c::doDelete() { + changeLoadedEntitiesNoSet(); + return SUCCEEDED; +} int dAcOdoor_c::actorExecuteInEvent() {} @@ -317,10 +517,10 @@ void dAcOdoor_c::unkVirtFunc_0x6C() {} void dAcOdoor_c::doInteraction(s32 interaction) {} /** */ -bool dAcOdoor_c::isKeyLocked() {} // getFromParams(6, 0x1) +s32 dAcOdoor_c::getKeyParameter() {} // getFromParams(6, 0x1) /** */ -u8 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF +s32 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF /** */ u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF From 43705afa26facc8a043cb09778c19b21c67b2630 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 02:49:23 -0500 Subject: [PATCH 3/8] fix compile due to new door empty virtual function --- include/d/a/obj/d_a_obj_door_boss.h | 2 ++ include/d/a/obj/d_a_obj_shutter.h | 2 ++ include/d/a/obj/d_a_obj_shutter_change_scene.h | 2 ++ include/d/a/obj/d_a_obj_tr_shutter_cs.h | 2 ++ include/d/a/obj/d_a_obj_trolley_shutter.h | 2 ++ 5 files changed, 10 insertions(+) diff --git a/include/d/a/obj/d_a_obj_door_boss.h b/include/d/a/obj/d_a_obj_door_boss.h index 945238a2..b4ef8602 100644 --- a/include/d/a/obj/d_a_obj_door_boss.h +++ b/include/d/a/obj/d_a_obj_door_boss.h @@ -10,6 +10,8 @@ public: dAcOdoorBoss_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOdoorBoss_c() {} + virtual bool canOpen() override; + STATE_FUNC_DECLARE(dAcOdoorBoss_c, UnlockWait); STATE_FUNC_DECLARE(dAcOdoorBoss_c, CorrectKey); STATE_FUNC_DECLARE(dAcOdoorBoss_c, KeyInsertInitialInterval); diff --git a/include/d/a/obj/d_a_obj_shutter.h b/include/d/a/obj/d_a_obj_shutter.h index e2fa570a..d33554c8 100644 --- a/include/d/a/obj/d_a_obj_shutter.h +++ b/include/d/a/obj/d_a_obj_shutter.h @@ -10,6 +10,8 @@ public: dAcOShutter_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOShutter_c() {} + virtual bool canOpen() override; + STATE_FUNC_DECLARE(dAcOShutter_c, Wait); STATE_FUNC_DECLARE(dAcOShutter_c, Open); STATE_FUNC_DECLARE(dAcOShutter_c, Close); diff --git a/include/d/a/obj/d_a_obj_shutter_change_scene.h b/include/d/a/obj/d_a_obj_shutter_change_scene.h index 8479e760..71a8b17f 100644 --- a/include/d/a/obj/d_a_obj_shutter_change_scene.h +++ b/include/d/a/obj/d_a_obj_shutter_change_scene.h @@ -10,6 +10,8 @@ public: dAcOShutterChangeScene_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOShutterChangeScene_c() {} + virtual bool canOpen() override; + STATE_FUNC_DECLARE(dAcOShutterChangeScene_c, WaitOpenShutter); STATE_FUNC_DECLARE(dAcOShutterChangeScene_c, WaitOpenShutterForEvent); STATE_FUNC_DECLARE(dAcOShutterChangeScene_c, OpenShutter); diff --git a/include/d/a/obj/d_a_obj_tr_shutter_cs.h b/include/d/a/obj/d_a_obj_tr_shutter_cs.h index f8b074fe..7f2d150a 100644 --- a/include/d/a/obj/d_a_obj_tr_shutter_cs.h +++ b/include/d/a/obj/d_a_obj_tr_shutter_cs.h @@ -10,6 +10,8 @@ public: dAcOTrlyShtrChgScn_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOTrlyShtrChgScn_c() {} + virtual bool canOpen() override; + STATE_FUNC_DECLARE(dAcOTrlyShtrChgScn_c, Wait); STATE_FUNC_DECLARE(dAcOTrlyShtrChgScn_c, OpenEvent); diff --git a/include/d/a/obj/d_a_obj_trolley_shutter.h b/include/d/a/obj/d_a_obj_trolley_shutter.h index 86ea3dad..f7ed3c3c 100644 --- a/include/d/a/obj/d_a_obj_trolley_shutter.h +++ b/include/d/a/obj/d_a_obj_trolley_shutter.h @@ -10,6 +10,8 @@ public: dAcOTrolleyShutter_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOTrolleyShutter_c() {} + virtual bool canOpen() override; + STATE_FUNC_DECLARE(dAcOTrolleyShutter_c, Wait); STATE_FUNC_DECLARE(dAcOTrolleyShutter_c, OpenEvent); From 6052e667c632b4b22deffa42130a7022c35c9507 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 25 Nov 2025 00:37:28 -0500 Subject: [PATCH 4/8] updateInEvent --- include/d/a/obj/d_a_obj_door.h | 32 +- include/d/a/obj/d_a_obj_fence.h | 10 +- include/d/a/obj/d_a_obj_lock.h | 11 +- include/d/col/bg/d_bg_s_gnd_chk.h | 3 + include/d/d_player_act.h | 3 +- include/d/d_room.h | 3 + include/d/d_stage.h | 1 + include/f/f_base.h | 2 +- include/toBeSorted/actor_event.h | 1 + src/REL/d/a/obj/d_a_obj_door.cpp | 671 ++++++++++++++++++++++++++++-- 10 files changed, 700 insertions(+), 37 deletions(-) diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index 1c3eebca..a76dc4dc 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -36,7 +36,7 @@ public: }; public: - dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiter0(this), mEmmiter1(this) {} + dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiterL(this), mEmmiterR(this) {} virtual ~dAcOdoor_c() {} virtual int doDelete() override; @@ -160,7 +160,7 @@ public: void fn_572_4050(u32 flags); // field_0x5A8 = flags /** fn_572_4060 */ - void fn_572_4060(u8); // field_0x5B3 = in + void fn_572_4060(s8); // field_0x5B3 = in /** fn_572_4070 */ void fn_572_4070(s8); // field_0x5B4 = in @@ -250,27 +250,45 @@ public: void playInteractionLocked() const; public: - // defined in main dol + s32 getType() const { + return getFromParams(0, 0x3F); + } + s32 getField_0x5B4() const { + return field_0x5B4; + } + s32 getField_0x5B5() const { + return field_0x5B5; + } + +public: // Functions in this section defined in main dol bool isConnectedToOtherDoor() const; dAcRef_c &getConnectedDoorRef(); // return mConnectedDoor; + /** fn_80194C70 : Rotates the input by this->mRotation.y and adds this->mPosition */ + void stepTowards(mVec3_c &newPosition) const; + private: /* 0x33C */ m3d::smdl_c mMdl0; /* 0x358 */ m3d::smdl_c mMdl1; /* 0x374 */ m3d::mdlAnmChr mAnmChr; /* 0x3DC */ ActorEventRelated mEventRelated; /* 0x42C */ dFlowMgr_c mFlowMgr; - /* 0x4E8 */ dEmitter_c mEmmiter0; - /* 0x51C */ dEmitter_c mEmmiter1; + /* 0x4E8 */ dEmitter_c mEmmiterL; + /* 0x51C */ dEmitter_c mEmmiterR; /* 0x550 */ dTimeBits mTimeBits; /* 0x554 */ dAcRef_c mConnectedDoor; /* 0x560 */ dAcRef_c mLock; /* 0x56C */ dAcRef_c mObjRef; /* 0x578 */ mMtx_c mMtx; - /* 0x5A8 */ u8 _0x584[0x5B1 - 0x5A8]; + /* 0x5A8 */ u8 _0x5A8[0x5AC - 0x5A8]; + /* 0x5AC */ u32 mRumbleIdx; ///< + /* 0x5B0 */ u8 field_0x5B0; ///< some timer to trigger exit /* 0x5B1 */ u8 field_0x5B1; ///< /* 0x5B2 */ u8 mSceneflag; ///< Used for unlocking the door - /* 0x5B3 */ u8 _0x5B3[0x5B7 - 0x5B3]; + /* 0x5B3 */ u8 field_0x5B3; ///< + /* 0x5B4 */ s8 field_0x5B4; + /* 0x5B5 */ s8 field_0x5B5; + /* 0x5B6 */ s8 field_0x5B6; /* 0x5B7 */ bool field_0x5B7; /* 0x5B8 */ u8 _0x5B8[0x5BB - 0x5B8]; /* 0x5BB */ bool field_0x5BB; diff --git a/include/d/a/obj/d_a_obj_fence.h b/include/d/a/obj/d_a_obj_fence.h index 720c41fa..f2127ee2 100644 --- a/include/d/a/obj/d_a_obj_fence.h +++ b/include/d/a/obj/d_a_obj_fence.h @@ -10,6 +10,13 @@ public: dAcOFence_c(); virtual ~dAcOFence_c(); + bool fn_550_11B0() const; + void fn_550_12C0(); + + void changeToRequestConfineEvent() { + mStateMgr.changeState(StateID_RequestConfineEvent); + } + STATE_FUNC_DECLARE(dAcOFence_c, WaitOpen); STATE_FUNC_DECLARE(dAcOFence_c, Open); STATE_FUNC_DECLARE(dAcOFence_c, OpenPocoAPoco); @@ -21,7 +28,8 @@ public: STATE_FUNC_DECLARE(dAcOFence_c, RequestConfineEvent); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOFence_c); + /* 0x330 */ u8 _0x330[0x368 - 0x330]; + /* 0x368 */ STATE_MGR_DECLARE(dAcOFence_c); }; #endif diff --git a/include/d/a/obj/d_a_obj_lock.h b/include/d/a/obj/d_a_obj_lock.h index 4da6ba02..e332902c 100644 --- a/include/d/a/obj/d_a_obj_lock.h +++ b/include/d/a/obj/d_a_obj_lock.h @@ -12,8 +12,17 @@ public: STATE_FUNC_DECLARE(dAcOLock_c, Wait); + bool checkField_0x2090() const { + return field_0x2090; + } + void setField_0x2090() { + field_0x2090 = true; + } + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOLock_c); + /* 0x???? */ STATE_MGR_DECLARE(dAcOLock_c); + /* 0x???? */ u8 _0x36C[0x2090 - 0x36C]; + /* 0x2090 */ bool field_0x2090; }; #endif diff --git a/include/d/col/bg/d_bg_s_gnd_chk.h b/include/d/col/bg/d_bg_s_gnd_chk.h index f304c2a3..6b3e2696 100644 --- a/include/d/col/bg/d_bg_s_gnd_chk.h +++ b/include/d/col/bg/d_bg_s_gnd_chk.h @@ -27,6 +27,9 @@ public: static dBgS_ObjGndChk &GetInstance() { return sInstance; } + static dBgS_ObjGndChk *GetPInstance() { + return &sInstance; + } static f32 GetGroundHeight() { return sGroundHeight; } diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index cf1c9236..f3eab389 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -630,7 +630,7 @@ public: bool isAttackingSpinHorizontal() const; bool isAttackingSpinVertical() const; void setBonkRelatedAnimFlag(bool b); - void setPosYRot(const mVec3_c &pos, mAng rot, bool force, UNKWORD, UNKWORD); + void setPosYRot(const mVec3_c &pos, mAng rot, bool force = false, UNKWORD = 0, UNKWORD = 0); void setTransform(const mMtx_c &mtx, bool force, UNKWORD, UNKWORD); bool someTargetedActorCheck() const; static mAng fn_8005BA90(); @@ -646,7 +646,6 @@ public: static const char *getSwordName(s32); static s32 getCurrentlyEquippedShieldType(); - static const mColor &getEarringsColor(); static mVec3_c sPos1; diff --git a/include/d/d_room.h b/include/d/d_room.h index 287ae7c1..225b0bf1 100644 --- a/include/d/d_room.h +++ b/include/d/d_room.h @@ -111,6 +111,9 @@ public: bool checkFlag(u32 flag) { return mFlags & flag; } + void setFlag(u8 flag) { + mFlags |= flag; + } void drawOnMapIfVisible(mMtx_c *mtx, int param); void getBounds(mVec3_c *min, mVec3_c *max) const; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index b0de4c98..2f5a4770 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -116,6 +116,7 @@ public: int draw() override; void deleteReady() override; + void fn_801B3C60(int roomId); void drawMap(mMtx_c *mtx, int); dRoom_c *getRoom(s32 idx); void setRoom(int roomid, dRoom_c *room); diff --git a/include/f/f_base.h b/include/f/f_base.h index 8ef5ac43..50a5e367 100644 --- a/include/f/f_base.h +++ b/include/f/f_base.h @@ -89,7 +89,7 @@ public: mGroupType = m_tmpCtData.group_type; } - u32 getFromParams(u8 shift, u32 mask) { + u32 getFromParams(u8 shift, u32 mask) const { return (mParams >> shift) & mask; } diff --git a/include/toBeSorted/actor_event.h b/include/toBeSorted/actor_event.h index 03fd30d6..cbd68422 100644 --- a/include/toBeSorted/actor_event.h +++ b/include/toBeSorted/actor_event.h @@ -18,6 +18,7 @@ public: bool isAdvance(); int getSomeEventRelatedNumber(); + int getSingleShortData(int *result, u32 code, u32); int getSingleIntData(int *result, u32 code, u32); int getSingleFloatData(f32 *result, u32 code, u32); int getSingleVecData(mVec3_c *result, u32 code, u32); 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); - // ... + // 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 - mBoundingBox.Set(min, max); + 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 From dc82ce38db03bc2496c3ed9755f7805be544e995 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 25 Nov 2025 01:11:48 -0500 Subject: [PATCH 5/8] symbols --- config/SOUE01/rels/d_a_obj_doorNP/symbols.txt | 174 +++++++++--------- include/d/a/obj/d_a_obj_door.h | 5 +- include/f/f_base.h | 2 +- src/REL/d/a/obj/d_a_obj_door.cpp | 10 +- 4 files changed, 90 insertions(+), 101 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt index f00a5c19..0a8b474b 100644 --- a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt @@ -2,98 +2,94 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global dAcOdoor_c_classInit__Fv = .text:0x00000070; // type:function size:0x110 -fn_572_180 = .text:0x00000180; // type:function size:0x68 -fn_572_1F0 = .text:0x000001F0; // type:function size:0x4C -fn_572_240 = .text:0x00000240; // type:function size:0x4C -fn_572_290 = .text:0x00000290; // type:function size:0x58 -fn_572_2F0 = .text:0x000002F0; // type:function size:0x4C +getDoorMapping__26@unnamed@d_a_obj_door_cpp@FUlRPCQ226@unnamed@d_a_obj_door_cpp@15DoorFileMapping = .text:0x00000180; // type:function size:0x68 +getDoorResName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x000001F0; // type:function size:0x4C +getDoorMdlName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x00000240; // type:function size:0x4C +getDoorUnknown__26@unnamed@d_a_obj_door_cpp@FUcRUc = .text:0x00000290; // type:function size:0x58 +isDoorSpecial__26@unnamed@d_a_obj_door_cpp@Fl = .text:0x000002F0; // type:function size:0x4C getDoorTalk = .text:0x00000340; // type:function size:0xC -fn_572_350 = .text:0x00000350; // type:function size:0x7C -fn_572_3D0 = .text:0x000003D0; // type:function size:0x40 -fn_572_410 = .text:0x00000410; // type:function size:0x7C -fn_572_490 = .text:0x00000490; // type:function size:0x68 -fn_572_500 = .text:0x00000500; // type:function size:0x1EC -AcODoor__init = .text:0x000006F0; // type:function size:0x34C -AcODoor__init2 = .text:0x00000A40; // type:function size:0x7D4 -fn_572_1220 = .text:0x00001220; // type:function size:0x24 -fn_572_1250 = .text:0x00001250; // type:function size:0x16C4 -fn_572_2920 = .text:0x00002920; // type:function size:0x1C -AcODoor__update = .text:0x00002940; // type:function size:0x808 -fn_572_3150 = .text:0x00003150; // type:function size:0x98 +isInOuterSandship__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000350; // type:function size:0x7C +isInEvent__26@unnamed@d_a_obj_door_cpp@FPCc = .text:0x000003D0; // type:function size:0x40 +isInTimeDoorEvent__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000410; // type:function size:0x7C +checkRoom__26@unnamed@d_a_obj_door_cpp@FScRb = .text:0x00000490; // type:function size:0x68 +createHeap__10dAcOdoor_cFv = .text:0x00000500; // type:function size:0x1EC +actorCreate__10dAcOdoor_cFv = .text:0x000006F0; // type:function size:0x34C +actorPostCreate__10dAcOdoor_cFv = .text:0x00000A40; // type:function size:0x7D4 +doDelete__10dAcOdoor_cFv = .text:0x00001220; // type:function size:0x24 +actorExecuteInEvent__10dAcOdoor_cFv = .text:0x00001250; // type:function size:0x16C4 +calcTimer__4sLibFPUc_Uc = .text:0x00002920; // type:function size:0x1C +actorExecute__10dAcOdoor_cFv = .text:0x00002940; // type:function size:0x808 +draw__10dAcOdoor_cFv = .text:0x00003150; // type:function size:0x98 isLocked__10dAcOdoor_cFv = .text:0x000031F0; // type:function size:0x158 -fn_572_3350 = .text:0x00003350; // type:function size:0x84 -fn_572_33E0 = .text:0x000033E0; // type:function size:0xC -fn_572_33F0 = .text:0x000033F0; // type:function size:0x78 -fn_572_3470 = .text:0x00003470; // type:function size:0x7C -fn_572_34F0 = .text:0x000034F0; // type:function size:0x78 -fn_572_3570 = .text:0x00003570; // type:function size:0x7C -AcODoor__handleDoorPullEvent = .text:0x000035F0; // type:function size:0x20 -fn_572_3610 = .text:0x00003610; // type:function size:0x4 -AcODoor__handlePushEvent = .text:0x00003620; // type:function size:0x20 -fn_572_3640 = .text:0x00003640; // type:function size:0x4 -AcODoor__handleNormalEvent = .text:0x00003650; // type:function size:0xB0 -fn_572_3700 = .text:0x00003700; // type:function size:0x4 -fn_572_3710 = .text:0x00003710; // type:function size:0x4 -AcODoor__handleLockedPullEvent = .text:0x00003720; // type:function size:0x70 -AcODoor__handleLockedPushEvent = .text:0x00003790; // type:function size:0x70 -AcODoor__handleLockedEvent = .text:0x00003800; // type:function size:0x5C -AcODoor__pullLockedCallback = .text:0x00003860; // type:function size:0x68 -AcODoor__lockedPushCallback = .text:0x000038D0; // type:function size:0x68 -AcODoor__handleShutterUnlockEvent = .text:0x00003940; // type:function size:0x6C -fn_572_39B0 = .text:0x000039B0; // type:function size:0x1EC -fn_572_3BA0 = .text:0x00003BA0; // type:function size:0x148 -fn_572_3CF0 = .text:0x00003CF0; // type:function size:0x3C -fn_572_3D30 = .text:0x00003D30; // type:function size:0x4 -AcODoor__performInteraction = .text:0x00003D40; // type:function size:0x1EC -AcODoor__isKeyLocked = .text:0x00003F30; // type:function size:0xC -AcODoor__getSubtype2 = .text:0x00003F40; // type:function size:0xC -AcODoor__getParamSceneflag = .text:0x00003F50; // type:function size:0xC -fn_572_3F60 = .text:0x00003F60; // type:function size:0xC -fn_572_3F70 = .text:0x00003F70; // type:function size:0xC -fn_572_3F80 = .text:0x00003F80; // type:function size:0xC -fn_572_3F90 = .text:0x00003F90; // type:function size:0x24 -fn_572_3FC0 = .text:0x00003FC0; // type:function size:0xC -fn_572_3FD0 = .text:0x00003FD0; // type:function size:0xC -fn_572_3FE0 = .text:0x00003FE0; // type:function size:0xC -fn_572_3FF0 = .text:0x00003FF0; // type:function size:0xC -fn_572_4000 = .text:0x00004000; // type:function size:0xC -fn_572_4010 = .text:0x00004010; // type:function size:0xC -fn_572_4020 = .text:0x00004020; // type:function size:0xC -fn_572_4030 = .text:0x00004030; // type:function size:0xC -AcODoor__setRoomId = .text:0x00004040; // type:function size:0x8 -fn_572_4050 = .text:0x00004050; // type:function size:0x8 -fn_572_4060 = .text:0x00004060; // type:function size:0x8 -fn_572_4070 = .text:0x00004070; // type:function size:0x8 -fn_572_4080 = .text:0x00004080; // type:function size:0x8 -fn_572_4090 = .text:0x00004090; // type:function size:0xC -fn_572_40A0 = .text:0x000040A0; // type:function size:0xC -fn_572_40B0 = .text:0x000040B0; // type:function size:0xC -fn_572_40C0 = .text:0x000040C0; // type:function size:0xC -fn_572_40D0 = .text:0x000040D0; // type:function size:0xC -fn_572_40E0 = .text:0x000040E0; // type:function size:0xC -fn_572_40F0 = .text:0x000040F0; // type:function size:0xC -fn_572_4100 = .text:0x00004100; // type:function size:0xC -fn_572_4110 = .text:0x00004110; // type:function size:0xC -fn_572_4120 = .text:0x00004120; // type:function size:0xC -fn_572_4130 = .text:0x00004130; // type:function size:0xC -fn_572_4140 = .text:0x00004140; // type:function size:0xC -fn_572_4150 = .text:0x00004150; // type:function size:0x90 -AcODoor__triggerExit = .text:0x000041E0; // type:function size:0x7C -AcODoor__isThisTheDoorFromSealedTempleToSpiralAfterSkykeep = .text:0x00004260; // type:function size:0xAC -fn_572_4310 = .text:0x00004310; // type:function size:0x28 -fn_572_4338 = .text:0x00004338; // type:function size:0x4 -fn_572_4340 = .text:0x00004340; // type:function size:0x28 -fn_572_4368 = .text:0x00004368; // type:function size:0x4 -fn_572_4370 = .text:0x00004370; // type:function size:0x84 -AcODoor__getOpenedDoorSide = .text:0x00004400; // type:function size:0x10 -AcODoor__hasFlowEntrypoint = .text:0x00004410; // type:function size:0x18 -fn_572_4430 = .text:0x00004430; // type:function size:0xC -fn_572_4440 = .text:0x00004440; // type:function size:0xE4 -AcODoor__playerInInteractRange = .text:0x00004530; // type:function size:0xD0 -fn_572_4600 = .text:0x00004600; // type:function size:0xE4 -AcODoor__triggerDoorTalk = .text:0x000046F0; // type:function size:0x68 +canOpen__10dAcOdoor_cFv = .text:0x00003350; // type:function size:0x84 +fn_572_33E0__10dAcOdoor_cFv = .text:0x000033E0; // type:function size:0xC +startPullEventWithoutCallback__10dAcOdoor_cFPv = .text:0x000033F0; // type:function size:0x78 +startPullEventWithCallback__10dAcOdoor_cFPv = .text:0x00003470; // type:function size:0x7C +startPushEventWithoutCallback__10dAcOdoor_cFPv = .text:0x000034F0; // type:function size:0x78 +startPushEventWithCallback__10dAcOdoor_cFPv = .text:0x00003570; // type:function size:0x7C +startPullEvent__10dAcOdoor_cFPv = .text:0x000035F0; // type:function size:0x24 +startPushEvent__10dAcOdoor_cFPv = .text:0x00003620; // type:function size:0x24 +startOpenEvent__10dAcOdoor_cFPv = .text:0x00003650; // type:function size:0xB0 +doorPullEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003700; // type:function size:0x4 +doorPushEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003710; // type:function size:0x4 +startDoorPullLockedEvent__10dAcOdoor_cFPv = .text:0x00003720; // type:function size:0x70 +startDoorPushLockedEvent__10dAcOdoor_cFPv = .text:0x00003790; // type:function size:0x70 +startLockedEvent__10dAcOdoor_cFPv = .text:0x00003800; // type:function size:0x5C +pullLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003860; // type:function size:0x68 +pushLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000038D0; // type:function size:0x68 +startUnlockEvent__10dAcOdoor_cFv = .text:0x00003940; // type:function size:0x6C +unlockEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000039B0; // type:function size:0x1EC +openCallbackCommon__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003BA0; // type:function size:0x148 +registerInEvent__10dAcOdoor_cFv = .text:0x00003CF0; // type:function size:0x3C +unkVirtFunc_0x6C__10dAcOdoor_cFv = .text:0x00003D30; // type:function size:0x4 +doInteraction__10dAcOdoor_cFl = .text:0x00003D40; // type:function size:0x1EC +getKeyParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC +getSubtype2__10dAcOdoor_cFv = .text:0x00003F40; // type:function size:0xC +getSceneflag__10dAcOdoor_cFv = .text:0x00003F50; // type:function size:0xC +fn_572_3F60__10dAcOdoor_cFv = .text:0x00003F60; // type:function size:0xC +fn_572_3F70__10dAcOdoor_cFv = .text:0x00003F70; // type:function size:0xC +fn_572_3F80__10dAcOdoor_cFv = .text:0x00003F80; // type:function size:0xC +fn_572_3F90__10dAcOdoor_cFv = .text:0x00003F90; // type:function size:0x24 +getInteractionMinX__10dAcOdoor_cFv = .text:0x00003FC0; // type:function size:0xC +getInteractionMaxX__10dAcOdoor_cFv = .text:0x00003FD0; // type:function size:0xC +getInteractionMinZ__10dAcOdoor_cFv = .text:0x00003FE0; // type:function size:0xC +getInteractionMaxZ__10dAcOdoor_cFv = .text:0x00003FF0; // type:function size:0xC +getInteractionLockMinX__10dAcOdoor_cFv = .text:0x00004000; // type:function size:0xC +getInteractionLockMaxX__10dAcOdoor_cFv = .text:0x00004010; // type:function size:0xC +getInteractionLockMinZ__10dAcOdoor_cFv = .text:0x00004020; // type:function size:0xC +getInteractionLockMaxZ__10dAcOdoor_cFv = .text:0x00004030; // type:function size:0xC +setRoomId__10dAcOdoor_cFSc = .text:0x00004040; // type:function size:0x8 +fn_572_4050__10dAcOdoor_cFUl = .text:0x00004050; // type:function size:0x8 +fn_572_4060__10dAcOdoor_cFSc = .text:0x00004060; // type:function size:0x8 +fn_572_4070__10dAcOdoor_cFSc = .text:0x00004070; // type:function size:0x8 +fn_572_4080__10dAcOdoor_cFSc = .text:0x00004080; // type:function size:0x8 +fn_572_4090__10dAcOdoor_cFv = .text:0x00004090; // type:function size:0xC +fn_572_40A0__10dAcOdoor_cFv = .text:0x000040A0; // type:function size:0xC +fn_572_40B0__10dAcOdoor_cFv = .text:0x000040B0; // type:function size:0xC +fn_572_40C0__10dAcOdoor_cFv = .text:0x000040C0; // type:function size:0xC +fn_572_40D0__10dAcOdoor_cFv = .text:0x000040D0; // type:function size:0xC +fn_572_40E0__10dAcOdoor_cCFv = .text:0x000040E0; // type:function size:0xC +fn_572_40F0__10dAcOdoor_cFv = .text:0x000040F0; // type:function size:0xC +fn_572_4100__10dAcOdoor_cFv = .text:0x00004100; // type:function size:0xC +fn_572_4110__10dAcOdoor_cFv = .text:0x00004110; // type:function size:0xC +fn_572_4120__10dAcOdoor_cFv = .text:0x00004120; // type:function size:0xC +fn_572_4130__10dAcOdoor_cCFRb = .text:0x00004130; // type:function size:0xC +fn_572_4140__10dAcOdoor_cCFRb = .text:0x00004140; // type:function size:0xC +fn_572_4150__10dAcOdoor_cCFRb = .text:0x00004150; // type:function size:0x90 +triggerExit__10dAcOdoor_cFv = .text:0x000041E0; // type:function size:0x7C +isLeavingSealedTempleSideDoorPostSkyKeep__10dAcOdoor_cCFv = .text:0x00004260; // type:function size:0xAC +transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x28 +fn_572_4340__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x28 +fn_572_4370__10dAcOdoor_cCFRC7mVec3_c = .text:0x00004370; // type:function size:0x84 +isPlayerInFrontOfDoor__10dAcOdoor_cCFv = .text:0x00004400; // type:function size:0x10 +hasFlowEntryPoint__10dAcOdoor_cCFv = .text:0x00004410; // type:function size:0x18 +fn_572_4430__10dAcOdoor_cCFv = .text:0x00004430; // type:function size:0xC +fn_572_4440__10dAcOdoor_cFv = .text:0x00004440; // type:function size:0xE4 +isPlayerInteractable__10dAcOdoor_cCFv = .text:0x00004530; // type:function size:0xD0 +isPlayerInteractableLocked__10dAcOdoor_cCFv = .text:0x00004600; // type:function size:0xE4 +playInteractionLocked__10dAcOdoor_cCFv = .text:0x000046F0; // type:function size:0x68 __dt__10dAcOdoor_cFv = .text:0x00004760; // type:function size:0xE8 -fn_572_4850 = .text:0x00004850; // type:function size:0x144 +__sinit_\d_a_obj_door_cpp = .text:0x00004850; // type:function size:0x144 scope:local _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global lbl_572_rodata_0 = .rodata:0x00000000; // type:object size:0x20 data:float diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index a76dc4dc..332c03e7 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -216,9 +216,6 @@ public: /** fn_572_4310 */ void transitionPushRoomFlags() const; - /** fn_572_4320 */ - void fn_572_4320() const; // nop - /** fn_572_4430 */ bool transitionPullRoomFlags() const; @@ -250,7 +247,7 @@ public: void playInteractionLocked() const; public: - s32 getType() const { + s32 getType() { return getFromParams(0, 0x3F); } s32 getField_0x5B4() const { diff --git a/include/f/f_base.h b/include/f/f_base.h index 50a5e367..8ef5ac43 100644 --- a/include/f/f_base.h +++ b/include/f/f_base.h @@ -89,7 +89,7 @@ public: mGroupType = m_tmpCtData.group_type; } - u32 getFromParams(u8 shift, u32 mask) const { + u32 getFromParams(u8 shift, u32 mask) { return (mParams >> shift) & mask; } 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 {} From d8ede28c570cab681d9cb1aad12e7624e025fae6 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 26 Nov 2025 01:09:04 -0500 Subject: [PATCH 6/8] most OK --- config/SOUE01/rels/d_a_obj_doorNP/symbols.txt | 26 +- .../SOUE01/rels/d_a_obj_fenceNP/symbols.txt | 10 +- .../rels/d_a_obj_windmillNP/symbols.txt | 2 +- config/SOUE01/symbols.txt | 18 +- include/d/a/obj/d_a_obj_door.h | 49 +- include/d/a/obj/d_a_obj_door_base.h | 2 +- include/d/a/obj/d_a_obj_fence.h | 2 + include/d/a/obj/d_a_obj_lock.h | 5 +- include/d/d_stage.h | 1 + include/d/d_stage_mgr.h | 3 +- include/toBeSorted/event_manager.h | 1 + src/REL/d/a/obj/d_a_obj_door.cpp | 846 ++++++++++++++---- 12 files changed, 737 insertions(+), 228 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt index 0a8b474b..67013f44 100644 --- a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt @@ -7,7 +7,7 @@ getDoorResName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x000001F0; // type: getDoorMdlName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x00000240; // type:function size:0x4C getDoorUnknown__26@unnamed@d_a_obj_door_cpp@FUcRUc = .text:0x00000290; // type:function size:0x58 isDoorSpecial__26@unnamed@d_a_obj_door_cpp@Fl = .text:0x000002F0; // type:function size:0x4C -getDoorTalk = .text:0x00000340; // type:function size:0xC +getDoorInteractionName__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000340; // type:function size:0xC isInOuterSandship__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000350; // type:function size:0x7C isInEvent__26@unnamed@d_a_obj_door_cpp@FPCc = .text:0x000003D0; // type:function size:0x40 isInTimeDoorEvent__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000410; // type:function size:0x7C @@ -30,20 +30,20 @@ startPushEventWithCallback__10dAcOdoor_cFPv = .text:0x00003570; // type:function startPullEvent__10dAcOdoor_cFPv = .text:0x000035F0; // type:function size:0x24 startPushEvent__10dAcOdoor_cFPv = .text:0x00003620; // type:function size:0x24 startOpenEvent__10dAcOdoor_cFPv = .text:0x00003650; // type:function size:0xB0 -doorPullEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003700; // type:function size:0x4 -doorPushEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003710; // type:function size:0x4 +doorPullEventCallback__10dAcOdoor_cFPv = .text:0x00003700; // type:function size:0x4 +doorPushEventCallback__10dAcOdoor_cFPv = .text:0x00003710; // type:function size:0x4 startDoorPullLockedEvent__10dAcOdoor_cFPv = .text:0x00003720; // type:function size:0x70 startDoorPushLockedEvent__10dAcOdoor_cFPv = .text:0x00003790; // type:function size:0x70 startLockedEvent__10dAcOdoor_cFPv = .text:0x00003800; // type:function size:0x5C -pullLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003860; // type:function size:0x68 -pushLockedEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000038D0; // type:function size:0x68 +pullLockedEventCallback__10dAcOdoor_cFPv = .text:0x00003860; // type:function size:0x68 +pushLockedEventCallback__10dAcOdoor_cFPv = .text:0x000038D0; // type:function size:0x68 startUnlockEvent__10dAcOdoor_cFv = .text:0x00003940; // type:function size:0x6C -unlockEventCallback__10dAcOdoor_cFP10dAcOdoor_c = .text:0x000039B0; // type:function size:0x1EC -openCallbackCommon__10dAcOdoor_cFP10dAcOdoor_c = .text:0x00003BA0; // type:function size:0x148 +unlockEventCallback__10dAcOdoor_cFPv = .text:0x000039B0; // type:function size:0x1EC +openCallbackCommon__10dAcOdoor_cFPv = .text:0x00003BA0; // type:function size:0x148 registerInEvent__10dAcOdoor_cFv = .text:0x00003CF0; // type:function size:0x3C unkVirtFunc_0x6C__10dAcOdoor_cFv = .text:0x00003D30; // type:function size:0x4 doInteraction__10dAcOdoor_cFl = .text:0x00003D40; // type:function size:0x1EC -getKeyParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC +getLockParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC getSubtype2__10dAcOdoor_cFv = .text:0x00003F40; // type:function size:0xC getSceneflag__10dAcOdoor_cFv = .text:0x00003F50; // type:function size:0xC fn_572_3F60__10dAcOdoor_cFv = .text:0x00003F60; // type:function size:0xC @@ -60,7 +60,7 @@ getInteractionLockMinZ__10dAcOdoor_cFv = .text:0x00004020; // type:function size getInteractionLockMaxZ__10dAcOdoor_cFv = .text:0x00004030; // type:function size:0xC setRoomId__10dAcOdoor_cFSc = .text:0x00004040; // type:function size:0x8 fn_572_4050__10dAcOdoor_cFUl = .text:0x00004050; // type:function size:0x8 -fn_572_4060__10dAcOdoor_cFSc = .text:0x00004060; // type:function size:0x8 +fn_572_4060__10dAcOdoor_cFUc = .text:0x00004060; // type:function size:0x8 fn_572_4070__10dAcOdoor_cFSc = .text:0x00004070; // type:function size:0x8 fn_572_4080__10dAcOdoor_cFSc = .text:0x00004080; // type:function size:0x8 fn_572_4090__10dAcOdoor_cFv = .text:0x00004090; // type:function size:0xC @@ -78,16 +78,16 @@ fn_572_4140__10dAcOdoor_cCFRb = .text:0x00004140; // type:function size:0xC fn_572_4150__10dAcOdoor_cCFRb = .text:0x00004150; // type:function size:0x90 triggerExit__10dAcOdoor_cFv = .text:0x000041E0; // type:function size:0x7C isLeavingSealedTempleSideDoorPostSkyKeep__10dAcOdoor_cCFv = .text:0x00004260; // type:function size:0xAC -transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x28 -fn_572_4340__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x28 +transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x2C +transitionPullRoomFlags__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x2C fn_572_4370__10dAcOdoor_cCFRC7mVec3_c = .text:0x00004370; // type:function size:0x84 isPlayerInFrontOfDoor__10dAcOdoor_cCFv = .text:0x00004400; // type:function size:0x10 -hasFlowEntryPoint__10dAcOdoor_cCFv = .text:0x00004410; // type:function size:0x18 +hasFlowEntryPoint__10dAcOdoor_cFv = .text:0x00004410; // type:function size:0x18 fn_572_4430__10dAcOdoor_cCFv = .text:0x00004430; // type:function size:0xC fn_572_4440__10dAcOdoor_cFv = .text:0x00004440; // type:function size:0xE4 isPlayerInteractable__10dAcOdoor_cCFv = .text:0x00004530; // type:function size:0xD0 isPlayerInteractableLocked__10dAcOdoor_cCFv = .text:0x00004600; // type:function size:0xE4 -playInteractionLocked__10dAcOdoor_cCFv = .text:0x000046F0; // type:function size:0x68 +playInteractionLocked__10dAcOdoor_cFv = .text:0x000046F0; // type:function size:0x68 __dt__10dAcOdoor_cFv = .text:0x00004760; // type:function size:0xE8 __sinit_\d_a_obj_door_cpp = .text:0x00004850; // type:function size:0x144 scope:local _ctors = .ctors:0x00000000; // type:label scope:global diff --git a/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt b/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt index b5ed5c3e..658ac9b0 100644 --- a/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_fenceNP/symbols.txt @@ -21,11 +21,11 @@ getStateID__80sStateMgr_c<11dAcOFence_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13 fn_550_D30 = .text:0x00000D30; // type:function size:0x304 fn_550_1040 = .text:0x00001040; // type:function size:0x13C fn_550_1180 = .text:0x00001180; // type:function size:0x28 -fn_550_11B0 = .text:0x000011B0; // type:function size:0xA0 -fn_550_1250 = .text:0x00001250; // type:function size:0x50 +fn_550_11B0__11dAcOFence_cCFv = .text:0x000011B0; // type:function size:0xA0 +fn_550_1250__11dAcOFence_cFv = .text:0x00001250; // type:function size:0x50 changeState__80sStateMgr_c<11dAcOFence_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000012A0; // type:function size:0x10 -fn_550_12B0 = .text:0x000012B0; // type:function size:0x10 -fn_550_12C0 = .text:0x000012C0; // type:function size:0x10 +fn_550_12B0__11dAcOFence_cFv = .text:0x000012B0; // type:function size:0x10 +fn_550_12C0__11dAcOFence_cFv = .text:0x000012C0; // type:function size:0x10 initializeState_WaitOpen__11dAcOFence_cFv = .text:0x000012D0; // type:function size:0x94 executeState_WaitOpen__11dAcOFence_cFv = .text:0x00001370; // type:function size:0x168 finalizeState_WaitOpen__11dAcOFence_cFv = .text:0x000014E0; // type:function size:0x4 @@ -142,4 +142,4 @@ lbl_550_bss_118 = .bss:0x00000118; // type:object size:0x40 data:4byte lbl_550_bss_158 = .bss:0x00000158; // type:object size:0x40 data:4byte lbl_550_bss_198 = .bss:0x00000198; // type:object size:0x40 data:4byte lbl_550_bss_1D8 = .bss:0x000001D8; // type:object size:0x40 data:4byte -lbl_550_bss_218 = .bss:0x00000218; // type:object size:0x30 +StateID_RequestConfineEvent__11dAcOFence_c = .bss:0x00000218; // type:object size:0x30 diff --git a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt index 42e9ce53..9a7ae51a 100644 --- a/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_windmillNP/symbols.txt @@ -80,7 +80,7 @@ lbl_374_data_190 = .data:0x00000190; // type:object size:0x198 scope:local __vt__29sFStateID_c<14dAcOwindmill_c> = .data:0x00000328; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_374_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte -AcOwindmill__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 data:4byte +StateID_Wait__14dAcOwindmill_c = .bss:0x00000018; // type:object size:0x40 data:4byte AcOwindmill__STATE_CAMERA_MOVE = .bss:0x00000058; // type:object size:0x40 data:4byte AcOwindmill__STATE_MOVE = .bss:0x00000098; // type:object size:0x80 data:4byte AcOwindmill__STATE_COLLECT_STICK = .bss:0x00000118; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 587eb1c6..a722eb7b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3525,7 +3525,7 @@ getCurrentEventCommand__17ActorEventRelatedCFv = .text:0x8009CF10; // type:funct ActorEventRelated__getSomeEventRelatedNumber = .text:0x8009CFA0; // type:function size:0x80 isAdvance__17ActorEventRelatedFv = .text:0x8009D020; // type:function size:0x34 advanceNext__17ActorEventRelatedFv = .text:0x8009D060; // type:function size:0x50 -ActorEventRelated__getSingleIntData2 = .text:0x8009D0B0; // type:function size:0x8C +getSingleShortData__17ActorEventRelatedFPiUlUl = .text:0x8009D0B0; // type:function size:0x8C getSingleIntData__17ActorEventRelatedFPiUlUl = .text:0x8009D140; // type:function size:0x8C getSingleFloatData__17ActorEventRelatedFPfUlUl = .text:0x8009D1D0; // type:function size:0x8C getSingleVecData__17ActorEventRelatedFP7mVec3_cUlUl = .text:0x8009D260; // type:function size:0x9C @@ -3568,7 +3568,7 @@ fn_8009F850 = .text:0x8009F850; // type:function size:0x134 fn_8009F990__12EventManagerFv = .text:0x8009F990; // type:function size:0x80 fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8 attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0 -setAsEvent = .text:0x8009FBC0; // type:function size:0x120 +setEvent__12EventManagerFP9dAcBase_cP5EventP9dAcBase_c = .text:0x8009FBC0; // type:function size:0x120 changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C fn_8009FE00 = .text:0x8009FE00; // type:function size:0x124 isInEvent__12EventManagerFP9dAcBase_cPCc = .text:0x8009FF30; // type:function size:0x10C @@ -9879,8 +9879,8 @@ fn_80178E90 = .text:0x80178E90; // type:function size:0x40 fn_80178ED0 = .text:0x80178ED0; // type:function size:0x114 __dt__13dAcBirdBase_cFv = .text:0x80178FF0; // type:function size:0xDC __dt__Q213dAcBirdBase_c10callback_cFv = .text:0x801790D0; // type:function size:0x58 -__ct__16dAcObjDoor_cFv = .text:0x80179130; // type:function size:0x58 -fn_80179190 = .text:0x80179190; // type:function size:0x74 +__ct__12dAcObjDoor_cFv = .text:0x80179130; // type:function size:0x58 +__dt__12dAcObjDoor_cFv = .text:0x80179190; // type:function size:0x74 ActorDoorBase__hasVisitedRoomIdMaybe = .text:0x80179210; // type:function size:0x14 fn_80179230 = .text:0x80179230; // type:function size:0x4 fn_80179240 = .text:0x80179240; // type:function size:0x4 @@ -10420,13 +10420,13 @@ fn_80194A90 = .text:0x80194A90; // type:function size:0x58 checkStatueFlag__10dAcOSave_cCFv = .text:0x80194AF0; // type:function size:0x28 fn_80194B20 = .text:0x80194B20; // type:function size:0x8 fn_80194B30 = .text:0x80194B30; // type:function size:0x44 -fn_80194B80 = .text:0x80194B80; // type:function size:0x8 +getConnectedDoorRef__10dAcOdoor_cFv = .text:0x80194B80; // type:function size:0x8 fn_80194B90 = .text:0x80194B90; // type:function size:0x8 -fn_80194BA0 = .text:0x80194BA0; // type:function size:0x30 +isConnectedToOtherDoor__10dAcOdoor_cCFv = .text:0x80194BA0; // type:function size:0x30 fn_80194BD0 = .text:0x80194BD0; // type:function size:0x18 fn_80194BF0 = .text:0x80194BF0; // type:function size:0x24 fn_80194C20 = .text:0x80194C20; // type:function size:0x48 -fn_80194C70 = .text:0x80194C70; // type:function size:0x70 +stepTowards__10dAcOdoor_cCFR7mVec3_c = .text:0x80194C70; // type:function size:0x70 getImprisonedPtr = .text:0x80194CE0; // type:function size:0x8 fn_80194CF0 = .text:0x80194CF0; // type:function size:0x128 dAcOClef__getTadtoneGroupIndex = .text:0x80194E20; // type:function size:0x38 @@ -10960,9 +10960,9 @@ waitForRooms__8dStage_cFv = .text:0x801B3930; // type:function size:0x30 setRoom__8dStage_cFiP7dRoom_c = .text:0x801B3960; // type:function size:0x10 getRoom__8dStage_cFl = .text:0x801B3970; // type:function size:0x10 handleRoomChange__8dStage_cFi = .text:0x801B3980; // type:function size:0x114 -RoomManager__updateRoomFlags = .text:0x801B3AA0; // type:function size:0x134 +updateRoomFlags__8dStage_cFii = .text:0x801B3AA0; // type:function size:0x134 RoomManager__checkOtherRoomLoaded = .text:0x801B3BE0; // type:function size:0x78 -fn_801B3C60 = .text:0x801B3C60; // type:function size:0x9C +fn_801B3C60__8dStage_cFi = .text:0x801B3C60; // type:function size:0x9C fadeIn__8dStage_cFlUs = .text:0x801B3D00; // type:function size:0xA8 fadeOut__8dStage_cFlUs = .text:0x801B3DB0; // type:function size:0xA8 forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index 332c03e7..fded4fa4 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -35,8 +35,20 @@ public: SUBTYPE_8, ///< DoorH }; + enum LockType_c { + LOCK_NONE = 0, ///< Door does not have a lock + LOCK_KEY = 1, ///< Door usually is locked + }; + public: - dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiterL(this), mEmmiterR(this) {} + dAcOdoor_c() + : mEventRelated(*this, nullptr), + mEmmiterL(this), + mEmmiterR(this), + mFlags(0), + field_0x5B0(0), + field_0x5B9(false), + field_0x5BA(false) {} virtual ~dAcOdoor_c() {} virtual int doDelete() override; @@ -79,10 +91,10 @@ public: void startOpenEvent(void *zevData); /** */ - static void doorPullEventCallback(dAcOdoor_c *); + static void doorPullEventCallback(void *); /** */ - static void doorPushEventCallback(dAcOdoor_c *); + static void doorPushEventCallback(void *); /** */ void startDoorPullLockedEvent(void *zevData); @@ -94,22 +106,22 @@ public: void startLockedEvent(void *zevData); /** */ - static void pullLockedEventCallback(dAcOdoor_c *); + static void pullLockedEventCallback(void *); /** */ - static void pushLockedEventCallback(dAcOdoor_c *); + static void pushLockedEventCallback(void *); /** */ void startUnlockEvent(); /** */ - static void unlockEventCallback(dAcOdoor_c *); + static void unlockEventCallback(void *); /** */ - static void openCallbackCommon(dAcOdoor_c *); + static void openCallbackCommon(void *); /** */ - s32 getKeyParameter(); // getFromParams(6, 0x1) + s32 getLockParameter(); // getFromParams(6, 0x1) /** */ s32 getSubtype2(); // (mRotation.x >> 0) & 0xFF @@ -126,8 +138,8 @@ public: /** fn_572_3F80 */ u8 fn_572_3F80(); // (mRotation.z >> 10) & 0x3F - /** fn_572_3F90 */ - u8 fn_572_3F90(); // (getParams2Lower() >> 0) & 0xFF + /** (getParams2Lower() >> 0) & 0xFF */ + u16 fn_572_3F90(); /** fn_572_3FC0 */ static f32 getInteractionMinX(); // -80.f @@ -160,7 +172,7 @@ public: void fn_572_4050(u32 flags); // field_0x5A8 = flags /** fn_572_4060 */ - void fn_572_4060(s8); // field_0x5B3 = in + void fn_572_4060(u8); // field_0x5B3 = in /** fn_572_4070 */ void fn_572_4070(s8); // field_0x5B4 = in @@ -217,10 +229,7 @@ public: void transitionPushRoomFlags() const; /** fn_572_4430 */ - bool transitionPullRoomFlags() const; - - /** fn_572_4340 */ - void fn_572_4340() const; // nop + void transitionPullRoomFlags() const; /** fn_572_4370 */ bool fn_572_4370(const mVec3_c &point) const; // Is in front of door @@ -229,7 +238,7 @@ public: bool isPlayerInFrontOfDoor() const; /** */ - bool hasFlowEntryPoint() const; // getFromParams(16, 0xFFFF) + bool hasFlowEntryPoint(); /** fn_572_4430 */ bool fn_572_4430() const; // field_0x5A8 & 2 @@ -244,7 +253,7 @@ public: bool isPlayerInteractableLocked() const; /** */ - void playInteractionLocked() const; + void playInteractionLocked(); public: s32 getType() { @@ -277,7 +286,7 @@ private: /* 0x560 */ dAcRef_c mLock; /* 0x56C */ dAcRef_c mObjRef; /* 0x578 */ mMtx_c mMtx; - /* 0x5A8 */ u8 _0x5A8[0x5AC - 0x5A8]; + /* 0x5A8 */ u32 mFlags; ///< /* 0x5AC */ u32 mRumbleIdx; ///< /* 0x5B0 */ u8 field_0x5B0; ///< some timer to trigger exit /* 0x5B1 */ u8 field_0x5B1; ///< @@ -287,7 +296,9 @@ private: /* 0x5B5 */ s8 field_0x5B5; /* 0x5B6 */ s8 field_0x5B6; /* 0x5B7 */ bool field_0x5B7; - /* 0x5B8 */ u8 _0x5B8[0x5BB - 0x5B8]; + /* 0x5B8 */ bool field_0x5B8; + /* 0x5B9 */ bool field_0x5B9; + /* 0x5BA */ bool field_0x5BA; /* 0x5BB */ bool field_0x5BB; }; diff --git a/include/d/a/obj/d_a_obj_door_base.h b/include/d/a/obj/d_a_obj_door_base.h index 854c1ba2..9a64bf34 100644 --- a/include/d/a/obj/d_a_obj_door_base.h +++ b/include/d/a/obj/d_a_obj_door_base.h @@ -11,7 +11,7 @@ class dAcObjDoor_c : public dAcObjBase_c { public: dAcObjDoor_c(); - ~dAcObjDoor_c() {} + ~dAcObjDoor_c(); virtual bool canOpen() = 0; virtual bool hasVisitedRoom(); diff --git a/include/d/a/obj/d_a_obj_fence.h b/include/d/a/obj/d_a_obj_fence.h index f2127ee2..8b7afd5d 100644 --- a/include/d/a/obj/d_a_obj_fence.h +++ b/include/d/a/obj/d_a_obj_fence.h @@ -11,6 +11,8 @@ public: virtual ~dAcOFence_c(); bool fn_550_11B0() const; + void fn_550_1250(); + void fn_550_12B0(); void fn_550_12C0(); void changeToRequestConfineEvent() { diff --git a/include/d/a/obj/d_a_obj_lock.h b/include/d/a/obj/d_a_obj_lock.h index e332902c..071bf5c5 100644 --- a/include/d/a/obj/d_a_obj_lock.h +++ b/include/d/a/obj/d_a_obj_lock.h @@ -12,8 +12,8 @@ public: STATE_FUNC_DECLARE(dAcOLock_c, Wait); - bool checkField_0x2090() const { - return field_0x2090; + bool checkField_0x2091() const { + return field_0x2091; } void setField_0x2090() { field_0x2090 = true; @@ -23,6 +23,7 @@ private: /* 0x???? */ STATE_MGR_DECLARE(dAcOLock_c); /* 0x???? */ u8 _0x36C[0x2090 - 0x36C]; /* 0x2090 */ bool field_0x2090; + /* 0x2091 */ bool field_0x2091; }; #endif diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 2f5a4770..3c3d2a93 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -119,6 +119,7 @@ public: void fn_801B3C60(int roomId); void drawMap(mMtx_c *mtx, int); dRoom_c *getRoom(s32 idx); + void updateRoomFlags(int, int); void setRoom(int roomid, dRoom_c *room); void handleRoomChange(int roomid); diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 68d47f3f..f7a00405 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -106,7 +106,6 @@ public: static dStageMgr_c *GetInstance() { return sInstance; } - EGG::CpuTexture *getField_0x8898() { return field_0x8898; } @@ -225,7 +224,7 @@ private: // ... u8 ___[438]; /* 0x8898 */ EGG::CpuTexture *field_0x8898; - + u8 _0x889C[4]; /* 0x88A0 */ u32 field_0x88A0; diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 1b89074f..3f3946ab 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -11,6 +11,7 @@ class dAcObjBase_c; class EventManager { public: + static bool setEvent(dAcBase_c *actor, Event *, dAcBase_c *); static bool isInEvent(dAcBase_c *actor, const char *eventName); static bool finishEvent(dAcBase_c *actor, const char *eventName); static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD); 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(); -int dAcOdoor_c::draw() {} + 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; + } + } -bool dAcOdoor_c::isLocked() {} + 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); -bool dAcOdoor_c::canOpen() {} + 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); + } + } + } -/** fn_572_33E0 - I Think this gets the Door open range*/ -f32 dAcOdoor_c::fn_572_33E0() {} // -80.f + if (pObj != nullptr) { + mVec3_c min, max; + min.set(999999.f, 999999.f, 999999.f); + max.set(-999999.f, -999999.f, -999999.f); -/** */ -void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) {} + 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); -/** */ -void dAcOdoor_c::startPullEventWithCallback(void *zevData) {} + mMtx_c world = mWorldMtx; + world.inverse(); -/** */ -void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) {} + mVec3_c minPos = min_l; + local.multVec(minPos, minPos); + world.multVec(minPos, minPos); -/** */ -void dAcOdoor_c::startPushEventWithCallback(void *zevData) {} + // 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 -/** */ -void dAcOdoor_c::startPullEvent(void *zevData) {} + 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 -/** */ -void dAcOdoor_c::startPushEvent(void *zevData) {} + 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), + }; -/** */ -void dAcOdoor_c::startOpenEvent(void *zevData) {} + 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; +} -/** */ -void dAcOdoor_c::doorPullEventCallback(dAcOdoor_c *) {} +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; +} -/** */ -void dAcOdoor_c::doorPushEventCallback(dAcOdoor_c *) {} +bool dAcOdoor_c::isLocked() { + if (getLockParameter() == LOCK_KEY) { + return mLock.isLinked(); + } -/** */ -void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) {} + 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; + } +} -/** */ -void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) {} +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(); +} -/** */ -void dAcOdoor_c::startLockedEvent(void *zevData) {} +f32 dAcOdoor_c::fn_572_33E0() { + return -80.f; +} -/** */ -void dAcOdoor_c::pullLockedEventCallback(dAcOdoor_c *) {} +// HACK +inline u32 createBits(const u32 &a, const u32 &b) { + return a | b; +} -/** */ -void dAcOdoor_c::pushLockedEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startPullEventWithoutCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::startUnlockEvent() {} +void dAcOdoor_c::startPullEventWithCallback(void *zevData) { + Event event(DoorPull, zevData, 100, createBits(0x100001, 0x2), (void *)doorPullEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::unlockEventCallback(dAcOdoor_c *) {} +void dAcOdoor_c::startPushEventWithoutCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), nullptr, nullptr); + mEventRelated.scheduleEvent(event, 0); +} -/** */ -void dAcOdoor_c::openCallbackCommon(dAcOdoor_c *) {} +void dAcOdoor_c::startPushEventWithCallback(void *zevData) { + Event event(DoorPush, zevData, 100, createBits(0x100001, 0x2), (void *)doorPushEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +void dAcOdoor_c::startPullEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPullEventWithoutCallback(zevData); break; + case 1: startPullEventWithCallback(zevData); break; + } +} + +void dAcOdoor_c::startPushEvent(void *zevData) { + switch (field_0x5B3) { + case 0: startPushEventWithoutCallback(zevData); break; + case 1: startPushEventWithCallback(zevData); break; + } +} + +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::doorPullEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} + +void dAcOdoor_c::doorPushEventCallback(void *pDoor) { + openCallbackCommon(pDoor); +} + +void dAcOdoor_c::startDoorPullLockedEvent(void *zevData) { + Event event(DoorPullLock, zevData, 100, 0x100001, (void *)pullLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +void dAcOdoor_c::startDoorPushLockedEvent(void *zevData) { + Event event(DoorPushLock, zevData, 100, 0x100001, (void *)pushLockedEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +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::startUnlockEvent() { + Event event("ShutterUnlock", 100, 0x100001, (void *)unlockEventCallback, nullptr); + mEventRelated.scheduleEvent(event, 0); +} + +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; + } + } + + if (pDoor->mSceneflag < 0xFF) { + SceneflagManager::sInstance->setFlag(pDoor->mRoomID, pDoor->mSceneflag); + } + + 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) {} +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; + } -/** */ -s32 dAcOdoor_c::getKeyParameter() {} // getFromParams(6, 0x1) + void *zevData = getOarcZev("DoorAnim"); -/** */ -s32 dAcOdoor_c::getSubtype2() {} // (mRotation.x >> 0) & 0xFF + 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; + } +} -/** */ -u8 dAcOdoor_c::getSceneflag() {} // (mRotation.x >> 8) & 0xFF +s32 dAcOdoor_c::getLockParameter() { + return getFromParams(6, 0x1); +} -/** fn_572_3F60 */ -u8 dAcOdoor_c::fn_572_3F60() {} // (mRotation.z >> 0) & 0xF +s32 dAcOdoor_c::getSubtype2() { + return (mRotation.x >> 0) & 0xFF; +} -/** fn_572_3F70 */ -u8 dAcOdoor_c::fn_572_3F70() {} // (mRotation.z >> 4) & 0x3F +u8 dAcOdoor_c::getSceneflag() { + return (mRotation.x >> 8) & 0xFF; +} -/** fn_572_3F80 */ -u8 dAcOdoor_c::fn_572_3F80() {} // (mRotation.z >> 10) & 0x3F +u8 dAcOdoor_c::fn_572_3F60() { + return (mRotation.z >> 0) & 0xF; +} -/** fn_572_3F90 */ -u8 dAcOdoor_c::fn_572_3F90() {} // (getParams2Lower() >> 0) & 0xFF +u8 dAcOdoor_c::fn_572_3F70() { + return (mRotation.z >> 4) & 0x3F; +} -/** fn_572_3FC0 */ -f32 dAcOdoor_c::getInteractionMinX() {} // -80.f +u8 dAcOdoor_c::fn_572_3F80() { + return (mRotation.z >> 10) & 0x3F; +} -/** fn_572_3FD0 */ -f32 dAcOdoor_c::getInteractionMaxX() {} // 80.f +u16 dAcOdoor_c::fn_572_3F90() { + return getParams2Lower() & 0xFF; +} -/** fn_572_3FE0 */ -f32 dAcOdoor_c::getInteractionMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionMinX() { + return -80.f; +} -/** fn_572_3FF0 */ -f32 dAcOdoor_c::getInteractionMaxZ() {} // 100.f +f32 dAcOdoor_c::getInteractionMaxX() { + return 80.f; +} -/** fn_572_4000 */ -f32 dAcOdoor_c::getInteractionLockMinX() {} // -160.f +f32 dAcOdoor_c::getInteractionMinZ() { + return -100.f; +} -/** fn_572_4010 */ -f32 dAcOdoor_c::getInteractionLockMaxX() {} // 160.f +f32 dAcOdoor_c::getInteractionMaxZ() { + return 100.f; +} -/** fn_572_4020 */ -f32 dAcOdoor_c::getInteractionLockMinZ() {} // -100.f +f32 dAcOdoor_c::getInteractionLockMinX() { + return -160.f; +} -/** fn_572_4030 */ -f32 dAcOdoor_c::getInteractionLockMaxZ() {} // 100.f +f32 dAcOdoor_c::getInteractionLockMaxX() { + return 160.f; +} -/** */ -void dAcOdoor_c::setRoomId(s8 roomId) {} // mRoomId = roomId; +f32 dAcOdoor_c::getInteractionLockMinZ() { + return -100.f; +} -/** fn_572_4050 */ -void dAcOdoor_c::fn_572_4050(u32 flags) {} // field_0x5A8 = flags +f32 dAcOdoor_c::getInteractionLockMaxZ() { + return 100.f; +} -/** fn_572_4060 */ -void dAcOdoor_c::fn_572_4060(s8) {} // field_0x5B3 = in +void dAcOdoor_c::setRoomId(s8 roomId) { + mRoomID = roomId; +} -/** fn_572_4070 */ -void dAcOdoor_c::fn_572_4070(s8) {} // field_0x5B4 = in +void dAcOdoor_c::fn_572_4050(u32 flags) { + mFlags = flags; +} -/** fn_572_4080 */ -void dAcOdoor_c::fn_572_4080(s8) {} // field_0x5B5 = in +void dAcOdoor_c::fn_572_4060(u8 in) { + field_0x5B3 = in; +} -/** fn_572_4090 */ -void dAcOdoor_c::fn_572_4090() {} // field_0x5B7 = true +void dAcOdoor_c::fn_572_4070(s8 in) { + field_0x5B4 = in; +} -/** fn_572_40A0 */ -void dAcOdoor_c::fn_572_40A0() {} // field_0x5B7 = false +void dAcOdoor_c::fn_572_4080(s8 in) { + field_0x5B5 = in; +} -/** fn_572_40B0 */ -void dAcOdoor_c::fn_572_40B0() {} // field_0x5B8 = true +void dAcOdoor_c::fn_572_4090() { + field_0x5B7 = true; +} -/** fn_572_40C0 */ -void dAcOdoor_c::fn_572_40C0() {} // field_0x5B8 = false +void dAcOdoor_c::fn_572_40A0() { + field_0x5B7 = false; +} -/** fn_572_40D0 */ -void dAcOdoor_c::fn_572_40D0() {} // field_0x5B9 = true +void dAcOdoor_c::fn_572_40B0() { + field_0x5B8 = true; +} -/** fn_572_40E0 */ -bool dAcOdoor_c::fn_572_40E0() const {} // field_0x5A8 & 1 +void dAcOdoor_c::fn_572_40C0() { + field_0x5B8 = false; +} -/** fn_572_40F0 */ -void dAcOdoor_c::fn_572_40F0() {} // field_0x5A8 |= 1 (Time Door) +void dAcOdoor_c::fn_572_40D0() { + field_0x5B9 = true; +} -/** fn_572_4100 */ -void dAcOdoor_c::fn_572_4100() {} // field_0x5A8 &= ~1 +bool dAcOdoor_c::fn_572_40E0() const { + return mFlags & 1; +} -/** fn_572_4110 */ -void dAcOdoor_c::fn_572_4110() {} // field_0x5A8 |= 2 +void dAcOdoor_c::fn_572_40F0() { + fn_572_4050(mFlags | 1); +} -/** fn_572_4120 */ -void dAcOdoor_c::fn_572_4120() {} // field_0x5A8 &= ~2 +void dAcOdoor_c::fn_572_4100() { + fn_572_4050(mFlags & ~1); +} -/** fn_572_4130 */ -bool dAcOdoor_c::fn_572_4130(bool &b) const {} // checkRoom(field_0x5B4,b) +void dAcOdoor_c::fn_572_4110() { + fn_572_4050(mFlags | 2); +} -/** fn_572_4140 */ -bool dAcOdoor_c::fn_572_4140(bool &b) const {} // checkRoom(field_0x5B5,b) +void dAcOdoor_c::fn_572_4120() { + fn_572_4050(mFlags & ~2); +} -/** fn_572_4150 */ -bool dAcOdoor_c::fn_572_4150(bool &b) const {} // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 +bool dAcOdoor_c::fn_572_4130(bool &b) const { + checkRoom(field_0x5B4, b); +} -/** */ -void dAcOdoor_c::triggerExit() {} +bool dAcOdoor_c::fn_572_4140(bool &b) const { + checkRoom(field_0x5B5, b); +} -/** */ -bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const {} +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_4310 */ -void dAcOdoor_c::transitionPushRoomFlags() const {} +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); + } +} -/** fn_572_4430 */ -bool dAcOdoor_c::transitionPullRoomFlags() const {} +bool dAcOdoor_c::isLeavingSealedTempleSideDoorPostSkyKeep() const { + return s32(mParams & 0x3F) == SUBTYPE_4 && field_0x5B5 == 1 && + StoryflagManager::sInstance->getFlag(STORYFLAG_342) && dScGame_c::isCurrentStage(sStageF402); +} -/** fn_572_4340 */ -void dAcOdoor_c::fn_572_4340() const {} // nop +void dAcOdoor_c::transitionPushRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B4(), getField_0x5B5()); +} -/** fn_572_4370 */ -bool dAcOdoor_c::fn_572_4370(const mVec3_c &point) const {} // Is in front of door +void dAcOdoor_c::transitionPullRoomFlags() const { + if (dStage_c::GetInstance() == nullptr) { + return; + } + dStage_c::GetInstance()->updateRoomFlags(getField_0x5B5(), getField_0x5B4()); +} -/** */ -bool dAcOdoor_c::isPlayerInFrontOfDoor() 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; +} -/** */ -bool dAcOdoor_c::hasFlowEntryPoint() const {} // getFromParams(16, 0xFFFF) +bool dAcOdoor_c::isPlayerInFrontOfDoor() const { + return fn_572_4370(dAcPy_c::GetLink()->mPosition); +} -/** fn_572_4430 */ -bool dAcOdoor_c::fn_572_4430() const {} // field_0x5A8 & 2 +bool dAcOdoor_c::hasFlowEntryPoint() { + return getFromParams(16, 0xFFFF); +} -/** fn_572_4440 */ -void dAcOdoor_c::fn_572_4440() {} // Sets the Postion Copies +bool dAcOdoor_c::fn_572_4430() const { + return mFlags & 2; +} -/** */ -bool dAcOdoor_c::isPlayerInteractable() const {} +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_4600 */ -bool dAcOdoor_c::isPlayerInteractableLocked() const {} +bool dAcOdoor_c::isPlayerInteractable() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); -/** */ -void dAcOdoor_c::playInteractionLocked() const {} + 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::isPlayerInteractableLocked() const { + mVec3_c v = dAcPy_c::GetLink()->mPosition - mPosition; + v.rotY(-mRotation.y); + v.x += 80.f; + + 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() { + Event event(getDoorInteractionName(), 100, 0x100001, nullptr, nullptr); + EventManager::setEvent(this, &event, nullptr); +} From 8c660e86e8fbdc18c91be780b882e01c9646857a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 26 Nov 2025 17:40:01 -0500 Subject: [PATCH 7/8] cleanups and docs --- config/SOUE01/rels/d_a_obj_doorNP/symbols.txt | 58 +-- config/SOUE01/symbols.txt | 2 +- include/d/a/d_a_base.h | 3 + include/d/a/obj/d_a_obj_door.h | 282 ++++++------ 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 + .../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 + 10 files changed, 431 insertions(+), 358 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt index 67013f44..0388c66e 100644 --- a/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_doorNP/symbols.txt @@ -5,10 +5,10 @@ dAcOdoor_c_classInit__Fv = .text:0x00000070; // type:function size:0x110 getDoorMapping__26@unnamed@d_a_obj_door_cpp@FUlRPCQ226@unnamed@d_a_obj_door_cpp@15DoorFileMapping = .text:0x00000180; // type:function size:0x68 getDoorResName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x000001F0; // type:function size:0x4C getDoorMdlName__26@unnamed@d_a_obj_door_cpp@FUlRPCc = .text:0x00000240; // type:function size:0x4C -getDoorUnknown__26@unnamed@d_a_obj_door_cpp@FUcRUc = .text:0x00000290; // type:function size:0x58 -isDoorSpecial__26@unnamed@d_a_obj_door_cpp@Fl = .text:0x000002F0; // type:function size:0x4C +getDoorCallbackTypeMapped__26@unnamed@d_a_obj_door_cpp@FUcRUc = .text:0x00000290; // type:function size:0x58 +isDoubleDoorType__26@unnamed@d_a_obj_door_cpp@Fl = .text:0x000002F0; // type:function size:0x4C getDoorInteractionName__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000340; // type:function size:0xC -isInOuterSandship__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000350; // type:function size:0x7C +isInSandshipBoss__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000350; // type:function size:0x7C isInEvent__26@unnamed@d_a_obj_door_cpp@FPCc = .text:0x000003D0; // type:function size:0x40 isInTimeDoorEvent__26@unnamed@d_a_obj_door_cpp@Fv = .text:0x00000410; // type:function size:0x7C checkRoom__26@unnamed@d_a_obj_door_cpp@FScRb = .text:0x00000490; // type:function size:0x68 @@ -44,12 +44,12 @@ registerInEvent__10dAcOdoor_cFv = .text:0x00003CF0; // type:function size:0x3C unkVirtFunc_0x6C__10dAcOdoor_cFv = .text:0x00003D30; // type:function size:0x4 doInteraction__10dAcOdoor_cFl = .text:0x00003D40; // type:function size:0x1EC getLockParameter__10dAcOdoor_cFv = .text:0x00003F30; // type:function size:0xC -getSubtype2__10dAcOdoor_cFv = .text:0x00003F40; // type:function size:0xC +getLockBehavior__10dAcOdoor_cFv = .text:0x00003F40; // type:function size:0xC getSceneflag__10dAcOdoor_cFv = .text:0x00003F50; // type:function size:0xC -fn_572_3F60__10dAcOdoor_cFv = .text:0x00003F60; // type:function size:0xC -fn_572_3F70__10dAcOdoor_cFv = .text:0x00003F70; // type:function size:0xC -fn_572_3F80__10dAcOdoor_cFv = .text:0x00003F80; // type:function size:0xC -fn_572_3F90__10dAcOdoor_cFv = .text:0x00003F90; // type:function size:0x24 +getDoorCallbackType__10dAcOdoor_cFv = .text:0x00003F60; // type:function size:0xC +getFrontRoomParam__10dAcOdoor_cFv = .text:0x00003F70; // type:function size:0xC +getBackRoomParam__10dAcOdoor_cFv = .text:0x00003F80; // type:function size:0xC +getFailedToOpenFlag__10dAcOdoor_cFv = .text:0x00003F90; // type:function size:0x24 getInteractionMinX__10dAcOdoor_cFv = .text:0x00003FC0; // type:function size:0xC getInteractionMaxX__10dAcOdoor_cFv = .text:0x00003FD0; // type:function size:0xC getInteractionMinZ__10dAcOdoor_cFv = .text:0x00003FE0; // type:function size:0xC @@ -59,32 +59,32 @@ getInteractionLockMaxX__10dAcOdoor_cFv = .text:0x00004010; // type:function size getInteractionLockMinZ__10dAcOdoor_cFv = .text:0x00004020; // type:function size:0xC getInteractionLockMaxZ__10dAcOdoor_cFv = .text:0x00004030; // type:function size:0xC setRoomId__10dAcOdoor_cFSc = .text:0x00004040; // type:function size:0x8 -fn_572_4050__10dAcOdoor_cFUl = .text:0x00004050; // type:function size:0x8 -fn_572_4060__10dAcOdoor_cFUc = .text:0x00004060; // type:function size:0x8 -fn_572_4070__10dAcOdoor_cFSc = .text:0x00004070; // type:function size:0x8 -fn_572_4080__10dAcOdoor_cFSc = .text:0x00004080; // type:function size:0x8 -fn_572_4090__10dAcOdoor_cFv = .text:0x00004090; // type:function size:0xC -fn_572_40A0__10dAcOdoor_cFv = .text:0x000040A0; // type:function size:0xC -fn_572_40B0__10dAcOdoor_cFv = .text:0x000040B0; // type:function size:0xC -fn_572_40C0__10dAcOdoor_cFv = .text:0x000040C0; // type:function size:0xC -fn_572_40D0__10dAcOdoor_cFv = .text:0x000040D0; // type:function size:0xC -fn_572_40E0__10dAcOdoor_cCFv = .text:0x000040E0; // type:function size:0xC -fn_572_40F0__10dAcOdoor_cFv = .text:0x000040F0; // type:function size:0xC -fn_572_4100__10dAcOdoor_cFv = .text:0x00004100; // type:function size:0xC -fn_572_4110__10dAcOdoor_cFv = .text:0x00004110; // type:function size:0xC -fn_572_4120__10dAcOdoor_cFv = .text:0x00004120; // type:function size:0xC -fn_572_4130__10dAcOdoor_cCFRb = .text:0x00004130; // type:function size:0xC -fn_572_4140__10dAcOdoor_cCFRb = .text:0x00004140; // type:function size:0xC -fn_572_4150__10dAcOdoor_cCFRb = .text:0x00004150; // type:function size:0x90 +setFlag__10dAcOdoor_cFUl = .text:0x00004050; // type:function size:0x8 +setEventCallbackType__10dAcOdoor_cFUc = .text:0x00004060; // type:function size:0x8 +setFrontRoom__10dAcOdoor_cFSc = .text:0x00004070; // type:function size:0x8 +setBackRoom__10dAcOdoor_cFSc = .text:0x00004080; // type:function size:0x8 +setDoubleDoor__10dAcOdoor_cFv = .text:0x00004090; // type:function size:0xC +setNotDoubleDoor__10dAcOdoor_cFv = .text:0x000040A0; // type:function size:0xC +setSingleDoor__10dAcOdoor_cFv = .text:0x000040B0; // type:function size:0xC +setNotSingleDoor__10dAcOdoor_cFv = .text:0x000040C0; // type:function size:0xC +setInSandshipBoss__10dAcOdoor_cFv = .text:0x000040D0; // type:function size:0xC +isTimeDoorEventActive__10dAcOdoor_cCFv = .text:0x000040E0; // type:function size:0xC +setTimeDoorEventActive__10dAcOdoor_cFv = .text:0x000040F0; // type:function size:0xC +setTimeDoorEventInactive__10dAcOdoor_cFv = .text:0x00004100; // type:function size:0xC +setTimeEffected__10dAcOdoor_cFv = .text:0x00004110; // type:function size:0xC +setTimeStatic__10dAcOdoor_cFv = .text:0x00004120; // type:function size:0xC +checkFrontRoom__10dAcOdoor_cCFRb = .text:0x00004130; // type:function size:0xC +checkBackRoom__10dAcOdoor_cCFRb = .text:0x00004140; // type:function size:0xC +checkRooms__10dAcOdoor_cCFRb = .text:0x00004150; // type:function size:0x90 triggerExit__10dAcOdoor_cFv = .text:0x000041E0; // type:function size:0x7C isLeavingSealedTempleSideDoorPostSkyKeep__10dAcOdoor_cCFv = .text:0x00004260; // type:function size:0xAC transitionPushRoomFlags__10dAcOdoor_cCFv = .text:0x00004310; // type:function size:0x2C transitionPullRoomFlags__10dAcOdoor_cCFv = .text:0x00004340; // type:function size:0x2C -fn_572_4370__10dAcOdoor_cCFRC7mVec3_c = .text:0x00004370; // type:function size:0x84 -isPlayerInFrontOfDoor__10dAcOdoor_cCFv = .text:0x00004400; // type:function size:0x10 +isPositionInFrontOfDoor__10dAcOdoor_cCFRC7mVec3_c = .text:0x00004370; // type:function size:0x84 +checkPullDoor__10dAcOdoor_cCFv = .text:0x00004400; // type:function size:0x10 hasFlowEntryPoint__10dAcOdoor_cFv = .text:0x00004410; // type:function size:0x18 -fn_572_4430__10dAcOdoor_cCFv = .text:0x00004430; // type:function size:0xC -fn_572_4440__10dAcOdoor_cFv = .text:0x00004440; // type:function size:0xE4 +isTimeEffected__10dAcOdoor_cCFv = .text:0x00004430; // type:function size:0xC +setDoorKnobPosition__10dAcOdoor_cFv = .text:0x00004440; // type:function size:0xE4 isPlayerInteractable__10dAcOdoor_cCFv = .text:0x00004530; // type:function size:0xD0 isPlayerInteractableLocked__10dAcOdoor_cCFv = .text:0x00004600; // type:function size:0xE4 playInteractionLocked__10dAcOdoor_cFv = .text:0x000046F0; // type:function size:0x68 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index a722eb7b..e056ee9c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1138,7 +1138,7 @@ fn_8002ECD0 = .text:0x8002ECD0; // type:function size:0x50 fn_8002ED20 = .text:0x8002ED20; // type:function size:0x88 fn_8002edb0__12dAcObjBase_cFRQ23m3d15mShadowCircle_cRQ23m3d6smdl_cPC7mQuat_cllf = .text:0x8002EDB0; // type:function size:0x8C drawShadow__12dAcObjBase_cFRQ23m3d15mShadowCircle_cPvRC6mMtx_cPC7mQuat_clllllf = .text:0x8002EE40; // type:function size:0xFC -actorSpawnAtActor2 = .text:0x8002EF40; // type:function size:0x24 +create__12dAcObjBase_cFP12dAcObjBase_cQ28fProfile14PROFILE_NAME_eUlPC7mVec3_cPC7mAng3_cPC7mVec3_cUlUl = .text:0x8002EF40; // type:function size:0x24 fn_8002EF70 = .text:0x8002EF70; // type:function size:0x28 fn_8002EFA0 = .text:0x8002EFA0; // type:function size:0x50 fn_8002eff0__12dAcObjBase_cFRCfRCsP8cCcD_ObjRCfRCf = .text:0x8002EFF0; // type:function size:0x194 diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 97e33e47..45b2336f 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -125,6 +125,9 @@ public: public: dAcBase_c(); + void setSubtype(u8 sub) { + mSubtype = sub; + } void setPosition(const mVec3_c &r) { mPosition = r; } diff --git a/include/d/a/obj/d_a_obj_door.h b/include/d/a/obj/d_a_obj_door.h index fded4fa4..4992c954 100644 --- a/include/d/a/obj/d_a_obj_door.h +++ b/include/d/a/obj/d_a_obj_door.h @@ -24,30 +24,41 @@ class dAcOLock_c; class dAcOdoor_c : public dAcObjDoor_c { public: enum Subtype_e { - SUBTYPE_0, ///< DoorA00 - SUBTYPE_1, ///< DoorA01 - SUBTYPE_2, ///< DoorC00 - SUBTYPE_3, ///< DoorC01 - SUBTYPE_4, ///< DoorB00 - SUBTYPE_5, ///< DoorE - SUBTYPE_6, ///< DoorA02 - SUBTYPE_7, ///< DoorF - SUBTYPE_8, ///< DoorH + DOOR_NORMAL, ///< DoorA00 - Normal Wooden Door + DOOR_METAL, ///< DoorA01 - Metal Door - Academy(bathrooms) + DOOR_DOUBLE, ///< DoorC00 - Normal Double Doors + DOOR_DOUBLE_OUTSIDE, ///< DoorC01 - Outdoor Double Doors - Academy(to outside) + DOOR_TEMPLE_SIDE, ///< DoorB00 - Sealed Temple Side Doors + DOOR_SANDSEA_TIMESHIFT, ///< DoorE - Sandsea Timeshift Door + DOOR_BATREAUX, ///< DoorA02 - Batreaux's Door + DOOR_TEMPLE_MAIN, ///< DoorF - Sealed Temple Main Door + DOOR_SPARRING_HALL, ///< DoorH - Sparring Hall Outer Doors }; - enum LockType_c { + enum LockType_e { LOCK_NONE = 0, ///< Door does not have a lock LOCK_KEY = 1, ///< Door usually is locked }; + enum LockBehavior_e { + LOCK_NEVER = 0, ///< Door is always unlocked + LOCK_NOT_SET = 1, ///< Door is locked when mSceneflag is unset + LOCK_NEVER1 = 2, ///< Door is always unlocked (Kukiel's House) + LOCK_TIMESHIFT = 3, ///< Door is locked when mSceneflag is unset (Timeshift) + LOCK_SET = 4, ///< Door is locked when mSceneflag is set + LOCK_DAY = 5, ///< Door is locked during the day + LOCK_NIGHT = 6, ///< Door is locked during the night + LOCK_MAX, + }; + public: dAcOdoor_c() : mEventRelated(*this, nullptr), mEmmiterL(this), mEmmiterR(this), mFlags(0), - field_0x5B0(0), - field_0x5B9(false), + mExitTimer(0), + mbInSandshipBoss(false), field_0x5BA(false) {} virtual ~dAcOdoor_c() {} @@ -63,207 +74,207 @@ public: virtual void doInteraction(s32 /* InteractionType */) override; virtual bool canOpen() override; - /** */ + /** Gets whether the player can open the door */ bool isLocked(); /** fn_572_33E0 - I Think this gets the Door open range*/ - static f32 fn_572_33E0(); // -80.f + static f32 fn_572_33E0(); - /** */ + /** Self Explanatory */ void startPullEventWithoutCallback(void *zevData); - /** */ + /** Self Explanatory */ void startPullEventWithCallback(void *zevData); - /** */ + /** Self Explanatory */ void startPushEventWithoutCallback(void *zevData); - /** */ + /** Self Explanatory */ void startPushEventWithCallback(void *zevData); - /** */ + /** Self Explanatory */ void startPullEvent(void *zevData); - /** */ + /** Self Explanatory */ void startPushEvent(void *zevData); - /** */ + /** Self Explanatory */ void startOpenEvent(void *zevData); - /** */ + /** Self Explanatory */ static void doorPullEventCallback(void *); - /** */ + /** Self Explanatory */ static void doorPushEventCallback(void *); - /** */ + /** Self Explanatory */ void startDoorPullLockedEvent(void *zevData); - /** */ + /** Self Explanatory */ void startDoorPushLockedEvent(void *zevData); - /** */ + /** Self Explanatory */ void startLockedEvent(void *zevData); - /** */ + /** Self Explanatory */ static void pullLockedEventCallback(void *); - /** */ + /** Self Explanatory */ static void pushLockedEventCallback(void *); - /** */ + /** Self Explanatory */ void startUnlockEvent(); - /** */ + /** Self Explanatory */ static void unlockEventCallback(void *); - /** */ + /** Self Explanatory */ static void openCallbackCommon(void *); - /** */ - s32 getLockParameter(); // getFromParams(6, 0x1) + /** Returns if the door is physically locked with the dAcOLock_c Actor */ + s32 getLockParameter(); - /** */ - s32 getSubtype2(); // (mRotation.x >> 0) & 0xFF + /** Gets the behavior of being locked when not locked with the dAcOLock_c Actor */ + s32 getLockBehavior(); - /** */ - u8 getSceneflag(); // (mRotation.x >> 8) & 0xFF + /** Get Scenflag used for locking status */ + u8 getSceneflag(); - /** fn_572_3F60 */ - u8 fn_572_3F60(); // (mRotation.z >> 0) & 0xF + /** Gets whether the door has callbacks enabled */ + u8 getDoorCallbackType(); - /** fn_572_3F70 */ - u8 fn_572_3F70(); // (mRotation.z >> 4) & 0x3F + /** getFrontRoomParam */ + u8 getFrontRoomParam(); // (mRotation.z >> 4) & 0x3F - /** fn_572_3F80 */ - u8 fn_572_3F80(); // (mRotation.z >> 10) & 0x3F + /** getBackRoomParam */ + u8 getBackRoomParam(); // (mRotation.z >> 10) & 0x3F - /** (getParams2Lower() >> 0) & 0xFF */ - u16 fn_572_3F90(); + /** Gets the Flag set when failed to open - Called from Try Locked Callback */ + u16 getFailedToOpenFlag(); - /** fn_572_3FC0 */ - static f32 getInteractionMinX(); // -80.f + /** Interaction Radius -X */ + static f32 getInteractionMinX(); - /** fn_572_3FD0 */ - static f32 getInteractionMaxX(); // 80.f + /** Interaction Radius +X */ + static f32 getInteractionMaxX(); - /** fn_572_3FE0 */ - static f32 getInteractionMinZ(); // -100.f + /** Interaction Radius -Z */ + static f32 getInteractionMinZ(); - /** fn_572_3FF0 */ - static f32 getInteractionMaxZ(); // 100.f + /** Interaction Radius +Z */ + static f32 getInteractionMaxZ(); - /** fn_572_4000 */ - static f32 getInteractionLockMinX(); // -160.f + /** Interaction Radius -X - Door has Lock */ + static f32 getInteractionLockMinX(); - /** fn_572_4010 */ - static f32 getInteractionLockMaxX(); // 160.f + /** Interaction Radius +X - Door has Lock */ + static f32 getInteractionLockMaxX(); - /** fn_572_4020 */ - static f32 getInteractionLockMinZ(); // -100.f + /** Interaction Radius -Z - Door has Lock */ + static f32 getInteractionLockMinZ(); - /** fn_572_4030 */ - static f32 getInteractionLockMaxZ(); // 100.f + /** Interaction Radius +Z - Door has Lock */ + static f32 getInteractionLockMaxZ(); - /** */ - void setRoomId(s8 roomId); // mRoomId = roomId; + /** Sets the RoomID */ + void setRoomId(s8 roomId); - /** fn_572_4050 */ - void fn_572_4050(u32 flags); // field_0x5A8 = flags + /** Set Flag - Usually Time Door related */ + void setFlag(u32 flags); - /** fn_572_4060 */ - void fn_572_4060(u8); // field_0x5B3 = in + /** Sets the behavior on Event creation */ + void setEventCallbackType(u8); - /** fn_572_4070 */ - void fn_572_4070(s8); // field_0x5B4 = in + /** setFrontRoom */ + void setFrontRoom(s8); // mFrontRoomId = in - /** fn_572_4080 */ - void fn_572_4080(s8); // field_0x5B5 = in + /** setBackRoom */ + void setBackRoom(s8); // mBackRoomId = in - /** fn_572_4090 */ - void fn_572_4090(); // field_0x5B7 = true + /** Sets status indicating it can be a double door */ + void setDoubleDoor(); - /** fn_572_40A0 */ - void fn_572_40A0(); // field_0x5B7 = false + /** Sets status indicating it cant be a double door */ + void setNotDoubleDoor(); - /** fn_572_40B0 */ - void fn_572_40B0(); // field_0x5B8 = true + /** Sets status indicating its a single door / Main door */ + void setSingleDoor(); - /** fn_572_40C0 */ - void fn_572_40C0(); // field_0x5B8 = false + /** Sets status indicating its not a single door / not Main door */ + void setNotSingleDoor(); - /** fn_572_40D0 */ - void fn_572_40D0(); // field_0x5B9 = true + /** setInSandshipBoss */ + void setInSandshipBoss(); // mbInSandshipBoss = true - /** fn_572_40E0 */ - bool fn_572_40E0() const; // field_0x5A8 & 1 + /** isTimeDoorEventActive */ + bool isTimeDoorEventActive() const; - /** fn_572_40F0 */ - void fn_572_40F0(); // field_0x5A8 |= 1 + /** setTimeDoorEventActive */ + void setTimeDoorEventActive(); - /** fn_572_4100 */ - void fn_572_4100(); // field_0x5A8 &= ~1 + /** setTimeDoorEventInactive */ + void setTimeDoorEventInactive(); - /** fn_572_4110 */ - void fn_572_4110(); // field_0x5A8 |= 2 + /** Sets status indicating it is effected by Timeshift */ + void setTimeEffected(); - /** fn_572_4120 */ - void fn_572_4120(); // field_0x5A8 &= ~2 + /** Sets status indicating it is not effected by Timeshift */ + void setTimeStatic(); - /** fn_572_4130 */ - bool fn_572_4130(bool &b) const; // checkRoom(field_0x5B4,b) + /** Checks to see if the Front room exists(return) and has flags set(b) */ + bool checkFrontRoom(bool &b) const; - /** fn_572_4140 */ - bool fn_572_4140(bool &b) const; // checkRoom(field_0x5B5,b) + /** Checks to see if the Back room exists(return) and has flags set(b) */ + bool checkBackRoom(bool &b) const; - /** fn_572_4150 */ - bool fn_572_4150(bool &b) const; // fn_572_4130(b0) && fn_572_4140(b1) -> b = b0 && b1 + /** Checks to see if the Front and Back room exists(return) and has flags set(b) */ + bool checkRooms(bool &b) const; - /** */ + /** Transitions the game to the next room */ void triggerExit(); - /** */ + /** TODO(Zeldex) Whats special about this? */ bool isLeavingSealedTempleSideDoorPostSkyKeep() const; - /** fn_572_4310 */ + /** */ void transitionPushRoomFlags() const; - /** fn_572_4430 */ + /** */ void transitionPullRoomFlags() const; - /** fn_572_4370 */ - bool fn_572_4370(const mVec3_c &point) const; // Is in front of door + /** Checks a point to determine which side of the door it is on */ + bool isPositionInFrontOfDoor(const mVec3_c &point) const; - /** */ - bool isPlayerInFrontOfDoor() const; + /** Checks the players postion to see if it is front of the door. This means it will be pulled open */ + bool checkPullDoor() const; - /** */ + /** Checks to see if the door has a flow entry point */ bool hasFlowEntryPoint(); - /** fn_572_4430 */ - bool fn_572_4430() const; // field_0x5A8 & 2 + /** Checks to see if the Door is effected by Timeshift */ + bool isTimeEffected() const; - /** fn_572_4440 */ - void fn_572_4440(); // Sets the Postion Copies + /** Sets the Position of the Doorknob based on the Animation */ + void setDoorKnobPosition(); - /** */ + /** Checks to see if the Player is within an interactable range */ bool isPlayerInteractable() const; - /** fn_572_4600 */ + /** Checks to see if the Player is within an interactable range when door is locked */ bool isPlayerInteractableLocked() const; - /** */ + /** Plays the talk event for when the door is locked */ void playInteractionLocked(); public: - s32 getType() { - return getFromParams(0, 0x3F); + s32 getType() const { + return mParams & 0x3F; } s32 getField_0x5B4() const { - return field_0x5B4; + return mFrontRoomId; } s32 getField_0x5B5() const { - return field_0x5B5; + return mBackRoomId; } public: // Functions in this section defined in main dol @@ -282,24 +293,27 @@ private: /* 0x4E8 */ dEmitter_c mEmmiterL; /* 0x51C */ dEmitter_c mEmmiterR; /* 0x550 */ dTimeBits mTimeBits; - /* 0x554 */ dAcRef_c mConnectedDoor; + /* 0x554 */ dAcRef_c mConnectedDoor; ///< When the door is a double door, this is its pair /* 0x560 */ dAcRef_c mLock; - /* 0x56C */ dAcRef_c mObjRef; - /* 0x578 */ mMtx_c mMtx; - /* 0x5A8 */ u32 mFlags; ///< - /* 0x5AC */ u32 mRumbleIdx; ///< - /* 0x5B0 */ u8 field_0x5B0; ///< some timer to trigger exit - /* 0x5B1 */ u8 field_0x5B1; ///< - /* 0x5B2 */ u8 mSceneflag; ///< Used for unlocking the door - /* 0x5B3 */ u8 field_0x5B3; ///< - /* 0x5B4 */ s8 field_0x5B4; - /* 0x5B5 */ s8 field_0x5B5; - /* 0x5B6 */ s8 field_0x5B6; - /* 0x5B7 */ bool field_0x5B7; - /* 0x5B8 */ bool field_0x5B8; - /* 0x5B9 */ bool field_0x5B9; - /* 0x5BA */ bool field_0x5BA; - /* 0x5BB */ bool field_0x5BB; + /* 0x56C */ dAcRef_c mObjRef; ///< TODO(Zeldex) This is probably the Sandship stage for boss + + /* 0x578 */ mMtx_c mMtx; ///< Currently unknown. I am assuming this is used to move the door on the Sandship stage + ///< while the boat is rocking + + /* 0x5A8 */ u32 mFlags; ///< 0x2 - Time Effected + /* 0x5AC */ u32 mRumbleIdx; ///< Rumble used for when opening the main sealed temple door + /* 0x5B0 */ u8 mExitTimer; ///< Timer used to advance the Begin Pull/Push events + /* 0x5B1 */ u8 mLockBehavior; ///< see LockBehavior_e + /* 0x5B2 */ u8 mSceneflag; ///< Used for unlocking/locking the door. + /* 0x5B3 */ u8 mEventCallbackType; ///< 0 for events without callbacks, 1 for events with a callback + /* 0x5B4 */ s8 mFrontRoomId; ///< Room id of the front side of the door + /* 0x5B5 */ s8 mBackRoomId; ///< Room id of the back side of the door + /* 0x5B6 */ s8 mFramesInEvent; ///< The count of frames in one particular event + /* 0x5B7 */ bool mbDoubleDoor; ///< Set if the type was matched to be a double door variant + /* 0x5B8 */ bool mbSingleDoor; ///< UNUSHED - Set if the type was matched to be a single door + /* 0x5B9 */ bool mbInSandshipBoss; ///< Indicates if in the Tentalus fight + /* 0x5BA */ bool field_0x5BA; ///< ??? + /* 0x5BB */ bool mbKobunDoor; ///< Used to indicate its Cawlin and Strich's door }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_door.cpp b/src/REL/d/a/obj/d_a_obj_door.cpp index 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() {} From 466ddb54013e1adcbd7eef1a48ddfc9cfc956973 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 27 Nov 2025 10:51:12 +0100 Subject: [PATCH 8/8] Fix warnings --- src/REL/d/a/obj/d_a_obj_door.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 {