diff options
| author | briaguya <70942617+briaguya0@users.noreply.github.com> | 2026-07-24 18:09:55 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-24 18:09:55 -0400 |
| commit | 4cae44160693e1beb562e39dc301bd42278be1f9 (patch) | |
| tree | 5d247f7821a6040221b4bf34d2cae2b87c42d23a /src/utils/Decompressor.cpp | |
| parent | cd33252589a61d044138f449041a87adee2a8291 (diff) | |
oot support (#219)
Diffstat (limited to 'src/utils/Decompressor.cpp')
| -rw-r--r-- | src/utils/Decompressor.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
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 <libmio0/mio0.h> #include <libyay0/yay0.h> #include <libyay0/yay1.h> +#include <libyaz0/yaz0.h> #include <libmio0/tkmk00.h> } @@ -92,6 +93,17 @@ DataChunk* Decompressor::Decode(const std::vector<uint8_t>& 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<uint8_t> 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<uint8_t> 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<size_t> } 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 = |
