diff --git a/LEGO1/mxdiskstreamprovider.cpp b/LEGO1/mxdiskstreamprovider.cpp index cd1572b5..9555a8cf 100644 --- a/LEGO1/mxdiskstreamprovider.cpp +++ b/LEGO1/mxdiskstreamprovider.cpp @@ -79,7 +79,7 @@ MxU32 MxDiskStreamProvider::GetLengthInDWords() } // OFFSET: LEGO1 0x100d1ec0 -void* MxDiskStreamProvider::GetBufferForDWords() +MxU32* MxDiskStreamProvider::GetBufferForDWords() { return m_pFile->GetBuffer(); } diff --git a/LEGO1/mxdiskstreamprovider.h b/LEGO1/mxdiskstreamprovider.h index 7edd62b4..c35826b8 100644 --- a/LEGO1/mxdiskstreamprovider.h +++ b/LEGO1/mxdiskstreamprovider.h @@ -54,7 +54,7 @@ class MxDiskStreamProvider : public MxStreamProvider virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c virtual void vtable0x20(undefined4 p_unknown1) override; //vtable+0x20 virtual MxU32 GetLengthInDWords() override; //vtable+0x24 - virtual void* GetBufferForDWords()override; //vtable+0x28 + virtual MxU32* GetBufferForDWords()override; //vtable+0x28 private: MxDiskStreamProviderThread m_thread; // 0x10 diff --git a/LEGO1/mxdsfile.cpp b/LEGO1/mxdsfile.cpp index ca6e96fb..d1c87032 100644 --- a/LEGO1/mxdsfile.cpp +++ b/LEGO1/mxdsfile.cpp @@ -81,7 +81,7 @@ MxLong MxDSFile::ReadChunks() } MxULong* pLengthInDWords = &m_lengthInDWords; m_io.Read(pLengthInDWords, 4); - m_pBuffer = malloc(*pLengthInDWords * 4); + m_pBuffer = new MxU32[*pLengthInDWords]; m_io.Read(m_pBuffer, *pLengthInDWords * 4); return 0; } @@ -120,7 +120,7 @@ MxLong MxDSFile::Close() if (m_lengthInDWords != 0) { m_lengthInDWords = 0; - free(m_pBuffer); + delete[] m_pBuffer; m_pBuffer = NULL; } return 0; diff --git a/LEGO1/mxdssource.cpp b/LEGO1/mxdssource.cpp index 4dfb5386..86c4f9fb 100644 --- a/LEGO1/mxdssource.cpp +++ b/LEGO1/mxdssource.cpp @@ -14,7 +14,7 @@ MxLong MxDSSource::GetLengthInDWords() } // OFFSET: LEGO1 0x100c0000 -void *MxDSSource::GetBuffer() +MxU32 *MxDSSource::GetBuffer() { return m_pBuffer; } \ No newline at end of file diff --git a/LEGO1/mxdssource.h b/LEGO1/mxdssource.h index 67cbc6c7..626eaf37 100644 --- a/LEGO1/mxdssource.h +++ b/LEGO1/mxdssource.h @@ -34,11 +34,11 @@ class MxDSSource : public MxCore virtual MxULong GetBufferSize() = 0; virtual MxULong GetStreamBuffersNum() = 0; virtual MxLong GetLengthInDWords(); - virtual void* GetBuffer(); // 0x34 + virtual MxU32* GetBuffer(); // 0x34 protected: MxULong m_lengthInDWords; - void* m_pBuffer; + MxU32* m_pBuffer; MxLong m_position; }; diff --git a/LEGO1/mxramstreamprovider.cpp b/LEGO1/mxramstreamprovider.cpp index 2bfb86d7..1b44d84f 100644 --- a/LEGO1/mxramstreamprovider.cpp +++ b/LEGO1/mxramstreamprovider.cpp @@ -53,7 +53,7 @@ MxU32 MxRAMStreamProvider::GetLengthInDWords() } // OFFSET: LEGO1 0x100d0960 -void* MxRAMStreamProvider::GetBufferForDWords() +MxU32* MxRAMStreamProvider::GetBufferForDWords() { return m_bufferForDWords; } diff --git a/LEGO1/mxramstreamprovider.h b/LEGO1/mxramstreamprovider.h index 3d0bf5aa..48e0dcae 100644 --- a/LEGO1/mxramstreamprovider.h +++ b/LEGO1/mxramstreamprovider.h @@ -14,14 +14,14 @@ class MxRAMStreamProvider : public MxStreamProvider virtual MxU32 GetFileSize() override; //vtable+0x18 virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c virtual MxU32 GetLengthInDWords() override; //vtable+0x24 - virtual void* GetBufferForDWords() override; //vtable+0x28 + virtual MxU32* GetBufferForDWords() override; //vtable+0x28 protected: MxU32 m_bufferSize; MxU32 m_fileSize; void* m_pBufferOfFileSize; MxU32 m_lengthInDWords; - void* m_bufferForDWords; + MxU32* m_bufferForDWords; }; #endif // MXRAMSTREAMPROVIDER_H diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index db2d3931..89b2fa51 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -48,27 +48,21 @@ MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unkno // OFFSET: LEGO1 0x100c1690 MxResult MxStreamController::vtable0x20(MxDSAction* p_action) { - MxResult result; - void* buffer; - MxU32 buffer_value; MxAutoLocker locker(&m_criticalSection); - MxStreamProvider* provider = m_provider; - MxU32 objectId = p_action->GetObjectId(); - if(objectId < provider->GetLengthInDWords()) - { - buffer = provider->GetBufferForDWords(); - buffer_value = *(MxU32 *)((MxU32)buffer + objectId * 4); - } + MxResult result; + MxU32 offset = 0; - if (buffer_value == NULL) - { - result = FAILURE; - } + MxS32 objectId = p_action->GetObjectId(); + MxStreamProvider *provider = m_provider; + + if ((MxS32) provider->GetLengthInDWords() > objectId) + offset = provider->GetBufferForDWords()[objectId]; + + if (offset) + result = vtable0x2c(p_action, offset); else - { - result = vtable0x2c(p_action, buffer_value); - } + result = FAILURE; return result; } diff --git a/LEGO1/mxstreamprovider.h b/LEGO1/mxstreamprovider.h index 7750a506..fb210f80 100644 --- a/LEGO1/mxstreamprovider.h +++ b/LEGO1/mxstreamprovider.h @@ -29,7 +29,7 @@ class MxStreamProvider : public MxCore virtual MxU32 GetStreamBuffersNum() = 0; //vtable+0x1c virtual void vtable0x20(undefined4 p_unknown1); //vtable+0x20 virtual MxU32 GetLengthInDWords() = 0; //vtable+0x24 - virtual void* GetBufferForDWords() = 0; //vtable+0x28 + virtual MxU32* GetBufferForDWords() = 0; //vtable+0x28 protected: void *m_pLookup;