From c6d1c6b9850a4ef7e5c21b24416c3b6cd3a903c7 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 28 Jun 2023 14:43:18 +0200 Subject: [PATCH] Implement MxDSObject --- LEGO1/mxdsobject.cpp | 99 ++++++++++++++++++++++++++++++++++++++++++-- LEGO1/mxdsobject.h | 18 +++++++- 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 7323f446..af19ffd4 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -7,7 +7,7 @@ MxDSObject::MxDSObject() { this->m_unk0c = 0; - this->m_unk10 = 0; + this->m_unk10 = NULL; this->m_unk14 = 0; this->m_name = NULL; this->m_unk24 = -1; @@ -15,15 +15,44 @@ MxDSObject::MxDSObject() this->m_unk28 = 0; } +// OFFSET: LEGO1 0x100bf7e0 +MxDSObject::~MxDSObject() +{ + delete[] m_name; + delete[] m_unk10; +} + +// OFFSET: LEGO1 0x100bf870 +void MxDSObject::CopyFrom(MxDSObject &p_dsObject) +{ + this->SetUnknown10(p_dsObject.m_unk10); + this->m_unk14 = p_dsObject.m_unk14; + this->SetObjectName(p_dsObject.m_name); + 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); + delete[] this->m_name; if (p_name) { - this->m_name = (char *)malloc(strlen(p_name) + 1); + this->m_name = new char[strlen(p_name) + 1]; if (this->m_name) { strcpy(this->m_name, p_name); @@ -34,3 +63,67 @@ void MxDSObject::SetObjectName(const char *p_name) } } } + +// OFFSET: LEGO1 0x100bf950 +void MxDSObject::SetUnknown10(const char *p_unk10) +{ + if (p_unk10 != this->m_unk10) + { + delete[] this->m_unk10; + + if (p_unk10) { + this->m_unk10 = new char[strlen(p_unk10) + 1]; + + if (this->m_unk10) { + strcpy(this->m_unk10, p_unk10); + } + } + else { + this->m_unk10 = NULL; + } + } +} + +// OFFSET: LEGO1 0x100bf9c0 +int MxDSObject::unk14() +{ + return 10; +} + +// OFFSET: LEGO1 0x100bf9d0 +unsigned int MxDSObject::CalculateUnk08() +{ + unsigned int unk08; + + if (this->m_unk10) + unk08 = strlen(this->m_unk10) + 3; + else + unk08 = 3; + + unk08 += 4; + + if (this->m_name) + unk08 += strlen(this->m_name) + 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->SetUnknown10(*p_source); + *p_source += strlen(this->m_unk10) + 1; + this->m_unk14 = *(int*) *p_source; + *p_source += 4; + + this->SetObjectName(*p_source); + *p_source += strlen(this->m_name) + 1; + this->m_unk1c = *(int*) *p_source; + *p_source += 4; + + this->m_unk24 = p_unk24; +} \ No newline at end of file diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 468076f7..6f36def9 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -10,6 +10,22 @@ class MxDSObject : public MxCore __declspec(dllexport) void SetObjectName(const char *); MxDSObject(); + virtual ~MxDSObject(); + + MxDSObject &operator=(MxDSObject &p_dsObject); + void CopyFrom(MxDSObject &p_dsObject); + + // OFFSET: LEGO1 0x100bf730 + inline virtual const char *ClassName() const { return "MxDSObject"; }; // vtable+0c + + // OFFSET: LEGO1 0x100bf740 + inline virtual MxBool IsA(const char *name) const { 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 SetUnknown10(const char *p_unk10); inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline int GetUnknown1c() { return this->m_unk1c; } @@ -22,7 +38,7 @@ 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; int m_unk14;