diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index c2556ac6349..88320da5fc5 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1911,8 +1911,6 @@ public class GameAction { runParams.putAll(params); } game.getTriggerHandler().runTrigger(TriggerType.Destroyed, runParams, false); - // in case the destroyed card has such a trigger - game.getTriggerHandler().registerActiveLTBTrigger(c); final Card sacrificed = sacrificeDestroy(c, sa, params); return sacrificed != null; diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 4bfdc6c2801..f23ea2202fd 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -804,8 +804,9 @@ public abstract class SpellAbilityEffect { final CardCollection discardedByPlayer = new CardCollection(); for (Card card : Lists.newArrayList(discardedMap.get(p))) { // without copying will get concurrent modification exception if (card == null) { continue; } - if (p.discard(card, sa, effect, params) != null) { - discardedByPlayer.add(card); + Card moved = p.discard(card, sa, effect, params); + if (moved != null) { + discardedByPlayer.add(moved); } } discardedMap.put(p, discardedByPlayer); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 6e1769d5075..7174bde2c21 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -375,8 +375,9 @@ public class PhaseHandler implements java.io.Serializable { final CardCollection discarded = new CardCollection(); List discardedBefore = Lists.newArrayList(playerTurn.getDiscardedThisTurn()); for (Card c : playerTurn.getController().chooseCardsToDiscardToMaximumHandSize(numDiscard)) { - if (playerTurn.discard(c, null, false, moveParams) != null) { - discarded.add(c); + Card moved = playerTurn.discard(c, null, false, moveParams); + if (moved != null) { + discarded.add(moved); } } table.triggerChangesZoneAll(game, null); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index ae1f0e86cde..dad20c974a2 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -3776,12 +3776,13 @@ public class Player extends GameEntity implements Comparable { game.getAction().moveTo(ZoneType.Hand, c, sa, params); } else if (c.isInZone(ZoneType.Hand)) { // Discard and Draw List discardedBefore = Lists.newArrayList(getDiscardedThisTurn()); - if (discard(c, sa, true, params) != null) { + Card moved = discard(c, sa, true, params); + if (moved != null) { // Change this if something would make multiple player learn at the same time // Discard Trigger outside Effect final Map runParams = AbilityKey.mapFromPlayer(this); - runParams.put(AbilityKey.Cards, new CardCollection(c)); + runParams.put(AbilityKey.Cards, new CardCollection(moved)); runParams.put(AbilityKey.Cause, sa); runParams.put(AbilityKey.DiscardedBefore, discardedBefore); if (params != null) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 398eaea5b71..76100e65043 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1244,6 +1244,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return null; // the ability was not copyable, e.g. a Suspend SA may get here } newSA.setPayCosts(newSA.getPayCosts().copyWithNoMana()); + // currently needed by AI if (!newSA.hasParam("WithoutManaCost")) { newSA.mapParams.put("WithoutManaCost", "True"); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index d00a2e8fbd5..d4e6661c3a4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -152,16 +152,9 @@ public class TriggerChangesZone extends Trigger { return false; } - final Card card = (Card) runParams.get(AbilityKey.Card); - if (card == null) { - return false; - } + final Card card = (Card) runParams.get(AbilityKey.CardLKI); final int rightSide = AbilityUtils.calculateAmount(getHostCard(), cond.substring(2), this); - - // need to check the ChangeZone LKI copy for damage, otherwise it'll return 0 for a new object in the new zone - Card lkiCard = card.getGame().getChangeZoneLKIInfo(card); - - final boolean expr = Expressions.compare(lkiCard.getAssignedDamage(), cond, rightSide); + final boolean expr = Expressions.compare(card.getAssignedDamage(), cond, rightSide); if (!expr) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 661720cd564..b00f47e0c61 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -67,6 +67,8 @@ public class WrappedAbility extends Ability { ApiType.SacrificeAll, ApiType.Pump, + ApiType.DealDamage, // checked + ApiType.Regenerate, // Updated ApiType.RegenerateAll, // No Triggered ApiType.Regeneration, // Replacement Effect only @@ -490,9 +492,7 @@ public class WrappedAbility extends Ability { } } - if (!regtrig.hasParam("NoTimestampCheck")) { - timestampCheck(); - } + timestampCheck(); getActivatingPlayer().getController().playSpellAbilityNoStack(sa, false); } diff --git a/forge-gui/res/cardsfolder/a/ajanis_last_stand.txt b/forge-gui/res/cardsfolder/a/ajanis_last_stand.txt index 0bda956e990..476252eca9f 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_last_stand.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_last_stand.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Creature.YouCtrl,Planeswalker.YouCtrl | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDiesToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature or planeswalker you control dies, you may sacrifice CARDNAME. If you do, create a 4/4 white Avatar creature token with flying. SVar:TrigDiesToken:AB$ Token | Cost$ Sac<1/CARDNAME> | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ w_4_4_avatar_flying -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | IsPresent$ Plains.YouCtrl | Execute$ TrigDiscardedToken | TriggerZones$ Battlefield | TriggerDescription$ When a spell or ability an opponent controls causes you to discard this card, if you control a Plains, create a 4/4 white Avatar creature token with flying. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | IsPresent$ Plains.YouCtrl | Execute$ TrigDiscardedToken | TriggerDescription$ When a spell or ability an opponent controls causes you to discard this card, if you control a Plains, create a 4/4 white Avatar creature token with flying. SVar:TrigDiscardedToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ w_4_4_avatar_flying Oracle:Whenever a creature or planeswalker you control dies, you may sacrifice Ajani's Last Stand. If you do, create a 4/4 white Avatar creature token with flying.\nWhen a spell or ability an opponent controls causes you to discard this card, if you control a Plains, create a 4/4 white Avatar creature token with flying. diff --git a/forge-gui/res/cardsfolder/d/dingus_egg.txt b/forge-gui/res/cardsfolder/d/dingus_egg.txt index d9fb9e19464..48d2dd8a8a6 100644 --- a/forge-gui/res/cardsfolder/d/dingus_egg.txt +++ b/forge-gui/res/cardsfolder/d/dingus_egg.txt @@ -1,7 +1,7 @@ Name:Dingus Egg ManaCost:4 Types:Artifact -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | NoTimestampCheck$ True | TriggerDescription$ Whenever a land is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that land's controller. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that land's controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 AI:RemoveDeck:Random Oracle:Whenever a land is put into a graveyard from the battlefield, Dingus Egg deals 2 damage to that land's controller. diff --git a/forge-gui/res/cardsfolder/g/gorilla_tactics.txt b/forge-gui/res/cardsfolder/g/gorilla_tactics.txt index 4338219b7ca..02783af0c35 100644 --- a/forge-gui/res/cardsfolder/g/gorilla_tactics.txt +++ b/forge-gui/res/cardsfolder/g/gorilla_tactics.txt @@ -2,7 +2,7 @@ Name:Gorilla Tactics ManaCost:1 G Types:Instant A:SP$ Token | Cost$ 1 G | TokenScript$ g_2_2_gorilla | SpellDescription$ Create a 2/2 green Gorilla creature token. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigDouble | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, create two 2/2 green Gorilla creature tokens. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigDouble | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, create two 2/2 green Gorilla creature tokens. SVar:TrigDouble:DB$ Token | TokenScript$ g_2_2_gorilla | TokenAmount$ 2 DeckHas:Ability$Token Oracle:Create a 2/2 green Gorilla creature token.\nWhen a spell or ability an opponent controls causes you to discard Gorilla Tactics, create two 2/2 green Gorilla creature tokens. diff --git a/forge-gui/res/cardsfolder/g/guerrilla_tactics.txt b/forge-gui/res/cardsfolder/g/guerrilla_tactics.txt index 29a09fb284a..a479fb43fe0 100644 --- a/forge-gui/res/cardsfolder/g/guerrilla_tactics.txt +++ b/forge-gui/res/cardsfolder/g/guerrilla_tactics.txt @@ -2,7 +2,7 @@ Name:Guerrilla Tactics ManaCost:1 R Types:Instant A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Any | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigDoubleDmg | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, CARDNAME deals 4 damage to any target. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigDoubleDmg | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, CARDNAME deals 4 damage to any target. SVar:TrigDoubleDmg:DB$ DealDamage | ValidTgts$ Any | NumDmg$ 4 SVar:DiscardMeByOpp:3 Oracle:Guerrilla Tactics deals 2 damage to any target.\nWhen a spell or ability an opponent controls causes you to discard Guerrilla Tactics, Guerrilla Tactics deals 4 damage to any target. diff --git a/forge-gui/res/cardsfolder/m/mangaras_blessing.txt b/forge-gui/res/cardsfolder/m/mangaras_blessing.txt index 63f985a0f29..0c504ef1bcf 100644 --- a/forge-gui/res/cardsfolder/m/mangaras_blessing.txt +++ b/forge-gui/res/cardsfolder/m/mangaras_blessing.txt @@ -2,7 +2,7 @@ Name:Mangara's Blessing ManaCost:2 W Types:Instant A:SP$ GainLife | Cost$ 2 W | Defined$ You | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigGainLife | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, you gain 2 life, and you return CARDNAME from your graveyard to your hand at the beginning of the next end step. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigGainLife | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, you gain 2 life, and you return CARDNAME from your graveyard to your hand at the beginning of the next end step. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DelayReturn SVar:DelayReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self diff --git a/forge-gui/res/cardsfolder/m/metrognome.txt b/forge-gui/res/cardsfolder/m/metrognome.txt index 27700c0a024..270d3baa760 100644 --- a/forge-gui/res/cardsfolder/m/metrognome.txt +++ b/forge-gui/res/cardsfolder/m/metrognome.txt @@ -2,7 +2,7 @@ Name:Metrognome ManaCost:4 Types:Artifact A:AB$ Token | Cost$ 4 T | TokenAmount$ 1 | TokenScript$ c_1_1_a_gnome | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Gnome artifact creature token. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigToken | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, create four 1/1 colorless Gnome artifact creature tokens. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigToken | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, create four 1/1 colorless Gnome artifact creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ 4 | TokenScript$ c_1_1_a_gnome | TokenOwner$ You SVar:DiscardMeByOpp:2 Oracle:When a spell or ability an opponent controls causes you to discard Metrognome, create four 1/1 colorless Gnome artifact creature tokens.\n{4}, {T}: Create a 1/1 colorless Gnome artifact creature token. diff --git a/forge-gui/res/cardsfolder/o/orvar_the_all_form.txt b/forge-gui/res/cardsfolder/o/orvar_the_all_form.txt index f1d090fd38a..1cf4072b098 100644 --- a/forge-gui/res/cardsfolder/o/orvar_the_all_form.txt +++ b/forge-gui/res/cardsfolder/o/orvar_the_all_form.txt @@ -5,7 +5,7 @@ PT:3/3 K:Changeling T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | TargetsValid$ Permanent.YouCtrl+Other+inZoneBattlefield | Execute$ TrigCopyTarget | TriggerDescription$ Whenever you cast an instant or sorcery spell, if it targets one or more other permanents you control, create a token that's a copy of one of those permanents. SVar:TrigCopyTarget:DB$ CopyPermanent | Defined$ TriggeredSpellAbilityTargets | Choices$ Permanent.YouCtrl+Other | ConditionDefined$ TriggeredSpellAbility | ConditionPresent$ Spell.IsTargeting Valid Permanent.YouCtrl~Other -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigTokenCopy | TriggerDescription$ When a spell or ability an opponent controls causes you to discard this card, create a token that's a copy of target permanent. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigTokenCopy | TriggerDescription$ When a spell or ability an opponent controls causes you to discard this card, create a token that's a copy of target permanent. SVar:TrigTokenCopy:DB$ CopyPermanent | ValidTgts$ Permanent DeckHints:Type$Instant|Sorcery DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/p/psychic_purge.txt b/forge-gui/res/cardsfolder/p/psychic_purge.txt index 1ec4d0ae8ac..24be64a450e 100644 --- a/forge-gui/res/cardsfolder/p/psychic_purge.txt +++ b/forge-gui/res/cardsfolder/p/psychic_purge.txt @@ -2,7 +2,7 @@ Name:Psychic Purge ManaCost:U Types:Sorcery A:SP$ DealDamage | Cost$ U | ValidTgts$ Any | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigLoseLife | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, that player loses 5 life. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigLoseLife | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, that player loses 5 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredCauseController | LifeAmount$ 5 SVar:DiscardMeByOpp:3 Oracle:Psychic Purge deals 1 damage to any target.\nWhen a spell or ability an opponent controls causes you to discard Psychic Purge, that player loses 5 life. diff --git a/forge-gui/res/cardsfolder/p/pure_intentions.txt b/forge-gui/res/cardsfolder/p/pure_intentions.txt index 2033b1c98aa..7ff8149ef52 100644 --- a/forge-gui/res/cardsfolder/p/pure_intentions.txt +++ b/forge-gui/res/cardsfolder/p/pure_intentions.txt @@ -2,9 +2,9 @@ Name:Pure Intentions ManaCost:W Types:Instant Arcane A:SP$ Effect | Cost$ W | Triggers$ PureDiscarded | SpellDescription$ Whenever a spell or ability an opponent controls causes you to discard cards this turn, return those cards from your graveyard to your hand. -SVar:PureDiscarded:Mode$ Discarded | ValidCard$ Card.YouCtrl | ValidCause$ Card.OppCtrl | TriggerZones$ Command | Execute$ TrigPureChange | TriggerDescription$ Whenever a spell or ability an opponent controls causes you to discard cards this turn, return those cards from your graveyard to your hand. -SVar:TrigPureChange:DB$ ChangeZone | Defined$ TriggeredCardLKICopy | Origin$ Graveyard | Destination$ Hand -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigDelay | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return CARDNAME from your graveyard to your hand at the beginning of the next end step. +SVar:PureDiscarded:Mode$ DiscardedAll | ValidCard$ Card.YouCtrl | ValidCause$ SpellAbility.OppCtrl | TriggerZones$ Command | Execute$ TrigPureChange | TriggerDescription$ Whenever a spell or ability an opponent controls causes you to discard cards this turn, return those cards from your graveyard to your hand. +SVar:TrigPureChange:DB$ ChangeZone | Defined$ TriggeredCards | Origin$ Graveyard | Destination$ Hand +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigDelay | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return CARDNAME from your graveyard to your hand at the beginning of the next end step. SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigPureReturn | SpellDescription$ Return CARDNAME from your graveyard to your hand at the beginning of the next end step. SVar:TrigPureReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand SVar:DiscardMeByOpp:1 diff --git a/forge-gui/res/cardsfolder/q/quagnoth.txt b/forge-gui/res/cardsfolder/q/quagnoth.txt index 2757c59b3b2..41e0e7d8e84 100644 --- a/forge-gui/res/cardsfolder/q/quagnoth.txt +++ b/forge-gui/res/cardsfolder/q/quagnoth.txt @@ -4,7 +4,7 @@ Types:Creature Beast PT:4/5 K:Split second K:Shroud -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigReturn | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return it to your hand. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ TrigReturn | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return it to your hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard,Exile | Destination$ Hand SVar:DiscardMeByOpp:1 Oracle:Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.)\nShroud (This creature can't be the target of spells or abilities.)\nWhen a spell or ability an opponent controls causes you to discard Quagnoth, return it to your hand. diff --git a/forge-gui/res/cardsfolder/s/sand_golem.txt b/forge-gui/res/cardsfolder/s/sand_golem.txt index afe52163795..5399d10434c 100644 --- a/forge-gui/res/cardsfolder/s/sand_golem.txt +++ b/forge-gui/res/cardsfolder/s/sand_golem.txt @@ -2,7 +2,7 @@ Name:Sand Golem ManaCost:5 Types:Artifact Creature Golem PT:3/3 -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ DelTrig | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return CARDNAME from your graveyard to the battlefield with a +1/+1 counter on it at the beginning of the next end step. +T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ SpellAbility.OppCtrl | Execute$ DelTrig | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return CARDNAME from your graveyard to the battlefield with a +1/+1 counter on it at the beginning of the next end step. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME from your graveyard to the battlefield with a +1/+1 counter on it at the beginning of the next end step. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | WithCountersType$ P1P1 SVar:DiscardMeByOpp:3 diff --git a/forge-gui/res/cardsfolder/s/spiritual_focus.txt b/forge-gui/res/cardsfolder/s/spiritual_focus.txt index 8e0306cb19f..b19e798ddbb 100644 --- a/forge-gui/res/cardsfolder/s/spiritual_focus.txt +++ b/forge-gui/res/cardsfolder/s/spiritual_focus.txt @@ -1,7 +1,7 @@ Name:Spiritual Focus ManaCost:1 W Types:Enchantment -T:Mode$ Discarded | ValidCard$ Card.YouCtrl | ValidCause$ Card.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card. +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | ValidCause$ SpellAbility.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | OptionalDecider$ You Oracle:Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card.