Exemplo n.º 1
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            if (Stack.CanTopSpellReducePlayersLifeToZero(p.Controller))
            {
                var candidates1 = p.Candidates <Card>()
                                  .OrderBy(x => x.Score);

                return(Group(candidates1, p.MinTargetCount(), add: (target, targets) => targets.Cost.Add(target)));
            }

            var candidates = new List <Card>();

            if (Turn.Step == Step.DeclareBlockers && Stack.IsEmpty)
            {
                candidates.AddRange(
                    p.Candidates <Card>()
                    .Where(x => Combat.CanBeDealtLeathalCombatDamage(x))
                    .Where(x => !Combat.CanKillAny(x)));
            }

            candidates.AddRange(
                p.Candidates <Card>()
                .Where(x => Stack.CanBeDestroyedByTopSpell(x)));

            return(Group(candidates, p.MinTargetCount(), add: (target, targets) => targets.Cost.Add(target)));
        }
Exemplo n.º 2
0
        private IEnumerable <Targets> SelectTargets2Selectors(TargetingRuleParameters p)
        {
            Asrt.True(p.EffectTargetTypeCount <= 2, "More than 2 effect selectors currently not supported.");

            var candidates1 = GetCandidates(p, 0).Cast <ITarget>().ToList();
            var candidates2 = GetCandidates(p, 1).Cast <ITarget>().ToList();

            return(Group(candidates1, candidates2, minTargetCount1: p.MinTargetCount(selectorIndex: 0),
                         minTargetCount2: p.MinTargetCount(selectorIndex: 1)));
        }
Exemplo n.º 3
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(_controlledBy)
                             .OrderBy(x => _rank(x));

            if (p.HasEffectCandidates)
            {
                return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount()));
            }

            return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount(), (trg, trgs) => trgs.AddCost(trg)));
        }
Exemplo n.º 4
0
        private IEnumerable <Targets> SelectTargets2Selectors(TargetingRuleParameters p)
        {
            Asrt.True(p.EffectTargetTypeCount <= 2, "More than 2 effect selectors currently not supported.");

            var amount = _getAmount(p);

            var candidates1 = GetCandidatesByDescendingDamageScore(amount, p, selectorIndex: 0);
            var candidates2 = GetCandidatesByDescendingDamageScore(amount, p, selectorIndex: 1);

            return(Group(candidates1, candidates2, minTargetCount1: p.MinTargetCount(selectorIndex: 0),
                         minTargetCount2: p.MinTargetCount(selectorIndex: 1)));
        }
Exemplo n.º 5
0
        protected override IEnumerable <Targets> ForceSelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>()
                             .OrderBy(_forceRank);


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

            return(Group(candidates, p.MinTargetCount(), add: (trg, trgs) => trgs.AddCost(trg)));
        }
Exemplo n.º 6
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .OrderByDescending(x => x.Score);

            return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 7
0
        protected override IEnumerable <Targets> ForceSelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .OrderBy(x => x.Score);

            return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 8
0
        protected override IEnumerable <Targets> ForceSelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>()
                             .OrderBy(c => c.Score);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 9
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .Where(c => c.IsAttacker || c.CanBlock())
                             .Select(c =>
            {
                for (var i = 0; i < _abilities.Count; i++)
                {
                    var ability = _abilities[i];

                    if (c.Has().Has(ability))
                    {
                        return new
                        {
                            Card = c,
                            Rank = i
                        }
                    }
                    ;
                }

                return(new
                {
                    Card = c,
                    Rank = -1
                });
            })
                             .Where(x => x.Rank != -1)
                             .OrderBy(x => x.Rank)
                             .ThenByDescending(x => x.Card.Power * 2 + x.Card.Toughness)
                             .Select(x => x.Card);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 10
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = GetCandidatesForProtectionFromTopSpell(p)
                             .OrderByDescending(x => x.Score);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 11
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = GetCandidatesThatCanBeDestroyed(p)
                             .Where(x => !x.Has().Indestructible)
                             .OrderByDescending(x => x.Card().Score);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 12
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>()
                             .OrderBy(x => x.Score);

            return(Group(candidates, p.MinTargetCount(),
                         add: (trg, trgs) => trgs.Cost.Add(trg)));
        }
Exemplo n.º 13
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .Where(x => x.IsTapped && !x.Is().Land)
                             .OrderByDescending(x => x.Score);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 14
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .Where(attacker => _filter(attacker))
                             .OrderByDescending(CalculateScore);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 15
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.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 16
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.MinTargetCount(), p.MaxTargetCount()));
        }
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var costTargets = p.Candidates <Card>(selectorIndex: 0, selector: c => c.Cost)
                              .OrderBy(x => x.IsTapped ? 0 : 1)
                              .ThenBy(x => x.Score)
                              .Take(1);

            return(Group(costTargets, p.MinTargetCount(), add: (t, trgs) => trgs.AddCost(t)));
        }
Exemplo n.º 18
0
        protected override IEnumerable <Targets> ForceSelectTargets(TargetingRuleParameters p)
        {
            // triggered abilities force you to choose a target even if its
            // not favorable e.g Flaming Kavu

            var candidates = p.Candidates <Card>().OrderByDescending(x => x.Toughness);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 19
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .OrderByDescending(x => x.IsTapped ? 1 : 0)
                             .Select(x => x)
                             .ToList();

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 20
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = p.Candidates <Card>(ControlledBy.SpellOwner)
                             .Where(c => c.CanBlock())
                             .Where(c => !c.Has().Flying&& !c.Has().Reach)
                             .OrderByDescending(x => x.Power);

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 21
0
        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.MinTargetCount(), p.MaxTargetCount()));
            }

            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.MinTargetCount(), p.MaxTargetCount()));
            }

            return(None <Targets>());
        }
Exemplo n.º 22
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.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 23
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var power     = _power(p) ?? p.MaxX;
            var toughness = _toughness(p) ?? p.MaxX;

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

            if (IsBeforeYouDeclareAttackers(p.Controller))
            {
                candidates = candidates.Select(x => new
                {
                    Card  = x.Card(),
                    Score = CalculateAttackingPotential(x)
                })
                             .OrderByDescending(x => x.Score)
                             .Select(x => x.Card)
                             .ToList();
            }

            else if (IsAfterOpponentDeclaresBlockers(p.Controller))
            {
                candidates = GetBestAttackersForPTGain(power, toughness, candidates);
            }

            else if (IsAfterYouDeclareBlockers(p.Controller))
            {
                candidates = GetBestBlockersForPTGain(power, toughness, candidates);
            }

            else if (_untilEot == false && IsEndOfOpponentsTurn(p.Controller))
            {
                candidates = candidates
                             .OrderBy(x => x.Toughness);
            }

            else if (_untilEot == false && Stack.CanBeDestroyedByTopSpell(p.Card))
            {
                candidates = candidates
                             .OrderBy(x => x.Toughness);
            }

            else if (toughness > 0)
            {
                candidates = candidates
                             .Where(x => Stack.CanBeDealtLeathalDamageByTopSpell(x.Card()));
            }

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 24
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.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 25
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var amount = _getAmount(p);

            var candidates = p.Candidates <Card>(ControlledBy.Opponent)
                             .Select(x => new
            {
                Target = x,
                Score  = x.Life <= amount ? x.Score : 0
            })
                             .Where(x => x.Score > 0)
                             .OrderByDescending(x => x.Score)
                             .Select(x => x.Target);

            return(Group(candidates, p.MinTargetCount()));
        }
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var targetCandidates = GetCandidatesThatCanBeDestroyed(p)
                                   .OrderByDescending(x => x.Score)
                                   .ToList();

            if (targetCandidates.Count == 1 && targetCandidates[0] == p.Card)
            {
                // if owner is the only one that can be killed
                // target the owner
                return(Group(targetCandidates, 1));
            }

            // otherwise return all except the owner
            return(Group(targetCandidates.Where(x => x != p.Card), p.MinTargetCount()));
        }
Exemplo n.º 27
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            if (p.DistributeAmount > 0)
            {
                return(SelectTargetsDistribute(p));
            }

            if (p.EffectTargetTypeCount > 1)
            {
                // e.g shower of sparks
                return(SelectTargets2Selectors(p));
            }

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

            return(Group(candidates, p.MinTargetCount()));
        }
Exemplo n.º 28
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.MinTargetCount(), p.MaxTargetCount()));
        }
Exemplo n.º 29
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = new List <Card>();

            if (Turn.Step == Step.DeclareBlockers)
            {
                candidates.AddRange(
                    p.Candidates <Card>()
                    .Where(x => _filter(x))
                    .Where(x => Combat.CanBeDealtLeathalCombatDamage(x))
                    .Where(x => !Combat.CanKillAny(x)));
            }

            candidates.AddRange(
                p.Candidates <Card>()
                .Where(x => _filter(x))
                .Where(x => Stack.CanBeDestroyedByTopSpell(x)));

            return(Group(candidates, p.MinTargetCount(), add: (trg, trgs) => trgs.AddCost(trg)));
        }
Exemplo n.º 30
0
        protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p)
        {
            var candidates = GetCandidatesForProtectionFromTopSpell(p)
                             .OrderByDescending(x => x.Score)
                             .ToList();

            if (IsBeforeYouDeclareAttackers(p.Controller))
            {
                candidates.AddRange(
                    p.Candidates <Card>(ControlledBy.SpellOwner)
                    .Where(x => x.CanAttack)
                    .OrderByDescending(CalculateAttackerScoreForThisTurn));
            }
            else if (IsBeforeYouDeclareBlockers(p.Controller))
            {
                candidates.AddRange(
                    p.Candidates <Card>(ControlledBy.SpellOwner)
                    .Where(x => x.CanBlock())
                    .OrderByDescending(x => x.Power));
            }

            return(Group(candidates, p.MinTargetCount()));
        }