From 2b75f526bb13b54ef564d5a9c266a1103a82409a Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Wed, 27 Dec 2023 14:47:53 -0500 Subject: [PATCH] LegoPalettePresenter implementation --- LEGO1/legopalettepresenter.cpp | 53 ++++++++++++++++++++++++++++++++++ LEGO1/legopalettepresenter.h | 6 ++-- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/LEGO1/legopalettepresenter.cpp b/LEGO1/legopalettepresenter.cpp index 5ee9279f..e90178d3 100644 --- a/LEGO1/legopalettepresenter.cpp +++ b/LEGO1/legopalettepresenter.cpp @@ -1,5 +1,10 @@ #include "legopalettepresenter.h" +#include "legoomni.h" +#include "legostream.h" +#include "legovideomanager.h" +#include "mxstreamchunk.h" + DECOMP_SIZE_ASSERT(LegoPalettePresenter, 0x68) // FUNCTION: LEGO1 0x10079e50 @@ -39,3 +44,51 @@ void LegoPalettePresenter::Destroy() { Destroy(FALSE); } + +// FUNCTION: LEGO1 0x1007a130 +MxResult LegoPalettePresenter::ParsePallete(MxStreamChunk* p_chunk) +{ + MxU8 buffer[40]; + RGBQUAD palleteData[256]; + MxResult result = FAILURE; + LegoMemoryStream stream((char*) p_chunk->GetData()); + if (stream.Read(buffer, 40) == SUCCESS) { + if (stream.Read(palleteData, sizeof(RGBQUAD) * 256) == SUCCESS) + { + m_palette = new MxPalette(palleteData); + if(m_palette) + { + result = SUCCESS; + } + } + } + + if (result != SUCCESS && m_palette) + { + delete m_palette; + m_palette = NULL; + } + + return result; +} + +// FUNCTION: LEGO1 0x1007a230 +void LegoPalettePresenter::ReadyTickle() +{ + MxStreamChunk* chunk = m_subscriber->FUN_100b8360(); + if (chunk) { + if (chunk->GetTime() <= m_action->GetElapsedTime()) { + ParseExtra(); + m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState; + m_currentTickleState = TickleState_Starting; + chunk = m_subscriber->FUN_100b8250(); + MxResult result = ParsePallete(chunk); + m_subscriber->FUN_100b8390(chunk); + + if (result == SUCCESS) { + VideoManager()->RealizePalette(m_palette); + } + EndAction(); + } + } +} diff --git a/LEGO1/legopalettepresenter.h b/LEGO1/legopalettepresenter.h index e29b5391..1f8b637b 100644 --- a/LEGO1/legopalettepresenter.h +++ b/LEGO1/legopalettepresenter.h @@ -25,13 +25,15 @@ class LegoPalettePresenter : public MxVideoPresenter { return !strcmp(p_name, ClassName()) || MxVideoPresenter::IsA(p_name); } - virtual void Destroy() override; // vtable+0x38 + MxResult ParsePallete(MxStreamChunk* p_chunk); + virtual void ReadyTickle() override; // vtable+0x18 + virtual void Destroy() override; // vtable+0x38 private: void Init(); void Destroy(MxBool p_fromDestructor); - MxPalette* m_palette; + MxPalette* m_palette; // 0x64 }; #endif // LEGOPALETTEPRESENTER_H