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..2b4ececb 100644 --- a/LEGO1/legoactioncontrolpresenter.cpp +++ b/LEGO1/legoactioncontrolpresenter.cpp @@ -1 +1,87 @@ #include "legoactioncontrolpresenter.h" +#include "extra.h" +#include "legoomni.h" +#include "mxmediapresenter.h" +#include "mxomni.h" +#include "mxticklemanager.h" +#include "mxtypes.h" +#include "legoutil.h" +#include "define.h" +#include +#include + +// Only a `scalar deleting destructor' exists. +LegoActionControlPresenter::~LegoActionControlPresenter() +{ + Destroy(TRUE); +} + +// 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..bcdf89f7 100644 --- a/LEGO1/legoactioncontrolpresenter.h +++ b/LEGO1/legoactioncontrolpresenter.h @@ -1,24 +1,42 @@ #ifndef LEGOACTIONCONTROLPRESENTER_H #define LEGOACTIONCONTROLPRESENTER_H +#include "decomp.h" #include "mxmediapresenter.h" +#include "legoutil.h" // VTABLE 0x100d5118 // SIZE 0x68 class LegoActionControlPresenter : public MxMediaPresenter { public: - // OFFSET: LEGO1 0x1000d0e0 - inline virtual const char* ClassName() const override // vtable+0x0c - { - // 0x100f05bc - return "LegoActionControlPresenter"; - } + inline LegoActionControlPresenter() + { + m_unk0x50 = ExtraActionType_none; + } + virtual ~LegoActionControlPresenter() override; // vtable+0x00 + // OFFSET: LEGO1 0x1000d0e0 + inline virtual const char *ClassName() const override // vtable+0x0c + { + // 0x100f05bc + return "LegoActionControlPresenter"; + } - // OFFSET: LEGO1 0x1000d0f0 - inline virtual MxBool IsA(const char* name) const override // vtable+0x10 - { - return !strcmp(name, LegoActionControlPresenter::ClassName()) || MxMediaPresenter::IsA(name); - } + // OFFSET: LEGO1 0x1000d0f0 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, LegoActionControlPresenter::ClassName()) || + MxMediaPresenter::IsA(name); + } + virtual void ReadyTickle() override; // vtable+0x18 + virtual void RepeatingTickle() override; // vtable+0x24 + virtual void ParseExtra(); // vtable+0x30 + virtual MxResult AddToManager() override; + +private: + virtual void Destroy(MxBool p_fromDestructor); //vtable+0x5c + ExtraActionType m_unk0x50; + MxString m_unk0x54; + undefined4 m_unk0x64; }; #endif // LEGOACTIONCONTROLPRESENTER_H