public async Task <IActionResult> Patch([FromODataUri] int key, Delta <T> value) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var entity = await TableForT().FindAsync(key); if (entity == null) { return(NotFound()); } if (CanUpdate(entity) == false) { return(Forbid()); } value.Patch(entity); try { await context.SaveChangesAsync(); await message.Send(TopicEnum.Patch, value.GetType().Name, value); } catch (DbUpdateConcurrencyException) { if (!EntityExists(key)) { return(NotFound()); } else { throw; } } return(Updated(entity)); }
private IEnumerator AnimateDelta(Delta delta) { if (delta is AddToHandDelta) { yield return(uiManager.DrawCard((delta as AddToHandDelta).Card)); } else if (delta is AddToDiscardDelta) { uiManager.UpdateDiscardDisplay( Array.FindIndex(gameManager.Players, player => player.Discard == (delta as AddToDiscardDelta).Target) ); } else if (delta is AddToLaneDelta) { AddToLaneDelta addToLaneDelta = delta as AddToLaneDelta; yield return(uiManager.SpawnUnit(addToLaneDelta.SideIndex, Array.FindIndex(gameManager.Lanes, lane => lane.ID == addToLaneDelta.Target.ID), addToLaneDelta.Position)); } else if (delta is UnitHealthDelta) { UnitHealthDelta damageDelta = delta as UnitHealthDelta; if (damageDelta.DmgType == Damage.Type.TOWER) { yield return(uiManager.TowerUnitDamage(damageDelta.Target, damageDelta.Amount)); } else if (damageDelta.DmgType == Damage.Type.HEAL) { yield return(uiManager.UnitHeal(damageDelta.Source, damageDelta.Target)); } else { yield return(uiManager.UnitDamage( damageDelta.Source, damageDelta.Target, damageDelta.Amount )); } } else if (delta is RemoveFromLaneDelta) { RemoveFromLaneDelta removeDelta = delta as RemoveFromLaneDelta; yield return(uiManager.RemoveUnit( Array.FindIndex(gameManager.Lanes, lane => lane.ID == removeDelta.Target.ID), removeDelta.SideIndex, removeDelta.Position )); } else if (delta is TowerDamageDelta) { TowerDamageDelta towerDamageDelta = delta as TowerDamageDelta; yield return(uiManager.UnitTowerDamage(towerDamageDelta.Target, towerDamageDelta.Amount)); } else if (delta is TowerReviveDelta) { TowerReviveDelta towerReviveDelta = delta as TowerReviveDelta; yield return(uiManager.TowerRespawn(towerReviveDelta.Target)); } else if (delta is RevealHandCardDelta) { RevealHandCardDelta revealDelta = delta as RevealHandCardDelta; yield return(uiManager.RevealOpponentCard(revealDelta.Card)); } else if (delta is RemoveFromHandDelta) { RemoveFromHandDelta removeDelta = delta as RemoveFromHandDelta; yield return(uiManager.RemoveFromHand( Array.FindIndex(gameManager.Players, player => player.Owns(removeDelta.Target)), removeDelta.Card )); } else if (delta is ResourcePoolDelta) { ResourcePoolDelta resourcePoolDelta = delta as ResourcePoolDelta; ResourcePool target = resourcePoolDelta.rp.Target; for (int i = 0; i < gameManager.Players.Length; i++) { if (target == gameManager.Players[i].ManaPool) { yield return(uiManager.UpdateResourceDisplay(i)); } } } else { // Some deltas simply can't be animated, while others could potentially indicate an error. if (!(delta is RemoveFromDeckDelta)) { Debug.LogWarning($"Failed to animate delta of type {delta.GetType().Name}"); } } uiManager.RenderUnits(); uiManager.RenderTowers(); uiManager.RenderIndicators(); }
public static void Main() { //find local IP IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddr = ipEntry.AddressList[0]; //consts string HostName = ipAddr.ToString(); //by default, is using same local IP addr as server; assuming above process is deterministic const int Port = 4011; //objs TcpClient client; NetworkStream stream; // used for testing delta code List <Deck> decks = new List <Deck>(); Console.WriteLine("Connecting to server at {0}:{1}...", HostName, Port); try{ //actual work client = new TcpClient(HostName, Port); Console.WriteLine("Connected!"); CardLoader cl = new CardLoader(); Console.WriteLine("Testing Unkown Card == Card: {0}", new UnknownCard() == cl.LoadCard("Exostellar Marine Squad")? "Success" : "Fail"); Console.WriteLine("Testing Card == Unkown Card: {0}", cl.LoadCard("Exostellar Marine Squad") == new UnknownCard() ? "Success" : "Fail"); stream = client.GetStream(); byte[] data; /* * //send a message * Console.WriteLine("Press Enter to start a message..."); * Console.Read(); * data = System.Text.Encoding.UTF8.GetBytes("<file type='HI!!!'>"); * stream.Write(data, 0, data.Length); * * //test if will wait for EOF * Console.WriteLine("Press Enter to finish the message..."); * Console.Read(); * data = System.Text.Encoding.UTF8.GetBytes("</file>GARBAGE"); * stream.Write(data, 0, data.Length); * * //recieve * data = new byte[256]; * stream.Read(data, 0, data.Length); * Console.WriteLine("Response from server: {0}",System.Text.Encoding.UTF8.GetString(data)); * // */ //join a game Console.WriteLine("Press Enter to join a game..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='joinMatch'><deck id='testing'/></file>"); stream.Write(data, 0, data.Length); //* //get matchstart message data = new byte[256]; stream.Read(data, 0, data.Length); string startResp = System.Text.Encoding.UTF8.GetString(data); Console.WriteLine("Response from server: {0}", startResp); XmlDocument doc = new XmlDocument(); doc.LoadXml(startResp); foreach (XmlElement e in doc.GetElementsByTagName("playerIds")) { Deck deck = new Deck(e.Attributes["deck"].Value); DeckList list = new DeckList(); list.AddCard(new UnknownCard(), 20); // the dummy placeholder deck deck.LoadCards(list); decks.Add(deck); } // */ //send a gameaction message Console.WriteLine("Press Enter to make a move..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='gameAction'><action></action></file>"); stream.Write(data, 0, data.Length); // get and parse XML deltas data = new byte[256]; stream.Read(data, 0, data.Length); string resp = System.Text.Encoding.UTF8.GetString(data); Console.WriteLine("Response from server: {0}", resp); doc = new XmlDocument(); doc.LoadXml(resp); foreach (XmlElement e in doc.GetElementsByTagName("delta")) { Delta d = Delta.FromXml(e, cl); Console.WriteLine("Delta of type {0} parsed.", d.GetType()); } //get and parse A LOT of Xml, for analysis purposes int tests = 1000; long avMillis = 0; Stopwatch watch = new Stopwatch(); Stopwatch totalWatch = new Stopwatch(); totalWatch.Start(); for (int i = 0; i < tests; i++) { watch.Start(); // send request data = System.Text.Encoding.UTF8.GetBytes("<file type='gameAction'><action></action></file>"); stream.Write(data, 0, data.Length); // get and parse XML deltas data = new byte[256]; stream.Read(data, 0, data.Length); resp = System.Text.Encoding.UTF8.GetString(data); doc = new XmlDocument(); doc.LoadXml(resp); foreach (XmlElement e in doc.GetElementsByTagName("delta")) { Delta d = Delta.FromXml(e, cl); } watch.Stop(); avMillis += watch.ElapsedMilliseconds / ((long)tests); watch.Reset(); } totalWatch.Stop(); Console.WriteLine("{0} tests parsing Xml run; avergage time was {1} millis; total time was {2} millis.", tests, avMillis, totalWatch.ElapsedMilliseconds); //send a end turn message Console.WriteLine("Press Enter to end turn..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='lockInTurn'></file>"); stream.Write(data, 0, data.Length); data = new byte[256]; stream.Read(data, 0, data.Length); Console.WriteLine("Response from server: {0}", System.Text.Encoding.UTF8.GetString(data)); //send a gameaction message Console.WriteLine("Press Enter to make a move..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='gameAction'><action></action></file>"); stream.Write(data, 0, data.Length); data = new byte[256]; stream.Read(data, 0, data.Length); Console.WriteLine("Response from server: {0}", System.Text.Encoding.UTF8.GetString(data)); //send a gameaction message Console.WriteLine("Press Enter to make a move..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='gameAction'><action></action></file>"); stream.Write(data, 0, data.Length); data = new byte[256]; stream.Read(data, 0, data.Length); Console.WriteLine("Response from server: {0}", System.Text.Encoding.UTF8.GetString(data)); //send a end turn message Console.WriteLine("Press Enter to end turn..."); Console.Read(); data = System.Text.Encoding.UTF8.GetBytes("<file type='lockInTurn'></file>"); stream.Write(data, 0, data.Length); //wait for user then close Console.WriteLine("Presse Enter to disconnect..."); Console.Read(); stream.Close(); client.Close(); }catch (SocketException e) { Console.WriteLine("SocketEsception: {0}", e); } }