From 306ae916d55c49ba3c1c1d0367a2af9e1acbc60d Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 13:55:01 -0500 Subject: [PATCH 01/15] init for d_t_barrel --- .../rels/d_a_obj_stage_sinkNP/symbols.txt | 2 +- config/SOUE01/rels/d_t_barrelNP/symbols.txt | 26 +-- include/d/a/obj/d_a_obj_stage_sink.h | 5 +- include/d/t/d_t_barrel.h | 31 +++- include/d/t/d_t_barrel_pos.h | 14 +- src/REL/d/t/d_t_barrel.cpp | 162 +++++++++++++++++- 6 files changed, 218 insertions(+), 22 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_stage_sinkNP/symbols.txt b/config/SOUE01/rels/d_a_obj_stage_sinkNP/symbols.txt index 8f334956..61479d7c 100644 --- a/config/SOUE01/rels/d_a_obj_stage_sinkNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_stage_sinkNP/symbols.txt @@ -25,7 +25,7 @@ finalizeState_Wait__15dAcOstageSink_cFv = .text:0x00000AA0; // type:function siz initializeState_Move__15dAcOstageSink_cFv = .text:0x00000AB0; // type:function size:0x4 executeState_Move__15dAcOstageSink_cFv = .text:0x00000AC0; // type:function size:0x23C finalizeState_Move__15dAcOstageSink_cFv = .text:0x00000D00; // type:function size:0x4 -fn_383_D10 = .text:0x00000D10; // type:function size:0xC +GetInstance__15dAcOstageSink_cFv = .text:0x00000D10; // type:function size:0xC fn_383_D20 = .text:0x00000D20; // type:function size:0xA0 fn_383_DC0 = .text:0x00000DC0; // type:function size:0x18 __dt__15dAcOstageSink_cFv = .text:0x00000DE0; // type:function size:0x100 diff --git a/config/SOUE01/rels/d_t_barrelNP/symbols.txt b/config/SOUE01/rels/d_t_barrelNP/symbols.txt index a56a2e20..fe6cee1f 100644 --- a/config/SOUE01/rels/d_t_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_t_barrelNP/symbols.txt @@ -4,31 +4,31 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dTgBarrel_c_classInit__Fv = .text:0x000000F0; // type:function size:0x100 -__dt__11dTgBarrel_cFv = .text:0x000001F0; // type:function size:0x58 +__dt__5dTg_cFv = .text:0x000001F0; // type:function size:0x58 __dt__24sFState_c<11dTgBarrel_c>Fv = .text:0x00000250; // type:function size:0x58 __dt__27sFStateFct_c<11dTgBarrel_c>Fv = .text:0x000002B0; // type:function size:0x6C __dt__80sStateMgr_c<11dTgBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000320; // type:function size:0xA0 __dt__50sFStateMgr_c<11dTgBarrel_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003C0; // type:function size:0xA4 -fn_442_470 = .text:0x00000470; // type:function size:0x14 -fn_442_490 = .text:0x00000490; // type:function size:0x58 -fn_442_4F0 = .text:0x000004F0; // type:function size:0x14 -fn_442_510 = .text:0x00000510; // type:function size:0x58 -TgBarrel__init1 = .text:0x00000570; // type:function size:0xC0 +__ct__24dAcRef_c<12dAcOBarrel_c>Fv = .text:0x00000470; // type:function size:0x14 +__dt__24dAcRef_c<12dAcOBarrel_c>Fv = .text:0x00000490; // type:function size:0x58 +__ct__26dAcRef_c<14dTgBarrelPos_c>Fv = .text:0x000004F0; // type:function size:0x14 +__dt__26dAcRef_c<14dTgBarrelPos_c>Fv = .text:0x00000510; // type:function size:0x58 +actorCreate__11dTgBarrel_cFv = .text:0x00000570; // type:function size:0xC0 changeState__80sStateMgr_c<11dTgBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000630; // type:function size:0x10 -TgBarrel__init2 = .text:0x00000640; // type:function size:0x9C -fn_442_6E0 = .text:0x000006E0; // type:function size:0x8 -TgBarrel__update = .text:0x000006F0; // type:function size:0x30 +actorPostCreate__11dTgBarrel_cFv = .text:0x00000640; // type:function size:0x9C +doDelete__11dTgBarrel_cFv = .text:0x000006E0; // type:function size:0x8 +actorExecute__11dTgBarrel_cFv = .text:0x000006F0; // type:function size:0x30 executeState__80sStateMgr_c<11dTgBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000720; // type:function size:0x10 -fn_442_730 = .text:0x00000730; // type:function size:0x8 +draw__11dTgBarrel_cFv = .text:0x00000730; // type:function size:0x8 initializeState_Wait__11dTgBarrel_cFv = .text:0x00000740; // type:function size:0x4 executeState_Wait__11dTgBarrel_cFv = .text:0x00000750; // type:function size:0x2E0 -fn_442_A30 = .text:0x00000A30; // type:function size:0x1C +calcTimer__4sLibFPUc_Uc = .text:0x00000A30; // type:function size:0x1C finalizeState_Wait__11dTgBarrel_cFv = .text:0x00000A50; // type:function size:0x4 initializeState_Stop__11dTgBarrel_cFv = .text:0x00000A60; // type:function size:0x4 executeState_Stop__11dTgBarrel_cFv = .text:0x00000A70; // type:function size:0x74 finalizeState_Stop__11dTgBarrel_cFv = .text:0x00000AF0; // type:function size:0x4 -fn_442_B00 = .text:0x00000B00; // type:function size:0x21C -fn_442_D20 = .text:0x00000D20; // type:function size:0x108 +checkPlayerPos__11dTgBarrel_cFRC7mVec3_c = .text:0x00000B00; // type:function size:0x21C +__dt__11dTgBarrel_cFv = .text:0x00000D20; // type:function size:0x108 getStateID__80sStateMgr_c<11dTgBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000E30; // type:function size:0x10 build__27sFStateFct_c<11dTgBarrel_c>FRC12sStateIDIf_c = .text:0x00000E40; // type:function size:0x60 dispose__27sFStateFct_c<11dTgBarrel_c>FRP10sStateIf_c = .text:0x00000EA0; // type:function size:0xC diff --git a/include/d/a/obj/d_a_obj_stage_sink.h b/include/d/a/obj/d_a_obj_stage_sink.h index c8da109e..7a0340b4 100644 --- a/include/d/a/obj/d_a_obj_stage_sink.h +++ b/include/d/a/obj/d_a_obj_stage_sink.h @@ -3,7 +3,6 @@ #include "d/a/obj/d_a_obj_base.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dAcOstageSink_c : public dAcObjBase_c { public: @@ -13,8 +12,12 @@ public: STATE_FUNC_DECLARE(dAcOstageSink_c, Wait); STATE_FUNC_DECLARE(dAcOstageSink_c, Move); + static dAcOstageSink_c *GetInstance(); + private: /* 0x??? */ STATE_MGR_DECLARE(dAcOstageSink_c); + + static dAcOstageSink_c *sInstance; }; #endif diff --git a/include/d/t/d_t_barrel.h b/include/d/t/d_t_barrel.h index a1255eb4..b122a196 100644 --- a/include/d/t/d_t_barrel.h +++ b/include/d/t/d_t_barrel.h @@ -1,20 +1,45 @@ #ifndef D_T_BARREL_H #define D_T_BARREL_H +#include "common.h" #include "d/a/d_a_base.h" +#include "d/t/d_tg.h" +#include "m/m_vec.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" -class dTgBarrel_c : public dAcBase_c { +class dTgBarrelPos_c; +class dAcOBarrel_c; +class dAcOstageSink_c; + +class dTgBarrel_c : public dTg_c { public: dTgBarrel_c() : mStateMgr(*this, sStateID::null) {} virtual ~dTgBarrel_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dTgBarrel_c, Wait); STATE_FUNC_DECLARE(dTgBarrel_c, Stop); + bool checkPlayerPos(const mVec3_c &playerPos); + private: - /* 0x??? */ STATE_MGR_DECLARE(dTgBarrel_c); + /* 0x0FC */ STATE_MGR_DECLARE(dTgBarrel_c); + /* 0x138 */ dAcRef_c mStageRef; + /* 0x144 */ dAcRef_c mTgBarrelPosArr[10]; + /* 0x1BC */ dAcRef_c mBarrelArr[10]; + /* 0x234 */ mVec3_c mSpawnPosition; + /* 0x240 */ u8 field_0x240; ///< Stop Sceneflag + /* 0x241 */ u8 field_0x241; ///< Barrel Spawn Interval in Seconds + /* 0x242 */ u8 field_0x242; ///< Barrel Spawn Timer + /* 0x243 */ u8 field_0x243; + /* 0x244 */ u8 field_0x244; + /* 0x245 */ u8 field_0x245; + /* 0x246 */ u8 field_0x246; }; #endif diff --git a/include/d/t/d_t_barrel_pos.h b/include/d/t/d_t_barrel_pos.h index 2c0ac8f0..7685cde8 100644 --- a/include/d/t/d_t_barrel_pos.h +++ b/include/d/t/d_t_barrel_pos.h @@ -1,14 +1,24 @@ #ifndef D_T_BARREL_POS_H #define D_T_BARREL_POS_H -#include "d/a/d_a_base.h" +#include "d/t/d_tg.h" -class dTgBarrelPos_c : public dAcBase_c { +class dTgBarrelPos_c : public dTg_c { public: dTgBarrelPos_c() {} virtual ~dTgBarrelPos_c() {} + u8 getLinkIndex() const { + return mLinkIndex; + } + u8 getLinkId() const { + return mLinkId; + } + private: + /* 0x0FC */ u8 _0xFC[0x114 - 0xFC]; + /* 0x114 */ u8 mLinkIndex; + /* 0x115 */ u8 mLinkId; }; #endif diff --git a/src/REL/d/t/d_t_barrel.cpp b/src/REL/d/t/d_t_barrel.cpp index 40a232ef..3161ce50 100644 --- a/src/REL/d/t/d_t_barrel.cpp +++ b/src/REL/d/t/d_t_barrel.cpp @@ -1,13 +1,171 @@ #include "d/t/d_t_barrel.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_barrel.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_stage_sink.h" +#include "d/flag/sceneflag_manager.h" +#include "d/t/d_t_barrel_pos.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "s/s_Math.h" + SPECIAL_ACTOR_PROFILE(TAG_BARREL, dTgBarrel_c, fProfile::TAG_BARREL, 0x221, 0, 0); STATE_DEFINE(dTgBarrel_c, Wait); STATE_DEFINE(dTgBarrel_c, Stop); +// Weak function ordering issue of the ctor and dtpr of the objects +// for the following in the member arrays +// dAcRef_c +// dAcRef_c + +int dTgBarrel_c::actorCreate() { + field_0x240 = getFromParams(0, 0xFF); + field_0x245 = getFromParams(16, 0xF); + field_0x241 = getFromParams(8, 0xFF); + field_0x242 = 1; + + mStageRef.link(dAcOstageSink_c::GetInstance()); + mSpawnPosition = mPosition; + + for (int i = 0; i < (int)ARRAY_LENGTH(mBarrelArr); ++i) { + mBarrelArr[i].unlink(); + } + + mStateMgr.changeState(StateID_Wait); + + return SUCCEEDED; +} + +int dTgBarrel_c::actorPostCreate() { + dTgBarrelPos_c *pTgBarrelPos = nullptr; + do { + pTgBarrelPos = + static_cast(fManager_c::searchBaseByProfName(fProfile::TAG_BARREL_POS, pTgBarrelPos)); + + if (pTgBarrelPos != nullptr) { + u8 index = pTgBarrelPos->getLinkIndex(); + if (field_0x245 == pTgBarrelPos->getLinkId()) { + mTgBarrelPosArr[index].link(pTgBarrelPos); + if (index >= field_0x243) { + field_0x243 = index + 1; + } + } + } + + } while (pTgBarrelPos != nullptr); + + return SUCCEEDED; +} + +int dTgBarrel_c::doDelete() { + return SUCCEEDED; +} + +int dTgBarrel_c::actorExecute() { + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dTgBarrel_c::draw() { + return SUCCEEDED; +} + void dTgBarrel_c::initializeState_Wait() {} -void dTgBarrel_c::executeState_Wait() {} +void dTgBarrel_c::executeState_Wait() { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, field_0x240)) { + mStateMgr.changeState(StateID_Stop); + return; + } + dAcOstageSink_c *pStage = mStageRef.get(); + + mVec3_c pos = pStage->mPosition; + mAng3_c rot = pStage->mRotation; + + mVec3_c stageDist = mSpawnPosition - pos; + mMtx_c m; + m.transS(pos); + m.ZXYrotM(rot); + m.multVecSR(stageDist, mPosition); + + mPosition += pos; + + if (checkPlayerPos(dAcPy_c::GetLink()->mPosition)) { + if (0 == sLib::calcTimer(&field_0x242)) { + field_0x246 = 1; + + u8 idx = 0xFF; + for (int i = 0; i < (int)ARRAY_LENGTH(mBarrelArr); ++i) { + if (!mBarrelArr[i].isLinked()) { + idx = i; + // I think they forgor a break here + } + } + + if (idx != 0xFF) { + dTgBarrelPos_c *pTgBarrelPos = mTgBarrelPosArr[field_0x244].get(); + if (pTgBarrelPos != nullptr) { + mVec3_c spawnPos = pTgBarrelPos->mPosition; + mAng3_c spawnRot(0, 0x4000, 0); + dAcObjBase_c *pObj = dAcObjBase_c::create( + fProfile::OBJ_BARREL, mRoomID, 0xFF00FF2, &spawnPos, &spawnRot, nullptr, 0xFFFFFFFF + ); + mBarrelArr[idx].link(static_cast(pObj)); + } + if (++field_0x244 >= field_0x243) { + field_0x244 = 0; + } + } + field_0x242 = field_0x241 * 30; + } + } else { + if (field_0x246) { + field_0x242 = field_0x241 * 30; + } + } +} void dTgBarrel_c::finalizeState_Wait() {} + void dTgBarrel_c::initializeState_Stop() {} -void dTgBarrel_c::executeState_Stop() {} +void dTgBarrel_c::executeState_Stop() { + if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, field_0x240)) { + mStateMgr.changeState(StateID_Wait); + } +} void dTgBarrel_c::finalizeState_Stop() {} + +bool dTgBarrel_c::checkPlayerPos(const mVec3_c &playerPos) { + // NONMATCHING + // https://decomp.me/scratch/TM82x + f32 scale = 0.5f; + + mAng rot = mStageRef.get()->mRotation.y; + + mVec3_c pos = mPosition; + pos += mVec3_c::Ey * (mScale.y * 0.5f); + pos.x = (playerPos.x - pos.x) / mScale.x; + pos.y = (playerPos.y - pos.y) / mScale.y; + pos.z = (playerPos.z - pos.z) / mScale.z; + + f32 cos = rot.cos(); + if (rot.cos() != 0.f) { + scale = mScale.x * ((pos.x * rot.sin()) / rot.cos()) / mScale.y; + } + + bool ret = false; + + if ((pos.x <= cos * 0.5f && -(cos * 0.5f) <= pos.x) // + && pos.y <= scale + 0.5f + 1e-6f && pos.y + -0.5f - 1e-6f <= pos.y // + && pos.z <= 0.5f && pos.z >= -0.5f) { + ret = true; + } + + return ret; +} From 0c129f95fb10af9208f98f135bf3ceec23ea5b0b Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 14:13:31 -0500 Subject: [PATCH 02/15] d_t_barrel checkPlayerPos func fix. Thank @robojumper --- src/REL/d/t/d_t_barrel.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/REL/d/t/d_t_barrel.cpp b/src/REL/d/t/d_t_barrel.cpp index 3161ce50..5d7d70ae 100644 --- a/src/REL/d/t/d_t_barrel.cpp +++ b/src/REL/d/t/d_t_barrel.cpp @@ -142,30 +142,23 @@ void dTgBarrel_c::executeState_Stop() { void dTgBarrel_c::finalizeState_Stop() {} bool dTgBarrel_c::checkPlayerPos(const mVec3_c &playerPos) { - // NONMATCHING - // https://decomp.me/scratch/TM82x f32 scale = 0.5f; - mAng rot = mStageRef.get()->mRotation.y; + mVec3_c pos = playerPos - (mPosition + (mVec3_c::Ey * mScale.y * scale)); + mAng rot = mStageRef.get()->mRotation.z; - mVec3_c pos = mPosition; - pos += mVec3_c::Ey * (mScale.y * 0.5f); - pos.x = (playerPos.x - pos.x) / mScale.x; - pos.y = (playerPos.y - pos.y) / mScale.y; - pos.z = (playerPos.z - pos.z) / mScale.z; + pos.x = pos.x / mScale.x; + pos.y = pos.y / mScale.y; + pos.z = pos.z / mScale.z; - f32 cos = rot.cos(); + f32 halfCos = rot.cos() * scale; if (rot.cos() != 0.f) { scale = mScale.x * ((pos.x * rot.sin()) / rot.cos()) / mScale.y; } - bool ret = false; - - if ((pos.x <= cos * 0.5f && -(cos * 0.5f) <= pos.x) // - && pos.y <= scale + 0.5f + 1e-6f && pos.y + -0.5f - 1e-6f <= pos.y // - && pos.z <= 0.5f && pos.z >= -0.5f) { - ret = true; - } - - return ret; + return ( + (pos.x <= halfCos && pos.x >= -halfCos) // + && pos.y <= scale + 0.5f + 1e-6f && pos.y >= scale + -0.5f - 1e-6f // + && pos.z <= 0.5f && pos.z >= -0.5f + ); } From 51040758a5d8b7fea613df4e6b3234c0951bb42a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 14:20:15 -0500 Subject: [PATCH 03/15] d_t_barrel_pos OK --- .../SOUE01/rels/d_t_barrel_posNP/symbols.txt | 10 ++--- configure.py | 2 +- include/d/t/d_t_barrel_pos.h | 11 ++++- src/REL/d/t/d_t_barrel_pos.cpp | 44 +++++++++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/config/SOUE01/rels/d_t_barrel_posNP/symbols.txt b/config/SOUE01/rels/d_t_barrel_posNP/symbols.txt index 2b6313ec..b0bfb701 100644 --- a/config/SOUE01/rels/d_t_barrel_posNP/symbols.txt +++ b/config/SOUE01/rels/d_t_barrel_posNP/symbols.txt @@ -2,12 +2,12 @@ _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 dTgBarrelPos_c_classInit__Fv = .text:0x00000070; // type:function size:0x5C -TgBarrelPos__init = .text:0x000000D0; // type:function size:0x7C -fn_443_150 = .text:0x00000150; // type:function size:0x8 -fn_443_160 = .text:0x00000160; // type:function size:0xE0 -fn_443_240 = .text:0x00000240; // type:function size:0x8 +create__14dTgBarrelPos_cFv = .text:0x000000D0; // type:function size:0x7C +doDelete__14dTgBarrelPos_cFv = .text:0x00000150; // type:function size:0x8 +actorExecute__14dTgBarrelPos_cFv = .text:0x00000160; // type:function size:0xE0 +draw__14dTgBarrelPos_cFv = .text:0x00000240; // type:function size:0x8 __dt__14dTgBarrelPos_cFv = .text:0x00000250; // type:function size:0x74 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global g_profile_TAG_BARREL_POS = .data:0x00000000; // type:object size:0x10 -lbl_443_section4_10 = .data:0x00000010; // type:object size:0x74 +__vt__14dTgBarrelPos_c = .data:0x00000010; // type:object size:0x74 diff --git a/configure.py b/configure.py index 02365a0b..3e57bbf6 100644 --- a/configure.py +++ b/configure.py @@ -2878,7 +2878,7 @@ config.libs = [ Rel(NonMatching, "d_t_at0", "REL/d/t/d_t_at0.cpp"), Rel(NonMatching, "d_t_auto_message", "REL/d/t/d_t_auto_message.cpp"), Rel(NonMatching, "d_t_barrel", "REL/d/t/d_t_barrel.cpp"), - Rel(NonMatching, "d_t_barrel_pos", "REL/d/t/d_t_barrel_pos.cpp"), + Rel(Matching, "d_t_barrel_pos", "REL/d/t/d_t_barrel_pos.cpp"), Rel(NonMatching, "d_t_bb_quake", "REL/d/t/d_t_bb_quake.cpp"), Rel(NonMatching, "d_t_bcal_tag", "REL/d/t/d_t_bcal_tag.cpp"), Rel(NonMatching, "d_t_bcz", "REL/d/t/d_t_bcz.cpp"), diff --git a/include/d/t/d_t_barrel_pos.h b/include/d/t/d_t_barrel_pos.h index 7685cde8..5ac9d066 100644 --- a/include/d/t/d_t_barrel_pos.h +++ b/include/d/t/d_t_barrel_pos.h @@ -2,12 +2,20 @@ #define D_T_BARREL_POS_H #include "d/t/d_tg.h" +#include "m/m_vec.h" + +class dAcOstageSink_c; class dTgBarrelPos_c : public dTg_c { public: dTgBarrelPos_c() {} virtual ~dTgBarrelPos_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual int actorExecute() override; + u8 getLinkIndex() const { return mLinkIndex; } @@ -16,7 +24,8 @@ public: } private: - /* 0x0FC */ u8 _0xFC[0x114 - 0xFC]; + /* 0x0FC */ dAcRef_c mStageRef; + /* 0x108 */ mVec3_c mSpawnPosition; /* 0x114 */ u8 mLinkIndex; /* 0x115 */ u8 mLinkId; }; diff --git a/src/REL/d/t/d_t_barrel_pos.cpp b/src/REL/d/t/d_t_barrel_pos.cpp index 05b28f67..d57a19f4 100644 --- a/src/REL/d/t/d_t_barrel_pos.cpp +++ b/src/REL/d/t/d_t_barrel_pos.cpp @@ -1,3 +1,47 @@ #include "d/t/d_t_barrel_pos.h" +#include "d/a/obj/d_a_obj_stage_sink.h" +#include "d/t/d_t_barrel.h" +#include "f/f_base.h" + SPECIAL_ACTOR_PROFILE(TAG_BARREL_POS, dTgBarrelPos_c, fProfile::TAG_BARREL_POS, 0x222, 0, 0); + +int dTgBarrelPos_c::create() { + mLinkIndex = getFromParams(0, 0xFF); + if (mLinkIndex == 0xFF) { + mLinkIndex = 0; + } + + mLinkId = getFromParams(8, 0xF); + + mStageRef.link(dAcOstageSink_c::GetInstance()); + + mSpawnPosition = mPosition; + + return SUCCEEDED; +} + +int dTgBarrelPos_c::doDelete() { + return SUCCEEDED; +} + +int dTgBarrelPos_c::actorExecute() { + dAcOstageSink_c *pStage = mStageRef.get(); + + mVec3_c pos = pStage->mPosition; + mAng3_c rot = pStage->mRotation; + + mVec3_c stageDist = mSpawnPosition - pos; + mMtx_c m; + m.transS(pos); + m.ZXYrotM(rot); + m.multVecSR(stageDist, mPosition); + + mPosition += pos; + + return SUCCEEDED; +} + +int dTgBarrelPos_c::draw() { + return SUCCEEDED; +} From fce6ad876d555bc6d1cfb7d481da6dd80ef36e39 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 14:41:54 -0500 Subject: [PATCH 04/15] cleanup and doc --- config/SOUE01/rels/d_t_barrelNP/symbols.txt | 9 +++--- include/d/t/d_t_barrel.h | 14 ++++----- include/d/t/d_t_barrel_pos.h | 4 +-- src/REL/d/t/d_t_barrel.cpp | 34 ++++++++++----------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/config/SOUE01/rels/d_t_barrelNP/symbols.txt b/config/SOUE01/rels/d_t_barrelNP/symbols.txt index fe6cee1f..9fa88cc2 100644 --- a/config/SOUE01/rels/d_t_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_t_barrelNP/symbols.txt @@ -52,13 +52,14 @@ _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global lbl_442_rodata_0 = .rodata:0x00000000; // type:object size:0x14 data:float g_profile_TAG_BARREL = .data:0x00000000; // type:object size:0x10 data:4byte -TgBarrel__vtable = .data:0x00000010; // type:object size:0x78 +__vt__11dTgBarrel_c = .data:0x00000010; // type:object size:0x74 lbl_442_data_88 = .data:0x00000088; // type:object size:0x30 lbl_442_data_B8 = .data:0x000000B8; // type:object size:0x30 lbl_442_data_E8 = .data:0x000000E8; // type:object size:0x18 lbl_442_data_100 = .data:0x00000100; // type:object size:0x10C lbl_442_data_20C = .data:0x0000020C; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_442_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -TgBarrel__StateID_Wait = .bss:0x00000018; // type:object size:0x40 data:4byte -TgBarrel__StateID_Stop = .bss:0x00000058; // type:object size:0x30 data:4byte +@23673 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte +StateID_Wait__11dTgBarrel_c = .bss:0x00000018; // type:object size:0x30 data:4byte +@23677 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte +StateID_Stop__11dTgBarrel_c = .bss:0x00000058; // type:object size:0x30 data:4byte diff --git a/include/d/t/d_t_barrel.h b/include/d/t/d_t_barrel.h index b122a196..9237c27c 100644 --- a/include/d/t/d_t_barrel.h +++ b/include/d/t/d_t_barrel.h @@ -33,13 +33,13 @@ private: /* 0x144 */ dAcRef_c mTgBarrelPosArr[10]; /* 0x1BC */ dAcRef_c mBarrelArr[10]; /* 0x234 */ mVec3_c mSpawnPosition; - /* 0x240 */ u8 field_0x240; ///< Stop Sceneflag - /* 0x241 */ u8 field_0x241; ///< Barrel Spawn Interval in Seconds - /* 0x242 */ u8 field_0x242; ///< Barrel Spawn Timer - /* 0x243 */ u8 field_0x243; - /* 0x244 */ u8 field_0x244; - /* 0x245 */ u8 field_0x245; - /* 0x246 */ u8 field_0x246; + /* 0x240 */ u8 mStopFlag; ///< Stop Sceneflag - Note there is no checking done to see if valid + /* 0x241 */ u8 mSpawnInterval; ///< Barrel Spawn Interval in Seconds + /* 0x242 */ u8 mSpawnTimer; ///< Barrel Spawn Timer + /* 0x243 */ u8 mBarrelPosCount; ///< Repesents the index of the highest dTgBarrelPos_c in mTgBarrelPosArr + /* 0x244 */ u8 mBarrelPosIndex; ///< Rolling index to spawn dAcOBarrel_c from a dTgBarrelPos_c + /* 0x245 */ u8 mLinkId; ///< Link Id used to find correct dTgBarrelPos_c + /* 0x246 */ bool mSpawnActive; ///< Used to reset the spawn timer after the player has already entered the area }; #endif diff --git a/include/d/t/d_t_barrel_pos.h b/include/d/t/d_t_barrel_pos.h index 5ac9d066..8a3885c3 100644 --- a/include/d/t/d_t_barrel_pos.h +++ b/include/d/t/d_t_barrel_pos.h @@ -26,8 +26,8 @@ public: private: /* 0x0FC */ dAcRef_c mStageRef; /* 0x108 */ mVec3_c mSpawnPosition; - /* 0x114 */ u8 mLinkIndex; - /* 0x115 */ u8 mLinkId; + /* 0x114 */ u8 mLinkIndex; ///< Link Index used in dTgBarrel_c array + /* 0x115 */ u8 mLinkId; ///< Link Id used to find correct dTgBarrel_c }; #endif diff --git a/src/REL/d/t/d_t_barrel.cpp b/src/REL/d/t/d_t_barrel.cpp index 5d7d70ae..39b2778e 100644 --- a/src/REL/d/t/d_t_barrel.cpp +++ b/src/REL/d/t/d_t_barrel.cpp @@ -27,10 +27,10 @@ STATE_DEFINE(dTgBarrel_c, Stop); // dAcRef_c int dTgBarrel_c::actorCreate() { - field_0x240 = getFromParams(0, 0xFF); - field_0x245 = getFromParams(16, 0xF); - field_0x241 = getFromParams(8, 0xFF); - field_0x242 = 1; + mStopFlag = getFromParams(0, 0xFF); + mLinkId = getFromParams(16, 0xF); + mSpawnInterval = getFromParams(8, 0xFF); + mSpawnTimer = 1; mStageRef.link(dAcOstageSink_c::GetInstance()); mSpawnPosition = mPosition; @@ -52,10 +52,10 @@ int dTgBarrel_c::actorPostCreate() { if (pTgBarrelPos != nullptr) { u8 index = pTgBarrelPos->getLinkIndex(); - if (field_0x245 == pTgBarrelPos->getLinkId()) { + if (mLinkId == pTgBarrelPos->getLinkId()) { mTgBarrelPosArr[index].link(pTgBarrelPos); - if (index >= field_0x243) { - field_0x243 = index + 1; + if (index >= mBarrelPosCount) { + mBarrelPosCount = index + 1; } } } @@ -80,7 +80,7 @@ int dTgBarrel_c::draw() { void dTgBarrel_c::initializeState_Wait() {} void dTgBarrel_c::executeState_Wait() { - if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, field_0x240)) { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, mStopFlag)) { mStateMgr.changeState(StateID_Stop); return; } @@ -98,8 +98,8 @@ void dTgBarrel_c::executeState_Wait() { mPosition += pos; if (checkPlayerPos(dAcPy_c::GetLink()->mPosition)) { - if (0 == sLib::calcTimer(&field_0x242)) { - field_0x246 = 1; + if (0 == sLib::calcTimer(&mSpawnTimer)) { + mSpawnActive = true; u8 idx = 0xFF; for (int i = 0; i < (int)ARRAY_LENGTH(mBarrelArr); ++i) { @@ -110,7 +110,7 @@ void dTgBarrel_c::executeState_Wait() { } if (idx != 0xFF) { - dTgBarrelPos_c *pTgBarrelPos = mTgBarrelPosArr[field_0x244].get(); + dTgBarrelPos_c *pTgBarrelPos = mTgBarrelPosArr[mBarrelPosIndex].get(); if (pTgBarrelPos != nullptr) { mVec3_c spawnPos = pTgBarrelPos->mPosition; mAng3_c spawnRot(0, 0x4000, 0); @@ -119,15 +119,15 @@ void dTgBarrel_c::executeState_Wait() { ); mBarrelArr[idx].link(static_cast(pObj)); } - if (++field_0x244 >= field_0x243) { - field_0x244 = 0; + if (++mBarrelPosIndex >= mBarrelPosCount) { + mBarrelPosIndex = 0; } } - field_0x242 = field_0x241 * 30; + mSpawnTimer = mSpawnInterval * 30; } } else { - if (field_0x246) { - field_0x242 = field_0x241 * 30; + if (mSpawnActive) { + mSpawnTimer = mSpawnInterval * 30; } } } @@ -135,7 +135,7 @@ void dTgBarrel_c::finalizeState_Wait() {} void dTgBarrel_c::initializeState_Stop() {} void dTgBarrel_c::executeState_Stop() { - if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, field_0x240)) { + if (!SceneflagManager::sInstance->checkBoolFlag(mRoomID, mStopFlag)) { mStateMgr.changeState(StateID_Wait); } } From 5e3eb2fe3556f9a73dafbca0a67d3a5ae1043422 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 15:10:23 -0500 Subject: [PATCH 05/15] fix typos --- include/d/t/d_t_barrel.h | 4 ++-- src/REL/d/t/d_t_barrel.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/d/t/d_t_barrel.h b/include/d/t/d_t_barrel.h index 9237c27c..3266d6d1 100644 --- a/include/d/t/d_t_barrel.h +++ b/include/d/t/d_t_barrel.h @@ -36,10 +36,10 @@ private: /* 0x240 */ u8 mStopFlag; ///< Stop Sceneflag - Note there is no checking done to see if valid /* 0x241 */ u8 mSpawnInterval; ///< Barrel Spawn Interval in Seconds /* 0x242 */ u8 mSpawnTimer; ///< Barrel Spawn Timer - /* 0x243 */ u8 mBarrelPosCount; ///< Repesents the index of the highest dTgBarrelPos_c in mTgBarrelPosArr + /* 0x243 */ u8 mBarrelPosCount; ///< Represents the index of the highest dTgBarrelPos_c in mTgBarrelPosArr /* 0x244 */ u8 mBarrelPosIndex; ///< Rolling index to spawn dAcOBarrel_c from a dTgBarrelPos_c /* 0x245 */ u8 mLinkId; ///< Link Id used to find correct dTgBarrelPos_c - /* 0x246 */ bool mSpawnActive; ///< Used to reset the spawn timer after the player has already entered the area + /* 0x246 */ bool mSpawnActive; ///< Used to reset the spawn timer after the player has already entered the area }; #endif diff --git a/src/REL/d/t/d_t_barrel.cpp b/src/REL/d/t/d_t_barrel.cpp index 39b2778e..d6d81a89 100644 --- a/src/REL/d/t/d_t_barrel.cpp +++ b/src/REL/d/t/d_t_barrel.cpp @@ -21,7 +21,7 @@ SPECIAL_ACTOR_PROFILE(TAG_BARREL, dTgBarrel_c, fProfile::TAG_BARREL, 0x221, 0, 0 STATE_DEFINE(dTgBarrel_c, Wait); STATE_DEFINE(dTgBarrel_c, Stop); -// Weak function ordering issue of the ctor and dtpr of the objects +// Weak function ordering issue of the ctor and dtor of the objects // for the following in the member arrays // dAcRef_c // dAcRef_c From c0b8b12ff2233ce883e871ff96bb5fc5267fe1e1 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 23 Nov 2025 15:10:38 -0500 Subject: [PATCH 06/15] suppress linker warnings --- .../SOUE01/rels/d_a_obj_barrelNP/symbols.txt | 178 +++++++++--------- config/SOUE01/rels/d_t_barrelNP/symbols.txt | 12 +- 2 files changed, 95 insertions(+), 95 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt index f36e8ac5..fb0a78d8 100644 --- a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt @@ -99,92 +99,92 @@ isSameName__27sFStateID_c<12dAcOBarrel_c>CFPCc = .text:0x00006500; // type:funct _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_293_rodata_0 = .rodata:0x00000000; // type:object size:0x38 data:float -lbl_293_rodata_38 = .rodata:0x00000038; // type:object size:0x4 align:4 data:float -lbl_293_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_40 = .rodata:0x00000040; // type:object size:0x4 align:4 data:float -lbl_293_rodata_44 = .rodata:0x00000044; // type:object size:0x4 align:4 data:float -lbl_293_rodata_48 = .rodata:0x00000048; // type:object size:0x4 align:4 data:float -lbl_293_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_50 = .rodata:0x00000050; // type:object size:0x4 align:4 data:float -lbl_293_rodata_54 = .rodata:0x00000054; // type:object size:0x4 align:4 data:float -lbl_293_rodata_58 = .rodata:0x00000058; // type:object size:0x4 align:4 data:float -lbl_293_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_60 = .rodata:0x00000060; // type:object size:0x4 align:4 data:float -lbl_293_rodata_64 = .rodata:0x00000064; // type:object size:0x4 align:4 data:float -lbl_293_rodata_68 = .rodata:0x00000068; // type:object size:0x4 align:4 data:float -lbl_293_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_70 = .rodata:0x00000070; // type:object size:0x4 align:4 data:float -lbl_293_rodata_78 = .rodata:0x00000078; // type:object size:0x8 align:8 data:double -lbl_293_rodata_80 = .rodata:0x00000080; // type:object size:0x4 align:4 data:float -lbl_293_rodata_84 = .rodata:0x00000084; // type:object size:0x4 align:4 data:float -lbl_293_rodata_88 = .rodata:0x00000088; // type:object size:0x4 align:4 data:float -lbl_293_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_90 = .rodata:0x00000090; // type:object size:0x4 align:4 data:float -lbl_293_rodata_94 = .rodata:0x00000094; // type:object size:0x4 align:4 data:float -lbl_293_rodata_98 = .rodata:0x00000098; // type:object size:0x4 align:4 data:float -lbl_293_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 align:4 data:float -lbl_293_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 align:4 data:float -lbl_293_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 align:4 data:float -lbl_293_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 align:4 data:float -lbl_293_rodata_100 = .rodata:0x00000100; // type:object size:0x4 align:4 data:float -lbl_293_rodata_104 = .rodata:0x00000104; // type:object size:0x4 align:4 data:float -lbl_293_rodata_108 = .rodata:0x00000108; // type:object size:0x4 align:4 data:float -lbl_293_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_110 = .rodata:0x00000110; // type:object size:0x4 align:4 data:float -lbl_293_rodata_114 = .rodata:0x00000114; // type:object size:0x4 align:4 data:float -lbl_293_rodata_118 = .rodata:0x00000118; // type:object size:0x4 align:4 data:float -lbl_293_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_120 = .rodata:0x00000120; // type:object size:0x4 align:4 data:float -lbl_293_rodata_124 = .rodata:0x00000124; // type:object size:0x4 align:4 data:float -lbl_293_rodata_128 = .rodata:0x00000128; // type:object size:0x4 align:4 data:float -lbl_293_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_130 = .rodata:0x00000130; // type:object size:0x4 align:4 data:float -lbl_293_rodata_134 = .rodata:0x00000134; // type:object size:0x4 align:4 data:float -lbl_293_rodata_138 = .rodata:0x00000138; // type:object size:0x4 align:4 data:float -lbl_293_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 align:4 data:float -lbl_293_rodata_140 = .rodata:0x00000140; // type:object size:0x4 align:4 data:float -lbl_293_rodata_144 = .rodata:0x00000144; // type:object size:0x4 align:4 data:float -lbl_293_rodata_148 = .rodata:0x00000148; // type:object size:0x30 -lbl_293_data_0 = .data:0x00000000; // type:object size:0x8 data:4byte +lbl_293_rodata_0 = .rodata:0x00000000; // type:object size:0x38 scope:local data:float +lbl_293_rodata_38 = .rodata:0x00000038; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_40 = .rodata:0x00000040; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_44 = .rodata:0x00000044; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_48 = .rodata:0x00000048; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_54 = .rodata:0x00000054; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_70 = .rodata:0x00000070; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_78 = .rodata:0x00000078; // type:object size:0x8 scope:local align:8 data:double +lbl_293_rodata_80 = .rodata:0x00000080; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_84 = .rodata:0x00000084; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_88 = .rodata:0x00000088; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_8C = .rodata:0x0000008C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_90 = .rodata:0x00000090; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_94 = .rodata:0x00000094; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_110 = .rodata:0x00000110; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_114 = .rodata:0x00000114; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_118 = .rodata:0x00000118; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_120 = .rodata:0x00000120; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_124 = .rodata:0x00000124; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_128 = .rodata:0x00000128; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_12C = .rodata:0x0000012C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_130 = .rodata:0x00000130; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_134 = .rodata:0x00000134; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_138 = .rodata:0x00000138; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_13C = .rodata:0x0000013C; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_140 = .rodata:0x00000140; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_144 = .rodata:0x00000144; // type:object size:0x4 scope:local align:4 data:float +lbl_293_rodata_148 = .rodata:0x00000148; // type:object size:0x30 scope:local +lbl_293_data_0 = .data:0x00000000; // type:object size:0x8 scope:local data:4byte g_profile_OBJ_BARREL = .data:0x00000008; // type:object size:0x6C -lbl_293_data_74 = .data:0x00000074; // type:object size:0x7 data:string -lbl_293_data_7C = .data:0x0000007C; // type:object size:0xB data:string -lbl_293_data_88 = .data:0x00000088; // type:object size:0x10 -lbl_293_data_98 = .data:0x00000098; // type:object size:0x2C -lbl_293_data_C4 = .data:0x000000C4; // type:object size:0xF data:string -lbl_293_data_D4 = .data:0x000000D4; // type:object size:0x10 -lbl_293_data_E4 = .data:0x000000E4; // type:object size:0x4 align:4 data:float -lbl_293_data_E8 = .data:0x000000E8; // type:object size:0x8 align:4 data:float -lbl_293_data_F0 = .data:0x000000F0; // type:object size:0x80 -lbl_293_data_170 = .data:0x00000170; // type:object size:0x30 -lbl_293_data_1A0 = .data:0x000001A0; // type:object size:0x30 -lbl_293_data_1D0 = .data:0x000001D0; // type:object size:0x18 -lbl_293_data_1E8 = .data:0x000001E8; // type:object size:0x18 -lbl_293_data_200 = .data:0x00000200; // type:object size:0xC -lbl_293_data_20C = .data:0x0000020C; // type:object size:0x2A8 -lbl_293_data_4B4 = .data:0x000004B4; // type:object size:0x34 +lbl_293_data_74 = .data:0x00000074; // type:object size:0x7 scope:local data:string +lbl_293_data_7C = .data:0x0000007C; // type:object size:0xB scope:local data:string +lbl_293_data_88 = .data:0x00000088; // type:object size:0x10 scope:local +lbl_293_data_98 = .data:0x00000098; // type:object size:0x2C scope:local +lbl_293_data_C4 = .data:0x000000C4; // type:object size:0xF scope:local data:string +lbl_293_data_D4 = .data:0x000000D4; // type:object size:0x10 scope:local +lbl_293_data_E4 = .data:0x000000E4; // type:object size:0x4 scope:local align:4 data:float +lbl_293_data_E8 = .data:0x000000E8; // type:object size:0x8 scope:local align:4 data:float +lbl_293_data_F0 = .data:0x000000F0; // type:object size:0x80 scope:local +lbl_293_data_170 = .data:0x00000170; // type:object size:0x30 scope:local +lbl_293_data_1A0 = .data:0x000001A0; // type:object size:0x30 scope:local +lbl_293_data_1D0 = .data:0x000001D0; // type:object size:0x18 scope:local +lbl_293_data_1E8 = .data:0x000001E8; // type:object size:0x18 scope:local +lbl_293_data_200 = .data:0x00000200; // type:object size:0xC scope:local +lbl_293_data_20C = .data:0x0000020C; // type:object size:0x2A8 scope:local +lbl_293_data_4B4 = .data:0x000004B4; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global @16558 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte StateID_Wait__12dAcOBarrel_c = .bss:0x00000018; // type:object size:0x30 data:4byte @@ -206,7 +206,7 @@ StateID_Explode__12dAcOBarrel_c = .bss:0x000001D8; // type:object size:0x30 data StateID_KrakenBorn__12dAcOBarrel_c = .bss:0x00000218; // type:object size:0x30 data:4byte @16594 = .bss:0x00000248; // type:object size:0xC scope:local data:4byte StateID_Rebirth__12dAcOBarrel_c = .bss:0x00000258; // type:object size:0x30 data:4byte -lbl_293_bss_288 = .bss:0x00000288; // type:object size:0x8 data:byte -lbl_293_bss_290 = .bss:0x00000290; // type:object size:0x10 align:4 data:float -lbl_293_bss_2A0 = .bss:0x000002A0; // type:object size:0x1 data:byte -lbl_293_bss_2A4 = .bss:0x000002A4; // type:object size:0xC align:4 data:float +@GUARD@draw__12dAcOBarrel_cFv@shadow = .bss:0x00000288; // type:object size:0x1 scope:local data:byte +@LOCAL@draw__12dAcOBarrel_cFv@shadow = .bss:0x00000290; // type:object size:0x10 scope:local align:4 data:float +@GUARD@fn_293_5910__12dAcOBarrel_cFv@scale = .bss:0x000002A0; // type:object size:0x1 scope:local data:byte +@LOCAL@fn_293_5910__12dAcOBarrel_cFv@scale = .bss:0x000002A4; // type:object size:0xC scope:local align:4 data:float diff --git a/config/SOUE01/rels/d_t_barrelNP/symbols.txt b/config/SOUE01/rels/d_t_barrelNP/symbols.txt index 9fa88cc2..3d27630f 100644 --- a/config/SOUE01/rels/d_t_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_t_barrelNP/symbols.txt @@ -50,14 +50,14 @@ isSameName__26sFStateID_c<11dTgBarrel_c>CFPCc = .text:0x00001220; // type:functi _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_442_rodata_0 = .rodata:0x00000000; // type:object size:0x14 data:float +lbl_442_rodata_0 = .rodata:0x00000000; // type:object size:0x14 scope:local data:float g_profile_TAG_BARREL = .data:0x00000000; // type:object size:0x10 data:4byte __vt__11dTgBarrel_c = .data:0x00000010; // type:object size:0x74 -lbl_442_data_88 = .data:0x00000088; // type:object size:0x30 -lbl_442_data_B8 = .data:0x000000B8; // type:object size:0x30 -lbl_442_data_E8 = .data:0x000000E8; // type:object size:0x18 -lbl_442_data_100 = .data:0x00000100; // type:object size:0x10C -lbl_442_data_20C = .data:0x0000020C; // type:object size:0x34 +lbl_442_data_88 = .data:0x00000088; // type:object size:0x30 scope:local +lbl_442_data_B8 = .data:0x000000B8; // type:object size:0x30 scope:local +lbl_442_data_E8 = .data:0x000000E8; // type:object size:0x18 scope:local +lbl_442_data_100 = .data:0x00000100; // type:object size:0x10C scope:local +lbl_442_data_20C = .data:0x0000020C; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global @23673 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte StateID_Wait__11dTgBarrel_c = .bss:0x00000018; // type:object size:0x30 data:4byte From 4c1290dad7821fda93a215d20c79cdb0c11ad55a Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 24 Nov 2025 00:13:28 -0500 Subject: [PATCH 07/15] 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 08/15] 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 09/15] 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 10/15] 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 11/15] 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 12/15] 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 13/15] 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 0dbe3c0211dd8b08161a5053c11587c2b7c5526a Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 27 Nov 2025 10:15:48 +0100 Subject: [PATCH 14/15] Meter mode cleanups --- config/SOUE01/symbols.txt | 10 +- include/d/lyt/meter/d_lyt_meter.h | 29 ++--- src/d/lyt/d_lyt_control_game.cpp | 12 +- src/d/lyt/d_lyt_map.cpp | 2 +- src/d/lyt/d_lyt_pause.cpp | 2 +- src/d/lyt/meter/d_lyt_meter.cpp | 132 ++++++++++---------- src/d/lyt/meter/d_lyt_meter_a_btn.cpp | 4 +- src/d/lyt/meter/d_lyt_meter_cross_btn.cpp | 4 +- src/d/lyt/meter/d_lyt_meter_dowsing.cpp | 30 ++--- src/d/lyt/meter/d_lyt_meter_item_select.cpp | 8 +- src/d/lyt/meter/d_lyt_meter_minus_btn.cpp | 4 +- src/d/lyt/meter/d_lyt_meter_timer.cpp | 6 +- 12 files changed, 122 insertions(+), 121 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 587eb1c6..54155c4f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4741,16 +4741,16 @@ __dt__16dLytMeterTimer_cFv = .text:0x800D4DE0; // type:function size:0xB4 scope: __dt__14dLytSkyGauge_cFv = .text:0x800D4EA0; // type:function size:0x164 scope:weak __dt__15dLytBirdGauge_cFv = .text:0x800D5010; // type:function size:0x164 scope:weak __dt__15dLytBossGauge_cFv = .text:0x800D5180; // type:function size:0x108 scope:weak -fn_800D5290__15dLytMeterMain_cFv = .text:0x800D5290; // type:function size:0xB4 -fn_800D5350__15dLytMeterMain_cFv = .text:0x800D5350; // type:function size:0x30 +executeMap__15dLytMeterMain_cFv = .text:0x800D5290; // type:function size:0xB4 +isInMapEvent__15dLytMeterMain_cFv = .text:0x800D5350; // type:function size:0x30 fn_800D5380__15dLytMeterMain_cFUc = .text:0x800D5380; // type:function size:0x44 -fn_800D53D0__15dLytMeterMain_cFv = .text:0x800D53D0; // type:function size:0x50 +isDoingSkyKeepPuzzle__15dLytMeterMain_cFv = .text:0x800D53D0; // type:function size:0x50 fn_800D5420__15dLytMeterMain_cFv = .text:0x800D5420; // type:function size:0x114 isSilentRealm__15dLytMeterMain_cFv = .text:0x800D5540; // type:function size:0x4C fn_800D5590__15dLytMeterMain_cFv = .text:0x800D5590; // type:function size:0x98 fn_800D5630__15dLytMeterMain_cFv = .text:0x800D5630; // type:function size:0x18 -fn_800D5650__15dLytMeterMain_cFv = .text:0x800D5650; // type:function size:0x24 -fn_800D5680__15dLytMeterMain_cFv = .text:0x800D5680; // type:function size:0x28 +isInModeMap__15dLytMeterMain_cFv = .text:0x800D5650; // type:function size:0x24 +isInModePause__15dLytMeterMain_cFv = .text:0x800D5680; // type:function size:0x28 fn_800D56B0__15dLytMeterMain_cFv = .text:0x800D56B0; // type:function size:0xFC checkPaneVisibility__15dLytMeterMain_cFv = .text:0x800D57B0; // type:function size:0x1A58 execute__15dLytMeterMain_cFv = .text:0x800D7210; // type:function size:0x92C diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index a0ae18cc..48fef6cb 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -77,7 +77,8 @@ public: enum Mode_e { MODE_MAP_INIT = 0, MODE_MAP = 1, - MODE_PAUSE = 2, + MODE_PAUSE_INIT = 2, + MODE_PAUSE = 3, MODE_NONE = 4, }; @@ -94,20 +95,20 @@ public: bool fn_800C9FE0(); bool fn_800CA040(); - bool fn_800D5350(); + bool isInMapEvent(); bool fn_800D5380(u8); - void fn_800D5290(); + void executeMap(); bool fn_800D5590(); void fn_800D5630(); - bool fn_800D5650(); - bool fn_800D5680(); + bool isInModeMap(); + bool isInModePause(); bool fn_800D56B0(); void checkPaneVisibility(); bool execute(); bool isSilentRealm(); - bool fn_800D53D0(); + bool isDoingSkyKeepPuzzle(); bool fn_800D5420(); void setUiMode(u16 value) const; @@ -129,8 +130,8 @@ public: mPanesNotHiddenByAreaCaption[15] = visible; } - bool getField_0x1377E() const { - return field_0x1377E; + bool isInSwordDrawEvent() const { + return mIsInSwordDrawEvent; } bool getField_0x1377F() const { @@ -184,7 +185,7 @@ private: /* 0x1373C */ mVec3_c mRupyPos; /* 0x13748 */ s32 mBasicPosition; /* 0x1374C */ s32 mSavedBasicPosition; - /* 0x13750 */ s32 field_0x13750; + /* 0x13750 */ s32 mMode; /* 0x13754 */ s32 field_0x13754; /* 0x13758 */ s32 mShieldPosIndex; /* 0x1375C */ s32 mRupyPosIndex; @@ -206,7 +207,7 @@ private: /* 0x1377B */ bool mBossKeyVisible; /* 0x1377C */ bool mSmallKeyVisible; /* 0x1377D */ bool mDrinkVisible; - /* 0x1377E */ bool field_0x1377E; + /* 0x1377E */ bool mIsInSwordDrawEvent; /* 0x1377F */ bool field_0x1377F; /* 0x13780 */ bool field_0x13780; /* 0x13781 */ bool field_0x13781; @@ -281,12 +282,12 @@ public: // because accessing via GetMeter->get... causes // different instructions sometimes - s32 getMeterField_0x13750() const { - return mMain.field_0x13750; + s32 getMeterMode() const { + return mMain.mMode; } - void setMeterField_0x13750(s32 value) { - mMain.field_0x13750 = value; + void setMeterMode(s32 value) { + mMain.mMode = value; } u8 getMeterField_0x13770() const { diff --git a/src/d/lyt/d_lyt_control_game.cpp b/src/d/lyt/d_lyt_control_game.cpp index 357bc1ee..7d5a0a67 100644 --- a/src/d/lyt/d_lyt_control_game.cpp +++ b/src/d/lyt/d_lyt_control_game.cpp @@ -79,7 +79,7 @@ static const char *const sMapSky = "MapSky"; static const char *const sCommonArrow = "CommonArrow"; void dLytControlGame_c::initializeState_Pause_SetRes() { - dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_PAUSE); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_PAUSE_INIT); dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x1; static const char *sLytArcs[] = {sMenuPause, sCommonArrow}; mLytArcControl.set(sLytArcs, ARRAY_LENGTH(sLytArcs)); @@ -132,7 +132,7 @@ void dLytControlGame_c::executeState_Pause_DelRes() { mStateMgr.changeState(StateID_Normal); } void dLytControlGame_c::finalizeState_Pause_DelRes() { - dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_NONE); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_NONE); } void dLytControlGame_c::initializeState_Map_SetRes() { @@ -140,7 +140,7 @@ void dLytControlGame_c::initializeState_Map_SetRes() { if (!EventManager::isInEvent() || mMapEvent == dLytMapMain_c::MAP_EVENT_11) { dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x10; } - dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_MAP_INIT); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_MAP_INIT); } void dLytControlGame_c::executeState_Map_SetRes() { LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(sMap2D, nullptr); @@ -180,8 +180,8 @@ void dLytControlGame_c::initializeState_Map() { } void dLytControlGame_c::executeState_Map() { if (dLytMap_c::GetInstance()->isOpen()) { - if (dLytMeter_c::GetInstance()->getMeterField_0x13750() != dLytMeterMain_c::MODE_MAP) { - dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_MAP); + if (dLytMeter_c::GetInstance()->getMeterMode() != dLytMeterMain_c::MODE_MAP) { + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_MAP); if (StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_PLUS_BTN_NOTICE)) { StoryflagManager::sInstance->unsetFlag(STORYFLAG_PLUS_BTN_NOTICE); } @@ -250,7 +250,7 @@ void dLytControlGame_c::executeState_Map_DelRes() { } } void dLytControlGame_c::finalizeState_Map_DelRes() { - dLytMeter_c::GetInstance()->setMeterField_0x13750(dLytMeterMain_c::MODE_NONE); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_NONE); dLytMeter_c::GetInstance()->setBasicPosition(dLytMeterMain_c::POSITION_NORMAL); dMessage_c::getInstance()->setMapEvent(dLytMapMain_c::MAP_EVENT_MAX); } diff --git a/src/d/lyt/d_lyt_map.cpp b/src/d/lyt/d_lyt_map.cpp index ef795225..712de322 100644 --- a/src/d/lyt/d_lyt_map.cpp +++ b/src/d/lyt/d_lyt_map.cpp @@ -4598,7 +4598,7 @@ void dLytMapMain_c::initializeState_Out() { if (mMapEvent == MAP_EVENT_SAVE_OBJ) { mPopupInfo.mStateMgr.changeState(StateID_Out); } - dLytMeter_c::GetInstance()->setMeterField_0x13750(0); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_MAP_INIT); if (mDoCameraTransition || mMapEvent == MAP_EVENT_MAP_INTRO) { mpInOutAnmGroup = &mAnmGroups[MAP_MAIN_ANIM_OUT]; } else { diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp index 8b11b9a8..9c541073 100644 --- a/src/d/lyt/d_lyt_pause.cpp +++ b/src/d/lyt/d_lyt_pause.cpp @@ -581,7 +581,7 @@ void dLytPauseMgr_c::executeState_None() { mMain.requestIn(); mStateMgr.changeState(StateID_In); dBase_c::s_NextExecuteControlFlags |= BASE_PROP_0x1; - dLytMeter_c::GetInstance()->setMeterField_0x13750(3); + dLytMeter_c::GetInstance()->setMeterMode(dLytMeterMain_c::MODE_PAUSE); dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); if (lytControl->isPauseDemo()) { mSavedPauseDisp = lytControl->getCurrentPauseDisp(); diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 8c962391..c8db7a82 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -568,21 +568,21 @@ bool dLytMeterMain_c::isNotSilentRealmOrLoftwing() { } bool dLytMeterMain_c::fn_800C9F70() { - if ((fn_800D56B0() && !field_0x13775) || fn_800D5650() || fn_800D5680()) { + if ((fn_800D56B0() && !field_0x13775) || isInModeMap() || isInModePause()) { return true; } return false; } bool dLytMeterMain_c::fn_800C9FE0() { - if (fn_800D56B0() || !field_0x13750 || fn_800D5680()) { + if (fn_800D56B0() || mMode == MODE_MAP_INIT || isInModePause()) { return true; } return false; } bool dLytMeterMain_c::fn_800CA040() { - if (mHelpOpen || fn_800D5650() || fn_800D5680()) { + if (mHelpOpen || isInModeMap() || isInModePause()) { return true; } return false; @@ -854,7 +854,7 @@ bool dLytMeterMain_c::build(d2d::ResAccIf_c *resAcc) { mSavedBasicPosition = 0; mBasicPosition = POSITION_NORMAL; - field_0x13750 = 4; + mMode = MODE_NONE; field_0x13770 = 3; mHelpOpen = false; field_0x13775 = 0; @@ -869,8 +869,8 @@ bool dLytMeterMain_c::build(d2d::ResAccIf_c *resAcc) { mBossKeyVisible = false; mSmallKeyVisible = false; mDrinkVisible = false; - field_0x1377E = 0; - field_0x1377F = 0; + mIsInSwordDrawEvent = false; + field_0x1377F = false; field_0x13754 = 0; mAnmGroups[METER_ANIM_POSITION].setFrame(zero); @@ -993,7 +993,7 @@ bool dLytMeterMain_c::remove() { return true; } -void dLytMeterMain_c::fn_800D5290() { +void dLytMeterMain_c::executeMap() { dLytMeter_c *meter = dLytMeter_c::GetInstance(); if (dLytMap_c::GetInstance() != nullptr && !dLytMap_c::GetInstance()->isMapEventEq2Or4Or5Or6()) { @@ -1007,7 +1007,7 @@ void dLytMeterMain_c::fn_800D5290() { } } -bool dLytMeterMain_c::fn_800D5350() { +bool dLytMeterMain_c::isInMapEvent() { if (mBasicPosition == POSITION_MAP && dMessage_c::getInstance()->getInMapEvent()) { return true; } @@ -1023,7 +1023,7 @@ bool dLytMeterMain_c::fn_800D5380(u8 arg) { return false; } -bool dLytMeterMain_c::fn_800D53D0() { +bool dLytMeterMain_c::isDoingSkyKeepPuzzle() { if (checkIsInSkykeepPuzzle() && !mHelpOpen) { return true; } @@ -1031,7 +1031,7 @@ bool dLytMeterMain_c::fn_800D53D0() { } bool dLytMeterMain_c::fn_800D5420() { - if (!fn_800D5650()) { + if (!isInModeMap()) { if (!dStageMgr_c::GetInstance()->isFaderSettled() || !dScGame_c::GetInstance()->isFaderSettled() || !dStageMgr_c::GetInstance()->fn_80199250() || !dStage_c::GetInstance()->fn_801B3EE0()) { return true; @@ -1064,15 +1064,15 @@ void dLytMeterMain_c::fn_800D5630() { } } -bool dLytMeterMain_c::fn_800D5650() { - if (field_0x13750 >= 0 && field_0x13750 <= 1) { +bool dLytMeterMain_c::isInModeMap() { + if (mMode == MODE_MAP_INIT || mMode == MODE_MAP) { return true; } return false; } -bool dLytMeterMain_c::fn_800D5680() { - if (field_0x13750 >= 2 && field_0x13750 <= 3) { +bool dLytMeterMain_c::isInModePause() { + if (mMode == MODE_PAUSE_INIT || mMode == MODE_PAUSE) { return true; } return false; @@ -1083,11 +1083,11 @@ bool dLytMeterMain_c::fn_800D56B0() { return true; } - if (fn_800D5350()) { + if (isInMapEvent()) { return true; } - if ((EventManager::isInEvent() && field_0x1377E == 0 && dAcPy_c::GetLink()->getCurrentAction() != 0x8C && + if ((EventManager::isInEvent() && !mIsInSwordDrawEvent && dAcPy_c::GetLink()->getCurrentAction() != 0x8C && dMessage_c::getInstance()->getMapEvent() == dLytMapMain_c::MAP_EVENT_MAX) || mHelpOpen) { return true; @@ -1127,12 +1127,12 @@ void dLytMeterMain_c::checkPaneVisibility() { mBossKeyVisible = true; mSmallKeyVisible = true; mDrinkVisible = true; - field_0x1377E = false; + mIsInSwordDrawEvent = false; if (EventManager::getCurrentEventName() != nullptr) { const char *name = EventManager::getCurrentEventName(); if (strequals(name, "SwordDraw") || strequals(name, "SwordDrawDoorNew")) { - field_0x1377E = true; + mIsInSwordDrawEvent = true; if (dLytDobutton_c::getNextActionToShow() != dLytDobutton_c::ACT_DO_DRAW) { dLytDobutton_c::setActionTextStuff(dLytDobutton_c::ICON_NONE, dLytDobutton_c::ACT_DO_INVALID, true); } @@ -1148,7 +1148,7 @@ void dLytMeterMain_c::checkPaneVisibility() { mPanesVisible[i] = true; } - if (dAcPy_c::GetLink2()->canDowseProbably() && !fn_800D5650() && !fn_800D5680()) { + if (dAcPy_c::GetLink2()->canDowseProbably() && !isInModeMap() && !isInModePause()) { if (!field_0x1377F) { field_0x1377F = true; } @@ -1179,92 +1179,92 @@ void dLytMeterMain_c::checkPaneVisibility() { || (MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) == LytDoButtonRelated::ACT_IE_NONE) || - (dLytMeter_c::getField_0x13B66() || (fn_800D56B0() && !mItemSelect.fn_800F02F0() && !fn_800D53D0()) || - fn_800D5650() || fn_800D5680())) { + (dLytMeter_c::getField_0x13B66() || (fn_800D56B0() && !mItemSelect.fn_800F02F0() && !isDoingSkyKeepPuzzle()) || + isInModeMap() || isInModePause())) { mPanesVisible[METER_ANIM_ITEM_SELECT] = false; } - if ((fn_800D56B0() && !fn_800D53D0() && !mMinusBtn.fn_800F75E0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle() && !mMinusBtn.fn_800F75E0()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause())) { mPanesVisible[METER_ANIM_MINUS_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() > 1 && !mPlusBtn.getField_0x1C0() && !mPlusBtn.isCalling())) { mPanesVisible[METER_ANIM_PLUS_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() > 1 && !mCrossBtn.fn_800FA730())) { mPanesVisible[METER_ANIM_CROSS_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0 && !mp1Button->shouldCall())) { mPanesVisible[METER_ANIM_1_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0 && !mp2Button->shouldCall())) { mPanesVisible[METER_ANIM_2_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() > 1)) { mPanesVisible[METER_ANIM_A_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0)) { mPanesVisible[METER_ANIM_REMOCON_BG] = false; } - if ((fn_800D56B0() && !fn_800D53D0() && !mDowsing.fn_800FE490()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle() && !mDowsing.fn_800FE490()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0 && !fn_800D5380(true) && !mDowsing.shouldCall() && !mDowsing.fn_800FE490())) { mPanesVisible[METER_ANIM_DOWSING] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0 && !fn_800D5380(true) && !mZBtn.isCalling())) { mPanesVisible[METER_ANIM_Z_BTN] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0)) { mPanesVisible[METER_ANIM_NUN_STK] = false; } - if ((fn_800D56B0() && !fn_800D53D0()) + if ((fn_800D56B0() && !isDoingSkyKeepPuzzle()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680()) + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause()) || (getUiMode() != 0)) { mPanesVisible[METER_ANIM_NUN_BG] = false; @@ -1278,11 +1278,11 @@ void dLytMeterMain_c::checkPaneVisibility() { MinigameManager::isInMinigameState(MinigameManager::TRIAL_TIME_ATTACK) || MinigameManager::isInMinigameState(MinigameManager::PUMPKIN_ARCHERY) || MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL) || - MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || fn_800D56B0() || field_0x1377E) + MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER) || fn_800D56B0() || mIsInSwordDrawEvent) || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) || - fn_800D5650() || fn_800D5680())) { + isInModeMap() || isInModePause())) { mPanesVisible[METER_ANIM_RUPY] = false; } @@ -1303,11 +1303,11 @@ void dLytMeterMain_c::checkPaneVisibility() { || (fn_800D56B0() && (dMessage_c::getInstance()->getField_0x2FC() == 0 || dMessage_c::getInstance()->getField_0x2FC() == -2)) || - field_0x1377E + mIsInSwordDrawEvent || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) || - fn_800D5650() || fn_800D5680())) { + isInModeMap() || isInModePause())) { mPanesVisible[METER_ANIM_SHIELD] = false; } @@ -1330,17 +1330,17 @@ void dLytMeterMain_c::checkPaneVisibility() { || (dScGame_c::currentSpawnInfo.stageName == "F406" && dScGame_c::currentSpawnInfo.layer == 13) - || (field_0x1377E != 0) + || (mIsInSwordDrawEvent) || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || (dLytSimpleWindow_c::getInstance() != nullptr && dLytSimpleWindow_c::getInstance()->isOutputText()) || - fn_800D5650() || fn_800D5680())) { + isInModeMap() || isInModePause())) { mPanesVisible[METER_ANIM_HEART] = false; } if (!isSilentRealm() || (fn_800D56B0() && !fn_800D5590()) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || field_0x13750 == 0 || fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || mMode == MODE_MAP_INIT || isInModePause())) { mTimerVisible = false; } @@ -1361,12 +1361,12 @@ void dLytMeterMain_c::checkPaneVisibility() { MinigameManager::isInMinigameState(MinigameManager::SPIRAL_CHARGE_TUTORIAL) || MinigameManager::isInMinigameState(MinigameManager::ROLLERCOASTER)) - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mPanesVisible[METER_ANIM_GANBARI_GAUGE] = false; } if ((dAcPy_c::GetLink()->getRidingActorType() != dAcPy_c::RIDING_LOFTWING || fn_800D56B0()) || - (dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + (dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mSkyGaugeVisible = false; } else if (bird != nullptr && mpSkyGauge != nullptr) { mpSkyGauge->setHeight(dAcPy_c::GetLink()->vt_0x260()); @@ -1383,7 +1383,7 @@ void dLytMeterMain_c::checkPaneVisibility() { if (dAcPy_c::GetLink()->getRidingActorType() != dAcPy_c::RIDING_LOFTWING || !field_0x13780 || (dLytDobutton_c::getAction() != dLytDobutton_c::ACT_DO_INVALID || fn_800D56B0() || - dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mBirdGaugeVisible = false; } @@ -1410,7 +1410,7 @@ void dLytMeterMain_c::checkPaneVisibility() { if (!field_0x13781 || fn_800D56B0() || - (dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + (dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mBossGaugeVisible = false; } @@ -1436,8 +1436,8 @@ void dLytMeterMain_c::checkPaneVisibility() { if (dAcItem_c::getKeyPieceCount() == 0 || dLytAreaCaption_c::getVisible() || fn_800D5380(false) || SceneflagManager::sInstance->checkSceneflagGlobal(4, 0x21) || MinigameManager::isInAnyMinigame() - || (dLytMeter_c::getField_0x13B66() || fn_800D56B0() || field_0x1377E || fn_800D5420() || fn_800D5650() || - fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D56B0() || mIsInSwordDrawEvent || fn_800D5420() || + isInModeMap() || isInModePause())) { mKakeraKeyVisible = false; } if (mKakeraKeyVisible != oldKakeraKeyVisible) { @@ -1454,9 +1454,9 @@ void dLytMeterMain_c::checkPaneVisibility() { || DungeonflagManager::sInstance->getCounterOrFlag(16, 8) != 0 || dAcPy_c::GetLink()->getCurrentAction() == 0x8C || dLytAreaCaption_c::getVisible() || fn_800D5380(false) || - MinigameManager::isInAnyMinigame() || fn_800D56B0() || field_0x1377E + MinigameManager::isInAnyMinigame() || fn_800D56B0() || mIsInSwordDrawEvent - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mBossKeyVisible = false; } @@ -1471,9 +1471,9 @@ void dLytMeterMain_c::checkPaneVisibility() { if (mpSmallKey != nullptr) { if (dAcItem_c::getSmallKeyCount() == 0 || dLytAreaCaption_c::getVisible() || fn_800D5380(false) || - MinigameManager::isInAnyMinigame() || fn_800D56B0() || field_0x1377E + MinigameManager::isInAnyMinigame() || fn_800D56B0() || mIsInSwordDrawEvent - || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680())) { + || (dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause())) { mSmallKeyVisible = false; } @@ -1488,9 +1488,9 @@ void dLytMeterMain_c::checkPaneVisibility() { if (mpDrink != nullptr) { if (!field_0x137B2 || dLytAreaCaption_c::getVisible() || fn_800D5380(false) || - MinigameManager::isInAnyMinigame() || field_0x1377E + MinigameManager::isInAnyMinigame() || mIsInSwordDrawEvent - || fn_800D56B0() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || fn_800D5650() || fn_800D5680()) { + || fn_800D56B0() || dLytMeter_c::getField_0x13B66() || fn_800D5420() || isInModeMap() || isInModePause()) { mDrinkVisible = false; } @@ -1522,8 +1522,8 @@ bool dLytMeterMain_c::execute() { meter->clearFlags(METER_BTN_PLUS); } - if (field_0x13750 != 0 && mBasicPosition == POSITION_MAP) { - fn_800D5290(); + if (mMode != MODE_MAP_INIT && mBasicPosition == POSITION_MAP) { + executeMap(); } checkPaneVisibility(); @@ -1866,7 +1866,7 @@ bool dLytMeter_c::execute() { bool dLytMeter_c::draw() { if (mVisible) { mMain.draw(); - if (mMain.field_0x13750 != 3) { + if (mMain.mMode != dLytMeterMain_c::MODE_PAUSE) { if (mpEventSkip != nullptr) { mpEventSkip->draw(); } @@ -1884,7 +1884,7 @@ bool dLytMeter_c::draw() { } bool dLytMeter_c::fn_800D5670() { - return mMain.fn_800D5350(); + return mMain.isInMapEvent(); } void dLytMeter_c::setAreaCaptionOverrideVisibility(bool visible) { diff --git a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp index 4eaf009b..0d3fe86d 100644 --- a/src/d/lyt/meter/d_lyt_meter_a_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_a_btn.cpp @@ -215,7 +215,7 @@ bool dLytMeterABtn_c::execute() { return true; } - if (dLytMeter_c::GetInstance()->getMeterField_0x13750() == 0) { + if (dLytMeter_c::GetInstance()->getMeterMode() == dLytMeterMain_c::MODE_MAP_INIT) { LytDoButtonRelated::set(LytDoButtonRelated::DO_BUTTON_A, LytDoButtonRelated::ACT_IE_NONE); if (field_0x1BC != LytDoButtonRelated::ACT_IE_NONE) { @@ -228,7 +228,7 @@ bool dLytMeterABtn_c::execute() { bool state = false; if (EventManager::isInEvent() && !dLytMeter_c::GetInstance()->fn_800D5670() && - dLytMeter_c::GetMain()->getField_0x1377E() == 0 && !checkIsInSkykeepPuzzle() && + !dLytMeter_c::GetMain()->isInSwordDrawEvent() && !checkIsInSkykeepPuzzle() && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_A) == LytDoButtonRelated::ACT_IE_NONE) { field_0x1C9 = 0; diff --git a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp index 4144671b..98ec874a 100644 --- a/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_cross_btn.cpp @@ -34,7 +34,7 @@ void dLytMeterCrossBtnParts_c::initializeState_Wait() { mOnDelay = 15; } void dLytMeterCrossBtnParts_c::executeState_Wait() { - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { mOnDelay = 0; } @@ -150,7 +150,7 @@ void dLytMeterCrossBtnParts_c::execute(bool bIsVisible) { return; } - if (dLytMeter_c::GetInstance()->getMeterField_0x13750() == 0) { + if (dLytMeter_c::GetInstance()->getMeterMode() == dLytMeterMain_c::MODE_MAP_INIT) { if (mIndex == CROSS_BTN_PART_TOP) { LytDoButtonRelated::setCrossTop(LytDoButtonRelated::ACT_IE_NONE, true); } else if (mIndex == CROSS_BTN_PART_DOWN) { diff --git a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp index b8770394..dde6a0b6 100644 --- a/src/d/lyt/meter/d_lyt_meter_dowsing.cpp +++ b/src/d/lyt/meter/d_lyt_meter_dowsing.cpp @@ -395,14 +395,14 @@ void dLytMeterDowsing_c::executeState_Wait() { mStateMgr.changeState(StateID_DemoMove); } else if (field_0x5505 != 0) { mStateMgr.changeState(StateID_MenuSelectingIn); - } else if (field_0x550A != 0 && (!dLytMeter_c::GetMain()->fn_800D5380(0) || dLytMeter_c::GetMain()->fn_800D5650() || - dLytMeter_c::GetMain()->fn_800D5680())) { + } else if (field_0x550A != 0 && (!dLytMeter_c::GetMain()->fn_800D5380(0) || dLytMeter_c::GetMain()->isInModeMap() || + dLytMeter_c::GetMain()->isInModePause())) { mStateMgr.changeState(StateID_Reset); } else if (!dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C)) { mStateMgr.changeState(StateID_ToUnuse); - } else if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() != 0 && field_0x550A == 0 && - dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->fn_800D5650() && - !dLytMeter_c::GetMain()->fn_800D5680() && getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK && + } else if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() && field_0x550A == 0 && + dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && + !dLytMeter_c::GetMain()->isInModePause() && getSelectedDowsingSlot() != DowsingTarget::SLOT_LOOK && getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52) { mAnm[DOWSING_ANIM_IN].setBackwardsOnce(); @@ -552,7 +552,7 @@ void dLytMeterDowsing_c::initializeState_ToUse() { if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) { + !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { mAnm[DOWSING_ANIM_RESET].setAnimEnable(true); mAnm[DOWSING_ANIM_RESET].setBackwardsOnce(); mAnm[DOWSING_ANIM_RESET].setToStart(); @@ -561,7 +561,7 @@ void dLytMeterDowsing_c::initializeState_ToUse() { void dLytMeterDowsing_c::executeState_ToUse() { if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) { + !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { if (mAnm[DOWSING_ANIM_INPUT_0].isStop2()) { if (!mAnm[DOWSING_ANIM_RESET].isEnabled() || mAnm[DOWSING_ANIM_RESET].isStop2()) { mStateMgr.changeState(StateID_Wait); @@ -586,7 +586,7 @@ void dLytMeterDowsing_c::finalizeState_ToUse() { void dLytMeterDowsing_c::initializeState_ToUnuse() { mAnm[DOWSING_ANIM_INPUT_0].setForwardOnce(); - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { mAnm[DOWSING_ANIM_INPUT_0].setToEnd2(); } else { mAnm[DOWSING_ANIM_INPUT_0].setToStart(); @@ -595,7 +595,7 @@ void dLytMeterDowsing_c::initializeState_ToUnuse() { if (FileManager::GetInstance()->getDowsingSlotIdx() != 8 && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == 0x52 && dLytMeter_c::GetMain()->fn_800D5380(0) && - !dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680()) { + !dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause()) { mAnm[DOWSING_ANIM_RESET].setAnimEnable(true); mAnm[DOWSING_ANIM_RESET].setForwardOnce(); mAnm[DOWSING_ANIM_RESET].setToStart(); @@ -631,7 +631,7 @@ void dLytMeterDowsing_c::executeState_Unuse() { mLyt.calc(); mAnm[DOWSING_ANIM_INPUT_0].setAnimEnable(false); mStateMgr.changeState(StateID_DemoMove); - } else if (!dLytMeter_c::GetMain()->fn_800D5680() && !dLytMeter_c::GetInstance()->isHelpOpen() && + } else if (!dLytMeter_c::GetMain()->isInModePause() && !dLytMeter_c::GetInstance()->isHelpOpen() && dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_C)) { if (field_0x54D8 <= 0) { mStateMgr.changeState(StateID_ToUse); @@ -1104,7 +1104,7 @@ void dLytMeterDowsing_c::fn_800FE110() { mText[0].setShouldBeSelect(false); } - if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() != 0 && field_0x550A == 0) { + if (dLytMeter_c::GetInstance()->getMeterField_0x1377F() && field_0x550A == 0) { mInput.setShouldBeSelect(true); } else { mInput.setShouldBeSelect(false); @@ -1114,8 +1114,8 @@ void dLytMeterDowsing_c::fn_800FE110() { void dLytMeterDowsing_c::fn_800FE220() { if (getSelectedDowsingSlot() != DowsingTarget::SLOT_NONE && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_C) == LytDoButtonRelated::ACT_IE_INFO_DOWSE && - dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->fn_800D5650() && - !dLytMeter_c::GetMain()->fn_800D5680()) { + dLytMeter_c::GetMain()->fn_800D5380(0) && !dLytMeter_c::GetMain()->isInModeMap() && + !dLytMeter_c::GetMain()->isInModePause()) { mAnm[DOWSING_ANIM_RESET].setAnimEnable(true); mAnm[DOWSING_ANIM_RESET].setForwardOnce(); mAnm[DOWSING_ANIM_RESET].setToStart(); @@ -1169,7 +1169,7 @@ bool dLytMeterDowsing_c::fn_800FE4B0() const { bool dLytMeterDowsing_c::fn_800FE610() { if ((!dLytMeter_c::GetMain()->getDowsingNotHiddenByAreaCaption() && !dLytAreaCaption_c::getVisible()) || - !getPane()->IsVisible() || dLytMeter_c::GetMain()->fn_800D5680()) { + !getPane()->IsVisible() || dLytMeter_c::GetMain()->isInModePause()) { return false; } return true; @@ -1196,7 +1196,7 @@ s32 dLytMeterDowsing_c::convertToLytIndex(s32 slot) const { } u8 dLytMeterDowsing_c::getSelectedDowsingSlot() const { - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { return DowsingTarget::SLOT_NONE; } else { return FileManager::GetInstance()->getDowsingSlotIdx(); diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index 3055d073..7ee9987d 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -688,7 +688,7 @@ void dLytMeterItemSelect_c::executeState_Wait() { mStateMgr.changeState(StateID_SetSpecialItemIn); } else if (!dLytMeter_c::GetInstance()->checkAllFlags(METER_BTN_B)) { mStateMgr.changeState(StateID_ToUnuse); - } else if (!dLytMeter_c::GetMain()->fn_800D5650() && !dLytMeter_c::GetMain()->fn_800D5680() && + } else if (!dLytMeter_c::GetMain()->isInModeMap() && !dLytMeter_c::GetMain()->isInModePause() && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) != LytDoButtonRelated::ACT_IE_ETC_ITEMS && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) != LytDoButtonRelated::ACT_IE_ETC_RETURN && LytDoButtonRelated::get(LytDoButtonRelated::DO_BUTTON_B) != LytDoButtonRelated::ACT_IE_ETC_DONE && @@ -2483,8 +2483,8 @@ bool dLytMeterItemSelect_c::fn_800EFDF0(bool b) const { bool dLytMeterItemSelect_c::fn_800F0030() const { if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_B_WHEEL_UNLOCKED) && !(EventManager::isInEvent() && EventManager::isCurrentEvent("ItemGetGorgeous")) || - (mpOwnerPane == nullptr || !mpOwnerPane->IsVisible() || dLytMeter_c::GetMain()->fn_800D5650() || - dLytMeter_c::GetMain()->fn_800D5680() || !dLytMeter_c::GetMain()->getItemSelectNotHiddenByAreaCaption())) { + (mpOwnerPane == nullptr || !mpOwnerPane->IsVisible() || dLytMeter_c::GetMain()->isInModeMap() || + dLytMeter_c::GetMain()->isInModePause() || !dLytMeter_c::GetMain()->getItemSelectNotHiddenByAreaCaption())) { // If we don't have a B-Wheel and we're not currently in the ItemGetGorgeous event, // or (random other conditions), return false return false; @@ -2715,7 +2715,7 @@ bool dLytMeterItemSelect_c::isWheelBlockedByCurrentAction() { dAcPy_c::LINK->checkActionFlags(dAcPy_c::FLG0_SWING_ROPE) || dAcPy_c::LINK->checkCurrentAction(0x9C) || dAcPy_c::LINK->getRidingActorType() == dAcPy_c::RIDING_TRUCK_MINECART || dAcPy_c::LINK->checkCurrentAction(0x95) || isInSpiralChargeTutorialMinigame() || isInRollercoasterMinigame() || - dAcPy_c::LINK->checkCurrentAction(0x8C) || dLytMeter_c::GetMain()->getField_0x1377E() != 0 || + dAcPy_c::LINK->checkCurrentAction(0x8C) || dLytMeter_c::GetMain()->isInSwordDrawEvent() || checkIsInSkykeepPuzzle() || dLytMeter_c::GetInstance()->getMeterField_0x13770() == 0) { return true; } diff --git a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp index 297ff3c1..001b70a0 100644 --- a/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp +++ b/src/d/lyt/meter/d_lyt_meter_minus_btn.cpp @@ -1039,8 +1039,8 @@ bool dLytMeterMinusBtn_c::fn_800F7600() const { bool dLytMeterMinusBtn_c::fn_800F7760() const { if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_POUCH_UNLOCKED) || - (mpOwnerPane == nullptr || !mpOwnerPane->IsVisible() || dLytMeter_c::GetMain()->fn_800D5650() || - dLytMeter_c::GetMain()->fn_800D5680() || !dLytMeter_c::GetMain()->getMinusBtnNotHiddenByAreaCaption())) { + (mpOwnerPane == nullptr || !mpOwnerPane->IsVisible() || dLytMeter_c::GetMain()->isInModeMap() || + dLytMeter_c::GetMain()->isInModePause() || !dLytMeter_c::GetMain()->getMinusBtnNotHiddenByAreaCaption())) { return false; } diff --git a/src/d/lyt/meter/d_lyt_meter_timer.cpp b/src/d/lyt/meter/d_lyt_meter_timer.cpp index 31b8eef4..911f2a3e 100644 --- a/src/d/lyt/meter/d_lyt_meter_timer.cpp +++ b/src/d/lyt/meter/d_lyt_meter_timer.cpp @@ -201,7 +201,7 @@ void LytMeterTimerPart1_c::initOutAnim() { } void LytMeterTimerPart1_c::startInAnim() { - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { mAnm[TIMER_01_ANIM_MAP_POSITION].setFrame(1.0f); } else { mAnm[TIMER_01_ANIM_MAP_POSITION].setFrame(0.0f); @@ -620,7 +620,7 @@ void LytMeterTimerPart2_c::initChangeFruitAnim() { } void LytMeterTimerPart2_c::startInAnim() { - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { mAnm[TIMER_02_ANIM_MAP_POSITION].setFrame(1.0f); } else { mAnm[TIMER_02_ANIM_MAP_POSITION].setFrame(0.0f); @@ -1365,7 +1365,7 @@ void dLytMeterTimer_c::startIn() { mpPart2->stopOutAnim(); mpPart1->startInAnim(); mpPart2->startInAnim(); - if (dLytMeter_c::GetMain()->fn_800D5650()) { + if (dLytMeter_c::GetMain()->isInModeMap()) { if (mStateMgr.isState(StateID_ChangeSiren)) { mpPart2->stopFlowerLoopAnim(); mpPart2->resetFlowerLoopAnim(); From 466ddb54013e1adcbd7eef1a48ddfc9cfc956973 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 27 Nov 2025 10:51:12 +0100 Subject: [PATCH 15/15] 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 {