From a19c05ca562d85a496895c4e9e7ef97cc3e5b46a Mon Sep 17 00:00:00 2001 From: Sloth Date: Fri, 19 Sep 2014 22:22:17 +0000 Subject: [PATCH] - Improved blocking AI for blockers that don't survive until the next turn anyway (due to Vanishing or Fading). --- .../main/java/forge/ai/AiBlockController.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 2e7605be560..2cc35874742 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -234,7 +234,11 @@ public class AiBlockController { // 3.Blockers that can destroy the attacker and have an upside when dying killingBlockers = getKillingBlockers(combat, attacker, blockers); for (Card b : killingBlockers) { - if ((b.hasKeyword("Undying") && b.getCounters(CounterType.P1P1) == 0) || b.hasSVar("SacMe")) { + if ((b.hasKeyword("Undying") && b.getCounters(CounterType.P1P1) == 0) + || b.hasSVar("SacMe") + || (b.hasStartOfKeyword("Vanishing") && b.getCounters(CounterType.TIME) == 1) + || (b.hasStartOfKeyword("Fading") && b.getCounters(CounterType.FADE) == 0) + || b.hasSVar("EndOfTurnLeavePlay")) { blocker = b; break; } @@ -286,6 +290,32 @@ public class AiBlockController { } } attackersLeft = (new ArrayList(currentAttackers)); + + // 6. Blockers that don't survive until the next turn anyway + for (final Card attacker : attackersLeft) { + if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") + || attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { + continue; + } + + Card blocker = null; + + final List blockers = getPossibleBlockers(combat, attacker, blockersLeft, true); + + for (Card b : blockers) { + if ((b.hasStartOfKeyword("Vanishing") && b.getCounters(CounterType.TIME) == 1) + || (b.hasStartOfKeyword("Fading") && b.getCounters(CounterType.FADE) == 0) + || b.hasSVar("EndOfTurnLeavePlay")) { + blocker = b; + break; + } + } + if (blocker != null) { + currentAttackers.remove(attacker); + combat.addBlocker(attacker, blocker); + } + } + attackersLeft = (new ArrayList(currentAttackers)); } // Good Gang Blocks means a good trade or no trade