From 04d9524a905beac30aae47291bee29cff72cb310 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Fri, 15 Dec 2023 17:01:09 -0500 Subject: [PATCH] some gamestate functions (#333) * some gamestate functions * fix order * fix naming convention * Update legogamestate.cpp * fix * Add stub ScoreStruct --------- Co-authored-by: Christian Semmler --- LEGO1/legogamestate.cpp | 50 +++++++++++++++++++++++++++++++++++++++-- LEGO1/legogamestate.h | 20 ++++++++++++----- LEGO1/legoomni.cpp | 6 +++++ LEGO1/legoomni.h | 1 + 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp index 599b4c79..29f539ac 100644 --- a/LEGO1/legogamestate.cpp +++ b/LEGO1/legogamestate.cpp @@ -13,6 +13,12 @@ // There may be other members that come after. DECOMP_SIZE_ASSERT(LegoGameState, 0x430) +// GLOBAL: LEGO1 0x100f3e24 +const char* g_historyGSI = "History.gsi"; + +// GLOBAL: LEGO1 0x100f3e30 +const char* g_playersGSI = "Players.gsi"; + // GLOBAL: LEGO1 0x100f3e40 const char* g_fileExtensionGS = ".GS"; @@ -255,14 +261,54 @@ void LegoGameState::RegisterState(LegoState* p_state) m_stateArray[targetIndex] = p_state; } -// STUB: LEGO1 0x1003cdd0 -void LegoGameState::SerializeScoreHistory(MxS16) +// STUB: LEGO1 0x1003c870 +void LegoGameState::ScoreStruct::WriteScoreHistory() { // TODO } +// STUB: LEGO1 0x1003ccf0 +void LegoGameState::ScoreStruct::FUN_1003ccf0(LegoFileStream&) +{ + // TODO +} + +// FUNCTION: LEGO1 0x1003cdd0 +void LegoGameState::SerializeScoreHistory(MxS16 p_flags) +{ + LegoFileStream stream; + MxString savePath(m_savePath); + savePath += "\\"; + savePath += g_historyGSI; + + if (p_flags == LegoStream::WriteBit) { + m_unk0xa6.WriteScoreHistory(); + } + + if (stream.Open(savePath.GetData(), (LegoStream::OpenFlags) p_flags) == SUCCESS) { + m_unk0xa6.FUN_1003ccf0(stream); + } +} + // FUNCTION: LEGO1 0x1003cea0 void LegoGameState::SetSomeEnumState(undefined4 p_state) { m_unk0x10 = p_state; } + +// FUNCTION: LEGO1 0x1003ceb0 +void LegoGameState::FUN_1003ceb0() +{ + if (FindEntityByAtomIdOrEntityId(*g_isleScript, 0)) { + m_currentAct = 0; + } + else if (FindEntityByAtomIdOrEntityId(*g_act2mainScript, 0)) { + m_currentAct = 1; + } + else if (FindEntityByAtomIdOrEntityId(*g_act3Script, 0)) { + m_currentAct = 2; + } + else { + m_currentAct = -1; + } +} diff --git a/LEGO1/legogamestate.h b/LEGO1/legogamestate.h index 4951df0f..5643de52 100644 --- a/LEGO1/legogamestate.h +++ b/LEGO1/legogamestate.h @@ -4,10 +4,10 @@ #include "decomp.h" #include "legobackgroundcolor.h" #include "legofullscreenmovie.h" +#include "legostream.h" #include "mxtypes.h" class LegoState; -class LegoStream; class MxVariable; class MxString; @@ -24,7 +24,7 @@ class LegoGameState { __declspec(dllexport) MxResult Load(MxULong); __declspec(dllexport) MxResult Save(MxULong); __declspec(dllexport) void SerializePlayersInfo(MxS16); - __declspec(dllexport) void SerializeScoreHistory(MxS16); + __declspec(dllexport) void SerializeScoreHistory(MxS16 p_flags); __declspec(dllexport) void SetSavePath(char*); LegoState* GetState(COMPAT_CONST char* p_stateName); @@ -39,24 +39,34 @@ class LegoGameState { inline void SetUnknown424(undefined4 p_unk0x424) { m_unk0x424 = p_unk0x424; } void SetSomeEnumState(undefined4 p_state); + void FUN_1003ceb0(); + + struct ScoreStruct { + void WriteScoreHistory(); + void FUN_1003ccf0(LegoFileStream&); + + MxU16 m_unk0x00; + undefined m_unk0x02[0x2c][20]; + }; private: void RegisterState(LegoState* p_state); MxResult WriteEndOfVariables(LegoStream* p_stream); void SetROIHandlerFunction(); -private: char* m_savePath; // 0x0 MxS16 m_stateCount; // 0x4 LegoState** m_stateArray; // 0x8 MxU8 m_unk0xc; // 0xc MxU32 m_unk0x10; // 0x10 - undefined4 m_unk0x14; // 0x14 + undefined4 m_currentAct; // 0x14 LegoBackgroundColor* m_backgroundColor; // 0x18 LegoBackgroundColor* m_tempBackgroundColor; // 0x1c LegoFullScreenMovie* m_fullScreenMovie; // 0x20 MxU16 m_unk0x24; // 0x24 - undefined m_unk0x28[1020]; // 0x28 + undefined m_unk0x28[128]; // 0x28 + ScoreStruct m_unk0xa6; // 0xa6 + undefined m_unk0x41a[10]; // 0x41a - might be part of the structure at 0xa6 undefined4 m_unk0x424; // 0x424 undefined4 m_unk0x428; // 0x428 undefined4 m_unk0x42c; // 0x42c diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 88f6bb26..d195957d 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -194,6 +194,12 @@ GifManager* GetGifManager() return LegoOmni::GetInstance()->GetGifManager(); } +// FUNCTION: LEGO1 0x100158c0 +LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid) +{ + return LegoOmni::GetInstance()->FindByEntityIdOrAtomId(p_atom, p_entityid); +} + // FUNCTION: LEGO1 0x100158e0 MxDSAction& GetCurrentAction() { diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index ba6e6051..f8e61946 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -158,6 +158,7 @@ LegoPlantManager* PlantManager(); MxBool KeyValueStringParse(char*, const char*, const char*); LegoWorld* GetCurrentWorld(); GifManager* GetGifManager(); +LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid); MxDSAction& GetCurrentAction(); void RegisterScripts();