mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Haunt now resolves, but its trigger won't leave stack
This commit is contained in:
@@ -2774,65 +2774,44 @@ 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));
|
|
||||||
}
|
|
||||||
game.getStack().add(haunterDiesWork);
|
|
||||||
}
|
}
|
||||||
|
haunterDiesWork.setTargetCard(toHaunt);
|
||||||
|
haunterDiesWork.setActivatingPlayer(card.getController());
|
||||||
|
game.getStack().add(haunterDiesWork);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user