diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 3870271a599..8147d5a95c2 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -660,6 +660,7 @@ public class AiAttackController { int trampleDamage = 0; CardCollection remainingBlockers = new CardCollection(blockers); for (Card attacker : CardLists.getKeyword(blockedAttackers, Keyword.TRAMPLE)) { + // TODO might sort by quotient of dmg/cost for best combination Cost tax = CombatUtil.getAttackCost(attacker.getGame(), attacker, defendingOpponent); int taxCMC = tax != null ? tax.getCostMana().getMana().getCMC() : 0; if (myFreeMana < currentAttackTax + taxCMC) { diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 6768ab5f700..350833a9d6e 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -946,10 +946,9 @@ public class AiBlockController { } private void clearBlockers(final Combat combat, final List possibleBlockers) { - final List oldBlockers = combat.getAllBlockers(); - for (final Card blocker : oldBlockers) { - if (blocker.getController() == ai) // don't touch other player's blockers - combat.removeFromCombat(blocker); + for (final Card blocker : CardLists.filterControlledBy(combat.getAllBlockers(), ai)) { + // don't touch other player's blockers + combat.removeFromCombat(blocker); } attackersLeft = new ArrayList<>(attackers); // keeps track of all currently unblocked attackers @@ -1346,21 +1345,19 @@ public class AiBlockController { private boolean removeUnpayableBlocks(final Combat combat) { int myFreeMana = ComputerUtilMana.getAvailableManaEstimate(ai); int currentBlockTax = 0; - final List oldBlockers = combat.getAllBlockers(); + List oldBlockers = CardLists.filterControlledBy(combat.getAllBlockers(), ai); CardLists.sortByPowerDesc(oldBlockers); boolean modified = false; for (final Card blocker : oldBlockers) { - if (blocker.getController() == ai) { - Cost tax = CombatUtil.getBlockCost(blocker.getGame(), blocker, combat.getAttackersBlockedBy(blocker).get(0)); - int taxCMC = tax != null ? tax.getCostMana().getMana().getCMC() : 0; - if (myFreeMana < currentBlockTax + taxCMC) { - combat.removeFromCombat(blocker); - modified = true; - continue; - } - currentBlockTax += taxCMC; + Cost tax = CombatUtil.getBlockCost(blocker.getGame(), blocker, combat.getAttackersBlockedBy(blocker).get(0)); + int taxCMC = tax != null ? tax.getCostMana().getMana().getCMC() : 0; + if (myFreeMana < currentBlockTax + taxCMC) { + combat.removeFromCombat(blocker); + modified = true; + continue; } + currentBlockTax += taxCMC; } return modified; } diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index e56aa8915f1..a90820dc2dc 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1324,7 +1324,7 @@ public class AiController { } public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { - if (mode.equals(PlayerActionConfirmMode.AlternativeDamageAssignment)) { + if (mode == PlayerActionConfirmMode.AlternativeDamageAssignment) { return true; } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index ba0d7364242..88148027ce3 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -853,11 +853,13 @@ public class Combat { Map map = assigningPlayer.getController().assignCombatDamage(attacker, orderedBlockers, attackers, damageDealt, defender, divideCombatDamageAsChoose || getAttackingPlayer() != assigningPlayer); + attackers.remove(attacker); // player wants to assign another first if (map == null) { + // add to end + attackers.add(attacker); continue; } - attackers.remove(attacker); for (Entry dt : map.entrySet()) { if (dt.getKey() == null) {