Implement MxDSAction::ConcatData

This commit is contained in:
Christian Semmler 2023-08-09 09:18:07 -04:00
parent bd9dca0d3f
commit f3bc65447f
2 changed files with 50 additions and 23 deletions

View File

@ -3,13 +3,18 @@
#include <float.h> #include <float.h>
#include <limits.h> #include <limits.h>
#define TWOCC(a, b) (((a) << 0) | ((b) << 8))
// OFFSET: LEGO1 0x10101410
MxU16 g_unkSep = TWOCC(',', ' ');
// OFFSET: LEGO1 0x100ad810 // OFFSET: LEGO1 0x100ad810
MxDSAction::MxDSAction() MxDSAction::MxDSAction()
{ {
this->m_flags = 32; this->m_flags = 32;
this->m_startTime = INT_MIN; this->m_startTime = INT_MIN;
this->m_unk7c = NULL; this->m_unkData = NULL;
this->m_unk80 = 0; this->m_unkLength = 0;
this->m_duration = INT_MIN; this->m_duration = INT_MIN;
this->m_loopCount = -1; this->m_loopCount = -1;
@ -39,7 +44,7 @@ MxDSAction::MxDSAction()
// OFFSET: LEGO1 0x100ada80 // OFFSET: LEGO1 0x100ada80
MxDSAction::~MxDSAction() MxDSAction::~MxDSAction()
{ {
delete this->m_unk7c; delete this->m_unkData;
} }
// OFFSET: LEGO1 0x100adaf0 // OFFSET: LEGO1 0x100adaf0
@ -56,7 +61,7 @@ void MxDSAction::CopyFrom(MxDSAction &p_dsAction)
// this->m_direction.SetVector(p_dsAction.m_direction.GetData()); // this->m_direction.SetVector(p_dsAction.m_direction.GetData());
// this->m_up.SetVector(p_dsAction.m_up.GetData()); // this->m_up.SetVector(p_dsAction.m_up.GetData());
FUN_100ADE60(p_dsAction.m_unk80, p_dsAction.m_unk7c); ConcatData(p_dsAction.m_unkLength, p_dsAction.m_unkData);
this->m_unk84 = p_dsAction.m_unk84; this->m_unk84 = p_dsAction.m_unk84;
this->m_unk88 = p_dsAction.m_unk88; this->m_unk88 = p_dsAction.m_unk88;
this->m_omni = p_dsAction.m_omni; this->m_omni = p_dsAction.m_omni;
@ -79,7 +84,7 @@ MxU32 MxDSAction::GetSizeOnDisk()
{ {
MxU32 totalSizeOnDisk; MxU32 totalSizeOnDisk;
totalSizeOnDisk = MxDSObject::GetSizeOnDisk() + 90 + this->m_unk80; totalSizeOnDisk = MxDSObject::GetSizeOnDisk() + 90 + this->m_unkLength;
this->m_sizeOnDisk = totalSizeOnDisk - MxDSObject::GetSizeOnDisk(); this->m_sizeOnDisk = totalSizeOnDisk - MxDSObject::GetSizeOnDisk();
return totalSizeOnDisk; return totalSizeOnDisk;
@ -117,11 +122,11 @@ void MxDSAction::Deserialize(char **p_source, MxS16 p_unk24)
this->m_up[2] = *(double*) *p_source; this->m_up[2] = *(double*) *p_source;
*p_source += sizeof(double); *p_source += sizeof(double);
MxU16 extralen = *(MxU16*) *p_source; MxU16 unkLength = *(MxU16*) *p_source;
*p_source += sizeof(MxU16); *p_source += sizeof(MxU16);
if (extralen) { if (unkLength) {
FUN_100ADE60(extralen, *p_source); ConcatData(unkLength, *p_source);
*p_source += extralen; *p_source += unkLength;
} }
} }
@ -182,14 +187,14 @@ void MxDSAction::MergeFrom(MxDSAction &p_dsAction)
this->m_up[2] = p_dsAction.m_up[2]; this->m_up[2] = p_dsAction.m_up[2];
// TODO // TODO
if (p_dsAction.m_unk80 && MxU16 unkLength = p_dsAction.m_unkLength;
p_dsAction.m_unk7c && char *unkData = p_dsAction.m_unkData;
*p_dsAction.m_unk7c && if (unkLength && unkData) {
!strncmp("XXX", (const char*) p_dsAction.m_unk7c, 3)) if (!this->m_unkData || !strncmp("XXX", this->m_unkData, 3)) {
{ delete this->m_unkData;
delete this->m_unk7c; this->m_unkLength = 0;
this->m_unk80 = 0; ConcatData(unkLength, unkData);
FUN_100ADE60(p_dsAction.m_unk80, p_dsAction.m_unk7c); }
} }
} }
@ -217,8 +222,30 @@ MxLong MxDSAction::GetCurrentTime()
return Timer()->GetTime() - this->m_someTimingField; return Timer()->GetTime() - this->m_someTimingField;
} }
// OFFSET: LEGO1 0x100ade60 STUB // OFFSET: LEGO1 0x100ade60
void MxDSAction::FUN_100ADE60(MxU16 p_length, void *p_data) void MxDSAction::ConcatData(MxU16 p_unkLength, void *p_unkData)
{ {
// TOOD if (this->m_unkData == p_unkData || !p_unkData)
return;
if (this->m_unkLength) {
char *concat = new char[p_unkLength + this->m_unkLength + sizeof(g_unkSep)];
memcpy(concat, this->m_unkData, this->m_unkLength);
*(MxU16*) &concat[this->m_unkLength] = g_unkSep;
memcpy(&concat[this->m_unkLength + sizeof(g_unkSep)], p_unkData, p_unkLength);
this->m_unkLength += p_unkLength + sizeof(g_unkSep);
delete this->m_unkData;
this->m_unkData = concat;
}
else {
char *copy = new char[p_unkLength];
this->m_unkData = copy;
if (copy) {
this->m_unkLength = p_unkLength;
memcpy(copy, p_unkData, p_unkLength);
}
}
} }

View File

@ -40,7 +40,7 @@ class MxDSAction : public MxDSObject
virtual MxLong GetSomeTimingField(); // vtable+3c; virtual MxLong GetSomeTimingField(); // vtable+3c;
virtual MxLong GetCurrentTime(); // vtable+40; virtual MxLong GetCurrentTime(); // vtable+40;
void FUN_100ADE60(MxU16 p_length, void *p_data); void ConcatData(MxU16 p_unkLength, void *p_unkData);
private: private:
MxU32 m_sizeOnDisk; MxU32 m_sizeOnDisk;
@ -51,8 +51,8 @@ class MxDSAction : public MxDSObject
MxVector3Data m_location; MxVector3Data m_location;
MxVector3Data m_direction; MxVector3Data m_direction;
MxVector3Data m_up; MxVector3Data m_up;
undefined4 *m_unk7c; char *m_unkData;
MxU16 m_unk80; MxU16 m_unkLength;
undefined4 m_unk84; undefined4 m_unk84;
undefined4 m_unk88; undefined4 m_unk88;
MxOmni* m_omni; // 0x8c MxOmni* m_omni; // 0x8c