diff --git a/LEGO1/define.cpp b/LEGO1/define.cpp index 60899a8f..8eb1f466 100644 --- a/LEGO1/define.cpp +++ b/LEGO1/define.cpp @@ -8,3 +8,6 @@ const char* g_strWORLD = "WORLD"; // 0x10102040 const char* g_strACTION = "ACTION"; + +// 0x101020cc +const char* g_strVISIBILITY = "VISIBILITY"; diff --git a/LEGO1/define.h b/LEGO1/define.h index ba411bcb..fe3f2e9d 100644 --- a/LEGO1/define.h +++ b/LEGO1/define.h @@ -4,5 +4,6 @@ extern const char* g_parseExtraTokens; extern const char* g_strWORLD; extern const char* g_strACTION; +extern const char* g_strVISIBILITY; #endif // DEFINE_H diff --git a/LEGO1/mxstillpresenter.cpp b/LEGO1/mxstillpresenter.cpp index 351971f0..8f7124f0 100644 --- a/LEGO1/mxstillpresenter.cpp +++ b/LEGO1/mxstillpresenter.cpp @@ -1,5 +1,43 @@ #include "mxstillpresenter.h" #include "decomp.h" +#include "define.h" +#include "legoomni.h" DECOMP_SIZE_ASSERT(MxStillPresenter, 0x6c); + +// 0x10101eb0 +const char* g_strBMP_ISMAP = "BMP_ISMAP"; + +// OFFSET: LEGO1 0x100ba1e0 +void MxStillPresenter::ParseExtra() +{ + MxPresenter::ParseExtra(); + + if (m_action->GetFlags() & MxDSAction::Flag_Bit5) + m_flags |= 0x8; + + MxU32 len = m_action->GetExtraLength(); + + if (len == 0) + return; + + len &= MAXWORD; + + char buf[512]; + memcpy(buf, m_action->GetExtraData(), len); + buf[len] = '\0'; + + char output[512]; + if (KeyValueStringParse(output, g_strVISIBILITY, buf)) { + if (strcmpi(output, "FALSE") == 0) { + Enable(FALSE); + } + } + + if (KeyValueStringParse(output, g_strBMP_ISMAP, buf)) { + m_flags |= 0x10; + m_flags &= ~0x2; + m_flags &= ~0x4; + } +} diff --git a/LEGO1/mxstillpresenter.h b/LEGO1/mxstillpresenter.h index 0f04a48e..f812b545 100644 --- a/LEGO1/mxstillpresenter.h +++ b/LEGO1/mxstillpresenter.h @@ -8,6 +8,8 @@ // SIZE 0x6c class MxStillPresenter : public MxVideoPresenter { public: + virtual void ParseExtra() override; // vtable+0x30 + MxStillPresenter() { m_unk68 = 0; } undefined4 m_unk64; undefined4 m_unk68;