diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index d39e25f61e1..39219d2f1ea 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -2774,65 +2774,44 @@ public class CardFactoryUtil { sbHaunter.append("Destination$ Graveyard | ValidCard$ Card.Self | "); sbHaunter.append("Static$ True | Secondary$ True | TriggerDescription$ Blank"); - final Trigger haunterDies = forge.card.trigger.TriggerHandler - .parseTrigger(sbHaunter.toString(), card, true); + final Trigger haunterDies = TriggerHandler.parseTrigger(sbHaunter.toString(), card, true); final Ability haunterDiesWork = new Ability(card, ManaCost.ZERO) { @Override public void resolve() { - this.getTargetCard().addHauntedBy(card); + this.getTargets().getFirstTargetedCard().addHauntedBy(card); card.getGame().getAction().exile(card); } }; haunterDiesWork.setDescription(hauntDescription); + haunterDiesWork.setTargetRestrictions(new TargetRestrictions(null, new String[]{"Creature"}, "1", "1")); // not null to make stack preserve targets set final Ability haunterDiesSetup = new Ability(card, ManaCost.ZERO) { @Override public void resolve() { final Game game = card.getGame(); this.setActivatingPlayer(card.getController()); - final List creats = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); - for (int i = 0; i < creats.size(); i++) { - if (!creats.get(i).canBeTargetedBy(this)) { - creats.remove(i); - i--; - } - } + List allCreatures = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + final List creats = CardLists.getTargetableCards(allCreatures, haunterDiesWork); if (creats.isEmpty()) { return; } - // need to do it this way because I don't know quite how to - // make TriggerHandler respect BeforePayMana. + final Card toHaunt; if (card.getController().isHuman()) { - final InputSelectCards target = new InputSelectCards(1, 1) { - private static final long serialVersionUID = 1981791992623774490L; - @Override - protected boolean isValidChoice(Card c) { - Zone zone = game.getZoneOf(c); - if (!zone.is(ZoneType.Battlefield) || !c.isCreature()) { - return false; - } - return c.canBeTargetedBy(haunterDiesWork); - } - }; + final InputSelectCards target = new InputSelectCardsFromList(1, 1, creats); target.setMessage("Choose target creature to haunt."); - Singletons.getControl().getInputQueue().setInputAndWait(target); - if (!target.hasCancelled()) { - haunterDiesWork.setTargetCard(target.getSelected().get(0)); - game.getStack().add(haunterDiesWork); - } + toHaunt = target.getSelected().get(0); } else { // AI choosing what to haunt final List oppCreats = CardLists.filterControlledBy(creats, card.getController().getOpponent()); - if (!oppCreats.isEmpty()) { - haunterDiesWork.setTargetCard(ComputerUtilCard.getWorstCreatureAI(oppCreats)); - } else { - haunterDiesWork.setTargetCard(ComputerUtilCard.getWorstCreatureAI(creats)); - } - game.getStack().add(haunterDiesWork); + List chooseFrom = oppCreats.isEmpty() ? creats : oppCreats; + toHaunt = ComputerUtilCard.getWorstCreatureAI(chooseFrom); } + haunterDiesWork.setTargetCard(toHaunt); + haunterDiesWork.setActivatingPlayer(card.getController()); + game.getStack().add(haunterDiesWork); } }; diff --git a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java index 7b937dc9215..15d9e1b832b 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java +++ b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java @@ -108,8 +108,7 @@ public class SpellAbilityStackInstance { // Targeting info -- 29/06/11 Moved to after taking care of SubAbilities // because otherwise AF_DealDamage SubAbilities that use Defined$ // Targeted breaks (since it's parents target is reset) - final TargetRestrictions target = sa.getTargetRestrictions(); - if (target != null) { + if (sa.usesTargeting()) { this.tc = ability.getTargets(); this.ability.resetTargets(); } diff --git a/src/main/java/forge/card/spellability/TargetRestrictions.java b/src/main/java/forge/card/spellability/TargetRestrictions.java index 42f6ad9e423..6ccf0c2d42b 100644 --- a/src/main/java/forge/card/spellability/TargetRestrictions.java +++ b/src/main/java/forge/card/spellability/TargetRestrictions.java @@ -22,7 +22,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import forge.Card; @@ -113,10 +112,6 @@ public class TargetRestrictions { this.randomTarget = target.isRandomTarget(); } - public TargetRestrictions() { - this(null, ArrayUtils.EMPTY_STRING_ARRAY, "1", "1"); - } - /** *

* Constructor for Target.