From 5c32fc9b8c3c75e726fe72dda2f9bf450bad58a7 Mon Sep 17 00:00:00 2001 From: Ishotihadus Date: Sun, 30 Sep 2018 22:11:58 +0900 Subject: [PATCH] support UnityWeb assets --- lib/mikunyan/asset_bundle.rb | 32 +++++++++++++++++++++++++++----- mikunyan.gemspec | 1 + 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/mikunyan/asset_bundle.rb b/lib/mikunyan/asset_bundle.rb index 314c167..0236b4f 100644 --- a/lib/mikunyan/asset_bundle.rb +++ b/lib/mikunyan/asset_bundle.rb @@ -1,4 +1,5 @@ require 'extlz4' +require 'extlzma' module Mikunyan # Class for representing Unity AssetBundle @@ -37,21 +38,38 @@ module Mikunyan case @signature when 'UnityRaw' - load_unity_raw(br) + load_unity_raw(br, false) when 'UnityFS' load_unity_fs(br) + when 'UnityWeb' + if @format <= 3 + load_unity_raw(br, true) + else + load_unity_fs(br) + end else - warn("Unknown signature: #{@signature}") + raise("Unknown signature: #{@signature}") end end - def load_unity_raw(br) + def load_unity_raw(br, compressed) @assets = [] file_size = br.i32u header_size = br.i32u - br.jmp(header_size) + if compressed + br.adv(4) + block_count = br.i32u + blocks = block_count.times.map{{ :c => br.i32u, :u => br.i32u }} + br.jmp(header_size) + data = String.new + blocks.each{|b| data << LZMA.decode(br.read(b[:c]))} + br = BinaryReader.new(data) + else + br.jmp(header_size) + end + asset_count = br.i32u asset_count.times do asset_pos = br.pos @@ -99,8 +117,12 @@ module Mikunyan case flags & 0x3f when 0 block + # when 1 + # LZMA when 2, 3 - LZ4::raw_decode(block, max_dest_size) + LZ4.raw_decode(block, max_dest_size) + # when 4 + # LZHMA else warn("Unknown compression flag: #{@flags}") block diff --git a/mikunyan.gemspec b/mikunyan.gemspec index 8f4586a..68ce8fb 100644 --- a/mikunyan.gemspec +++ b/mikunyan.gemspec @@ -23,6 +23,7 @@ Gem::Specification.new do |spec| spec.extensions = ["ext/decoders/native/extconf.rb"] spec.add_dependency 'extlz4', '~> 0' + spec.add_dependency 'extlzma', '~> 0' spec.add_dependency 'bin_utils', '~> 0' spec.add_dependency 'chunky_png', '~> 1' spec.add_dependency 'json', '~> 2'