Fixed WAR, C18, PAL00, UST set, added/fixed primitives, improved Android downloader, implemented Foretell ability, improved castcard keyword, improved "can play" restriction, improved primitives parsed in order to allow the nesting of transforms, ability$! reveal, scry, pay, grant keywords.

This commit is contained in:
Vittorio Alfieri
2021-01-14 17:51:13 +01:00
parent 69885cf90a
commit 91d19e2852
19 changed files with 340 additions and 312 deletions
@@ -957,8 +957,10 @@ public class ImgDownloader {
cardurl = "https://img.scryfall.com/cards/large/front/1/f/1fe2b76f-ddb7-49d5-933b-ccb06be5d46f.jpg?1562875903"; cardurl = "https://img.scryfall.com/cards/large/front/1/f/1fe2b76f-ddb7-49d5-933b-ccb06be5d46f.jpg?1562875903";
else if (id.equals("376399")) else if (id.equals("376399"))
cardurl = "https://img.scryfall.com/cards/large/front/c/e/cec89c38-0b72-44b0-ac6c-7eb9503e1256.jpg?1562938742"; cardurl = "https://img.scryfall.com/cards/large/front/c/e/cec89c38-0b72-44b0-ac6c-7eb9503e1256.jpg?1562938742";
else if (id.equals("451089")) else if (id.equals("451089") || id.equals("45108910t"))
cardurl = "https://img.scryfall.com/cards/large/front/5/8/58164521-aeec-43fc-9db9-d595432dea6f.jpg?1564694999"; cardurl = "https://img.scryfall.com/cards/large/front/5/8/58164521-aeec-43fc-9db9-d595432dea6f.jpg?1564694999";
else if (id.equals("451089t"))
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/c/5/c5ad13b4-bbf5-4c98-868f-4d105eaf8833.jpg?1592710082";
else if (id.equals("470745")) else if (id.equals("470745"))
cardurl = "https://img.scryfall.com/cards/large/front/c/a/ca4caa4e-6b8f-4be8-b177-de2ebe2c9201.jpg?1567044873"; cardurl = "https://img.scryfall.com/cards/large/front/c/a/ca4caa4e-6b8f-4be8-b177-de2ebe2c9201.jpg?1567044873";
else if (id.equals("470609")) else if (id.equals("470609"))
+2 -2
View File
@@ -672,8 +672,8 @@ rarity=C
[/card] [/card]
[card] [card]
primitive=Dokai, Weaver of Life primitive=Dokai, Weaver of Life
id=451089 id=-45108910
rarity=R rarity=T
[/card] [/card]
[card] [card]
primitive=Budoka Gardener primitive=Budoka Gardener
+1 -1
View File
@@ -7,7 +7,7 @@ total=11
[/meta] [/meta]
[card] [card]
primitive=Duress primitive=Duress
id=17973 id=18040
rarity=R rarity=R
[/card] [/card]
[card] [card]
+1 -6
View File
@@ -3,7 +3,7 @@ author=Wagic Team
name=Unstable name=Unstable
orderindex=UN-3.UST orderindex=UN-3.UST
year=2017-12-08 year=2017-12-08
total=269 total=268
[/meta] [/meta]
[card] [card]
primitive=Adorable Kitten primitive=Adorable Kitten
@@ -1345,8 +1345,3 @@ primitive=Enraged Killbot
id=439657 id=439657
rarity=C rarity=C
[/card] [/card]
[card]
primitive=Baffling End
id=439658
rarity=U
[/card]
+1 -181
View File
@@ -4,7 +4,7 @@ name=War of the Spark
block=Guilds of Ravnica block=Guilds of Ravnica
orderindex=EXP-ZZC.WAR orderindex=EXP-ZZC.WAR
year=2019-05-03 year=2019-05-03
total=311 total=275
[/meta] [/meta]
[card] [card]
primitive=Ahn-Crop Invader primitive=Ahn-Crop Invader
@@ -27,11 +27,6 @@ id=461111
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Ajani, the Greathearted
id=null
rarity=R
[/card]
[card]
primitive=Angrath's Rampage primitive=Angrath's Rampage
id=461112 id=461112
rarity=U rarity=U
@@ -42,11 +37,6 @@ id=461154
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Angrath, Captain of Chaos
id=null
rarity=U
[/card]
[card]
primitive=Arboreal Grazer primitive=Arboreal Grazer
id=461076 id=461076
rarity=C rarity=C
@@ -62,11 +52,6 @@ id=461077
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Arlinn, Voice of the Pack
id=null
rarity=U
[/card]
[card]
primitive=Ashiok's Skulker primitive=Ashiok's Skulker
id=460967 id=460967
rarity=C rarity=C
@@ -77,11 +62,6 @@ id=461155
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Ashiok, Dream Render
id=null
rarity=U
[/card]
[card]
primitive=Augur of Bolas primitive=Augur of Bolas
id=460968 id=460968
rarity=U rarity=U
@@ -222,11 +202,6 @@ id=461046
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Chandra, Fire Artisan
id=null
rarity=R
[/card]
[card]
primitive=Charity Extractor primitive=Charity Extractor
id=461008 id=461008
rarity=C rarity=C
@@ -282,11 +257,6 @@ id=461010
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Davriel, Rogue Shadowmage
id=null
rarity=U
[/card]
[card]
primitive=Deathsprout primitive=Deathsprout
id=461116 id=461116
rarity=U rarity=U
@@ -337,11 +307,6 @@ id=461118
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Domri, Anarch of Bolas
id=null
rarity=R
[/card]
[card]
primitive=Dovin's Veto primitive=Dovin's Veto
id=461120 id=461120
rarity=U rarity=U
@@ -352,11 +317,6 @@ id=461156
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Dovin, Hand of Control
id=null
rarity=U
[/card]
[card]
primitive=Dreadhorde Arcanist primitive=Dreadhorde Arcanist
id=461052 id=461052
rarity=R rarity=R
@@ -507,11 +467,6 @@ id=460940
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Gideon Blackblade
id=null
rarity=M
[/card]
[card]
primitive=Gideon's Battle Cry primitive=Gideon's Battle Cry
id=463834 id=463834
rarity=R rarity=R
@@ -627,11 +582,6 @@ id=461157
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Huatli, the Sun's Heart
id=null
rarity=U
[/card]
[card]
primitive=Ignite the Beacon primitive=Ignite the Beacon
id=460945 id=460945
rarity=R rarity=R
@@ -707,11 +657,6 @@ id=460981
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Jace, Wielder of Mysteries
id=null
rarity=R
[/card]
[card]
primitive=Jaya's Greeting primitive=Jaya's Greeting
id=461063 id=461063
rarity=C rarity=C
@@ -722,21 +667,11 @@ id=461062
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Jaya, Venerated Firemage
id=null
rarity=U
[/card]
[card]
primitive=Jiang Yanggu, Wildcrafter primitive=Jiang Yanggu, Wildcrafter
id=461091 id=461091
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Jiang Yanggu, Wildcrafter
id=null
rarity=U
[/card]
[card]
primitive=Karn's Bastion primitive=Karn's Bastion
id=461175 id=461175
rarity=R rarity=R
@@ -747,11 +682,6 @@ id=460928
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Karn, the Great Creator
id=null
rarity=R
[/card]
[card]
primitive=Kasmina's Transmutation primitive=Kasmina's Transmutation
id=460984 id=460984
rarity=C rarity=C
@@ -762,11 +692,6 @@ id=460983
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Kasmina, Enigmatic Mentor
id=null
rarity=U
[/card]
[card]
primitive=Kaya's Ghostform primitive=Kaya's Ghostform
id=461021 id=461021
rarity=C rarity=C
@@ -777,11 +702,6 @@ id=461158
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Kaya, Bane of the Dead
id=null
rarity=U
[/card]
[card]
primitive=Kiora's Dambreaker primitive=Kiora's Dambreaker
id=460985 id=460985
rarity=C rarity=C
@@ -792,11 +712,6 @@ id=461159
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Kiora, Behemoth Beckoner
id=null
rarity=U
[/card]
[card]
primitive=Kraul Stinger primitive=Kraul Stinger
id=461092 id=461092
rarity=C rarity=C
@@ -847,11 +762,6 @@ id=461024
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Liliana, Dreadhorde General
id=null
rarity=M
[/card]
[card]
primitive=Living Twister primitive=Living Twister
id=461130 id=461130
rarity=R rarity=R
@@ -937,11 +847,6 @@ id=461160
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Nahiri, Storm of Stone
id=null
rarity=U
[/card]
[card]
primitive=Narset's Reversal primitive=Narset's Reversal
id=460989 id=460989
rarity=R rarity=R
@@ -952,11 +857,6 @@ id=460988
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Narset, Parter of Veils
id=null
rarity=U
[/card]
[card]
primitive=Neheb, Dreadhorde Champion primitive=Neheb, Dreadhorde Champion
id=461067 id=461067
rarity=R rarity=R
@@ -977,11 +877,6 @@ id=461134
rarity=M rarity=M
[/card] [/card]
[card] [card]
primitive=Nicol Bolas, Dragon-God
id=null
rarity=M
[/card]
[card]
primitive=Nissa's Triumph primitive=Nissa's Triumph
id=461097 id=461097
rarity=U rarity=U
@@ -992,11 +887,6 @@ id=461096
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Nissa, Who Shakes the World
id=null
rarity=R
[/card]
[card]
primitive=Niv-Mizzet Reborn primitive=Niv-Mizzet Reborn
id=461135 id=461135
rarity=M rarity=M
@@ -1022,11 +912,6 @@ id=461027
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Ob Nixilis, the Hate-Twisted
id=null
rarity=U
[/card]
[card]
primitive=Orzhov Guildgate primitive=Orzhov Guildgate
id=463836 id=463836
rarity=C rarity=C
@@ -1112,11 +997,6 @@ id=461138
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Ral, Storm Conduit
id=null
rarity=R
[/card]
[card]
primitive=Rally of Wings primitive=Rally of Wings
id=460954 id=460954
rarity=U rarity=U
@@ -1172,11 +1052,6 @@ id=461161
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Saheeli, Sublime Artificer
id=null
rarity=U
[/card]
[card]
primitive=Samut's Sprint primitive=Samut's Sprint
id=461069 id=461069
rarity=C rarity=C
@@ -1187,21 +1062,11 @@ id=461162
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Samut, Tyrant Smasher
id=null
rarity=U
[/card]
[card]
primitive=Sarkhan the Masterless primitive=Sarkhan the Masterless
id=461070 id=461070
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Sarkhan the Masterless
id=null
rarity=R
[/card]
[card]
primitive=Sarkhan's Catharsis primitive=Sarkhan's Catharsis
id=461071 id=461071
rarity=C rarity=C
@@ -1252,11 +1117,6 @@ id=461144
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Sorin, Vengeful Bloodlord
id=null
rarity=R
[/card]
[card]
primitive=Soul Diviner primitive=Soul Diviner
id=461145 id=461145
rarity=R rarity=R
@@ -1337,11 +1197,6 @@ id=461147
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Tamiyo, Collector of Tales
id=null
rarity=R
[/card]
[card]
primitive=Teferi's Time Twist primitive=Teferi's Time Twist
id=460999 id=460999
rarity=C rarity=C
@@ -1352,11 +1207,6 @@ id=461148
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Teferi, Time Raveler
id=null
rarity=R
[/card]
[card]
primitive=Tenth District Legionnaire primitive=Tenth District Legionnaire
id=461149 id=461149
rarity=U rarity=U
@@ -1372,11 +1222,6 @@ id=460959
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Teyo, the Shieldmage
id=null
rarity=U
[/card]
[card]
primitive=Tezzeret, Master of the Bridge primitive=Tezzeret, Master of the Bridge
id=463842 id=463842
rarity=M rarity=M
@@ -1392,11 +1237,6 @@ id=460964
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=The Wanderer
id=null
rarity=U
[/card]
[card]
primitive=Thunder Drake primitive=Thunder Drake
id=461000 id=461000
rarity=C rarity=C
@@ -1417,11 +1257,6 @@ id=461073
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Tibalt, Rakish Instigator
id=null
rarity=U
[/card]
[card]
primitive=Time Wipe primitive=Time Wipe
id=461150 id=461150
rarity=R rarity=R
@@ -1482,11 +1317,6 @@ id=460929
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Ugin, the Ineffable
id=null
rarity=R
[/card]
[card]
primitive=Unlikely Aid primitive=Unlikely Aid
id=461036 id=461036
rarity=C rarity=C
@@ -1512,11 +1342,6 @@ id=461107
rarity=R rarity=R
[/card] [/card]
[card] [card]
primitive=Vivien, Champion of the Wilds
id=null
rarity=R
[/card]
[card]
primitive=Vizier of the Scorpion primitive=Vizier of the Scorpion
id=461038 id=461038
rarity=U rarity=U
@@ -1532,11 +1357,6 @@ id=461163
rarity=U rarity=U
[/card] [/card]
[card] [card]
primitive=Vraska, Swarm's Eminence
id=null
rarity=U
[/card]
[card]
primitive=Wall of Runes primitive=Wall of Runes
id=461002 id=461002
rarity=C rarity=C
@@ -12,9 +12,6 @@
# Basic Landcycling # Basic Landcycling
#AUTO_DEFINE __BASIC_LANDCYCLING__($cost) $cost{cycle}:name(basic landcycling) moveTo(myhand) target(land[basic]|mylibrary) #AUTO_DEFINE __BASIC_LANDCYCLING__($cost) $cost{cycle}:name(basic landcycling) moveTo(myhand) target(land[basic]|mylibrary)
# Fabricate
#AUTO_DEFINE _FABRICATE_($c) transforms((,newability[choice counter(1/1.$c)],newability[choice create(Servo:Artifact Creature Servo:1/1)*$c])) ueot
# Dies, Evergreen # Dies, Evergreen
#AUTO_DEFINE _DIES_ @movedTo(this|mygraveyard) from(battlefield): #AUTO_DEFINE _DIES_ @movedTo(this|mygraveyard) from(battlefield):
@@ -173,7 +173,7 @@ toughness=2
[card] [card]
name=Act of Authority name=Act of Authority
auto=may name(Exile artifact or enchantment) target(*[artifact;enchantment]|battlefield) moveTo(ownerExile) auto=may name(Exile artifact or enchantment) target(*[artifact;enchantment]|battlefield) moveTo(ownerExile)
auto=@each my upkeep:ability$!name(Choose one) choice name(Exile opponent's artifact or enchantment) target(*[artifact;enchantment]|opponentbattlefield) moveTo(ownerExile) && all(mystored) moveto(opponentBattlefield) _ choice name(Exile your artifact or enchantment) target(*[artifact;enchantment]|mybattlefield) moveTo(ownerExile) _ choice name(Don't exile any artifact or enchantment) donothing!$ controller auto=@each my upkeep:ability$!name(Choose one) choice name(Exile opponent's artifact or enchantment) target(*[artifact;enchantment]|opponentbattlefield) moveTo(ownerExile) && all(mysource) moveto(opponentBattlefield) _ choice name(Exile your artifact or enchantment) target(*[artifact;enchantment]|mybattlefield) moveTo(ownerExile) _ choice name(Don't exile any artifact or enchantment) donothing!$ controller
text=When Act of Authority enters the battlefield, you may exile target artifact or enchantment. -- At the beginning of your upkeep, you may exile target artifact or enchantment. If you do, its controller gains control of Act of Authority. text=When Act of Authority enters the battlefield, you may exile target artifact or enchantment. -- At the beginning of your upkeep, you may exile target artifact or enchantment. If you do, its controller gains control of Act of Authority.
mana={1}{W}{W} mana={1}{W}{W}
type=Enchantment type=Enchantment
@@ -526,7 +526,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Agadeem, the Undercrypt name=Agadeem, the Undercrypt
auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
auto={T}:add{B} auto={T}:add{B}
text=As Agadeem, the Undercrypt enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {B}. text=As Agadeem, the Undercrypt enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {B}.
type=Land type=Land
@@ -1040,6 +1040,21 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Alrund, God of the Cosmos
other={1}{U} name(Hakka, Whispering Raven)
otherrestriction=can play creature
autostack=if paid(alternative) then name(Hakka, Whispering Raven) name(Hakka, Whispering Raven) flip(Hakka, Whispering Raven) forcetype(Legendary Creature)
auto=this(variable{isflipped}<1) foreach(*[foretold]|myexile) 1/1
auto=@each my endofturn restriction{compare(isflipped)~equalto~0}:transforms((,newability[choice name(Creature) reveal:2 optionone name(Get Creature) target(<2>Creature|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Artifact) reveal:2 optionone name(Get Artifact) target(<2>artifact|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Enchantment) reveal:2 optionone name(Get Enchantment) target(<2>enchantment|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Instant) reveal:2 optionone name(Get Instant) target(<2>instant|reveal) moveto(myhand) optiononeend optiontwo name(put in grave) name(Bottom of library) bottomoflibrary optiontwoend revealend],newability[choice name(Land) reveal:2 optionone name(Get Land) target(<2>land|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Planeswalker) reveal:2 optionone name(Get Planeswalker) target(<2>planeswalker|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Sorcery) reveal:2 optionone name(Get Sorcery) target(<2>sorcery|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend],newability[choice name(Tribal) reveal:2 optionone name(Get Tribal) target(<2>tribal|reveal) moveto(myhand) optiononeend optiontwo name(Bottom of library) target(<2>*|reveal) bottomoflibrary optiontwoend revealend])) oneshot
aicode=@each my endofturn restriction{compare(isflipped)~equalto~0}:ability$!name(Choose one) choice name(Creature) all(*[creature;zpos<=2]|mylibrary) moveto(myhand) && all(*[-creature;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Artifact) all(*[artifact;zpos<=2]|mylibrary) moveto(myhand) && all(*[-artifact;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Enchantment) all(*[enchantment;zpos<=2]|mylibrary) moveto(myhand) && all(*[-enchantment;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Instant) all(*[instant;zpos<=2]|mylibrary) moveto(myhand) && all(*[-instant;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Land) all(*[land;zpos<=2]|mylibrary) moveto(myhand) && all(*[-land;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Planeswalker) all(*[planeswalker;zpos<=2]|mylibrary) moveto(myhand) && all(*[-planeswalker;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Sorcery) all(*[sorcery;zpos<=2]|mylibrary) moveto(myhand) && all(*[-sorcery;zpos<=2]|mylibrary) bottomoflibrary _ choice name(Tribal) all(*[tribal;zpos<=2]|mylibrary) moveto(myhand) && all(*[-tribal;zpos<=2]|mylibrary) bottomoflibrary!$ controller
text=Alrund gets +1/+1 for each card in your hand and each foretold card you own in exile. -- At the beginning of your end step, choose a card type, then reveal the top two cards of your library. Put all cards of the chosen type into your hand and the rest on the bottom of your library in any order.
mana={3}{U}{U}
type=Legendary Creature
subtype=God
power=1
toughness=1
[/card]
[card]
name=Alseid of Life's Bounty name=Alseid of Life's Bounty
abilities=lifelink abilities=lifelink
auto={1}{S}:name(Protection from white) protection from white target(creature,enchantment|myBattlefield) auto={1}{S}:name(Protection from white) protection from white target(creature,enchantment|myBattlefield)
@@ -6713,8 +6728,8 @@ toughness=3
[/card] [/card]
[card] [card]
name=Carrion Rats name=Carrion Rats
auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mystored) fog from(this) _ choice name(Don't exile any card) donothing!$ opponent auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mysource) fog from(this) _ choice name(Don't exile any card) donothing!$ opponent
auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mystored) fog from(this) _ choice name(Don't exile any card) donothing!$ controller auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mysource) fog from(this) _ choice name(Don't exile any card) donothing!$ controller
text=Whenever Carrion Rats attacks or blocks, any player may exile a card from his or her graveyard. If a player does, Carrion Rats assigns no combat damage this turn. text=Whenever Carrion Rats attacks or blocks, any player may exile a card from his or her graveyard. If a player does, Carrion Rats assigns no combat damage this turn.
mana={B} mana={B}
type=Creature type=Creature
@@ -6734,8 +6749,8 @@ toughness=1
[/card] [/card]
[card] [card]
name=Carrion Wurm name=Carrion Wurm
auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mystored) fog from(this) _ choice name(Don't exile any card) donothing!$ opponent auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mysource) fog from(this) _ choice name(Don't exile any card) donothing!$ opponent
auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mystored) fog from(this) _ choice name(Don't exile any card) donothing!$ controller auto=@combat(attacking,blocking) source(this):ability$!name(Choose one) choice name(Exile a card) moveto(exile) target(*|mygraveyard) && all(mysource) fog from(this) _ choice name(Don't exile any card) donothing!$ controller
text=Whenever Carrion Wurm attacks or blocks, any player may exile three cards from his or her graveyard. If a player does, Carrion Wurm assigns no combat damage this turn. text=Whenever Carrion Wurm attacks or blocks, any player may exile three cards from his or her graveyard. If a player does, Carrion Wurm assigns no combat damage this turn.
mana={3}{B}{B} mana={3}{B}{B}
type=Creature type=Creature
@@ -11091,7 +11106,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Deadeye Tracker name=Deadeye Tracker
auto={1}{B}{T}:moveto(exile) target(<2>*|opponentgraveyard) && explores && reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[counter(1/1)])) forever optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) oneshot optiontwoend revealend limit:1 auto={1}{B}{T}{E(*|opponentgraveyard)} restriction{type(*|opponentgraveyard)~morethan~1}:moveto(exile) target(*|opponentgraveyard) && explores && reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[counter(1/1)])) forever optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) oneshot optiontwoend revealend limit:1
text={1}{B}, {T}: Exile two target cards from an opponent's graveyard. Deadeye Tracker explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.) text={1}{B}, {T}: Exile two target cards from an opponent's graveyard. Deadeye Tracker explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.)
mana={B} mana={B}
type=Creature type=Creature
@@ -14308,7 +14323,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Emeria, Shattered Skyclave name=Emeria, Shattered Skyclave
auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
auto={T}:add{W} auto={T}:add{W}
text=As Emeria, Shattered Skyclave enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {W}. text=As Emeria, Shattered Skyclave enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {W}.
type=Land type=Land
@@ -21071,6 +21086,18 @@ mana={X}{W}
type=Instant type=Instant
[/card] [/card]
[card] [card]
name=Hakka, Whispering Raven
abilities=flying
auto=@combatdamagefoeof(player) from(this):name(Return to hand and scry 2) name(Return to hand and scry 2) moveTo(ownerhand) and!( scry:2 scrycore delayed dontshow donothing scrycoreend scryend )!
auto=@combatdamageof(player) from(this):name(Return to hand and scry 2) name(Return to hand and scry 2) moveTo(ownerhand) and!( scry:2 scrycore delayed dontshow donothing scrycoreend scryend )!
text=Flying -- Whenever Hakka, Whispering Raven deals combat damage to a player, return it to its owners hand, then scry 2.
mana={1}{U}
type=Legendary Creature
subtype=Bird
power=2
toughness=3
[/card]
[card]
name=Halana, Kessig Ranger name=Halana, Kessig Ranger
abilities=reach,partner abilities=reach,partner
auto=@movedTo(other creature|mybattlefield):may pay({2}) name(Pay 2) all(trigger[to]) transforms((,newability[name(Damage creature) dynamicability<!powerstrike!> target(creature)])) oneshot auto=@movedTo(other creature|mybattlefield):may pay({2}) name(Pay 2) all(trigger[to]) transforms((,newability[name(Damage creature) dynamicability<!powerstrike!> target(creature)])) oneshot
@@ -21149,6 +21176,22 @@ text=Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter
type=Land type=Land
[/card] [/card]
[card] [card]
name=Halvar, God of Battle
other={1}{W} name(Sword of the Realms)
otherrestriction=can play equipment
autostack=if paid(alternative) then flip(Sword of the Realms) forcetype(Legendary Artifact)
auto=this(variable{isflipped}<1) lord(creature[geared;enchanted]|myBattlefield) double strike
auto=@each combatbegins restriction{compare(isflipped)~equalto~0,type(creature|mybattlefield)~morethan~1,type(creature[equipped]|mybattlefield)~morethan~0,type(creature[enchanted]|mybattlefield)~equalto~0}:may name(Re-attach target equipment) target(*[equipment]|mybattlefield) transforms((,newability[name(Attach to creature) name(Attach to creature) rehook target(creature|mybattlefield)])) oneshot
auto=@each combatbegins restriction{compare(isflipped)~equalto~0,type(creature|mybattlefield)~morethan~1,type(creature[equipped]|mybattlefield)~equalto~0,type(creature[enchanted]|mybattlefield)~morethan~0}:may name(Re-attach target aura) target(*[aura]|mybattlefield) transforms((,newability[name(Attach to creature) name(Attach to creature) rehook target(creature|mybattlefield)])) oneshot
auto=@each combatbegins restriction{compare(isflipped)~equalto~0,type(creature|mybattlefield)~morethan~1,type(creature[equipped]|mybattlefield)~morethan~0,type(creature[enchanted]|mybattlefield)~morethan~0}:may name(Re-attach target equipment or aura) target(*[aura;equipment]|mybattlefield) transforms((,newability[name(Attach to creature) name(Attach to creature) rehook target(creature|mybattlefield)])) oneshot
text=Creatures you control that are enchanted or equipped have double strike. -- At the beginning of each combat, you may attach target Aura or Equipment attached to a creature you control to target creature you control.
mana={2}{W}{W}
type=Legendary Creature
subtype=God
power=4
toughness=4
[/card]
[card]
name=Hammer Dropper name=Hammer Dropper
abilities=mentor abilities=mentor
auto=@combat(attacking) source(this) restriction{compare(p)~lessthan~1}:counter(1/1,1) target(other creature[attacking;power<=-1]|myBattlefield) auto=@combat(attacking) source(this) restriction{compare(p)~lessthan~1}:counter(1/1,1) target(other creature[attacking;power<=-1]|myBattlefield)
@@ -23020,7 +23063,7 @@ type=Instant
[/card] [/card]
[card] [card]
name=Hungry Hungry Heifer name=Hungry Hungry Heifer
auto=@each my upkeep:if type(*[counter{any}]|mybattlefield)~equalto~0 then sacrifice all(this) else ability!$name(Choose one) choice name(Remove a counter) removesinglecountertype(1) target(*[counter{any}]|mybattlefield) _ choice name(Sacrifice) sacrifice all(mystored)!$ controller auto=@each my upkeep:if type(*[counter{any}]|mybattlefield)~equalto~0 then sacrifice all(this) else ability!$name(Choose one) choice name(Remove a counter) removesinglecountertype(1) target(*[counter{any}]|mybattlefield) _ choice name(Sacrifice) sacrifice all(mysource)!$ controller
text=During your upkeep, remove a counter from any card you control or sacrifice Hungry Hungry Heifer. text=During your upkeep, remove a counter from any card you control or sacrifice Hungry Hungry Heifer.
mana={2}{G} mana={2}{G}
type=Summon type=Summon
@@ -25356,6 +25399,19 @@ power=3
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Jorn, God of Winter
other={1}{U}{B} name(Kaldring, the Rimestaff)
otherrestriction=can play artifact
autostack=if paid(alternative) then flip(Kaldring, the Rimestaff) forcetype(Legendary Snow Artifact)
auto=@combat(attacking) source(this) restriction{compare(isflipped)~equalto~0}:all(*[snow]|mybattlefield) untap
text=Whenever Jorn attacks, untap each snow permanent you control.
mana={2}{G}
type=Legendary Snow Creature
subtype=God
power=4
toughness=4
[/card]
[card]
name=Josu Vess, Lich Knight name=Josu Vess, Lich Knight
abilities=menace abilities=menace
kicker={5}{B} kicker={5}{B}
@@ -25688,6 +25744,18 @@ power=3
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Kaldring, the Rimestaff
auto={T}:name(Choose snow permanent) name(Choose snow permanent) target(*[snow]|mygraveyard) transforms((,newability[canplayfromgraveyard])) ueot && counter(0/0,1,KaldEffect) all(this)
auto=@movedto(*[snow]|mybattlefield) from(mygraveyard):this(counter{0/0.1.KaldEffect}>0) all(trigger[to]) tap(noevent) && ability$!counter(0/0,-1,KaldEffect) all(mysource)!$ controller
auto=@movedto(*[snow]|mystack) from(mygraveyard):this(counter{0/0.1.KaldEffect}>0) counter(0/0,1,KaldEffect2) && ability$!counter(0/0,-1,KaldEffect) all(mysource)!$ controller
auto=@movedto(*[snow]|mybattlefield):this(counter{0/0.1.KaldEffect2}>0) all(trigger[to]) tap(noevent) && ability$!counter(0/0,-1,KaldEffect2) all(mysource)!$ controller
auto=@each endofturn:this(counter{0/0.1.KaldEffect}>0) counter(0/0,-1,KaldEffect)
auto=@each endofturn:this(counter{0/0.1.KaldEffect2}>0) counter(0/0,-1,KaldEffect2)
text={T}: You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped.
mana={1}{U}{B}
type=Legendary Snow Artifact
[/card]
[card]
name=Kalitas, Traitor of Ghet name=Kalitas, Traitor of Ghet
abilities=lifelink abilities=lifelink
auto=@movedto(creature[token]|opponentbattlefield):all(trigger[to]) moveTo(exile) && token(Zombie,Creature Zombie,2/2,black) auto=@movedto(creature[token]|opponentbattlefield):all(trigger[to]) moveTo(exile) && token(Zombie,Creature Zombie,2/2,black)
@@ -32438,7 +32506,7 @@ toughness=3
[card] [card]
name=Nessian Wilds Ravager name=Nessian Wilds Ravager
abilities=flying abilities=flying
auto=ability$!choice name(Tribute 6) all(mystored) counter(1/1,6) _ choice name(May fight another target creature) may transforms((,newability[target(creature) dynamicability<!powerstrike eachother!>])) ueot opponent !$ opponent auto=ability$!choice name(Tribute 6) all(mysource) counter(1/1,6) _ choice name(May fight another target creature) may transforms((,newability[target(creature) dynamicability<!powerstrike eachother!>])) ueot opponent !$ opponent
text=Tribute 6 (As this creature enters the battlefield, an opponent of your choice may put six +1/+1 counters on it.) -- When Nessian Wilds Ravager enters the battlefield, if tribute wasnt paid, you may have Nessian Wilds Ravager fight another target creature. (Each deals damage equal to its power to the other.) text=Tribute 6 (As this creature enters the battlefield, an opponent of your choice may put six +1/+1 counters on it.) -- When Nessian Wilds Ravager enters the battlefield, if tribute wasnt paid, you may have Nessian Wilds Ravager fight another target creature. (Each deals damage equal to its power to the other.)
mana={4}{G}{G} mana={4}{G}{G}
type=Creature type=Creature
@@ -33689,7 +33757,7 @@ toughness=4
[card] [card]
name=Ogre Marauder name=Ogre Marauder
text=Whenever Ogre Marauder attacks, it gains "Ogre Marauder can't be blocked" until end of turn unless defending player sacrifices a creature. text=Whenever Ogre Marauder attacks, it gains "Ogre Marauder can't be blocked" until end of turn unless defending player sacrifices a creature.
auto=@combat(attacking) source(this):ability$!name(choose one) if type(creature|mybattlefield)~morethan~0 then choice sacrifice notatarget(creature|mybattlefield) _ choice all(mystored) unblockable ueot!$ opponent auto=@combat(attacking) source(this):ability$!name(choose one) if type(creature|mybattlefield)~morethan~0 then choice sacrifice notatarget(creature|mybattlefield) _ choice all(mysource) unblockable ueot!$ opponent
mana={1}{B}{B} mana={1}{B}{B}
type=Creature type=Creature
subtype=Ogre Warrior subtype=Ogre Warrior
@@ -41468,6 +41536,17 @@ power=3
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Saw It Coming
abilities=foretell
target=*|stack
auto=fizzle
autohand={2}:name(Pay 2 and exile face-down) name(Pay 2 and exile face-down) foretell myturnonly
autoexile={1}{U} restriction{compare(canforetellcast)~morethan~0,type(*|stack)~morethan~0}:name(Cast with foretell) name(Cast with foretell) activate castcard(alternative)
text=Counter target spell. -- Foretell {1}{U} (During your turn, you may pay {2} and exile this card from your hand face down. Cast it on a later turn for its foretell cost.)
mana={1}{U}{U}
type=Instant
[/card]
[card]
name=Sawtusk Demolisher name=Sawtusk Demolisher
abilities=trample,mutate abilities=trample,mutate
otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 otherrestriction=type(creature[-human]|mybattlefield)~morethan~0
@@ -41999,7 +42078,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Sea Gate, Reborn name=Sea Gate, Reborn
auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
auto={T}:add{U} auto={T}:add{U}
text=As Sea Gate, Reborn enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {U}. text=As Sea Gate, Reborn enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {U}.
type=Land type=Land
@@ -43085,7 +43164,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Shatterskull, the Hammer Pass name=Shatterskull, the Hammer Pass
auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
auto={T}:add{R} auto={T}:add{R}
text=As Shatterskull, the Hammer Pass enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {R}. text=As Shatterskull, the Hammer Pass enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {R}.
type=Land type=Land
@@ -43532,7 +43611,7 @@ type=Instant
[/card] [/card]
[card] [card]
name=Shrouded Serpent name=Shrouded Serpent
auto=@combat(attacking) source(this):ability$!name(pay 4 mana) pay[[{4}]] donothing?unblockable all(mystored) ueot!$ opponent auto=@combat(attacking) source(this):ability$!name(pay 4 mana) pay[[{4}]] donothing?unblockable all(mysource) ueot!$ opponent
text=Whenever Shrouded Serpent attacks, defending player may pay {4}. If he or she doesn't, Shrouded Serpent is unblockable this turn. text=Whenever Shrouded Serpent attacks, defending player may pay {4}. If he or she doesn't, Shrouded Serpent is unblockable this turn.
mana={4}{U}{U}{U} mana={4}{U}{U}{U}
type=Creature type=Creature
@@ -48491,6 +48570,17 @@ type=Artifact
subtype=Equipment subtype=Equipment
[/card] [/card]
[card] [card]
name=Sword of the Realms
auto={1}{W}:equip
auto=teach(creature) 2/0
auto=teach(creature) vigilance
auto=teach(creature) handdeath
text=Equipped creature gets +2/+0 and has vigilance. -- Whenever equipped creature dies, return it to its owners hand. -- Equip {1}{W}
mana={1}{W}
type=Legendary Artifact
subttype=Equipment
[/card]
[card]
name=Sword of Truth and Justice name=Sword of Truth and Justice
auto={2}:equip auto={2}:equip
auto=teach(creature) protection from white auto=teach(creature) protection from white
@@ -52212,7 +52302,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Turntimber, Serpentine Wood name=Turntimber, Serpentine Wood
auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 3 life) life:-3 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
auto={T}:add{G} auto={T}:add{G}
text=As Turntimber, Serpentine Wood enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {G}. text=As Turntimber, Serpentine Wood enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. -- {T}: Add {G}.
type=Land type=Land
+30 -27
View File
@@ -12010,7 +12010,7 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Blood Crypt name=Blood Crypt
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {B} or {R} to your mana pool.) -- As Blood Crypt enters the battlefield, you may pay 2 life. If you don't, Blood Crypt enters the battlefield tapped. text=({T}: Add {B} or {R} to your mana pool.) -- As Blood Crypt enters the battlefield, you may pay 2 life. If you don't, Blood Crypt enters the battlefield tapped.
type=Land type=Land
subtype=Swamp Mountain subtype=Swamp Mountain
@@ -14762,7 +14762,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Breeding Pool name=Breeding Pool
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {G} or {U} to your mana pool.) -- As Breeding Pool enters the battlefield, you may pay 2 life. If you don't, Breeding Pool enters the battlefield tapped. text=({T}: Add {G} or {U} to your mana pool.) -- As Breeding Pool enters the battlefield, you may pay 2 life. If you don't, Breeding Pool enters the battlefield tapped.
type=Land type=Land
subtype=Forest Island subtype=Forest Island
@@ -15510,7 +15510,10 @@ type=Sorcery
[card] [card]
name=Budoka Gardener name=Budoka Gardener
doublefaced=kamiflip doublefaced=kamiflip
auto={T}:all(this) transforms((,newability[if type(land|mybattlefield)~morethan~9 then flip(Dokai, Weaver of Life)],newability[may moveto(mybattlefield) notatarget(land|myhand)],newability[@movedto(land|mybattlefield) restriction{type:land:mybattlefield~morethan~9}:flip(Dokai, Weaver of Life)])) auto={T}:name(Put land in play) name(Put land in play) target(land|myhand) moveto(mybattlefield) && if type(land|mybattlefield)~morethan~9 then all(this) flip(Dokai, Weaver of Life) else all(this) counter(0/0.1.BudokaFlp)
auto={T}:name(Don't put land in play) name(Don't put land in play) if type(land|mybattlefield)~lessthan~10 then counter(0/0.1.BudokaFlp) else flip(Dokai, Weaver of Life) && counter(0/0.-1.BudokaFlp)
auto=@movedto(land|mybattlefield) restriction{compare(type:land:mybattlefield)~morethan~9}:this(counter{0/0.1.BudokaFlp}>0) flip(Dokai, Weaver of Life) && counter(0/0.-1.BudokaFlp)
auto=@each endofturn:this(counter{0/0.1.BudokaFlp}>0) counter(0/0.-1.BudokaFlp)
text={T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener. text={T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener.
mana={1}{G} mana={1}{G}
type=Creature type=Creature
@@ -20101,7 +20104,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Civilized Scholar name=Civilized Scholar
auto={T}:draw:1 && ability$! reject notatarget(*|myhand) and!( if cantargetcard(creature|*) then all(mystored) flip(Homicidal Brute) && all(mystored) untap )! !$ controller auto={T}:draw:1 && ability$! reject notatarget(*|myhand) and!( if cantargetcard(creature|*) then all(mysource) flip(Homicidal Brute) && all(mysource) untap )! !$ controller
text={T}: Draw a card, then discard a card. If a creature card is discarded this way, untap Civilized Scholar, then transform it. text={T}: Draw a card, then discard a card. If a creature card is discarded this way, untap Civilized Scholar, then transform it.
mana={2}{U} mana={2}{U}
type=Creature type=Creature
@@ -25075,7 +25078,7 @@ toughness=5
[card] [card]
name=Custody Battle name=Custody Battle
target=creature target=creature
auto=teach(creature) transforms((,newability[@each my upkeep:ability$!name(sacrifice or exchange) if type(land|mybattlefield)~morethan~0 then choice sacrifice notatarget(land|mybattlefield) _ choice name(exchange controller) moveto(opponentbattlefield) all(mystored)!$ controller])) auto=teach(creature) transforms((,newability[@each my upkeep:ability$!name(sacrifice or exchange) if type(land|mybattlefield)~morethan~0 then choice sacrifice notatarget(land|mybattlefield) _ choice name(exchange controller) moveto(opponentbattlefield) all(mysource)!$ controller]))
text=Enchant creature -- Enchanted creature has "At the beginning of your upkeep, target opponent gains control of this creature unless you sacrifice a land." text=Enchant creature -- Enchanted creature has "At the beginning of your upkeep, target opponent gains control of this creature unless you sacrifice a land."
mana={1}{R} mana={1}{R}
type=Enchantment type=Enchantment
@@ -38814,7 +38817,7 @@ toughness=2
[card] [card]
name=Fanatic of Xenagos name=Fanatic of Xenagos
abilities=trample abilities=trample
auto=ability$!choice name(Tribute 1) all(mystored) counter(1/1) _ choice name(+1/+1 and Haste) all(mystored) haste ueot && all(mystored) 1/1 ueot!$ opponent auto=ability$!choice name(Tribute 1) all(mysource) counter(1/1) _ choice name(+1/+1 and Haste) all(mysource) haste ueot && all(mysource) 1/1 ueot!$ opponent
text=Trample -- Tribute 1 (As this creature enters the battlefield, an opponent of your choice may place a +1/+1 counter on it.) -- When Fanatic of Xenagos enters the battlefield, if tribute wasn't paid, it gets +1/+1 and gains haste until end of turn. text=Trample -- Tribute 1 (As this creature enters the battlefield, an opponent of your choice may place a +1/+1 counter on it.) -- When Fanatic of Xenagos enters the battlefield, if tribute wasn't paid, it gets +1/+1 and gains haste until end of turn.
mana={1}{R}{G} mana={1}{R}{G}
type=Creature type=Creature
@@ -38968,7 +38971,7 @@ toughness=3
[card] [card]
name=Farrel's Mantle name=Farrel's Mantle
target=creature target=creature
auto=@combat(notblocked) source(mytgt):all(mystored) fog && target(creature) damage:storedpower && damage:2 auto=@combat(notblocked) source(mytgt):all(mysource) fog && target(creature) damage:storedpower && damage:2
text=Enchant creature -- Whenever enchanted creature attacks and isn't blocked, its controller may have it deal damage equal to its power plus 2 to target creature. If that player does, the attacking creature assigns no combat damage this turn. text=Enchant creature -- Whenever enchanted creature attacks and isn't blocked, its controller may have it deal damage equal to its power plus 2 to target creature. If that player does, the attacking creature assigns no combat damage this turn.
mana={2}{W} mana={2}{W}
type=Enchantment type=Enchantment
@@ -48476,7 +48479,7 @@ toughness=5
[/card] [/card]
[card] [card]
name=Godless Shrine name=Godless Shrine
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {W} or {B} to your mana pool.) -- As Godless Shrine enters the battlefield, you may pay 2 life. If you don't, Godless Shrine enters the battlefield tapped. text=({T}: Add {W} or {B} to your mana pool.) -- As Godless Shrine enters the battlefield, you may pay 2 life. If you don't, Godless Shrine enters the battlefield tapped.
type=Land type=Land
subtype=Plains Swamp subtype=Plains Swamp
@@ -51808,7 +51811,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Hallowed Fountain name=Hallowed Fountain
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {W} or {U} to your mana pool.) -- As Hallowed Fountain enters the battlefield, you may pay 2 life. If you don't, Hallowed Fountain enters the battlefield tapped. text=({T}: Add {W} or {U} to your mana pool.) -- As Hallowed Fountain enters the battlefield, you may pay 2 life. If you don't, Hallowed Fountain enters the battlefield tapped.
type=Land type=Land
subtype=Plains Island subtype=Plains Island
@@ -65576,7 +65579,7 @@ toughness=1
name=Lathnu Hellion name=Lathnu Hellion
abilities=haste abilities=haste
auto=alterenergy:2 controller auto=alterenergy:2 controller
auto=@each my end:name(pay for effect) ability$!if compare(penergy)~morethan~1 then choice alterenergy:-2 controller _ choice sacrifice all(mystored)!$ controller auto=@each my end:name(pay for effect) ability$!if compare(penergy)~morethan~1 then choice alterenergy:-2 controller _ choice sacrifice all(mysource)!$ controller
text=Haste -- When Lathnu Hellion enters the battlefield, you get {E}{E} (two energy counters). -- At the beginning of your end step, sacrifice Lathnu Hellion unless you pay {E}{E}. text=Haste -- When Lathnu Hellion enters the battlefield, you get {E}{E} (two energy counters). -- At the beginning of your end step, sacrifice Lathnu Hellion unless you pay {E}{E}.
mana={2}{R} mana={2}{R}
type=Creature type=Creature
@@ -68719,7 +68722,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Lumengrid Augur name=Lumengrid Augur
auto={1}{t}:target(player) draw:1 && ability$! reject notatarget(*|myhand) and!( if cantargetcard(artifact|*) then untap all(mystored) )! !$ targetedplayer auto={1}{t}:target(player) draw:1 && ability$! reject notatarget(*|myhand) and!( if cantargetcard(artifact|*) then untap all(mysource) )! !$ targetedplayer
text={1}, {T}: Target player draws a card, then discards a card. If that player discards an artifact card this way, untap Lumengrid Augur. text={1}, {T}: Target player draws a card, then discards a card. If that player discards an artifact card this way, untap Lumengrid Augur.
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -76367,7 +76370,7 @@ subtype=Equipment
[/card] [/card]
[card] [card]
name=Mortician Beetle name=Mortician Beetle
auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mystored)!$ controller auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mysource)!$ controller
text=Whenever a player sacrifices a creature, you may put a +1/+1 counter on Mortician Beetle. text=Whenever a player sacrifices a creature, you may put a +1/+1 counter on Mortician Beetle.
mana={B} mana={B}
type=Creature type=Creature
@@ -83041,7 +83044,7 @@ type=Instant
[card] [card]
name=Ornitharch name=Ornitharch
abilities=flying abilities=flying
auto=ability$!choice name(Tribute 2) all(mystored) counter(1/1,2) _ choice name(Two 1/1 birds) token(Bird,Creature Bird,1/1,flying,white)*2 opponent !$ opponent auto=ability$!choice name(Tribute 2) all(mysource) counter(1/1,2) _ choice name(Two 1/1 birds) token(Bird,Creature Bird,1/1,flying,white)*2 opponent !$ opponent
text=Tribute 2 (As this creature enters the battlefield, an opponent of your choice may place two +1/+1 counters on it.) -- When Ornitharch enters the battlefield, if tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield. text=Tribute 2 (As this creature enters the battlefield, an opponent of your choice may place two +1/+1 counters on it.) -- When Ornitharch enters the battlefield, if tribute wasn't paid, put two 1/1 white Bird creature tokens with flying onto the battlefield.
mana={3}{W}{W} mana={3}{W}{W}
type=Creature type=Creature
@@ -83380,7 +83383,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Overgrown Tomb name=Overgrown Tomb
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {B} or {G} to your mana pool.) -- As Overgrown Tomb enters the battlefield, you may pay 2 life. If you don't, Overgrown Tomb enters the battlefield tapped. text=({T}: Add {B} or {G} to your mana pool.) -- As Overgrown Tomb enters the battlefield, you may pay 2 life. If you don't, Overgrown Tomb enters the battlefield tapped.
type=Land type=Land
subtype=Swamp Forest subtype=Swamp Forest
@@ -86541,7 +86544,7 @@ toughness=3
name=Pillar Tombs of Aku name=Pillar Tombs of Aku
auto=@movedTo(other enchantment[world]|battlefield):sacrifice all(this) auto=@movedTo(other enchantment[world]|battlefield):sacrifice all(this)
auto=@each my upkeep restriction{type(creature|mybattlefield)~lessthan~2}:sacrifice && life:-5 controller auto=@each my upkeep restriction{type(creature|mybattlefield)~lessthan~2}:sacrifice && life:-5 controller
auto=@each opponent upkeep restriction{type(creature|opponentbattlefield)~morethan~0}:ability$!choice name(sacrifice creature) notatarget(creature|mybattlefield) sacrifice _ choice name(life loss and sacrifice Tombs) sacrifice all(mystored) && life:-5!$ opponent auto=@each opponent upkeep restriction{type(creature|opponentbattlefield)~morethan~0}:ability$!choice name(sacrifice creature) notatarget(creature|mybattlefield) sacrifice _ choice name(life loss and sacrifice Tombs) sacrifice all(mysource) && life:-5!$ opponent
auto=@each opponent upkeep restriction{type(creature|opponentbattlefield)~lessthan~1}:sacrifice && life:-5 opponent auto=@each opponent upkeep restriction{type(creature|opponentbattlefield)~lessthan~1}:sacrifice && life:-5 opponent
text=At the beginning of each player's upkeep, that player may sacrifice a creature. If that player doesn't, he or she loses 5 life and you sacrifice Pillar Tombs of Aku. text=At the beginning of each player's upkeep, that player may sacrifice a creature. If that player doesn't, he or she loses 5 life and you sacrifice Pillar Tombs of Aku.
mana={2}{B}{B} mana={2}{B}{B}
@@ -89705,7 +89708,7 @@ subtype=Aura
[/card] [/card]
[card] [card]
name=Pursuit of Knowledge name=Pursuit of Knowledge
auto=replacedraw ability$!name(study counter or draw) choice counter(0/0.1.Study) all(mystored) _ choice draw:1 noreplace!$ controller auto=replacedraw ability$!name(study counter or draw) choice counter(0/0.1.Study) all(mysource) _ choice draw:1 noreplace!$ controller
auto={C(0/0,-3,Study)}{S}:draw:7 controller auto={C(0/0,-3,Study)}{S}:draw:7 controller
text=If you would draw a card, you may put a study counter on Pursuit of Knowledge instead. -- Remove three study counters from Pursuit of Knowledge, Sacrifice Pursuit of Knowledge: Draw seven cards. text=If you would draw a card, you may put a study counter on Pursuit of Knowledge instead. -- Remove three study counters from Pursuit of Knowledge, Sacrifice Pursuit of Knowledge: Draw seven cards.
mana={3}{W} mana={3}{W}
@@ -97766,7 +97769,7 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Sacred Foundry name=Sacred Foundry
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {R} or {W} to your mana pool.) -- As Sacred Foundry enters the battlefield, you may pay 2 life. If you don't, Sacred Foundry enters the battlefield tapped. text=({T}: Add {R} or {W} to your mana pool.) -- As Sacred Foundry enters the battlefield, you may pay 2 life. If you don't, Sacred Foundry enters the battlefield tapped.
type=Land type=Land
subtype=Mountain Plains subtype=Mountain Plains
@@ -104631,7 +104634,7 @@ subtype=Equipment
[/card] [/card]
[card] [card]
name=Shyft name=Shyft
auto=@each my upkeep:may name(choose color/s) ability$!name(choose color/s) choice name(white) all(mystored) becomes(,white) forever _ choice name(blue) all(mystored) becomes(,blue) forever _ choice name(black) all(mystored) becomes(,black) forever _ choice name(red) all(mystored) becomes(,red) forever _ choice name(green) all(mystored) becomes(,green) forever _ choice name(white & blue) all(mystored) becomes(,white,blue) forever _ choice name(blue & black) all(mystored) becomes(,black,blue) forever _ choice name(black & red) all(mystored) becomes(,black,red) forever _ choice name(red & green) all(mystored) becomes(,red,green) forever _ choice name(green & white) all(mystored) becomes(,white,green) forever _ choice name(white & black) all(mystored) becomes(,white,black) forever _ choice name(blue & red) all(mystored) becomes(,red,blue) forever _ choice name(black & green) all(mystored) becomes(,black,green) forever _ choice name(red & white) all(mystored) becomes(,white,red) forever _ choice name(green & blue) all(mystored) becomes(,green,blue) forever _ choice name(green & white & blue) all(mystored) becomes(,green,white,blue) forever _ choice name(white & blue & black) all(mystored) becomes(,black,white,blue) forever _ choice name(blue & black & red) all(mystored) becomes(,black,red,blue) forever _ choice name(black & red & green) all(mystored) becomes(,green,black,red) forever _ choice name(red & green & white) all(mystored) becomes(,green,white,red) forever _ choice name(white & black & green) all(mystored) becomes(,green,white,black) forever _ choice name(blue & red & white) all(mystored) becomes(,red,white,blue) forever _ choice name(black & green & blue) all(mystored) becomes(,green,black,blue) forever _ choice name(red & white & black) all(mystored) becomes(,black,white,red) forever _ choice name(green & blue & red) all(mystored) becomes(,green,red,blue) forever _ choice name(green & red & blue & black) all(mystored) becomes(,green,red,blue,black) forever _ choice name(green & red & blue & white) all(mystored) becomes(,green,red,blue,white) forever _ choice name(white & blue & black & red) all(mystored) becomes(,white,red,blue,black) forever _ choice name(white & blue & black & green) all(mystored) becomes(,white,green,blue,black) forever _ choice name(all colors) all(mystored) becomes(,white,red,blue,black,green) forever!$ controller auto=@each my upkeep:may name(choose color/s) ability$!name(choose color/s) choice name(white) all(mysource) becomes(,white) forever _ choice name(blue) all(mysource) becomes(,blue) forever _ choice name(black) all(mysource) becomes(,black) forever _ choice name(red) all(mysource) becomes(,red) forever _ choice name(green) all(mysource) becomes(,green) forever _ choice name(white & blue) all(mysource) becomes(,white,blue) forever _ choice name(blue & black) all(mysource) becomes(,black,blue) forever _ choice name(black & red) all(mysource) becomes(,black,red) forever _ choice name(red & green) all(mysource) becomes(,red,green) forever _ choice name(green & white) all(mysource) becomes(,white,green) forever _ choice name(white & black) all(mysource) becomes(,white,black) forever _ choice name(blue & red) all(mysource) becomes(,red,blue) forever _ choice name(black & green) all(mysource) becomes(,black,green) forever _ choice name(red & white) all(mysource) becomes(,white,red) forever _ choice name(green & blue) all(mysource) becomes(,green,blue) forever _ choice name(green & white & blue) all(mysource) becomes(,green,white,blue) forever _ choice name(white & blue & black) all(mysource) becomes(,black,white,blue) forever _ choice name(blue & black & red) all(mysource) becomes(,black,red,blue) forever _ choice name(black & red & green) all(mysource) becomes(,green,black,red) forever _ choice name(red & green & white) all(mysource) becomes(,green,white,red) forever _ choice name(white & black & green) all(mysource) becomes(,green,white,black) forever _ choice name(blue & red & white) all(mysource) becomes(,red,white,blue) forever _ choice name(black & green & blue) all(mysource) becomes(,green,black,blue) forever _ choice name(red & white & black) all(mysource) becomes(,black,white,red) forever _ choice name(green & blue & red) all(mysource) becomes(,green,red,blue) forever _ choice name(green & red & blue & black) all(mysource) becomes(,green,red,blue,black) forever _ choice name(green & red & blue & white) all(mysource) becomes(,green,red,blue,white) forever _ choice name(white & blue & black & red) all(mysource) becomes(,white,red,blue,black) forever _ choice name(white & blue & black & green) all(mysource) becomes(,white,green,blue,black) forever _ choice name(all colors) all(mysource) becomes(,white,red,blue,black,green) forever!$ controller
text=At the beginning of your upkeep, you may have Shyft become the color or colors of your choice. (This effect lasts indefinitely.) text=At the beginning of your upkeep, you may have Shyft become the color or colors of your choice. (This effect lasts indefinitely.)
mana={4}{U} mana={4}{U}
type=Creature type=Creature
@@ -108287,7 +108290,7 @@ subtype=Aura
[/card] [/card]
[card] [card]
name=Snake of the Golden Grove name=Snake of the Golden Grove
auto=ability$!choice name(Tribute 3) all(mystored) counter(1/1,3) _ choice name(4 life opponent) life:4 opponent !$ opponent auto=ability$!choice name(Tribute 3) all(mysource) counter(1/1,3) _ choice name(4 life opponent) life:4 opponent !$ opponent
text=Tribute 3 (As this creature enters the battlefield, an opponent of your choice may place three +1/+1 counters on it.) -- When Snake of the Golden Grove enters the battlefield, if tribute wasn't paid, you gain 4 life. text=Tribute 3 (As this creature enters the battlefield, an opponent of your choice may place three +1/+1 counters on it.) -- When Snake of the Golden Grove enters the battlefield, if tribute wasn't paid, you gain 4 life.
mana={4}{G} mana={4}{G}
type=Creature type=Creature
@@ -108817,7 +108820,7 @@ type=Instant
[/card] [/card]
[card] [card]
name=Solitary Confinement name=Solitary Confinement
auto=@each my upkeep :name(discard or sacrifice) ability$!if type(*|myhand)~morethan~0 then choice reject notatarget(*|myhand) _ choice sacrifice all(mystored)!$ controller auto=@each my upkeep :name(discard or sacrifice) ability$!if type(*|myhand)~morethan~0 then choice reject notatarget(*|myhand) _ choice sacrifice all(mysource)!$ controller
auto=phasealter(remove,draw,controller) auto=phasealter(remove,draw,controller)
abilities=playershroud abilities=playershroud
auto=preventalldamage to(controller) auto=preventalldamage to(controller)
@@ -112862,7 +112865,7 @@ toughness=5
[/card] [/card]
[card] [card]
name=Steam Vents name=Steam Vents
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {U} or {R} to your mana pool.) -- As Steam Vents enters the battlefield, you may pay 2 life. If you don't, Steam Vents enters the battlefield tapped. text=({T}: Add {U} or {R} to your mana pool.) -- As Steam Vents enters the battlefield, you may pay 2 life. If you don't, Steam Vents enters the battlefield tapped.
type=Land type=Land
subtype=Island Mountain subtype=Island Mountain
@@ -113427,7 +113430,7 @@ toughness=3
[/card] [/card]
[card] [card]
name=Stomping Ground name=Stomping Ground
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {R} or {G} to your mana pool.) -- As Stomping Ground enters the battlefield, you may pay 2 life. If you don't, Stomping Ground enters the battlefield tapped. text=({T}: Add {R} or {G} to your mana pool.) -- As Stomping Ground enters the battlefield, you may pay 2 life. If you don't, Stomping Ground enters the battlefield tapped.
type=Land type=Land
subtype=Mountain Forest subtype=Mountain Forest
@@ -118450,7 +118453,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Temple Garden name=Temple Garden
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {G} or {W} to your mana pool.) -- As Temple Garden enters the battlefield, you may pay 2 life. If you don't, Temple Garden enters the battlefield tapped. text=({T}: Add {G} or {W} to your mana pool.) -- As Temple Garden enters the battlefield, you may pay 2 life. If you don't, Temple Garden enters the battlefield tapped.
type=Land type=Land
subtype=Forest Plains subtype=Forest Plains
@@ -120598,7 +120601,7 @@ toughness=3
name=Thraximundar name=Thraximundar
abilities=haste abilities=haste
auto=@combat(attacking) source(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent auto=@combat(attacking) source(this):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent
auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mystored)!$ controller auto=@sacrificed(creature):name(counter +1/+1) ability$!may counter(1/1,1) all(mysource)!$ controller
text=Haste -- Whenever Thraximundar attacks, defending player sacrifices a creature. -- Whenever a player sacrifices a creature, you may put a +1/+1 counter on Thraximundar. text=Haste -- Whenever Thraximundar attacks, defending player sacrifices a creature. -- Whenever a player sacrifices a creature, you may put a +1/+1 counter on Thraximundar.
mana={4}{U}{B}{R} mana={4}{U}{B}{R}
type=Legendary Creature type=Legendary Creature
@@ -120869,7 +120872,7 @@ type=Artifact
[card] [card]
name=Thunder Brute name=Thunder Brute
abilities=trample abilities=trample
auto=ability$!choice name(Tribute 3) all(mystored) counter(1/1,3) _ choice name(Haste) all(mystored) haste ueot!$ opponent auto=ability$!choice name(Tribute 3) all(mysource) counter(1/1,3) _ choice name(Haste) all(mysource) haste ueot!$ opponent
text=Trample -- Tribute 3 (As this creature enters the battlefield, an opponent of your choice may place three +1/+1 counters on it.) -- When Thunder Brute enters the battlefield, if tribute wasn't paid, it gains haste until end of turn. text=Trample -- Tribute 3 (As this creature enters the battlefield, an opponent of your choice may place three +1/+1 counters on it.) -- When Thunder Brute enters the battlefield, if tribute wasn't paid, it gains haste until end of turn.
mana={4}{R}{R} mana={4}{R}{R}
type=Creature type=Creature
@@ -131305,7 +131308,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Wand of Denial name=Wand of Denial
auto={t}:target(player) reveal:1 optionone name(Get Creature) target(<upto:1>*|reveal) transforms((,newability[pay[[{L:2}]] name(Pay Life) moveto(ownergraveyard) ])) forever optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend auto={t}:target(player) reveal:1 optionone name(Look top card) target(<upto:1>*|reveal) transforms((,newability[pay[[{L:2}]] name(Pay Life) moveto(ownergraveyard) ])) forever optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend
text={T}: Look at the top card of target player's library. If it's a nonland card, you may pay 2 life. If you do, put it into that player's graveyard. text={T}: Look at the top card of target player's library. If it's a nonland card, you may pay 2 life. If you do, put it into that player's graveyard.
mana={2} mana={2}
type=Artifact type=Artifact
@@ -132241,7 +132244,7 @@ type=Instant
[/card] [/card]
[card] [card]
name=Watery Grave name=Watery Grave
auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mystored)!$ controller auto=ability$!name(Choose one) choice name(Pay 2 life) life:-2 _ choice name(Tap) tap(noevent) all(mysource)!$ controller
text=({T}: Add {U} or {B} to your mana pool.) -- As Watery Grave enters the battlefield, you may pay 2 life. If you don't, Watery Grave enters the battlefield tapped. text=({T}: Add {U} or {B} to your mana pool.) -- As Watery Grave enters the battlefield, you may pay 2 life. If you don't, Watery Grave enters the battlefield tapped.
type=Land type=Land
subtype=Island Swamp subtype=Island Swamp
+34 -33
View File
@@ -651,44 +651,35 @@ private:
} }
else if (s == "abundantlife")//current life is morethan or equal to starting life else if (s == "abundantlife")//current life is morethan or equal to starting life
{ {
intValue = 0; intValue = (target->controller()->life >= target->controller()->initLife)?1:0;
if (target->controller()->life >= target->controller()->initLife)
intValue = 1;
} }
else if (s == "plibrarycount") else if (s == "plibrarycount")
{ {
intValue = 0; intValue = (target->controller()->game->library->nb_cards)?target->controller()->game->library->nb_cards:0;
if (target->controller()->game->library->nb_cards)
intValue = target->controller()->game->library->nb_cards;
} }
else if (s == "olibrarycount") else if (s == "olibrarycount")
{ {
intValue = 0; intValue = (target->controller()->opponent()->game->library->nb_cards)?target->controller()->opponent()->game->library->nb_cards:0;
if (target->controller()->opponent()->game->library->nb_cards)
intValue = target->controller()->opponent()->game->library->nb_cards;
} }
else if (s == "highestlifetotal") else if (s == "highestlifetotal")
{ {
intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->opponent()->life:target->controller()->life; intValue = target->controller()->life <= target->controller()->opponent()->life?target->controller()->opponent()->life:target->controller()->life;
} }
else if (s == "lowestlifetotal") else if (s == "lowestlifetotal")
{ {
intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->life:target->controller()->opponent()->life; intValue = target->controller()->life <= target->controller()->opponent()->life?target->controller()->life:target->controller()->opponent()->life;
} }
else if (s == "thatmuch") else if (s == "thatmuch")
{ {
//the value that much is a variable to be used with triggered abilities. //the value that much is a variable to be used with triggered abilities.
//ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value //ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value
//that the triggered event stored in the card for "that much". //that the triggered event stored in the card for "that much".
intValue = 0;
intValue = target->thatmuch; intValue = target->thatmuch;
int checkagain = 0; int checkagain = 0;
if(target->hasSubtype(Subtypes::TYPE_AURA) || target->hasSubtype(Subtypes::TYPE_EQUIPMENT)) if(target->hasSubtype(Subtypes::TYPE_AURA) || target->hasSubtype(Subtypes::TYPE_EQUIPMENT)){
{ if(target->target){
if(target->target) checkagain = target->target->thatmuch;
{ }
checkagain = target->target->thatmuch;
}
} }
if(checkagain > intValue) if(checkagain > intValue)
intValue = checkagain; intValue = checkagain;
@@ -727,16 +718,20 @@ private:
{ {
intValue = (s == "pdrewcount")?target->controller()->drawCounter:target->controller()->opponent()->drawCounter; intValue = (s == "pdrewcount")?target->controller()->drawCounter:target->controller()->opponent()->drawCounter;
} }
else if (s == "epicactivated") else if (s == "epicactivated" || s == "currentturn")
{ {
intValue = target->controller()->epic; intValue = (s == "epicactivated")?target->controller()->epic:target->getObserver()->turn;
} }
else if (s == "snowcount") else if (s == "canforetellcast")
{//this is just to count the number of snow mana produced ... just for debugging purposes... {
intValue = target->controller()->snowManaG + target->controller()->snowManaU +target->controller()->snowManaR + target->controller()->snowManaB + target->controller()->snowManaW + target->controller()->snowManaC; intValue = (target->foretellTurn < 0)?0:(target->getObserver()->turn-target->foretellTurn); // Check if you can use the foretell cost from exile (CurrentTurn > ForetellTurn).
} }
else if (s == "mypoolcount" || s == "opponentpoolcount") else if (s == "isflipped" || s == "snowcount") // Return 1 if card has been flipped -- // Snowcount is just to count the number of snow mana produced ... just for debugging purposes...
{//manapool {
intValue = (s == "isflipped")?card->isFlipped:target->controller()->snowManaG + target->controller()->snowManaU +target->controller()->snowManaR + target->controller()->snowManaB + target->controller()->snowManaW + target->controller()->snowManaC;
}
else if (s == "mypoolcount" || s == "opponentpoolcount") // total manapool
{
intValue = (s == "mypoolcount")?target->controller()->getManaPool()->getConvertedCost():target->controller()->opponent()->getManaPool()->getConvertedCost(); intValue = (s == "mypoolcount")?target->controller()->getManaPool()->getConvertedCost():target->controller()->opponent()->getManaPool()->getConvertedCost();
} }
else if (s == "mygreenpoolcount" || s == "opponentgreenpoolcount") else if (s == "mygreenpoolcount" || s == "opponentgreenpoolcount")
@@ -1046,13 +1041,9 @@ private:
unique_cards.clear(); unique_cards.clear();
} }
} }
else if (s == "mypos") else if (s == "mypos" || s == "bushidopoints")//hand,exile,grave & library only (library zpos is inverted so the recent one is always the top) -- bushido point
{//hand,exile,grave & library only (library zpos is inverted so the recent one is always the top) {
intValue = card->zpos; intValue = (s == "mypos")?card->zpos:card->bushidoPoints;
}
else if (s == "bushidopoints")
{//bushido point
intValue = card->bushidoPoints;
} }
else if (s == "revealedp") else if (s == "revealedp")
{ {
@@ -2461,6 +2452,15 @@ public:
const string getMenuText(); const string getMenuText();
AAImprint * clone() const; AAImprint * clone() const;
}; };
//AAForetell
class AAForetell: public ActivatedAbility
{
public:
AAForetell(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL);
int resolve();
const string getMenuText();
AAForetell * clone() const;
};
//cloning...this makes a token thats a copy of the target. //cloning...this makes a token thats a copy of the target.
class AACloner: public ActivatedAbility class AACloner: public ActivatedAbility
{ {
@@ -7332,7 +7332,8 @@ public:
bool asNormalMadness; bool asNormalMadness;
bool alternative; bool alternative;
int kicked; int kicked;
AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay,bool asNormalMadness = false,bool alternative = false,int kicked = 0); bool flipped;
AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay,bool asNormalMadness = false,bool alternative = false,int kicked = 0,bool flipped = false);
int testDestroy(){return 0;}; int testDestroy(){return 0;};
void Update(float dt); void Update(float dt);
+1
View File
@@ -35,6 +35,7 @@ class CardDescriptor: public MTGCardInstance
Operator mode; Operator mode;
int powerComparisonMode; int powerComparisonMode;
int foretoldComparisonMode;
int kickedComparisonMode; int kickedComparisonMode;
int toughnessComparisonMode; int toughnessComparisonMode;
int manacostComparisonMode; int manacostComparisonMode;
+1
View File
@@ -306,6 +306,7 @@ public:
int imprintR; int imprintR;
int imprintB; int imprintB;
int imprintW; int imprintW;
int foretellTurn;
int bushidoPoints; int bushidoPoints;
int modularPoints; int modularPoints;
int canproduceMana(int color = -1); int canproduceMana(int color = -1);
+2 -1
View File
@@ -298,7 +298,8 @@ class Constants
GAINEDEXILEDEATH = 171, GAINEDEXILEDEATH = 171,
GAINEDHANDDEATH = 172, GAINEDHANDDEATH = 172,
CYCLING = 173, CYCLING = 173,
NB_BASIC_ABILITIES = 174, FORETELL = 174,
NB_BASIC_ABILITIES = 175,
RARITY_S = 'S', //Special Rarity RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics RARITY_M = 'M', //Mythics
+43 -5
View File
@@ -2025,6 +2025,44 @@ AAImprint * AAImprint::clone() const
return NEW AAImprint(*this); return NEW AAImprint(*this);
} }
//AAForetell
AAForetell::AAForetell(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, ManaCost * _cost) :
ActivatedAbility(observer, _id, _source, _cost, 0)
{
target = _target;
}
int AAForetell::resolve()
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if (_target)
{
if(_target->mutation && _target->parentCards.size() > 0) return 0; // Mutated down cards cannot be foretell, they will follow the fate of top-card
Player * p = _target->controller();
if(p){
MTGCardInstance * tmp = p->game->putInExile(_target);
if(tmp)
tmp->foretellTurn = source->getObserver()->turn;
}
while(_target->next)
_target = _target->next;
return 1;
}
return 0;
}
const string AAForetell::getMenuText()
{
return "Foretell";
}
AAForetell * AAForetell::clone() const
{
return NEW AAForetell(*this);
}
//Counters //Counters
AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string counterstring, const char * _name, int power, int toughness, AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string counterstring, const char * _name, int power, int toughness,
int nb,int maxNb, ManaCost * cost) : int nb,int maxNb, ManaCost * cost) :
@@ -4076,7 +4114,7 @@ int AAFlip::resolve()
while (_target->next) while (_target->next)
_target = _target->next; _target = _target->next;
if(forcetype != "" && _target) // Added to flip Zendikar Rising Modal Double Faced cards. if(forcetype != "" && _target) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising).
{ {
for (int i = ((int)_target->types.size())-1; i >= 0; --i) for (int i = ((int)_target->types.size())-1; i >= 0; --i)
_target->removeType(_target->types[i]); _target->removeType(_target->types[i]);
@@ -4224,7 +4262,7 @@ int AAFlip::resolve()
else else
_target->isFacedown = true; _target->isFacedown = true;
if(forcetype != "" && _target) // Added to flip Zendikar Rising Modal Double Faced cards. if(forcetype != "" && _target && _target->isPermanent()) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising).
{ {
_target->castMethod = Constants::CAST_NORMALLY; _target->castMethod = Constants::CAST_NORMALLY;
_target->controller()->game->battlefield->addCard(_target); _target->controller()->game->battlefield->addCard(_target);
@@ -8849,8 +8887,8 @@ AEquip * AEquip::clone() const
} }
// casting a card for free, or casting a copy of a card. // casting a card for free, or casting a copy of a card.
AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay,bool madness, bool alternative, int kicked) : AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay,bool madness, bool alternative, int kicked, bool flipped) :
MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay), asNormalMadness(madness), alternative(alternative), kicked(kicked) MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay), asNormalMadness(madness), alternative(alternative), kicked(kicked), flipped(flipped)
{ {
target = _target; target = _target;
andAbility = NULL; andAbility = NULL;
@@ -9148,7 +9186,7 @@ int AACastCard::resolveSpell()
spell = NEW Spell(game, 0,copy,NULL,NULL, 1); spell = NEW Spell(game, 0,copy,NULL,NULL, 1);
spell->resolve(); spell->resolve();
} }
else else if(!flipped)
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, NULL, 1, 0); spell = game->mLayers->stackLayer()->addSpell(copy, NULL, NULL, 1, 0);
} }
+5
View File
@@ -13,6 +13,7 @@ CardDescriptor::CardDescriptor()
counterToughness = 0; counterToughness = 0;
counterNB = 0; counterNB = 0;
mode = CD_AND; mode = CD_AND;
foretoldComparisonMode = COMPARISON_NONE;
kickedComparisonMode = COMPARISON_NONE; kickedComparisonMode = COMPARISON_NONE;
powerComparisonMode = COMPARISON_NONE; powerComparisonMode = COMPARISON_NONE;
toughnessComparisonMode = COMPARISON_NONE; toughnessComparisonMode = COMPARISON_NONE;
@@ -159,6 +160,8 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card)
} }
// Quantified restrictions are always AND-ed: // Quantified restrictions are always AND-ed:
if (foretoldComparisonMode && !valueInRange(foretoldComparisonMode, card->foretellTurn, foretellTurn))
return NULL;
if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked)) if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked))
return NULL; return NULL;
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power))
@@ -204,6 +207,8 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card)
match = NULL; match = NULL;
} }
if (foretoldComparisonMode && !valueInRange(foretoldComparisonMode, card->foretellTurn, foretellTurn))
match = NULL;
if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked)) if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked))
match = NULL; match = NULL;
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power)) if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power))
+9 -2
View File
@@ -257,7 +257,8 @@ void CardGui::Render()
if(game) if(game)
{ {
if((card->has(Constants::CANPLAYFROMEXILE)||card->has(Constants::PAYZERO))|| if((card->has(Constants::CANPLAYFROMEXILE)||card->has(Constants::PAYZERO))||
((card->has(Constants::CANPLAYFROMGRAVEYARD) || card->has(Constants::TEMPFLASHBACK) || card->getManaCost()->getFlashback()) && game->isInGrave(card))) ((card->has(Constants::CANPLAYFROMGRAVEYARD) || card->has(Constants::TEMPFLASHBACK) || card->getManaCost()->getFlashback()) && game->isInGrave(card)) ||
(card->has(Constants::FORETELL) && card->foretellTurn > -1 && game->turn > card->foretellTurn && game->isInExile(card)))
fakeborder->SetColor(ARGB((int)(actA),7,235,7));//green border fakeborder->SetColor(ARGB((int)(actA),7,235,7));//green border
else else
fakeborder->SetColor(ARGB((int)(actA),15,15,15)); fakeborder->SetColor(ARGB((int)(actA),15,15,15));
@@ -1485,6 +1486,12 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
cd.unsecureSetTapped(1); cd.unsecureSetTapped(1);
} }
} }
//Has been foretold
else if (attribute.find("foretold") != string::npos)
{
cd.foretellTurn = comparisonCriterion;
cd.foretoldComparisonMode = comparisonMode;
}
//Has been kicked //Has been kicked
else if (attribute.find("kicked") != string::npos) else if (attribute.find("kicked") != string::npos)
{ {
@@ -1550,7 +1557,7 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
cd.unsecuresetrecent(1); cd.unsecuresetrecent(1);
} }
} }
else if (attribute.find("geared") != string::npos) else if (attribute.find("geared") != string::npos || attribute.find("equipped") != string::npos)
{ {
if (minus) if (minus)
{ {
+91 -32
View File
@@ -825,19 +825,25 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if(!found) if(!found)
return 0; return 0;
} }
check = restriction[i].find("can play land"); check = restriction[i].find("can play");
if(check != string::npos) if(check != string::npos)
{ {
bool isLand = card->hasType("Land"); if(!card->getId())
return 0; //Fixed a crash when AI plays.
string type = restriction[i];
type = type.replace(0,9,"");
MTGCardInstance* cardDummy = card->clone();
for (int i = ((int)cardDummy->types.size())-1; i >= 0; --i)
cardDummy->removeType(cardDummy->types[i]);
cardDummy->addType(type);
bool canplay = true; bool canplay = true;
if(!isLand) if (cardDummy->isLand() && observer->currentActionPlayer->game->playRestrictions->canPutIntoZone(cardDummy, observer->currentActionPlayer->game->inPlay) == PlayRestriction::CANT_PLAY)
card->addType("Land");
if (observer->currentActionPlayer->game->playRestrictions->canPutIntoZone(card, observer->currentActionPlayer->game->inPlay) == PlayRestriction::CANT_PLAY)
canplay = false; canplay = false;
if (!card->getObserver() || !card->StackIsEmptyandSorcerySpeed()) if (!cardDummy->isLand() && observer->currentActionPlayer->game->playRestrictions->canPutIntoZone(cardDummy, observer->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY)
canplay = false; canplay = false;
if(!isLand) if (!cardDummy->hasType(Subtypes::TYPE_INSTANT) && !cardDummy->StackIsEmptyandSorcerySpeed())
card->removeType("Land"); canplay = false;
SAFE_DELETE(cardDummy);
if(!canplay) if(!canplay)
return 0; return 0;
} }
@@ -1780,56 +1786,93 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
vector<string>transfound = parseBetween(s,"newability[reveal:"," ");//if we are using reveal inside a newability, let transforms remove the string instead. vector<string>transfound = parseBetween(s,"newability[reveal:"," ");//if we are using reveal inside a newability, let transforms remove the string instead.
vector<string>abilfound = parseBetween(s, "ability$!name(reveal) reveal:", " "); vector<string>abilfound = parseBetween(s, "ability$!name(reveal) reveal:", " ");
if(!abilfound.size()) if(!abilfound.size())
abilfound = parseBetween(s, "ability$!reveal:", " ");//see above. this allows us to nest reveals inside these 2 other master classes. while also allowing us to nest them inside reveals. abilfound = parseBetween(s, "ability$!reveal:", " ");//see above. this allows us to nest reveals inside these 2 other master classes. while also allowing us to nest them inside reveals.
found = s.find("pay("); found = s.find("pay(");
if (found != string::npos && storedPayString.empty() && !transPayfound.size()) if (found != string::npos && storedPayString.empty() && !transPayfound.size())
{ {
size_t pos1 = s.find("transforms(("); // Try to handle pay ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!");
vector<string> splitMayPaystr = parseBetween(s, "pay(", ")", true); vector<string> splitMayPaystr = parseBetween(s, "pay(", ")", true);
if (splitMayPaystr.size()) if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && found < pos1 && found < pos2) ||
{ (pos2 == string::npos && pos1 != string::npos && found < pos1) || (pos1 == string::npos && pos2 != string::npos && found < pos2)){
storedPayString.append(splitMayPaystr[2]); if (splitMayPaystr.size()){
s = splitMayPaystr[0]; storedPayString.append(splitMayPaystr[2]);
s.append("pay("); s = splitMayPaystr[0];
s.append(splitMayPaystr[1]); s.append("pay(");
s.append(")"); s.append(splitMayPaystr[1]);
} s.append(")");
}
} else
storedPayString.clear();
} }
vector<string> splitGrant = parseBetween(s, "grant ", " grantend", false); vector<string> splitGrant = parseBetween(s, "grant ", " grantend", false);
if (splitGrant.size() && storedAbilityString.empty()) if (splitGrant.size() && storedAbilityString.empty())
{ {
storedAbilityString = splitGrant[1]; storedAbilityString = splitGrant[1];
s = splitGrant[0]; size_t pos1 = s.find("transforms(("); // Try to handle grant ability inside ability$! or transforms keywords.
s.append("grant "); size_t pos2 = s.find("ability$!");
s.append(splitGrant[2]); size_t pos3 = s.find(splitGrant[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
s = splitGrant[0];
s.append("grant ");
s.append(splitGrant[2]);
} else
storedAbilityString.clear();
} }
vector<string> splitRevealx = parseBetween(s, "reveal:", " revealend", false); vector<string> splitRevealx = parseBetween(s, "reveal:", " revealend", false);
if (!abilfound.size() && !transfound.size() && splitRevealx.size() && storedAbilityString.empty()) if (!abilfound.size() && !transfound.size() && splitRevealx.size() && storedAbilityString.empty())
{ {
storedAbilityString = splitRevealx[1]; storedAbilityString = splitRevealx[1];
s = splitRevealx[0]; size_t pos1 = s.find("transforms(("); // Try to handle reveal ability inside ability$! or transforms keywords.
s.append("reveal: "); size_t pos2 = s.find("ability$!");
s.append(splitRevealx[2]); size_t pos3 = s.find(splitRevealx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
s = splitRevealx[0];
s.append("reveal: ");
s.append(splitRevealx[2]);
} else
storedAbilityString.clear();
} }
vector<string> splitScryx = parseBetween(s, "scry:", " scryend", false); vector<string> splitScryx = parseBetween(s, "scry:", " scryend", false);
if (splitScryx.size() && storedAbilityString.empty()) if (splitScryx.size() && storedAbilityString.empty())
{ {
storedAbilityString = splitScryx[1]; storedAbilityString = splitScryx[1];
s = splitScryx[0]; size_t pos1 = s.find("transforms(("); // Try to handle scry ability inside ability$! or transforms keywords.
s.append("scry: "); size_t pos2 = s.find("ability$!");
s.append(splitScryx[2]); size_t pos3 = s.find(splitScryx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
s = splitScryx[0];
s.append("scry: ");
s.append(splitScryx[2]);
} else
storedAbilityString.clear();
} }
found = s.find("transforms(("); found = s.find("transforms((");
if (found != string::npos && storedString.empty()) if (found != string::npos && storedString.empty())
{ {
size_t real_end = s.find("))", found); size_t pos1 = s.find("ability$!"); // Try to handle transforms ability inside ability$! keyword.
size_t stypesStartIndex = found + 12; if(pos1 == string::npos || found < pos1){
storedString.append(s.substr(stypesStartIndex, real_end - stypesStartIndex).c_str()); size_t real_end = s.find("))", found);
s.erase(stypesStartIndex, real_end - stypesStartIndex); size_t stypesStartIndex = found + 12;
for(unsigned int i = stypesStartIndex; i < s.size(); i++){
size_t pos2 = s.find("transforms((", i); // Try to handle transforms ability inside transforms keyword.
if(pos2 != string::npos && pos2 < real_end){
i = pos2 + 11;
real_end = s.find("))", real_end + 2);
} else
break;
}
storedString.append(s.substr(stypesStartIndex, real_end - stypesStartIndex).c_str());
s.erase(stypesStartIndex, real_end - stypesStartIndex);
}
} }
found = s.find("ability$!"); found = s.find("ability$!");
@@ -3099,6 +3142,15 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
} }
} }
//foretell
found = s.find("foretell");
if (found != string::npos)
{
MTGAbility * a = NEW AAForetell(observer, id, card, target);
a->oneShot = 1;
return a;
}
//phaseout //phaseout
found = s.find("phaseout"); found = s.find("phaseout");
if (found != string::npos) if (found != string::npos)
@@ -3267,6 +3319,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos; bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos;
bool putinplay = splitCastCard[1].find("putinplay") != string::npos; bool putinplay = splitCastCard[1].find("putinplay") != string::npos;
bool alternative = splitCastCard[1].find("alternative") != string::npos; bool alternative = splitCastCard[1].find("alternative") != string::npos;
bool flipped = splitCastCard[1].find("flipped") != string::npos;
string nameCard = ""; string nameCard = "";
if(splitCastCard[1].find("named!:") != string::npos) if(splitCastCard[1].find("named!:") != string::npos)
{ {
@@ -3285,7 +3338,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
kicked = atoi(splitCastKicked[1].c_str()); kicked = atoi(splitCastKicked[1].c_str());
} }
} }
MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay, asNormalMadness, alternative, kicked); MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay, asNormalMadness, alternative, kicked, flipped);
a->oneShot = false; a->oneShot = false;
if(splitCastCard[1].find("trigger[to]") != string::npos) if(splitCastCard[1].find("trigger[to]") != string::npos)
{ {
@@ -4074,7 +4127,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
string transformsParamsString = ""; string transformsParamsString = "";
transformsParamsString.append(storedString);//the string between found and real end is removed at start. transformsParamsString.append(storedString);//the string between found and real end is removed at start.
found = transformsParamsString.find("transforms(("); found = transformsParamsString.find("transforms(("); // Try to handle transforms ability inside transforms keyword.
if (found != string::npos && extraTransforms.empty()) if (found != string::npos && extraTransforms.empty())
{ {
size_t real_end = transformsParamsString.find("))", found); size_t real_end = transformsParamsString.find("))", found);
@@ -4120,10 +4173,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
size_t NewSkill = abilities[j].find("newability["); size_t NewSkill = abilities[j].find("newability[");
size_t NewSkillEnd = abilities[j].find_last_of("]"); size_t NewSkillEnd = abilities[j].find_last_of("]");
string newAbilities = abilities[j].substr(NewSkill + 11,NewSkillEnd - NewSkill - 11); string newAbilities = abilities[j].substr(NewSkill + 11,NewSkillEnd - NewSkill - 11);
size_t pos = newAbilities.find("transforms(())"); // Try to handle transforms ability inside transforms keyword.
if(pos != string::npos)
newAbilities.replace(pos, 14, "transforms((" + storedString + "))");
newAbilitiesList.push_back(newAbilities); newAbilitiesList.push_back(newAbilities);
newAbilityFound = true; newAbilityFound = true;
} }
} }
size_t pos = sabilities.find("transforms(())"); // Try to handle transforms ability inside transforms keyword.
if(pos != string::npos)
sabilities.replace(pos, 14, "transforms((" + storedString + "))");
if (oneShot || forceUEOT || forceForever) if (oneShot || forceUEOT || forceForever)
return NEW ATransformerInstant(observer, id, card, target, stypes, sabilities,newpower,newpowerfound,newtoughness,newtoughnessfound,newAbilitiesList,newAbilityFound,forceForever,untilYourNextTurn,newName); return NEW ATransformerInstant(observer, id, card, target, stypes, sabilities,newpower,newpowerfound,newtoughness,newtoughnessfound,newAbilitiesList,newAbilityFound,forceForever,untilYourNextTurn,newName);
+1
View File
@@ -287,6 +287,7 @@ void MTGCardInstance::initMTGCI()
imprintR = 0; imprintR = 0;
imprintB = 0; imprintB = 0;
imprintW = 0; imprintW = 0;
foretellTurn = -1;
bushidoPoints = 0; bushidoPoints = 0;
modularPoints = 0; modularPoints = 0;
entersBattlefield = 0; entersBattlefield = 0;
+2 -1
View File
@@ -204,7 +204,8 @@ const char* Constants::MTGBasicAbilities[] = {
"inplaytapdeath", //It goes back in play tapped after death. "inplaytapdeath", //It goes back in play tapped after death.
"gainedexiledeath", //It goes to exile after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword) "gainedexiledeath", //It goes to exile after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
"gainedhanddeath", //It goes to hand after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword) "gainedhanddeath", //It goes to hand after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
"cycling" //It has cycling ability "cycling", //It has cycling ability
"foretell" //It has foretell cost
}; };
map<string,int> Constants::MTGBasicAbilitiesMap; map<string,int> Constants::MTGBasicAbilitiesMap;
+8 -2
View File
@@ -524,6 +524,12 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->unsecureSetTapped(1); cd->unsecureSetTapped(1);
} }
} }
//Has been foretold
else if (attribute.find("foretold") != string::npos)
{
cd->foretellTurn = comparisonCriterion;
cd->foretoldComparisonMode = comparisonMode;
}
//Has been kicked //Has been kicked
else if (attribute.find("kicked") != string::npos) else if (attribute.find("kicked") != string::npos)
{ {
@@ -589,7 +595,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->unsecuresetrecent(1); cd->unsecuresetrecent(1);
} }
} }
else if (attribute.find("geared") != string::npos) else if (attribute.find("geared") != string::npos || attribute.find("equipped") != string::npos)
{ {
if (minus) if (minus)
{ {
@@ -1002,7 +1008,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
ctc->setAllZones(); ctc->setAllZones();
return ctc; return ctc;
} }
else if (typeName.compare("mystored") == 0) else if (typeName.compare("mysource") == 0)
{ {
return NEW CardTargetChooser(observer, card->storedSourceCard, card, zones, nbzones); return NEW CardTargetChooser(observer, card->storedSourceCard, card, zones, nbzones);
} }