From 7ee552b2738420faadef9fb1bfcb646e94bb4da9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 09:13:15 -0500 Subject: [PATCH 1/9] anrakyr_the_traveller.txt --- .../res/cardsfolder/upcoming/anrakyr_the_traveller.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/anrakyr_the_traveller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anrakyr_the_traveller.txt b/forge-gui/res/cardsfolder/upcoming/anrakyr_the_traveller.txt new file mode 100644 index 00000000000..25f1856d56c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/anrakyr_the_traveller.txt @@ -0,0 +1,10 @@ +Name:Anrakyr the Traveller +ManaCost:4 B +Types:Legendary Artifact Creature Necron +PT:4/4 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigCast | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may cast an artifact spell from your hand or graveyard by paying life equal to its mana value rather than paying its mana cost. +SVar:TrigCast:DB$ Play | ValidZone$ Hand | Valid$ Artifact.YouOwn | ValidSA$ Spell | Controller$ You | ValidZone$ Hand,Graveyard | Optional$ True | Amount$ 1 | PlayCost$ PayLife +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Graveyard +DeckHints:Type$Artifact +Oracle:Lord of the Pyrrhian Legions — Whenever Anrakyr the Traveller attacks, you may cast an artifact spell from your hand or graveyard by paying life equal to its mana value rather than paying its mana cost. From 5d0dc395f6ee65d784644b9e7a66ce9890bd47c4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 09:13:54 -0500 Subject: [PATCH 2/9] PlayEffect support "ConvertedManaCost" in "PlayCost$" --- .../main/java/forge/game/ability/effects/PlayEffect.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 3f94ffdac45..fdeddda35e4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -363,7 +363,12 @@ public class PlayEffect extends SpellAbilityEffect { if ("ManaCost".equals(sa.getParam("PlayCost"))) { abCost = new Cost(source.getManaCost(), false); } else { - abCost = new Cost(sa.getParam("PlayCost"), false); + String cost = sa.getParam("PlayCost"); + if (cost.contains("ConvertedManaCost")) { + final String costcmc = Integer.toString(tgtCard.getCMC()); + cost = cost.replace("ConvertedManaCost", costcmc); + } + abCost = new Cost(cost, false); } tgtSA = tgtSA.copyWithDefinedCost(abCost); From 5d174ecdaaf309fe7cb249f984d8632b5e325828 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 12:12:19 -0500 Subject: [PATCH 3/9] shatterskull_charger.txt fix TrigDesc --- forge-gui/res/cardsfolder/s/shatterskull_charger.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/shatterskull_charger.txt b/forge-gui/res/cardsfolder/s/shatterskull_charger.txt index 044203c7284..0c94168b1d9 100644 --- a/forge-gui/res/cardsfolder/s/shatterskull_charger.txt +++ b/forge-gui/res/cardsfolder/s/shatterskull_charger.txt @@ -7,7 +7,7 @@ K:Trample K:Haste K:etbCounter:P1P1:1:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. SVar:WasKicked:Count$Kicked.1.0 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of your end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of your end step, return CARDNAME to its owner's hand unless it has a +1/+1 counter on it. SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self SVar:PlayMain1:TRUE DeckHas:Ability$Counters From a974b9e0d89592379b751deb1a1d32cdeda83069 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 12:12:35 -0500 Subject: [PATCH 4/9] darigaaz_the_igniter.txt fix TrigDesc --- forge-gui/res/cardsfolder/d/darigaaz_the_igniter.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/darigaaz_the_igniter.txt b/forge-gui/res/cardsfolder/d/darigaaz_the_igniter.txt index e2e85ae8435..d4227aa0401 100644 --- a/forge-gui/res/cardsfolder/d/darigaaz_the_igniter.txt +++ b/forge-gui/res/cardsfolder/d/darigaaz_the_igniter.txt @@ -3,7 +3,7 @@ ManaCost:3 B R G Types:Legendary Creature Dragon PT:6/6 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChooseColor | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{R}. If you do, choose a color, then that player reveals their hand and Darigaaz deals damage to the player equal to the number of cards of that color revealed this way. +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChooseColor | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{R}. If you do, choose a color, then that player reveals their hand and NICKNAME deals damage to the player equal to the number of cards of that color revealed this way. SVar:TrigChooseColor:AB$ ChooseColor | Cost$ 2 R | Defined$ You | AILogic$ MostProminentInHumanDeck | SubAbility$ DBRevealHand SVar:DBRevealHand:DB$ RevealHand | Defined$ TriggeredTarget | RememberRevealed$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredTarget | NumDmg$ X | SubAbility$ DBCleanup From 54ae16e87f5bd609061b187de70769534be1b651 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 12:12:48 -0500 Subject: [PATCH 5/9] capricious_efreet.txt better Cleanup --- forge-gui/res/cardsfolder/c/capricious_efreet.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/capricious_efreet.txt b/forge-gui/res/cardsfolder/c/capricious_efreet.txt index a1541471a5b..90fb9780edd 100644 --- a/forge-gui/res/cardsfolder/c/capricious_efreet.txt +++ b/forge-gui/res/cardsfolder/c/capricious_efreet.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouCtrl | TgtPrompt$ Select target nonland permanent you control | Mandatory$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump | StackDescription$ None SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump2 | StackDescription$ None SVar:DBPump2:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select another target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | TargetUnique$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBChooseRandom | StackDescription$ None -SVar:DBChooseRandom:DB$ ChooseCard | Defined$ You | Amount$ 1 | AtRandom$ True | Choices$ Card.IsRemembered | SubAbility$ DBDestroy +SVar:DBChooseRandom:DB$ ChooseCard | AtRandom$ True | Choices$ Card.IsRemembered | SubAbility$ DBDestroy SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True Oracle:At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don't control. Destroy one of them at random. From 9a430333d954410153236b3fee6fb268b6956355 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 16:38:22 -0500 Subject: [PATCH 6/9] ChooseCardEffect streamline Random UI a bit --- .../forge/game/ability/effects/ChooseCardEffect.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index d76fd21c7fe..ef0f8db6827 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -101,6 +101,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { } for (final Player p : tgtPlayers) { + boolean dontRevealToOwner = true; if (sa.hasParam("EachBasicType")) { // Get all lands, List land = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.LANDS); @@ -220,6 +221,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { } else if ((tgt == null) || p.canBeTargetedBy(sa)) { if (sa.hasParam("AtRandom") && !choices.isEmpty()) { Aggregates.random(choices, validAmount, chosen); + dontRevealToOwner = false; } else { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; if (sa.hasParam ("ChoiceTitleAppendDefined")) { @@ -248,12 +250,14 @@ public class ChooseCardEffect extends SpellAbilityEffect { } } if (sa.hasParam("Reveal") && !sa.hasParam("SecretlyChoose")) { - game.getAction().reveal(chosen, p, true, sa.hasParam("RevealTitle") ? sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " "); + game.getAction().reveal(chosen, p, dontRevealToOwner, sa.hasParam("RevealTitle") ? + sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " "); } } - if(sa.hasParam("Reveal") && sa.hasParam("SecretlyChoose")) { + if (sa.hasParam("Reveal") && sa.hasParam("SecretlyChoose")) { for (final Player p : tgtPlayers) { - game.getAction().reveal(chosen, p, true, sa.hasParam("RevealTitle") ? sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " "); + game.getAction().reveal(chosen, p, true, sa.hasParam("RevealTitle") ? + sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " "); } } host.setChosenCards(chosen); From 44655bb4200ba2e0e591d5212b061ff079c2aabb Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 16:38:34 -0500 Subject: [PATCH 7/9] capricious_efreet.txt tighten up --- forge-gui/res/cardsfolder/c/capricious_efreet.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/capricious_efreet.txt b/forge-gui/res/cardsfolder/c/capricious_efreet.txt index 90fb9780edd..a2bc26d4fd2 100644 --- a/forge-gui/res/cardsfolder/c/capricious_efreet.txt +++ b/forge-gui/res/cardsfolder/c/capricious_efreet.txt @@ -3,10 +3,9 @@ ManaCost:4 R R Types:Creature Efreet PT:6/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don't control. Destroy one of them at random. -SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouCtrl | TgtPrompt$ Select target nonland permanent you control | Mandatory$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump | StackDescription$ None -SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump2 | StackDescription$ None -SVar:DBPump2:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select another target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | TargetUnique$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBChooseRandom | StackDescription$ None -SVar:DBChooseRandom:DB$ ChooseCard | AtRandom$ True | Choices$ Card.IsRemembered | SubAbility$ DBDestroy +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouCtrl | TgtPrompt$ Select target nonland permanent you control | Mandatory$ True | IsCurse$ True | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select up to two target nonland permanents you don't control | TargetMin$ 0 | TargetMax$ 2 | IsCurse$ True | SubAbility$ DBChooseRandom +SVar:DBChooseRandom:DB$ ChooseCard | AtRandom$ True | Reveal$ True | RevealTitle$ OVERRIDE Randomly chosen permanent: | DefinedCards$ TargetedCard | SubAbility$ DBDestroy SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True Oracle:At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don't control. Destroy one of them at random. From 5b01fb8332ccdbc0fe094180f3b680169e457eed Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 18 Sep 2022 16:40:52 -0500 Subject: [PATCH 8/9] PlayEffect move String cost up a bit --- .../src/main/java/forge/game/ability/effects/PlayEffect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index fdeddda35e4..36a6c6564c8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -360,10 +360,10 @@ public class PlayEffect extends SpellAbilityEffect { tgtSA = tgtSA.copyWithNoManaCost(); } else if (sa.hasParam("PlayCost")) { Cost abCost; - if ("ManaCost".equals(sa.getParam("PlayCost"))) { + String cost = sa.getParam("PlayCost"); + if (cost.equals("ManaCost")) { abCost = new Cost(source.getManaCost(), false); } else { - String cost = sa.getParam("PlayCost"); if (cost.contains("ConvertedManaCost")) { final String costcmc = Integer.toString(tgtCard.getCMC()); cost = cost.replace("ConvertedManaCost", costcmc); From 1c68a89bc6d7f556b6523c05cedfda233cabf838 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Mon, 19 Sep 2022 05:26:44 -0400 Subject: [PATCH 9/9] shadowheart_sharran_cleric.txt (#1526) --- .../upcoming/shadowheart_sharran_cleric.txt | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/shadowheart_sharran_cleric.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shadowheart_sharran_cleric.txt b/forge-gui/res/cardsfolder/upcoming/shadowheart_sharran_cleric.txt new file mode 100644 index 00000000000..ee153cf7202 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shadowheart_sharran_cleric.txt @@ -0,0 +1,80 @@ +Name:Shadowheart, Sharran Cleric +ManaCost:1 B +Types:Legendary Creature Human Elf Cleric +PT:2/2 +K:Deathtouch +K:Specialize:2::Activate only if a player has 13 or less life.:CheckSVar$ X | SVarCompare$ LE13 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals 1 damage to each player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +SVar:X:PlayerCountPlayers$LowestLifeTotal +AlternateMode:Specialize +DeckHas:Ability$Discard +Oracle:Deathtouch\nSpecialize {2}. Activate only if a player has 13 or less life.\nAt the beginning of your end step, Shadowheart, Sharran Cleric deals 1 damage to each player. + +SPECIALIZE:WHITE + +Name:Shadowheart, Cleric of Order +ManaCost:1 W B +Types:Legendary Creature Human Elf Cleric +PT:4/4 +K:Deathtouch +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals 1 damage to each player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigToken | TriggerDescription$ Whenever you lose life during your turn, create a 2/2 white Knight creature token. +SVar:TrigToken:DB$ Token | TokenScript$ w_2_2_knight +DeckHas:Ability$Token & Type$Knight +Oracle:Deathtouch\nAt the beginning of your end step, Shadowheart, Cleric of Order deals 1 damage to each player.\nWhenever you lose life during your turn, create a 2/2 white Knight creature token. + +SPECIALIZE:BLUE + +Name:Shadowheart, Cleric of Trickery +ManaCost:1 U B +Types:Legendary Creature Human Elf Cleric +PT:4/4 +K:Deathtouch +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals 1 damage to each player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigDraw | TriggerDescription$ Whenever you lose life during your turn, draw a card. +SVar:TrigDraw:DB$ Draw +Oracle:Deathtouch\nAt the beginning of your end step, Shadowheart, Cleric of Trickery deals 1 damage to each player.\nWhenever you lose life during your turn, draw a card. + +SPECIALIZE:BLACK + +Name:Shadowheart, Cleric of Graves +ManaCost:1 B B +Types:Legendary Creature Human Elf Cleric +PT:4/4 +K:Deathtouch +K:Lifelink +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals 1 damage to each player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +DeckHas:Ability$LifeGain +Oracle:Deathtouch, lifelink\nAt the beginning of your end step, Shadowheart, Cleric of Graves deals 1 damage to each player. + +SPECIALIZE:RED + +Name:Shadowheart, Cleric of War +ManaCost:1 B R +Types:Legendary Creature Human Elf Cleric +PT:4/4 +K:Deathtouch +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your end step, CARDNAME deals 1 damage to each player. +SVar:TrigDamageAll:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigDamageOpp | TriggerDescription$ Whenever you lose life during your turn, NICKNAME deals that much damage to each opponent. +SVar:TrigDamageOpp:DB$ DealDamage | NumDmg$ X | Defined$ Opponent +SVar:X:TriggerCount$LifeAmount +Oracle:Deathtouch\nAt the beginning of your end step, Shadowheart, Cleric of War deals 1 damage to each player.\nWhenever you lose life during your turn, Shadowheart deals that much damage to each opponent. + +SPECIALIZE:GREEN + +Name:Shadowheart, Cleric of Twilight +ManaCost:1 B G +Types:Legendary Creature Human Elf Cleric +PT:4/4 +K:Deathtouch +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, NICKNAME deals 1 damage to each player. +SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player | NumDmg$ 1 +T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever you lose life during your turn, put a +1/+1 counter on NICKNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 +Oracle:Deathtouch\nShadowheart, Cleric of Twilight can't be blocked by creatures with power 2 or less.\nAt the beginning of your end step, Shadowheart deals 1 damage to each player.\nWhenever you lose life during your turn, put a +1/+1 counter on Shadowheart.