From 546c75518508390a236a556165f150df8064c22e Mon Sep 17 00:00:00 2001 From: Vittorio Alfieri Date: Mon, 15 May 2023 16:37:10 +0200 Subject: [PATCH] Fixed redirection of damage for battle cards, added 2 new keywords to target combined zones, added some new primitives from MOM set. --- .../bin/Res/sets/primitives/borderline.txt | 202 ++++++++++++++++-- projects/mtg/src/AllAbilities.cpp | 2 +- projects/mtg/src/TargetChooser.cpp | 20 ++ 3 files changed, 205 insertions(+), 19 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 558c7a224..4589e8da1 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -5266,6 +5266,22 @@ power=* toughness=* [/card] [card] +name=Awakened Skyclave +abilities=haste,vigilance +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +auto={T}:Add{G} +auto=transforms((Land)) forever +text=Vigilance, haste -- As long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types. -- {T}: Add one mana of any color. +color=green +type=Creature +subtype=Elemental +power=4 +toughness=4 +[/card] +[card] name=Awakening of Vitu-Ghazi target=land|myBattlefield auto=transforms((Legendary Elemental Creature, Vitu-Ghazi,newability[counter(1/1.9)],newability[haste])) forever @@ -7019,6 +7035,17 @@ power=3 toughness=2 [/card] [card] +name=Belligerent Regisaur +abilities=trample +auto=@movedTo(*|mystack):name(Gains indestructible) name(Gains indestructible) all(this) transforms((,newability[indestructible])) ueot +text=Trample -- Whenever you cast a spell, Belligerent Regisaur gains indestructible until end of turn. +color=green +type=Creature +subtype=Dinosaur +power=4 +toughness=3 +[/card] +[card] name=Bellowing Aegisaur auto=_ENRAGE_counter(1/1) all(other creature|mybattlefield) text=Enrage - Whenever Bellowing Aegisaur is dealt damage, put a +1/+1 counter on each other creature you control. @@ -44043,7 +44070,7 @@ auto=counter(0/0.4.Defense) auto=ability$!name(Choose one) choice name(Destroy all legendary creatures) all(creature[legendary]|battlefield) destroy _ choice name(Destroy all non-legendary creatures) all(creature[-legendary]|battlefield) destroy _ choice name(Destroy all creatures) all(creature|battlefield) destroy!$ controller auto=moveto(opponentbattlefield) auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Enchantment) )! asSorcery -text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Fiora enters the battlefield, choose one or both â?? -- â?¢ Destroy all legendary creatures. -- â?¢ Destroy all nonlegendary creatures. +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Fiora enters the battlefield, choose one or both -- Destroy all legendary creatures. -- Destroy all nonlegendary creatures. mana={4}{B}{B} type=Battle subtype=Siege @@ -44064,6 +44091,75 @@ type=Battle subtype=Siege [/card] [card] +name=Invasion of Ixalan +backside=Belligerent Regisaur +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +aicode=activate transforms((,newability[if type(*[-instant;-sorcery;zpos<=5]|myLibrary)~morethan~0 then target(*[-instant;-sorcery;zpos<=5]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=5]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[-instant;-sorcery;zpos<=5]|myLibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot +auto=counter(0/0.4.Defense) +auto=ability$!name(Look top 5 cards) name(Look top 5 cards) reveal:5 optionone name(Get a permanent) target(*[-instant;-sorcery]|reveal) moveto(myhand) optiononeend optiontwo name(Put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend!$ controller +auto=moveto(opponentbattlefield) +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Creature Dinosaur) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Ixalan enters the battlefield, look at the top five cards of your library. You may reveal a permanent card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +mana={1}{G} +type=Battle +subtype=Siege +[/card] +[card] +name=Invasion of Ikoria +backside=Zilortha, Apex of Ikoria +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=counter(0/0.6.Defense) +auto=if compare(fullpaid)~equalto~0 then if type(creature[-human&manacost<=0]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=0]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~0 then if type(creature[-human&manacost<=0]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~1 then if type(creature[-human&manacost<=1]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=1]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~1 then if type(creature[-human&manacost<=1]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~2 then if type(creature[-human&manacost<=2]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=2]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~2 then if type(creature[-human&manacost<=2]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~3 then if type(creature[-human&manacost<=3]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=3]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~3 then if type(creature[-human&manacost<=3]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~4 then if type(creature[-human&manacost<=4]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=4]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~4 then if type(creature[-human&manacost<=4]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~5 then if type(creature[-human&manacost<=5]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=5]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~5 then if type(creature[-human&manacost<=5]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~6 then if type(creature[-human&manacost<=6]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=6]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~6 then if type(creature[-human&manacost<=6]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~7 then if type(creature[-human&manacost<=7]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=7]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~7 then if type(creature[-human&manacost<=7]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~8 then if type(creature[-human&manacost<=8]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=8]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~8 then if type(creature[-human&manacost<=8]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~9 then if type(creature[-human&manacost<=9]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=9]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~9 then if type(creature[-human&manacost<=9]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~10 then if type(creature[-human&manacost<=10]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=10]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~10 then if type(creature[-human&manacost<=10]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~11 then if type(creature[-human&manacost<=11]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=11]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~11 then if type(creature[-human&manacost<=11]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~12 then if type(creature[-human&manacost<=12]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=12]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~12 then if type(creature[-human&manacost<=12]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~13 then if type(creature[-human&manacost<=13]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=13]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~13 then if type(creature[-human&manacost<=13]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~14 then if type(creature[-human&manacost<=14]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=14]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~14 then if type(creature[-human&manacost<=14]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~15 then if type(creature[-human&manacost<=15]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=15]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~15 then if type(creature[-human&manacost<=15]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~16 then if type(creature[-human&manacost<=16]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=16]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~16 then if type(creature[-human&manacost<=16]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~17 then if type(creature[-human&manacost<=17]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=17]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~17 then if type(creature[-human&manacost<=17]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~18 then if type(creature[-human&manacost<=18]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=18]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~18 then if type(creature[-human&manacost<=18]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~equalto~19 then if type(creature[-human&manacost<=19]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=19]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~equalto~19 then if type(creature[-human&manacost<=19]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=if compare(fullpaid)~morethan~19 then if type(creature[-human&manacost<=20]|mygravelibrary)~morethan~0 then name(Search creature) name(Search creature) name(Search creature) target(creature[-human&manacost<=20]|mygravelibrary) moveto(mybattlefield) and!( all(this) moveto(opponentbattlefield) )! +auto=if compare(fullpaid)~morethan~19 then if type(creature[-human&manacost<=20]|mygravelibrary)~equalto~0 then moveto(opponentbattlefield) +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Legendary Creature Dinosaur) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Ikoria enters the battlefield, search your library and/or graveyard for a non-Human creature card with mana value X or less and put it onto the battlefield. If you search your library this way, shuffle. +mana={X}{G}{G} +type=Battle +subtype=Siege +[/card] +[card] name=Invasion of Innistrad abilities=flash backside=Deluge of the Dead @@ -44135,6 +44231,20 @@ type=Battle subtype=Siege [/card] [card] +name=Invasion of Muraganda +backside=Primordial Plasm +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=counter(0/0.6.Defense) +auto=ability$!name(Put counter and fight) name(Put counter and fight) target(creature|mybattlefield) transforms((,newability[counter(1/1)],newability[may name(Fights another creature) target(creature|opponentbattlefield) dynamicability])) ueot!$ controller +auto=moveto(opponentbattlefield) +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Creature Ooze) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Muraganda enters the battlefield, put a +1/+1 counter on target creature you control. Then that creature fights up to one target creature you don't control. +mana={4}{G} +type=Battle +subtype=Siege +[/card] +[card] name=Invasion of Ravnica backside=Guildpact Paragon restriction=compare(isflipped)~equalto~0 @@ -44177,6 +44287,20 @@ type=Battle subtype=Siege [/card] [card] +name=Invasion of Shandalar +backside=Leyline Surge +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=counter(0/0.6.Defense) +auto=ability$!may name(Return 3 permanents) target(*[-instant;-sorcery]|mygraveyard) moveto(ownerhand)!$ controller +auto=moveto(opponentbattlefield) +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Enchantment) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Shandalar enters the battlefield, return up to three target permanent cards from your graveyard to your hand. +mana={3}{G}{G} +type=Battle +subtype=Siege +[/card] +[card] name=Invasion of Tarkir backside=Defiant Thundermaw restriction=compare(isflipped)~equalto~0 @@ -44190,6 +44314,20 @@ type=Battle subtype=Siege [/card] [card] +name=Invasion of the Giants +auto=counter(0/0,1,Lore) +auto=@each my firstmain:counter(0/0,1,Lore) +aicode=activate transforms((,newability[all(*[zpos<=2]|mylibrary) transforms((,newability[may name(Put on bottom of library) moveto(myreveal) and!( bottomoflibrary )!])) oneshot])) oneshot +auto=_SCRY2_ +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) transforms((,newability[draw:1 controller],newability[if type(giant|myhand)~morethan~0 then damage:2 target(player^planeswalker)])) oneshot +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Next giant costs 2 less) target(giant|mycastingzone) transforms((,newability[changecost(colorless:-2)])) ueot +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) sacrifice(this) +text=(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) -- I - Scry 2. -- II - Draw a card. Then you may reveal a Giant card from your hand. When you do, Invasion of the Giants deals 2 damage to target opponent or planeswalker. -- III - The next Giant spell you cast this turn costs 2 less to cast. +mana={U}{R} +type=Enchantment +subtype=Saga +[/card] +[card] name=Invasion of Theros backside=Ephara, Ever-Sheltering restriction=compare(isflipped)~equalto~0 @@ -44233,18 +44371,18 @@ type=Battle subtype=Siege [/card] [card] -name=Invasion of the Giants -auto=counter(0/0,1,Lore) -auto=@each my firstmain:counter(0/0,1,Lore) -aicode=activate transforms((,newability[all(*[zpos<=2]|mylibrary) transforms((,newability[may name(Put on bottom of library) moveto(myreveal) and!( bottomoflibrary )!])) oneshot])) oneshot -auto=_SCRY2_ -auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) transforms((,newability[draw:1 controller],newability[if type(giant|myhand)~morethan~0 then damage:2 target(player^planeswalker)])) oneshot -auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Next giant costs 2 less) target(giant|mycastingzone) transforms((,newability[changecost(colorless:-2)])) ueot -auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) sacrifice(this) -text=(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) -- I - Scry 2. -- II - Draw a card. Then you may reveal a Giant card from your hand. When you do, Invasion of the Giants deals 2 damage to target opponent or planeswalker. -- III - The next Giant spell you cast this turn costs 2 less to cast. -mana={U}{R} -type=Enchantment -subtype=Saga +name=Invasion of Zendikar +backside=Awakened Skyclave +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=counter(0/0.6.Defense) +auto=ability$!may name(Search 2 basic lands) target(land[basic]|mylibrary) moveto(mybattlefield) and!( transforms((,newability[tap(noevent)],newability[shuffle])) oneshot )!!$ controller +auto=moveto(opponentbattlefield) +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Creature Elemental) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. +mana={3}{G} +type=Battle +subtype=Siege [/card] [card] name=Invert // Invent @@ -49730,6 +49868,13 @@ power=2 toughness=3 [/card] [card] +name=Leyline Surge +auto=@each my upkeep:may name(Put permanent in play) target(*[-sorcery;-instant]|myhand) moveto(mybattlefield) +text=At the beginning of your upkeep, you may put a permanent card from your hand onto the battlefield. +color=green +type=Enchantment +[/card] +[card] name=Leyline Tyrant abilities=flying auto=mypoolsave(red) @@ -60332,7 +60477,7 @@ toughness=1 name=Oracle of Tragedy auto=name(Choose one) transforms((,newability[if type(*[manacost>=3]|mygraveyard)~morethan~0 then choice name(Shuffle 4 cards) name(Shuffle 4 cards) target(*[manacost>=3]|mygraveyard) moveto(mylibrary) and!( shuffle )!],newability[choice name(Draw and discard) all(*[zpos=1]|mylibrary) moveto(myhand) and!( transforms((,newability[name(Discard a card) target(*|myhand) reject])) oneshot )!])) oneshot auto=_DIES_name(Choose one) transforms((,newability[if type(*[manacost>=3]|mygraveyard)~morethan~0 then choice name(Shuffle 4 cards) name(Shuffle 4 cards) target(*[manacost>=3]|mygraveyard) moveto(mylibrary) and!( shuffle )!],newability[choice name(Draw and discard) all(*[zpos=1]|mylibrary) moveto(myhand) and!( transforms((,newability[name(Discard a card) target(*|myhand) reject])) oneshot )!])) oneshot -text=When Oracle of Tragedy enters the battlefield or dies, choose one â?? -- â?¢ Draw a card, then discard a card. -- â?¢ Shuffle up to four target cards with mana value 3 or greater from your graveyard into your library. +text=When Oracle of Tragedy enters the battlefield or dies, choose one -- Draw a card, then discard a card. -- Shuffle up to four target cards with mana value 3 or greater from your graveyard into your library. mana={1}{U} type=Creature subtype=Human Wizard @@ -64772,6 +64917,16 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Primordial Plasm +auto=@each my combatbegins:name(Creature loses abilities) target(other *[creature]|battlefield) transforms((,newability[loseabilities],newability[2/2])) ueot +text=At the beginning of combat on your turn, another target creature gets +2/+2 and loses all abilities until end of turn. +color=green +type=Creature +subtype=Ooze +power=4 +toughness=4 +[/card] +[card] name=Primordial Wurm mana={4}{G}{G} type=Creature @@ -84000,7 +84155,7 @@ name=Sunder the Gateway auto=if type(artifact[-token]|opponentbattlefield)~morethan~0 then choice name(Destroy artifact and incubate 2) name(Destroy artifact and incubate 2) target(artifact[-token]|opponentbattlefield) destroy and!( activate castcard(noevent costx!:2:! named!:Incubator:!) )! auto=if type(enchantment|opponentbattlefield)~morethan~0 then choice name(Destroy enchantment and incubate 2) name(Destroy enchantment and incubate 2) target(enchantment|opponentbattlefield) destroy and!( activate castcard(noevent costx!:2:! named!:Incubator:!) )! auto=choice name(Incubate 2 and transform) name(Incubate 2 and transform) emblem transforms((,newability[name(Incubate 2) name(Incubate 2) activate castcard(noevent costx!:2:! named!:Incubator:!)],newability[@movedto(incubator|mybattlefield) turnlimited:name(Choose incubator) name(Choose incubator) target(incubator|mybattlefield) flip(backside)])) ueot -text=Choose one â?? -- â?¢ Destroy target nontoken artifact or enchantment an opponent controls. Incubate 2. (Create an Incubator token with two +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.) -- â?¢ Incubate 2, then transform an Incubator token you control. +text=Choose one -- Destroy target nontoken artifact or enchantment an opponent controls. Incubate 2. (Create an Incubator token with two +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.) -- â?¢ Incubate 2, then transform an Incubator token you control. mana={1}{W} type=Sorcery [/card] @@ -87118,7 +87273,7 @@ auto=name(Transform all incubators) all(incubator|mybattlefield) flip(backside) auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) name(Creatures gain 1/1) all(creature|mybattlefield) transforms((,newability[1/1],newability[double strike])) ueot auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Destroy all prermanents) all(other *[-land;-phyrexian;-artifact]) destroy auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Exile and return) moveto(myexile) and!( moveto(mybattlefield) )! -text=(As this Saga enters and after your draw step, add a lore counter.) -- I â?? Incubate 2 five times, then transform all Incubator tokens you control. -- II â?? Creatures you control get +1/+1 and gain double strike until end of turn. -- III â?? Destroy all other permanents except for artifacts, lands, and Phyrexians. Exile The Argent Etchings, then return it to the battlefield (front face up). +text=(As this Saga enters and after your draw step, add a lore counter.) -- I - Incubate 2 five times, then transform all Incubator tokens you control. -- II - Creatures you control get +1/+1 and gain double strike until end of turn. -- III - Destroy all other permanents except for artifacts, lands, and Phyrexians. Exile The Argent Etchings, then return it to the battlefield (front face up). type=Enchantment subtype=Saga [/card] @@ -87470,7 +87625,7 @@ auto=draw:type:*:myhand controller auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) name(Return creatures) all(creature[-phyrexian]|battlefield) moveto(ownerhand) auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Cast spells for zero) target(*[-land]|myhand) activate castcard(normal) auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Exile and return) moveto(myexile) and!( moveto(mybattlefield) )! -text=(As this Saga enters and after your draw step, add a lore counter.) -- I â?? Draw cards equal to the number of cards in your hand. You have no maximum hand size for as long as you control The Great Synthesis. -- II â?? Return all non-Phyrexian creatures to their owners' hands. -- III â?? You may cast any number of spells from your hand without paying their mana costs. Exile The Great Synthesis, then return it to the battlefield (front face up). +text=(As this Saga enters and after your draw step, add a lore counter.) -- I - Draw cards equal to the number of cards in your hand. You have no maximum hand size for as long as you control The Great Synthesis. -- II - Return all non-Phyrexian creatures to their owners' hands. -- III - You may cast any number of spells from your hand without paying their mana costs. Exile The Great Synthesis, then return it to the battlefield (front face up). type=Enchantment subtype=Saga [/card] @@ -87784,7 +87939,7 @@ auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) name(Oppone auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) name(Opponent discards 3 cards) ability$!name(Discards 3 cards) name(Discards 3 cards) notatarget(<3>*|myhand) reject!$ opponent auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Return all creatures) all(creature|graveyard) moveto(mybattlefield) auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Exile and return) moveto(myexile) and!( moveto(mybattlefield) )! -text=(As this Saga enters and after your draw step, add a lore counter.) -- I â?? For each opponent, destroy up to one target creature or planeswalker that player controls. -- II â?? Each opponent discards three cards, then mills three cards. -- III â?? Put all creature cards from all graveyards onto the battlefield under your control. Exile The True Scriptures, then return it to the battlefield (front face up). +text=(As this Saga enters and after your draw step, add a lore counter.) -- I - For each opponent, destroy up to one target creature or planeswalker that player controls. -- II - Each opponent discards three cards, then mills three cards. -- III - Put all creature cards from all graveyards onto the battlefield under your control. Exile The True Scriptures, then return it to the battlefield (front face up). color=black type=Enchantment subtype=Saga @@ -99524,6 +99679,17 @@ power=6 toughness=6 [/card] [card] +name=Zilortha, Apex of Ikoria +abilities=reach +auto=@combat(blocked) source(creature[-human]|mybattlefield):may name(assign combat damage to defending player) all(trigger[to]) transforms((,newability[name(Deals damage) damage:power target(opponent)],newability[fog from(this)])) oneshot +text=Reach -- For each non-Human creature you control, you may have that creature assign its combat damage as though it weren't blocked. +color=green +type=Legendary Creature +subtype=Dinosaur +power=8 +toughness=8 +[/card] +[card] name=Zimone, Quandrix Prodigy auto={1}{T}:name(Put land in play) target(land|myhand) moveto(mybattlefield) and!( tap(noevent) )! auto=this(variable{type:land:mybattlefield}<8) {4}{T}:name(Draw 1 card) draw:1 controller diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 9d5e0559b..efa36b2a1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1557,7 +1557,7 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, for(int i = 0; i < checkWalkers;++i) { check = ((Player*)_target)->game->battlefield->cards[i]; - if(check->hasType(Subtypes::TYPE_PLANESWALKER) || check->hasType(Subtypes::TYPE_BATTLE)) + if(check->hasType(Subtypes::TYPE_PLANESWALKER)) { this->redirected = true; MTGAbility * setWalker = this->clone(); diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index c4f9b7583..5e92f2a8d 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -283,6 +283,26 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta zones[nbzones++] = MTGGameZone::MY_HAND; zones[nbzones++] = MTGGameZone::MY_LIBRARY; } + else if (zoneName.compare("mygravelibrary") == 0) + { + zones[nbzones++] = MTGGameZone::MY_GRAVEYARD; + zones[nbzones++] = MTGGameZone::MY_LIBRARY; + } + else if (zoneName.compare("opponentgravelibrary") == 0) + { + zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD; + zones[nbzones++] = MTGGameZone::OPPONENT_LIBRARY; + } + else if (zoneName.compare("mygraveexile") == 0) + { + zones[nbzones++] = MTGGameZone::MY_EXILE; + zones[nbzones++] = MTGGameZone::MY_GRAVEYARD; + } + else if (zoneName.compare("opponentgraveexile") == 0) + { + zones[nbzones++] = MTGGameZone::OPPONENT_EXILE; + zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD; + } else if (zoneName.compare("opponentcastingzone") == 0) { zones[nbzones++] = MTGGameZone::OPPONENT_GRAVEYARD;