diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index 636acd56..8112c600 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -51,6 +51,9 @@ MinimumRecommendedRules.ruleset + + ..\packages\Crc32C.NET.1.0.5.0\lib\net20\Crc32C.NET.dll + ..\packages\SharpZipLib.1.3.3\lib\net45\ICSharpCode.SharpZipLib.dll @@ -62,6 +65,9 @@ + + ..\packages\Snappy.NET.1.1.1.8\lib\net45\Snappy.NET.dll + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll diff --git a/ArcFormats/Resources/Formats.dat b/ArcFormats/Resources/Formats.dat index 5fb1c31e..86dbafd4 100644 Binary files a/ArcFormats/Resources/Formats.dat and b/ArcFormats/Resources/Formats.dat differ diff --git a/ArcFormats/YuRis/ArcYPF.cs b/ArcFormats/YuRis/ArcYPF.cs index 08a2f11e..bc864628 100644 --- a/ArcFormats/YuRis/ArcYPF.cs +++ b/ArcFormats/YuRis/ArcYPF.cs @@ -31,6 +31,7 @@ using System.ComponentModel.Composition; using GameRes.Compression; using GameRes.Formats.Strings; using GameRes.Utility; +using Snappy; namespace GameRes.Formats.YuRis { @@ -49,6 +50,12 @@ namespace GameRes.Formats.YuRis public uint CheckSum; } + public enum YpfCompression + { + Zlib = 0, + Snappy = 1, + } + [Serializable] public class YpfScheme { @@ -57,6 +64,7 @@ namespace GameRes.Formats.YuRis public bool GuessKey; public uint ExtraHeaderSize; public uint ScriptKey; + public YpfCompression CompressType; public YpfScheme () { } @@ -67,6 +75,7 @@ namespace GameRes.Formats.YuRis GuessKey = false; ExtraHeaderSize = 0; ScriptKey = script_key; + CompressType = YpfCompression.Zlib; } public YpfScheme (byte[] swap_table) @@ -74,18 +83,27 @@ namespace GameRes.Formats.YuRis SwapTable = swap_table; GuessKey = true; ExtraHeaderSize = 0; + CompressType = YpfCompression.Zlib; } } public class YpfArchive : ArcFile { public uint ScriptKey; + public YpfCompression CompressType; public YpfArchive (ArcView arc, ArchiveFormat impl, ICollection dir, uint script_key) : base (arc, impl, dir) { ScriptKey = script_key; } + + public YpfArchive(ArcView arc, ArchiveFormat impl, ICollection dir, uint script_key, YpfCompression compress_type) + : base(arc, impl, dir) + { + ScriptKey = script_key; + CompressType = compress_type; + } } [Serializable] @@ -143,7 +161,7 @@ namespace GameRes.Formats.YuRis return null; if (scheme.ScriptKey != 0) - return new YpfArchive (file, this, dir, scheme.ScriptKey); + return new YpfArchive (file, this, dir, scheme.ScriptKey, scheme.CompressType); else return new ArcFile (file, this, dir); } @@ -153,8 +171,33 @@ namespace GameRes.Formats.YuRis var packed_entry = entry as PackedEntry; var ypf = arc as YpfArchive; Stream input = base.OpenEntry (arc, entry); - if (null != packed_entry && packed_entry.IsPacked) - input = new ZLibStream (input, CompressionMode.Decompress); + if (null != packed_entry && packed_entry.IsPacked) + { + if(ypf == null) + { + input = new ZLibStream(input, CompressionMode.Decompress); + } + else + { + switch (ypf.CompressType) + { + case YpfCompression.Snappy: + { + var compress_data = new byte[entry.Size]; + input.Read(compress_data, 0, compress_data.Length); + var decomprrss_data = SnappyCodec.Uncompress(compress_data); + input = new BinMemoryStream(decomprrss_data, entry.Name); + break; + } + case YpfCompression.Zlib: + default: + { + input = new ZLibStream(input, CompressionMode.Decompress); + break; + } + } + } + } uint unpacked_size = null == packed_entry ? entry.Size : packed_entry.UnpackedSize; if (null == ypf || 0 == ypf.ScriptKey || unpacked_size <= 0x20 || !entry.Name.HasExtension (".ybn")) diff --git a/ArcFormats/packages.config b/ArcFormats/packages.config index dbb3e742..9b9f1981 100644 --- a/ArcFormats/packages.config +++ b/ArcFormats/packages.config @@ -1,7 +1,9 @@  + +