mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-17 21:41:15 +00:00
Clear unknowns in Doors
This commit is contained in:
parent
4998bdaf65
commit
2e4324c632
@ -10,7 +10,7 @@ class LegoROI;
|
|||||||
// SIZE 0x1f8
|
// SIZE 0x1f8
|
||||||
class Doors : public LegoPathActor {
|
class Doors : public LegoPathActor {
|
||||||
public:
|
public:
|
||||||
Doors() : m_unk0x154(0), m_ltDoor(NULL), m_rtDoor(NULL), m_unk0x1f4(0) {}
|
Doors() : m_state(0), m_ltDoor(NULL), m_rtDoor(NULL), m_angle(0) {}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x1000e430
|
// FUNCTION: LEGO1 0x1000e430
|
||||||
// FUNCTION: BETA10 0x100a7f20
|
// FUNCTION: BETA10 0x100a7f20
|
||||||
@ -29,19 +29,25 @@ class Doors : public LegoPathActor {
|
|||||||
void ParseAction(char* p_extra) override; // vtable+0x20
|
void ParseAction(char* p_extra) override; // vtable+0x20
|
||||||
void Animate(float p_time) override; // vtable+0x70
|
void Animate(float p_time) override; // vtable+0x70
|
||||||
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
|
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
|
||||||
virtual MxFloat VTable0xcc(float p_time); // vtable+0xcc
|
virtual MxFloat CalculateAngle(float p_time); // vtable+0xcc
|
||||||
|
|
||||||
// SYNTHETIC: LEGO1 0x1000e580
|
// SYNTHETIC: LEGO1 0x1000e580
|
||||||
// Doors::`scalar deleting destructor'
|
// Doors::`scalar deleting destructor'
|
||||||
|
|
||||||
private:
|
private:
|
||||||
undefined4 m_unk0x154; // 0x154
|
enum {
|
||||||
MxFloat m_unk0x158; // 0x158
|
e_none = 0,
|
||||||
LegoROI* m_ltDoor; // 0x15c
|
e_closed = 1,
|
||||||
LegoROI* m_rtDoor; // 0x160
|
e_cycling = 2,
|
||||||
MxMatrix m_ltDoorLocal; // 0x164
|
};
|
||||||
MxMatrix m_rtDoorLocal; // 0x1ac
|
|
||||||
MxFloat m_unk0x1f4; // 0x1f4
|
undefined4 m_state; // 0x154
|
||||||
|
MxFloat m_hitTime; // 0x158
|
||||||
|
LegoROI* m_ltDoor; // 0x15c
|
||||||
|
LegoROI* m_rtDoor; // 0x160
|
||||||
|
MxMatrix m_ltDoorOriginalLocal; // 0x164
|
||||||
|
MxMatrix m_rtDoorOriginalLocal; // 0x1ac
|
||||||
|
MxFloat m_angle; // 0x1f4
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DOORS_H
|
#endif // DOORS_H
|
||||||
|
|||||||
@ -12,15 +12,15 @@ DECOMP_SIZE_ASSERT(Doors, 0x1f8)
|
|||||||
|
|
||||||
// GLOBAL: LEGO1 0x100d8e7c
|
// GLOBAL: LEGO1 0x100d8e7c
|
||||||
// GLOBAL: BETA10 0x101b954c
|
// GLOBAL: BETA10 0x101b954c
|
||||||
MxFloat g_unk0x100d8e7c = 1000.0f;
|
MxFloat g_timeMoving = 1000.0f;
|
||||||
|
|
||||||
// GLOBAL: LEGO1 0x100d8e80
|
// GLOBAL: LEGO1 0x100d8e80
|
||||||
// GLOBAL: BETA10 0x101b9550
|
// GLOBAL: BETA10 0x101b9550
|
||||||
MxFloat g_unk0x100d8e80 = 4000.0f;
|
MxFloat g_timeOpened = 4000.0f;
|
||||||
|
|
||||||
// GLOBAL: LEGO1 0x100d8e84
|
// GLOBAL: LEGO1 0x100d8e84
|
||||||
// GLOBAL: BETA10 0x101b9554
|
// GLOBAL: BETA10 0x101b9554
|
||||||
MxFloat g_unk0x100d8e84 = 6000.0f;
|
MxFloat g_totalTime = 6000.0f; // = g_timeMoving + g_totalTime + g_timeMoving
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10066100
|
// FUNCTION: LEGO1 0x10066100
|
||||||
// FUNCTION: BETA10 0x10026850
|
// FUNCTION: BETA10 0x10026850
|
||||||
@ -28,36 +28,36 @@ MxResult Doors::HitActor(LegoPathActor* p_actor, MxBool p_bool)
|
|||||||
{
|
{
|
||||||
assert(m_ltDoor && m_rtDoor);
|
assert(m_ltDoor && m_rtDoor);
|
||||||
|
|
||||||
if (m_unk0x154 == 1) {
|
if (m_state == e_closed) {
|
||||||
m_unk0x154 = 2;
|
m_state = e_cycling;
|
||||||
m_unk0x158 = Timer()->GetTime();
|
m_hitTime = Timer()->GetTime();
|
||||||
m_ltDoorLocal = m_ltDoor->GetLocal2World();
|
m_ltDoorOriginalLocal = m_ltDoor->GetLocal2World();
|
||||||
m_rtDoorLocal = m_rtDoor->GetLocal2World();
|
m_rtDoorOriginalLocal = m_rtDoor->GetLocal2World();
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_unk0x1f4 < 0.001 ? SUCCESS : FAILURE;
|
return m_angle < 0.001 ? SUCCESS : FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x10066190
|
// FUNCTION: LEGO1 0x10066190
|
||||||
// FUNCTION: BETA10 0x1002696b
|
// FUNCTION: BETA10 0x1002696b
|
||||||
MxFloat Doors::VTable0xcc(float p_time)
|
MxFloat Doors::CalculateAngle(float p_time)
|
||||||
{
|
{
|
||||||
MxFloat fVar1;
|
MxFloat timeSinceHit;
|
||||||
|
|
||||||
fVar1 = p_time - m_unk0x158;
|
timeSinceHit = p_time - m_hitTime;
|
||||||
|
|
||||||
if (fVar1 <= 0.0f) {
|
if (timeSinceHit <= 0.0f) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fVar1 <= g_unk0x100d8e7c) {
|
if (timeSinceHit <= g_timeMoving) {
|
||||||
return fVar1 * 1.570796 / g_unk0x100d8e7c;
|
return timeSinceHit * 1.570796 / g_timeMoving;
|
||||||
}
|
}
|
||||||
else if (fVar1 <= g_unk0x100d8e7c + g_unk0x100d8e80) {
|
else if (timeSinceHit <= g_timeMoving + g_timeOpened) {
|
||||||
return 1.570796012878418; // Pi / 2
|
return 1.570796012878418; // Pi / 2
|
||||||
}
|
}
|
||||||
else if (fVar1 <= g_unk0x100d8e84) {
|
else if (timeSinceHit <= g_totalTime) {
|
||||||
return (1.0 - ((fVar1 - g_unk0x100d8e80) - g_unk0x100d8e7c) / g_unk0x100d8e7c) * 1.570796;
|
return (1.0 - ((timeSinceHit - g_timeOpened) - g_timeMoving) / g_timeMoving) * 1.570796;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
@ -72,44 +72,44 @@ void Doors::Animate(float p_time)
|
|||||||
// TODO: Match
|
// TODO: Match
|
||||||
m_roi->SetVisibility(m_boundary->GetFlag0x10());
|
m_roi->SetVisibility(m_boundary->GetFlag0x10());
|
||||||
|
|
||||||
switch (m_unk0x154) {
|
switch (m_state) {
|
||||||
case 0:
|
case e_none:
|
||||||
m_unk0x154 = 1;
|
m_state = e_closed;
|
||||||
m_actorState = c_initial;
|
m_actorState = c_initial;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case e_closed:
|
||||||
break;
|
break;
|
||||||
case 2:
|
case e_cycling:
|
||||||
float local8 = VTable0xcc(p_time);
|
float angle = CalculateAngle(p_time);
|
||||||
|
|
||||||
if (local8 > 0.0f) {
|
if (angle > 0.0f) {
|
||||||
MxMatrix local58(m_ltDoorLocal);
|
MxMatrix transform(m_ltDoorOriginalLocal);
|
||||||
Vector3 local10(local58[3]);
|
Vector3 position(transform[3]);
|
||||||
|
|
||||||
local10.Clear();
|
position.Clear();
|
||||||
local58.RotateY(-local8);
|
transform.RotateY(-angle);
|
||||||
local10 = m_ltDoorLocal[3];
|
position = m_ltDoorOriginalLocal[3];
|
||||||
m_ltDoor->SetLocal2World(local58);
|
m_ltDoor->SetLocal2World(transform);
|
||||||
m_ltDoor->WrappedUpdateWorldData();
|
m_ltDoor->WrappedUpdateWorldData();
|
||||||
|
|
||||||
local58 = m_rtDoorLocal;
|
transform = m_rtDoorOriginalLocal;
|
||||||
local10.Clear();
|
position.Clear();
|
||||||
local58.RotateY(local8);
|
transform.RotateY(angle);
|
||||||
local10 = m_rtDoorLocal[3];
|
position = m_rtDoorOriginalLocal[3];
|
||||||
m_rtDoor->SetLocal2World(local58);
|
m_rtDoor->SetLocal2World(transform);
|
||||||
m_rtDoor->WrappedUpdateWorldData();
|
m_rtDoor->WrappedUpdateWorldData();
|
||||||
|
|
||||||
m_unk0x1f4 = local8;
|
m_angle = angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_unk0x158 + g_unk0x100d8e84 < p_time) {
|
if (m_hitTime + g_totalTime < p_time) {
|
||||||
m_ltDoor->SetLocal2World(m_ltDoorLocal);
|
m_ltDoor->SetLocal2World(m_ltDoorOriginalLocal);
|
||||||
m_rtDoor->SetLocal2World(m_rtDoorLocal);
|
m_rtDoor->SetLocal2World(m_rtDoorOriginalLocal);
|
||||||
m_ltDoor->WrappedUpdateWorldData();
|
m_ltDoor->WrappedUpdateWorldData();
|
||||||
m_rtDoor->WrappedUpdateWorldData();
|
m_rtDoor->WrappedUpdateWorldData();
|
||||||
m_unk0x154 = 1;
|
m_state = e_closed;
|
||||||
m_actorState = c_initial;
|
m_actorState = c_initial;
|
||||||
m_unk0x1f4 = 0;
|
m_angle = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user