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);
}
}