Browse Source

Replace single image query with multi image query

main
ThePerkinrex 4 years ago
parent
commit
205599e187
No known key found for this signature in database GPG Key ID: FD81DE6D75E20917
  1. 26
      unity/Assets/Scripts/Client.cs
  2. 35
      unity/Assets/Scripts/GameLoader.cs
  3. 28
      unity/Assets/Scripts/Images.cs

26
unity/Assets/Scripts/Client.cs

@ -11,6 +11,7 @@ using Empty = Google.Protobuf.WellKnownTypes.Empty;
using System.IO; using System.IO;
public class Client : MonoBehaviour { public class Client : MonoBehaviour {
public static DateTime UnixEpoch() => new DateTime(1970, 1, 1, 0, 0, 0, 0);
private static ConnectionImpl reference; private static ConnectionImpl reference;
public static void Connect(string name, string address = "127.0.0.1:50052") { public static void Connect(string name, string address = "127.0.0.1:50052") {
@ -41,6 +42,21 @@ public class Client : MonoBehaviour {
} }
} }
public class Card {
public DateTime timestamp;
public string card;
public Card(string card, DateTime lastUpdated) {
this.card = card;
this.timestamp = lastUpdated > UnixEpoch() ? lastUpdated : UnixEpoch();
}
public Card(string card) {
this.card = card;
this.timestamp = UnixEpoch();
}
}
public class NetEventManager { public class NetEventManager {
private Dictionary<string, Action<Common.Name>> returnNameHandlers = new Dictionary<string, Action<Common.Name>>(); private Dictionary<string, Action<Common.Name>> returnNameHandlers = new Dictionary<string, Action<Common.Name>>();
private Dictionary<string, Action<Connection.UserID>> returnConnectHandlers = new Dictionary<string, Action<Connection.UserID>>(); private Dictionary<string, Action<Connection.UserID>> returnConnectHandlers = new Dictionary<string, Action<Connection.UserID>>();
@ -134,13 +150,15 @@ public class Client : MonoBehaviour {
this.currentImagesPacketLength = (int)p.ReturnCardsImages.Setup.Number; this.currentImagesPacketLength = (int)p.ReturnCardsImages.Setup.Number;
this.currentImagesPacketIndex = 0; this.currentImagesPacketIndex = 0;
this.currentImages = new MemoryStream(); this.currentImages = new MemoryStream();
} else { } else {
if (p.ReturnCardsImages.DataPacket.Id != this.currentImagesPacketIndex) if (p.ReturnCardsImages.DataPacket.Id != this.currentImagesPacketIndex)
throw new Exception("images packet id doesn't match expected"); throw new Exception("images packet id doesn't match expected");
this.currentImages.Write(p.ReturnCardsImages.DataPacket.Data.ToArray(), 0, p.ReturnCardsImages.DataPacket.Data.Length); this.currentImages.Write(p.ReturnCardsImages.DataPacket.Data.Span.ToArray(), 0, p.ReturnCardsImages.DataPacket.Data.Span.Length);
Debug.Log(this.currentImages.ToArray()[0] + ":" + p.ReturnCardsImages.DataPacket.Data.Span.ToArray()[0]);
this.currentImagesPacketIndex++; this.currentImagesPacketIndex++;
if (this.currentImagesPacketIndex == this.currentImagesPacketLength) { if (this.currentImagesPacketIndex == this.currentImagesPacketLength) {
// Debug.Log("Images tar length: " + this.currentImages.Length);
this.currentImages.Seek(0, SeekOrigin.Begin);
Images i = new Images(this.currentImages); Images i = new Images(this.currentImages);
this.currentImagesPacketIndex = 0; this.currentImagesPacketIndex = 0;
var v = new Action<Images>[this.returnCardImagesHandlers.Count]; var v = new Action<Images>[this.returnCardImagesHandlers.Count];
@ -374,9 +392,9 @@ public class Client : MonoBehaviour {
conn.SendMessage(new Protocol.ClientServerPacket() { QueryCardImage = new Game.CardKind { Kind = cardKind } }); conn.SendMessage(new Protocol.ClientServerPacket() { QueryCardImage = new Game.CardKind { Kind = cardKind } });
} }
public void GetCardImages(string cardKind) { public void GetCardImages(Card[] cards) {
Game.Cards c = new Game.Cards(); Game.Cards c = new Game.Cards();
c.Cards_.Append(new Game.Cards.Types.Card { Kind = cardKind, Time = new Google.Protobuf.WellKnownTypes.Timestamp { Seconds = 0, Nanos = 0 } }); c.Cards_.Add(cards.Select(c => new Game.Cards.Types.Card() { Kind = c.card, Time = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(c.timestamp.ToUniversalTime()) }));
conn.SendMessage(new Protocol.ClientServerPacket() { QueryCardImages = c }); conn.SendMessage(new Protocol.ClientServerPacket() { QueryCardImages = c });
} }

35
unity/Assets/Scripts/GameLoader.cs

@ -154,6 +154,26 @@ public class GameLoader : MonoBehaviour {
} }
void SpawnCards() { void SpawnCards() {
List<Client.Card> cards = new List<Client.Card>();
foreach (string key in pileRegistry.Keys) {
foreach (Game.GameStatus.Types.Card card in pileRegistry[key].cards) {
if (!cardImages.ContainsKey(card.Kind.Kind)) {
// string uuid = card.Uuid;
// string kind = card.Kind.Kind;
// int idx2 = idx;
// string key2 = key;
// bool visible = card.Visible;
// conn.eventManager.AddHandler("game_card_image_" + uuid, (Game.Image image) => {
// if(!SpawnCard(uuid, kind, idx2, key2, visible, image)) return;
// conn.eventManager.RemoveHandler(Protocol.ServerClientPacket.DataOneofCase.ReturnCardImage, "game_card_image_" + uuid);
// });
// conn.GetCardImage(card.Kind.Kind);
cards.Add(new Client.Card(card.Kind.Kind));
}
}
}
string handlerName = "game_cards_images_" + (DateTime.Now - Client.UnixEpoch()).TotalMilliseconds;
conn.eventManager.AddHandler(handlerName, (Images i) => {
foreach (string key in pileRegistry.Keys) { foreach (string key in pileRegistry.Keys) {
int idx = 0; int idx = 0;
foreach (Game.GameStatus.Types.Card card in pileRegistry[key].cards) { foreach (Game.GameStatus.Types.Card card in pileRegistry[key].cards) {
@ -165,15 +185,20 @@ public class GameLoader : MonoBehaviour {
int idx2 = idx; int idx2 = idx;
string key2 = key; string key2 = key;
bool visible = card.Visible; bool visible = card.Visible;
conn.eventManager.AddHandler("game_card_image_" + uuid, (Game.Image image) => { // conn.eventManager.AddHandler("game_card_image_" + uuid, (Game.Image image) => {
if(!SpawnCard(uuid, kind, idx2, key2, visible, image)) return; // if (!SpawnCard(uuid, kind, idx2, key2, visible, image)) return;
conn.eventManager.RemoveHandler(Protocol.ServerClientPacket.DataOneofCase.ReturnCardImage, "game_card_image_" + uuid); // conn.eventManager.RemoveHandler(Protocol.ServerClientPacket.DataOneofCase.ReturnCardImage, "game_card_image_" + uuid);
}); // });
conn.GetCardImage(card.Kind.Kind); // conn.GetCardImage(card.Kind.Kind);
Game.Image image = i.GetImage(kind);
SpawnCard(uuid, kind, idx2, key2, visible, image);
} }
idx++; idx++;
} }
} }
conn.eventManager.RemoveHandler(Protocol.ServerClientPacket.DataOneofCase.ReturnCardsImages, handlerName);
});
conn.GetCardImages(cards.ToArray());
} }
public static void ReloadPiles() { public static void ReloadPiles() {
if (instance == null) return; if (instance == null) return;

28
unity/Assets/Scripts/Images.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Text; using System.Text;
using UnityEngine;
public class Images { public class Images {
private List<byte[]> images = new List<byte[]>(); private List<byte[]> images = new List<byte[]>();
@ -16,16 +17,25 @@ public class Images {
return new DeflateStream(s, CompressionMode.Decompress); return new DeflateStream(s, CompressionMode.Decompress);
} }
private void ExtractTar(Stream stream) { 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]; var buffer = new byte[100];
while (true) { while (true) {
stream.Read(buffer, 0, 100); stream.Read(buffer, 0, 100);
var name = Encoding.ASCII.GetString(buffer).Trim('\0'); var name = Encoding.ASCII.GetString(buffer).Trim('\0');
// Debug.Log("Unpacked image: " + name);
if (String.IsNullOrWhiteSpace(name)) if (String.IsNullOrWhiteSpace(name))
break; break;
stream.Seek(24, SeekOrigin.Current); stream.Seek(24, SeekOrigin.Current);
stream.Read(buffer, 0, 12); stream.Read(buffer, 0, 12);
var size = Convert.ToInt64(Encoding.ASCII.GetString(buffer, 0, 12).Trim(), 8); var size = Convert.ToInt64(Encoding.ASCII.GetString(buffer, 0, 12).Trim().Trim('\0'), 8);
stream.Seek(376L, SeekOrigin.Current); stream.Seek(376L, SeekOrigin.Current);
@ -33,6 +43,7 @@ public class Images {
stream.Read(buf, 0, buf.Length); stream.Read(buf, 0, buf.Length);
if (name.EndsWith(".ref.txt")) { if (name.EndsWith(".ref.txt")) {
string r = Encoding.UTF8.GetString(buf).Trim('\0'); 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]); refs.Add(name.Replace(".ref.txt", ".png"), refs[r]);
} else { } else {
int i = images.Count; int i = images.Count;
@ -50,8 +61,17 @@ public class Images {
} }
} }
public byte[] GetImage(string name) { public byte[] GetImageFromPath(string path) {
return images[refs[name]]; // 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"))
};
} }
} }
Loading…
Cancel
Save