diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 3028a43d..9a875750 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -73,6 +73,8 @@ class MxDSAction : public MxDSObject undefined4 m_unk84; undefined4 m_unk88; MxOmni *m_omni; // 0x8c + +protected: MxLong m_someTimingField; // 0x90 }; diff --git a/LEGO1/mxdsmultiaction.cpp b/LEGO1/mxdsmultiaction.cpp index 7da6f367..ac974f86 100644 --- a/LEGO1/mxdsmultiaction.cpp +++ b/LEGO1/mxdsmultiaction.cpp @@ -17,6 +17,78 @@ MxDSMultiAction::~MxDSMultiAction() delete this->m_actions; } +// OFFSET: LEGO1 0x100ca0d0 +void MxDSMultiAction::CopyFrom(MxDSMultiAction &p_dsMultiAction) +{ + this->m_actions->DeleteAll(); + + MxDSActionListCursor cursor(p_dsMultiAction.m_actions); + MxDSAction *action; + while (cursor.Next(action)) + this->m_actions->Append(action->Clone()); +} + +// OFFSET: LEGO1 0x100ca260 +MxDSMultiAction &MxDSMultiAction::operator=(MxDSMultiAction &p_dsMultiAction) +{ + if (this == &p_dsMultiAction) + return *this; + + MxDSAction::operator=(p_dsMultiAction); + this->CopyFrom(p_dsMultiAction); + return *this; +} + + +// OFFSET: LEGO1 0x100ca290 +void MxDSMultiAction::SetSomeTimingField(MxLong p_someTimingField) +{ + this->m_someTimingField = p_someTimingField; + + MxDSActionListCursor cursor(this->m_actions); + MxDSAction *action; + while (cursor.Next(action)) + action->SetSomeTimingField(p_someTimingField); +} + +// OFFSET: LEGO1 0x100ca370 +void MxDSMultiAction::MergeFrom(MxDSAction &p_dsMultiAction) +{ + MxDSAction::MergeFrom(p_dsMultiAction); + + MxDSActionListCursor cursor(this->m_actions); + MxDSAction *action; + while (cursor.Next(action)) + action->MergeFrom(p_dsMultiAction); +} + +// OFFSET: LEGO1 0x100ca450 +MxBool MxDSMultiAction::HasId(MxU32 p_objectId) +{ + if (this->GetObjectId() == p_objectId) + return TRUE; + + MxDSActionListCursor cursor(this->m_actions); + MxDSAction *action; + while (cursor.Next(action)) { + if (action->HasId(p_objectId)) + return TRUE; + } + + return FALSE; +} + +// OFFSET: LEGO1 0x100ca550 +MxDSAction *MxDSMultiAction::Clone() +{ + MxDSMultiAction *clone = new MxDSMultiAction(); + + if (clone) + *clone = *this; + + return clone; +} + // OFFSET: LEGO1 0x100ca5e0 undefined4 MxDSMultiAction::unk14() { @@ -69,4 +141,15 @@ void MxDSMultiAction::Deserialize(char **p_source, MxS16 p_unk24) } *p_source += extraFlag; +} + +// OFFSET: LEGO1 0x100ca8c0 +void MxDSMultiAction::SetAtomId(MxAtomId p_atomId) +{ + MxDSAction::SetAtomId(p_atomId); + + MxDSActionListCursor cursor(this->m_actions); + MxDSAction *action; + while (cursor.Next(action)) + action->SetAtomId(p_atomId); } \ No newline at end of file diff --git a/LEGO1/mxdsmultiaction.h b/LEGO1/mxdsmultiaction.h index 643eceb8..21b1dc03 100644 --- a/LEGO1/mxdsmultiaction.h +++ b/LEGO1/mxdsmultiaction.h @@ -12,6 +12,9 @@ class MxDSMultiAction : public MxDSAction MxDSMultiAction(); virtual ~MxDSMultiAction() override; + void CopyFrom(MxDSMultiAction &p_dsMultiAction); + MxDSMultiAction &operator=(MxDSMultiAction &p_dsMultiAction); + // OFFSET: LEGO1 0x100c9f50 inline virtual const char *ClassName() const override // vtable+0x0c { @@ -28,6 +31,11 @@ class MxDSMultiAction : public MxDSAction virtual undefined4 unk14(); // vtable+14; virtual MxU32 GetSizeOnDisk(); // vtable+18; virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; + virtual void SetAtomId(MxAtomId p_atomId); // vtable+20; + virtual MxDSAction *Clone(); // vtable+2c; + virtual void MergeFrom(MxDSAction &p_dsAction); // vtable+30; + virtual MxBool HasId(MxU32 p_objectId); // vtable+34; + virtual void SetSomeTimingField(MxLong p_someTimingField); // vtable+38; private: MxU32 m_sizeOnDisk; diff --git a/LEGO1/mxlist.h b/LEGO1/mxlist.h index a4231c92..0de71903 100644 --- a/LEGO1/mxlist.h +++ b/LEGO1/mxlist.h @@ -59,6 +59,7 @@ class MxList : protected MxListParent virtual ~MxList(); void Append(T*); + void DeleteAll(); MxU32 GetCount() { return m_count; } void SetDestroy(void (*p_customDestructor)(T *)) { this->m_customDestructor = p_customDestructor; } @@ -115,6 +116,12 @@ class MxListCursorChildChild : public MxListCursorChild template // OFFSET: LEGO1 0x1001ce20 MxList::~MxList() +{ + DeleteAll(); +} + +template +inline void MxList::DeleteAll() { for (MxListEntry *t = m_first;;) { if (!t)