diff --git a/src/main/java/forge/game/ai/ComputerUtilBlock.java b/src/main/java/forge/game/ai/ComputerUtilBlock.java index 95abbd8c95c..a2ec8a92d7d 100644 --- a/src/main/java/forge/game/ai/ComputerUtilBlock.java +++ b/src/main/java/forge/game/ai/ComputerUtilBlock.java @@ -568,7 +568,13 @@ public class ComputerUtilBlock { List currentAttackers = new ArrayList(ComputerUtilBlock.getAttackersLeft()); - return makeChumpBlocks(ai, combat, currentAttackers); + Combat newCombat = makeChumpBlocks(ai, combat, currentAttackers); + + if (ComputerUtilCombat.lifeInDanger(ai, newCombat)) { + return makeMultiChumpBlocks(ai, newCombat); + } + + return newCombat; } private static Combat makeChumpBlocks(final Player ai, final Combat combat, List attackers) { @@ -618,6 +624,52 @@ public class ComputerUtilBlock { return makeChumpBlocks(ai, combat, attackers); } + /** + *

+ * makeMultiChumpBlocks. + *

+ * + * Block creatures with "can't be blocked except by two or more creatures" + * + * @param combat + * a {@link forge.game.phase.Combat} object. + * @return a {@link forge.game.phase.Combat} object. + */ + private static Combat makeMultiChumpBlocks(final Player ai, final Combat combat) { + + List currentAttackers = new ArrayList(ComputerUtilBlock.getAttackersLeft()); + + for (final Card attacker : currentAttackers) { + + if (!attacker.hasStartOfKeyword("CantBeBlockedByAmount LT")) { + continue; + } + List possibleBlockers = ComputerUtilBlock.getPossibleBlockers(attacker, ComputerUtilBlock.getBlockersLeft(), combat, true); + if (!CombatUtil.canAttackerBeBlockedWithAmount(attacker, possibleBlockers.size())) { + continue; + } + List usedBlockers = new ArrayList(); + for (Card blocker : possibleBlockers) { + if (CombatUtil.canBlock(attacker, blocker, combat)) { + combat.addBlocker(attacker, blocker); + usedBlockers.add(blocker); + if (CombatUtil.canAttackerBeBlockedWithAmount(attacker, usedBlockers.size())) { + break; + } + } + } + if (CombatUtil.canAttackerBeBlockedWithAmount(attacker, usedBlockers.size())) { + ComputerUtilBlock.getAttackersLeft().remove(attacker); + } else { + for (Card blocker : usedBlockers) { + combat.removeBlockAssignment(attacker, blocker); + } + } + } + + return combat; + } + // Reinforce blockers blocking attackers with trample (should only be made // if life is in danger) /**