mirror of
https://github.com/zeldaret/ss
synced 2026-05-25 15:25:13 -04:00
some Progress
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user