From fcada0859968315e08678a73b0f61c7c2fe1392d Mon Sep 17 00:00:00 2001 From: Sloth Date: Wed, 8 Oct 2014 18:07:48 +0000 Subject: [PATCH] - Improved AI's doAssault function. --- .../java/forge/ai/AiAttackController.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 22e002325f3..e4a16424686 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -439,9 +439,9 @@ public class AiAttackController { final List unblockedAttackers = new ArrayList(); final List remainingAttackers = new ArrayList(this.attackers); final List remainingBlockers = new ArrayList(this.blockers); + final List blockedAttackers = new ArrayList(); final Player opp = this.defendingOpponent; - for (Card attacker : attackers) { if (!CombatUtil.canBeBlocked(attacker, this.blockers, null) || attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")) { @@ -455,6 +455,7 @@ public class AiAttackController { for (Card attacker : this.attackers) { if (CombatUtil.canBlock(attacker, blocker)) { remainingAttackers.remove(attacker); + blockedAttackers.add(attacker); } } remainingBlockers.remove(blocker); @@ -467,21 +468,39 @@ public class AiAttackController { break; } if (blocker.hasKeyword("CARDNAME can block an additional creature.")) { + blockedAttackers.add(remainingAttackers.get(0)); remainingAttackers.remove(0); if (remainingAttackers.isEmpty()) { break; } } + blockedAttackers.add(remainingAttackers.get(0)); remainingAttackers.remove(0); } unblockedAttackers.addAll(remainingAttackers); + + int trampleDamage = 0; + for (Card attacker : blockedAttackers) { + if (attacker.hasKeyword("Trample")) { + int damage = ComputerUtilCombat.getAttack(attacker); + for (Card blocker : this.blockers) { + if (CombatUtil.canBlock(attacker, blocker)) { + damage -= ComputerUtilCombat.shieldDamage(attacker, blocker); + } + } + if (damage > 0) { + trampleDamage += damage; + } + } + } - if (ComputerUtilCombat.sumDamageIfUnblocked(remainingAttackers, opp) + ComputerUtil.possibleNonCombatDamage(ai) >= opp.getLife() + if (ComputerUtilCombat.sumDamageIfUnblocked(unblockedAttackers, opp) + ComputerUtil.possibleNonCombatDamage(ai) + + trampleDamage>= opp.getLife() && !((opp.cantLoseForZeroOrLessLife() || ai.cantWin()) && (opp.getLife() < 1))) { return true; } - if (ComputerUtilCombat.sumPoisonIfUnblocked(remainingAttackers, opp) >= (10 - opp.getPoisonCounters())) { + if (ComputerUtilCombat.sumPoisonIfUnblocked(unblockedAttackers, opp) >= (10 - opp.getPoisonCounters())) { return true; }