summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-04-11 14:05:39 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-04-18 09:05:49 -0400
commit387b69e96e6a4bb09eb398bb134c446593545b2d (patch)
tree724870c9e965d0e1fab2d2d49f98bf6f0156cecd
parent7156493229f2a0ac36ba98e7271f147bdd18b47a (diff)
dAcODormitoryGate_c Start
-rw-r--r--config/SOUE01/rels/d_a_obj_dormitory_gateNP/symbols.txt4
-rw-r--r--include/d/a/obj/d_a_obj_dormitory_gate.h44
-rw-r--r--include/d/flag/storyflag_map.h2
-rw-r--r--include/nw4r/g3d/res/g3d_resnode.h2
-rw-r--r--src/REL/d/a/obj/d_a_obj_dormitory_gate.cpp124
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<Type_e>(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() {}