From 0d8caf3d3497e86ed612a6474c7a7d2323e38cad Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 10 Jan 2024 06:13:54 -0500 Subject: [PATCH] Changes --- LEGO1/omni/include/mxramstreamprovider.h | 2 +- LEGO1/omni/src/stream/mxramstreamprovider.cpp | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/LEGO1/omni/include/mxramstreamprovider.h b/LEGO1/omni/include/mxramstreamprovider.h index f05088af..f5ac0897 100644 --- a/LEGO1/omni/include/mxramstreamprovider.h +++ b/LEGO1/omni/include/mxramstreamprovider.h @@ -42,6 +42,6 @@ class MxRAMStreamProvider : public MxStreamProvider { // SYNTHETIC: LEGO1 0x100d0a30 // MxRAMStreamProvider::`scalar deleting destructor' -MxU32 __cdecl ReadData(MxU8* p_fileSizeBuffer, MxU32 p_fileSize); +MxU32 ReadData(MxU8* p_fileSizeBuffer, MxU32 p_fileSize); #endif // MXRAMSTREAMPROVIDER_H diff --git a/LEGO1/omni/src/stream/mxramstreamprovider.cpp b/LEGO1/omni/src/stream/mxramstreamprovider.cpp index ba28a596..232e347b 100644 --- a/LEGO1/omni/src/stream/mxramstreamprovider.cpp +++ b/LEGO1/omni/src/stream/mxramstreamprovider.cpp @@ -99,27 +99,31 @@ MxResult MxRAMStreamProvider::SetResourceToGet(MxStreamController* p_resource) } // FUNCTION: LEGO1 0x100d0d80 -MxU32 __cdecl ReadData(MxU8* p_buffer, MxU32 p_size) +MxU32 ReadData(MxU8* p_buffer, MxU32 p_size) { MxU32 id; MxU8* data = p_buffer; MxU8* end = p_buffer + p_size; MxU8* data2; + if (p_buffer < end) { do { - if (*MxDSChunk::IntoType(data) == 'bOxM') { + if (*MxDSChunk::IntoType(data) == FOURCC('M', 'x', 'O', 'b')) { data2 = data; data += 8; + MxDSObject* obj = DeserializeDSObjectDispatch(&data, -1); id = obj->GetObjectId(); delete obj; + data = MxDSChunk::End(data2); while (data < end) { - if ((*MxDSChunk::IntoType(data) == 'hCxM')) { + if (*MxDSChunk::IntoType(data) == FOURCC('M', 'x', 'C', 'h')) { MxU8* data3 = data; MxU32* psize = MxDSChunk::IntoLength(data); data += MxDSChunk::Size(*psize); - if ((*MxDSChunk::IntoType(data2) == 'hCxM') && + + if ((*MxDSChunk::IntoType(data2) == FOURCC('M', 'x', 'C', 'h')) && (*MxStreamChunk::IntoFlags(data2) & MxDSChunk::Flag_Split)) { if (*MxStreamChunk::IntoObjectId(data2) == *MxStreamChunk::IntoObjectId(data3) && (*MxStreamChunk::IntoFlags(data3) & MxDSChunk::Flag_Split) && @@ -130,8 +134,10 @@ MxU32 __cdecl ReadData(MxU8* p_buffer, MxU32 p_size) else *MxStreamChunk::IntoFlags(data2) &= ~MxDSChunk::Flag_Split; } + data2 += MxDSChunk::Size(*MxDSChunk::IntoLength(data2)); memcpy(data2, data3, MxDSChunk::Size(*psize)); + if (*MxStreamChunk::IntoObjectId(data2) == id && (*MxStreamChunk::IntoFlags(data2) & MxDSChunk::Flag_End)) break; @@ -144,6 +150,7 @@ MxU32 __cdecl ReadData(MxU8* p_buffer, MxU32 p_size) data++; } while (data < end); } + *MxStreamChunk::IntoFlags(data2) &= ~MxDSChunk::Flag_Split; return MxDSChunk::End(data2) - p_buffer; }