lego1: implement MxDSObject (#55)

* Implement MxDSObject

* use discovered names

* Update LEGO1/mxdsobject.cpp

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>

* Update mxdsobject.cpp

* Update mxdsobject.h

---------

Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
This commit is contained in:
Christian Semmler 2023-06-29 18:08:06 +02:00 committed by GitHub
parent 6761345c8c
commit 6558a78848
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 111 additions and 24 deletions

View file

@ -7,9 +7,9 @@
MxDSObject::MxDSObject() MxDSObject::MxDSObject()
{ {
this->m_unk0c = 0; this->m_unk0c = 0;
this->m_unk10 = 0; this->m_sourceName = NULL;
this->m_unk14 = 0; this->m_unk14 = 0;
this->m_name = NULL; this->m_objectName = NULL;
this->m_unk24 = -1; this->m_unk24 = -1;
this->m_unk1c = -1; this->m_unk1c = -1;
this->m_unk28 = 0; this->m_unk28 = 0;
@ -18,25 +18,110 @@ MxDSObject::MxDSObject()
// OFFSET: LEGO1 0x100bf7e0 // OFFSET: LEGO1 0x100bf7e0
MxDSObject::~MxDSObject() 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 // OFFSET: LEGO1 0x100bf8e0
void MxDSObject::SetObjectName(const char *p_name) void MxDSObject::SetObjectName(const char *p_name)
{ {
if (p_name != this->m_name) if (p_name != this->m_objectName) {
{ delete[] this->m_objectName;
free(this->m_name);
if (p_name) { 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) { if (this->m_objectName) {
strcpy(this->m_name, p_name); strcpy(this->m_objectName, p_name);
} }
} }
else { 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;
}

View file

@ -9,23 +9,25 @@
class MxDSObject : public MxCore class MxDSObject : public MxCore
{ {
public: public:
__declspec(dllexport) void SetObjectName(const char *); __declspec(dllexport) void SetObjectName(const char *p_objectName);
MxDSObject(); MxDSObject();
virtual ~MxDSObject() override; virtual ~MxDSObject() override;
// OFFSET: LEGO1 0x100bf730 MxDSObject &operator=(MxDSObject &p_dsObject);
inline virtual const char *ClassName() const override // vtable+0x0c void CopyFrom(MxDSObject &p_dsObject);
{
// 0x10101400 // OFFSET: LEGO1 0x100bf730
return "MxDSObject"; inline virtual const char *ClassName() const override { return "MxDSObject"; }; // vtable+0c
}
// OFFSET: LEGO1 0x100bf740 // OFFSET: LEGO1 0x100bf740
inline virtual MxBool IsA(const char *name) const override // vtable+0x10 inline virtual MxBool IsA(const char *name) const override { return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); }; // vtable+10;
{
return !strcmp(name, MxDSObject::ClassName()) || MxCore::IsA(name); 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 const MxAtomId& GetAtomId() { return this->m_atomId; }
inline int GetUnknown1c() { return this->m_unk1c; } 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; } inline void SetAtomId(MxAtomId p_atomId) { this->m_atomId = p_atomId; }
private: private:
int m_unk08; unsigned int m_unk08;
short m_unk0c; short m_unk0c;
char* m_unk10; char* m_sourceName;
int m_unk14; int m_unk14;
char *m_name; char *m_objectName;
int m_unk1c; int m_unk1c;
MxAtomId m_atomId; MxAtomId m_atomId;
short m_unk24; short m_unk24;