From 4cae44160693e1beb562e39dc301bd42278be1f9 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya0@users.noreply.github.com> Date: Fri, 24 Jul 2026 18:09:55 -0400 Subject: oot support (#219) --- src/utils/Decompressor.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src/utils/Decompressor.cpp') diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index c591f6c..c787282 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -10,6 +10,7 @@ extern "C" { #include #include #include +#include #include } @@ -92,6 +93,17 @@ DataChunk* Decompressor::Decode(const std::vector& buffer, const uint32 " compressed size 0x" + Torch::to_hex(in_size, false) + ")"); } } + case CompressionType::YAZ0: { + uint32_t size = 0; + uint8_t* decompressed = yaz0_decode(in_buf, &size); + + if (!decompressed) { + throw std::runtime_error("Failed to decode YAZ0"); + } + + gCachedChunks[offset] = new DataChunk{ decompressed, size }; + return gCachedChunks[offset]; + } default: throw std::runtime_error("Unknown compression type"); } @@ -196,7 +208,8 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector switch (type) { case CompressionType::YAY0: case CompressionType::YAY1: - case CompressionType::MIO0: { + case CompressionType::MIO0: + case CompressionType::YAZ0: { offset = ASSET_PTR(offset); auto decoded = Decode(buffer, fileOffset, type); @@ -246,9 +259,6 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector offset, fileOffset, offsetFromFile, sizeEntry.value(), decoded->size, size); return { .root = decoded, .segment = { decoded->data + offsetFromFile, size } }; } - case CompressionType::YAZ0: - throw std::runtime_error( - "Found compressed yaz0 segment.\nDecompression of yaz0 has not been implemented yet."); case CompressionType::None: // The data does not have compression { fileOffset = TranslateAddr(offset, false); @@ -293,7 +303,7 @@ DecompressedData Decompressor::AutoDecode(uint32_t offset, std::optional } uint32_t Decompressor::TranslateAddr(uint32_t addr, bool baseAddress) { - if (IS_SEGMENTED(addr)) { + if (IS_SEGMENTED(addr) || IS_VIRTUAL_SEGMENT(addr)) { const auto segment = Companion::Instance->GetFileOffsetFromSegmentedAddr(SEGMENT_NUMBER(addr)); if (!segment.has_value()) { const auto compressedSegmentPair = -- cgit v1.2.3