You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

80 lines
2.1 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Text;
using UnityEngine;
public class Images {
private List<byte[]> images = new List<byte[]>();
private Dictionary<string, int> refs = new Dictionary<string, int>();
public Images(Stream s) {
ExtractTar(Decompress(s));
}
private Stream Decompress(Stream s) {
return new Zstandard.Net.ZstandardStream(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 if (!refs.ContainsKey(name)){
int i = images.Count;
images.Add(buf);
refs.Add(name, i);
}else{
// TODO Check 0xUNO
break;
}
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"))
};
}
}