From dfad3238804b625a77a0e3cff0b1a0ec7c7e3833 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Wed, 27 Dec 2023 15:44:51 -0500 Subject: [PATCH] Finish LegoPalettePresenter (#377) * LegoPalettePresenter implementation * Update legopalettepresenter.cpp * Update legopalettepresenter.h --------- Co-authored-by: Christian Semmler --- LEGO1/legopalettepresenter.cpp | 50 ++++++++++++++++++++++++++++++++++ LEGO1/legopalettepresenter.h | 7 +++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/LEGO1/legopalettepresenter.cpp b/LEGO1/legopalettepresenter.cpp index 5ee9279f..f18a22c3 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,48 @@ 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..c350159b 100644 --- a/LEGO1/legopalettepresenter.h +++ b/LEGO1/legopalettepresenter.h @@ -25,13 +25,16 @@ class LegoPalettePresenter : public MxVideoPresenter { return !strcmp(p_name, ClassName()) || MxVideoPresenter::IsA(p_name); } - virtual void Destroy() override; // vtable+0x38 + virtual void ReadyTickle() override; // vtable+0x18 + virtual void Destroy() override; // vtable+0x38 + + MxResult ParsePallete(MxStreamChunk* p_chunk); private: void Init(); void Destroy(MxBool p_fromDestructor); - MxPalette* m_palette; + MxPalette* m_palette; // 0x64 }; #endif // LEGOPALETTEPRESENTER_H