Implement MxDSObject

This commit is contained in:
Christian Semmler 2023-06-28 14:43:18 +02:00
parent 2d9af630ba
commit c6d1c6b985
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
2 changed files with 113 additions and 4 deletions

View File

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

View File

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