diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 3172ea9d..9875b1fe 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -113,13 +113,19 @@ class Act3 : public LegoWorld { void SetShark(Act3Shark* p_shark) { m_shark = p_shark; } 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..843439d3 100644 --- a/LEGO1/lego/legoomni/include/act3cop.h +++ b/LEGO1/lego/legoomni/include/act3cop.h @@ -3,6 +3,8 @@ #include "act3actors.h" +class LegoWorld; + // VTABLE: LEGO1 0x100d7750 LegoPathActor // VTABLE: LEGO1 0x100d7820 LegoAnimActor // SIZE 0x188 @@ -19,12 +21,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 + LegoWorld* 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..4bbf5bda 100644 --- a/LEGO1/lego/legoomni/src/actors/act3cop.cpp +++ b/LEGO1/lego/legoomni/src/actors/act3cop.cpp @@ -1,5 +1,14 @@ #include "act3cop.h" +#include "act3.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 +17,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); + ((Act3*) 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 (((Act3*) m_world)->GetBrickster()->GetROI() != roi) { + if (p_bool) { + return Act3Actor::VTable0x94(p_actor, p_bool); + } + } + else { + ((Act3*) m_world)->GoodEnding(roi->GetLocal2World()); + } + } + return SUCCESS; } @@ -27,6 +63,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) {