Implement MxDSAction (#106)

This commit is contained in:
Christian Semmler 2023-08-10 13:57:53 -04:00 committed by GitHub
parent a02e07c4d7
commit 4e0149361e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 107 additions and 17 deletions

View file

@ -55,7 +55,7 @@ class MxDSAction : public MxDSObject
MxU16 m_unkLength; MxU16 m_unkLength;
undefined4 m_unk84; undefined4 m_unk84;
undefined4 m_unk88; undefined4 m_unk88;
MxOmni* m_omni; // 0x8c MxOmni *m_omni; // 0x8c
MxLong m_someTimingField; // 0x90 MxLong m_someTimingField; // 0x90
}; };

View file

@ -1,21 +1,103 @@
#include "mxdsmediaaction.h" #include "mxdsmediaaction.h"
DECOMP_SIZE_ASSERT(MxDSMediaAction, 0xb8)
// OFFSET: LEGO1 0x100c8b40 // OFFSET: LEGO1 0x100c8b40
MxDSMediaAction::MxDSMediaAction() MxDSMediaAction::MxDSMediaAction()
{ {
this->m_unk98 = 0; this->m_mediaSrcPath = NULL;
this->m_unk9c = 0; this->m_unk9c = 0;
this->m_unka0 = 0; this->m_unka0 = 0;
this->m_unka4 = 0; this->m_framesPerSecond = 0;
this->m_unka8 = 0; this->m_mediaFormat = 0;
this->m_unkac = 1; this->m_paletteManagement = 1;
this->m_unkb4 = 0xffffffff; this->m_unkb4 = -1;
this->m_unkb0 = 0; this->m_sustainTime = 0;
this->SetType(MxDSType_MediaAction); this->SetType(MxDSType_MediaAction);
} }
// OFFSET: LEGO1 0x100c8cf0 // OFFSET: LEGO1 0x100c8cf0
MxDSMediaAction::~MxDSMediaAction() 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;
}

View file

@ -12,6 +12,9 @@ class MxDSMediaAction : public MxDSAction
MxDSMediaAction(); MxDSMediaAction();
virtual ~MxDSMediaAction() override; virtual ~MxDSMediaAction() override;
void CopyFrom(MxDSMediaAction &p_dsMediaAction);
MxDSMediaAction &operator=(MxDSMediaAction &p_dsMediaAction);
// OFFSET: LEGO1 0x100c8be0 // OFFSET: LEGO1 0x100c8be0
inline virtual const char *ClassName() const override // vtable+0x0c 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); 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: private:
MxS32* m_unk94; MxU32 m_sizeOnDisk;
MxS32* m_unk98; char *m_mediaSrcPath;
MxS32* m_unk9c; undefined4 m_unk9c;
MxS32* m_unka0; undefined4 m_unka0;
MxS32* m_unka4; MxS32 m_framesPerSecond;
MxS32* m_unka8; MxS32 m_mediaFormat;
MxS32 m_unkac; MxS32 m_paletteManagement;
MxS32* m_unkb0; MxLong m_sustainTime;
MxS32 m_unkb4; undefined4 m_unkb4;
}; };
#endif // MXDSMEDIAACTION_H #endif // MXDSMEDIAACTION_H