public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List <Card> cards, out List <Player> players) { answerPending = new Semaphore(0, 1); int timeOut = _GetActualTimeoutSecond(verifier.Helper); proxy.AskForCardUsage(prompt, verifier, timeOut); skill = null; cards = null; players = null; if (answerPending.WaitOne(timeOut * 1000 /* + GameDelays.UiDelayCompensation*/)) { skill = answerSkill; cards = answerCards; players = answerPlayers; } cards = cards ?? new List <Card>(); players = players ?? new List <Player>(); return(verifier.FastVerify(HostPlayer, answerSkill, cards, players) == VerifierResult.Success); }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List <Card> cards, out List <Player> players) { Trace.TraceInformation("Asking Card Usage to {0}.", HostPlayer.Id); TryAskForCardUsage(prompt, verifier); SimulateReplayDelay(); NextQuestion(); if (TryAnswerForCardUsage(prompt, verifier, out skill, out cards, out players)) { uiProxy.Freeze(); if (skill == null && (cards == null || cards.Count == 0) && (players == null || players.Count == 0)) { return(false); } #if DEBUG if (verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.Assert(false); } #endif return(true); } uiProxy.Freeze(); return(false); }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { answerPending = new Semaphore(0, 1); proxy.AskForCardUsage(prompt, verifier, TimeOutSeconds); if (answerPending.WaitOne(TimeOutSeconds * 1000)) { skill = answerSkill; cards = answerCards; players = answerPlayers; } else { skill = null; cards = null; players = null; } if (verifier.FastVerify(HostPlayer, answerSkill, answerCards, answerPlayers) == VerifierResult.Success) { return true; } return false; }
public bool TryAskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { cards = null; skill = null; players = null; int timeOut = TimeOutSeconds + (verifier.Helper != null ? verifier.Helper.ExtraTimeOutSeconds : 0); Trace.TraceInformation("Asking Card Usage to {0}, timeout {1}.", HostPlayer.Id, timeOut); int? count; if (!server.ExpectNext(clientId, timeOut)) { return false; } count = server.GetInt(clientId, 0); if (count == null || count == 0) { return false; } if (count == null) { return false; } count = server.GetInt(clientId, 0); if (count == 1) { skill = server.GetSkill(clientId, 0); if (skill == null) { return false; } if (!(skill is CheatSkill) && !HostPlayer.ActionableSkills.Contains(skill)) { Trace.TraceWarning("Client DDOS!"); return false; } } count = server.GetInt(clientId, 0); if (count == null) { return false; } cards = new List<Card>(); while (count-- > 0) { Card item = server.GetCard(clientId, 0); if (item == null) { return false; } if (item.Owner != HostPlayer) { if (!(verifier.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType) || (skill != null && skill.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType)))) { Trace.TraceWarning("Client hacking cards!"); return false; } } cards.Add(item); } count = server.GetInt(clientId, 0); if (count == null) { return false; } players = new List<Player>(); while (count-- > 0) { Player item = server.GetPlayer(clientId, 0); if (item == null) { return false; } players.Add(item); } bool requireUnique = true; if (skill is ActiveSkill) { if ((skill as ActiveSkill).Helper != null && (skill as ActiveSkill).Helper.IsPlayerRepeatable) requireUnique = false; } if ((players != null && players.Distinct().Count() != players.Count && requireUnique) || verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.TraceWarning("Client seems to be sending invalid answers at us. DDOS?"); cards = new List<Card>(); skill = null; players = new List<Player>(); return false; } return true; }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { Trace.TraceInformation("Asking Card Usage to {0}.", HostPlayer.Id); TryAskForCardUsage(prompt, verifier); SimulateReplayDelay(); NextQuestion(); if (TryAnswerForCardUsage(prompt, verifier, out skill, out cards, out players)) { uiProxy.Freeze(); if (skill == null && (cards == null || cards.Count == 0) && (players == null || players.Count == 0)) { return false; } #if DEBUG if (verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.Assert(false); } #endif return true; } uiProxy.Freeze(); return false; }
bool IUiProxy.AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { Player p = hostPlayer; Console.Write("I AM PLAYER {0}({1}): ", p.Id, p.Hero.Name); cards = new List<Card>(); VerifierResult r = verifier.FastVerify(HostPlayer, null, null, null); skill = null; Console.Write("Ask for card usage, {0}: ", prompt); int i = 0; foreach (ICard card in Game.CurrentGame.Decks[p, DeckType.Hand]) { Console.Write(" Card {0} {1}{2}{3}, ", i, card.Suit, card.Rank, card.Type.CardType); i++; } again: Console.Write("Card id, -1 to trigger"); string ids = Console.ReadLine(); if (ids == null) { Thread.Sleep(200); cards = null; players = null; return false; } int id = int.Parse(ids); if (id < -1) { cards = null; players = null; } else { if (id == -1) { Console.Write("Skill ID:"); ids = Console.ReadLine(); id = int.Parse(ids); if (id >= hostPlayer.Skills.Count || ((!(hostPlayer.Skills[id] is ActiveSkill)) && (!(hostPlayer.Skills[id] is CardTransformSkill)))) { goto again; } skill = hostPlayer.Skills[id]; while (true) { Console.Write("Card id, -1 to end"); ids = Console.ReadLine(); id = int.Parse(ids); if (id < 0) { break; } if (id >= Game.CurrentGame.Decks[p, DeckType.Hand].Count) { continue; } cards.Add(Game.CurrentGame.Decks[p, DeckType.Hand][id]); } } else { if (id < Game.CurrentGame.Decks[p, DeckType.Hand].Count) { cards.Add(Game.CurrentGame.Decks[p, DeckType.Hand][id]); } } players = null; r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Success) { return true; } if (r == VerifierResult.Fail) { Console.Write("Failed check, again? 1 yes 0 no"); ids = Console.ReadLine(); id = int.Parse(ids); if (id == 1) { goto again; } } } { players = new List<Player>(); while (true) { Console.WriteLine(""); Console.Write("Target player: -1 to end"); ids = Console.ReadLine(); id = int.Parse(ids); if (id < 0) { break; } if (id > Game.CurrentGame.Players.Count) { Console.WriteLine("out of range"); } else { players.Add(Game.CurrentGame.Players[id]); } r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Partial) { Console.WriteLine("Require more"); } if (r == VerifierResult.Fail) { Console.WriteLine("Failed check"); players.Remove(Game.CurrentGame.Players[id]); } } r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Success) { return true; } if (r == VerifierResult.Fail) { Console.Write("Failed check, again? 1 yes 0 no"); ids = Console.ReadLine(); id = int.Parse(ids); if (id == 1) { goto again; } } players = null; skill = null; cards = null; return false; } }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { Trace.TraceInformation("Asking Card Usage to {0}.", HostPlayer.Id); TryAskForCardUsage(prompt, verifier); _SimulateReplayDelay(); if (active) { NextQuestion(); } else { Trace.TraceInformation("Not active player, defaulting."); } if (TryAnswerForCardUsage(prompt, verifier, out skill, out cards, out players)) { proxy.Freeze(); #if DEBUG Trace.Assert(verifier.FastVerify(HostPlayer, skill, cards, players) == VerifierResult.Success); #endif return true; } proxy.Freeze(); return false; }
public bool TryAskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { cards = null; skill = null; players = null; int timeOut = TimeOutSeconds + (verifier.Helper != null ? verifier.Helper.ExtraTimeOutSeconds : 0); Trace.TraceInformation("Asking Card Usage to {0}, timeout {1}.", HostPlayer.Id, timeOut); var answerReady = new Semaphore(0, Int16.MaxValue); CardUsageAnsweredEventHandler handler = (s, c, p) => { skillAnswer = s; cardsAnswer = c; playersAnswer = p; answerReady.Release(1); }; proxy.CardUsageAnsweredEvent += handler; proxy.AskForCardUsage(prompt, verifier, timeOut); bool noAnswer = false; if (!answerReady.WaitOne(timeOut * 1000)) noAnswer = true; proxy.CardUsageAnsweredEvent -= handler; proxy.Freeze(); if (noAnswer) return false; skill = skillAnswer; cards = cardsAnswer; players = playersAnswer; if (skill != null && !(skill is CheatSkill) && !HostPlayer.ActionableSkills.Contains(skill)) { Trace.TraceWarning("Client DDOS!"); return false; } if (cards != null) { foreach (var item in cards) { if (item == null) { return false; } if (item.Owner != HostPlayer) { if (!(verifier.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType) || (skill != null && skill.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType)) || (verifier.Helper.OtherGlobalCardDeckUsed.Any(dc => dc.Key.Player == item.Place.Player && dc.Key.DeckType == item.Place.DeckType)) || (skill != null && skill.Helper.OtherGlobalCardDeckUsed.Any(dc => dc.Key.Player == item.Place.Player && dc.Key.DeckType == item.Place.DeckType)))) { Trace.TraceWarning("Client hacking cards!"); return false; } } } } else { cards = new List<Card>(); } if (players != null) { foreach (var item in players) { if (item == null) { return false; } } } else { players = new List<Player>(); } bool requireUnique = true; if (skill is ActiveSkill) { if ((skill as ActiveSkill).Helper != null && (skill as ActiveSkill).Helper.IsPlayerRepeatable) requireUnique = false; } if ((players != null && players.Distinct().Count() != players.Count && requireUnique) || verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.TraceWarning("Client seems to be sending invalid answers at us. DDOS?"); cards = new List<Card>(); skill = null; players = new List<Player>(); return false; } return true; }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { answerPending = new Semaphore(0, 1); int timeOut = TimeOutSeconds + (verifier.Helper != null ? verifier.Helper.ExtraTimeOutSeconds : 0); proxy.AskForCardUsage(prompt, verifier, timeOut); skill = null; cards = null; players = null; if (answerPending.WaitOne(timeOut * 1000)) { skill = answerSkill; cards = answerCards; players = answerPlayers; } cards = cards ?? new List<Card>(); players = players ?? new List<Player>(); return (verifier.FastVerify(HostPlayer, answerSkill, cards, players) == VerifierResult.Success); }
public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { answerPending = new Semaphore(0, 1); int timeOut = _GetActualTimeoutSecond(verifier.Helper); proxy.AskForCardUsage(prompt, verifier, timeOut); skill = null; cards = null; players = null; if (answerPending.WaitOne(timeOut * 1000/* + GameDelays.UiDelayCompensation*/)) { skill = answerSkill; cards = answerCards; players = answerPlayers; } cards = cards ?? new List<Card>(); players = players ?? new List<Player>(); return (verifier.FastVerify(HostPlayer, answerSkill, cards, players) == VerifierResult.Success); }
public bool TryAskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List <Card> cards, out List <Player> players) { cards = null; skill = null; players = null; int timeOut = TimeOutSeconds + (verifier.Helper != null ? verifier.Helper.ExtraTimeOutSeconds : 0); Trace.TraceInformation("Asking Card Usage to {0}, timeout {1}.", HostPlayer.Id, timeOut); var answerReady = new Semaphore(0, Int16.MaxValue); CardUsageAnsweredEventHandler handler = (s, c, p) => { skillAnswer = s; cardsAnswer = c; playersAnswer = p; answerReady.Release(1); }; proxy.CardUsageAnsweredEvent += handler; proxy.AskForCardUsage(prompt, verifier, timeOut); bool noAnswer = false; if (!answerReady.WaitOne(timeOut * 1000)) { noAnswer = true; } proxy.CardUsageAnsweredEvent -= handler; proxy.Freeze(); if (noAnswer) { return(false); } skill = skillAnswer; cards = cardsAnswer; players = playersAnswer; if (skill != null && !(skill is CheatSkill) && !HostPlayer.ActionableSkills.Contains(skill)) { Trace.TraceWarning("Client DDOS!"); return(false); } if (cards != null) { foreach (var item in cards) { if (item == null) { return(false); } if (item.Owner != HostPlayer) { if (!(verifier.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType) || (skill != null && skill.Helper.OtherDecksUsed.Any(dc => dc == item.Place.DeckType)) || (verifier.Helper.OtherGlobalCardDeckUsed.Any(dc => dc.Key.Player == item.Place.Player && dc.Key.DeckType == item.Place.DeckType)) || (skill != null && skill.Helper.OtherGlobalCardDeckUsed.Any(dc => dc.Key.Player == item.Place.Player && dc.Key.DeckType == item.Place.DeckType)))) { Trace.TraceWarning("Client hacking cards!"); return(false); } } } } else { cards = new List <Card>(); } if (players != null) { foreach (var item in players) { if (item == null) { return(false); } } } else { players = new List <Player>(); } bool requireUnique = true; if (skill is ActiveSkill) { if ((skill as ActiveSkill).Helper != null && (skill as ActiveSkill).Helper.IsPlayerRepeatable) { requireUnique = false; } } if ((players != null && players.Distinct().Count() != players.Count && requireUnique) || verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.TraceWarning("Client seems to be sending invalid answers at us. DDOS?"); cards = new List <Card>(); skill = null; players = new List <Player>(); return(false); } return(true); }
public bool TryAskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players) { cards = null; skill = null; players = null; Trace.TraceInformation("Asking Card Usage to {0}, timeout {1}.", HostPlayer.Id, TimeOutSeconds); int? count; if (!server.ExpectNext(clientId, TimeOutSeconds)) { return false; } count = server.GetInt(clientId, 0); if (count == null || count == 0) { return false; } if (count == null) { return false; } count = server.GetInt(clientId, 0); if (count == 1) { skill = server.GetSkill(clientId, 0); if (skill == null) { return false; } if (!(skill is CheatSkill) && !HostPlayer.ActionableSkills.Contains(skill)) { Trace.TraceWarning("Client DDOS!"); return false; } } count = server.GetInt(clientId, 0); if (count == null) { return false; } if (count == 0) { cards = null; } else { cards = new List<Card>(); } while (count-- > 0) { Card item = server.GetCard(clientId, 0); if (item == null) { return false; } if (item.Owner != HostPlayer) { Trace.TraceWarning("Client DDOS!"); return false; } cards.Add(item); } count = server.GetInt(clientId, 0); if (count == null) { return false; } if (count == 0) { players = null; } else { players = new List<Player>(); } while (count-- > 0) { Player item = server.GetPlayer(clientId, 0); if (item == null) { return false; } players.Add(item); } if (verifier.FastVerify(HostPlayer, skill, cards, players) != VerifierResult.Success) { Trace.TraceWarning("Client seems to be sending invalid answers at us. DDOS?"); cards = null; skill = null; players = null; return false; } return true; }
bool IPlayerProxy.AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List <Card> cards, out List <Player> players) { Player p = hostPlayer; Console.Write("I AM PLAYER {0}({1}): ", p.Id, p.Hero.Name); cards = new List <Card>(); VerifierResult r = verifier.FastVerify(HostPlayer, null, null, null); skill = null; Console.Write("Ask for card usage, {0}: ", prompt); int i = 0; foreach (ICard card in Game.CurrentGame.Decks[p, DeckType.Hand]) { Console.Write(" Card {0} {1}{2}{3}, ", i, card.Suit, card.Rank, card.Type.Name); i++; } again: Console.Write("Card id, -1 to trigger"); string ids = Console.ReadLine(); if (ids == null) { Thread.Sleep(200); cards = null; players = null; return(false); } int id = int.Parse(ids); if (id < -1) { cards = null; players = null; } else { if (id == -1) { Console.Write("Skill ID:"); ids = Console.ReadLine(); id = int.Parse(ids); if (id >= hostPlayer.Skills.Count || ((!(hostPlayer.Skills[id] is ActiveSkill)) && (!(hostPlayer.Skills[id] is CardTransformSkill)))) { goto again; } skill = hostPlayer.Skills[id]; while (true) { Console.Write("Card id, -1 to end"); ids = Console.ReadLine(); id = int.Parse(ids); if (id < 0) { break; } if (id >= Game.CurrentGame.Decks[p, DeckType.Hand].Count) { continue; } cards.Add(Game.CurrentGame.Decks[p, DeckType.Hand][id]); } } else { if (id < Game.CurrentGame.Decks[p, DeckType.Hand].Count) { cards.Add(Game.CurrentGame.Decks[p, DeckType.Hand][id]); } } players = null; r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Success) { return(true); } if (r == VerifierResult.Fail) { Console.Write("Failed check, again? 1 yes 0 no"); ids = Console.ReadLine(); id = int.Parse(ids); if (id == 1) { goto again; } } } { players = new List <Player>(); while (true) { Console.WriteLine(""); Console.Write("Target player: -1 to end"); ids = Console.ReadLine(); id = int.Parse(ids); if (id < 0) { break; } if (id > Game.CurrentGame.Players.Count) { Console.WriteLine("out of range"); } else { players.Add(Game.CurrentGame.Players[id]); } r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Partial) { Console.WriteLine("Require more"); } if (r == VerifierResult.Fail) { Console.WriteLine("Failed check"); players.Remove(Game.CurrentGame.Players[id]); } } r = verifier.FastVerify(HostPlayer, skill, cards, players); if (r == VerifierResult.Success) { return(true); } if (r == VerifierResult.Fail) { Console.Write("Failed check, again? 1 yes 0 no"); ids = Console.ReadLine(); id = int.Parse(ids); if (id == 1) { goto again; } } players = null; skill = null; cards = null; return(false); } }