From 4e0149361eb311db6c8382e2a3b10ab224e872f8 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 10 Aug 2023 13:57:53 -0400 Subject: [PATCH] Implement MxDSAction (#106) --- LEGO1/mxdsaction.h | 2 +- LEGO1/mxdsmediaaction.cpp | 96 ++++++++++++++++++++++++++++++++++++--- LEGO1/mxdsmediaaction.h | 26 +++++++---- 3 files changed, 107 insertions(+), 17 deletions(-) diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index a677741c..2d177f8f 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -55,7 +55,7 @@ class MxDSAction : public MxDSObject MxU16 m_unkLength; undefined4 m_unk84; undefined4 m_unk88; - MxOmni* m_omni; // 0x8c + MxOmni *m_omni; // 0x8c MxLong m_someTimingField; // 0x90 }; diff --git a/LEGO1/mxdsmediaaction.cpp b/LEGO1/mxdsmediaaction.cpp index a8acde30..d368aa3d 100644 --- a/LEGO1/mxdsmediaaction.cpp +++ b/LEGO1/mxdsmediaaction.cpp @@ -1,21 +1,103 @@ #include "mxdsmediaaction.h" +DECOMP_SIZE_ASSERT(MxDSMediaAction, 0xb8) + // OFFSET: LEGO1 0x100c8b40 MxDSMediaAction::MxDSMediaAction() { - this->m_unk98 = 0; + this->m_mediaSrcPath = NULL; this->m_unk9c = 0; this->m_unka0 = 0; - this->m_unka4 = 0; - this->m_unka8 = 0; - this->m_unkac = 1; - this->m_unkb4 = 0xffffffff; - this->m_unkb0 = 0; + this->m_framesPerSecond = 0; + this->m_mediaFormat = 0; + this->m_paletteManagement = 1; + this->m_unkb4 = -1; + this->m_sustainTime = 0; this->SetType(MxDSType_MediaAction); } // OFFSET: LEGO1 0x100c8cf0 MxDSMediaAction::~MxDSMediaAction() { - delete this->m_unk98; + delete[] this->m_mediaSrcPath; } + +// OFFSET: LEGO1 0x100c8d60 +void MxDSMediaAction::CopyFrom(MxDSMediaAction &p_dsMediaAction) +{ + CopyMediaSrcPath(p_dsMediaAction.m_mediaSrcPath); + + // TODO + this->m_unk9c = p_dsMediaAction.m_unk9c; + this->m_unka0 = p_dsMediaAction.m_unka0; + + this->m_framesPerSecond = p_dsMediaAction.m_framesPerSecond; + this->m_mediaFormat = p_dsMediaAction.m_mediaFormat; + this->m_paletteManagement = p_dsMediaAction.m_paletteManagement; + this->m_sustainTime = p_dsMediaAction.m_sustainTime; +} + +// OFFSET: LEGO1 0x100c8dc0 +MxDSMediaAction &MxDSMediaAction::operator=(MxDSMediaAction &p_dsMediaAction) +{ + if (this == &p_dsMediaAction) + return *this; + + MxDSAction::operator=(p_dsMediaAction); + this->CopyFrom(p_dsMediaAction); + return *this; +} + +// OFFSET: LEGO1 0x100c8f10 +MxU32 MxDSMediaAction::GetSizeOnDisk() +{ + MxU32 totalSizeOnDisk = MxDSAction::GetSizeOnDisk(); + + if (this->m_mediaSrcPath) + totalSizeOnDisk += strlen(this->m_mediaSrcPath) + 1; + else + totalSizeOnDisk++; + + totalSizeOnDisk += 24; + this->m_sizeOnDisk = totalSizeOnDisk - MxDSAction::GetSizeOnDisk(); + return totalSizeOnDisk; +} + +// OFFSET: LEGO1 0x100c8f60 +void MxDSMediaAction::Deserialize(char **p_source, MxS16 p_unk24) +{ + MxDSAction::Deserialize(p_source, p_unk24); + + CopyMediaSrcPath(*p_source); + *p_source += strlen(this->m_mediaSrcPath) + 1; + + this->m_unk9c = *(undefined4*) *p_source; + *p_source += sizeof(undefined4); + this->m_unka0 = *(undefined4*) *p_source; + *p_source += sizeof(undefined4); + this->m_framesPerSecond = *(MxS32*) *p_source; + *p_source += sizeof(MxS32); + this->m_mediaFormat = *(MxS32*) *p_source; + *p_source += sizeof(MxS32); + this->m_paletteManagement = *(MxS32*) *p_source; + *p_source += sizeof(MxS32); + this->m_sustainTime = *(MxLong*) *p_source; + *p_source += sizeof(MxLong); +} + +// OFFSET: LEGO1 0x100c8e80 +void MxDSMediaAction::CopyMediaSrcPath(const char *p_mediaSrcPath) +{ + if (this->m_mediaSrcPath == p_mediaSrcPath) + return; + + delete[] this->m_mediaSrcPath; + + if (p_mediaSrcPath) { + this->m_mediaSrcPath = new char[strlen(p_mediaSrcPath) + 1]; + if (this->m_mediaSrcPath) + strcpy(this->m_mediaSrcPath, p_mediaSrcPath); + } + else + this->m_mediaSrcPath = NULL; +} \ No newline at end of file diff --git a/LEGO1/mxdsmediaaction.h b/LEGO1/mxdsmediaaction.h index 5e6a6141..1ebbfdd2 100644 --- a/LEGO1/mxdsmediaaction.h +++ b/LEGO1/mxdsmediaaction.h @@ -12,6 +12,9 @@ class MxDSMediaAction : public MxDSAction MxDSMediaAction(); virtual ~MxDSMediaAction() override; + void CopyFrom(MxDSMediaAction &p_dsMediaAction); + MxDSMediaAction &operator=(MxDSMediaAction &p_dsMediaAction); + // OFFSET: LEGO1 0x100c8be0 inline virtual const char *ClassName() const override // vtable+0x0c { @@ -24,16 +27,21 @@ class MxDSMediaAction : public MxDSAction { return !strcmp(name, MxDSMediaAction::ClassName()) || MxDSAction::IsA(name); } + + virtual MxU32 GetSizeOnDisk(); // vtable+18; + virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; + + void CopyMediaSrcPath(const char *p_mediaSrcPath); private: - MxS32* m_unk94; - MxS32* m_unk98; - MxS32* m_unk9c; - MxS32* m_unka0; - MxS32* m_unka4; - MxS32* m_unka8; - MxS32 m_unkac; - MxS32* m_unkb0; - MxS32 m_unkb4; + MxU32 m_sizeOnDisk; + char *m_mediaSrcPath; + undefined4 m_unk9c; + undefined4 m_unka0; + MxS32 m_framesPerSecond; + MxS32 m_mediaFormat; + MxS32 m_paletteManagement; + MxLong m_sustainTime; + undefined4 m_unkb4; }; #endif // MXDSMEDIAACTION_H