From fb559e71407c8d7c1424b193593aae90699bf32f Mon Sep 17 00:00:00 2001 From: RedDeckWins Date: Wed, 22 May 2013 23:55:34 +0000 Subject: [PATCH] Use a trigger to play cards from suspend. --- src/main/java/forge/Card.java | 4 +--- .../forge/card/ability/effects/PlayEffect.java | 5 ++++- .../forge/card/cardfactory/CardFactoryUtil.java | 15 +++++++++++++++ .../forge/card/trigger/TriggerCounterRemoved.java | 9 +++++++++ .../java/forge/game/player/PlayerController.java | 2 +- .../forge/game/player/PlayerControllerAi.java | 4 ++-- .../forge/game/player/PlayerControllerHuman.java | 4 ++-- 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index b93ec413623..6acbf619a59 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -1224,6 +1224,7 @@ public class Card extends GameEntity implements Comparable { final Map runParams = new TreeMap(); runParams.put("Card", this); runParams.put("CounterType", counterName); + runParams.put("NewCounterAmount", newValue > 0 ? newValue : 0); for (int i = 0; i < delta; i++) { getGame().getTriggerHandler().runTrigger(TriggerType.CounterRemoved, runParams, false); } @@ -1235,9 +1236,6 @@ public class Card extends GameEntity implements Comparable { getGame().getAction().sacrifice(this, null); } - if (this.hasSuspend() && getGame().isCardExiled(this)) { - getOwner().getController().playFromSuspend(this); - } } // Play the Subtract Counter sound diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index a8b6d951239..3209779b62c 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -191,6 +191,9 @@ public class PlayEffect extends SpellAbilityEffect { tgtCard.setSVar("IsEncoded", "Number$1"); } } + if(sa.hasParam("SuspendCast")) { + tgtCard.setSuspendCast(true); + } // lands will be played if (tgtCard.isLand()) { controller.playLand(tgtCard); @@ -230,7 +233,7 @@ public class PlayEffect extends SpellAbilityEffect { tgtSA.getTarget().setMandatory(true); } - boolean noManaCost = sa.hasParam("WithoutManaCost"); + boolean noManaCost = sa.hasParam("WithoutManaCost"); if (controller.isHuman()) { SpellAbility newSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA; HumanPlay.playSpellAbility(activator, newSA); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 9daa812e931..02aeb5fd445 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -2348,6 +2348,21 @@ public class CardFactoryUtil { final String cost = k[2]; card.addSpellAbility(abilitySuspend(card, cost, timeCounters)); } + + StringBuilder trig = new StringBuilder(); + trig.append("Mode$ CounterRemoved | TriggerZones$ Exile | ValidCard$ Card.Self | NewCounterAmount$ 0 | Execute$ DBPlay | Secondary$ True | "); + trig.append("TriggerDescription$ When the last time counter is removed from this card, if it's exiled, play it without paying its mana cost if able. "); + trig.append("If you can't, it remains exiled. If you cast a creature spell this way, it gains haste until you lose control of the spell or the permanent it becomes."); + + StringBuilder playWithoutCost = new StringBuilder(); + playWithoutCost.append("DB$ Play | Defined$ Self | WithoutManaCost$ True | SuspendCast$ True"); + + final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig.toString(), card, true); + card.addTrigger(parsedTrigger); + + card.setSVar("DBPlay",playWithoutCost.toString()); + + } // Suspend if (hasKeyword(card, "Fading") != -1) { diff --git a/src/main/java/forge/card/trigger/TriggerCounterRemoved.java b/src/main/java/forge/card/trigger/TriggerCounterRemoved.java index 4027304b2db..05ad8719160 100644 --- a/src/main/java/forge/card/trigger/TriggerCounterRemoved.java +++ b/src/main/java/forge/card/trigger/TriggerCounterRemoved.java @@ -52,6 +52,7 @@ public class TriggerCounterRemoved extends Trigger { public final boolean performTest(final java.util.Map runParams2) { final Card addedTo = (Card) runParams2.get("Card"); final CounterType addedType = (CounterType) runParams2.get("CounterType"); + final Integer addedNewCounterAmount = (Integer) runParams2.get("NewCounterAmount"); if (this.mapParams.containsKey("ValidCard")) { if (!addedTo.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), @@ -67,6 +68,14 @@ public class TriggerCounterRemoved extends Trigger { } } + if (this.mapParams.containsKey("NewCounterAmount")) { + final String amtString = this.mapParams.get("NewCounterAmount"); + int amt = Integer.parseInt(amtString); + if(amt != addedNewCounterAmount.intValue()) { + return false; + } + } + return true; } diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 33dd867b709..b664333d1bd 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -98,7 +98,7 @@ public abstract class PlayerController { * TODO: Write javadoc for this method. * @param c */ - public abstract void playFromSuspend(Card c); + //public abstract void playFromSuspend(Card c); public abstract boolean playCascade(Card cascadedCard, Card sourceCard); public abstract void playSpellAbilityForFree(SpellAbility copySA); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 8a39395b0c5..e94adf19a25 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -89,11 +89,11 @@ public class PlayerControllerAi extends PlayerController { * TODO: Write javadoc for this method. * @param c */ - public void playFromSuspend(Card c) { + /**public void playFromSuspend(Card c) { final List choices = c.getBasicSpells(); c.setSuspendCast(true); getAi().chooseAndPlaySa(choices, true, true); - } + }**/ /* (non-Javadoc) * @see forge.game.player.PlayerController#playCascade(java.util.List, forge.Card) diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 95dc47b36e4..a104220246a 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -96,10 +96,10 @@ public class PlayerControllerHuman extends PlayerController { * TODO: Write javadoc for this method. * @param c */ - public void playFromSuspend(Card c) { + /**public void playFromSuspend(Card c) { c.setSuspendCast(true); HumanPlay.playCardWithoutPayingManaCost(player, c); - } + }**/ /* (non-Javadoc) * @see forge.game.player.PlayerController#playCascade(java.util.List, forge.Card)