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))); }
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())); }
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())); }
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())); }
protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p) { var candidates = p.Candidates <Card>() .OrderBy(x => ScoreCalculator.CalculateDiscardScore(x, Ai.IsSearchInProgress)); return(Group(candidates, p.MaxTargetCount(), add: (trg, trgs) => trgs.Cost.Add(trg))); }
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 candidates = p.Candidates <Card>(ControlledBy.Opponent) .OrderByDescending(x => x.Score) .ToList(); var pickedCount = Math.Min(p.MaxTargetCount(), candidates.Count); return(Group(candidates, pickedCount)); }
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>()); }
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())); }
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())); }
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())); }
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.MinTargetCount(), p.MaxTargetCount())); }
protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p) { return(Group(p.Candidates <Player>(), p.MinTargetCount(), p.MaxTargetCount())); }
protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p) { var candidates = GetBounceCandidates(p); return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount())); }
protected override IEnumerable <Targets> SelectTargets(TargetingRuleParameters p) { var candidates = PreventNextDamage.GetCandidates(_amount, p, Game); return(Group(candidates, p.MinTargetCount(), p.MaxTargetCount())); }