From 97fb6e4f156468e1b6133921c08a702dacbd86c7 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Dec 2024 11:57:59 -0700 Subject: [PATCH] Add `Act3Ammo`, match `Act3::Act3` (#1196) * Implement `Act3Ammo`, match `Act3::Act3` * Move * Fix match --- CMakeLists.txt | 1 + LEGO1/lego/legoomni/include/act3.h | 55 +++++++++++++++++-- LEGO1/lego/legoomni/include/act3ammo.h | 28 ++++++++++ .../lego/legoomni/include/legonavcontroller.h | 12 ++++ LEGO1/lego/legoomni/src/actors/act3ammo.cpp | 44 +++++++++++++++ LEGO1/lego/legoomni/src/actors/helicopter.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/act3.cpp | 26 ++++++++- 7 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 LEGO1/lego/legoomni/include/act3ammo.h create mode 100644 LEGO1/lego/legoomni/src/actors/act3ammo.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4079086b..48d04240 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,6 +294,7 @@ function(add_lego_libraries NAME) LEGO1/lego/legoomni/src/actors/act2actor.cpp LEGO1/lego/legoomni/src/actors/act2genactor.cpp LEGO1/lego/legoomni/src/actors/act3actors.cpp + LEGO1/lego/legoomni/src/actors/act3ammo.cpp LEGO1/lego/legoomni/src/actors/act3brickster.cpp LEGO1/lego/legoomni/src/actors/act3cop.cpp LEGO1/lego/legoomni/src/actors/act3shark.cpp diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 9e5a6d74..764dcdaf 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -1,10 +1,31 @@ #ifndef ACT3_H #define ACT3_H +#include "act3ammo.h" #include "legogamestate.h" #include "legostate.h" #include "legoworld.h" +class Helicopter; + +// SIZE 0x0c +struct Act3ListElement { + undefined4 m_unk0x00[3]; // 0x00 + + int operator==(Act3ListElement) const { return 0; } + int operator<(Act3ListElement) const { return 0; } +}; + +// SIZE 0x10 +class Act3List { +public: + Act3List() { m_unk0x04 = 0; } + +private: + list m_unk0x00; // 0x00 + undefined4 m_unk0x04; // 0x0c +}; + // VTABLE: LEGO1 0x100d4fc8 // SIZE 0x0c class Act3State : public LegoState { @@ -42,8 +63,7 @@ class Act3State : public LegoState { class Act3 : public LegoWorld { public: Act3(); - - ~Act3() override; // vtable+00 + ~Act3() override; MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxResult Tickle() override; // vtable+0x08 @@ -69,7 +89,7 @@ class Act3 : public LegoWorld { MxBool Escape() override; // vtable+0x64 void Enable(MxBool p_enable) override; // vtable+0x68 - void SetUnknown420c(MxEntity* p_entity) { m_unk0x420c = p_entity; } + void SetHelicopter(Helicopter* p_helicopter) { m_helicopter = p_helicopter; } void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } // SYNTHETIC: LEGO1 0x10072630 @@ -81,10 +101,33 @@ class Act3 : public LegoWorld { void FUN_10073430(); protected: - undefined m_unk0xf8[0x4114]; // 0xf8 - MxEntity* m_unk0x420c; // 0x420c - undefined m_unk0x4210[0x60]; // 0x4210 + undefined4 m_unk0xf8; // 0xf8 + Act3Ammo m_unk0xfc[20]; // 0xfc + Act3Ammo m_unk0x217c[20]; // 0x217c + undefined m_unk0x41fc; // 0x41fc + undefined4 m_unk0x4200; // 0x4200 + undefined4 m_unk0x4204; // 0x4204 + undefined4 m_unk0x4208; // 0x4208 + Helicopter* m_helicopter; // 0x420c + undefined4 m_unk0x4210; // 0x4210 + MxFloat m_unk0x4214; // 0x4214 + undefined4 m_unk0x4218; // 0x4218 + undefined m_unk0x421c; // 0x421c + undefined m_unk0x421d; // 0x421d + undefined m_unk0x421e; // 0x421e + Act3List m_unk0x4220; // 0x4220 + undefined4 m_unk0x4230[15]; // 0x4230 + undefined4 m_unk0x426c; // 0x426c LegoGameState::Area m_destLocation; // 0x4270 }; +// TEMPLATE: LEGO1 0x10072440 +// list >::~list > + +// TEMPLATE: LEGO1 0x100724b0 +// List::~List + +// FUNCTION: LEGO1 0x10072650 +// Act3List::~Act3List + #endif // ACT3_H diff --git a/LEGO1/lego/legoomni/include/act3ammo.h b/LEGO1/lego/legoomni/include/act3ammo.h new file mode 100644 index 00000000..3a3db5f4 --- /dev/null +++ b/LEGO1/lego/legoomni/include/act3ammo.h @@ -0,0 +1,28 @@ +#ifndef ACT3AMMO_H +#define ACT3AMMO_H + +#include "legopathactor.h" +#include "mxgeometry/mxgeometry3d.h" + +// VTABLE: LEGO1 0x100d8460 +// SIZE 0x1a0 +class Act3Ammo : public LegoPathActor { +public: + Act3Ammo(); + ~Act3Ammo() override; + + void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c + void VTable0x70(float p_time) override; // vtable+0x70 + + // SYNTHETIC: LEGO1 0x10053880 + // Act3Ammo::`scalar deleting destructor' + +private: + undefined2 m_unk0x154; // 0x154 + undefined4 m_unk0x158; // 0x158 + undefined4 m_unk0x15c; // 0x15c + Mx3DPointFloat m_unk0x160[3]; // 0x160 + undefined4 m_unk0x19c; // 0x19c +}; + +#endif // ACT3AMMO_H diff --git a/LEGO1/lego/legoomni/include/legonavcontroller.h b/LEGO1/lego/legoomni/include/legonavcontroller.h index c99ab3fe..7bd64127 100644 --- a/LEGO1/lego/legoomni/include/legonavcontroller.h +++ b/LEGO1/lego/legoomni/include/legonavcontroller.h @@ -91,11 +91,23 @@ class LegoNavController : public MxCore { MxFloat GetLinearVel() { return m_linearVel; } MxFloat GetRotationalVel() { return m_rotationalVel; } MxFloat GetMaxLinearVel() { return m_maxLinearVel; } + MxFloat GetMaxLinearAccel() { return m_maxLinearAccel; } + MxFloat GetMaxLinearDeccel() { return m_maxLinearDeccel; } void ResetMaxLinearVel(MxFloat p_maxLinearVel) { m_maxLinearVel = p_maxLinearVel; m_trackDefault = 0; } + void ResetMaxLinearAccel(MxFloat p_maxLinearAccel) + { + m_maxLinearAccel = p_maxLinearAccel; + m_trackDefault = 0; + } + void ResetMaxLinearDeccel(MxFloat p_maxLinearDeccel) + { + m_maxLinearDeccel = p_maxLinearDeccel; + m_trackDefault = 0; + } // FUNCTION: BETA10 0x100c9a10 int GetDefaultDeadZone() { return g_defdeadZone; } diff --git a/LEGO1/lego/legoomni/src/actors/act3ammo.cpp b/LEGO1/lego/legoomni/src/actors/act3ammo.cpp new file mode 100644 index 00000000..a3700e03 --- /dev/null +++ b/LEGO1/lego/legoomni/src/actors/act3ammo.cpp @@ -0,0 +1,44 @@ +#include "act3ammo.h" + +#include "legocharactermanager.h" +#include "misc.h" +#include "roi/legoroi.h" + +#include + +DECOMP_SIZE_ASSERT(Act3Ammo, 0x1a0) + +// FUNCTION: LEGO1 0x100537f0 +// FUNCTION: BETA10 0x1001d648 +Act3Ammo::Act3Ammo() +{ + m_unk0x154 = 0; + m_unk0x15c = 0; +} + +// FUNCTION: LEGO1 0x100538a0 +// FUNCTION: BETA10 0x1001d6e7 +Act3Ammo::~Act3Ammo() +{ + Destroy(TRUE); +} + +// FUNCTION: LEGO1 0x10053900 +// FUNCTION: BETA10 0x1001d759 +void Act3Ammo::Destroy(MxBool p_fromDestructor) +{ + if (!p_fromDestructor) { + assert(0); + } + else if (m_roi != NULL) { + CharacterManager()->ReleaseActor(m_roi->GetName()); + m_roi = NULL; + } +} + +// STUB: LEGO1 0x10054050 +// STUB: BETA10 0x1001e362 +void Act3Ammo::VTable0x70(float p_time) +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp index 1b9c0a76..9c169087 100644 --- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp @@ -42,7 +42,7 @@ MxResult Helicopter::Create(MxDSAction& p_dsAction) m_world = CurrentWorld(); if (m_world->IsA("Act3")) { - ((Act3*) m_world)->SetUnknown420c(this); + ((Act3*) m_world)->SetHelicopter(this); } if (m_world != NULL) { diff --git a/LEGO1/lego/legoomni/src/worlds/act3.cpp b/LEGO1/lego/legoomni/src/worlds/act3.cpp index c8ec77c3..48c5c232 100644 --- a/LEGO1/lego/legoomni/src/worlds/act3.cpp +++ b/LEGO1/lego/legoomni/src/worlds/act3.cpp @@ -1,12 +1,34 @@ #include "act3.h" +#include "legonavcontroller.h" +#include "misc.h" +#include "mxmisc.h" +#include "mxnotificationmanager.h" + DECOMP_SIZE_ASSERT(Act3, 0x4274) DECOMP_SIZE_ASSERT(Act3State, 0x0c) +DECOMP_SIZE_ASSERT(Act3ListElement, 0x0c) +DECOMP_SIZE_ASSERT(Act3List, 0x10) -// STUB: LEGO1 0x10072270 +// FUNCTION: LEGO1 0x10072270 +// FUNCTION: BETA10 0x10015470 Act3::Act3() { - // TODO + m_unk0xf8 = 0; + m_unk0x41fc = 0; + m_unk0x4200 = 0; + m_unk0x4204 = 0; + m_unk0x4208 = 0; + m_helicopter = NULL; + m_unk0x4210 = 0; + m_unk0x4214 = -1; + m_unk0x421e = 0; + + memset(m_unk0x4230, 0, sizeof(m_unk0x4230)); + + NavController()->ResetMaxLinearAccel(NavController()->GetMaxLinearAccel() * 30.0f); + NavController()->ResetMaxLinearDeccel(NavController()->GetMaxLinearDeccel() * 30.0f); + NotificationManager()->Register(this); } // FUNCTION: LEGO1 0x10072500