some Progress

This commit is contained in:
elijah-thomas774
2025-11-24 02:44:18 -05:00
parent 4c1290dad7
commit c59fe14362
3 changed files with 255 additions and 22 deletions
+5
View File
@@ -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();
+39 -11
View File
@@ -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<dAcOdoor_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<dAcOdoor_c> mConnectedDoor;
/* 0x560 */ dAcRef_c<dAcOLock_c> mLock;
/* 0x56C */ dAcRef_c<dAcObjBase_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
+211 -11
View File
@@ -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<dAcOLock_c *>(
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<dAcOdoor_c *>(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<dAcOdoor_c *>(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<dAcObjBase_c *>(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<f32>::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