diff options
Diffstat (limited to 'src/utils')
| -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 = |
