private void UsageProxyListenerThread(UsageListenerThreadParameters para)
 {
     game.RegisterCurrentThread();
     try
     {
         ISkill        skill;
         List <Card>   cards;
         List <Player> players;
         if (para.proxy.TryAskForCardUsage(para.prompt, para.verifier, out skill, out cards, out players))
         {
             semAccess.WaitOne();
             answerSkill  = skill;
             answerCard   = cards;
             answerPlayer = players;
             responder    = para.proxy.HostPlayer;
             semWake.Release(1);
         }
         if (!semDone.WaitOne(0))
         {
             Trace.TraceInformation("All done");
             semWake.Release(1);
         }
     }
     catch (Exception)
     {
     }
 }
 private void MultiUsageProxyListenerThread(UsageListenerThreadParameters para)
 {
     game.RegisterCurrentThread();
     try
     {
         ISkill        skill;
         List <Card>   cards;
         List <Player> players;
         if (para.proxy.TryAskForCardUsage(para.prompt, para.verifier, out skill, out cards, out players))
         {
             semAccess.WaitOne();
             manswerSkill.Add(para.player, skill);
             manswerCards.Add(para.player, cards);
             manswerPlayers.Add(para.player, players);
             semAccess.Release(1);
             para.proxy.SendMultipleCardUsageResponded(para.player);
         }
         if (!semDone.WaitOne(0))
         {
             Trace.TraceInformation("All done");
             semWake.Release(1);
         }
     }
     catch (Exception)
     {
     }
 }
示例#3
0
        public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List<Card> cards, out List<Player> players, out Player respondingPlayer)
        {
            proxyListener = new Dictionary<Player, Thread>();
            semAccess = new Semaphore(1, 1);
            semWake = new Semaphore(0, 2);
            semDone = new Semaphore(Game.CurrentGame.AlivePlayers.Count - 1, Game.CurrentGame.AlivePlayers.Count - 1);
            answerSkill = null;
            answerCard = null;
            answerPlayer = null;
            respondingPlayer = null;
            foreach (var player in Game.CurrentGame.AlivePlayers)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                UsageListenerThreadParameters para = new UsageListenerThreadParameters();
                para.prompt = prompt;
                para.proxy = proxy[player];
                para.verifier = verifier;
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) => {
                        UsageProxyListenerThread((UsageListenerThreadParameters)p);
                    })) { IsBackground = true };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            bool ret = true;
            if (!semWake.WaitOne(TimeOutSeconds * 1000))
            {
                semAccess.WaitOne(0);
                skill = null;
                cards = null;
                players = null;
                respondingPlayer = null;
                ret = false;
            }
            else
            {
                skill = answerSkill;
                cards = answerCard;
                players = answerPlayer;
                respondingPlayer = responder;
            }
            //if it didn't change, then semDone was triggered
            if (skill == null && cards == null && players == null)
            {
                ret = false;
            }
            if (cards == null) cards = new List<Card>();
            if (players == null) players = new List<Player>();
            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
                proxy[pair.Key].NextQuestion();
            }
            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                else
                {
                    proxy[player].SendCardUsage(skill, cards, players, verifier);
                    break;
                }
            }

            return ret;
        }
示例#4
0
        private void UsageProxyListenerThread(UsageListenerThreadParameters para)
        {
            game.RegisterCurrentThread();
            ISkill skill;
            List<Card> cards;
            List<Player> players;
            if (para.proxy.TryAskForCardUsage(para.prompt, para.verifier, out skill, out cards, out players))
            {

                semAccess.WaitOne();
                answerSkill = skill;
                answerCard = cards;
                answerPlayer = players;
                responder = para.proxy.HostPlayer;
                semWake.Release(1);
            }
            if (!semDone.WaitOne(0))
            {
                Trace.TraceInformation("All done");
                semWake.Release(1);
            }
        }
示例#5
0
        private void MultiUsageProxyListenerThread(UsageListenerThreadParameters para)
        {
            game.RegisterCurrentThread();
            ISkill skill;
            List<Card> cards;
            List<Player> players;
            if (para.proxy.TryAskForCardUsage(para.prompt, para.verifier, out skill, out cards, out players))
            {

                semAccess.WaitOne();
                manswerSkill.Add(para.player, skill);
                manswerCards.Add(para.player, cards);
                manswerPlayers.Add(para.player, players);
                semAccess.Release(1);
                para.proxy.SendMultipleCardUsageResponded();
            }
            if (!semDone.WaitOne(0))
            {
                Trace.TraceInformation("All done");
                semWake.Release(1);
            }
        }
示例#6
0
        public void AskForMultipleCardUsage(Prompt prompt, ICardUsageVerifier verifier, List<Player> players, out Dictionary<Player, ISkill> askill, out Dictionary<Player, List<Card>> acards, out Dictionary<Player, List<Player>> aplayers)
        {
            proxyListener = new Dictionary<Player, Thread>();
            semAccess = new Semaphore(1, 1);
            semWake = new Semaphore(0, 2);
            semDone = new Semaphore(players.Count - 1, players.Count - 1);
            manswerSkill = new Dictionary<Player,ISkill>();
            manswerCards = new Dictionary<Player,List<Card>>();
            manswerPlayers = new Dictionary<Player,List<Player>>();
            foreach (var player in players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                UsageListenerThreadParameters para = new UsageListenerThreadParameters();
                para.player = player;
                para.prompt = prompt;
                para.proxy = proxy[player];
                para.verifier = verifier;
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) =>
                    {
                        MultiUsageProxyListenerThread((UsageListenerThreadParameters)p);
                    })) { IsBackground = true };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            semWake.WaitOne(TimeOutSeconds * 1000);
            semAccess.WaitOne(100);

            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
                proxy[pair.Key].NextQuestion();
            }

            foreach (var player in players)
            {
                if (!manswerSkill.ContainsKey(player))
                {
                    manswerSkill.Add(player, null);
                }
                if (!manswerCards.ContainsKey(player))
                {
                    manswerCards.Add(player, new List<Card>());
                }
                if (!manswerPlayers.ContainsKey(player))
                {
                    manswerPlayers.Add(player, new List<Player>());
                }
            }

            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                else
                {
                    foreach (var p in players)
                    {
                        proxy[player].SendCardUsage(manswerSkill[p], manswerCards[p], manswerPlayers[p], verifier);
                    }
                    break;
                }
            }

            askill = manswerSkill;
            acards = manswerCards;
            aplayers = manswerPlayers;
        }
        public bool AskForCardUsage(Prompt prompt, ICardUsageVerifier verifier, out ISkill skill, out List <Card> cards, out List <Player> players, out Player respondingPlayer)
        {
            Trace.Assert(Game.CurrentGame.AlivePlayers.Count > 1);
            proxyListener    = new Dictionary <Player, Thread>();
            semAccess        = new Semaphore(1, 1);
            semWake          = new Semaphore(0, 2);
            semDone          = new Semaphore(Game.CurrentGame.AlivePlayers.Count - 1, Game.CurrentGame.AlivePlayers.Count - 1);
            answerSkill      = null;
            answerCard       = null;
            answerPlayer     = null;
            respondingPlayer = null;
            foreach (var player in Game.CurrentGame.AlivePlayers)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                UsageListenerThreadParameters para = new UsageListenerThreadParameters();
                para.prompt   = prompt;
                para.proxy    = proxy[player];
                para.verifier = verifier;
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) => {
                    UsageProxyListenerThread((UsageListenerThreadParameters)p);
                }))
                {
                    IsBackground = true
                };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            bool ret = true;

            if (!semWake.WaitOne(TimeOutSeconds * 1000))
            {
                semAccess.WaitOne(0);
                skill            = null;
                cards            = null;
                players          = null;
                respondingPlayer = null;
                ret = false;
            }
            else
            {
                skill            = answerSkill;
                cards            = answerCard;
                players          = answerPlayer;
                respondingPlayer = responder;
            }
            //if it didn't change, then semDone was triggered
            if (skill == null && cards == null && players == null)
            {
                ret = false;
            }
            if (cards == null)
            {
                cards = new List <Card>();
            }
            if (players == null)
            {
                players = new List <Player>();
            }
            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
                proxy[pair.Key].NextQuestion();
            }
            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                else
                {
                    proxy[player].SendCardUsage(skill, cards, players, verifier);
                    break;
                }
            }

            return(ret);
        }
        public void AskForMultipleCardUsage(Prompt prompt, ICardUsageVerifier verifier, List <Player> players, out Dictionary <Player, ISkill> askill, out Dictionary <Player, List <Card> > acards, out Dictionary <Player, List <Player> > aplayers)
        {
            proxyListener  = new Dictionary <Player, Thread>();
            semAccess      = new Semaphore(1, 1);
            semWake        = new Semaphore(0, 2);
            semDone        = new Semaphore(players.Count - 1, players.Count - 1);
            manswerSkill   = new Dictionary <Player, ISkill>();
            manswerCards   = new Dictionary <Player, List <Card> >();
            manswerPlayers = new Dictionary <Player, List <Player> >();
            foreach (var player in players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                UsageListenerThreadParameters para = new UsageListenerThreadParameters();
                para.player   = player;
                para.prompt   = prompt;
                para.proxy    = proxy[player];
                para.verifier = verifier;
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) =>
                {
                    MultiUsageProxyListenerThread((UsageListenerThreadParameters)p);
                }))
                {
                    IsBackground = true
                };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            semWake.WaitOne(TimeOutSeconds * 1000);
            semAccess.WaitOne(100);

            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
                proxy[pair.Key].NextQuestion();
            }

            foreach (var player in players)
            {
                if (!manswerSkill.ContainsKey(player))
                {
                    manswerSkill.Add(player, null);
                }
                if (!manswerCards.ContainsKey(player))
                {
                    manswerCards.Add(player, new List <Card>());
                }
                if (!manswerPlayers.ContainsKey(player))
                {
                    manswerPlayers.Add(player, new List <Player>());
                }
            }

            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player))
                {
                    continue;
                }
                else
                {
                    foreach (var p in players)
                    {
                        proxy[player].SendCardUsage(manswerSkill[p], manswerCards[p], manswerPlayers[p], verifier);
                    }
                    break;
                }
            }

            askill   = manswerSkill;
            acards   = manswerCards;
            aplayers = manswerPlayers;
        }