From 1655d229cfdfbd5f792a7c3e84adc862653f70a7 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sun, 20 Feb 2022 16:03:38 -0800 Subject: [PATCH] Fixes to get Metaforce booting again! --- Runtime/CFactoryMgr.cpp | 16 ++++++++-------- Runtime/CFactoryMgr.hpp | 8 ++++---- Runtime/Character/CSkinRules.cpp | 4 ++-- Runtime/Character/CSkinRules.hpp | 4 ++-- Runtime/Streams/CInputStream.cpp | 27 ++++++++++++++------------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/Runtime/CFactoryMgr.cpp b/Runtime/CFactoryMgr.cpp index c391f9eb1..c140a039c 100644 --- a/Runtime/CFactoryMgr.cpp +++ b/Runtime/CFactoryMgr.cpp @@ -21,16 +21,16 @@ constexpr std::array TypeTable{ CFactoryFnReturn CFactoryMgr::MakeObject(const SObjectTag& tag, metaforce::CInputStream& in, const CVParamTransfer& paramXfer, CObjectReference* selfRef) { - auto search = m_factories.find(tag.type); - if (search == m_factories.end()) + auto search = x10_factories.find(tag.type); + if (search == x10_factories.end()) return {}; return search->second(tag, in, paramXfer, selfRef); } bool CFactoryMgr::CanMakeMemory(const metaforce::SObjectTag& tag) const { - auto search = m_memFactories.find(tag.type); - return search != m_memFactories.cend(); + auto search = x24_memFactories.find(tag.type); + return search != x24_memFactories.cend(); } CFactoryFnReturn CFactoryMgr::MakeObjectFromMemory(const SObjectTag& tag, std::unique_ptr&& buf, int size, @@ -39,8 +39,8 @@ CFactoryFnReturn CFactoryMgr::MakeObjectFromMemory(const SObjectTag& tag, std::u OPTICK_EVENT(); std::unique_ptr localBuf = std::move(buf); - const auto memFactoryIter = m_memFactories.find(tag.type); - if (memFactoryIter != m_memFactories.cend()) { + const auto memFactoryIter = x24_memFactories.find(tag.type); + if (memFactoryIter != x24_memFactories.cend()) { if (compressed) { std::unique_ptr compRead = std::make_unique(localBuf.get(), size, CMemoryInStream::EOwnerShip::NotOwned); @@ -53,8 +53,8 @@ CFactoryFnReturn CFactoryMgr::MakeObjectFromMemory(const SObjectTag& tag, std::u return memFactoryIter->second(tag, std::move(localBuf), size, paramXfer, selfRef); } } else { - const auto factoryIter = m_factories.find(tag.type); - if (factoryIter == m_factories.end()) { + const auto factoryIter = x10_factories.find(tag.type); + if (factoryIter == x10_factories.end()) { return {}; } diff --git a/Runtime/CFactoryMgr.hpp b/Runtime/CFactoryMgr.hpp index 689dc719a..058203051 100644 --- a/Runtime/CFactoryMgr.hpp +++ b/Runtime/CFactoryMgr.hpp @@ -12,8 +12,8 @@ class CVParamTransfer; class IObj; class CFactoryMgr { - std::unordered_map m_factories; - std::unordered_map m_memFactories; + std::unordered_map x10_factories; + std::unordered_map x24_memFactories; public: CFactoryFnReturn MakeObject(const SObjectTag& tag, metaforce::CInputStream& in, const CVParamTransfer& paramXfer, @@ -21,8 +21,8 @@ public: bool CanMakeMemory(const metaforce::SObjectTag& tag) const; CFactoryFnReturn MakeObjectFromMemory(const SObjectTag& tag, std::unique_ptr&& buf, int size, bool compressed, const CVParamTransfer& paramXfer, CObjectReference* selfRef); - void AddFactory(FourCC key, FFactoryFunc func) { m_factories.insert_or_assign(key, std::move(func)); } - void AddFactory(FourCC key, FMemFactoryFunc func) { m_memFactories.insert_or_assign(key, std::move(func)); } + void AddFactory(FourCC key, FFactoryFunc func) { x10_factories.insert_or_assign(key, std::move(func)); } + void AddFactory(FourCC key, FMemFactoryFunc func) { x24_memFactories.insert_or_assign(key, std::move(func)); } enum class ETypeTable : u8 { CLSN, diff --git a/Runtime/Character/CSkinRules.cpp b/Runtime/Character/CSkinRules.cpp index f05e1a21d..c2ae2c722 100644 --- a/Runtime/Character/CSkinRules.cpp +++ b/Runtime/Character/CSkinRules.cpp @@ -7,8 +7,8 @@ namespace metaforce { static u32 ReadCount(CInputStream& in) { - u32 result = in.ReadLong(); - if (result == UINT32_MAX) { + s32 result = in.ReadLong(); + if (result == -1) { return in.ReadLong(); } u8 junk[784]; diff --git a/Runtime/Character/CSkinRules.hpp b/Runtime/Character/CSkinRules.hpp index 732166a07..817c68df6 100644 --- a/Runtime/Character/CSkinRules.hpp +++ b/Runtime/Character/CSkinRules.hpp @@ -32,8 +32,8 @@ public: class CSkinRules { std::vector x0_bones; - u32 x10_vertexCount; - u32 x14_normalCount; + u32 x10_vertexCount = 0; + u32 x14_normalCount = 0; public: explicit CSkinRules(CInputStream& in); diff --git a/Runtime/Streams/CInputStream.cpp b/Runtime/Streams/CInputStream.cpp index f6853ca23..d3664a38b 100644 --- a/Runtime/Streams/CInputStream.cpp +++ b/Runtime/Streams/CInputStream.cpp @@ -31,29 +31,30 @@ bool CInputStream::InternalReadNext() { bool CInputStream::GrabAnotherBlock() { return InternalReadNext(); } void CInputStream::Get(u8* dest, u32 len) { - u32 readLen = 0; x20_bitOffset = 0; + u32 readCount = 0; while (len != 0) { u32 blockLen = x8_blockLen - x4_blockOffset; if (len < blockLen) { blockLen = len; } - - if (blockLen != 0) { - memcpy(dest + readLen, x10_ptr + x4_blockOffset, blockLen); - len -= blockLen; - readLen += blockLen; - x4_blockOffset += blockLen; - } else if (len > 256) { - u32 tmp = Read(dest + readLen, len); - len -= tmp; - readLen += tmp; + if (blockLen == 0) { + if (len <= 256) { + GrabAnotherBlock(); + } else { + u32 readLen = Read(dest + readCount, len); + len -= readLen; + readCount += readLen; + } } else { - GrabAnotherBlock(); + memcpy(dest + readCount, x10_ptr + x4_blockOffset, blockLen); + len -= blockLen; + readCount += blockLen; + x4_blockOffset += blockLen; } } - x18_readPosition += readLen; + x18_readPosition += readCount; } u32 CInputStream::ReadBytes(void* dest, u32 len) {