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 @@
+
+