From a50424f28bb52d9aa34a457cb22c13204e5bd0f4 Mon Sep 17 00:00:00 2001 From: Sloth Date: Sun, 5 May 2013 08:52:49 +0000 Subject: [PATCH] - Improved orderAttackers AI. --- .../java/forge/game/ai/ComputerUtilBlock.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/forge/game/ai/ComputerUtilBlock.java b/src/main/java/forge/game/ai/ComputerUtilBlock.java index f7d34ee950b..447cf1e8ef4 100644 --- a/src/main/java/forge/game/ai/ComputerUtilBlock.java +++ b/src/main/java/forge/game/ai/ComputerUtilBlock.java @@ -939,16 +939,27 @@ public class ComputerUtilBlock { return first; } - public static List orderAttackers(Card attacker, List blockers) { + public static List orderAttackers(Card blocker, List attackers) { // This shouldn't really take trample into account, but otherwise should be pretty similar to orderBlockers - // very very simple ordering of attackers, sort by evaluate, then sort by attack - //final int damage = attacker.getNetCombatDamage(); - CardLists.sortByEvaluateCreature(blockers); - CardLists.sortByPowerDesc(blockers); + // ordering of blockers, sort by evaluate, then try to kill the best + int damage = blocker.getNetCombatDamage(); + CardLists.sortByEvaluateCreature(attackers); + final List first = new ArrayList(); + final List last = new ArrayList(); + for (Card attacker : attackers) { + int lethal = ComputerUtilCombat.getEnoughDamageToKill(attacker, damage, blocker, true); + if (lethal > damage) { + last.add(attacker); + } else { + first.add(attacker); + damage -= lethal; + } + } + first.addAll(last); // TODO: Take total damage, and attempt to maximize killing the greatest evaluation of creatures // It's probably generally better to kill the largest creature, but sometimes its better to kill a few smaller ones - return blockers; + return first; } }