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

HandleCardPlay() public méthode

处理玩家打出卡牌
public HandleCardPlay ( Player p, ISkill skill, List cards, List targets ) : bool
p Player
skill ISkill
cards List
targets List
Résultat bool
        public bool HandleCardPlay(Player p, ISkill skill, List<Card> cards, List<Player> targets)
        {
            Trace.Assert(cards != null);
            CardsMovement m = new CardsMovement();
            ICard result;
            bool status = CommitCardTransform(p, skill, cards, out result, targets, true);
            if (!status)
            {
                return false;
            }
            if (skill != null)
            {
                var r = result as CompositeCard;
                Trace.Assert(r != null);
                cards.Clear();
                cards.AddRange(r.Subcards);
            }
            m.Cards = new List<Card>(cards);
            m.To = new DeckPlace(null, DeckType.Discard);
            Player isDoingAFavor = p;
            foreach (var checkFavor in m.Cards)
            {
                if (checkFavor.Owner != p)
                {
                    Trace.TraceInformation("Acting on behalf of others");
                    isDoingAFavor = checkFavor.Owner;
                    break;
                }
            }
            result.Type.TagAndNotify(p, targets, result, GameAction.Play);
            List<Card> backup = new List<Card>(m.Cards);
            if (isDoingAFavor != p)
            {
                PlayerAboutToDiscardCard(isDoingAFavor, m.Cards, DiscardReason.Play);
                MoveCards(m, false, GameDelays.PlayerAction);
                PlayerLostCard(p, m.Cards);
                PlayerPlayedCard(isDoingAFavor, targets, result);
                PlayerPlayedCard(p, targets, result);
                PlayerDiscardedCard(isDoingAFavor, backup, DiscardReason.Play);
            }
            else
            {
                PlayerAboutToDiscardCard(p, m.Cards, DiscardReason.Play);
                MoveCards(m, false, GameDelays.PlayerAction);
                PlayerLostCard(p, m.Cards);
                PlayerPlayedCard(p, targets, result);
                PlayerDiscardedCard(p, backup, DiscardReason.Play);
            }
            Game.CurrentGame.LastAction = skill;
            return true;
        }