From e7e8632e4e4c2efe24cb6ec8b0f039d2151cadcf Mon Sep 17 00:00:00 2001 From: Myrd Date: Thu, 31 Dec 2015 20:11:18 +0000 Subject: [PATCH] Make the Okk combat checks a little bit more efficient. --- .../java/forge/game/combat/CombatUtil.java | 4 +-- .../java/forge/game/phase/PhaseHandler.java | 26 ++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index bb242839213..5a77396e0a8 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -694,9 +694,9 @@ public class CombatUtil { // Creatures that aren't allowed to block unless certain restrictions are met. for (final Card blocker : blockers) { - if (blocker.hasKeyword("CARDNAME can't attack or block alone.") && blockers.size() < 2) { + if (blockers.size() < 2 && blocker.hasKeyword("CARDNAME can't attack or block alone.")) { return String.format("%s can't block alone.", blocker); - } else if (blocker.hasKeyword("CARDNAME can't block unless at least two other creatures block.") && blockers.size() < 3) { + } else if (blockers.size() < 3 && blocker.hasKeyword("CARDNAME can't block unless at least two other creatures block.")) { return String.format("%s can't block unless at least two other creatures block.", blocker); } else if (blocker.hasKeyword("CARDNAME can't block unless a creature with greater power also blocks.")) { boolean found = false; diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 0f4468c5a60..6bc4198c9d5 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -602,29 +602,25 @@ public class PhaseHandler implements java.io.Serializable { reachedSteadyState = true; List remainingBlockers = CardLists.filterControlledBy(combat.getAllBlockers(), p); for (Card c : remainingBlockers) { - int minBlockers = Integer.MIN_VALUE; - if (c.hasKeyword("CARDNAME can't attack or block alone.")) { - minBlockers = 2; - } else if (c.hasKeyword("CARDNAME can't block unless at least two other creatures block.")) { - minBlockers = 3; - } - if (remainingBlockers.size() < minBlockers) { - combat.undoBlockingAssignment(c); - reachedSteadyState = false; + boolean removeBlocker = false; + if (remainingBlockers.size() < 2 && c.hasKeyword("CARDNAME can't attack or block alone.")) { + removeBlocker = true; + } else if (remainingBlockers.size() < 3 && c.hasKeyword("CARDNAME can't block unless at least two other creatures block.")) { + removeBlocker = true; } else if (c.hasKeyword("CARDNAME can't block unless a creature with greater power also blocks.")) { - boolean found = false; + removeBlocker = true; int power = c.getNetPower(); // Note: This is O(n^2), but there shouldn't generally be many creatures with the above keyword. for (Card c2 : remainingBlockers) { if (c2.getNetPower() > power) { - found = true; + removeBlocker = false; break; } } - if (!found) { - combat.undoBlockingAssignment(c); - reachedSteadyState = false; - } + } + if (removeBlocker) { + combat.undoBlockingAssignment(c); + reachedSteadyState = false; } } } while (!reachedSteadyState);