diff --git a/LEGO1/lego/legoomni/include/doors.h b/LEGO1/lego/legoomni/include/doors.h index 5aad2dba..6f65de7f 100644 --- a/LEGO1/lego/legoomni/include/doors.h +++ b/LEGO1/lego/legoomni/include/doors.h @@ -10,7 +10,7 @@ class LegoROI; // SIZE 0x1f8 class Doors : public LegoPathActor { 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: BETA10 0x100a7f20 @@ -29,19 +29,25 @@ class Doors : public LegoPathActor { void ParseAction(char* p_extra) override; // vtable+0x20 void Animate(float p_time) override; // vtable+0x70 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 // Doors::`scalar deleting destructor' private: - undefined4 m_unk0x154; // 0x154 - MxFloat m_unk0x158; // 0x158 - LegoROI* m_ltDoor; // 0x15c - LegoROI* m_rtDoor; // 0x160 - MxMatrix m_ltDoorLocal; // 0x164 - MxMatrix m_rtDoorLocal; // 0x1ac - MxFloat m_unk0x1f4; // 0x1f4 + enum { + e_none = 0, + e_closed = 1, + e_cycling = 2, + }; + + 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 diff --git a/LEGO1/lego/legoomni/src/actors/doors.cpp b/LEGO1/lego/legoomni/src/actors/doors.cpp index 8fff7290..2b8da804 100644 --- a/LEGO1/lego/legoomni/src/actors/doors.cpp +++ b/LEGO1/lego/legoomni/src/actors/doors.cpp @@ -12,15 +12,15 @@ DECOMP_SIZE_ASSERT(Doors, 0x1f8) // GLOBAL: LEGO1 0x100d8e7c // GLOBAL: BETA10 0x101b954c -MxFloat g_unk0x100d8e7c = 1000.0f; +MxFloat g_timeMoving = 1000.0f; // GLOBAL: LEGO1 0x100d8e80 // GLOBAL: BETA10 0x101b9550 -MxFloat g_unk0x100d8e80 = 4000.0f; +MxFloat g_timeOpened = 4000.0f; // GLOBAL: LEGO1 0x100d8e84 // GLOBAL: BETA10 0x101b9554 -MxFloat g_unk0x100d8e84 = 6000.0f; +MxFloat g_totalTime = 6000.0f; // = g_timeMoving + g_totalTime + g_timeMoving // FUNCTION: LEGO1 0x10066100 // FUNCTION: BETA10 0x10026850 @@ -28,36 +28,36 @@ MxResult Doors::HitActor(LegoPathActor* p_actor, MxBool p_bool) { assert(m_ltDoor && m_rtDoor); - if (m_unk0x154 == 1) { - m_unk0x154 = 2; - m_unk0x158 = Timer()->GetTime(); - m_ltDoorLocal = m_ltDoor->GetLocal2World(); - m_rtDoorLocal = m_rtDoor->GetLocal2World(); + if (m_state == e_closed) { + m_state = e_cycling; + m_hitTime = Timer()->GetTime(); + m_ltDoorOriginalLocal = m_ltDoor->GetLocal2World(); + m_rtDoorOriginalLocal = m_rtDoor->GetLocal2World(); } - return m_unk0x1f4 < 0.001 ? SUCCESS : FAILURE; + return m_angle < 0.001 ? SUCCESS : FAILURE; } // FUNCTION: LEGO1 0x10066190 // 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; } - if (fVar1 <= g_unk0x100d8e7c) { - return fVar1 * 1.570796 / g_unk0x100d8e7c; + if (timeSinceHit <= g_timeMoving) { + 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 } - else if (fVar1 <= g_unk0x100d8e84) { - return (1.0 - ((fVar1 - g_unk0x100d8e80) - g_unk0x100d8e7c) / g_unk0x100d8e7c) * 1.570796; + else if (timeSinceHit <= g_totalTime) { + return (1.0 - ((timeSinceHit - g_timeOpened) - g_timeMoving) / g_timeMoving) * 1.570796; } return 0.0f; @@ -72,44 +72,44 @@ void Doors::Animate(float p_time) // TODO: Match m_roi->SetVisibility(m_boundary->GetFlag0x10()); - switch (m_unk0x154) { - case 0: - m_unk0x154 = 1; + switch (m_state) { + case e_none: + m_state = e_closed; m_actorState = c_initial; break; - case 1: + case e_closed: break; - case 2: - float local8 = VTable0xcc(p_time); + case e_cycling: + float angle = CalculateAngle(p_time); - if (local8 > 0.0f) { - MxMatrix local58(m_ltDoorLocal); - Vector3 local10(local58[3]); + if (angle > 0.0f) { + MxMatrix transform(m_ltDoorOriginalLocal); + Vector3 position(transform[3]); - local10.Clear(); - local58.RotateY(-local8); - local10 = m_ltDoorLocal[3]; - m_ltDoor->SetLocal2World(local58); + position.Clear(); + transform.RotateY(-angle); + position = m_ltDoorOriginalLocal[3]; + m_ltDoor->SetLocal2World(transform); m_ltDoor->WrappedUpdateWorldData(); - local58 = m_rtDoorLocal; - local10.Clear(); - local58.RotateY(local8); - local10 = m_rtDoorLocal[3]; - m_rtDoor->SetLocal2World(local58); + transform = m_rtDoorOriginalLocal; + position.Clear(); + transform.RotateY(angle); + position = m_rtDoorOriginalLocal[3]; + m_rtDoor->SetLocal2World(transform); m_rtDoor->WrappedUpdateWorldData(); - m_unk0x1f4 = local8; + m_angle = angle; } - if (m_unk0x158 + g_unk0x100d8e84 < p_time) { - m_ltDoor->SetLocal2World(m_ltDoorLocal); - m_rtDoor->SetLocal2World(m_rtDoorLocal); + if (m_hitTime + g_totalTime < p_time) { + m_ltDoor->SetLocal2World(m_ltDoorOriginalLocal); + m_rtDoor->SetLocal2World(m_rtDoorOriginalLocal); m_ltDoor->WrappedUpdateWorldData(); m_rtDoor->WrappedUpdateWorldData(); - m_unk0x154 = 1; + m_state = e_closed; m_actorState = c_initial; - m_unk0x1f4 = 0; + m_angle = 0; } } }