From 590e378f3a26d3cb10ea97c4443b2fb6d2461d14 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 26 Dec 2023 15:25:35 -0500 Subject: [PATCH] Match MxDSBuffer::CalcBytesRemaining --- LEGO1/mxdsbuffer.cpp | 41 ++++++++++++++++++++--------------------- LEGO1/mxstreamchunk.cpp | 6 ++++++ LEGO1/mxstreamchunk.h | 4 +--- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/LEGO1/mxdsbuffer.cpp b/LEGO1/mxdsbuffer.cpp index d3e6ad0c..b3e028d8 100644 --- a/LEGO1/mxdsbuffer.cpp +++ b/LEGO1/mxdsbuffer.cpp @@ -451,32 +451,31 @@ void MxDSBuffer::AddRef(MxDSChunk* p_chunk) MxResult MxDSBuffer::CalcBytesRemaining(MxU8* p_data) { MxResult result = FAILURE; - MxU8* ptr; - MxU32 bytesRead; - if (m_mode == MxDSBufferType_Allocate) { - if (m_bytesRemaining != 0) { - if (m_writeOffset == m_bytesRemaining) { - bytesRead = (*(MxU32*) p_data) + 8; - ptr = p_data; - } - else { - ptr = &p_data[MxStreamChunk::ReturnE() + 8]; - bytesRead = (*(MxU32*) p_data) - MxStreamChunk::ReturnE(); - } + if (m_mode == MxDSBufferType_Allocate && m_bytesRemaining != 0) { + MxU32 bytesRead; + MxU8* ptr; - if (bytesRead <= m_bytesRemaining) { - memcpy(m_pBuffer + (m_writeOffset - m_bytesRemaining), ptr, bytesRead); - if (m_writeOffset == m_bytesRemaining) { - MxU8* buffer = m_pBuffer; - buffer[1] = *MxStreamChunk::ReturnPlus18Ptr((MxU32*) buffer) + MxStreamChunk::ReturnE(); - } + if (m_writeOffset == m_bytesRemaining) { + bytesRead = *(MxU32*) (p_data + 4) + 8; + ptr = p_data; + } + else { + ptr = &p_data[MxStreamChunk::ReturnE() + 8]; + bytesRead = (*(MxU32*) (p_data + 4)) - MxStreamChunk::ReturnE(); + } - result = SUCCESS; - m_bytesRemaining = m_bytesRemaining - bytesRead; - } + if (bytesRead <= m_bytesRemaining) { + memcpy(m_pBuffer + m_writeOffset - m_bytesRemaining, ptr, bytesRead); + + if (m_writeOffset == m_bytesRemaining) + *(MxU32*) (m_pBuffer + 4) = *MxStreamChunk::IntoPlus18(m_pBuffer) + MxStreamChunk::ReturnE(); + + m_bytesRemaining -= bytesRead; + result = SUCCESS; } } + return result; } diff --git a/LEGO1/mxstreamchunk.cpp b/LEGO1/mxstreamchunk.cpp index 389d3abf..0143c06b 100644 --- a/LEGO1/mxstreamchunk.cpp +++ b/LEGO1/mxstreamchunk.cpp @@ -79,3 +79,9 @@ MxU16* MxStreamChunk::IntoFlags(MxU8* p_buffer) { return (MxU16*) (p_buffer + 8); } + +// FUNCTION: LEGO1 0x100c31b0 +MxU32* MxStreamChunk::IntoPlus18(MxU8* p_buffer) +{ + return (MxU32*) (p_buffer + 18); +} diff --git a/LEGO1/mxstreamchunk.h b/LEGO1/mxstreamchunk.h index 60ceb095..bad7c9cc 100644 --- a/LEGO1/mxstreamchunk.h +++ b/LEGO1/mxstreamchunk.h @@ -35,6 +35,7 @@ class MxStreamChunk : public MxDSChunk { void SetBuffer(MxDSBuffer* p_buffer); static MxU16* IntoFlags(MxU8* p_buffer); + static MxU32* IntoPlus18(MxU8* p_buffer); // FUNCTION: LEGO1 0x100c3190 static MxU32* ReturnPlus10Ptr(MxU32* p_chunk) { return p_chunk + 10; } @@ -42,9 +43,6 @@ class MxStreamChunk : public MxDSChunk { // FUNCTION: LEGO1 0x100c31a0 static MxU32* ReturnPlus14Ptr(MxU32* p_chunk) { return p_chunk + 14; } - // FUNCTION: LEGO1 0x100c31b0 - static MxU32* ReturnPlus18Ptr(MxU32* p_chunk) { return p_chunk + 18; } - private: MxDSBuffer* m_buffer; // 0x1c };