From 93ce1f7b7b590d5bb568b5991d76409de4cd0173 Mon Sep 17 00:00:00 2001 From: jonschz Date: Sat, 23 Nov 2024 14:31:08 +0100 Subject: [PATCH] Implement `Doors::VTable0xcc` --- LEGO1/lego/legoomni/include/doors.h | 2 +- LEGO1/lego/legoomni/src/actors/doors.cpp | 39 +++++++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/LEGO1/lego/legoomni/include/doors.h b/LEGO1/lego/legoomni/include/doors.h index 7fb2c392..8be10963 100644 --- a/LEGO1/lego/legoomni/include/doors.h +++ b/LEGO1/lego/legoomni/include/doors.h @@ -27,7 +27,7 @@ class Doors : public LegoPathActor { void ParseAction(char* p_extra) override; // vtable+0x20 void VTable0x70(float p_float) override; // vtable+0x70 MxResult VTable0x94(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 - virtual double VTable0xcc(float p_float); // vtable+0xcc + virtual MxFloat VTable0xcc(float p_float); // vtable+0xcc // SYNTHETIC: LEGO1 0x1000e580 // Doors::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/actors/doors.cpp b/LEGO1/lego/legoomni/src/actors/doors.cpp index f2eb68ee..4acd14f2 100644 --- a/LEGO1/lego/legoomni/src/actors/doors.cpp +++ b/LEGO1/lego/legoomni/src/actors/doors.cpp @@ -4,11 +4,24 @@ #include "mxmisc.h" #include "mxtimer.h" #include "roi/legoroi.h" +#include "tgl/tglvector.h" #include DECOMP_SIZE_ASSERT(Doors, 0x1f8) +// GLOBAL: LEGO1 0x100d8e7c +// GLOBAL: BETA10 0x101b954c +const MxFloat g_unk0x100d8e7c = 1000.0f; + +// GLOBAL: LEGO1 0x100d8e80 +// GLOBAL: BETA10 0x101b9550 +const MxFloat g_unk0x100d8e80 = 4000.0f; + +// GLOBAL: LEGO1 0x100d8e84 +// GLOBAL: BETA10 0x101b9554 +const MxFloat g_unk0x100d8e84 = 6000.0f; + // FUNCTION: LEGO1 0x10066100 // FUNCTION: BETA10 0x10026850 MxResult Doors::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) @@ -25,11 +38,29 @@ MxResult Doors::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) return m_unk0x1f4 < 0.001 ? SUCCESS : FAILURE; } -// STUB: LEGO1 0x10066190 +// FUNCTION: LEGO1 0x10066190 // FUNCTION: BETA10 0x1002696b -double Doors::VTable0xcc(float p_float) +MxFloat Doors::VTable0xcc(float p_float) { - return 0.0; + MxFloat fVar1; + + fVar1 = p_float - m_unk0x158; + + if (fVar1 <= 0.0f) { + return 0.0f; + } + + if (fVar1 <= g_unk0x100d8e7c) { + return fVar1 * 1.570796 / g_unk0x100d8e7c; + } + else if (fVar1 <= g_unk0x100d8e7c + g_unk0x100d8e80) { + return 1.570796012878418; // Pi / 2 + } + else if (fVar1 <= g_unk0x100d8e84) { + return (1.0 - ((fVar1 - g_unk0x100d8e80) - g_unk0x100d8e7c) / g_unk0x100d8e7c) * 1.570796; + } + + return 0.0f; } // FUNCTION: LEGO1 0x10066250 @@ -71,7 +102,7 @@ void Doors::VTable0x70(float p_float) m_unk0x1f4 = local8; } - if (m_unk0x158 + 6000.0f < p_float) { + if (m_unk0x158 + g_unk0x100d8e84 < p_float) { m_ltDoor->FUN_100a58f0(m_ltDoorLocal); m_rtDoor->FUN_100a58f0(m_rtDoorLocal); m_ltDoor->VTable0x14();