Пример #1
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .OrderByDescending(x => x.Score);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #2
0
        private IEnumerable <Targets> SelectTargetsDistribute(TargetingRuleParameters p, List <Card> candidates)
        {
            var minCount = p.TotalMinTargetCount();
            var maxCount = p.TotalMaxTargetCount();

            if (candidates.Count < minCount)
            {
                return(None <Targets>());
            }

            var targetsCount = Math.Min(candidates.Count, maxCount);

            var targets = candidates
                          .Take(targetsCount)
                          .Cast <ITarget>()
                          .ToList();

            var amount       = p.DistributeAmount / targetsCount;
            var distribution = Enumerable.Range(amount, targetsCount).ToList();

            var reminder = p.DistributeAmount % targetsCount;

            for (int i = 0; i < reminder; i++)
            {
                distribution[i]++;
            }

            return(Group(targets, distribution));
        }
Пример #3
0
        protected override IEnumerable <Targets> ForceSelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .OrderBy(x => x.Score);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #4
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .Where(x => (!_blockOnly && x.IsAbleToAttack) || (!_attackOnly && !x.Has().CannotBlock))
                             .OrderByDescending(x => 2 * x.Power + x.Toughness);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #5
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>()
                             .OrderBy(_orderBy);

            return(Group(candidates, p.TotalMaxTargetCount(),
                         add: (trg, trgs) => trgs.Cost.Add(trg)));
        }
Пример #6
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>()
                             .Where(x => x.IsGoodTarget(p.Card, p.Card.Controller))
                             .OrderByDescending(x => x.Score)
                             .ToList();

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #7
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .OrderByDescending(x => x.Score)
                             .ToList();

            var pickedCount = Math.Min(p.TotalMaxTargetCount(), candidates.Count);

            return(Group(candidates, pickedCount));
        }
Пример #8
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            if (p.EffectTargetTypeCount > 1)
            {
                return(SelectTargets2Selectors(p));
            }

            var candidates = GetCandidates(p).ToList();

            if (p.DistributeAmount > 0)
            {
                return(SelectTargetsDistribute(p, candidates));
            }

            if (p.HasEffectCandidates)
            {
                return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
            }

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount(), (trg, trgs) => trgs.AddCost(trg)));
        }
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            if (IsAfterOpponentDeclaresAttackers(p.Controller))
            {
                var attackerCandidates = p.Candidates <Card>(ControlledBy.Opponent)
                                         .Where(x => x.IsAttacker)
                                         .OrderByDescending(CalculateAttackerScoreForThisTurn);

                return(Group(attackerCandidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
            }

            if (IsAfterOpponentDeclaresBlockers(p.Controller))
            {
                var blockerCandidates = p.Candidates <Card>(ControlledBy.Opponent)
                                        .Where(x => x.IsBlocker)
                                        .OrderByDescending(x =>
                {
                    var attacker = Combat.FindBlocker(x).Attacker;

                    if (attacker == null)
                    {
                        return(0);
                    }

                    var blockers = attacker.Blockers.Select(b => b.Card);

                    if (QuickCombat.CanAttackerBeDealtLeathalDamage(attacker, blockers))
                    {
                        return(attacker.Card.Score);
                    }

                    return(0);
                }
                                                           );

                return(Group(blockerCandidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
            }

            return(None <Targets>());
        }
Пример #10
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .Select(x => new
            {
                Card  = x,
                Score = x.Has().DoesNotUntap ? 0 : CalculateAttackingPotential(x)
            })
                             .OrderByDescending(x => x.Score)
                             .Select(x => x.Card)
                             .ToList();

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #11
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .Where(x => p.Controller.IsActive ? x.CanBlock() : x.CanAttack)
                             .Select(x => new
            {
                Card   = x,
                Damage = CalculateAttackerScoreForThisTurn(x)
            })
                             .Where(x => x.Damage > 0)
                             .OrderByDescending(x => x.Damage)
                             .ThenByDescending(x => x.Card.Score)
                             .Select(x => x.Card);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #12
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var power     = _power ?? p.MaxX;
            var toughness = _toughness ?? p.MaxX;

            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner);;

            if (p.Controller.IsActive && Turn.Step == Step.DeclareBlockers)
            {
                candidates = GetBestAttackersForPTGain(power, toughness, candidates);
            }
            else if (!p.Controller.IsActive && Turn.Step == Step.DeclareBlockers)
            {
                candidates = GetBestBlockersForPTGain(power, toughness, candidates);
            }

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #13
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = new List <Card>();

            if (p.Controller.IsActive && Turn.Step == Step.DeclareBlockers)
            {
                candidates.AddRange(
                    p.Candidates <Card>(ControlledBy.SpellOwner)
                    .Where(x => x.IsAttacker && !x.HasBlockers)
                    .Where(x => x.Toughness > x.Power)
                    .OrderByDescending(x => x.Toughness));
            }

            if ((!p.Controller.IsActive && Turn.Step == Step.EndOfTurn) || (p.Controller.IsActive && Turn.Step == Step.BeginningOfCombat))
            {
                candidates.AddRange(
                    p.Candidates <Card>(ControlledBy.Opponent)
                    .Where(x => x.Damage >= x.Power)
                    .OrderByDescending(x => x.Score)
                    );
            }

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #14
0
 protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
 {
     return(Group(p.Candidates <Player>(), p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
 }
Пример #15
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = GetBounceCandidates(p);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }
Пример #16
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = PreventNextDamage.GetCandidates(_amount, p, Game);

            return(Group(candidates, p.TotalMinTargetCount(), p.TotalMaxTargetCount()));
        }