using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Text; using UnityEngine; public class Images { private List images = new List(); private Dictionary refs = new Dictionary(); public Images(Stream s) { ExtractTar(Decompress(s)); } private DeflateStream Decompress(Stream s) { return new DeflateStream(s, CompressionMode.Decompress); } private void ExtractTar(Stream maybeSeekableStream) { Stream stream; if (maybeSeekableStream.CanSeek) { stream = maybeSeekableStream; }else{ stream = new MemoryStream(); maybeSeekableStream.CopyTo(stream); stream.Seek(0, SeekOrigin.Begin); } var buffer = new byte[100]; while (true) { stream.Read(buffer, 0, 100); var name = Encoding.ASCII.GetString(buffer).Trim('\0'); // Debug.Log("Unpacked image: " + name); if (String.IsNullOrWhiteSpace(name)) break; stream.Seek(24, SeekOrigin.Current); stream.Read(buffer, 0, 12); var size = Convert.ToInt64(Encoding.ASCII.GetString(buffer, 0, 12).Trim().Trim('\0'), 8); stream.Seek(376L, SeekOrigin.Current); var buf = new byte[size]; stream.Read(buf, 0, buf.Length); if (name.EndsWith(".ref.txt")) { string r = Encoding.UTF8.GetString(buf).Trim('\0'); if (!refs.ContainsKey(name.Replace(".ref.txt", ".png"))) refs.Add(name.Replace(".ref.txt", ".png"), refs[r]); } else { int i = images.Count; images.Add(buf); refs.Add(name, i); } var pos = stream.Position; var offset = 512 - (pos % 512); if (offset == 512) offset = 0; stream.Seek(offset, SeekOrigin.Current); } } public byte[] GetImageFromPath(string path) { // Debug.Log("Getting image: " + path); return images[refs[path]]; } public Game.Image GetImage(string cardKind) { return new Game.Image() { Kind = cardKind, Face = Google.Protobuf.ByteString.CopyFrom(GetImageFromPath(cardKind + "/face.png")), Back = Google.Protobuf.ByteString.CopyFrom(GetImageFromPath(cardKind + "/back.png")) }; } }