diff --git a/Mage.Sets/src/mage/sets/newphyrexia/EntomberExarch.java b/Mage.Sets/src/mage/sets/newphyrexia/EntomberExarch.java index 7351033787f..c2a40fcda77 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/EntomberExarch.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/EntomberExarch.java @@ -63,7 +63,7 @@ public class EntomberExarch extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // When Entomber Exarch enters the battlefield, choose one � Return target creature card from your graveyard to your hand; or target opponent reveals his or her hand, you choose a noncreature card from it, then that player discards that card. + // When Entomber Exarch enters the battlefield, choose one - Return target creature card from your graveyard to your hand; or target opponent reveals his or her hand, you choose a noncreature card from it, then that player discards that card. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false); ability.addTarget(new TargetCardInYourGraveyard(new FilterCreatureCard())); Mode mode = new Mode(); @@ -84,7 +84,7 @@ public class EntomberExarch extends CardImpl { } class EntomberExarchEffect extends OneShotEffect { - private static final FilterCard filter = new FilterCard(); + private static final FilterCard filter = new FilterCard("noncreature card"); static { filter.getNotCardType().add(CardType.CREATURE); diff --git a/Mage/src/mage/abilities/Ability.java b/Mage/src/mage/abilities/Ability.java index b1e2249ae89..cb248a57d8f 100644 --- a/Mage/src/mage/abilities/Ability.java +++ b/Mage/src/mage/abilities/Ability.java @@ -321,7 +321,10 @@ public interface Ability extends Serializable { public void reset(Game game); /** - * TODO: Determine what this is used for, current implementations always return true. + * Overridden by triggered abilities with intervening if clauses - rule 20110715 - 603.4 + * + * @param game + * @return Whether or not the intervening if clause is satisfied */ public boolean checkIfClause(Game game); @@ -337,5 +340,7 @@ public interface Ability extends Serializable { public void addMode(Mode mode); public Modes getModes(); + + public boolean canChooseTarget(Game game); } diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index 1dd7768d7ef..099a9c5c67f 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -414,6 +414,15 @@ public abstract class AbilityImpl> implements Ability { public Modes getModes() { return modes; } + + @Override + public boolean canChooseTarget(Game game) { + for (Mode mode: modes.values()) { + if (mode.getTargets().canChoose(sourceId, controllerId, game)) + return true; + } + return false; + } @Override public String toString() { diff --git a/Mage/src/mage/abilities/ActivatedAbilityImpl.java b/Mage/src/mage/abilities/ActivatedAbilityImpl.java index a395183d947..3bd30cb41e5 100644 --- a/Mage/src/mage/abilities/ActivatedAbilityImpl.java +++ b/Mage/src/mage/abilities/ActivatedAbilityImpl.java @@ -152,7 +152,7 @@ public abstract class ActivatedAbilityImpl> ex return false; //20091005 - 602.5d/602.5e if (timing == TimingRule.INSTANT || game.canPlaySorcery(playerId)) { - if (costs.canPay(sourceId, controllerId, game) && getTargets().canChoose(sourceId, playerId, game)) { + if (costs.canPay(sourceId, controllerId, game) && canChooseTarget(game)) { return true; } } diff --git a/Mage/src/mage/abilities/SpellAbility.java b/Mage/src/mage/abilities/SpellAbility.java index 45fd9adf5d0..bfb75dc0f60 100644 --- a/Mage/src/mage/abilities/SpellAbility.java +++ b/Mage/src/mage/abilities/SpellAbility.java @@ -61,7 +61,7 @@ public class SpellAbility extends ActivatedAbilityImpl { object.getAbilities().containsKey(FlashAbility.getInstance().getId()) || game.getContinuousEffects().asThough(sourceId, AsThoughEffectType.CAST, game) || game.canPlaySorcery(playerId))) { - if (costs.canPay(sourceId, controllerId, game) && getTargets().canChoose(this.getId(), playerId, game)) { + if (costs.canPay(sourceId, controllerId, game) && canChooseTarget(game)) { return true; } } diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index 4fb3e2825eb..64244bac819 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -305,6 +305,7 @@ public class StackAbility implements StackObject, Ability { @Override public void newId() {} + @Override public Ability getStackAbility() { return ability; } @@ -321,4 +322,9 @@ public class StackAbility implements StackObject, Ability { public Modes getModes() { return ability.getModes(); } + + @Override + public boolean canChooseTarget(Game game) { + return ability.canChooseTarget(game); + } } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 20d6809cbe2..31dde23203c 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -577,7 +577,7 @@ public abstract class PlayerImpl> implements Player, Ser //20091005 - 603.3c, 603.3d int bookmark = game.bookmarkState(); TriggeredAbility ability = (TriggeredAbility) source.copy(); - if (ability.getTargets().canChoose(ability.getSourceId(), playerId, game)) { + if (ability.canChooseTarget(game)) { game.getStack().push(new StackAbility(ability, playerId)); if (ability.activate(game, false)) { game.removeBookmark(bookmark);