From 962f98dca8b258bace371488c431f00f89799832 Mon Sep 17 00:00:00 2001 From: disinvite Date: Wed, 11 Dec 2024 15:07:02 -0500 Subject: [PATCH] Act3Cop::VTable0x94 and related --- LEGO1/lego/legoomni/include/act3.h | 7 ++++ LEGO1/lego/legoomni/include/act3cop.h | 6 ++- LEGO1/lego/legoomni/src/actors/act3cop.cpp | 48 ++++++++++++++++++++-- LEGO1/lego/legoomni/src/worlds/act3.cpp | 41 ++++++++++++++++++ 4 files changed, 98 insertions(+), 4 deletions(-) diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index a8bfb77e..7b94194e 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -5,6 +5,7 @@ #include "legogamestate.h" #include "legostate.h" #include "legoworld.h" +#include "mxgeometry/mxmatrix.h" class Act3Brickster; class Act3Cop; @@ -112,13 +113,19 @@ class Act3 : public LegoWorld { void SetHelicopter(Helicopter* p_copter) { m_copter = p_copter; } void SetDestLocation(LegoGameState::Area p_destLocation) { m_destLocation = p_destLocation; } + Act3Brickster* GetBrickster() { return m_brickster; } + // SYNTHETIC: LEGO1 0x10072630 // Act3::`scalar deleting destructor' + void EatDonut(MxS32 p_index); + void RemoveDonut(Act3Ammo& p_p); MxResult ShootPizza(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up); MxResult ShootDonut(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up); void FUN_10073400(); void FUN_10073430(); + void GoodEnding(const Matrix4& p_matrix); + static void DebugPrintf(const char* p_format, ...); protected: MxLong HandleTransitionEnd(); diff --git a/LEGO1/lego/legoomni/include/act3cop.h b/LEGO1/lego/legoomni/include/act3cop.h index 57c1459a..a7ef4e5a 100644 --- a/LEGO1/lego/legoomni/include/act3cop.h +++ b/LEGO1/lego/legoomni/include/act3cop.h @@ -1,6 +1,7 @@ #ifndef ACT3COP_H #define ACT3COP_H +#include "act3.h" #include "act3actors.h" // VTABLE: LEGO1 0x100d7750 LegoPathActor @@ -19,12 +20,15 @@ class Act3Cop : public Act3Actor { void SetUnknown0x20(MxFloat p_unk0x20) { m_unk0x20 = p_unk0x20; } + void FUN_10040360(); + // SYNTHETIC: LEGO1 0x10043120 // Act3Cop::`scalar deleting destructor' private: MxFloat m_unk0x20; // 0x20 - undefined4 m_unk0x24[3]; // 0x24 + Act3* m_world; // 0x24 + undefined4 m_unk0x24[2]; // 0x28 }; #endif // ACT3COP_H diff --git a/LEGO1/lego/legoomni/src/actors/act3cop.cpp b/LEGO1/lego/legoomni/src/actors/act3cop.cpp index 54094516..f9c0e541 100644 --- a/LEGO1/lego/legoomni/src/actors/act3cop.cpp +++ b/LEGO1/lego/legoomni/src/actors/act3cop.cpp @@ -1,5 +1,13 @@ #include "act3cop.h" +#include "act3brickster.h" +#include "legocachesoundmanager.h" +#include "legosoundmanager.h" +#include "misc.h" +#include "roi/legoroi.h" + +#include + DECOMP_SIZE_ASSERT(Act3Cop, 0x188) // STUB: LEGO1 0x1003fe30 @@ -8,10 +16,37 @@ Act3Cop::Act3Cop() // TODO } -// STUB: LEGO1 0x1003ff70 -MxResult Act3Cop::VTable0x94(LegoPathActor*, MxBool) +// FUNCTION: LEGO1 0x1003ff70 +// FUNCTION: BETA10 0x10018526 +MxResult Act3Cop::VTable0x94(LegoPathActor* p_actor, MxBool p_bool) { - // TODO + LegoROI* roi = p_actor->GetROI(); + if (p_bool && !strncmp(roi->GetName(), "dammo", 5)) { + MxS32 count = -1; + if (sscanf(roi->GetName(), "dammo%d", &count) != 1) { + assert(0); + } + + assert(m_world); + m_world->EatDonut(count); + m_unk0x20 = m_lastTime + 2000; + SetWorldSpeed(6.0); + + assert(SoundManager()->GetCacheSoundManager()); + SoundManager()->GetCacheSoundManager()->Play("eatdn", NULL, FALSE); + FUN_10040360(); + } + else { + if (m_world->GetBrickster()->GetROI() != roi) { + if (p_bool) { + return Act3Actor::VTable0x94(p_actor, p_bool); + } + } + else { + m_world->GoodEnding(roi->GetLocal2World()); + } + } + return SUCCESS; } @@ -27,6 +62,13 @@ void Act3Cop::VTable0x70(float p_time) // TODO } +// STUB: LEGO1 0x10040360 +// STUB: BETA10 0x10018c6a +void Act3Cop::FUN_10040360() +{ + // TODO +} + // STUB: LEGO1 0x10040d20 MxResult Act3Cop::VTable0x9c() { diff --git a/LEGO1/lego/legoomni/src/worlds/act3.cpp b/LEGO1/lego/legoomni/src/worlds/act3.cpp index 38e5098a..6f58822a 100644 --- a/LEGO1/lego/legoomni/src/worlds/act3.cpp +++ b/LEGO1/lego/legoomni/src/worlds/act3.cpp @@ -182,6 +182,33 @@ Act3::~Act3() TickleManager()->UnregisterClient(this); } +// FUNCTION: LEGO1 0x100727a0 +// FUNCTION: BETA10 0x1001570d +void Act3::EatDonut(MxS32 p_index) +{ + assert(p_index < MAX_DONUTS); + RemoveDonut(m_donuts[p_index]); +} + +// FUNCTION: LEGO1 0x100727d0 +// FUNCTION: BETA10 0x10015828 +void Act3::RemoveDonut(Act3Ammo& p_p) +{ +#ifdef _DEBUG + MxS32 i; + for (i = 0; i < MAX_DONUTS; i++) { + if (&m_donuts[i] == &p_p) { + break; + } + } + + assert(i != MAX_DONUTS); +#endif + + assert(p_p.IsValid()); + p_p.Remove(); +} + // FUNCTION: LEGO1 0x100727e0 // FUNCTION: BETA10 0x100158e2 MxResult Act3::ShootPizza(LegoPathController* p_controller, Vector3& p_location, Vector3& p_direction, Vector3& p_up) @@ -525,6 +552,20 @@ void Act3::FUN_10073430() TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE); } +// STUB: LEGO1 0x10073460 +// STUB: BETA10 0x10016bc6 +void Act3::GoodEnding(const Matrix4& p_matrix) +{ + // TODO + DebugPrintf("In Good Ending..."); +} + +// FUNCTION: LEGO1 0x10073500 +void Act3::DebugPrintf(const char* p_format, ...) +{ + // empty +} + // FUNCTION: LEGO1 0x10073a90 void Act3::Enable(MxBool p_enable) {