format codes
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
require "bundler/gem_tasks"
|
||||
require "rake/extensiontask"
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'bundler/gem_tasks'
|
||||
require 'rake/extensiontask'
|
||||
|
||||
task :scream do
|
||||
puts "みくは自分を曲げないよ!"
|
||||
puts 'みくは自分を曲げないよ!'
|
||||
end
|
||||
|
||||
task :build => :compile
|
||||
task build: :compile
|
||||
|
||||
Rake::ExtensionTask.new('decoders/native') do |ext|
|
||||
ext.lib_dir = 'lib/mikunyan'
|
||||
end
|
||||
|
||||
task :default => [:clobber, :compile, :spec]
|
||||
task default: %i[clobber compile spec]
|
||||
|
||||
+9
-7
@@ -1,11 +1,13 @@
|
||||
require "mikunyan/version"
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "mikunyan/asset_bundle"
|
||||
require "mikunyan/asset"
|
||||
require "mikunyan/binary_reader"
|
||||
require "mikunyan/object_value"
|
||||
require "mikunyan/type_tree"
|
||||
require "mikunyan/constants"
|
||||
require 'mikunyan/version'
|
||||
|
||||
require 'mikunyan/asset_bundle'
|
||||
require 'mikunyan/asset'
|
||||
require 'mikunyan/binary_reader'
|
||||
require 'mikunyan/object_value'
|
||||
require 'mikunyan/type_tree'
|
||||
require 'mikunyan/constants'
|
||||
|
||||
# Module for deserializing Unity Assets and AssetBundles
|
||||
module Mikunyan
|
||||
|
||||
+22
-22
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Mikunyan
|
||||
# Class for representing Unity Asset
|
||||
# @attr_reader [String] name Asset name
|
||||
@@ -53,23 +55,23 @@ module Mikunyan
|
||||
# @param [String] name Asset name (automatically generated if not specified)
|
||||
# @return [Mikunyan::Asset] deserialized Asset object
|
||||
def self.file(file, name = nil)
|
||||
name = File.basename(name, '.*') unless name
|
||||
name ||= File.basename(name, '.*')
|
||||
Asset.load(File.binread(file), name)
|
||||
end
|
||||
|
||||
# Returns list of all path IDs
|
||||
# @return [Array<Integer>] list of all path IDs
|
||||
def path_ids
|
||||
@objects.map{|e| e.path_id}
|
||||
@objects.map(&:path_id)
|
||||
end
|
||||
|
||||
# Returns list of containers
|
||||
# @return [Array<Hash>,nil] list of all containers
|
||||
def containers
|
||||
obj = parse_object(1)
|
||||
return nil unless obj && obj.m_Container && obj.m_Container.array?
|
||||
return nil unless obj&.m_Container && obj.m_Container.array?
|
||||
obj.m_Container.value.map do |e|
|
||||
{:name => e.first.value, :preload_index => e.second.preloadIndex.value, :path_id => e.second.asset.m_PathID.value}
|
||||
{ name: e.first.value, preload_index: e.second.preloadIndex.value, path_id: e.second.asset.m_PathID.value }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -113,12 +115,10 @@ module Mikunyan
|
||||
return nil
|
||||
end
|
||||
klass = (obj.class_idx ? @klasses[obj.class_idx] : @klasses.find{|e| e.class_id == obj.class_id} || @klasses.find{|e| e.class_id == obj.type_id})
|
||||
if klass && klass.type_tree && klass.type_tree.nodes[0]
|
||||
if klass&.type_tree && klass.type_tree.nodes[0]
|
||||
klass.type_tree.nodes[0].type
|
||||
elsif klass
|
||||
Mikunyan::CLASS_ID[klass.class_id]
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -153,10 +153,10 @@ module Mikunyan
|
||||
class_id = br.i32
|
||||
br.adv(1)
|
||||
script_id = br.i16
|
||||
if class_id < 0 || class_id == 114
|
||||
hash = br.read(32)
|
||||
hash = if class_id < 0 || class_id == 114
|
||||
br.read(32)
|
||||
else
|
||||
hash = br.read(16)
|
||||
br.read(16)
|
||||
end
|
||||
@klasses << Klass.new(class_id, script_id, hash, has_type_trees ? TypeTree.load(br) : TypeTree.load_default(hash))
|
||||
end
|
||||
@@ -165,10 +165,10 @@ module Mikunyan
|
||||
type_tree_count = br.i32u
|
||||
type_tree_count.times do
|
||||
class_id = br.i32
|
||||
if class_id < 0
|
||||
hash = br.read(32)
|
||||
hash = if class_id < 0
|
||||
br.read(32)
|
||||
else
|
||||
hash = br.read(16)
|
||||
br.read(16)
|
||||
end
|
||||
@klasses << Klass.new(class_id, nil, hash, has_type_trees ? TypeTree.load(br) : TypeTree.load_default(hash))
|
||||
end
|
||||
@@ -190,10 +190,10 @@ module Mikunyan
|
||||
path_id = long_object_ids ? br.i64 : br.i32
|
||||
offset = br.i32u
|
||||
size = br.i32u
|
||||
if @format >= 17
|
||||
@objects << ObjectData.new(path_id, offset, size, nil, nil, br.i32u, @format <= 10 && br.i16 != 0)
|
||||
@objects << if @format >= 17
|
||||
ObjectData.new(path_id, offset, size, nil, nil, br.i32u, @format <= 10 && br.i16 != 0)
|
||||
else
|
||||
@objects << ObjectData.new(path_id, offset, size, br.i32, br.i16, nil, @format <= 10 && br.i16 != 0)
|
||||
ObjectData.new(path_id, offset, size, br.i32, br.i16, nil, @format <= 10 && br.i16 != 0)
|
||||
end
|
||||
br.adv(2) if 11 <= @format && @format <= 16
|
||||
br.adv(1) if 15 <= @format && @format <= 16
|
||||
@@ -231,10 +231,10 @@ module Mikunyan
|
||||
data = nil
|
||||
size = parse_object_private(br, children.find{|e| e[:name] == 'size'}).value
|
||||
data_type_tree = children.find{|e| e[:name] == 'data'}
|
||||
if node.type == 'TypelessData'
|
||||
data = br.read(size * data_type_tree[:node].size)
|
||||
data = if node.type == 'TypelessData'
|
||||
br.read(size * data_type_tree[:node].size)
|
||||
else
|
||||
data = size.times.map{ parse_object_private(br, data_type_tree) }
|
||||
size.times.map{parse_object_private(br, data_type_tree)}
|
||||
end
|
||||
r = ObjectValue.new(node.name, node.type, br.endian, data)
|
||||
elsif node.size == -1
|
||||
@@ -242,7 +242,7 @@ module Mikunyan
|
||||
if children.size == 1 && children[0][:name] == 'Array' && children[0][:node].type == 'Array' && children[0][:node].array?
|
||||
if node.type == 'string'
|
||||
size = parse_object_private(br, children[0][:children].find{|e| e[:name] == 'size'}).value
|
||||
r.value = br.read(size * children[0][:children].find{|e| e[:name] == 'data'}[:node].size).force_encoding("utf-8")
|
||||
r.value = br.read(size * children[0][:children].find{|e| e[:name] == 'data'}[:node].size).force_encoding('utf-8')
|
||||
br.align(4) if children[0][:node].flags & 0x4000 != 0
|
||||
else
|
||||
r.value = parse_object_private(br, children[0]).value
|
||||
@@ -255,7 +255,7 @@ module Mikunyan
|
||||
r[child[:name]] = parse_object_private(br, child)
|
||||
end
|
||||
end
|
||||
elsif children.size > 0
|
||||
elsif !children.empty?
|
||||
pos = br.pos
|
||||
r = ObjectValue.new(node.name, node.type, br.endian)
|
||||
r.is_struct = true
|
||||
@@ -326,7 +326,7 @@ module Mikunyan
|
||||
tree = {}
|
||||
stack = []
|
||||
nodes.each do |node|
|
||||
this = {:name => node.name, :node => node, :children => []}
|
||||
this = { name: node.name, node: node, children: [] }
|
||||
if node.depth == 0
|
||||
tree = this
|
||||
else
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'extlz4'
|
||||
require 'extlzma'
|
||||
|
||||
@@ -61,9 +63,9 @@ module Mikunyan
|
||||
if compressed
|
||||
br.adv(4)
|
||||
block_count = br.i32u
|
||||
blocks = block_count.times.map{{ :c => br.i32u, :u => br.i32u }}
|
||||
blocks = block_count.times.map{{ c: br.i32u, u: br.i32u }}
|
||||
br.jmp(header_size)
|
||||
data = String.new
|
||||
data = ''
|
||||
blocks.each{|b| data << LZMA.decode(br.read(b[:c]))}
|
||||
br = BinaryReader.new(data)
|
||||
else
|
||||
@@ -96,13 +98,13 @@ module Mikunyan
|
||||
|
||||
blocks = []
|
||||
block_count = head.i32u
|
||||
block_count.times{ blocks << {:u => head.i32u, :c => head.i32u, :f => head.i16u} }
|
||||
block_count.times{blocks << { u: head.i32u, c: head.i32u, f: head.i16u }}
|
||||
|
||||
asset_blocks = []
|
||||
asset_count = head.i32u
|
||||
asset_count.times{ asset_blocks << {:offset => head.i64u, :size => head.i64u, :status => head.i32, :name => head.cstr} }
|
||||
asset_count.times{asset_blocks << { offset: head.i64u, size: head.i64u, status: head.i32, name: head.cstr }}
|
||||
|
||||
raw_data = String.new
|
||||
raw_data = ''
|
||||
blocks.each{|b| raw_data << uncompress(br.read(b[:c]), b[:u], b[:f])}
|
||||
|
||||
asset_blocks.each do |b|
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'bin_utils'
|
||||
|
||||
module Mikunyan
|
||||
@@ -62,7 +64,7 @@ module Mikunyan
|
||||
# Read string until null character
|
||||
# @return [String] string
|
||||
def cstr
|
||||
r = @data.unpack("@#{pos}Z*")[0]
|
||||
r = @data.unpack1("@#{pos}Z*")
|
||||
@pos += r.bytesize + 1
|
||||
r
|
||||
end
|
||||
@@ -145,14 +147,14 @@ module Mikunyan
|
||||
|
||||
# Read 32bit floating point value
|
||||
def float
|
||||
r = little? ? @data.byteslice(@pos, 4).unpack('e')[0] : @data.byteslice(@pos, 4).unpack('g')[0]
|
||||
r = little? ? @data.byteslice(@pos, 4).unpack1('e') : @data.byteslice(@pos, 4).unpack1('g')
|
||||
@pos += 4
|
||||
r
|
||||
end
|
||||
|
||||
# Read 64bit floating point value
|
||||
def double
|
||||
r = little? ? @data.byteslice(@pos, 8).unpack('E')[0] : @data.byteslice(@pos, 8).unpack('G')[0]
|
||||
r = little? ? @data.byteslice(@pos, 8).unpack1('E') : @data.byteslice(@pos, 8).unpack1('G')
|
||||
@pos += 8
|
||||
r
|
||||
end
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Mikunyan
|
||||
private
|
||||
|
||||
STRING_TABLE = {
|
||||
0 => 'AABB',
|
||||
5 => 'AnimationClip',
|
||||
@@ -101,7 +104,7 @@ module Mikunyan
|
||||
1006 => 'Vector4f',
|
||||
1015 => 'm_ScriptingClassIdentifier',
|
||||
1042 => 'Gradient'
|
||||
}
|
||||
}.freeze
|
||||
|
||||
CLASS_ID = {
|
||||
1 => 'GameObject',
|
||||
@@ -340,5 +343,5 @@ module Mikunyan
|
||||
1112 => 'SubstanceImporter',
|
||||
1113 => 'LightmapParameters',
|
||||
1120 => 'LightmapSnapshot'
|
||||
}
|
||||
}.freeze
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'mikunyan/decoders/image_decoder'
|
||||
|
||||
module Mikunyan
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
begin; require 'oily_png'; rescue LoadError; require 'chunky_png'; end
|
||||
# frozen_string_literal: true
|
||||
|
||||
begin
|
||||
require 'oily_png'
|
||||
rescue LoadError
|
||||
require 'chunky_png'
|
||||
end
|
||||
require 'bin_utils'
|
||||
require 'mikunyan/decoders/native'
|
||||
|
||||
@@ -23,7 +29,7 @@ module Mikunyan
|
||||
bin = bin.value
|
||||
fmt = fmt.value
|
||||
|
||||
if bin.size == 0 && object['m_StreamData']
|
||||
if bin.empty? && object['m_StreamData']
|
||||
bin = object['m_StreamData'].value
|
||||
return nil unless bin
|
||||
end
|
||||
@@ -89,8 +95,6 @@ module Mikunyan
|
||||
decode_rg16(width, height, bin)
|
||||
when 63
|
||||
decode_r8(width, height, bin)
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -315,7 +319,7 @@ module Mikunyan
|
||||
mem = String.new(capacity: width * height * 3)
|
||||
unpackstr = endian == :little ? 'e' : 'g'
|
||||
(width * height).times do |i|
|
||||
c = f2i(bin.byteslice(i*4, 4).unpack(unpackstr)[0])
|
||||
c = f2i(bin.byteslice(i * 4, 4).unpack1(unpackstr))
|
||||
BinUtils.append_int8!(mem, c, c, c)
|
||||
end
|
||||
ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
|
||||
@@ -435,13 +439,11 @@ module Mikunyan
|
||||
bin = bin.value if bin.class == ObjectValue
|
||||
if width && height && fmt && astc_list[fmt]
|
||||
header = "\x13\xAB\xA1\x5C".force_encoding('ascii-8bit')
|
||||
header << [astc_list[fmt], astc_list[fmt], 1].pack("C*")
|
||||
header << [width].pack("V").byteslice(0, 3)
|
||||
header << [height].pack("V").byteslice(0, 3)
|
||||
header << [astc_list[fmt], astc_list[fmt], 1].pack('C*')
|
||||
header << [width].pack('V').byteslice(0, 3)
|
||||
header << [height].pack('V').byteslice(0, 3)
|
||||
header << "\x01\x00\x00"
|
||||
header + bin
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Mikunyan
|
||||
# Class for representing decoded object
|
||||
# @attr [String] name object name
|
||||
@@ -81,12 +83,12 @@ module Mikunyan
|
||||
# Return value of called key
|
||||
# @param [String] name key
|
||||
# @return [Object] value
|
||||
def method_missing(name, *args)
|
||||
def method_missing(name, *_args)
|
||||
@attr[name.to_s]
|
||||
end
|
||||
|
||||
# Implementation of respond_to_missing?
|
||||
def respond_to_missing?(symbol, include_private)
|
||||
def respond_to_missing?(symbol, _include_private)
|
||||
@attr.key?(symbol.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Mikunyan
|
||||
# Class for representing TypeTree
|
||||
# @attr [Array<Mikunyan::TypeTree::Node>] nodes list of all nodes
|
||||
@@ -27,15 +29,15 @@ module Mikunyan
|
||||
end
|
||||
buffer = br.read(buffer_size)
|
||||
nodes.each do |n|
|
||||
if n.type >= 0
|
||||
n.type = buffer.unpack("@#{n.type}Z*")[0]
|
||||
n.type = if n.type >= 0
|
||||
buffer.unpack1("@#{n.type}Z*")
|
||||
else
|
||||
n.type = Mikunyan::STRING_TABLE[n.type + 2**31]
|
||||
Mikunyan::STRING_TABLE[n.type + 2**31]
|
||||
end
|
||||
if n.name >= 0
|
||||
n.name = buffer.unpack("@#{n.name}Z*")[0]
|
||||
n.name = if n.name >= 0
|
||||
buffer.unpack1("@#{n.name}Z*")
|
||||
else
|
||||
n.name = Mikunyan::STRING_TABLE[n.name + 2**31]
|
||||
Mikunyan::STRING_TABLE[n.name + 2**31]
|
||||
end
|
||||
end
|
||||
r = TypeTree.new
|
||||
@@ -49,7 +51,7 @@ module Mikunyan
|
||||
def self.load_legacy(br)
|
||||
nodes = []
|
||||
stack = [0]
|
||||
while stack.size > 0
|
||||
until stack.empty?
|
||||
depth = stack.pop
|
||||
type = br.cstr
|
||||
name = br.cstr
|
||||
@@ -71,7 +73,7 @@ module Mikunyan
|
||||
# @param [String] hash
|
||||
# @return [Mikunyan::TypeTree,nil] created TypeTree
|
||||
def self.load_default(hash)
|
||||
hash_str = hash.unpack('H*')[0]
|
||||
hash_str = hash.unpack1('H*')
|
||||
file = File.expand_path("../typetrees/#{hash_str}.dat", __FILE__)
|
||||
return nil unless File.file?(file)
|
||||
r = TypeTree.new
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Mikunyan
|
||||
# version string
|
||||
VERSION = "3.9.6"
|
||||
VERSION = '3.9.6'
|
||||
end
|
||||
|
||||
+17
-16
@@ -1,31 +1,32 @@
|
||||
# coding: utf-8
|
||||
lib = File.expand_path("../lib", __FILE__)
|
||||
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||
require "mikunyan/version"
|
||||
# frozen_string_literal: true
|
||||
|
||||
lib = File.expand_path('lib', __dir__)
|
||||
$:.unshift(lib) unless $:.include?(lib)
|
||||
require 'mikunyan/version'
|
||||
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = "mikunyan"
|
||||
spec.name = 'mikunyan'
|
||||
spec.version = Mikunyan::VERSION
|
||||
spec.authors = ["Ishotihadus"]
|
||||
spec.email = ["hanachan.pao@gmail.com"]
|
||||
spec.authors = ['Ishotihadus']
|
||||
spec.email = ['hanachan.pao@gmail.com']
|
||||
|
||||
spec.summary = "Unity asset deserializer for Ruby"
|
||||
spec.description = "Library to deserialize Unity assetbundles and assets."
|
||||
spec.homepage = "https://github.com/Ishotihadus/mikunyan"
|
||||
spec.license = "MIT"
|
||||
spec.summary = 'Unity asset deserializer for Ruby'
|
||||
spec.description = 'Library to deserialize Unity assetbundles and assets.'
|
||||
spec.homepage = 'https://github.com/Ishotihadus/mikunyan'
|
||||
spec.license = 'MIT'
|
||||
|
||||
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
||||
f.match(%r{^(test|spec|features)/})
|
||||
end
|
||||
spec.bindir = "exe"
|
||||
spec.bindir = 'exe'
|
||||
spec.executables = spec.files.grep(%r{^exe/}){|f| File.basename(f)}
|
||||
spec.require_paths = ["lib"]
|
||||
spec.extensions = ["ext/decoders/native/extconf.rb"]
|
||||
spec.require_paths = ['lib']
|
||||
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 'extlz4', '~> 0'
|
||||
spec.add_dependency 'extlzma', '~> 0'
|
||||
spec.add_dependency 'json', '~> 2'
|
||||
|
||||
spec.add_development_dependency 'bundler', '~> 1'
|
||||
|
||||
Reference in New Issue
Block a user