From 6558a78848c5e8dfcab62955f80894dde3bf7a2b Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 29 Jun 2023 18:08:06 +0200 Subject: [PATCH] lego1: implement MxDSObject (#55) * Implement MxDSObject * use discovered names * Update LEGO1/mxdsobject.cpp Co-authored-by: Anonymous Maarten * Update mxdsobject.cpp * Update mxdsobject.h --------- Co-authored-by: Anonymous Maarten --- LEGO1/mxdsobject.cpp | 105 ++++++++++++++++++++++++++++++++++++++----- LEGO1/mxdsobject.h | 30 +++++++------ 2 files changed, 111 insertions(+), 24 deletions(-) diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 11b912a0..fd4b7434 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -7,9 +7,9 @@ MxDSObject::MxDSObject() { this->m_unk0c = 0; - this->m_unk10 = 0; + this->m_sourceName = NULL; this->m_unk14 = 0; - this->m_name = NULL; + this->m_objectName = NULL; this->m_unk24 = -1; this->m_unk1c = -1; this->m_unk28 = 0; @@ -18,25 +18,110 @@ MxDSObject::MxDSObject() // OFFSET: LEGO1 0x100bf7e0 MxDSObject::~MxDSObject() { - // TODO + delete[] m_objectName; + delete[] m_sourceName; +} + +// OFFSET: LEGO1 0x100bf870 +void MxDSObject::CopyFrom(MxDSObject &p_dsObject) +{ + this->SetSourceName(p_dsObject.m_sourceName); + this->m_unk14 = p_dsObject.m_unk14; + this->SetObjectName(p_dsObject.m_objectName); + this->m_unk1c = p_dsObject.m_unk1c; + this->m_unk24 = p_dsObject.m_unk24; + this->m_atomId = p_dsObject.m_atomId; + this->m_unk28 = p_dsObject.m_unk28; +} + +// OFFSET: LEGO1 0x100bf8c0 +MxDSObject &MxDSObject::operator=(MxDSObject &p_dsObject) +{ + if (this == &p_dsObject) + return *this; + + this->CopyFrom(p_dsObject); + return *this; } // OFFSET: LEGO1 0x100bf8e0 void MxDSObject::SetObjectName(const char *p_name) { - if (p_name != this->m_name) - { - free(this->m_name); + if (p_name != this->m_objectName) { + delete[] this->m_objectName; if (p_name) { - this->m_name = (char *)malloc(strlen(p_name) + 1); + this->m_objectName = new char[strlen(p_name) + 1]; - if (this->m_name) { - strcpy(this->m_name, p_name); + if (this->m_objectName) { + strcpy(this->m_objectName, p_name); } } else { - this->m_name = NULL; + this->m_objectName = NULL; } } } + +// OFFSET: LEGO1 0x100bf950 +void MxDSObject::SetSourceName(const char *p_sourceName) +{ + if (p_sourceName != this->m_sourceName) { + delete[] this->m_sourceName; + + if (p_sourceName) { + this->m_sourceName = new char[strlen(p_sourceName) + 1]; + + if (this->m_sourceName) { + strcpy(this->m_sourceName, p_sourceName); + } + } + else { + this->m_sourceName = NULL; + } + } +} + +// OFFSET: LEGO1 0x100bf9c0 +int MxDSObject::unk14() +{ + return 10; +} + +// OFFSET: LEGO1 0x100bf9d0 +unsigned int MxDSObject::CalculateUnk08() +{ + unsigned int unk08; + + if (this->m_sourceName) + unk08 = strlen(this->m_sourceName) + 3; + else + unk08 = 3; + + unk08 += 4; + + if (this->m_objectName) + unk08 += strlen(this->m_objectName) + 1; + else + unk08++; + + unk08 += 4; + this->m_unk08 = unk08; + return unk08; +} + +// OFFSET: LEGO1 0x100bfa20 +void MxDSObject::Parse(char **p_source, unsigned short p_unk24) +{ + this->SetSourceName(*p_source); + *p_source += strlen(this->m_sourceName) + 1; + this->m_unk14 = *(int*) *p_source; + *p_source += 4; + + this->SetObjectName(*p_source); + *p_source += strlen(this->m_objectName) + 1; + this->m_unk1c = *(int*) *p_source; + *p_source += 4; + + this->m_unk24 = p_unk24; +} diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 4f0aced6..ef4701bc 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -9,23 +9,25 @@ class MxDSObject : public MxCore { public: - __declspec(dllexport) void SetObjectName(const char *); + __declspec(dllexport) void SetObjectName(const char *p_objectName); MxDSObject(); virtual ~MxDSObject() override; - // OFFSET: LEGO1 0x100bf730 - inline virtual const char *ClassName() const override // vtable+0x0c - { - // 0x10101400 - return "MxDSObject"; - } + MxDSObject &operator=(MxDSObject &p_dsObject); + void CopyFrom(MxDSObject &p_dsObject); + + // OFFSET: LEGO1 0x100bf730 + inline virtual const char *ClassName() const override { return "MxDSObject"; }; // vtable+0c // OFFSET: LEGO1 0x100bf740 - inline virtual MxBool IsA(const char *name) const override // vtable+0x10 - { - return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); - } + inline virtual MxBool IsA(const char *name) const override { return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); }; // vtable+10; + + virtual int unk14(); // vtable+14; + virtual unsigned int CalculateUnk08(); // vtable+18; + virtual void Parse(char **p_source, unsigned short p_unk24); // vtable+1c; + + void SetSourceName(const char *p_sourceName); inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline int GetUnknown1c() { return this->m_unk1c; } @@ -38,11 +40,11 @@ class MxDSObject : public MxCore inline void SetAtomId(MxAtomId p_atomId) { this->m_atomId = p_atomId; } private: - int m_unk08; + unsigned int m_unk08; short m_unk0c; - char* m_unk10; + char* m_sourceName; int m_unk14; - char *m_name; + char *m_objectName; int m_unk1c; MxAtomId m_atomId; short m_unk24;