From eb282554305b0c16bd5b1be751b58a5f4ce92b27 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 17 Dec 2023 12:08:26 -0500 Subject: [PATCH] Match functions --- LEGO1/legoomni.cpp | 8 ++++---- LEGO1/legoutil.h | 8 ++++---- LEGO1/mxdsaction.cpp | 4 ++-- LEGO1/mxdsaction.h | 2 +- LEGO1/mxdsbuffer.cpp | 39 ++++++++++++++++++++++---------------- LEGO1/mxdsbuffer.h | 17 ++++++++++++++--- LEGO1/mxdschunk.cpp | 2 +- LEGO1/mxdschunk.h | 8 ++++---- LEGO1/mxdsmediaaction.cpp | 2 +- LEGO1/mxdsmediaaction.h | 2 +- LEGO1/mxdsmultiaction.cpp | 2 +- LEGO1/mxdsmultiaction.h | 2 +- LEGO1/mxdsobject.cpp | 4 ++-- LEGO1/mxdsobject.h | 4 ++-- LEGO1/mxdsselectaction.cpp | 14 +++++++------- LEGO1/mxdsselectaction.h | 2 +- LEGO1/mxdssound.cpp | 2 +- LEGO1/mxdssound.h | 2 +- LEGO1/mxstreamchunk.cpp | 15 +++++++++------ LEGO1/mxstreamchunk.h | 3 +++ 20 files changed, 83 insertions(+), 59 deletions(-) diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 1dd1bde8..5ecbb286 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -731,7 +731,7 @@ void SetOmniUserMessage(void (*p_userMsg)(const char*, int)) // FUNCTION: LEGO1 0x100c0280 MxDSObject* CreateStreamObject(MxDSFile* p_file, MxS16 p_ofs) { - char* buf; + MxU8* buf; _MMCKINFO tmpChunk; if (p_file->Seek(((MxLong*) p_file->GetBuffer())[p_ofs], 0)) { @@ -741,18 +741,18 @@ MxDSObject* CreateStreamObject(MxDSFile* p_file, MxS16 p_ofs) if (p_file->Read((MxU8*) &tmpChunk.ckid, 8) == 0 && tmpChunk.ckid == FOURCC('M', 'x', 'S', 't')) { if (p_file->Read((MxU8*) &tmpChunk.ckid, 8) == 0 && tmpChunk.ckid == FOURCC('M', 'x', 'O', 'b')) { - buf = new char[tmpChunk.cksize]; + buf = new MxU8[tmpChunk.cksize]; if (!buf) { return NULL; } - if (p_file->Read((MxU8*) buf, tmpChunk.cksize) != 0) { + if (p_file->Read(buf, tmpChunk.cksize) != 0) { return NULL; } // Save a copy so we can clean up properly, because // this function will alter the pointer value. - char* copy = buf; + MxU8* copy = buf; MxDSObject* obj = DeserializeDSObjectDispatch(&buf, -1); delete[] copy; return obj; diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index afc0a0d4..a6351395 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -27,7 +27,7 @@ inline T Max(T p_t1, T p_t2) } template -inline void GetScalar(char** p_source, T& p_dest) +inline void GetScalar(MxU8** p_source, T& p_dest) { p_dest = *(T*) *p_source; *p_source += sizeof(T); @@ -42,16 +42,16 @@ inline T GetScalar(T** p_source) } template -inline void GetDouble(char** p_source, T& p_dest) +inline void GetDouble(MxU8** p_source, T& p_dest) { p_dest = *(double*) *p_source; *p_source += sizeof(double); } template -inline void GetString(char** p_source, const char* p_dest, T* p_obj, void (T::*p_setter)(const char*)) +inline void GetString(MxU8** p_source, const char* p_dest, T* p_obj, void (T::*p_setter)(const char*)) { - (p_obj->*p_setter)(*p_source); + (p_obj->*p_setter)((char*) *p_source); *p_source += strlen(p_dest) + 1; } diff --git a/LEGO1/mxdsaction.cpp b/LEGO1/mxdsaction.cpp index 3b71011d..36533a1a 100644 --- a/LEGO1/mxdsaction.cpp +++ b/LEGO1/mxdsaction.cpp @@ -205,7 +205,7 @@ void MxDSAction::AppendData(MxU16 p_extraLength, const char* p_extraData) } // FUNCTION: LEGO1 0x100adf70 -void MxDSAction::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSAction::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { MxDSObject::Deserialize(p_source, p_unk0x24); @@ -225,7 +225,7 @@ void MxDSAction::Deserialize(char** p_source, MxS16 p_unk0x24) MxU16 extraLength = GetScalar((MxU16**) p_source); if (extraLength) { - AppendData(extraLength, *p_source); + AppendData(extraLength, (char*) *p_source); *p_source += extraLength; } } diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 041322e7..eb70b18f 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -44,7 +44,7 @@ class MxDSAction : public MxDSObject { } virtual MxU32 GetSizeOnDisk() override; // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24) override; // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; virtual MxLong GetDuration(); // vtable+24; virtual void SetDuration(MxLong p_duration); // vtable+28; virtual MxDSAction* Clone(); // vtable+2c; diff --git a/LEGO1/mxdsbuffer.cpp b/LEGO1/mxdsbuffer.cpp index 23337dda..501cefd6 100644 --- a/LEGO1/mxdsbuffer.cpp +++ b/LEGO1/mxdsbuffer.cpp @@ -130,32 +130,37 @@ MxResult MxDSBuffer::FUN_100c67b0(MxStreamController* p_controller, MxDSAction* } // FUNCTION: LEGO1 0x100c68a0 -MxResult MxDSBuffer::CreateObject(MxStreamController* p_controller, MxU32* p_data, MxDSAction* p_action, undefined4) +MxResult MxDSBuffer::CreateObject( + MxStreamController* p_controller, + MxU32* p_data, + MxDSAction* p_action, + undefined4 p_undefined +) { if (p_data == NULL) { return FAILURE; } - MxCore* header = ReadChunk(p_data, p_action->GetUnknown24()); + MxCore* header = ReadChunk(this, p_data, p_action->GetUnknown24()); if (header == NULL) { return FAILURE; } - switch (*p_data) { - case FOURCC('M', 'x', 'C', 'h'): - if (!m_unk0x30->HasId(((MxStreamChunk*) header)->GetObjectId())) { + if (*p_data == FOURCC('M', 'x', 'O', 'b')) + return StartPresenterFromAction(p_controller, p_action, (MxDSAction*) header); + else if (*p_data == FOURCC('M', 'x', 'C', 'h')) { + MxStreamChunk* chunk = (MxStreamChunk*) header; + if (!m_unk0x30->HasId((chunk)->GetObjectId())) { delete header; return SUCCESS; } - return ParseChunk(p_controller, p_data, p_action, (MxStreamChunk*) header); - case FOURCC('M', 'x', 'O', 'b'): - return StartPresenterFromAction(p_controller, p_action, (MxDSAction*) header); - default: - delete header; - return FAILURE; + return ParseChunk(p_controller, p_data, p_action, p_undefined, chunk); } + + delete header; + return FAILURE; } // FUNCTION: LEGO1 0x100c6960 @@ -201,15 +206,16 @@ MxResult MxDSBuffer::ParseChunk( MxStreamController* p_controller, MxU32* p_data, MxDSAction* p_action, + undefined4, MxStreamChunk* p_header ) { - // TODO STUB + // TODO return FAILURE; } // FUNCTION: LEGO1 0x100c6d00 -MxCore* MxDSBuffer::ReadChunk(MxU32* p_chunkData, MxU16 p_flags) +MxCore* MxDSBuffer::ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags) { // This function reads a chunk. If it is an object, this function returns an MxDSObject. If it is a chunk, returns a // MxDSChunk. @@ -218,16 +224,17 @@ MxCore* MxDSBuffer::ReadChunk(MxU32* p_chunkData, MxU16 p_flags) switch (*p_chunkData) { case FOURCC('M', 'x', 'O', 'b'): - result = DeserializeDSObjectDispatch((char**) &dataStart, p_flags); + result = DeserializeDSObjectDispatch(&dataStart, p_flags); break; case FOURCC('M', 'x', 'C', 'h'): result = new MxStreamChunk(); - if (result != NULL && ((MxStreamChunk*) result)->ReadChunk(this, (MxU8*) p_chunkData) != SUCCESS) { + if (result != NULL && ((MxStreamChunk*) result)->ReadChunk(p_buffer, (MxU8*) p_chunkData) != SUCCESS) { delete result; result = NULL; } - break; + return result; } + return result; } diff --git a/LEGO1/mxdsbuffer.h b/LEGO1/mxdsbuffer.h index c3fcf119..1a37ba2a 100644 --- a/LEGO1/mxdsbuffer.h +++ b/LEGO1/mxdsbuffer.h @@ -34,10 +34,21 @@ class MxDSBuffer : public MxCore { MxResult AllocateBuffer(MxU32 p_bufferSize, MxDSBufferType p_mode); MxResult SetBufferPointer(MxU32* p_buffer, MxU32 p_size); MxResult FUN_100c67b0(MxStreamController* p_controller, MxDSAction* p_action, undefined4*); - MxResult CreateObject(MxStreamController* p_controller, MxU32* p_data, MxDSAction* p_action, undefined4); + MxResult CreateObject( + MxStreamController* p_controller, + MxU32* p_data, + MxDSAction* p_action, + undefined4 p_undefined + ); MxResult StartPresenterFromAction(MxStreamController* p_controller, MxDSAction* p_action1, MxDSAction* p_action2); - MxResult ParseChunk(MxStreamController* p_controller, MxU32* p_data, MxDSAction* p_action, MxStreamChunk* p_header); - MxCore* ReadChunk(MxU32* p_chunkData, MxU16 p_flags); + MxResult ParseChunk( + MxStreamController* p_controller, + MxU32* p_data, + MxDSAction* p_action, + undefined4, + MxStreamChunk* p_header + ); + static MxCore* ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags); MxU8 ReleaseRef(MxDSChunk*); void AddRef(MxDSChunk* p_chunk); void FUN_100c6f80(MxU32 p_writeOffset); diff --git a/LEGO1/mxdschunk.cpp b/LEGO1/mxdschunk.cpp index 16ef1102..b44bc475 100644 --- a/LEGO1/mxdschunk.cpp +++ b/LEGO1/mxdschunk.cpp @@ -7,7 +7,7 @@ MxDSChunk::MxDSChunk() { m_flags = 0; m_data = NULL; - m_objectid = -1; + m_objectId = -1; m_time = 0; m_length = 0; } diff --git a/LEGO1/mxdschunk.h b/LEGO1/mxdschunk.h index ca95440d..ad57fcc4 100644 --- a/LEGO1/mxdschunk.h +++ b/LEGO1/mxdschunk.h @@ -34,7 +34,7 @@ class MxDSChunk : public MxCore { } inline void SetFlags(MxU16 p_flags) { m_flags = p_flags; } - inline void SetObjectId(undefined4 p_objectid) { m_objectid = p_objectid; } + inline void SetObjectId(undefined4 p_objectid) { m_objectId = p_objectid; } inline void SetTime(MxLong p_time) { m_time = p_time; } inline void SetLength(MxU32 p_length) { m_length = p_length; } inline void SetData(MxU8* p_data) { m_data = p_data; } @@ -44,7 +44,7 @@ class MxDSChunk : public MxCore { inline MxU32 GetLength() { return m_length; } inline MxU8* GetData() { return m_data; } - inline undefined4 GetObjectId() { return m_objectid; } + inline undefined4 GetObjectId() { return m_objectId; } inline void Release() { @@ -52,9 +52,9 @@ class MxDSChunk : public MxCore { delete[] m_data; } -private: +protected: MxU16 m_flags; // 0x8 - undefined4 m_objectid; // 0xc + undefined4 m_objectId; // 0xc MxLong m_time; // 0x10 MxU32 m_length; // 0x14 MxU8* m_data; // 0x18 diff --git a/LEGO1/mxdsmediaaction.cpp b/LEGO1/mxdsmediaaction.cpp index d5d7446a..9e07f2d3 100644 --- a/LEGO1/mxdsmediaaction.cpp +++ b/LEGO1/mxdsmediaaction.cpp @@ -80,7 +80,7 @@ MxU32 MxDSMediaAction::GetSizeOnDisk() } // FUNCTION: LEGO1 0x100c8f60 -void MxDSMediaAction::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSMediaAction::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { MxDSAction::Deserialize(p_source, p_unk0x24); diff --git a/LEGO1/mxdsmediaaction.h b/LEGO1/mxdsmediaaction.h index 27965be9..6cddd8c1 100644 --- a/LEGO1/mxdsmediaaction.h +++ b/LEGO1/mxdsmediaaction.h @@ -29,7 +29,7 @@ class MxDSMediaAction : public MxDSAction { } virtual MxU32 GetSizeOnDisk() override; // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24) override; // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; void CopyMediaSrcPath(const char* p_mediaSrcPath); diff --git a/LEGO1/mxdsmultiaction.cpp b/LEGO1/mxdsmultiaction.cpp index 2b3c3801..9108837d 100644 --- a/LEGO1/mxdsmultiaction.cpp +++ b/LEGO1/mxdsmultiaction.cpp @@ -117,7 +117,7 @@ MxU32 MxDSMultiAction::GetSizeOnDisk() } // FUNCTION: LEGO1 0x100ca7b0 -void MxDSMultiAction::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSMultiAction::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { MxDSAction::Deserialize(p_source, p_unk0x24); diff --git a/LEGO1/mxdsmultiaction.h b/LEGO1/mxdsmultiaction.h index 1f9b693b..5003a378 100644 --- a/LEGO1/mxdsmultiaction.h +++ b/LEGO1/mxdsmultiaction.h @@ -29,7 +29,7 @@ class MxDSMultiAction : public MxDSAction { virtual undefined4 VTable0x14() override; // vtable+14; virtual MxU32 GetSizeOnDisk() override; // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24) override; // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; virtual void SetAtomId(MxAtomId p_atomId) override; // vtable+20; virtual MxDSAction* Clone() override; // vtable+2c; virtual void MergeFrom(MxDSAction& p_dsAction) override; // vtable+30; diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 8b31e8c9..fa0b944c 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -127,7 +127,7 @@ MxU32 MxDSObject::GetSizeOnDisk() } // FUNCTION: LEGO1 0x100bfa20 -void MxDSObject::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSObject::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { GetString(p_source, this->m_sourceName, this, &MxDSObject::SetSourceName); GetScalar(p_source, this->m_unk0x14); @@ -138,7 +138,7 @@ void MxDSObject::Deserialize(char** p_source, MxS16 p_unk0x24) } // FUNCTION: LEGO1 0x100bfb30 -MxDSObject* DeserializeDSObjectDispatch(char** p_source, MxS16 p_flags) +MxDSObject* DeserializeDSObjectDispatch(MxU8** p_source, MxS16 p_flags) { MxU16 type = *(MxU16*) *p_source; *p_source += 2; diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index e3fe75e9..a05d319b 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -32,7 +32,7 @@ class MxDSObject : public MxCore { virtual undefined4 VTable0x14(); // vtable+14; virtual MxU32 GetSizeOnDisk(); // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24); // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24); // vtable+1c; inline virtual void SetAtomId(MxAtomId p_atomId) { this->m_atomId = p_atomId; } // vtable+20; inline MxDSType GetType() const { return (MxDSType) this->m_type; } @@ -61,7 +61,7 @@ class MxDSObject : public MxCore { MxPresenter* m_unk0x28; // 0x28 }; -MxDSObject* DeserializeDSObjectDispatch(char**, MxS16); +MxDSObject* DeserializeDSObjectDispatch(MxU8**, MxS16); // FUNCTION: ISLE 0x401c40 // MxDSObject::SetAtomId diff --git a/LEGO1/mxdsselectaction.cpp b/LEGO1/mxdsselectaction.cpp index 10825c54..d064b0f3 100644 --- a/LEGO1/mxdsselectaction.cpp +++ b/LEGO1/mxdsselectaction.cpp @@ -74,7 +74,7 @@ MxU32 MxDSSelectAction::GetSizeOnDisk() } // FUNCTION: LEGO1 0x100cbf60 -void MxDSSelectAction::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSSelectAction::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { MxString string; MxDSAction::Deserialize(p_source, p_unk0x24); @@ -82,7 +82,7 @@ void MxDSSelectAction::Deserialize(char** p_source, MxS16 p_unk0x24) MxU32 extraFlag = *(MxU32*) (*p_source + 4) & 1; *p_source += 12; - this->m_unk0x9c = *p_source; + this->m_unk0x9c = (char*) *p_source; if (!strnicmp(this->m_unk0x9c.GetData(), "RANDOM_", strlen("RANDOM_"))) { char buffer[10]; @@ -93,9 +93,9 @@ void MxDSSelectAction::Deserialize(char** p_source, MxS16 p_unk0x24) string = itoa((MxS16) random, buffer, 10); } else - string = VariableTable()->GetVariable(*p_source); + string = VariableTable()->GetVariable((char*) *p_source); - *p_source += strlen(*p_source) + 1; + *p_source += strlen((char*) *p_source) + 1; MxU32 count = *(MxU32*) *p_source; *p_source += sizeof(MxU32); @@ -106,11 +106,11 @@ void MxDSSelectAction::Deserialize(char** p_source, MxS16 p_unk0x24) MxU32 i; for (i = 0; i < count; i++) { - if (!strcmp(string.GetData(), *p_source)) + if (!strcmp(string.GetData(), (char*) *p_source)) index = i; - this->m_unk0xac->Append(*p_source); - *p_source += strlen(*p_source) + 1; + this->m_unk0xac->Append((char*) *p_source); + *p_source += strlen((char*) *p_source) + 1; } for (i = 0; i < count; i++) { diff --git a/LEGO1/mxdsselectaction.h b/LEGO1/mxdsselectaction.h index 4f41f7d2..e4f09433 100644 --- a/LEGO1/mxdsselectaction.h +++ b/LEGO1/mxdsselectaction.h @@ -29,7 +29,7 @@ class MxDSSelectAction : public MxDSParallelAction { } virtual MxU32 GetSizeOnDisk() override; // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24) override; // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; virtual MxDSAction* Clone() override; // vtable+2c; private: diff --git a/LEGO1/mxdssound.cpp b/LEGO1/mxdssound.cpp index 1ff2a4d1..359ff906 100644 --- a/LEGO1/mxdssound.cpp +++ b/LEGO1/mxdssound.cpp @@ -46,7 +46,7 @@ MxDSAction* MxDSSound::Clone() } // FUNCTION: LEGO1 0x100c95a0 -void MxDSSound::Deserialize(char** p_source, MxS16 p_unk0x24) +void MxDSSound::Deserialize(MxU8** p_source, MxS16 p_unk0x24) { MxDSMediaAction::Deserialize(p_source, p_unk0x24); diff --git a/LEGO1/mxdssound.h b/LEGO1/mxdssound.h index 0eaa5fce..45f93942 100644 --- a/LEGO1/mxdssound.h +++ b/LEGO1/mxdssound.h @@ -27,7 +27,7 @@ class MxDSSound : public MxDSMediaAction { } virtual MxU32 GetSizeOnDisk() override; // vtable+18; - virtual void Deserialize(char** p_source, MxS16 p_unk0x24) override; // vtable+1c; + virtual void Deserialize(MxU8** p_source, MxS16 p_unk0x24) override; // vtable+1c; virtual MxDSAction* Clone() override; // vtable+2c; inline MxS32 GetVolume() const { return m_volume; } diff --git a/LEGO1/mxstreamchunk.cpp b/LEGO1/mxstreamchunk.cpp index d7d15a7a..0b3d22f5 100644 --- a/LEGO1/mxstreamchunk.cpp +++ b/LEGO1/mxstreamchunk.cpp @@ -1,5 +1,6 @@ #include "mxstreamchunk.h" +#include "legoutil.h" #include "mxdsbuffer.h" // FUNCTION: LEGO1 0x100c2fe0 @@ -33,13 +34,15 @@ MxU32 MxStreamChunk::ReadChunkHeader(MxU8* p_chunkData) { MxU32 headersize = 0; if (p_chunkData) { - SetFlags(*(MxU16*) p_chunkData); - SetObjectId(*(MxU32*) (p_chunkData + 2)); - SetTime(*(MxLong*) (p_chunkData + 6)); - SetLength(*(MxU32*) (p_chunkData + 10)); - SetData(p_chunkData + 14); - headersize = (MxU32) (p_chunkData + 14) - (MxU32) p_chunkData; + MxU8* chunkData = p_chunkData; + GetScalar(&p_chunkData, m_flags); + GetScalar(&p_chunkData, m_objectId); + GetScalar(&p_chunkData, m_time); + GetScalar(&p_chunkData, m_length); + m_data = p_chunkData; + headersize = p_chunkData - chunkData; } + return headersize; } diff --git a/LEGO1/mxstreamchunk.h b/LEGO1/mxstreamchunk.h index 72fd4a9f..53cbfc68 100644 --- a/LEGO1/mxstreamchunk.h +++ b/LEGO1/mxstreamchunk.h @@ -35,4 +35,7 @@ class MxStreamChunk : public MxDSChunk { MxDSBuffer* m_buffer; // 0x1c }; +// SYNTHETIC: LEGO1 0x100b20a0 +// MxStreamChunk::`scalar deleting destructor' + #endif // MXSTREAMCHUNK_H