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

@ -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;
}

View file

@ -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