From 2b9d8f1fba2f55bd30f9a8a17385b5357c3ce380 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 26 Oct 2024 09:34:43 -0700 Subject: [PATCH] Implement/match Pizza::FUN_100382b0 and Pizza::StopActions (#1118) --- LEGO1/lego/legoomni/include/pizza.h | 47 +++++++-------- LEGO1/lego/legoomni/include/skateboard.h | 3 +- LEGO1/lego/legoomni/src/actors/pizza.cpp | 57 +++++++++++++++---- LEGO1/lego/legoomni/src/actors/skateboard.cpp | 2 +- LEGO1/lego/legoomni/src/worlds/isle.cpp | 4 +- 5 files changed, 74 insertions(+), 39 deletions(-) diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h index e8bd71c9..45cfe968 100644 --- a/LEGO1/lego/legoomni/include/pizza.h +++ b/LEGO1/lego/legoomni/include/pizza.h @@ -1,6 +1,7 @@ #ifndef PIZZA_H #define PIZZA_H +#include "actionsfwd.h" #include "decomp.h" #include "isleactor.h" #include "legostate.h" @@ -13,7 +14,7 @@ class SkateBoard; class PizzaMissionState : public LegoState { public: // SIZE 0x20 - struct Entry { + struct Mission { public: MxResult WriteToFile(LegoFile* p_file) { @@ -33,16 +34,16 @@ class PizzaMissionState : public LegoState { return SUCCESS; } - undefined2 m_unk0x00; // 0x00 - MxU8 m_id; // 0x02 - undefined m_unk0x03[3]; // 0x03 - MxS16 m_unk0x06; // 0x06 - undefined m_unk0x08[8]; // 0x08 - undefined4 m_unk0x10; // 0x10 - MxS16 m_unk0x14; // 0x14 - MxS16 m_unk0x16; // 0x16 - MxS16 m_score; // 0x18 - undefined m_unk0x1a[6]; // 0x1a + MxS16 m_numActions; // 0x00 + MxU8 m_id; // 0x02 + undefined m_unk0x03[3]; // 0x03 + MxS16 m_unk0x06; // 0x06 + undefined m_unk0x08[8]; // 0x08 + MxLong m_startTime; // 0x10 + MxS16 m_unk0x14; // 0x14 + MxS16 m_unk0x16; // 0x16 + MxS16 m_score; // 0x18 + IsleScript::Script* m_actions; // 0x1c }; PizzaMissionState(); @@ -67,11 +68,11 @@ class PizzaMissionState : public LegoState { // SYNTHETIC: LEGO1 0x10039350 // PizzaMissionState::`scalar deleting destructor' - Entry* GetState(MxU8 p_id); + Mission* GetState(MxU8 p_id); undefined4 m_unk0x08; // 0x08 undefined4 m_unk0x0c; // 0x0c - Entry m_state[5]; // 0x10 + Mission m_state[5]; // 0x10 undefined4 m_unk0xb0; // 0xb0 }; @@ -105,23 +106,23 @@ class Pizza : public IsleActor { void CreateState(); void FUN_10038220(MxU32 p_objectId); void FUN_100382b0(); - void FUN_10038380(); + void StopActions(); void FUN_10038fe0(MxU32 p_objectId, MxBool); - void SetSkateboard(SkateBoard* p_skateboard) { m_skateboard = p_skateboard; } + void SetSkateboard(SkateBoard* p_skateBoard) { m_skateBoard = p_skateBoard; } // SYNTHETIC: LEGO1 0x100380e0 // Pizza::`scalar deleting destructor' private: - PizzaMissionState* m_state; // 0x7c - PizzaMissionState::Entry* m_entry; // 0x80 - SkateBoard* m_skateboard; // 0x84 - Act1State* m_act1state; // 0x88 - undefined4 m_unk0x8c; // 0x8c - undefined4 m_unk0x90; // 0x90 - undefined4 m_unk0x94; // 0x94 - undefined m_unk0x98; // 0x98 + PizzaMissionState* m_state; // 0x7c + PizzaMissionState::Mission* m_mission; // 0x80 + SkateBoard* m_skateBoard; // 0x84 + Act1State* m_act1state; // 0x88 + undefined4 m_unk0x8c; // 0x8c + undefined4 m_unk0x90; // 0x90 + undefined4 m_unk0x94; // 0x94 + undefined m_unk0x98; // 0x98 }; #endif // PIZZA_H diff --git a/LEGO1/lego/legoomni/include/skateboard.h b/LEGO1/lego/legoomni/include/skateboard.h index a85ed26e..0bf691c1 100644 --- a/LEGO1/lego/legoomni/include/skateboard.h +++ b/LEGO1/lego/legoomni/include/skateboard.h @@ -35,13 +35,12 @@ class SkateBoard : public IslePathActor { void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; } void ActivateSceneActions(); + void EnableScenePresentation(MxBool p_enable); // SYNTHETIC: LEGO1 0x1000ff60 // SkateBoard::`scalar deleting destructor' private: - void EnableScenePresentation(MxBool p_enable); - MxBool m_unk0x160; // 0x160 Act1State* m_act1state; // 0x164 }; diff --git a/LEGO1/lego/legoomni/src/actors/pizza.cpp b/LEGO1/lego/legoomni/src/actors/pizza.cpp index 593d7f74..ac47ea53 100644 --- a/LEGO1/lego/legoomni/src/actors/pizza.cpp +++ b/LEGO1/lego/legoomni/src/actors/pizza.cpp @@ -4,14 +4,17 @@ #include "isle_actions.h" #include "legoanimationmanager.h" #include "legogamestate.h" +#include "legoutils.h" #include "legoworld.h" #include "misc.h" +#include "mxbackgroundaudiomanager.h" #include "mxmisc.h" #include "mxticklemanager.h" +#include "skateboard.h" DECOMP_SIZE_ASSERT(Pizza, 0x9c) DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb4) -DECOMP_SIZE_ASSERT(PizzaMissionState::Entry, 0x20) +DECOMP_SIZE_ASSERT(PizzaMissionState::Mission, 0x20) // Flags used in isle.cpp extern MxU32 g_isleFlags; @@ -20,12 +23,12 @@ extern MxU32 g_isleFlags; Pizza::Pizza() { m_state = NULL; - m_entry = NULL; - m_skateboard = NULL; + m_mission = NULL; + m_skateBoard = NULL; m_act1state = NULL; m_unk0x8c = -1; m_unk0x98 = 0; - m_unk0x90 = 0x80000000; + m_unk0x90 = INT_MIN; } // FUNCTION: LEGO1 0x10038100 @@ -41,13 +44,14 @@ MxResult Pizza::Create(MxDSAction& p_dsAction) if (result == SUCCESS) { CreateState(); - m_skateboard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor); + m_skateBoard = (SkateBoard*) m_world->Find(m_atomId, IsleScript::c_SkateBoard_Actor); } return result; } // FUNCTION: LEGO1 0x100381b0 +// FUNCTION: BETA10 0x100edaec void Pizza::CreateState() { m_state = (PizzaMissionState*) GameState()->GetState("PizzaMissionState"); @@ -62,13 +66,14 @@ void Pizza::CreateState() } // FUNCTION: LEGO1 0x10038220 +// FUNCTION: BETA10 0x100edb81 void Pizza::FUN_10038220(MxU32 p_objectId) { AnimationManager()->FUN_10064740(NULL); - m_entry = m_state->GetState(GameState()->GetActorId()); + m_mission = m_state->GetState(GameState()->GetActorId()); m_state->m_unk0x0c = 1; m_act1state->m_unk0x018 = 3; - m_entry->m_unk0x10 = 0x80000000; + m_mission->m_startTime = INT_MIN; g_isleFlags &= ~Isle::c_playMusic; AnimationManager()->EnableCamAnims(FALSE); AnimationManager()->FUN_1005f6d0(FALSE); @@ -76,14 +81,44 @@ void Pizza::FUN_10038220(MxU32 p_objectId) m_unk0x8c = -1; } -// STUB: LEGO1 0x100382b0 +// FUNCTION: LEGO1 0x100382b0 void Pizza::FUN_100382b0() { + if (m_state->m_unk0x0c != 8) { + if (m_unk0x8c != -1) { + InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL); + } + + m_act1state->m_unk0x018 = 0; + m_state->m_unk0x0c = 0; + UserActor()->SetState(0); + g_isleFlags |= Isle::c_playMusic; + AnimationManager()->EnableCamAnims(TRUE); + AnimationManager()->FUN_1005f6d0(TRUE); + m_mission->m_startTime = INT_MIN; + m_mission = NULL; + m_unk0x98 = 0; + m_unk0x8c = -1; + BackgroundAudioManager()->RaiseVolume(); + TickleManager()->UnregisterClient(this); + m_unk0x90 = INT_MIN; + m_skateBoard->EnableScenePresentation(FALSE); + m_skateBoard->SetUnknown0x160(FALSE); + } } -// STUB: LEGO1 0x10038380 -void Pizza::FUN_10038380() +// FUNCTION: LEGO1 0x10038380 +void Pizza::StopActions() { + InvokeAction(Extra::e_stop, *g_isleScript, IsleScript::c_pns050p1_RunAnim, NULL); + InvokeAction(Extra::e_stop, *g_isleScript, IsleScript::c_wns050p1_RunAnim, NULL); + + PizzaMissionState::Mission* mission = m_mission; + if (mission != NULL) { + for (MxS32 i = 0; i < mission->m_numActions; i++) { + InvokeAction(Extra::e_stop, *g_isleScript, mission->m_actions[i], NULL); + } + } } // STUB: LEGO1 0x100383f0 @@ -146,7 +181,7 @@ MxResult PizzaMissionState::Serialize(LegoFile* p_file) } // FUNCTION: LEGO1 0x10039510 -PizzaMissionState::Entry* PizzaMissionState::GetState(MxU8 p_id) +PizzaMissionState::Mission* PizzaMissionState::GetState(MxU8 p_id) { for (MxS16 i = 0; i < 5; i++) { if (m_state[i].m_id == p_id) { diff --git a/LEGO1/lego/legoomni/src/actors/skateboard.cpp b/LEGO1/lego/legoomni/src/actors/skateboard.cpp index b2d00f94..cc577c30 100644 --- a/LEGO1/lego/legoomni/src/actors/skateboard.cpp +++ b/LEGO1/lego/legoomni/src/actors/skateboard.cpp @@ -58,7 +58,7 @@ void SkateBoard::Exit() { if (m_act1state->m_unk0x018 == 3) { Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor); - pizza->FUN_10038380(); + pizza->StopActions(); pizza->FUN_100382b0(); m_unk0x160 = FALSE; } diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index 13ea3cbf..fd739d87 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -1190,7 +1190,7 @@ MxBool Isle::Escape() switch (m_act1state->m_unk0x018) { case 3: if (UserActor() != NULL) { - m_pizza->FUN_10038380(); + m_pizza->StopActions(); m_pizza->FUN_100382b0(); } break; @@ -1257,7 +1257,7 @@ void Isle::FUN_10033350() if (m_act1state->m_unk0x018 == 3) { if (UserActor() != NULL) { - m_pizza->FUN_10038380(); + m_pizza->StopActions(); m_pizza->FUN_100382b0(); } }