diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 9eb7e760..cb845914 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -118,6 +118,9 @@ public: MxLong Notify(MxParam& p_param) override; // vtable+0x04 + // FUNCTION: LEGO1 0x10030900 + MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c + // FUNCTION: LEGO1 0x10030910 // FUNCTION: BETA10 0x10035d70 const char* ClassName() const override // vtable+0x0c @@ -135,16 +138,10 @@ public: MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 void ReadyWorld() override; // vtable+0x50 void Add(MxCore* p_object) override; // vtable+0x58 - - // FUNCTION: LEGO1 0x10030900 - MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c - - // FUNCTION: LEGO1 0x10033170 - void VTable0x60() override {} // vtable+60 - - MxBool Escape() override; // vtable+0x64 - void Enable(MxBool p_enable) override; // vtable+0x68 - virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+0x6c + void VTable0x60() override; // vtable+0x60 + MxBool Escape() override; // vtable+0x64 + void Enable(MxBool p_enable) override; // vtable+0x68 + virtual void VTable0x6c(LegoPathActor* p_actor); // vtable+0x6c void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } MxBool HasHelicopter() { return m_helicopter != NULL; } diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 343cd598..98c41d08 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -198,6 +198,9 @@ protected: MxFloat m_unk0x150; // 0x150 }; +// FUNCTION: LEGO1 0x1002edd0 +// LegoPathActor::FUN_1002edd0 + // TEMPLATE: LEGO1 0x10018b70 // List::~List diff --git a/LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp b/LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp index 2d97b3ef..fa6f83ef 100644 --- a/LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legobuildingmanager.cpp @@ -680,7 +680,11 @@ void LegoBuildingManager::ScheduleAnimation(LegoEntity* p_entity, MxLong p_lengt entry->m_entity = p_entity; entry->m_roi = p_entity->GetROI(); - entry->m_time = Timer()->GetTime() + p_length + 1000; + + MxLong time = Timer()->GetTime(); + time += p_length; + entry->m_time = time + 1000; + entry->m_unk0x0c = entry->m_roi->GetWorldPosition()[1]; entry->m_muted = p_haveSound == FALSE; FUN_100307b0(p_entity, -2); diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index 6c367f19..69a624ee 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -491,29 +491,6 @@ MxU32 LegoPathActor::VTable0x6c( return 0; } -// FUNCTION: LEGO1 0x1002ebe0 -// FUNCTION: BETA10 0x100af35e -MxS32 LegoPathActor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) -{ - Mx3DPointFloat v2(p_v2); - v2 -= p_v1; - - float len = v2.LenSquared(); - - if (len <= 0.001) { - return 0; - } - - len = sqrt(len); - v2 /= len; - - float radius = m_roi->GetWorldBoundingSphere().Radius(); - list boundaries; - - return FUN_1002edd0(boundaries, m_boundary, p_v1, v2, len, radius, p_v3, 0); -} - -// FUNCTION: LEGO1 0x1002edd0 inline MxU32 LegoPathActor::FUN_1002edd0( list& p_boundaries, LegoPathBoundary* p_boundary, @@ -527,41 +504,65 @@ inline MxU32 LegoPathActor::FUN_1002edd0( { MxU32 result = VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3); - if (result == 0) { - p_boundaries.push_back(p_boundary); + if (result != 0) { + return result; + } - if (p_und >= 2) { - return 0; - } + p_boundaries.push_back(p_boundary); - LegoS32 numEdges = p_boundary->GetNumEdges(); - for (MxS32 i = 0; i < numEdges; i++) { - LegoUnknown100db7f4* edge = ((LegoUnknown100db7f4*) p_boundary->GetEdges()[i]); - LegoPathBoundary* boundary = (LegoPathBoundary*) edge->OtherFace(p_boundary); + if (p_und >= 2) { + return 0; + } - if (boundary != NULL) { - list::iterator it; + LegoS32 numEdges = p_boundary->GetNumEdges(); + for (MxS32 i = 0; i < numEdges; i++) { + LegoUnknown100db7f4* edge = p_boundary->GetEdges()[i]; + LegoPathBoundary* boundary = (LegoPathBoundary*) edge->OtherFace(p_boundary); - for (it = p_boundaries.begin(); it != p_boundaries.end(); it++) { - if ((*it) == boundary) { - break; - } + if (boundary != NULL) { + list::const_iterator it; + + for (it = p_boundaries.begin(); !(it == p_boundaries.end()); it++) { + if ((*it) == boundary) { + break; } + } - if (it == p_boundaries.end()) { - result = FUN_1002edd0(p_boundaries, boundary, p_v1, p_v2, p_f1, p_f2, p_v3, p_und + 1); + if (it == p_boundaries.end()) { + result = FUN_1002edd0(p_boundaries, boundary, p_v1, p_v2, p_f1, p_f2, p_v3, p_und + 1); - if (result != 0) { - return result; - } + if (result != 0) { + return result; } } } - - result = 0; } - return result; + return 0; +} + +// FUNCTION: LEGO1 0x1002ebe0 +// FUNCTION: BETA10 0x100af35e +MxS32 LegoPathActor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) +{ + assert(m_boundary && m_roi); + + Mx3DPointFloat v2(p_v2); + v2 -= p_v1; + + float len = v2.LenSquared(); + + if (len <= 0.001) { + return 0; + } + + len = sqrt((double) len); + v2 /= len; + + float radius = m_roi->GetWorldBoundingSphere().Radius(); + list boundaries; + + return FUN_1002edd0(boundaries, m_boundary, p_v1, v2, len, radius, p_v3, 0); } // FUNCTION: LEGO1 0x1002f020 diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 1d62e557..88fa83d7 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -1186,6 +1186,12 @@ void Isle::CreateState() } } +// FUNCTION: LEGO1 0x10033170 +void Isle::VTable0x60() +{ + // empty +} + // FUNCTION: LEGO1 0x10033180 MxBool Isle::Escape() {