From 387b69e96e6a4bb09eb398bb134c446593545b2d Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 11 Apr 2026 14:05:39 -0400 Subject: [PATCH] dAcODormitoryGate_c Start --- .../rels/d_a_obj_dormitory_gateNP/symbols.txt | 4 +- include/d/a/obj/d_a_obj_dormitory_gate.h | 44 ++++++- include/d/flag/storyflag_map.h | 2 +- include/nw4r/g3d/res/g3d_resnode.h | 2 +- src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp | 124 ++++++++++++++++++ 5 files changed, 170 insertions(+), 6 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_dormitory_gateNP/symbols.txt b/config/SOUE01/rels/d_a_obj_dormitory_gateNP/symbols.txt index fb836b20..e7cda11f 100644 --- a/config/SOUE01/rels/d_a_obj_dormitory_gateNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_dormitory_gateNP/symbols.txt @@ -9,8 +9,8 @@ __dt__35sFStateFct_c<19dAcODormitoryGate_c>Fv = .text:0x00000290; // type:functi __dt__88sStateMgr_c<19dAcODormitoryGate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0 __dt__58sFStateMgr_c<19dAcODormitoryGate_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4 fn_534_450 = .text:0x00000450; // type:function size:0x40 -AcODormitoryGate__initModels = .text:0x00000490; // type:function size:0x238 -fn_534_6D0 = .text:0x000006D0; // type:function size:0x2BC +createHeap__19dAcODormitoryGate_cFv = .text:0x00000490; // type:function size:0x238 +create__19dAcODormitoryGate_cFv = .text:0x000006D0; // type:function size:0x2BC changeState__88sStateMgr_c<19dAcODormitoryGate_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000990; // type:function size:0x10 fn_534_9A0 = .text:0x000009A0; // type:function size:0x8 fn_534_9B0 = .text:0x000009B0; // type:function size:0xEC diff --git a/include/d/a/obj/d_a_obj_dormitory_gate.h b/include/d/a/obj/d_a_obj_dormitory_gate.h index 3e0ab410..9f1e81c1 100644 --- a/include/d/a/obj/d_a_obj_dormitory_gate.h +++ b/include/d/a/obj/d_a_obj_dormitory_gate.h @@ -2,18 +2,58 @@ #define D_A_OBJ_DORMITORY_GATE_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +#include "toBeSorted/stage_render_stuff.h" class dAcODormitoryGate_c : public dAcObjBase_c { public: - dAcODormitoryGate_c() : mStateMgr(*this) {} + enum Type_e { + TYPE_GATE = 0, + TYPE_GODDOOR = 1, + TYPE_SHUTTER = 2, + TYPE_GATE_F400 = 3, + }; + dAcODormitoryGate_c() : mStateMgr(*this), mScnCallback(this) {} virtual ~dAcODormitoryGate_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcODormitoryGate_c, Wait); STATE_FUNC_DECLARE(dAcODormitoryGate_c, End); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcODormitoryGate_c); + /** Sets the parameter for Door to be open/closed physically */ + void fn_534_C80(); + + /** Sets the Door open/closed physically */ + void fn_534_D40(); + + bool checkOpenFlag(); + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdls[2]; + /* 0x36C */ m3d::anmMatClr_c mAnmMatClr; + /* 0x398 */ dBgW mCollision[2]; + /* 0x7B8 */ STATE_MGR_DECLARE(dAcODormitoryGate_c); + /* 0x7F4 */ mMtx_c mDoorMtx[2]; + /* 0x854 */ Type_e mSubtype; + /* 0x858 */ u8 mNumDoors; + /* 0x85C */ f32 mShutterHeight; + /* 0x860 */ mAng mGateAngle; + /* 0x862 */ bool mIsOpen; + /* 0x863 */ u8 _0x863[0x865 - 0x863]; + /* 0x865 */ u8 mGodDoorSomething; + /* 0x868 */ dScnCallback_c mScnCallback; + /* 0x874 */ u16 mStoryflag; }; #endif diff --git a/include/d/flag/storyflag_map.h b/include/d/flag/storyflag_map.h index 4feeed1f..a8c617a8 100644 --- a/include/d/flag/storyflag_map.h +++ b/include/d/flag/storyflag_map.h @@ -3383,7 +3383,7 @@ enum StoryFlags_e { /** [Goddess Statue Opened] * Story Flag #672 (0x02A0) - JP 805ACDA0 0x02 / US 805A9B20 0x02 */ - STORYFLAG_672, + STORYFLAG_GODDESS_STATUE_ACCESS, /** [Set when Scrapper picks up Oolo] * Story Flag #673 (0x02A1) - JP 805ACDA0 0x04 / US 805A9B20 0x04 diff --git a/include/nw4r/g3d/res/g3d_resnode.h b/include/nw4r/g3d/res/g3d_resnode.h index 43f080c9..d3198e8f 100644 --- a/include/nw4r/g3d/res/g3d_resnode.h +++ b/include/nw4r/g3d/res/g3d_resnode.h @@ -141,7 +141,7 @@ public: } const math::VEC3 &GetTranslate() const { - return ref().translate; + return *(const math::VEC3 *)&ref().translate; } // not in the dwarf diff --git a/src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp b/src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp index 702214c1..c343ad04 100644 --- a/src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp +++ b/src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp @@ -1,10 +1,134 @@ #include "d/a/obj/d_a_obj_dormitory_gate.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/c/c_m3d_g_aab.h" +#include "d/d_stage.h" +#include "d/flag/storyflag_manager.h" +#include "f/f_base.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/g3d/res/g3d_resnode.h" +#include "toBeSorted/arc_managers/current_stage_arc_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_DORMITORY_GATE, dAcODormitoryGate_c, fProfile::OBJ_DORMITORY_GATE, 0x17A, 0, 3); STATE_DEFINE(dAcODormitoryGate_c, Wait); STATE_DEFINE(dAcODormitoryGate_c, End); +static const char *sGateMdls[4] = { + "StageF000Gate", + "StageF000GodDoor", + "StageF000Shutter", + "StageF400Gate", +}; +static const char *sGateDZB[4] = { + "dzb/StageF000Gate.dzb", + "dzb/StageF000GodDoor.dzb", + "dzb/StageF000Shutter.dzb", + "dzb/StageF400Gate.dzb", +}; +static const char *sGatePLC[4] = { + "dat/StageF000Gate.plc", + "dat/StageF000GodDoor.plc", + "dat/StageF000Shutter.plc", + "dat/StageF400Gate.plc", +}; +bool dAcODormitoryGate_c::createHeap() { + mResFile = nw4r::g3d::ResFile(CurrentStageArcManager::GetInstance()->getData("g3d/stage.brres")); + dStage_c::bindStageResToFile(&mResFile); + dStage_c::bindSkyCmnToResFile(&mResFile); + + nw4r::g3d::ResMdl resMdl = mResFile.GetResMdl(sGateMdls[mSubtype]); + if (mSubtype == TYPE_GATE || mSubtype == TYPE_GATE_F400) { + mNumDoors = 2; + } else { + mNumDoors = 1; + } + + // TODO: Rename - Opens the Doors + fn_534_C80(); + fn_534_D40(); + for (int i = 0; i < mNumDoors; ++i) { + if (!mMdls[i].create(resMdl, &mAllocator, 0x120, 1, nullptr)) { + return false; + } + cBgD_t *dzb = (cBgD_t *)CurrentStageArcManager::GetInstance()->getData(sGateDZB[mSubtype]); + PLC *plc = (PLC *)CurrentStageArcManager::GetInstance()->getData(sGatePLC[mSubtype]); + if (mSubtype != TYPE_GODDOOR) { + mMdls[i].setPriorityDraw(0x1C, -1); + } + + // TODO: Return Type + s32 tmp = !(BOOL)mCollision[i].Set(dzb, plc, 1, &mDoorMtx[i], &mScale); + if (tmp != 0) { + return false; + } + } + + if (mSubtype == TYPE_GODDOOR) { + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl(sGateMdls[mSubtype]); + nw4r::g3d::ResAnmClr anmClr = mResFile.GetResAnmClr("StageF000GodDoor"); + if (!mAnmMatClr.create(mdl, anmClr, &mAllocator, nullptr, 1)) { + return false; + } + mMdls[0].setAnm(mAnmMatClr); + mAnmMatClr.setRate(0.f, 0); + mScnCallback.attach(mMdls[0]); + } + return true; +} + +int dAcODormitoryGate_c::create() { + mSubtype = static_cast(getFromParams(8, 0xFF)); + if (mSubtype == 1 && StoryflagManager::sInstance->getFlag(STORYFLAG_GODDESS_STATUE_ACCESS)) { + return FAILED; + } + + if (mSubtype == TYPE_GATE_F400) { + mStoryflag = getFromParams(16, 0x7FF); + } + + CREATE_ALLOCATOR_SIZE(dAcODormitoryGate_c, 0x2000); + + for (int i = 0; i < mNumDoors; ++i) { + dBgS::GetInstance()->Regist(&mCollision[i], this); + } + + mStateMgr.changeState(StateID_Wait); + + mVec3_c min, max; + switch (mSubtype) { + case TYPE_GATE: + case TYPE_GATE_F400: + min = mVec3_c(-400.f, -0.f, -50.f); + max = mVec3_c(400.f, 600.f, 250.f); + break; + case TYPE_SHUTTER: + min = mVec3_c(-250.f, -0.f, -50.f); + max = mVec3_c(250.f, 400.f, 50.f); + break; + case TYPE_GODDOOR: + min = mVec3_c(-50.f, -0.f, -100.f); + max = mVec3_c(500.f, 500.f, 100.f); + break; + } + mBoundingBox.Set(min, max); + + if (mSubtype == TYPE_GODDOOR) { + mPosition.copyFrom(mMdls[0].getResMdl().GetResNode(0).GetTranslate()); + } + mWorldMtx.transS(mPosition); + mWorldMtx.ZXYrotM(mRotation); + mIsOpen = checkOpenFlag(); + + return SUCCEEDED; +} + void dAcODormitoryGate_c::initializeState_Wait() {} void dAcODormitoryGate_c::executeState_Wait() {} void dAcODormitoryGate_c::finalizeState_Wait() {}