From 29985718a75b97886cee45c7758f48a431717643 Mon Sep 17 00:00:00 2001 From: valfieri Date: Mon, 12 Oct 2020 01:25:34 +0200 Subject: [PATCH] Added missing cards from GRN sets, improved mutation trigger, improved Surveil ability, implemented trigger and offset on surveil ability to allow combo with other cards (see issue #1037 opened by luisguerin). --- projects/mtg/bin/Res/sets/GRN/_cards.dat | 63 +-- .../bin/Res/sets/primitives/borderline.txt | 493 ++++++++++++++++-- projects/mtg/bin/Res/sets/primitives/mtg.txt | 6 +- .../bin/Res/sets/primitives/planeswalkers.txt | 2 +- .../bin/Res/sets/primitives/unsupported.txt | 140 ++++- projects/mtg/include/AllAbilities.h | 65 ++- projects/mtg/include/Player.h | 1 + projects/mtg/include/WEvent.h | 6 + projects/mtg/src/AllAbilities.cpp | 74 +++ projects/mtg/src/MTGAbility.cpp | 29 +- projects/mtg/src/Player.cpp | 1 + projects/mtg/src/Rules.cpp | 1 + projects/mtg/src/WEvent.cpp | 11 + 13 files changed, 791 insertions(+), 101 deletions(-) diff --git a/projects/mtg/bin/Res/sets/GRN/_cards.dat b/projects/mtg/bin/Res/sets/GRN/_cards.dat index e6955317c..5e816748a 100644 --- a/projects/mtg/bin/Res/sets/GRN/_cards.dat +++ b/projects/mtg/bin/Res/sets/GRN/_cards.dat @@ -1105,52 +1105,27 @@ id=452970 rarity=C [/card] [card] -primitive=Assemble +primitive=Assure // Assemble id=452971 rarity=R [/card] [card] -primitive=Assure -id=452971 -rarity=R -[/card] -[card] -primitive=Concoct +primitive=Connive // Concoct id=452972 rarity=R [/card] [card] -primitive=Connive -id=452972 -rarity=R -[/card] -[card] -primitive=Dispersal +primitive=Discovery // Dispersal id=452973 rarity=U [/card] [card] -primitive=Discovery -id=452973 -rarity=U -[/card] -[card] -primitive=Explosion +primitive=Expansion // Explosion id=452974 rarity=R [/card] [card] -primitive=Expansion -id=452974 -rarity=R -[/card] -[card] -primitive=Finality -id=452975 -rarity=R -[/card] -[card] -primitive=Find +primitive=Find // Finality id=452975 rarity=R [/card] @@ -1160,42 +1135,22 @@ id=452976 rarity=U [/card] [card] -primitive=Intervention +primitive=Integrity // Intervention id=452977 rarity=U [/card] [card] -primitive=Integrity -id=452977 -rarity=U -[/card] -[card] -primitive=Invent +primitive=Invert // Invent id=452978 rarity=U [/card] [card] -primitive=Invert -id=452978 -rarity=U -[/card] -[card] -primitive=Resurgence +primitive=Response // Resurgence id=452979 rarity=R [/card] [card] -primitive=Response -id=452979 -rarity=R -[/card] -[card] -primitive=Statue -id=452980 -rarity=U -[/card] -[card] -primitive=Status +primitive=Status // Statue id=452980 rarity=U [/card] diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 478eba8b1..c5554157a 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -1,7 +1,7 @@ grade=borderline #Bordeline Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programatically - Vitty85 10-10-2020 +#I sorted this programatically - Vitty85 12-10-2020 [card] name=AEther Rift auto=@each my upkeep:moverandom(*) from(myHand) to(myGraveyard) @@ -381,6 +381,14 @@ power=2 toughness=3 [/card] [card] +name=Aether Gale +target=<6>*[-land]|battlefield +auto=moveto(ownerhand) +text=Return six target nonland permanents to their owners' hands. +mana={3}{U}{U} +type=Sorcery +[/card] +[card] name=Aether Gust target=*[red;green]|battlefield,stack auto=transforms((,newability[Choice name(Top) moveto(library)],newability[Choice name(Bottom) bottomoflibrary])) controller @@ -510,9 +518,8 @@ toughness=2 [/card] [card] name=Agonizing Remorse -target=opponent -aicode=activate moveto(exile) notatarget(*[-land]|targetedpersonshand) -auto=choice name(reveal from hand) reveal:type:*:targetedpersonshand revealzone(targetedpersonshand) optionone name(choose to exile) notatarget(<1>*[-land]|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(exile)])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! optiontwoend revealend && life:-1 controller +aicode=activate moveto(exile) notatarget(*[-land]|opponenthand,opponentGraveyard) +auto=choice name(reveal from hand) reveal:type:*:opponenthand revealzone(opponenthand) optionone name(choose to exile) notatarget(<1>*[-land]|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(exile)])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! optiontwoend revealend && life:-1 controller auto=choice name(reveal from graveyard) moveto(exile) target(*[-land]|opponentGraveyard) && life:-1 controller text=Target opponent reveals their hand. You choose a nonland card from it or a card from their graveyard. Exile that card. You lose 1 life. mana={1}{B} @@ -2018,6 +2025,15 @@ mana={1}{B}{B} type=Sorcery [/card] [card] +name=Artful Takedown +auto=choice name(Tap creature) target(creature) tap(noevent) +auto=choice name(Target creature gets -2/-4) target(creature) -2/-4 ueot +auto=choice name(Choose both) target(creature) tap(noevent) && ability$!name(Target creature gets -2/-4) name(Target creature gets -2/-4) target(creature) -2/-4 ueot!$ controller +text=Choose one or both — -- • Tap target creature. -- • Target creature gets -2/-4 until end of turn. +mana={2}{U}{B} +type=Instant +[/card] +[card] name=Artificer's Assistant abilities=flying auto=@movedTo(*[artifact;legendary;saga]|mystack):scry:1 scrycore delayed dontshow donothing scrycoreend scryend @@ -2168,6 +2184,15 @@ mana={R} type=Sorcery [/card] [card] +name=Assure // Assemble +other={4}{G}{W} name(Assemble) +auto=if paid(alternative) then token(Elf Knight,Creature Elf Knight,2/2,green,white,vigilance)*3 +auto=ifnot paid(alternative) then target(creature) tansforms((,newability[indestructible],newability[counter(1/1)])) ueot +text=Put a +1/+1 counter on target creature. That creature gains indestructible until end of turn. -- Create three 2/2 green and white Elf Knight creature tokens with vigilance. +mana={GW}{GW} +type=Instant +[/card] +[card] name=Astral Cornucopia auto=if paid(kicker) then counter(0/0,kicked,Charge) auto={T}:name(Add X white mana) thisforeach(counter{0/0,1,Charge}) add{W} @@ -2954,8 +2979,8 @@ type=Instant [card] name=Barrier of Bones abilities=defender -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Defender -- When Barrier of Bones enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) mana={B} type=Creature @@ -3183,6 +3208,26 @@ power=3 toughness=4 [/card] [card] +name=Beacon Bolt +target=creature +auto=damage:pginstantsorcery +auto=foreach(*[instant;sorcery]|myexile) damage:1 +flashback={1}{U}{R}{D(*|myhand)} +text=Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard. -- Jump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) +mana={1}{U}{R} +type=Sorcery +[/card] +[card] +name=Beamsplitter Mage +auto=@targeted(this) from(*[instant;sorcery]|mycastingzone):all(trigger[from]) castcard(copied noevent) +text=Whenever you cast an instant or sorcery spell that targets only Beamsplitter Mage, if you control one or more other creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. +mana={U}{R} +type=Creature +subtype=Vedalken Wizard +power=2 +toughness=2 +[/card] +[card] name=Beanstalk Giant // Fertile Footsteps abilities=canplayfromexile,adventure other={2}{G} name(Adventure) @@ -4070,6 +4115,18 @@ power=4 toughness=3 [/card] [card] +name=Blood Operative +abilities=lifelink +auto=may moveto(exile) target(*|graveyard) +autograveyard=@surveiled(*|mybattlefield,mystack):pay({L:3}) name(return to hand) moveto(myhand) all(this) +text=Lifelink -- When Blood Operative enters the battlefield, you may exile target card from a graveyard. -- Whenever you surveil, if Blood Operative is in your graveyard, you may pay 3 life. If you do, return Blood Operative to your hand. +mana={1}{B}{B} +type=Creature +subtype=Vampire Assassin +power=3 +toughness=1 +[/card] +[card] name=Blood Price aicode=activate transforms((,newability[moveto(myhand) all(*[zpos<=2]|mylibrary) && life:-2)])) ueot auto=name(look) reveal:4 optionone name(Get 2 card) target(<2>*|reveal) moveto(myhand) optiononeend optiontwo name(put bottom of library) all(*|reveal) bottomoflibrary optiontwoend afterrevealed choice life:-2 afterrevealedend revealend @@ -6778,6 +6835,19 @@ power=2 toughness=2 [/card] [card] +name=Charnel Troll +abilities=trample +auto=upcost[{S(creature|mygraveyard)}] sacrifice +auto=@each my upkeep:counter(1/1) +auto={B}{G}{D(creature|myhand)}:counter(1/1) +text=Trample -- At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise, sacrifice it. -- {B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll. +mana={1}{B}{G} +type=Creature +subtype=Troll +power=4 +toughness=4 +[/card] +[card] name=Chart a Course auto=draw:2 controller auto=if type(creature[attacking])~lessthan~1 then discard(*|myhand) @@ -7076,8 +7146,8 @@ type=Sorcery [card] name=Citywatch Sphinx abilities=flying -auto=@movedTo(this|graveyard) from(battlefield):name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot +auto=@movedTo(this|graveyard) from(battlefield):surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot text=Flying -- When Citywatch Sphinx dies, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={5}{U} type=Creature @@ -7966,6 +8036,16 @@ power=4 toughness=4 [/card] [card] +name=Connive // Concoct +other={3}{U}{B} name(Concoct) +aicode=if paid(alternative) then surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus3plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus3plusend]) from(mylibrary) to(mylibrary)],newability[moveto(myBattlefield) target(creature|mygraveyard)])) ueot +auto=if paid(alternative) then surveil && name(surveil) reveal:psurveiloffsetplus3plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed target(creature|mygraveyard) moveto(myBattlefield) afterrevealedend revealend +auto=ifnot paid(alternative) then moveTo(myBattlefield) target(creature[power<=2]) +text=Gain control of target creature with power 2 or less. -- Surveil 3, then return a creature card from your graveyard to the battlefield. +mana={2}{UB}{UB} +type=Sorcery +[/card] +[card] name=Conqueror's Flail auto={2}:equip auto=aslongas(*[white]|myBattlefield) teach(creature) 1/1 @@ -9248,6 +9328,16 @@ power=2 toughness=2 [/card] [card] +name=Darkblade Agent +auto=@surveiled(*|mybattlefield,mystack):all(this) transforms((,newability[deathtouch],newability[@combatdamaged(player) from(this):draw:1 controller])) ueot +text=As long as you've surveilled this turn, Darkblade Agent has deathtouch and "Whenever this creature deals combat damage to a player, you draw a card." +mana={1}{U}{B} +type=Creature +subtype=Human Assassin +power=2 +toughness=3 +[/card] +[card] name=Darksteel Mutation target=creature auto=indestructible @@ -9440,8 +9530,8 @@ type=Instant name=Dazzling Lights target=creature auto=-3/-0 -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Target creature gets -3/-0 until end of turn. -- Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={U} type=Instant @@ -9589,8 +9679,8 @@ type=Instant name=Deadly Visit target=creature auto=destroy -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Destroy target creature. -- Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) mana={3}{B}{B} type=Sorcery @@ -10568,8 +10658,8 @@ type=Instant [/card] [card] name=Dimir Informant -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=When Dimir Informant enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={2}{U} type=Creature @@ -10587,6 +10677,17 @@ mana={3} type=Artifact [/card] [card] +name=Dimir Spybug +abilities=flying,menace +auto=@surveiled(*|mybattlefield,mystack):all(this) counter(1/1) +text=Flying -- Menace (This creature can't be blocked except by two or more creatures.) -- Whenever you surveil, put a +1/+1 counter on Dimir Spybug. +mana={U}{B} +type=Creature +subtype=Insect +power=1 +toughness=1 +[/card] +[card] name=Dinosaur For abilities=haste type=Creature @@ -10772,6 +10873,27 @@ power=2 toughness=1 [/card] [card] +name=Discovery // Dispersal +abilities=flash +other={3}{U}{B} name(Dispersal) +restriction=myturnonly +aicode=ifnot paid(alternative) then surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)],newability[draw:1 controller])) ueot +auto=ifnot paid(alternative) then surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed draw:1 controller afterrevealedend revealend +auto=if paid(alternative) then ability$!name(return non-land permanent) name(return non-land permanent) moveto(ownerhand) notatarget(*[-land;manacost=convertedcost:highest:*:myBattlefield])!$ opponent && ability$!name(Discard a card) name(Discard a card) target(*|myhand) reject!$ opponent +text=Surveil 2, then draw a card. -- (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) -- Each opponent returns a nonland permanent they control with the highest converted mana cost among permanents they control to its owner’s hand, then discards a card. +mana={1}{UB} +type=Sorcery +[/card] +[card] +name=Disinformation Campaign +auto=draw:1 controller +auto=ability$!name(Discard a card) notatarget(*|myhand) reject!$ opponent +auto=@surveiled(*|mybattlefield,mystack):all(this) moveto(ownerhand) +text=When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card. -- Whenever you surveil, return Disinformation Campaign to its owner's hand. +mana={1}{U}{B} +type=Enchantment +[/card] +[card] name=Dismantling Wave target=artifact,enchantment auto=destroy @@ -10881,6 +11003,13 @@ mana={1}{W} type=Instant [/card] [card] +name=Divine Visitation +auto=@movedto(creature[token]|mybattlefield):all(trigger) destroy && token(Angel,Creature Angel,4/4,white,flying,vigilance) +text=If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead. +mana={3}{W}{W} +type=Enchantment +[/card] +[card] name=Djeru's Renunciation target=creature auto=tap @@ -10987,8 +11116,8 @@ type=Enchantment [card] name=Doom Whisperer abilities=flying, trample -auto={L:2}:name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot +auto={L:2}:surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot text=Flying, trample -- Pay 2 life: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={3}{B}{B} type=Creature @@ -11463,8 +11592,8 @@ subtype=Aura name=Dream Eater abilities=flash, flying auto=moveTo(ownerHand) target(*[-land]) -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=4]|mylibrary) moverandom(*[zpos<=4]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:4 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<4>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus4plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus4plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus4plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Flash -- Flying -- When Dream Eater enters the battlefield, surveil 4. When you do, you may return target nonland permanent an opponent controls to its owner's hand. (To surveil 4, look at the top four cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) mana={4}{U}{U} type=Creature @@ -12715,6 +12844,14 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Enhanced Surveillance +auto=altersurvoffset:2 controller +auto={E}:all(*|myGraveyard) moveto(myLibrary) and!(shuffle)! +text=You may look at an additional two cards each time you surveil. -- Exile Enhanced Surveillance: Shuffle your graveyard into your library. +mana={1}{U} +type=Enchantment +[/card] +[card] name=Enigma Drake abilities=flying auto=foreach(instant,sorcery|mygraveyard) 1/0 @@ -12931,6 +13068,36 @@ power=3 toughness=5 [/card] [card] +name=Erratic Cyclops +abilities=trample +auto=@movedto(*[instant;sorcery;manacost=1]|mystack):all(this) 1/0 ueot +auto=@movedto(*[instant;sorcery;manacost=2]|mystack):all(this) 2/0 ueot +auto=@movedto(*[instant;sorcery;manacost=3]|mystack):all(this) 3/0 ueot +auto=@movedto(*[instant;sorcery;manacost=4]|mystack):all(this) 4/0 ueot +auto=@movedto(*[instant;sorcery;manacost=5]|mystack):all(this) 5/0 ueot +auto=@movedto(*[instant;sorcery;manacost=6]|mystack):all(this) 6/0 ueot +auto=@movedto(*[instant;sorcery;manacost=7]|mystack):all(this) 7/0 ueot +auto=@movedto(*[instant;sorcery;manacost=8]|mystack):all(this) 8/0 ueot +auto=@movedto(*[instant;sorcery;manacost=9]|mystack):all(this) 9/0 ueot +auto=@movedto(*[instant;sorcery;manacost=10]|mystack):all(this) 10/0 ueot +auto=@movedto(*[instant;sorcery;manacost=11]|mystack):all(this) 11/0 ueot +auto=@movedto(*[instant;sorcery;manacost=12]|mystack):all(this) 12/0 ueot +auto=@movedto(*[instant;sorcery;manacost=13]|mystack):all(this) 13/0 ueot +auto=@movedto(*[instant;sorcery;manacost=14]|mystack):all(this) 14/0 ueot +auto=@movedto(*[instant;sorcery;manacost=15]|mystack):all(this) 15/0 ueot +auto=@movedto(*[instant;sorcery;manacost=16]|mystack):all(this) 16/0 ueot +auto=@movedto(*[instant;sorcery;manacost=17]|mystack):all(this) 17/0 ueot +auto=@movedto(*[instant;sorcery;manacost=18]|mystack):all(this) 18/0 ueot +auto=@movedto(*[instant;sorcery;manacost=19]|mystack):all(this) 19/0 ueot +auto=@movedto(*[instant;sorcery;manacost=20]|mystack):all(this) 20/0 ueot +text=Trample -- Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost. +mana={3}{R} +type=Creature +subtype=Cyclops Shaman +power=0 +toughness=8 +[/card] +[card] name=Erratic Visionary auto={1}{U}{T}:draw:1 && transforms((,newability[target(*|myhand) reject])) forever text={1}{U}, {T}: Draw a card, then discard a card. @@ -13321,6 +13488,16 @@ text={T}: Add one mana of any color that a land an opponent controls could produ type=Land [/card] [card] +name=Expansion // Explosion +other={X}{U}{U}{R}{R} name(Explosion) +auto=if paid(alternative) then choice name(Damage any target and you draw) damage:X target(player,creature) && draw:X controller +auto=if paid(alternative) then choice name(Damage any target and opponent draws) damage:X target(player,creature) && draw:X opponent +auto=ifnot paid(alternative) then name(copy spell) target(*[instant;sorcery;manacost<=4]|stack) castcard(copied noevent) +text=Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy. -- Explosion deals X damage to any target. Target player draws X cards. +mana={UR}{UR} +type=Instant +[/card] +[card] name=Expedition Champion auto=aslongas(other creature[warrior]|myBattlefield) 2/0 text=Expedition Champion gets +2/+0 as long as you control another warrior. @@ -17989,6 +18166,16 @@ mana={2}{B} type=Sorcery [/card] [card] +name=Gruesome Menagerie +target=creature[manacost=1]|mygraveyard +auto=moveto(mybattlefield) +auto=ability$!name(Select creature with manacost 2) name(Select creature with manacost 2) moveto(mybattlefield) target(creature[manacost=2]|mygraveyard)!$ controller +auto=ability$!name(Select creature with manacost 3) name(Select creature with manacost 3) moveto(mybattlefield) target(creature[manacost=3]|mygraveyard)!$ controller +text=Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield. +mana={3}{B}{B} +type=Sorcery +[/card] +[card] name=Gruesome Scourger auto=damage:type:creature:mybattlefield target(planeswalker,opponent) text=When Gruesome Scourger enters the battlefield, it deals damage to target opponent or planeswalker equal to the number of creatures you control. @@ -18115,6 +18302,17 @@ mana={2}{U} type=Enchantment [/card] [card] +name=Guildmages' Forum +auto={T}:add{C} +auto={1}{T}:emblem transforms((,newability[add{W}],newability[@movedto(creature[multicolor]|mybattlefield) once:all(trigger) counter(1/1)])) ueot +auto={1}{T}:emblem transforms((,newability[add{U}],newability[@movedto(creature[multicolor]|mybattlefield) once:all(trigger) counter(1/1)])) ueot +auto={1}{T}:emblem transforms((,newability[add{R}],newability[@movedto(creature[multicolor]|mybattlefield) once:all(trigger) counter(1/1)])) ueot +auto={1}{T}:emblem transforms((,newability[add{G}],newability[@movedto(creature[multicolor]|mybattlefield) once:all(trigger) counter(1/1)])) ueot +auto={1}{T}:emblem transforms((,newability[add{B}],newability[@movedto(creature[multicolor]|mybattlefield) once:all(trigger) counter(1/1)])) ueot +text={T}: Add {C}. -- {1}, {T}: Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it. +type=Land +[/card] +[card] name=Guildpact Informant abilities=flying auto=@combatdamaged(player,planeswalker) from(this):_PROLIFERATE_ @@ -18570,6 +18768,17 @@ type=Land subtype=Desert [/card] [card] +name=Hatchery Spider +abilities=reach +auto=name(Reveal) reveal:type:creature:mygraveyard revealzone(mylibrary) optionone name(Get green permanent) target(*[green;creature;enchantment;planeswalker;manacost<=type:creature:mygraveyard]|reveal) moveto(mybattlefield) optiononeend optiontwo name(put on bottom) all(*|reveal) bottomoflibrary optiontwoend revealend +text=Reach -- Undergrowth — When you cast this spell, reveal the top X cards of your library, where X is the number of creature cards in your graveyard. You may put a green permanent card with converted mana cost X or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order. +mana={5}{G}{G} +type=Creature +subtype=Spider +power=5 +toughness=7 +[/card] +[card] name=Hate Mirage auto=clone with(treason,haste) target(creature|opponentbattlefield) text=Choose up to two target creatures you don't control. For each of those creatures, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. @@ -19658,8 +19867,8 @@ type=Sorcery [card] name=House Guildmage auto={1}{U}{T}:target(creature) freeze -auto={2}{B}{T}:name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot +auto={2}{B}{T}:surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot text={1}{U}, {T}: Target creature doesn't untap during its controller's next untap step. -- {2}{B}, {T}: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) mana={U}{B} type=Creature @@ -20111,6 +20320,15 @@ power=2 toughness=1 [/card] [card] +name=Hypothesizzle +auto=draw:2 controller +auto=choice name(Discard and deal damage) ability$!name(Discard non-land card) notatarget(*[-land]|myhand) reject!$ controller && damage:4 target(creature) +auto=choice name(Don't discard) donothing +text=Draw two cards. Then you may discard a nonland card. When you do, Hypothesizzle deals 4 damage to target creature. +mana={3}{U}{R} +type=Instant +[/card] +[card] name=Hyrax Tower Scout auto=untap target(creature) text=When Hyrax Tower Scout enters the battlefield, untap target creature. @@ -21194,6 +21412,16 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Integrity // Intervention +other={2}{R}{W} name(Intervention) +auto=ifnot paid(alternative) then target(creature) 2/2 ueot +auto=if paid(alternative) then life:3 controller +auto=if paid(alternative) then ability$!name(Choose one) choice name(Damage player) damage:3 target(player) _ choice name(Damage creature) damage:3 target(creature) _ choice name(Damage planeswalker) damage:3 target(planeswalker)!$ controller +text=Target creature gets +2/+2 until end of turn. -- Intervention deals 3 damage to any target and you gain 3 life. +mana={R or W} +type=Instant +[/card] +[card] name=Intellectual Offering auto=draw:3 all(player) auto=untap all(*[-land]) @@ -21280,6 +21508,15 @@ power=4 toughness=5 [/card] [card] +name=Invert // Invent +other={4}{U}{R} name(Invent) +auto=ifnot paid(alternative) then target(creature) transforms((,setpower=toughness,settoughness=power)) ueot +auto=if paid(alternative) then target(*[instant;sorcery]|myLibrary) moveTo(myHand) and!(shuffle)! +text=Switch the power and toughness of each of up to two target creatures until end of turn. -- Search your library for an instant card and/or a sorcery card, reveal them, put them into your hand, then shuffle your library. +mana={UR} +type=Instant +[/card] +[card] name=Invigorated Rampage auto=choice name(One creature gets +4/0 and trample) target(creature) 4/0 ueot && trample ueot auto=choice name(Two creature gets +2/0 and trample) target(<2>creature) 2/0 ueot && trample ueot @@ -21480,6 +21717,13 @@ mana={W} type=Instant [/card] [card] +name=Isolated Watchtower +auto={T}:add{C} +auto={2}{T}:scry:1 scrycore delayed target(land[zpos<=1]|mylibrary) moveto(mybattlefield) and!(tap(noevent))! scrycoreend scryend restriction{type(land|opponentbattlefield)~morethan~1} +text={T}: Add {C}. -- {2}, {T}: Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate this ability only if an opponent controls at least two more lands than you. +type=Land +[/card] +[card] name=Itlimoc, Cradle of the Sun auto={T}:Add{G} auto={T}:foreach(creature|mybattlefield) add{G} @@ -23116,6 +23360,17 @@ power=4 toughness=4 [/card] [card] +name=Kraul Harpooner +abilities=reach +auto=may name(Fight with flying creature) type:creature:mygraveyard/0 ueot && transforms((,newability[target(creature[flying]|opponentbattlefield) dynamicability])) ueot +text=Reach -- Undergrowth — When Kraul Harpooner enters the battlefield, choose up to one target creature with flying you don't control. Kraul Harpooner gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have Kraul Harpooner fight that creature. +mana={1}{G} +type=Creature +subtype=Insect Warrior +power=3 +toughness=2 +[/card] +[card] name=Kraul Raider abilities=menace text=Menace (This creature can't be blocked except by two or more creatures.) @@ -23547,6 +23802,18 @@ type=Enchantment subtype=Aura [/card] [card] +name=Lazav, the Multifarious +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend +auto={X}:target(creature[manacost<=X]|mygraveyard) copy and!( transforms((Legendary)) forever )! +text=When Lazav, the Multifarious enters the battlefield, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) -- {X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability. +mana={U}{B} +type=Legendary Creature +subtype=Shapeshifter +power=1 +toughness=3 +[/card] +[card] name=Lazotep Behemoth mana={4}{B} type=Creature @@ -23608,6 +23875,17 @@ power=1 toughness=1 [/card] [card] +name=League Guildmage +auto={3}{U}{T}:draw:1 controller +auto={X}{R}{T}:name(copy target instant or sorcery) name(copy target instant or sorcery) target(*[instant;sorcery;manacost<=X]|mystack) castcard(copied noevent) +text={3}{U},{T}: Draw a card. -- {X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. +mana={U}{R} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Leap of Flame kicker=multi{U}{R} auto=if compare(kicked)~equalto~0 then name(choose 1 creature) name(choose 1 creature) target(creature) transforms((,newability[flying],newability[first strike],newability[1/0])) ueot @@ -26106,8 +26384,8 @@ toughness=2 [card] name=Mephitic Vapors auto=all(creature) -1/-1 -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=All creatures get -1/-1 until end of turn. -- Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={2}{B} type=Sorcery @@ -26727,6 +27005,14 @@ text={T}: Add {3}. Spend this mana only to cast artifact spells. type=Land [/card] [card] +name=Mission Briefing +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed target(*[instant;sorcery;fresh]|mygraveyard) transforms((,newability[canplayfromgraveyard],newability[exiledeath])) ueot afterrevealedend revealend +text=Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast it this turn. If that spell would be put into your graveyard this turn, exile it instead. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +mana={U}{U} +type=Instant +[/card] +[card] name=Mist-Cloaked Herald abilities=unblockable text=Mist-Cloaked Herald can't be blocked. @@ -26992,6 +27278,16 @@ mana={4}{G} type=Sorcery [/card] [card] +name=Moodmark Painter +auto=target(creature) transforms((,newability[menace],newability[type:creature:mygraveyard/0])) ueot +text=Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. (It can't be blocked except by two or more creatures.) +mana={2}{B}{B} +type=Creature +subtype=Human Shaman +power=2 +toughness=3 +[/card] +[card] name=Moon-Eating Dog auto=aslongas(planeswalker[Yanling]|mybattlefield) flying text=As long as you control a Yanling planeswalker, Moon-Eating Dog has flying. (It can't be blocked except by creatures with flying or reach.) @@ -28074,6 +28370,15 @@ mana={1}{B}{B} type=Sorcery [/card] [card] +name=Never Happened +aicode=activate moveto(exile) notatarget(*[-land]|opponentGraveyard,opponenthand) +auto=choice name(exile from hand) reveal:type:*:opponenthand revealzone(opponenthand) optionone name(choose to exile) notatarget(<1>*[-land]|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(exile)])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! optiontwoend revealend +auto=choice name(exile from graveyard) moveto(exile) target(*[-land]|opponentGraveyard) +text=Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it. +mana={2}{B} +type=Sorcery +[/card] +[card] name=New Frontiers auto=thisforeach(X) ability$!notatarget(land|mylibrary) moveto(ownerhand) && tap!$ opponent auto=name(search basic lands) reveal:plibrarycount optionone name(choose card) target(land[basic]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend @@ -28337,8 +28642,8 @@ toughness=3 [card] name=Nightveil Sprite abilities=flying -auto=@combat(attacking) source(this):name(surveil) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot +auto=@combat(attacking) source(this):surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot text=Flying -- Whenever Nightveil Sprite attacks, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) mana={1}{U} type=Creature @@ -28664,8 +28969,8 @@ type=Sorcery [/card] [card] name=Notion Rain -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend auto=damage:2 auto=draw:2 text=Surveil 2, then draw two cards. Notion Rain deals 2 damage to you. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) @@ -28724,6 +29029,20 @@ mana={4}{B}{B} type=Enchantment [/card] [card] +name=Nullhide Ferox +abilities=opponentshroud +auto=maxCast(*[-creature])0 +auto={2}:transforms((,newability[loseabilities])) ueot +auto=foreach(land[-tapped]|opponentBattlefield) transforms((,newability[ability$!name(Pay 2) pay[[{2}]] name(Pay 2) loseabilities notatarget(Nullhide Ferox|opponentBattlefield)ueot?donothing!$ opponent])) forever +autograveyard=while(restriction{discardbyopponent}) moveto(ownerbattlefield) +text=Hexproof -- You can't cast noncreature spells. -- {2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability. -- If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard. +mana={2}{G}{G} +type=Creature +subtype=Beast +power=6 +toughness=6 +[/card] +[card] name=Nullpriest of Oblivion abilities=menace,lifelink kicker={3}{B} @@ -31504,8 +31823,8 @@ other={1}{B} name(Target Legendary) otherrestriction=type(creature[legendary]|battlefield)~morethan~0 auto=if paid(alternative) then destroy target(creature[legendary]) auto=ifnot paid(alternative) then destroy target(creature) -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=This spell costs {2} less to cast if it targets a legendary creature. -- Destroy target creature. -- Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) mana={3}{B} type=Instant @@ -33744,6 +34063,17 @@ power=2 toughness=2 [/card] [card] +name=Response // Resurgence +other={3}{R}{W} name(Resurgence) +otherrestriction=myturnonly +auto=if paid(alternative) then all(creature|mybattlefield) transforms((,newability[first strike],newability[vigilance])) ueot asSorcery +auto=if paid(alternative) then nextphasealter(add,combatphaseswithmain,controller,after) asSorcery +auto=ifnot paid(alternative) then damage:5 target(creature[attacking;blocking]) +text=Response deals 5 damage to target attacking or blocking creature. -- Creatures you control gain first strike and vigilance until end of turn. After this main phase, there is an additional combat phase followed by an additional main phase. +mana={R or W}{R or W} +type=Instant +[/card] +[card] name=Restless Dreams auto=if type(*|myHand)~morethan~0 then choice ability$!name(X=1) target(*|myhand) reject!$ controller && moveto(myhand) target(*[creature]|mygraveyard) auto=if type(*|myHand)~morethan~1 then choice ability$!name(X=2) target(<2>*|myhand) reject!$ controller && moveto(myhand) target(<2>*[creature]|mygraveyard) @@ -34288,6 +34618,14 @@ power=2 toughness=2 [/card] [card] +name=Risk Factor +auto=ability$!name(Choose one) choice name(Damage 4) damage:4 controller _ choice name(Draw cards) draw:3 opponent!$ opponent +flashback={2}{R}{D(*|myhand)} +text=Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards. -- Jump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) +mana={2}{R} +type=Instant +[/card] +[card] name=Rite of Belzenlok auto=counter(0/0,1,Lore) auto=@each my firstmain:counter(0/0,1,Lore) @@ -36803,6 +37141,13 @@ power=0 toughness=0 [/card] [card] +name=Selective Snare +auto=chooseatype target(creature[chosentype]) moveto(ownerhand) chooseend +text=Return X target creatures of the creature type of your choice to their owner's hand. +mana={X}{U} +type=Sorcery +[/card] +[card] name=Selesnya Eulogist auto={2}{G}:target(creature|graveyard) moveto(exile) && ability$! name(populate) clone notatarget(creature[token]|mybattlefield) !$ controller text={2}{G}: Exile target creature card from a graveyard, then populate. (Create a token that's a copy of a creature token you control.) @@ -38418,8 +38763,8 @@ toughness=1 name=Sinister Sabotage target=*|stack auto=fizzle -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Counter target spell. -- Surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) mana={1}{U}{U} type=Instant @@ -41112,6 +41457,15 @@ mana={3} type=Artifact [/card] [card] +name=Status // Statue +other={2}{B}{G} name(Statue) +auto=if paid(alternative) then target(*[creature;artifact;enchantment]) destroy +auto=ifnot paid(alternative) then target(creature) transforms((,newability[1/1],newability[deathtouch])) ueot +text=Target creature gets +1/+1 and gains deathtouch until end of turn. -- Destroy target artifact, creature, or enchantment. +mana={BG} +type=Instant +[/card] +[card] name=Staunch Shieldmate mana={W} type=Creature @@ -44111,13 +44465,25 @@ type=Sorcery name=Thought Erasure aicode=activate reject notatarget(*[-land]|opponenthand) auto=reveal:type:*:opponenthand revealzone(opponenthand) optionone name(choose discards) notatarget(<1>*[-land]|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(ownerhand) and!(reject)!])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! optiontwoend revealend -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot -auto=name(Reveal) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. -- Surveil 1. (Look at the top card of your library. You may put it into your graveyard.) mana={U}{B} type=Sorcery [/card] [card] +name=Thoughtbound Phantasm +abilities=defender +auto=this(counter{1/1}>=3) canattack +auto=@surveiled(*|mybattlefield,mystack):all(this) counter(1/1) +text=Defender -- Whenever you surveil, put a +1/+1 counter on Thoughtbound Phantasm. -- As long as Thoughtbound Phantasm has three or more +1/+1 counters on it, it can attack as though it didn't have defender. +mana={U} +type=Creature +subtype=Spirit +power=2 +toughness=2 +[/card] +[card] name=Thousand-Year Elixir auto=all(creature|mybattlefield) transforms((,newability[haste])) forever auto={1}{T}:target(creature) untap @@ -44126,6 +44492,14 @@ mana={3} type=Artifact [/card] [card] +name=Thousand-Year Storm +auto=@movedTo(instant,sorcery|mystack):foreach(instant[fresh]|mygraveyard) all(trigger[to]) castcard(copied noevent) +auto=@movedTo(instant,sorcery|mystack):foreach(sorcery[fresh]|mygraveyard) all(trigger[to]) castcard(copied noevent) +text=Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies. +mana={4}{U}{R} +type=Enchantment +[/card] +[card] name=Thran Temporal Gateway auto={4}{T}:notatarget(*[artifact;legendary;saga]|myhand) moveTo(mybattlefield) text={4}, {T}: You may put a historic permanent card from your hand onto the battlefield. (Artifacts, legendaries, and Sagas are historic.) @@ -46280,8 +46654,8 @@ type=Instant name=Unexplained Disappearance target=creature auto=moveTo(ownerHand) -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Return target creature to its owner's hand. -- Surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) mana={1}{U} type=Instant @@ -46476,6 +46850,20 @@ mana={2}{U} type=Instant [/card] [card] +name=Urban Utopia +target=land +auto=draw:1 controller +auto=teach(land) {T}:add{G} +auto=teach(land) {T}:add{W} +auto=teach(land) {T}:add{U} +auto=teach(land) {T}:add{R} +auto=teach(land) {T}:add{B} +text=Enchant land -- When Urban Utopia enters the battlefield, draw a card. -- Enchanted land has " {T}: Add one mana of any color." +mana={1}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Urborg Panther auto={B}{S}:destroy target(creature[blocking]) auto={S(*[Feral Shadow|mybattlefield)}{S(*[Breathstealer]|mybattlefield)}{S(*[Urborg Panther]|mybattlefield)}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[Spirit of the Night]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield))! afterrevealedend revealend @@ -47404,6 +47792,15 @@ mana={1}{B} type=Instant [/card] [card] +name=Vicious Rumors +auto=damage:1 opponent +auto=life:1 controller +auto=ability$!name(Discard a card) notatarget(*|myhand) reject!$ opponent +text=Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then mills a card. You gain 1 life. +mana={B} +type=Sorcery +[/card] +[card] name=Victimize target=<2>*[creature]|mygraveyard auto=moveto(mybattlefield) and!(tap(noevent))! @@ -48133,6 +48530,16 @@ power=0 toughness=4 [/card] [card] +name=Wall of Mist +abilities=defender +text=Defender +mana={1}{U} +type=Creature +subtype=Wall +power=0 +toughness=5 +[/card] +[card] name=Wall of One Thousand Cuts abilities=defender,flying auto={W}:canattack ueot @@ -48418,8 +48825,8 @@ toughness=2 [card] name=Watcher in the Mist abilities=flying -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=2]|mylibrary) moverandom(*[zpos<=2]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:2 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<2>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus2plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus2plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Flying -- When Watcher in the Mist enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) mana={3}{U}{U} type=Creature @@ -48749,8 +49156,8 @@ type=Enchantment [card] name=Whisper Agent abilities=flash -aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot -auto=name(surveil) reveal:1 optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<1>*|reveal) moveto(ownerlibrary) optiontwoend revealend +aicode=surveil && name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=psurveiloffsetplus1plusend]|mylibrary) moverandom(*[zpos<=psurveiloffsetplus1plusend]) from(mylibrary) to(mylibrary)])) ueot +auto=surveil && name(surveil) reveal:psurveiloffsetplus1plusend optionone name(put in graveyard) target(*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(*|reveal) moveto(ownerlibrary) optiontwoend revealend text=Flash -- When Whisper Agent enters the battlefield, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) mana={1}{UB}{UB} type=Creature @@ -48780,6 +49187,16 @@ power=2 toughness=2 [/card] [card] +name=Whispering Snitch +auto=@surveiled(*|mybattlefield,mystack) turnlimited:damage:1 opponent && life:1 controller +text=Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life. +mana={1}{B} +type=Creature +subtype=Vampire Rogue +power=1 +toughness=3 +[/card] +[card] name=Whispersteel Dagger auto={3}:equip auto=teach(creature) 2/0 diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 647e9a66b..596b2921b 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -1,6 +1,6 @@ #Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - kevlahnota 03-16-2017 +#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 12-10-2020 [card] name=Abandon Reason target=creature @@ -68782,7 +68782,7 @@ toughness=3 [card] name=Luminarch Ascension auto=@each opponent end restriction{compare(lifelost)~lessthan~1}:may counter(0/0,1,Quest) -auto=this(counter{0/0.1.Quest}>=4) {1}{W}:token(Angel,Creature Angel,4/4,white flying) +auto=this(counter{0/0.1.Quest}>=4) {1}{W}:token(Angel,Creature Angel,4/4,white,flying) text=At the beginning of each opponent's end step, if you didn't lose life this turn, you may put a quest counter on Luminarch Ascension. (Damage causes loss of life.) -- {1}{W}: Put a 4/4 white Angel creature token with flying onto the battlefield. Activate this ability only if Luminarch Ascension has four or more quest counters on it. mana={1}{W} type=Enchantment @@ -104989,7 +104989,7 @@ subtype=Aura [/card] [card] name=Sigil of the Empty Throne -auto=@movedTo(enchantment|mystack):token(Angel,Creature Angel,4/4,white flying) +auto=@movedTo(enchantment|mystack):token(Angel,Creature Angel,4/4,white,flying) text=Whenever you cast an enchantment spell, put a 4/4 white Angel creature token with flying onto the battlefield. mana={3}{W}{W} type=Enchantment diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index ecb8eeb36..ab03820c6 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -1,7 +1,7 @@ grade=borderline #Planeswalkers Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#We sorted this in alphabetical order - Luruz & Vitty85 09-08-2020 +#We sorted this in alphabetical order - Luruz & Vitty85 12-10-2020 [card] primitive=Abian, Luvion Usurper id=476217 diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 7bcc3cd92..174bf58ae 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -2,7 +2,7 @@ grade=unsupported #The cards in this file are not implemented/incomplete yet. #Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017 #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programatically - Vitty85 04-07-2020 +#I sorted this programatically - Vitty85 12-10-2020 [card] name="Ach! Hans, Run!" text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn. @@ -64,6 +64,12 @@ mana={3} type=Artifact [/card] [card] +name=Aminatou's Augury +text=Exile the top eight cards of your library. You may put a land card from among them onto the battlefield. Until end of turn, for each nonland card type, you may cast a spell of that type from among the exiled cards without paying its mana cost. +mana={6}{U}{U} +type=Sorcery +[/card] +[card] name=Absolver Thrull text=Haunt (When this creature dies, exile it haunting target creature.) -- When Absolver Thrull enters the battlefield or the creature it haunts dies, destroy target enchantment. mana={3}{W} @@ -194,6 +200,12 @@ power=2 toughness=2 [/card] [card] +name=Aethermage's Touch +text=Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. +mana={2}{W}{U} +type=Instant +[/card] +[card] name=Agent of Acquisitions text=Draft Agent of Acquisitions face up. -- Instead of drafting a card from a booster pack, you may draft each card in that booster pack, one at a time. If you do, turn Agent of Acquisitions face down and you can't draft cards for the rest of this draft round. (You may look at booster packs passed to you.) mana={2} @@ -1341,6 +1353,15 @@ power=3 toughness=1 [/card] [card] +name=Boreas Charger +text=Flying -- When Boreas Charger leaves the battlefield, choose an opponent who controls more lands than you. Search your library for a number of Plains cards equal to the difference and reveal them. Put one of them onto the battlefield tapped and the rest into your hand. Then shuffle your library. +mana={2}{W} +type=Creature +subtype=Pegasus +power=2 +toughness=1 +[/card] +[card] name=Boros Battleshaper text=At the beginning of each combat, up to one target creature attacks or blocks this combat if able and up to one target creature can't attack or block this combat. mana={5}{R}{W} @@ -3787,6 +3808,15 @@ power=0 toughness=1 [/card] [card] +name=Emissary of Grudges +text=Flying, haste -- As Emissary of Grudges enters the battlefield, secretly choose an opponent. -- Reveal the player you chose: Choose new targets for target spell or ability if it's controlled by the chosen player and if it targets you or a permanent you control. Activate this ability only once. +mana={5}{R} +type=Creature +subtype=Efreet +power=6 +toughness=5 +[/card] +[card] name=Emissary's Ploy text=(Start the game with this conspiracy face up in the command zone.) -- Before drawing your opening hand, choose 1, 2, or 3. -- You may spend mana as though it were mana of any color to cast creature spells with converted mana cost equal to the chosen number. type=Conspiracy @@ -3811,6 +3841,12 @@ power=13 toughness=13 [/card] [card] +name=Enchanter's Bane +text=At the beginning of your end step, target enchantment deals damage equal to its converted mana cost to its controller unless that player sacrifices it. +mana={1}{R} +type=Enchantment +[/card] +[card] name=Enchantment Alteration text=Attach target Aura attached to a creature or land to another permanent of that type. mana={U} @@ -3981,6 +4017,15 @@ power=6 toughness=6 [/card] [card] +name=Etrata, the Silencer +text=Etrata, the Silencer can't be blocked. -- Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library. +mana={2}{U}{B} +type=Legendary Creature +subtype=Vampire Assassin +power=3 +toughness=5 +[/card] +[card] name=Everdream text=Draw a card. -- Splice onto instant or sorcery {2}{U} (As you cast an instant or sorcery spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) mana={1}{U} @@ -4569,6 +4614,11 @@ mana={5} type=Artifact [/card] [card] +name=Forge of Heroes +text={T}: Add {C}. -- {T}: Choose target commander that entered the battlefield this turn. Put a +1/+1 counter on it if it's a creature and a loyalty counter on it if it's a planeswalker. +type=Land +[/card] +[card] name=Forgotten Lore text=Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand. mana={G} @@ -4899,6 +4949,12 @@ mana={3} type=Artifact [/card] [card] +name=Genesis Storm +text=When you cast this spell, copy it for each time you've cast your commander from the command zone this game. -- Reveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order. +mana={4}{G}{G} +type=Sorcery +[/card] +[card] name=Genetic Recombinator text=Whenever you crank Genetic Recombinator, up to two target creatures each get +2/+2 until end of turn. type=Artifact @@ -8782,6 +8838,12 @@ power=2 toughness=2 [/card] [card] +name=Mnemonic Betrayal +text=Exile all cards from all opponents' graveyards. You may cast spells from among those cards this turn, and you may spend mana as though it were mana of any type to cast those spells. At the beginning of the next end step, if any of those cards remain exiled, return them to their owners' graveyards. -- Exile Mnemonic Betrayal. +mana={1}{U}{B} +type=Sorcery +[/card] +[card] name=Mob Mentality text=Enchant creature -- Enchanted creature has trample. -- Whenever all non-Wall creatures you control attack, enchanted creature gets +X/+0 until end of turn, where X is the number of attacking creatures. mana={R} @@ -9102,6 +9164,12 @@ type=Enchantment subtype=Aura [/card] [card] +name=Myth Unbound +text=Your commander costs {1} less to cast for each time it's been cast from the command zone this game. -- Whenever your commander is put into the command zone from anywhere, draw a card. +mana={2}{G} +type=Enchantment +[/card] +[card] name=Mythos of Snapdax text=Each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. If {B}{R} was spent to cast this spell, you choose the permanents for each player instead. mana={2}{W}{W} @@ -9476,6 +9544,15 @@ power=1 toughness=1 [/card] [card] +name=Nylea's Colossus +text=Constellation — Whenever Nylea's Colossus or another enchantment enters the battlefield under your control, double target creature's power and toughness until end of turn. +mana={6}{G} +type=Enchantment Creature +subtype=Giant +power=6 +toughness=6 +[/card] +[card] name=Oaken Brawler text=When Oaken Brawler enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Oaken Brawler. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) mana={3}{W} @@ -10489,6 +10566,12 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Primordial Mist +text=At the beginning of your end step, you may manifest the top card of your library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) -- Exile a face-down permanent you control face up: You may play that card this turn. (You still pay its costs. Timing rules still apply.) +mana={4}{U} +type=Enchantment +[/card] +[card] name=Primordial Ooze text=Primordial Ooze attacks each turn if able. -- At the beginning of your upkeep, put a +1/+1 counter on Primordial Ooze. Then you may pay {X}, where X is the number of +1/+1 counters on it. If you don't, tap Primordial Ooze and it deals X damage to you. mana={R} @@ -10951,6 +11034,12 @@ type=Enchantment subtype=Aura [/card] [card] +name=Reality Scramble +text=Put target permanent you own on the bottom of your library. Reveal cards from the top of your library until you reveal a card that shares a card type with that permanent. Put that card onto the battlefield and the rest on the bottom of your library in a random order. -- Retrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) +mana={2}{R}{R} +type=Sorcery +[/card] +[card] name=Reality Shaping text=When you encounter Reality Shaping, starting with you, each player may put a permanent card from his or her hand onto the battlefield. (Then planeswalk away from this phenomenon.) type=Phenomenon @@ -12338,6 +12427,12 @@ power=4 toughness=1 [/card] [card] +name=Skull Storm +text=When you cast this spell, copy it for each time you've cast your commander from the command zone this game. -- Each opponent sacrifices a creature. Each opponent who can't loses half their life, rounded up. +mana={7}{B}{B} +type=Sorcery +[/card] +[card] name=Skullbriar, the Walking Grave text=Haste -- Whenever Skullbriar, the Walking Grave deals combat damage to a player, put a +1/+1 counter on it. -- Counters remain on Skullbriar as it moves to any zone other than a player's hand or library. mana={B}{G} @@ -13623,6 +13718,15 @@ mana={4} type=Artifact [/card] [card] +name=Tawnos, Urza's Apprentice +text=Haste -- {U}{R}, {T}: Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) +mana={U}{R} +type=Legendary Creature +subtype=Human Artificer +power=1 +toughness=3 +[/card] +[card] name=Tayam, Luminous Enigma text=Each other creature you control enters the battlefield with an additional vigilance counter on it. -- {3}, Remove three counters from among creatures you control: Put the top three cards of your library into your graveyard, then return a permanent card with converted mana cost 3 or less from your graveyard to the battlefield. mana={1}{W}{B}{G} @@ -13919,6 +14023,16 @@ power=1 toughness=1 [/card] [card] +name=Thief of Sanity +abilities=flying +text=Flying -- Whenever Thief of Sanity deals combat damage to a player, look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. You may look at and cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any type to cast that spell. +mana={1}{U}{B} +type=Creature +subtype=Specter +power=2 +toughness=2 +[/card] +[card] name=Thieves' Auction text=Exile all nontoken permanents. Starting with you, each player chooses one of the exiled cards and puts it onto the battlefield tapped under his or her control. Repeat this process until all cards exiled this way have been chosen. mana={4}{R}{R}{R} @@ -14498,6 +14612,12 @@ text=Black legendary creatures you control have "bands with other legendary crea type=Land [/card] [card] +name=Unmoored Ego +text=Choose a card name. Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way. +mana={1}{U}{B} +type=Sorcery +[/card] +[card] name=Unpredictable Cyclone text=If a cycling ability of another nonland card would cause you to draw a card, instead exile cards from the top of your library until you exile a card that shares a card type with the cycled card. You may cast that card without paying its mana cost. Then put the exiled cards that weren't cast this way on the bottom of your library in a random order. -- Cycling {2} ({2}, Discard this card: Draw a card.) mana={3}{R}{R} @@ -15499,6 +15619,15 @@ power=3 toughness=6 [/card] [card] +name=Yennett, Cryptic Sovereign +text=Flying, vigilance, menace -- Whenever Yennett, Cryptic Sovereign attacks, reveal the top card of your library. You may cast it without paying its mana cost if its converted mana cost is odd. If you don't cast it, draw a card. +mana={2}{W}{U}{B} +type=Legendary Creature +subtype=Sphinx +power=3 +toughness=5 +[/card] +[card] name=Yet Another AEther Vortex text=All creatures have haste. -- Players play with the top card of their libraries revealed. -- Noninstant, nonsorcery cards on top of a library are in play under their owner's control in addition to being in that library. mana={3}{R}{R} @@ -15554,6 +15683,15 @@ power=1 toughness=1 [/card] [card] +name=Yuriko, the Tiger's Shadow +text=Commander ninjutsu {U}{B} ({U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand or the command zone tapped and attacking.) -- Whenever a Ninja you control deals combat damage to a player, reveal the top card of your library and put that card into your hand. Each opponent loses life equal to that card's converted mana cost. +mana={1}{U}{B} +type=Legendary Creature +subtype=Human Ninja +power=1 +toughness=3 +[/card] +[card] name=Zada, Hedron Grinder text=Whenever you cast an instant or sorcery spell that targets only Zada, Hedron Grinder, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures. mana={3}{R} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 14fb7840e..47473be4e 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -582,6 +582,10 @@ private: { intValue = (s == "pyidarocount")?card->controller()->yidaroCount:card->controller()->opponent()->yidaroCount; } + else if (s == "psurveiloffset" || s == "osurveiloffset") + { + intValue = (s == "psurveiloffset")?card->controller()->surveilOffset:card->controller()->opponent()->surveilOffset; + } else if (s == "praidcount") { intValue = card->controller()->raidcount; @@ -1679,8 +1683,9 @@ public: class TrCardMutated: public Trigger { public: - bool thiscontroller, thisopponent; - TrCardMutated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) : + bool limitOnceATurn; + int triggeredTurn; + TrCardMutated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false,bool limitOnceATurn = false) : Trigger(observer, id, source,once, tc) { } @@ -1689,7 +1694,10 @@ public: { WEventCardMutated * e = dynamic_cast (event); if (!e) return 0; + if (limitOnceATurn && triggeredTurn == game->turn) + return 0; if (!tc->canTarget(e->card)) return 0; + triggeredTurn = game->turn; return 1; } @@ -1699,6 +1707,33 @@ public: } }; +class TrCardSurveiled: public Trigger +{ +public: + bool limitOnceATurn; + int triggeredTurn; + TrCardSurveiled(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false,bool limitOnceATurn = false) : + Trigger(observer, id, source,once, tc),limitOnceATurn(limitOnceATurn) + { + } + + int triggerOnEventImpl(WEvent * event) + { + WEventCardSurveiled * e = dynamic_cast (event); + if (!e) return 0; + if (limitOnceATurn && triggeredTurn == game->turn) + return 0; + if (!tc->canTarget(e->card)) return 0; + triggeredTurn = game->turn; + return 1; + } + + TrCardSurveiled * clone() const + { + return NEW TrCardSurveiled(*this); + } +}; + class TrTokenCreated: public Trigger { public: @@ -4842,6 +4877,19 @@ public: AAAlterEnergy * clone() const; ~AAAlterEnergy(); }; +//Surveil Event +class AASurveilEvent: public ActivatedAbilityTP +{ +public: + MTGCardInstance * card; + + AASurveilEvent(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost = NULL, + int who = TargetChooser::UNSET); + int resolve(); + const string getMenuText(); + AASurveilEvent * clone() const; + ~AASurveilEvent(); +}; //Yidaro Counter class AAAlterYidaroCount: public ActivatedAbilityTP { @@ -4855,6 +4903,19 @@ public: AAAlterYidaroCount * clone() const; ~AAAlterYidaroCount(); }; +//Surveil Offset +class AAAlterSurveilOffset: public ActivatedAbilityTP +{ +public: + int surveilOffset; + + AAAlterSurveilOffset(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int surveilOffset, ManaCost * _cost = NULL, + int who = TargetChooser::UNSET); + int resolve(); + const string getMenuText(); + AAAlterSurveilOffset * clone() const; + ~AAAlterSurveilOffset(); +}; /* Standard Damager, can choose a NEW target each time the price is paid */ class TADamager: public TargetAbility { diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index 7de089a51..f52b57c4a 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -44,6 +44,7 @@ public: int drawCounter; int energyCount; int yidaroCount; + int surveilOffset; int epic; int forcefield; int dealsdamagebycombat; diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index fe7a786b2..c471df8c1 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -353,6 +353,12 @@ struct WEventplayerEnergized : public WEvent { virtual Targetable * getTarget(Player * player); }; +//surveil event +struct WEventCardSurveiled : public WEventCardUpdate { + WEventCardSurveiled(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + //mutation event struct WEventCardMutated : public WEventCardUpdate { WEventCardMutated(MTGCardInstance * card); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 8735b8222..3749f5f26 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1023,6 +1023,80 @@ AAAlterPoison::~AAAlterPoison() { } +//AA Surveil Event +AASurveilEvent::AASurveilEvent(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost, + int who) : + ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), card(_source) +{ +} + +int AASurveilEvent::resolve() +{ + Damageable * _target = (Damageable *) getTarget(); + if (_target) + { + Player * pTarget = (Player*)_target; + if(pTarget) + { + WEvent * e = NEW WEventCardSurveiled(card); + game->receiveEvent(e); + } + } + return 0; +} + +const string AASurveilEvent::getMenuText() +{ + return "Surveil event called"; +} + +AASurveilEvent * AASurveilEvent::clone() const +{ + return NEW AASurveilEvent(*this); +} + +AASurveilEvent::~AASurveilEvent() +{ +} + +//AA Surveil Offset +AAAlterSurveilOffset::AAAlterSurveilOffset(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int surveilOffset, ManaCost * _cost, + int who) : + ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), surveilOffset(surveilOffset) +{ +} + +int AAAlterSurveilOffset::resolve() +{ + Damageable * _target = (Damageable *) getTarget(); + if (_target) + { + Player * pTarget = (Player*)_target; + if(pTarget) + { + pTarget->surveilOffset += surveilOffset; + if(pTarget->surveilOffset < 0) + pTarget->surveilOffset = 0; + } + } + return 0; +} + +const string AAAlterSurveilOffset::getMenuText() +{ + WParsedInt parsedNum(surveilOffset); + return _(parsedNum.getStringValue() + " Surveil Offset ").c_str(); +} + +AAAlterSurveilOffset * AAAlterSurveilOffset::clone() const +{ + return NEW AAAlterSurveilOffset(*this); +} + +AAAlterSurveilOffset::~AAAlterSurveilOffset() +{ +} + //AA Yidaro Count AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost, int who) : diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index f834dc2b6..2c1f4fa25 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1208,8 +1208,12 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell //Card is mutated if (TargetChooser * tc = parseSimpleTC(s, "mutated", card)) - return NEW TrCardMutated(observer, id, card, tc,once); - + return NEW TrCardMutated(observer, id, card, tc,once,limitOnceATurn); + + //Surveil has been performed from controller + if (TargetChooser * tc = parseSimpleTC(s, "surveiled", card)) + return NEW TrCardSurveiled(observer, id, card, tc,once,limitOnceATurn); + //Token has been created if (TargetChooser * tc = parseSimpleTC(s, "tokencreated", card)) return NEW TrTokenCreated(observer, id, card, tc,once); @@ -3389,6 +3393,27 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG card->mutation += atoi(splitMutatedUnder[1].c_str()); } + //perform surveil + found = s.find("surveil"); + if (found != string::npos) + { + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AASurveilEvent(observer, id, card, t, NULL, who); + a->oneShot = 1; + return a; + } + + //set surveil offset controller (eg. Enhanced Surveillance) + vector splitSurveilOffset = parseBetween(s, "altersurvoffset:", " ", false); + if (splitSurveilOffset.size()) + { + int surveilOffset = atoi(splitSurveilOffset[1].c_str()); + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AAAlterSurveilOffset(observer, id, card, t, surveilOffset, NULL, who); + a->oneShot = 1; + return a; + } + //prevent next damage vector splitPrevent = parseBetween(s, "prevent:", " ", false); if (splitPrevent.size()) diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 2f8e79f16..05d8b0b19 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -36,6 +36,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * drawCounter = 0; energyCount = 0; yidaroCount = 0; + surveilOffset = 0; epic = 0; forcefield = 0; dealsdamagebycombat = 0; diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index d9f9c8d0b..98d9ce822 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -598,6 +598,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) p->preventable = initState.playerData[i].player->preventable; p->energyCount = initState.playerData[i].player->energyCount; p->yidaroCount = initState.playerData[i].player->yidaroCount; + p->surveilOffset = initState.playerData[i].player->surveilOffset; if (initState.playerData[i].player->mAvatarName.size()) { p->mAvatarName = initState.playerData[i].player->mAvatarName; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index d80e80db2..7bc81dfb5 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -287,6 +287,11 @@ WEventplayerEnergized::WEventplayerEnergized(Player * player, int nb_count) : { } +WEventCardSurveiled::WEventCardSurveiled(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCardMutated::WEventCardMutated(MTGCardInstance * card) : WEventCardUpdate(card) { @@ -500,6 +505,12 @@ Targetable * WEventCardMutated::getTarget(int target) return NULL; } +Targetable * WEventCardSurveiled::getTarget(int target) +{ + if (target) return card; + return NULL; +} + Targetable * WEventTokenCreated::getTarget(int target) { if (target) return card;