Make the Okk combat checks a little bit more efficient.

This commit is contained in:
Myrd
2015-12-31 20:11:18 +00:00
parent 5505cbd2f8
commit e7e8632e4e
2 changed files with 13 additions and 17 deletions

View File

@@ -694,9 +694,9 @@ public class CombatUtil {
// Creatures that aren't allowed to block unless certain restrictions are met. // Creatures that aren't allowed to block unless certain restrictions are met.
for (final Card blocker : blockers) { 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); 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); 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.")) { } else if (blocker.hasKeyword("CARDNAME can't block unless a creature with greater power also blocks.")) {
boolean found = false; boolean found = false;

View File

@@ -602,31 +602,27 @@ public class PhaseHandler implements java.io.Serializable {
reachedSteadyState = true; reachedSteadyState = true;
List<Card> remainingBlockers = CardLists.filterControlledBy(combat.getAllBlockers(), p); List<Card> remainingBlockers = CardLists.filterControlledBy(combat.getAllBlockers(), p);
for (Card c : remainingBlockers) { for (Card c : remainingBlockers) {
int minBlockers = Integer.MIN_VALUE; boolean removeBlocker = false;
if (c.hasKeyword("CARDNAME can't attack or block alone.")) { if (remainingBlockers.size() < 2 && c.hasKeyword("CARDNAME can't attack or block alone.")) {
minBlockers = 2; removeBlocker = true;
} else if (c.hasKeyword("CARDNAME can't block unless at least two other creatures block.")) { } else if (remainingBlockers.size() < 3 && c.hasKeyword("CARDNAME can't block unless at least two other creatures block.")) {
minBlockers = 3; removeBlocker = true;
}
if (remainingBlockers.size() < minBlockers) {
combat.undoBlockingAssignment(c);
reachedSteadyState = false;
} else if (c.hasKeyword("CARDNAME can't block unless a creature with greater power also blocks.")) { } 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(); int power = c.getNetPower();
// Note: This is O(n^2), but there shouldn't generally be many creatures with the above keyword. // Note: This is O(n^2), but there shouldn't generally be many creatures with the above keyword.
for (Card c2 : remainingBlockers) { for (Card c2 : remainingBlockers) {
if (c2.getNetPower() > power) { if (c2.getNetPower() > power) {
found = true; removeBlocker = false;
break; break;
} }
} }
if (!found) { }
if (removeBlocker) {
combat.undoBlockingAssignment(c); combat.undoBlockingAssignment(c);
reachedSteadyState = false; reachedSteadyState = false;
} }
} }
}
} while (!reachedSteadyState); } while (!reachedSteadyState);
// Player is done declaring blockers - redraw UI at this point // Player is done declaring blockers - redraw UI at this point