diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index fb05d635995..5744076f1f5 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1304,6 +1304,44 @@ public class AiController { AiAttackController aiAtk = new AiAttackController(attacker); lastAttackAggression = aiAtk.declareAttackers(combat); + // Check if we can reinforce with Banding creatures + if (!combat.getAttackers().isEmpty()) { + List bandsWithString = Arrays.asList("Bands with Other Legendary Creatures", + "Bands with Other Creatures named Wolves of the Hunt", + "Bands with Other Dinosaurs"); + List bandingCreatures = new CardCollection(aiAtk.notNeededAsBlockers(attacker.getCreaturesInPlay())); + bandingCreatures = CardLists.filter(bandingCreatures, new Predicate() { + @Override + public boolean apply(Card card) { + return card.hasKeyword(Keyword.BANDING) || card.hasAnyKeyword(bandsWithString); + } + }); + if (!bandingCreatures.isEmpty()) { + List evasionKeywords = Arrays.asList("Flying", "Horsemanship", "Shadow"); + String[] validString = {"Legendary.Creature", "Creature.namedWolves of the Hunt", "Dinosaur"}; + + // TODO: Assign to band with the best attacker for now, but needs better logic. + CardCollection attackers = combat.getAttackers(); + Card bestAttacker = ComputerUtilCard.getBestCreatureAI(attackers); + Card bestAttackerNoEvasion = ComputerUtilCard.getBestCreatureAI(CardLists.filter(attackers, new Predicate() { + @Override + public boolean apply(Card card) { + return !card.hasAnyKeyword(evasionKeywords); + } + })); + for (Card c : bandingCreatures) { + // TODO: check for legality in Bands with Other X + if (!c.hasAnyKeyword(evasionKeywords) && bestAttacker.hasAnyKeyword(evasionKeywords)) { + if (bestAttackerNoEvasion != null) { + combat.addAttacker(c, combat.getDefenderByAttacker(bestAttackerNoEvasion), combat.getBandOfAttacker(bestAttackerNoEvasion)); + } + } else { + combat.addAttacker(c, combat.getDefenderByAttacker(bestAttacker), combat.getBandOfAttacker(bestAttacker)); + } + } + } + } + // if invalid: just try an attack declaration that we know to be legal if (!CombatUtil.validateAttackers(combat)) { combat.clearAttackers(); diff --git a/forge-gui/res/cardsfolder/d/defensive_formation.txt b/forge-gui/res/cardsfolder/d/defensive_formation.txt index 1644fb9608c..215f7a5de6b 100644 --- a/forge-gui/res/cardsfolder/d/defensive_formation.txt +++ b/forge-gui/res/cardsfolder/d/defensive_formation.txt @@ -3,5 +3,4 @@ ManaCost:W Types:Enchantment S:Mode$ Continuous | Affected$ You | AddKeyword$ You assign combat damage of each creature attacking you. | Description$ Rather than the attacking player, you assign the combat damage of each creature attacking you. You can divide that creature's combat damage as you choose among any of the creatures blocking it. SVar:NonStackingEffect:True -AI:RemoveDeck:All Oracle:Rather than the attacking player, you assign the combat damage of each creature attacking you. You can divide that creature's combat damage as you choose among any of the creatures blocking it.