diff --git a/LEGO1/extra.h b/LEGO1/extra.h index 6aa8fcdb..e8aed106 100644 --- a/LEGO1/extra.h +++ b/LEGO1/extra.h @@ -4,6 +4,7 @@ // Items related to the Extra string of key-value pairs found in MxOb enum ExtraActionType { + ExtraActionType_none = 0, ExtraActionType_opendisk = 1, ExtraActionType_openram = 2, ExtraActionType_close = 3, diff --git a/LEGO1/legoactioncontrolpresenter.cpp b/LEGO1/legoactioncontrolpresenter.cpp index 598c0958..2c6d0f17 100644 --- a/LEGO1/legoactioncontrolpresenter.cpp +++ b/LEGO1/legoactioncontrolpresenter.cpp @@ -1 +1,76 @@ #include "legoactioncontrolpresenter.h" + +#include "define.h" +#include "extra.h" +#include "legoomni.h" +#include "legoutil.h" +#include "mxmediapresenter.h" +#include "mxomni.h" +#include "mxticklemanager.h" + +DECOMP_SIZE_ASSERT(LegoActionControlPresenter, 0x68) + +// OFFSET: LEGO1 0x10043ce0 STUB +void LegoActionControlPresenter::ReadyTickle() +{ + // TODO +} + +// OFFSET: LEGO1 0x10043d40 STUB +void LegoActionControlPresenter::RepeatingTickle() +{ + // TODO +} + +// OFFSET: LEGO1 0x10043df0 +MxResult LegoActionControlPresenter::AddToManager() +{ + MxResult result = FAILURE; + + if (TickleManager()) { + result = SUCCESS; + TickleManager()->RegisterClient(this, 100); + } + + return result; +} + +// OFFSET: LEGO1 0x10043e20 +void LegoActionControlPresenter::Destroy(MxBool p_fromDestructor) +{ + if (TickleManager()) { + TickleManager()->UnregisterClient(this); + } + + if (!p_fromDestructor) { + MxMediaPresenter::Destroy(FALSE); + } +} + +// OFFSET: LEGO1 0x10043e50 +void LegoActionControlPresenter::ParseExtra() +{ + MxU32 len = m_action->GetExtraLength(); + + if (len == 0) + return; + + len &= MAXWORD; + + char buf[1024]; + memcpy(buf, m_action->GetExtraData(), len); + buf[len] = '\0'; + + char output[1024]; + if (KeyValueStringParse(output, g_strACTION, buf)) { + m_unk0x50 = MatchActionString(strtok(output, g_parseExtraTokens)); + if (m_unk0x50 != ExtraActionType_exit) { + MakeSourceName(buf, strtok(NULL, g_parseExtraTokens)); + m_unk0x54 = buf; + m_unk0x54.ToLowerCase(); + if (m_unk0x50 != ExtraActionType_run) { + m_unk0x64 = atoi(strtok(NULL, g_parseExtraTokens)); + } + } + } +} diff --git a/LEGO1/legoactioncontrolpresenter.h b/LEGO1/legoactioncontrolpresenter.h index a79098b2..188747d4 100644 --- a/LEGO1/legoactioncontrolpresenter.h +++ b/LEGO1/legoactioncontrolpresenter.h @@ -1,12 +1,17 @@ #ifndef LEGOACTIONCONTROLPRESENTER_H #define LEGOACTIONCONTROLPRESENTER_H +#include "decomp.h" +#include "legoutil.h" #include "mxmediapresenter.h" // VTABLE 0x100d5118 // SIZE 0x68 class LegoActionControlPresenter : public MxMediaPresenter { public: + inline LegoActionControlPresenter() { m_unk0x50 = ExtraActionType_none; } + virtual ~LegoActionControlPresenter() override { Destroy(TRUE); }; // vtable+0x00 + // OFFSET: LEGO1 0x1000d0e0 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -19,6 +24,21 @@ class LegoActionControlPresenter : public MxMediaPresenter { { return !strcmp(name, LegoActionControlPresenter::ClassName()) || MxMediaPresenter::IsA(name); } + + // TODO: Find proper compilation unit to put this + // OFFSET: LEGO1 0x1000d1d0 TEMPLATE + // LegoActionControlPresenter::`scalar deleting destructor' + + virtual void ReadyTickle() override; // vtable+0x18 + virtual void RepeatingTickle() override; // vtable+0x24 + virtual void ParseExtra() override; // vtable+0x30 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy(MxBool p_fromDestructor); // vtable+0x5c + +private: + ExtraActionType m_unk0x50; // 0x50 + MxString m_unk0x54; // 0x54 + undefined4 m_unk0x64; // 0x64 }; #endif // LEGOACTIONCONTROLPRESENTER_H