Haunt fixes

This commit is contained in:
tool4EvEr
2022-01-03 15:02:11 +01:00
parent bb4b8bd0e6
commit aa66eee6de
6 changed files with 31 additions and 26 deletions

View File

@@ -187,7 +187,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
} }
if (choice == null) { // can't find anything left if (choice == null) { // can't find anything left
if (!sa.isTargetNumberValid() || (sa.getTargets().size() == 0)) { if (!sa.isTargetNumberValid() || sa.getTargets().size() == 0) {
sa.resetTargets(); sa.resetTargets();
return false; return false;
} else { } else {

View File

@@ -298,7 +298,8 @@ public class CounterEffect extends SpellAbilityEffect {
private static void removeFromStack(final SpellAbility tgtSA, final SpellAbility srcSA, final SpellAbilityStackInstance si, CardZoneTable triggerList) { private static void removeFromStack(final SpellAbility tgtSA, final SpellAbility srcSA, final SpellAbilityStackInstance si, CardZoneTable triggerList) {
final Game game = tgtSA.getActivatingPlayer().getGame(); final Game game = tgtSA.getActivatingPlayer().getGame();
Card movedCard = null; Card movedCard = null;
final Zone originZone = tgtSA.getHostCard().getZone(); final Card c = tgtSA.getHostCard();
final Zone originZone = c.getZone();
// Run any applicable replacement effects. // Run any applicable replacement effects.
final Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(tgtSA.getHostCard()); final Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(tgtSA.getHostCard());
@@ -310,8 +311,8 @@ public class CounterEffect extends SpellAbilityEffect {
game.getStack().remove(si); game.getStack().remove(si);
// if the target card on stack was a spell with Bestow, then unbestow it // if the target card on stack was a spell with Bestow, then unbestow it
if (tgtSA.getHostCard() != null && tgtSA.getHostCard().isBestowed()) { if (c.isBestowed()) {
tgtSA.getHostCard().unanimateBestow(true); c.unanimateBestow(true);
} }
Map<AbilityKey, Object> params = AbilityKey.newMap(); Map<AbilityKey, Object> params = AbilityKey.newMap();
@@ -327,33 +328,32 @@ public class CounterEffect extends SpellAbilityEffect {
// For Ability-targeted counterspells - do not move it anywhere, // For Ability-targeted counterspells - do not move it anywhere,
// even if Destination$ is specified. // even if Destination$ is specified.
} else if (destination.equals("Graveyard")) { } else if (destination.equals("Graveyard")) {
movedCard = game.getAction().moveToGraveyard(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().moveToGraveyard(c, srcSA, params);
} else if (destination.equals("Exile")) { } else if (destination.equals("Exile")) {
movedCard = game.getAction().exile(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().exile(c, srcSA, params);
} else if (destination.equals("TopOfLibrary")) { } else if (destination.equals("TopOfLibrary")) {
movedCard = game.getAction().moveToLibrary(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().moveToLibrary(c, srcSA, params);
} else if (destination.equals("Hand")) { } else if (destination.equals("Hand")) {
movedCard = game.getAction().moveToHand(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().moveToHand(c, srcSA, params);
} else if (destination.equals("Battlefield")) { } else if (destination.equals("Battlefield")) {
if (tgtSA instanceof SpellPermanent) { if (tgtSA instanceof SpellPermanent) {
Card c = tgtSA.getHostCard();
c.setController(srcSA.getActivatingPlayer(), 0); c.setController(srcSA.getActivatingPlayer(), 0);
movedCard = game.getAction().moveToPlay(c, srcSA.getActivatingPlayer(), srcSA, params); movedCard = game.getAction().moveToPlay(c, srcSA.getActivatingPlayer(), srcSA, params);
} else { } else {
movedCard = game.getAction().moveToPlay(tgtSA.getHostCard(), srcSA.getActivatingPlayer(), srcSA, params); movedCard = game.getAction().moveToPlay(c, srcSA.getActivatingPlayer(), srcSA, params);
movedCard.setController(srcSA.getActivatingPlayer(), 0); movedCard.setController(srcSA.getActivatingPlayer(), 0);
} }
} else if (destination.equals("BottomOfLibrary")) { } else if (destination.equals("BottomOfLibrary")) {
movedCard = game.getAction().moveToBottomOfLibrary(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().moveToBottomOfLibrary(c, srcSA, params);
} else if (destination.equals("ShuffleIntoLibrary")) { } else if (destination.equals("ShuffleIntoLibrary")) {
movedCard = game.getAction().moveToBottomOfLibrary(tgtSA.getHostCard(), srcSA, params); movedCard = game.getAction().moveToBottomOfLibrary(c, srcSA, params);
tgtSA.getHostCard().getController().shuffle(srcSA); c.getController().shuffle(srcSA);
} else { } else {
throw new IllegalArgumentException("AbilityFactory_CounterMagic: Invalid Destination argument for card " throw new IllegalArgumentException("AbilityFactory_CounterMagic: Invalid Destination argument for card "
+ srcSA.getHostCard().getName()); + srcSA.getHostCard().getName());
} }
// Run triggers // Run triggers
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(tgtSA.getHostCard()); final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c);
runParams.put(AbilityKey.Player, tgtSA.getActivatingPlayer()); runParams.put(AbilityKey.Player, tgtSA.getActivatingPlayer());
runParams.put(AbilityKey.Cause, srcSA.getHostCard()); runParams.put(AbilityKey.Cause, srcSA.getHostCard());
runParams.put(AbilityKey.CounteredSA, tgtSA); runParams.put(AbilityKey.CounteredSA, tgtSA);

View File

@@ -9,13 +9,13 @@ public class HauntEffect extends SpellAbilityEffect {
@Override @Override
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
Card card = sa.getHostCard(); Card host = sa.getHostCard();
final Game game = card.getGame(); final Game game = host.getGame();
card = game.getCardState(card, null); Card card = game.getCardState(host, null);
if (card == null) { if (card == null) {
return; return;
} else if (sa.usesTargeting() && !card.isToken()) { } else if (sa.usesTargeting() && !card.isToken() && host.equalsWithTimestamp(card)) {
// haunt target but only if card is no token // haunt target but only if card is no token and still in grave
final Card copy = game.getAction().exile(card, sa); final Card copy = game.getAction().exile(card, sa);
sa.getTargets().getFirstTargetedCard().addHauntedBy(copy); sa.getTargets().getFirstTargetedCard().addHauntedBy(copy);
} else if (!sa.usesTargeting() && card.getHaunting() != null) { } else if (!sa.usesTargeting() && card.getHaunting() != null) {

View File

@@ -1293,13 +1293,12 @@ public class CardFactoryUtil {
triggers.add(haunterETB); triggers.add(haunterETB);
} }
// First, create trigger that runs when the haunter goes to the // First, create trigger that runs when the haunter goes to the graveyard
// graveyard
final StringBuilder sbHaunter = new StringBuilder(); final StringBuilder sbHaunter = new StringBuilder();
sbHaunter.append("Mode$ ChangesZone | Origin$ "); sbHaunter.append("Mode$ ChangesZone | Origin$ ");
sbHaunter.append(card.isCreature() ? "Battlefield" : "Stack"); sbHaunter.append(card.isCreature() ? "Battlefield" : "Stack | ResolvedCard$ True");
sbHaunter.append(" | Destination$ Graveyard | ValidCard$ Card.Self"); sbHaunter.append(" | Destination$ Graveyard | ValidCard$ Card.Self");
sbHaunter.append(" | Static$ True | Secondary$ True | TriggerDescription$ Blank"); sbHaunter.append(" | Secondary$ True | TriggerDescription$ " + inst.getReminderText());
final Trigger haunterDies = TriggerHandler.parseTrigger(sbHaunter.toString(), card, intrinsic); final Trigger haunterDies = TriggerHandler.parseTrigger(sbHaunter.toString(), card, intrinsic);

View File

@@ -130,6 +130,12 @@ public class TriggerChangesZone extends Trigger {
} }
} }
if (hasParam("ResolvedCard")) {
if (!runParams.containsKey(AbilityKey.Fizzle)) {
return false;
}
}
// Check number of lands ETB this turn on triggered card's controller // Check number of lands ETB this turn on triggered card's controller
if (hasParam("CheckOnTriggeredCard")) { if (hasParam("CheckOnTriggeredCard")) {
final String[] condition = getParam("CheckOnTriggeredCard").split(" ", 2); final String[] condition = getParam("CheckOnTriggeredCard").split(" ", 2);

View File

@@ -253,7 +253,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
} }
} }
if (!sp.isCopied() && !hasLegalTargeting(sp, source)) { if (!sp.isCopied() && !hasLegalTargeting(sp)) {
String str = source + " - [Couldn't add to stack, failed to target] - " + sp.getDescription(); String str = source + " - [Couldn't add to stack, failed to target] - " + sp.getDescription();
System.err.println(str + sp.getAllTargetChoices()); System.err.println(str + sp.getAllTargetChoices());
game.getGameLog().add(GameLogEntryType.STACK_ADD, str); game.getGameLog().add(GameLogEntryType.STACK_ADD, str);
@@ -604,14 +604,14 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
} }
} }
public final boolean hasLegalTargeting(final SpellAbility sa, final Card source) { public final boolean hasLegalTargeting(final SpellAbility sa) {
if (sa == null) { if (sa == null) {
return true; return true;
} }
if (!sa.isTargetNumberValid()) { if (!sa.isTargetNumberValid()) {
return false; return false;
} }
return hasLegalTargeting(sa.getSubAbility(), source); return hasLegalTargeting(sa.getSubAbility());
} }
private final boolean hasFizzled(final SpellAbility sa, final Card source, final Boolean parentFizzled) { private final boolean hasFizzled(final SpellAbility sa, final Card source, final Boolean parentFizzled) {