From 67fa5e7cca43277bab5613030921902f185fcf38 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 20 Jan 2024 15:49:56 -0500 Subject: [PATCH] Begin work on Police class (#469) * Begin work on Police class * Use JukeBox::e_policeStation value * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/police.h | 12 +++++ LEGO1/lego/legoomni/src/police/police.cpp | 57 +++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 9d6bc1c7..92e19b42 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -1,7 +1,11 @@ #ifndef POLICE_H #define POLICE_H +#include "decomp.h" #include "legoworld.h" +#include "mxdsaction.h" +#include "policestate.h" +#include "radio.h" // VTABLE: LEGO1 0x100d8a80 // SIZE 0x110 @@ -28,6 +32,14 @@ public: // SYNTHETIC: LEGO1 0x1005e300 // Police::`scalar deleting destructor' + + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + +private: + Radio m_radio; // 0xf8 + PoliceState* m_policeState; // 0x108 + undefined4 m_unk0x10c; // 0x10c }; #endif // POLICE_H diff --git a/LEGO1/lego/legoomni/src/police/police.cpp b/LEGO1/lego/legoomni/src/police/police.cpp index 67577ecc..89874e00 100644 --- a/LEGO1/lego/legoomni/src/police/police.cpp +++ b/LEGO1/lego/legoomni/src/police/police.cpp @@ -1,15 +1,56 @@ #include "police.h" -// STUB: LEGO1 0x1005e130 +#include "jukebox.h" +#include "legocontrolmanager.h" +#include "legogamestate.h" +#include "legoinputmanager.h" +#include "legoomni.h" +#include "mxnotificationmanager.h" + +DECOMP_SIZE_ASSERT(Police, 0x110) + +// FUNCTION: LEGO1 0x1005e130 Police::Police() { - // TODO + m_policeState = NULL; + m_unk0x10c = 0; + NotificationManager()->Register(this); } -// STUB: LEGO1 0x1005e320 +// FUNCTION: LEGO1 0x1005e320 Police::~Police() { - // TODO + if (InputManager()->GetWorld() == this) { + InputManager()->ClearWorld(); + } + + ControlManager()->Unregister(this); + InputManager()->UnRegister(this); + NotificationManager()->Unregister(this); +} + +// FUNCTION: LEGO1 0x1005e3e0 +MxResult Police::Create(MxDSAction& p_dsAction) +{ + MxResult ret = LegoWorld::Create(p_dsAction); + if (ret == SUCCESS) { + InputManager()->SetWorld(this); + ControlManager()->Register(this); + } + + SetIsWorldActive(FALSE); + InputManager()->Register(this); + + LegoGameState* gameState = GameState(); + PoliceState* policeState = (PoliceState*) gameState->GetState("PoliceState"); + if (!policeState) { + policeState = (PoliceState*) gameState->CreateState("PoliceState"); + } + + m_policeState = policeState; + GameState()->SetUnknown424(0x22); + GameState()->FUN_1003a720(0); + return ret; } // STUB: LEGO1 0x1005e480 @@ -19,3 +60,11 @@ MxLong Police::Notify(MxParam& p_param) return 0; } + +// FUNCTION: LEGO1 0x1005e530 +void Police::VTable0x50() +{ + LegoWorld::VTable0x50(); + PlayMusic(JukeBox::e_policeStation); + FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); +}