From 2b3b9baa7f1a8a9d6b32c5bea7ee5209a5f1bb1b Mon Sep 17 00:00:00 2001 From: Sloth Date: Tue, 23 Oct 2012 15:25:58 +0000 Subject: [PATCH] - Made cards with "CARDNAME can't attack unless defending player controls ..." to be multiplayer compatible. --- .../java/forge/game/phase/CombatUtil.java | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 78c8430c76e..e3a8dc35c64 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -810,8 +810,18 @@ public class CombatUtil { if (cntAttackers > 0 && Singletons.getModel().getGame().isCardInPlay("Dueling Grounds")) { return false; } + + Player defender = c.getController().getOpponent(); + if (combat != null) { + final GameEntity def = combat.getDefender(); + if (def instanceof Player) { + defender = (Player) def; + } else { + defender = ((Card) def).getController(); + } + } - return CombatUtil.canAttack(c); + return CombatUtil.canAttack(c, defender); } // can a creature attack at the moment? @@ -825,13 +835,41 @@ public class CombatUtil { * @return a boolean. */ public static boolean canAttack(final Card c) { + return canAttack(c, c.getController().getOpponent()); + } + + // can a creature attack at the moment? + /** + *

+ * canAttack. + *

+ * + * @param c + * a {@link forge.Card} object. + * @return a boolean. + */ + public static boolean canAttack(final Card c, final Player defender) { if (c.isTapped() || c.isPhasedOut() || (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste.")) || Singletons.getModel().getGame().getPhaseHandler().getPhase() .isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } - return CombatUtil.canAttackNextTurn(c); + return CombatUtil.canAttackNextTurn(c, defender); + } + + // can a creature attack if untapped and without summoning sickness? + /** + *

+ * canAttackNextTurn. + *

+ * + * @param c + * a {@link forge.Card} object. + * @return a boolean. + */ + public static boolean canAttackNextTurn(final Card c) { + return canAttackNextTurn(c, c.getController().getOpponent()); } // can a creature attack if untapped and without summoning sickness? @@ -844,7 +882,7 @@ public class CombatUtil { * a {@link forge.Card} object. * @return a boolean. */ - public static boolean canAttackNextTurn(final Card c) { + public static boolean canAttackNextTurn(final Card c, final Player defender) { if (!c.isCreature()) { return false; } @@ -875,7 +913,7 @@ public class CombatUtil { if (asSeparateWords[12].matches("[0-9][0-9]?")) { powerLimit[0] = Integer.parseInt((asSeparateWords[12]).trim()); - List list = c.getController().getOpponent().getCreaturesInPlay(); + List list = defender.getCreaturesInPlay(); list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card ct) { @@ -892,7 +930,7 @@ public class CombatUtil { } // hasKeyword = CARDNAME can't attack if defending player controls an // untapped creature with power ... - final List list = c.getController().getOpponent().getCardsIn(ZoneType.Battlefield); + final List list = defender.getCardsIn(ZoneType.Battlefield); List temp; for (String keyword : c.getKeyword()) { if (keyword.equals("CARDNAME can't attack.") || keyword.equals("CARDNAME can't attack or block.")) {