mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-12-08 22:27:42 +00:00
Nearly match CScriptDoor
This commit is contained in:
@@ -5715,7 +5715,7 @@ __ct__Q210IAllocator8SMetricsFRCQ210IAllocator8SMetrics = .text:0x800C364C; // t
|
|||||||
GetCurrentConnectedAreaId__11CScriptDockCFRC13CStateManager = .text:0x800C3700; // type:function size:0x9C scope:global
|
GetCurrentConnectedAreaId__11CScriptDockCFRC13CStateManager = .text:0x800C3700; // type:function size:0x9C scope:global
|
||||||
UpdateAreaActivateFlags__11CScriptDockFR13CStateManager = .text:0x800C379C; // type:function size:0xFC scope:global
|
UpdateAreaActivateFlags__11CScriptDockFR13CStateManager = .text:0x800C379C; // type:function size:0xFC scope:global
|
||||||
SetDockReference__11CScriptDockFR13CStateManageri = .text:0x800C3898; // type:function size:0x6C scope:global
|
SetDockReference__11CScriptDockFR13CStateManageri = .text:0x800C3898; // type:function size:0x6C scope:global
|
||||||
GetDockReference__11CScriptDockCFv = .text:0x800C3904; // type:function size:0x4C scope:global
|
GetDockReference__11CScriptDockCFRC13CStateManager = .text:0x800C3904; // type:function size:0x4C scope:global
|
||||||
Accept__11CScriptDockFR8IVisitor = .text:0x800C3950; // type:function size:0x38 scope:global
|
Accept__11CScriptDockFR8IVisitor = .text:0x800C3950; // type:function size:0x38 scope:global
|
||||||
GetPlane__11CScriptDockCFRC13CStateManager = .text:0x800C3988; // type:function size:0x8C scope:global
|
GetPlane__11CScriptDockCFRC13CStateManager = .text:0x800C3988; // type:function size:0x8C scope:global
|
||||||
HasPointCrossedDock__11CScriptDockCFRC13CStateManagerRC9CVector3f = .text:0x800C3A14; // type:function size:0xA4 scope:global
|
HasPointCrossedDock__11CScriptDockCFRC13CStateManagerRC9CVector3f = .text:0x800C3A14; // type:function size:0xA4 scope:global
|
||||||
@@ -18124,7 +18124,7 @@ __vt__15CBCKnockBackCmd = .data:0x803DAA44; // type:object size:0xC scope:global
|
|||||||
__vt__15CBCKnockDownCmd = .data:0x803DAA50; // type:object size:0xC scope:global
|
__vt__15CBCKnockDownCmd = .data:0x803DAA50; // type:object size:0xC scope:global
|
||||||
__vt__12CBCHurledCmd = .data:0x803DAA5C; // type:object size:0xC scope:global
|
__vt__12CBCHurledCmd = .data:0x803DAA5C; // type:object size:0xC scope:global
|
||||||
__vt__13CBodyStateCmd = .data:0x803DAA68; // type:object size:0x10 scope:global
|
__vt__13CBodyStateCmd = .data:0x803DAA68; // type:object size:0x10 scope:global
|
||||||
lbl_803DAA78 = .data:0x803DAA78; // type:object size:0x84
|
__vt__11CScriptDoor = .data:0x803DAA78; // type:object size:0x84
|
||||||
jumptable_803DAAFC = .data:0x803DAAFC; // type:object size:0x84 scope:local
|
jumptable_803DAAFC = .data:0x803DAAFC; // type:object size:0x84 scope:local
|
||||||
__vt__35TObjOwnerDerivedFromIObj<8CMapArea> = .data:0x803DAB80; // type:object size:0xC scope:weak
|
__vt__35TObjOwnerDerivedFromIObj<8CMapArea> = .data:0x803DAB80; // type:object size:0xC scope:weak
|
||||||
__vt__11CBallCamera = .data:0x803DAB90; // type:object size:0x74 scope:global
|
__vt__11CBallCamera = .data:0x803DAB90; // type:object size:0x74 scope:global
|
||||||
@@ -19821,13 +19821,13 @@ lbl_805A6FE0 = .sdata:0x805A6FE0; // type:object size:0x4 data:4byte
|
|||||||
lbl_805A6FE4 = .sdata:0x805A6FE4; // type:object size:0x4 data:4byte
|
lbl_805A6FE4 = .sdata:0x805A6FE4; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FE8 = .sdata:0x805A6FE8; // type:object size:0x4 data:4byte
|
lbl_805A6FE8 = .sdata:0x805A6FE8; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FEC = .sdata:0x805A6FEC; // type:object size:0x4 data:4byte
|
lbl_805A6FEC = .sdata:0x805A6FEC; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FF0 = .sdata:0x805A6FF0; // type:object size:0x4 data:4byte
|
@338 = .sdata:0x805A6FF0; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FF4 = .sdata:0x805A6FF4; // type:object size:0x4 data:4byte
|
@339 = .sdata:0x805A6FF4; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FF8 = .sdata:0x805A6FF8; // type:object size:0x4 data:4byte
|
@340 = .sdata:0x805A6FF8; // type:object size:0x4 data:4byte
|
||||||
lbl_805A6FFC = .sdata:0x805A6FFC; // type:object size:0x4 data:4byte
|
@341 = .sdata:0x805A6FFC; // type:object size:0x4 data:4byte
|
||||||
lbl_805A7000 = .sdata:0x805A7000; // type:object size:0x4 data:4byte
|
@342 = .sdata:0x805A7000; // type:object size:0x4 data:4byte
|
||||||
lbl_805A7004 = .sdata:0x805A7004; // type:object size:0x4 data:4byte
|
@343 = .sdata:0x805A7004; // type:object size:0x4 data:4byte
|
||||||
lbl_805A7008 = .sdata:0x805A7008; // type:object size:0x8 data:4byte
|
@344 = .sdata:0x805A7008; // type:object size:0x8 data:4byte
|
||||||
gHackAssetId = .sdata:0x805A7010; // type:object size:0x4 scope:local data:4byte
|
gHackAssetId = .sdata:0x805A7010; // type:object size:0x4 scope:local data:4byte
|
||||||
lbl_805A7018 = .sdata:0x805A7018; // type:object size:0x4
|
lbl_805A7018 = .sdata:0x805A7018; // type:object size:0x4
|
||||||
lbl_805A701C = .sdata:0x805A701C; // type:object size:0x4
|
lbl_805A701C = .sdata:0x805A701C; // type:object size:0x4
|
||||||
|
|||||||
@@ -5715,7 +5715,7 @@ __ct__Q210IAllocator8SMetricsFRCQ210IAllocator8SMetrics = .text:0x800C36C8; // t
|
|||||||
GetCurrentConnectedAreaId__11CScriptDockCFRC13CStateManager = .text:0x800C377C; // type:function size:0x9C scope:global
|
GetCurrentConnectedAreaId__11CScriptDockCFRC13CStateManager = .text:0x800C377C; // type:function size:0x9C scope:global
|
||||||
UpdateAreaActivateFlags__11CScriptDockFR13CStateManager = .text:0x800C3818; // type:function size:0xFC scope:global
|
UpdateAreaActivateFlags__11CScriptDockFR13CStateManager = .text:0x800C3818; // type:function size:0xFC scope:global
|
||||||
SetDockReference__11CScriptDockFR13CStateManageri = .text:0x800C3914; // type:function size:0x6C scope:global
|
SetDockReference__11CScriptDockFR13CStateManageri = .text:0x800C3914; // type:function size:0x6C scope:global
|
||||||
GetDockReference__11CScriptDockCFv = .text:0x800C3980; // type:function size:0x4C scope:global
|
GetDockReference__11CScriptDockCFRC13CStateManager = .text:0x800C3980; // type:function size:0x4C scope:global
|
||||||
Accept__11CScriptDockFR8IVisitor = .text:0x800C39CC; // type:function size:0x38 scope:global
|
Accept__11CScriptDockFR8IVisitor = .text:0x800C39CC; // type:function size:0x38 scope:global
|
||||||
GetPlane__11CScriptDockCFRC13CStateManager = .text:0x800C3A04; // type:function size:0x8C scope:global
|
GetPlane__11CScriptDockCFRC13CStateManager = .text:0x800C3A04; // type:function size:0x8C scope:global
|
||||||
HasPointCrossedDock__11CScriptDockCFRC13CStateManagerRC9CVector3f = .text:0x800C3A90; // type:function size:0xA4 scope:global
|
HasPointCrossedDock__11CScriptDockCFRC13CStateManagerRC9CVector3f = .text:0x800C3A90; // type:function size:0xA4 scope:global
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ public:
|
|||||||
void EnableLooping(bool enable);
|
void EnableLooping(bool enable);
|
||||||
static CModelData CModelDataNull();
|
static CModelData CModelDataNull();
|
||||||
static EWhichModel GetRenderingModel(const CStateManager& mgr);
|
static EWhichModel GetRenderingModel(const CStateManager& mgr);
|
||||||
|
float GetAnimationDuration(int anim) const;
|
||||||
|
|
||||||
|
bool IsAnimating() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CVector3f x0_scale;
|
CVector3f x0_scale;
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ public:
|
|||||||
void SetClampVelRange(float v) { x474_clampVelRange = v; }
|
void SetClampVelRange(float v) { x474_clampVelRange = v; }
|
||||||
|
|
||||||
void DoorClosing(TUniqueId uid);
|
void DoorClosing(TUniqueId uid);
|
||||||
|
void DoorClosed(TUniqueId uid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct SFailsafeState {
|
struct SFailsafeState {
|
||||||
|
|||||||
@@ -34,11 +34,19 @@ public:
|
|||||||
void OpenDoor(TUniqueId uid, CStateManager& mgr);
|
void OpenDoor(TUniqueId uid, CStateManager& mgr);
|
||||||
|
|
||||||
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId other, CStateManager& mgr) override;
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId other, CStateManager& mgr) override;
|
||||||
|
void Think(float dt, CStateManager& mgr) override;
|
||||||
|
|
||||||
const TUniqueId GetDockID() const { return mDockId; }
|
const TUniqueId GetConnectedDockID() const { return mDockId; }
|
||||||
bool IsOpen() const { return mIsOpen; }
|
bool IsOpen() const { return mIsOpen; }
|
||||||
void SetDoClose(const bool close) { mDoClose = close; }
|
void SetDoClose(const bool close) { mDoClose = close; }
|
||||||
|
|
||||||
|
bool IsConnectedToArea(const CStateManager& mgr, TAreaId area) const;
|
||||||
|
void ForceClosed(CStateManager& mgr);
|
||||||
|
|
||||||
|
void AddToRenderer(const CFrustumPlanes& /*frustum*/, const CStateManager& mgr) const override;
|
||||||
|
void Render(const CStateManager& mgr) const override;
|
||||||
|
void Accept(IVisitor& visitor) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float mAnimLength;
|
float mAnimLength;
|
||||||
float mAnimTime;
|
float mAnimTime;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "MetroidPrime/ScriptObjects/CScriptDoor.hpp"
|
#include "MetroidPrime/ScriptObjects/CScriptDoor.hpp"
|
||||||
|
|
||||||
|
#include "Collision/CMaterialList.hpp"
|
||||||
|
#include "Kyoto/Math/CFrustumPlanes.hpp"
|
||||||
#include "MetroidPrime/CAnimData.hpp"
|
#include "MetroidPrime/CAnimData.hpp"
|
||||||
#include "MetroidPrime/CAnimPlaybackParms.hpp"
|
#include "MetroidPrime/CAnimPlaybackParms.hpp"
|
||||||
#include "MetroidPrime/CEntity.hpp"
|
#include "MetroidPrime/CEntity.hpp"
|
||||||
@@ -8,9 +10,11 @@
|
|||||||
#include "MetroidPrime/CMapWorldInfo.hpp"
|
#include "MetroidPrime/CMapWorldInfo.hpp"
|
||||||
#include "MetroidPrime/CObjectList.hpp"
|
#include "MetroidPrime/CObjectList.hpp"
|
||||||
#include "MetroidPrime/CPhysicsActor.hpp"
|
#include "MetroidPrime/CPhysicsActor.hpp"
|
||||||
|
#include "MetroidPrime/CStateManager.hpp"
|
||||||
#include "MetroidPrime/CWorld.hpp"
|
#include "MetroidPrime/CWorld.hpp"
|
||||||
#include "MetroidPrime/Cameras/CBallCamera.hpp"
|
#include "MetroidPrime/Cameras/CBallCamera.hpp"
|
||||||
#include "MetroidPrime/Cameras/CCameraManager.hpp"
|
#include "MetroidPrime/Cameras/CCameraManager.hpp"
|
||||||
|
#include "MetroidPrime/Player/CPlayerState.hpp"
|
||||||
#include "MetroidPrime/ScriptObjects/CScriptDock.hpp"
|
#include "MetroidPrime/ScriptObjects/CScriptDock.hpp"
|
||||||
#include "MetroidPrime/TCastTo.hpp"
|
#include "MetroidPrime/TCastTo.hpp"
|
||||||
#include "MetroidPrime/TGameTypes.hpp"
|
#include "MetroidPrime/TGameTypes.hpp"
|
||||||
@@ -77,7 +81,7 @@ CScriptDoor::EDoorOpenCondition CScriptDoor::GetDoorOpenCondition(CStateManager&
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) {
|
void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) {
|
||||||
mgr.MapWorldInfo()->SetDoorVisited(mgr.GetEditorIdForUniqueId(uid), true);
|
mgr.MapWorldInfo()->SetDoorVisited(mgr.GetEditorIdForUniqueId(GetUniqueId()), true);
|
||||||
mIsOpen = true;
|
mIsOpen = true;
|
||||||
mWasOpen = true;
|
mWasOpen = true;
|
||||||
mConditionsMet = false;
|
mConditionsMet = false;
|
||||||
@@ -105,7 +109,7 @@ void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (const CScriptDock* dock2 =
|
if (const CScriptDock* dock2 =
|
||||||
TCastToConstPtr< CScriptDock >(mgr.GetObjectById(door->GetDockID()))) {
|
TCastToConstPtr< CScriptDock >(mgr.GetObjectById(door->GetConnectedDockID()))) {
|
||||||
if (dock2->GetAreaId() == dock1->GetCurrentConnectedAreaId(mgr) &&
|
if (dock2->GetAreaId() == dock1->GetCurrentConnectedAreaId(mgr) &&
|
||||||
dock2->GetCurrentConnectedAreaId(mgr) == dock1->GetAreaId()) {
|
dock2->GetCurrentConnectedAreaId(mgr) == dock1->GetAreaId()) {
|
||||||
mPartner2 = door->GetUniqueId();
|
mPartner2 = door->GetUniqueId();
|
||||||
@@ -119,8 +123,8 @@ void CScriptDoor::OpenDoor(TUniqueId uid, CStateManager& mgr) {
|
|||||||
|
|
||||||
if (mPartner1 == kInvalidUniqueId && mPartner2 == kInvalidUniqueId) {
|
if (mPartner1 == kInvalidUniqueId && mPartner2 == kInvalidUniqueId) {
|
||||||
|
|
||||||
rstl::vector< SConnection >::const_iterator it = GetConnectionList().begin();
|
for (rstl::vector< SConnection >::const_iterator it = GetConnectionList().begin();
|
||||||
for (; it != GetConnectionList().end(); ++it) {
|
it != GetConnectionList().end(); ++it) {
|
||||||
if (it->x4_msg != kSM_Open) {
|
if (it->x4_msg != kSM_Open) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -246,3 +250,104 @@ void CScriptDoor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStat
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CScriptDoor::Think(float dt, CStateManager& mgr) {
|
||||||
|
if (!GetActive()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mIsOpen && mAnimTime < 0.5f) {
|
||||||
|
mAnimTime += dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mConditionsMet && GetDoorOpenCondition(mgr) == kDOC_Ready) {
|
||||||
|
mConditionsMet = false;
|
||||||
|
OpenDoor(mPrevDoor, mgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mClosing) {
|
||||||
|
mWasOpen = false;
|
||||||
|
mgr.GetCameraManager()->BallCamera()->DoorClosed(GetUniqueId());
|
||||||
|
mProjectilesCollide = false;
|
||||||
|
mClosing = false;
|
||||||
|
SendScriptMsgs(kSS_Closed, mgr, kSM_Decrement);
|
||||||
|
mAnimTime = 0.f;
|
||||||
|
mDoClose = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mIsOpen && !GetModelData()->IsAnimating()) {
|
||||||
|
RemoveMaterial(kMT_Solid, kMT_Occluder, kMT_Orbit, kMT_Scannable, mgr);
|
||||||
|
} else {
|
||||||
|
if (mWasOpen && !GetModelData()->IsAnimating()) {
|
||||||
|
mWasOpen = false;
|
||||||
|
mgr.GetCameraManager()->BallCamera()->DoorClosed(GetUniqueId());
|
||||||
|
mProjectilesCollide = false;
|
||||||
|
mConditionsMet = false;
|
||||||
|
SendScriptMsgs(kSS_Closed, mgr, kSM_None);
|
||||||
|
mAnimTime = 0.f;
|
||||||
|
mDoClose = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetScannableObjectInfo()) {
|
||||||
|
AddMaterial(kMT_Solid, kMT_Metal, kMT_Occluder, kMT_Orbit, kMT_Scannable, mgr);
|
||||||
|
} else {
|
||||||
|
AddMaterial(kMT_Solid, kMT_Metal, kMT_Occluder, kMT_Orbit, mgr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetModelData()->IsAnimating()) {
|
||||||
|
float len = GetModelData()->GetAnimationDuration(static_cast< int >(mDoorState));
|
||||||
|
len /= mAnimLength;
|
||||||
|
UpdateAnimation(len * dt, mgr, true);
|
||||||
|
}
|
||||||
|
SetTargetable(mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::kPV_Scan);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CScriptDoor::IsConnectedToArea(const CStateManager& mgr, TAreaId areaId) const {
|
||||||
|
const CScriptDock* dockEnt = TCastToConstPtr< CScriptDock >(mgr.GetObjectById(mDockId));
|
||||||
|
if (dockEnt) {
|
||||||
|
if (dockEnt->GetAreaId() == areaId) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CWorld* world = mgr.GetWorld();
|
||||||
|
const CGameArea& area = world->GetAreaAlways(dockEnt->GetAreaId());
|
||||||
|
const CGameArea::Dock& dock = area.GetDock(dockEnt->GetDockId());
|
||||||
|
if (dock.GetConnectedAreaId(dockEnt->GetDockReference(mgr)) == areaId) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CScriptDoor::ForceClosed(CStateManager& mgr) {
|
||||||
|
if (mIsOpen) {
|
||||||
|
mIsOpen = false;
|
||||||
|
mWasOpen = false;
|
||||||
|
|
||||||
|
mgr.GetCameraManager()->BallCamera()->DoorClosing(GetUniqueId());
|
||||||
|
mgr.GetCameraManager()->BallCamera()->DoorClosed(GetUniqueId());
|
||||||
|
|
||||||
|
SetDoorAnimation(kDS_Close);
|
||||||
|
SendScriptMsgs(kSS_Closed, mgr, kSM_None);
|
||||||
|
mConditionsMet = false;
|
||||||
|
mAnimTime = 0.f;
|
||||||
|
mDoClose = false;
|
||||||
|
} else if (mConditionsMet) {
|
||||||
|
mConditionsMet = false;
|
||||||
|
mDoClose = false;
|
||||||
|
SendScriptMsgs(kSS_Closed, mgr, kSM_None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CScriptDoor::AddToRenderer(const CFrustumPlanes& /*frustum*/, const CStateManager& mgr) const {
|
||||||
|
if (GetPreRenderClipped()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPhysicsActor::Render(mgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CScriptDoor::Render(const CStateManager& mgr) const {}
|
||||||
|
|
||||||
|
void CScriptDoor::Accept(IVisitor& visitor) { visitor.Visit(*this); }
|
||||||
|
|||||||
Reference in New Issue
Block a user