Exemple #1
0
    public override IEnumerator PerformPhase(Game game)
    {
        Player activePlayer = game.Players.Find(p => p.IsActive);

        List <Tile> allTiles = new List <Tile>(activePlayer.HandZone.Tiles);

        allTiles.AddRange(activePlayer.StealZone.Tiles);
        allTiles.Sort(Tile.CompareTiles);

        List <HandCombination> validCombs = game.ReturnValidCombinations(allTiles, HandCombination.CompletionType.Draw);

        if (validCombs.Count > 0)
        {
            Decision decision = new CompleteHandDecision(activePlayer, game, HandCombination.CompletionType.Draw);
            game.EnqueueDecision(decision);
            yield return(0);

            string resp = (string)decision.Response[0];

            if (resp.Equals("Complete"))
            {
                activePlayer.ScorePointsWithHandComb(validCombs, game.Players.Where(p => p != activePlayer).ToList());
                game.EnqueueDecision(new DisplayCompletedHandDecision(activePlayer, game, validCombs));
                yield return(0);

                game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseID.EndRound));
            }
        }

        yield break;
    }
Exemple #2
0
    public override IEnumerator PerformPhase(Game game)
    {
        Player activePlayer = game.Players.Find(p => p.IsActive);

        // Make list of players in steal priority order.
        Queue <Player> stealPriorityOrder = new Queue <Player>();
        int            startIdx           = (activePlayer.Id + 1) % game.Players.Count;

        for (int i = 0; i < game.Players.Count; ++i)
        {
            Player player = game.Players[(startIdx + i) % game.Players.Count];
            if (player != activePlayer)
            {
                stealPriorityOrder.Enqueue(player);
            }
        }

        Tile stealableTile = activePlayer.DiscardZone.Tiles.Last();

        Queue <Player> requestOrder        = new Queue <Player>();
        int            priorityPlayerCount = stealPriorityOrder.Count;

        List <HandCombination>[] validCombsPerPlayer = new List <HandCombination> [game.Players.Count];
        for (int i = 0; i < priorityPlayerCount; ++i)
        {
            Player player = stealPriorityOrder.Dequeue();

            List <HandCombination> validCombs = this.GetPotentialHandCompletions(game, player, stealableTile);

            if (validCombs.Count > 0)
            {
                requestOrder.Enqueue(player);
            }
            else
            {
                stealPriorityOrder.Enqueue(player);
            }
            validCombsPerPlayer[player.Id] = validCombs;
        }

        while (stealPriorityOrder.Count > 0)
        {
            requestOrder.Enqueue(stealPriorityOrder.Dequeue());
        }

        while (requestOrder.Count > 0)
        {
            Player player = requestOrder.Dequeue();

            List <HandCombination> validCombs = validCombsPerPlayer[player.Id];

            if (validCombs.Count > 0)
            {
                Decision decision = new CompleteHandDecision(player, game, HandCombination.CompletionType.Steal);
                game.EnqueueDecision(decision);
                yield return(0);

                string resp = (string)decision.Response[0];

                if (resp.Equals("Complete"))
                {
                    player.StealTileForCompletion(stealableTile, activePlayer);
                    player.ScorePointsWithHandComb(validCombs, new List <Player>()
                    {
                        activePlayer
                    });
                    game.EnqueueDecision(new DisplayCompletedHandDecision(player, game, validCombs));
                    yield return(0);

                    game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseID.EndRound));

                    break;
                }
            }
            else if (player.CanStealTileForMerge(stealableTile))
            {
                Decision decision = new StealDiscardDecision(player, game);
                game.EnqueueDecision(decision);
                yield return(0);

                string response = (string)decision.Response[0];

                if (response.Equals("Steal"))
                {
                    game.EnqueueCommand(new StealTileCommand(activePlayer, player, stealableTile));
                    game.EnqueueCommand(new ChangeActivePlayerCommand(activePlayer, player));
                    game.EnqueueCommand(new ChangeNextPhaseCommand(PhaseNode.PhaseID.Discard));
                    break;
                }
            }
        }

        yield break;
    }