Haunt now resolves, but its trigger won't leave stack

This commit is contained in:
Maxmtg
2013-06-21 06:06:55 +00:00
parent 390a23d88e
commit 3242d396a9
3 changed files with 14 additions and 41 deletions

View File

@@ -2774,66 +2774,45 @@ public class CardFactoryUtil {
sbHaunter.append("Destination$ Graveyard | ValidCard$ Card.Self | "); sbHaunter.append("Destination$ Graveyard | ValidCard$ Card.Self | ");
sbHaunter.append("Static$ True | Secondary$ True | TriggerDescription$ Blank"); sbHaunter.append("Static$ True | Secondary$ True | TriggerDescription$ Blank");
final Trigger haunterDies = forge.card.trigger.TriggerHandler final Trigger haunterDies = TriggerHandler.parseTrigger(sbHaunter.toString(), card, true);
.parseTrigger(sbHaunter.toString(), card, true);
final Ability haunterDiesWork = new Ability(card, ManaCost.ZERO) { final Ability haunterDiesWork = new Ability(card, ManaCost.ZERO) {
@Override @Override
public void resolve() { public void resolve() {
this.getTargetCard().addHauntedBy(card); this.getTargets().getFirstTargetedCard().addHauntedBy(card);
card.getGame().getAction().exile(card); card.getGame().getAction().exile(card);
} }
}; };
haunterDiesWork.setDescription(hauntDescription); 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) { final Ability haunterDiesSetup = new Ability(card, ManaCost.ZERO) {
@Override @Override
public void resolve() { public void resolve() {
final Game game = card.getGame(); final Game game = card.getGame();
this.setActivatingPlayer(card.getController()); this.setActivatingPlayer(card.getController());
final List<Card> creats = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); List<Card> allCreatures = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES);
for (int i = 0; i < creats.size(); i++) { final List<Card> creats = CardLists.getTargetableCards(allCreatures, haunterDiesWork);
if (!creats.get(i).canBeTargetedBy(this)) {
creats.remove(i);
i--;
}
}
if (creats.isEmpty()) { if (creats.isEmpty()) {
return; return;
} }
// need to do it this way because I don't know quite how to final Card toHaunt;
// make TriggerHandler respect BeforePayMana.
if (card.getController().isHuman()) { if (card.getController().isHuman()) {
final InputSelectCards target = new InputSelectCards(1, 1) { final InputSelectCards target = new InputSelectCardsFromList(1, 1, creats);
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);
}
};
target.setMessage("Choose target creature to haunt."); target.setMessage("Choose target creature to haunt.");
Singletons.getControl().getInputQueue().setInputAndWait(target); Singletons.getControl().getInputQueue().setInputAndWait(target);
if (!target.hasCancelled()) { toHaunt = target.getSelected().get(0);
haunterDiesWork.setTargetCard(target.getSelected().get(0));
game.getStack().add(haunterDiesWork);
}
} else { } else {
// AI choosing what to haunt // AI choosing what to haunt
final List<Card> oppCreats = CardLists.filterControlledBy(creats, card.getController().getOpponent()); final List<Card> oppCreats = CardLists.filterControlledBy(creats, card.getController().getOpponent());
if (!oppCreats.isEmpty()) { List<Card> chooseFrom = oppCreats.isEmpty() ? creats : oppCreats;
haunterDiesWork.setTargetCard(ComputerUtilCard.getWorstCreatureAI(oppCreats)); toHaunt = ComputerUtilCard.getWorstCreatureAI(chooseFrom);
} else {
haunterDiesWork.setTargetCard(ComputerUtilCard.getWorstCreatureAI(creats));
} }
haunterDiesWork.setTargetCard(toHaunt);
haunterDiesWork.setActivatingPlayer(card.getController());
game.getStack().add(haunterDiesWork); game.getStack().add(haunterDiesWork);
} }
}
}; };
haunterDies.setOverridingAbility(haunterDiesSetup); haunterDies.setOverridingAbility(haunterDiesSetup);

View File

@@ -108,8 +108,7 @@ public class SpellAbilityStackInstance {
// Targeting info -- 29/06/11 Moved to after taking care of SubAbilities // Targeting info -- 29/06/11 Moved to after taking care of SubAbilities
// because otherwise AF_DealDamage SubAbilities that use Defined$ // because otherwise AF_DealDamage SubAbilities that use Defined$
// Targeted breaks (since it's parents target is reset) // Targeted breaks (since it's parents target is reset)
final TargetRestrictions target = sa.getTargetRestrictions(); if (sa.usesTargeting()) {
if (target != null) {
this.tc = ability.getTargets(); this.tc = ability.getTargets();
this.ability.resetTargets(); this.ability.resetTargets();
} }

View File

@@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import forge.Card; import forge.Card;
@@ -113,10 +112,6 @@ public class TargetRestrictions {
this.randomTarget = target.isRandomTarget(); this.randomTarget = target.isRandomTarget();
} }
public TargetRestrictions() {
this(null, ArrayUtils.EMPTY_STRING_ARRAY, "1", "1");
}
/** /**
* <p> * <p>
* Constructor for Target. * Constructor for Target.