private List <List <Card> > GetAttackersDeclarations() { var results = new List <List <Card> >(); var noAttackers = new List <Card>(); results.Add(noAttackers); var allAttackers = Controller.Battlefield.CreaturesThatCanAttack.ToList(); if (allAttackers.Count > 0) { var parameters = new AttackStrategyParameters { AttackerCandidates = allAttackers, BlockerCandidates = Defender.Battlefield.CreaturesThatCanBlock.ToList(), DefendingPlayersLife = Defender.Life }; var chosenAttackers = new AttackStrategy(parameters).ChooseAttackers(); if (chosenAttackers.Count > 0) { results.Add(chosenAttackers); } if (chosenAttackers.Count < allAttackers.Count) { results.Add(allAttackers); } } return(results); }
private List <ChosenAttackers> GetAttackersDeclarations() { var results = new List <ChosenAttackers>(); // First choice: only attackers that must attack results.Add(SelectAttackTarget(CreaturesThatMustAttack)); var everyCreatureThatCanAttack = RemoveAttackersIfWeCannotAffordToPayCombatCost( Controller.Battlefield.CreaturesThatCanAttack.ToList()); if (everyCreatureThatCanAttack.Count > CreaturesThatMustAttack.Count) { var parameters = new AttackStrategyParameters { AttackerCandidates = everyCreatureThatCanAttack, BlockerCandidates = Defender.Battlefield.CreaturesThatCanBlock.ToList(), DefendingPlayersLife = Defender.Life }; var greedyAttackers = new AttackStrategy(parameters) .ChooseAttackers() .Concat(CreaturesThatMustAttack) .Distinct() .ToList(); if (greedyAttackers.Count > CreaturesThatMustAttack.Count) { // Second choice: attackers selected by greedy attack strategy results.Add(SelectAttackTarget(greedyAttackers)); } if (greedyAttackers.Count < everyCreatureThatCanAttack.Count) { // Third choice: every creature that can attack results.Add(SelectAttackTarget(everyCreatureThatCanAttack)); } } return(results); }