diff --git a/unity/Assets/Scripts/Client.cs b/unity/Assets/Scripts/Client.cs index a9f9918..372cb6b 100644 --- a/unity/Assets/Scripts/Client.cs +++ b/unity/Assets/Scripts/Client.cs @@ -11,6 +11,7 @@ using Empty = Google.Protobuf.WellKnownTypes.Empty; using System.IO; public class Client : MonoBehaviour { + public static DateTime UnixEpoch() => new DateTime(1970, 1, 1, 0, 0, 0, 0); private static ConnectionImpl reference; 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 { private Dictionary> returnNameHandlers = new Dictionary>(); private Dictionary> returnConnectHandlers = new Dictionary>(); @@ -134,13 +150,15 @@ public class Client : MonoBehaviour { this.currentImagesPacketLength = (int)p.ReturnCardsImages.Setup.Number; this.currentImagesPacketIndex = 0; this.currentImages = new MemoryStream(); - } else { if (p.ReturnCardsImages.DataPacket.Id != this.currentImagesPacketIndex) 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++; 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); this.currentImagesPacketIndex = 0; var v = new Action[this.returnCardImagesHandlers.Count]; @@ -374,9 +392,9 @@ public class Client : MonoBehaviour { 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(); - 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 }); } diff --git a/unity/Assets/Scripts/GameLoader.cs b/unity/Assets/Scripts/GameLoader.cs index fda99ea..20425c6 100644 --- a/unity/Assets/Scripts/GameLoader.cs +++ b/unity/Assets/Scripts/GameLoader.cs @@ -7,214 +7,239 @@ using UnityEngine.UI; using Random = UnityEngine.Random; public class PileProperties { - public string name; - public string owner; - public Game.GameStatus.Types.Card[] cards; - public bool faceDown; - public GameObject tab; - public GameObject gameObject; + public string name; + public string owner; + public Game.GameStatus.Types.Card[] cards; + public bool faceDown; + public GameObject tab; + public GameObject gameObject; } public class CardProperties { - public Quaternion rotation; - public string pileName; - public int idx; - public string kind; - public GameObject gameObject; + public Quaternion rotation; + public string pileName; + public int idx; + public string kind; + public GameObject gameObject; } public class GameLoader : MonoBehaviour { - public GameObject table; - public GameObject playerCube; - public int myIndex; - public int playerCount; - public Color[] playerColors; - public GameObject playerPiles; - public GameObject playerPilePrefab; - public GameObject pileTabs; - public GameObject pileTabPrefab; - public GameObject cardPrefab; - public GameObject cardCanvas; - public GameObject deck; - public GameObject thrownCards; - public bool firstReload = true; - private static float yOffsetTable = 0.51f / 2; - public static MainMenuController mmc; - public static GameLoader instance; - public Dictionary cardImages = new Dictionary(); - public static Dictionary cardRegistry = new Dictionary(); - public static Dictionary pileRegistry = new Dictionary(); - private Client.ConnectionImpl conn; - - void Awake() { - instance = this; - } - void Start() { - conn = Client.GetConnection(); - mmc = FindObjectOfType(); - mmc.gameObject.SetActive(false); - playerCount = mmc.usersInLobby.Count; - - if (playerCount > 1) { - var angleDelta = 180f / (playerCount - 1); - var dst = 15; - var angleOffset = angleDelta / (2f / (playerCount - 2)); - - for (int i = 1; i < playerCount; i++) { - var angle = angleOffset + angleDelta * i; - Vector3 pos = new Vector3(dst * Mathf.Sin(angle * Mathf.Deg2Rad), 2.6f, -dst * Mathf.Cos(angle * Mathf.Deg2Rad)); - var player = Instantiate(playerCube, pos, Quaternion.AngleAxis(-angle, Vector3.up)); - player.GetComponent().material.color = playerColors[(i + myIndex) % playerCount]; - } - } - } - public static void RegisterCard(string uuid, CardProperties properties) { - if (!cardRegistry.ContainsKey(uuid)) cardRegistry.Add(uuid, properties); - } - public static void UpdateCard(string uuid, CardProperties properties) { - if (cardRegistry.ContainsKey(uuid)) cardRegistry[uuid] = properties; - } - public static CardProperties GetCard(string uuid) { - if (cardRegistry.ContainsKey(uuid)) return cardRegistry[uuid]; - else return null; - } - public static void DeleteCard(string uuid) { - if (cardRegistry.ContainsKey(uuid)) cardRegistry.Remove(uuid); - } - - - public static void RegisterPile(string name, PileProperties properties) { - if (!pileRegistry.ContainsKey(name)) pileRegistry.Add(name, properties); - } - public static void UpdatePile(string name, PileProperties properties) { - if (pileRegistry.ContainsKey(name)) pileRegistry[name] = properties; - } - public static PileProperties GetPile(string name) { - if (pileRegistry.ContainsKey(name)) return pileRegistry[name]; - else return null; - } - public static void DeletePile(string name) { - if (pileRegistry.ContainsKey(name)) pileRegistry.Remove(name); - } - - bool SpawnCard(string uuid, string cardKind, int index, string pileName, bool visible, Game.Image image) { - if (image != null && cardKind != image.Kind) return false; - - PileProperties pileProps = GetPile(pileName); - var card = Instantiate(cardPrefab, Vector3.zero, Quaternion.identity, pileProps.gameObject.transform); - var front = new Texture2D(1, 1); - var back = new Texture2D(1, 1); - if (cardImages.ContainsKey(cardKind)) { - front = cardImages[cardKind][0]; - back = cardImages[cardKind][1]; - } else { - front.LoadImage(image.Face.Span.ToArray()); - back.LoadImage(image.Back.Span.ToArray()); - cardImages.Add(cardKind, new Texture2D[] { front, back }); - } - card.transform.Find("Images").GetComponentsInChildren()[0].texture = front; - card.transform.Find("Images").GetComponentsInChildren()[1].texture = back; - card.transform.localScale = new Vector3(0.15f, 0.15f, 1f); - card.GetComponent().uuid = uuid; - - CardProperties cardProps = GetCard(uuid); - - GameObject canvas = null; - if (pileProps.owner == "") { - canvas = Instantiate(cardCanvas, pileProps.gameObject.transform.position + new Vector3(0, yOffsetTable + pileProps.gameObject.transform.childCount * 0.0075f, 0), cardProps != null ? cardProps.rotation : Quaternion.identity); - canvas.GetComponent().worldCamera = Camera.main; - card.transform.localScale = Vector3.one; - card.transform.SetParent(canvas.transform, false); - canvas.transform.SetParent(pileProps.gameObject.transform); - canvas.tag = "ThrownCard"; - canvas.transform.localScale = new Vector3(0.01f, 0.01f); - - if (canvas.transform.rotation == Quaternion.identity) { - canvas.transform.Rotate(new Vector3(90f, 0f, 0f)); - canvas.transform.Rotate(new Vector3(0f, 0f, Random.Range(-20, 20))); - } - } - - if(!visible || pileProps.faceDown) { - card.transform.GetChild(1).Rotate(0, 180f, 0); - } - - if (cardProps != null) { - if (cardProps.kind != cardKind) cardProps.kind = cardKind; - if (cardProps.idx != index) cardProps.idx = index; - if (cardProps.pileName != pileName) cardProps.pileName = pileName; - if (cardProps.gameObject != card) cardProps.gameObject = card; - if (canvas != null && cardProps.rotation != canvas.transform.rotation) cardProps.rotation = canvas.transform.rotation; - UpdateCard(uuid, cardProps); - } else { - cardProps = new CardProperties { kind = cardKind, idx = index, pileName = pileName, rotation = canvas != null ? canvas.transform.rotation : Quaternion.identity, gameObject = card }; - RegisterCard(uuid, cardProps); - } - return true; - } - - void SpawnCards() { - foreach (string key in pileRegistry.Keys) { - int idx = 0; - foreach (Game.GameStatus.Types.Card card in pileRegistry[key].cards) { - if (cardImages.ContainsKey(card.Kind.Kind)) { - SpawnCard(card.Uuid, card.Kind.Kind, idx, key, card.Visible, null); - } else { - 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); - } - idx++; - } - } - } - public static void ReloadPiles() { - if (instance == null) return; - var piles = instance.conn.GetPlayerPiles(mmc.currentUsername); - - foreach (var pair in piles.Keys.Zip(piles.Values, (key, value) => new dynamic[] { key, value })) { - string key = (string)pair[0]; - Game.GameStatus.Types.Pile value = (Game.GameStatus.Types.Pile)pair[1]; - - var pileEntry = GetPile(key + mmc.currentUsername); - if (pileEntry == null) { - var pile = Instantiate(instance.playerPilePrefab, instance.playerPiles.transform); - pile = pile.transform.GetChild(0).gameObject; - - var tab = Instantiate(instance.pileTabPrefab, instance.pileTabs.transform); - tab.GetComponentInChildren().text = value.Name; - - RegisterPile(key + mmc.currentUsername, new PileProperties { name = key, owner = mmc.currentUsername, cards = value.Cards.ToArray(), gameObject = pile, tab = tab, faceDown = value.FaceDown }); - } else UpdatePile(key + mmc.currentUsername, new PileProperties { name = key, owner = mmc.currentUsername, cards = value.Cards.ToArray(), gameObject = pileEntry.gameObject, tab = pileEntry.tab, faceDown = value.FaceDown }); - - pileEntry = GetPile(key + mmc.currentUsername); - pileEntry.tab.SetActive(value.Visible); - pileEntry.gameObject.SetActive(value.Visible); - } - if((instance.firstReload && instance.pileTabs.GetComponentInChildren