From fb03ed6654ceda37249c33fddf36a8364725fddc Mon Sep 17 00:00:00 2001 From: elcnesh Date: Wed, 30 Jul 2014 09:51:24 +0000 Subject: [PATCH] Fix effects that have a player attack a certain GameEntity (like Gideon Jura, Taunt). --- .../game/ability/effects/MustAttackEffect.java | 9 ++++++--- .../main/java/forge/game/combat/CombatUtil.java | 4 ++++ .../main/java/forge/match/input/InputAttack.java | 16 +++++++++------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java index 06746815622..8f28c8fb32a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java @@ -46,11 +46,14 @@ public class MustAttackEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - GameEntity entity; - if (sa.getParam("Defender").equals("Self")) { + final String defender = sa.getParam("Defender"); + final GameEntity entity; + if (defender.equals("Self")) { entity = sa.getHostCard(); + } else if (defender.equals("You")) { + entity = sa.getActivatingPlayer(); } else { - entity = p.getOpponent(); + throw new RuntimeException("Illegal defender " + defender + " for MustAttackEffect in card " + sa.getHostCard()); } // System.out.println("Setting mustAttackEntity to: "+entity); p.setMustAttackEntity(entity); 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 9d83785c529..b381cdd6584 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -734,6 +734,10 @@ public class CombatUtil { final int cntAttackers = combat.getAttackers().size(); final Game game = c.getGame(); + if (c.getController().getMustAttackEntity() != def) { + return false; + } + if (cntAttackers > 0) { for (final Card card : game.getCardsIn(ZoneType.Battlefield)) { for (final String keyword : card.getKeyword()) { diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index e33c4fb68f0..9f204d0c170 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -75,15 +75,16 @@ public class InputAttack extends InputSyncronizedBase { List possibleAttackers = playerAttacks.getCardsIn(ZoneType.Battlefield); for (Card c : Iterables.filter(possibleAttackers, CardPredicates.Presets.CREATURES)) { + GameEntity mustAttack = c.getController().getMustAttackEntity() ; if (c.hasStartOfKeyword("CARDNAME attacks specific player each combat if able")) { final int i = c.getKeywordPosition("CARDNAME attacks specific player each combat if able"); final String defined = c.getKeyword().get(i).split(":")[1]; - final Player player = AbilityUtils.getDefinedPlayers(c, defined, null).get(0); - if (player != null && CombatUtil.canAttack(c, player, combat)) { - combat.addAttacker(c, player); - GuiBase.getInterface().fireEvent(new UiEventAttackerDeclared(c, player)); - continue; - } + mustAttack = AbilityUtils.getDefinedPlayers(c, defined, null).get(0); + } + if (mustAttack != null && CombatUtil.canAttack(c, mustAttack, combat)) { + combat.addAttacker(c, mustAttack); + GuiBase.getInterface().fireEvent(new UiEventAttackerDeclared(c, mustAttack)); + continue; } if (c.hasKeyword("CARDNAME attacks each combat if able.") || (c.hasKeyword("CARDNAME attacks each turn if able.") && !c.getDamageHistory().getCreatureAttackedThisTurn())) { @@ -247,7 +248,8 @@ public class InputAttack extends InputSyncronizedBase { private boolean canUndeclareAttacker(Card card) { return !card.hasKeyword("CARDNAME attacks each turn if able.") && - !card.hasStartOfKeyword("CARDNAME attacks specific player each combat if able"); + !card.hasStartOfKeyword("CARDNAME attacks specific player each combat if able") && + card.getController().getMustAttackEntity() == null; } private boolean undeclareAttacker(Card card) {