diff --git a/LEGO1/mxflcpresenter.cpp b/LEGO1/mxflcpresenter.cpp index db14bd55..08bd9e0f 100644 --- a/LEGO1/mxflcpresenter.cpp +++ b/LEGO1/mxflcpresenter.cpp @@ -11,7 +11,7 @@ DECOMP_SIZE_ASSERT(MxFlcPresenter, 0x68); // OFFSET: LEGO1 0x100b3310 MxFlcPresenter::MxFlcPresenter() { - this->m_unk64 = 0; + this->m_flicHeader = NULL; this->m_flags &= 0xfd; this->m_flags &= 0xfb; } @@ -19,20 +19,26 @@ MxFlcPresenter::MxFlcPresenter() // OFFSET: LEGO1 0x100b3420 MxFlcPresenter::~MxFlcPresenter() { - if (this->m_unk64) { - delete this->m_unk64; + if (this->m_flicHeader) { + delete this->m_flicHeader; } } -// OFFSET: LEGO1 0x100b34d0 -void MxFlcPresenter::vtable60() +// OFFSET: LEGO1 0x100b3490 +void MxFlcPresenter::LoadHeader(MxStreamChunk* p_chunk) { - if(m_bitmap) + m_flicHeader = (FLIC_HEADER*) new MxU8[p_chunk->GetLength()]; + memcpy(m_flicHeader, p_chunk->GetData(), p_chunk->GetLength()); +} + +// OFFSET: LEGO1 0x100b34d0 +void MxFlcPresenter::CreateBitmap() +{ + if (m_bitmap) delete m_bitmap; m_bitmap = new MxBitmap; - - m_bitmap->SetSize(m_unk64->width, m_unk64->height, NULL, FALSE); + m_bitmap->SetSize(m_flicHeader->width, m_flicHeader->height, NULL, FALSE); } // OFFSET: LEGO1 0x100b3620 diff --git a/LEGO1/mxflcpresenter.h b/LEGO1/mxflcpresenter.h index 3c1ad6bc..9ed72140 100644 --- a/LEGO1/mxflcpresenter.h +++ b/LEGO1/mxflcpresenter.h @@ -2,11 +2,10 @@ #define MXFLCPRESENTER_H #include "decomp.h" +#include "mxvideopresenter.h" #include -#include "mxvideopresenter.h" - // VTABLE 0x100dc2c0 // SIZE 0x68 class MxFlcPresenter : public MxVideoPresenter { @@ -27,10 +26,12 @@ class MxFlcPresenter : public MxVideoPresenter { return "MxFlcPresenter"; } - virtual void vtable60() override; // vtable+0x60 - virtual void VTable0x70() override; // vtable+0x70 + virtual void LoadHeader(MxStreamChunk* p_chunk) override; // vtable+0x5c + virtual void CreateBitmap() override; // vtable+0x60 + virtual void VTable0x70() override; // vtable+0x70 - FLIC_HEADER* m_unk64; // 0x64 - what we believe so far. Could be another custom structure like MxSmack. +protected: + FLIC_HEADER* m_flicHeader; }; #endif // MXFLCPRESENTER_H diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp index 90135eb9..f54cb1e5 100644 --- a/LEGO1/mxloopingflcpresenter.cpp +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -29,3 +29,21 @@ void MxLoopingFlcPresenter::Destroy(MxBool p_fromDestructor) { // TODO } + +// OFFSET: LEGO1 0x100b4470 +void MxLoopingFlcPresenter::NextFrame() +{ + MxStreamChunk* chunk = NextChunk(); + + if (chunk->GetFlags() & MxStreamChunk::Flag_Bit2) { + m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState; + m_currentTickleState = TickleState_Repeating; + } + else { + LoadFrame(chunk); + AppendChunk(chunk); + m_unk68 += m_flicHeader->speed; + } + + m_subscriber->FUN_100b8390(chunk); +} diff --git a/LEGO1/mxloopingflcpresenter.h b/LEGO1/mxloopingflcpresenter.h index 2107731b..fa3f31de 100644 --- a/LEGO1/mxloopingflcpresenter.h +++ b/LEGO1/mxloopingflcpresenter.h @@ -18,6 +18,8 @@ class MxLoopingFlcPresenter : public MxFlcPresenter { return "MxLoopingFlcPresenter"; } + virtual void NextFrame() override; // vtable+0x64 + private: void Init(); void Destroy(MxBool p_fromDestructor);