Sanguosha.Core.Games.Game.ForcePlayerDiscard C# (CSharp) Méthode

ForcePlayerDiscard() public méthode

public ForcePlayerDiscard ( Player player, NumberOfCardsToForcePlayerDiscard numberOfCards, bool canDiscardEquipment, bool atOnce = true ) : void
player Player
numberOfCards NumberOfCardsToForcePlayerDiscard
canDiscardEquipment bool
atOnce bool
Résultat void
        public void ForcePlayerDiscard(Player player, NumberOfCardsToForcePlayerDiscard numberOfCards, bool canDiscardEquipment, bool atOnce = true)
        {
            if (player.IsDead) return;
            Trace.TraceInformation("Player {0} discard.", player);
            int cannotBeDiscarded = 0;
            int numberOfCardsDiscarded = 0;
            while (true)
            {
                int handCardCount = Decks[player, DeckType.Hand].Count; // 玩家手牌数
                int equipCardCount = Decks[player, DeckType.Equipment].Count; // 玩家装备牌数
                int toDiscard = numberOfCards(player, numberOfCardsDiscarded);
                // Have we finished discarding everything?
                // We finish if
                //      玩家手牌数 小于等于 我们要强制弃掉的数目
                //  或者玩家手牌数 (小于)等于 不可弃的牌的数目(此时装备若可弃,必须弃光)
                if (toDiscard == 0 || (handCardCount <= cannotBeDiscarded && (!canDiscardEquipment || equipCardCount == 0)))
                {
                    break;
                }
                Trace.Assert(UiProxies.ContainsKey(player));
                IPlayerProxy proxy = UiProxies[player];
                ISkill skill;
                List<Card> cards;
                List<Player> players;
                cannotBeDiscarded = 0;
                foreach (Card c in Decks[player, DeckType.Hand])
                {
                    if (!PlayerCanDiscardCard(player, c))
                    {
                        cannotBeDiscarded++;
                    }
                }
                int totalCards = (canDiscardEquipment ? equipCardCount : 0) + handCardCount;
                int numCanBeDiscarded = totalCards - cannotBeDiscarded;
                //如果玩家无法达到弃牌要求 则 摊牌
                bool status = cannotBeDiscarded == 0 || (numCanBeDiscarded >= toDiscard);
                SyncConfirmationStatus(ref status);
                if (!status)
                {
                    SyncImmutableCardsAll(Decks[player, DeckType.Hand]);
                    ShowHandCards(player, Decks[player, DeckType.Hand]);
                    if (Game.CurrentGame.IsClient)
                    {
                        //刷新所有客户端该玩家不可弃掉的牌的数目
                        cannotBeDiscarded = 0;
                        foreach (Card c in Decks[player, DeckType.Hand])
                        {
                            if (!PlayerCanDiscardCard(player, c))
                            {
                                cannotBeDiscarded++;
                            }
                        }
                    }
                }
                int minimum;
                int numShouldDiscard = status ? toDiscard : numCanBeDiscarded;
                if (!atOnce) minimum = 1;
                else minimum = numShouldDiscard;
                bool answered = false;
                cards = new List<Card>();
                if (minimum < numCanBeDiscarded)
                {
                    var v = new PlayerForceDiscardVerifier(numShouldDiscard, canDiscardEquipment, minimum);
                    answered = proxy.AskForCardUsage(new Prompt(Prompt.DiscardPhasePrompt, toDiscard),
                                                     v, out skill, out cards, out players);
                }

                if (!answered)
                {
                    //玩家没有回应(default)
                    Trace.TraceInformation("Invalid answer, choosing for you");
                    int cardsDiscarded = 0;
                    var chooseFrom = new List<Card>(Decks[player, DeckType.Hand]);
                    if (canDiscardEquipment)
                    {
                        chooseFrom.AddRange(Decks[player, DeckType.Equipment]);
                    }
                    foreach (Card c in chooseFrom)
                    {
                        if (PlayerCanDiscardCard(player, c))
                        {
                            cards.Add(c);
                            cardsDiscarded++;
                        }
                        if (cardsDiscarded == toDiscard)
                        {
                            SyncCardsAll(cards);
                            break;
                        }
                    }
                }
                numberOfCardsDiscarded += cards.Count;
                HandleCardDiscard(player, cards);
            }
        }