Added/fixed primitives, updated the "missing_cards_by_sets" folder, improved all cards with replicate (now they use a special version of multikicker but they don't count as kicked spell), improved all cards with "fizzle" and "fizzleto" ability and improved engine for "fizzle" and "nofizzle" ability (e.g. now it's possible to grant a card the nofizzle ability on stack), added new keyword "mycolnum" to count the number colors of a card.

This commit is contained in:
Vittorio Alfieri
2021-08-31 20:06:33 +02:00
parent 45de20c8d3
commit 54d0c32035
28 changed files with 455 additions and 616 deletions
+4 -1
View File
@@ -2,8 +2,11 @@
## [master] (https://github.com/WagicProject/wagic/tree/master)
### 31/08/21
- *Committed:* Added/fixed primitives, updated the "missing_cards_by_sets" folder, improved all cards with replicate (now they use a special version of multikicker but they don't count as kicked spell), improved all cards with "fizzle" and "fizzleto" ability and improved engine for "fizzle" and "nofizzle" ability (e.g. now it's possible to grant a card the nofizzle ability on stack), added new keyword "mycolnum" to count the number colors of a card. ([Vitty85](https://github.com/Vitty85))
### 30/08/21
- *Committed:* Added/fixed primitives, updated the "missing_cards_by_sets" folder, added a new trigger when a player shuffles his/her library, added new keywords "plastshlturn" and "olastshlturn" to retrieve the last turn a player shuffled his/her library, refactoring of some source files. ([Vitty85](https://github.com/Vitty85))
- *Committed:* Added/fixed primitives, updated the "missing_cards_by_sets" folder, added a new trigger when a player shuffles his/her library, added new keywords "plastshlturn" and "olastshlturn" to retrieve the last turn a player shuffled his/her library, refactoring of some source files. https://github.com/WagicProject/wagic/commit/45de20c8d3f0449e33286fad09b000a695b07c24 ([Vitty85](https://github.com/Vitty85))
- *Committed:* Fixed dat file for J21 set, improved Android downloader for J21 set. https://github.com/WagicProject/wagic/commit/e1f91a50f6fa607ad3672433e00ceb1c25feb631 ([Vitty85](https://github.com/Vitty85))
@@ -28,15 +28,6 @@ power=0
toughness=4
[/card]
[card]
name=Phyrexian Revoker
text=As Phyrexian Revoker enters the battlefield, name a nonland card. -- Activated abilities of sources with the chosen name can't be activated.
mana={2}
type=Artifact Creature
subtype=Horror
power=2
toughness=1
[/card]
[card]
name=Council's Judgment
text=Will of the council — Starting with you, each player votes for a nonland permanent you don't control. Exile each permanent with the most votes or tied for most votes.
mana={1}{W}{W}
@@ -20,25 +20,3 @@ mana={2}{U}
type=Enchantment
subtype=Aura
[/card]
[card]
name=Grafted Wargear
text=Equipped creature gets +3/+2. -- Whenever Grafted Wargear becomes unattached from a permanent, sacrifice that permanent. -- Equip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.)
mana={3}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Plunge into Darkness
text=Choose one — Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature; or pay X life, then look at the top X cards of your library, put one of those cards into your hand, and exile the rest. -- Entwine {B} (Choose both if you pay the entwine cost.)
mana={1}{B}
type=Instant
[/card]
[card]
name=Summoner's Egg
text=Imprint — When Summoner's Egg enters the battlefield, you may exile a card from your hand face down. -- When Summoner's Egg dies, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control.
mana={4}
type=Artifact Creature
subtype=Construct
power=0
toughness=4
[/card]
@@ -62,9 +62,3 @@ text=The next time you would lose the game this turn, instead draw seven cards a
mana={3}{B}
type=Instant
[/card]
[card]
name=Blood Feud
text=Target creature fights another target creature. (Each deals damage equal to its power to the other.)
mana={4}{R}{R}
type=Sorcery
[/card]
@@ -132,10 +132,3 @@ subtype=Cat Scout
power=2
toughness=2
[/card]
[card]
name=Grafted Wargear
text=Equipped creature gets +3/+2. -- Whenever Grafted Wargear becomes unattached from a permanent, sacrifice that permanent. -- Equip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.)
mana={3}
type=Artifact
subtype=Equipment
[/card]
@@ -6,12 +6,6 @@ type=Artifact
subtype=Equipment
[/card]
[card]
name=Bound // Determined
text=Sacrifice a creature. Return up to X cards from your graveyard to your hand, where X is the number of colors that creature was. Exile this card. -- // -- Other spells you control can't be countered by spells or abilities this turn. -- Draw a card.
mana={3}{B}{G} // {G}{U}
type=Instant // Instant
[/card]
[card]
name=Kill-Suit Cultist
text=Kill-Suit Cultist attacks each turn if able. -- {B}, Sacrifice Kill-Suit Cultist: The next time damage would be dealt to target creature this turn, destroy that creature instead.
mana={R}
@@ -1,16 +1,4 @@
[card]
name=Counterlash
text=Counter target spell. You may cast a nonland card in your hand that shares a card type with that spell without paying its mana cost.
mana={4}{U}{U}
type=Instant
[/card]
[card]
name=Blood Feud
text=Target creature fights another target creature. (Each deals damage equal to its power to the other.)
mana={4}{R}{R}
type=Sorcery
[/card]
[card]
name=Call to the Kindred
text=Enchant creature -- At the beginning of your upkeep, you may look at the top five cards of your library. If you do, you may put a creature card that shares a creature type with enchanted creature from among them onto the battlefield, then you put the rest of those cards on the bottom of your library in any order.
mana={3}{U}
@@ -1,10 +1,4 @@
[card]
name=Dragonlord's Prerogative
text=As an additional cost to cast Dragonlord's Prerogative, you may reveal a Dragon card from your hand. -- If you revealed a Dragon card or controlled a Dragon as you cast Dragonlord's Prerogative, Dragonlord's Prerogative can't be countered. -- Draw four cards.
mana={4}{U}{U}
type=Instant
[/card]
[card]
name=Salt Road Ambushers
text=Whenever another permanent you control is turned face up, if it's a creature, put two +1/+1 counters on it. -- Megamorph {3}{G}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)
mana={3}{G}
@@ -36,15 +36,6 @@ power=4
toughness=6
[/card]
[card]
name=Orzhov Pontiff
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Orzhov Pontiff enters the battlefield or the creature it haunts dies, choose one — Creatures you control get +1/+1 until end of turn; or creatures you don't control get -1/-1 until end of turn.
mana={1}{W}{B}
type=Creature
subtype=Human Cleric
power=1
toughness=1
[/card]
[card]
name=Rakdos, Lord of Riots
text=You can't cast Rakdos, Lord of Riots unless an opponent lost life this turn. -- Flying, trample -- Creature spells you cast cost {1} less to cast for each 1 life your opponents have lost this turn.
mana={B}{B}{R}{R}
@@ -23,56 +23,6 @@ mana={3}
type=Artifact
[/card]
[card]
name=Blind Hunter
abilities=flying
text=Flying -- Haunt (When this creature dies, exile it haunting target creature.) -- When Blind Hunter enters the battlefield or the creature it haunts dies, target player loses 2 life and you gain 2 life.
mana={2}{W}{B}
type=Creature
subtype=Bat
power=2
toughness=2
[/card]
[card]
name=Graven Dominator
abilities=flying
text=Flying -- Haunt (When this creature dies, exile it haunting target creature.) -- When Graven Dominator enters the battlefield or the creature it haunts dies, each other creature becomes 1/1 until end of turn.
mana={4}{W}{W}
type=Creature
subtype=Gargoyle
power=4
toughness=4
[/card]
[card]
name=Orzhov Euthanist
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Orzhov Euthanist enters the battlefield or the creature it haunts dies, destroy target creature that was dealt damage this turn.
mana={2}{B}
type=Creature
subtype=Human Assassin
power=2
toughness=2
[/card]
[card]
name=Mimeofacture
text=Replicate {3}{U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -- Choose target permanent an opponent controls. Search that player's library for a card with the same name and put it onto the battlefield under your control. Then that player shuffles his or her library.
mana={3}{U}
type=Sorcery
[/card]
[card]
name=Orzhov Pontiff
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Orzhov Pontiff enters the battlefield or the creature it haunts dies, choose one — Creatures you control get +1/+1 until end of turn; or creatures you don't control get -1/-1 until end of turn.
mana={1}{W}{B}
type=Creature
subtype=Human Cleric
power=1
toughness=1
[/card]
[card]
name=Cry of Contrition
text=Target player discards a card. -- Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -- When the creature Cry of Contrition haunts dies, target player discards a card.
mana={B}
type=Sorcery
[/card]
[card]
name=Bioplasm
text=Whenever Bioplasm attacks, exile the top card of your library. If it's a creature card, Bioplasm gets +X/+Y until end of turn, where X is the exiled creature card's power and Y is its toughness.
mana={3}{G}{G}
@@ -91,12 +41,6 @@ power=1
toughness=1
[/card]
[card]
name=Seize the Soul
text=Destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield. -- Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -- When the creature Seize the Soul haunts dies, destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield.
mana={2}{B}{B}
type=Instant
[/card]
[card]
name=Burning-Tree Shaman
text=Whenever a player activates an ability that isn't a mana ability, Burning-Tree Shaman deals 1 damage to that player.
mana={1}{R}{G}
@@ -1,19 +1,4 @@
[card]
name=Savage Summoning
text=Savage Summoning can't be countered. -- The next creature card you cast this turn can be cast as though it had flash. That spell can't be countered. That creature enters the battlefield with an additional +1/+1 counter on it.
mana={G}
type=Instant
[/card]
[card]
name=Elite Arcanist
text=When Elite Arcanist enters the battlefield, you may exile an instant card from your hand. -- {X}, {T}: Copy the exiled card. You may cast the copy without paying its mana cost. X is the converted mana cost of the exiled card.
mana={3}{U}
type=Creature
subtype=Human Wizard
power=1
toughness=1
[/card]
[card]
name=Strionic Resonator
text={2}, {T}: Copy target triggered ability you control. You may choose new targets for the copy. (A triggered ability uses the words "when," "whenever," or "at.")
mana={2}
@@ -38,15 +38,6 @@ power=4
toughness=4
[/card]
[card]
name=Phyrexian Revoker
text=As Phyrexian Revoker enters the battlefield, name a nonland card. -- Activated abilities of sources with the chosen name can't be activated.
mana={2}
type=Artifact Creature
subtype=Horror
power=2
toughness=1
[/card]
[card]
name=Hushwing Gryff
abilities=flash,flying
text=Flash -- Flying -- Creatures entering the battlefield don't cause abilities to trigger.
@@ -1,13 +1,4 @@
[card]
name=Phyrexian Revoker
text=As Phyrexian Revoker enters the battlefield, name a nonland card. -- Activated abilities of sources with the chosen name can't be activated.
mana={2}
type=Artifact Creature
subtype=Horror
power=2
toughness=1
[/card]
[card]
name=Knowledge Pool
text=Imprint — When Knowledge Pool enters the battlefield, each player exiles the top three cards of his or her library. -- Whenever a player casts a spell from his or her hand, that player exiles it. If the player does, he or she may cast another nonland card exiled with Knowledge Pool without paying that card's mana cost.
mana={6}
@@ -37,13 +37,6 @@ mana={6}
type=Legendary Artifact
[/card]
[card]
name=Grafted Exoskeleton
text=Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- Whenever Grafted Exoskeleton becomes unattached from a permanent, sacrifice that permanent. -- Equip {2}
mana={4}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Leonin Arbiter
text=Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn.
mana={1}{W}
@@ -1,7 +0,0 @@
[card]
name=Grafted Exoskeleton
text=Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- Whenever Grafted Exoskeleton becomes unattached from a permanent, sacrifice that permanent. -- Equip {2}
mana={4}
type=Artifact
subtype=Equipment
[/card]
@@ -1,22 +1,10 @@
[card]
name=Insist
text=The next creature spell you cast this turn can't be countered by spells or abilities. -- Draw a card.
mana={G}
type=Sorcery
[/card]
[card]
name=Alter Reality
text=Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) -- Flashback {1}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
mana={1}{U}
type=Instant
[/card]
[card]
name=Overmaster
text=The next instant or sorcery spell you cast this turn can't be countered by spells or abilities. -- Draw a card.
mana={R}
type=Sorcery
[/card]
[card]
name=Radiate
text=Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players.
mana={3}{R}{R}
File diff suppressed because it is too large Load Diff
+16 -15
View File
@@ -4236,7 +4236,7 @@ type=Instant
[/card]
[card]
name=Annul
target=artifact,enchantment|stack
target=*[artifact;enchantment]|stack
auto=fizzle
text=Counter target artifact or enchantment spell.
mana={U}
@@ -4896,8 +4896,8 @@ toughness=7
[card]
name=Arcane Denial
target=*|stack
auto=@next upkeep:draw:1 controller
auto=target(*|stack) transforms((,newability[fizzle],newability[phaseaction[upkeep once] draw:2 controller]))
auto=phaseaction[upkeep next once] draw:1 controller
auto=transforms((,newability[fizzle],newability[phaseaction[upkeep next once] draw:2 controller]))
text=Counter target spell. Its controller may draw up to two cards at the beginning of the next turn's upkeep. -- You draw a card at the beginning of the next turn's upkeep.
mana={1}{U}
type=Instant
@@ -21801,7 +21801,7 @@ toughness=1
[/card]
[card]
name=Confirm Suspicions
target=*|mystack
target=*|stack
auto=fizzle
auto=name(Create clue) token(Clue)*3 controller
text=Counter target spell. -- Investigate three times. (To investigate, put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.")
@@ -36761,7 +36761,7 @@ toughness=1
[/card]
[card]
name=Ertai, the Corrupted
auto={U}{T}{S(creature,enchantment|myBattlefield)}:fizzle target(*|stack)
auto={U}{T}{S(*[creature;enchantment]|myBattlefield)}:fizzle target(*|stack)
text={U}, {T}, Sacrifice a creature or enchantment: Counter target spell.
mana={2}{W}{U}{B}
type=Legendary Creature
@@ -68356,7 +68356,7 @@ type=Instant
name=Lost in the Mist
target=*|stack
auto=fizzle
auto=moveTo(ownerhand) target(*)
auto=moveTo(ownerhand) target(*|battlefield)
text=Counter target spell. Return target permanent to its owner's hand.
mana={3}{U}{U}
type=Instant
@@ -72026,7 +72026,7 @@ toughness=2
name=Mausoleum Wanderer
abilities=flying
auto=@movedto(spirit|mybattlefield):1/1 ueot
auto={s}:target(instant,sorcery|opponentstack) transforms((,newability[pay[[{value:storedpower}]] name(pay {value} mana) donothing?fizzle])) forever
auto={s}:target(*[instant;sorcery]|opponentstack) transforms((,newability[pay[[{value:storedpower}]] name(pay {value} mana) donothing?fizzle])) forever
text=Flying -- Whenever another Spirit enters the battlefield under your control, Mausoleum Wanderer gets +1/+1 until end of turn. -- Sacrifice Mausoleum Wanderer: Counter target instant or sorcery spell unless its controller pays {X}, where X is Mausoleum Wanderer's power.
mana={U}
type=Creature
@@ -76940,7 +76940,7 @@ toughness=1
[/card]
[card]
name=Muddle the Mixture
target=instant,sorcery|stack
target=*[instant;sorcery]|stack
auto=fizzle
aicode=activate target(*[manacost=2]|mylibrary) moveto(myhand)
autohand={1}{U}{U}{discard}:name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>*[manacost=2]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend asSorcery
@@ -77848,7 +77848,7 @@ type=Sorcery
[card]
name=Mystic Snake
abilities=flash
auto=if type(*|stack)~morethan~0 then fizzle target(*|stack)
auto=fizzle target(*|stack)
text=Flash (You may cast this spell any time you could cast an instant.) -- When Mystic Snake enters the battlefield, counter target spell.
mana={1}{G}{U}{U}
type=Creature
@@ -89602,7 +89602,7 @@ type=Instant
name=Punish Ignorance
target=*|stack
auto=fizzle
auto=life:-3 opponent
auto=life:-3 targetcontroller
auto=life:3 controller
text=Counter target spell. Its controller loses 3 life and you gain 3 life.
mana={W}{U}{U}{B}
@@ -90262,7 +90262,7 @@ type=Enchantment
[/card]
[card]
name=Quash
target=instant,sorcery|stack
target=*[instant;sorcery]|stack
auto=fizzle
auto=all(*[share!name!]|targetcontrollerlibrary) moveto(exile)
auto=all(*[share!name!]|targetcontrollerhand) moveto(exile)
@@ -94871,7 +94871,7 @@ type=Enchantment
name=Rewind
target=*|stack
auto=fizzle
auto=may untap target(<upto:4>land)
auto=may name(Untap lands) untap target(<upto:4>land)
text=Counter target spell, then untap up to four lands.
mana={2}{U}{U}
type=Instant
@@ -110702,7 +110702,7 @@ toughness=6
[card]
name=Sphinx of the Final Word
abilities=nofizzle,flying,opponentshroud
auto=@targeted(*[instant;sorcery]|mystack) from(instant|opponentzones):choice name(Instant and sorcery can't be countered) name(Instant and sorcery can't be countered) all(instant|opponentzones) fizzle
auto=lord(*[instant;sorcery]|mystack) nofizzle
text=Sphinx of the Final Word can't be countered. -- Flying, hexproof -- Instant and sorcery spells you control can't be countered by spells or abilities.
mana={5}{U}{U}
type=Creature
@@ -123392,7 +123392,7 @@ toughness=3
[/card]
[card]
name=Trap Essence
target=*[creature]|stack
target=creature|stack
auto=fizzle
auto=may counter(1/1,2) target(creature)
text=Counter target creature spell. Put two +1/+1 counters on up to one target creature.
@@ -126346,7 +126346,8 @@ toughness=1
[card]
name=Unyaro Griffin
abilities=flying
auto={S}:fizzle target(instant[red],sorcery[red]|stack)
auto={S}:name(Counter red instant) fizzle target(instant[red]|stack)
auto={S}:name(Counter red sorcery) fizzle target(sorcery[red]|stack)
text=Flying -- Sacrifice Unyaro Griffin: Counter target red instant or sorcery spell.
mana={3}{W}
type=Creature
@@ -662,9 +662,9 @@ subtype=Davriel
[card]
name=Domri, Anarch of Bolas
auto=counter(0/0,3,loyalty)
auto=lord(other creature|myBattlefield) +1/+0
auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) transforms((,newability[add{R}],newability[@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle])) ueot
auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) transforms((,newability[add{G}],newability[@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle])) ueot
auto=lord(other creature|myBattlefield) 1/0
auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) transforms((,newability[add{R}],newability[lord(creature|mystack) nofizzle])) ueot
auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) transforms((,newability[add{G}],newability[lord(creature|mystack) nofizzle])) ueot
auto={C(0/0,-2,Loyalty)}:name(-2: Target creature fights another creature) target(creature|myBattlefield) transforms((,newability[target(creature|opponentbattlefield) dynamicability<!powerstrike eachother!>])) ueot
text=Creatures you control get +1/+0. -- +1: Add {R} or {G}. Creature spells you cast this turn can't be countered. -- -2: Target creature you control fights target creature you don't control.
mana={1}{R}{G}
@@ -911,22 +911,6 @@ power=4
toughness=3
[/card]
[card]
name=Blind Hunter
abilities=flying
text=Flying -- Haunt (When this creature dies, exile it haunting target creature.) -- When Blind Hunter enters the battlefield or the creature it haunts dies, target player loses 2 life and you gain 2 life.
mana={2}{W}{B}
type=Creature
subtype=Bat
power=2
toughness=2
[/card]
[card]
name=Blood Feud
text=Target creature fights another target creature. (Each deals damage equal to its power to the other.)
mana={4}{R}{R}
type=Sorcery
[/card]
[card]
name=Blood Funnel
text=Noncreature spells you cast cost {2} less to cast. -- Whenever you cast a noncreature spell, counter that spell unless you sacrifice a creature.
mana={1}{B}
@@ -1113,12 +1097,6 @@ power=1
toughness=4
[/card]
[card]
name=Bound // Determined
text=Sacrifice a creature. Return up to X cards from your graveyard to your hand, where X is the number of colors that creature was. Exile this card. -- // -- Other spells you control can't be countered by spells or abilities this turn. -- Draw a card.
mana={3}{B}{G} // {G}{U}
type=Instant // Instant
[/card]
[card]
name=Brago's Favor
text=Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.) -- Spells with the chosen name you cast cost {1} less to cast.
type=Conspiracy
@@ -2037,12 +2015,6 @@ mana={U}{U}
type=Enchantment
[/card]
[card]
name=Counterlash
text=Counter target spell. You may cast a nonland card in your hand that shares a card type with that spell without paying its mana cost.
mana={4}{U}{U}
type=Instant
[/card]
[card]
name=Covenant of Minds
text=Reveal the top three cards of your library. Target opponent may choose to put those cards into your hand. If he or she doesn't, put those cards into your graveyard and draw five cards.
mana={4}{U}
@@ -2164,12 +2136,6 @@ mana={5}
type=Artifact
[/card]
[card]
name=Cry of Contrition
text=Target player discards a card. -- Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -- When the creature Cry of Contrition haunts dies, target player discards a card.
mana={B}
type=Sorcery
[/card]
[card]
name=Cryptic Gateway
text=Tap two untapped creatures you control: You may put a creature card from your hand that shares a creature type with each creature tapped this way onto the battlefield.
mana={5}
@@ -2800,12 +2766,6 @@ power=0
toughness=0
[/card]
[card]
name=Dragonlord's Prerogative
text=As an additional cost to cast Dragonlord's Prerogative, you may reveal a Dragon card from your hand. -- If you revealed a Dragon card or controlled a Dragon as you cast Dragonlord's Prerogative, Dragonlord's Prerogative can't be countered. -- Draw four cards.
mana={4}{U}{U}
type=Instant
[/card]
[card]
name=Drain Power
text=Target player activates a mana ability of each land he or she controls. Then put all mana from that player's mana pool into yours.
mana={U}{U}
@@ -2944,15 +2904,6 @@ type=Enchantment
subtype=Aura
[/card]
[card]
name=Elite Arcanist
text=When Elite Arcanist enters the battlefield, you may exile an instant card from your hand. -- {X}, {T}: Copy the exiled card. You may cast the copy without paying its mana cost. X is the converted mana cost of the exiled card.
mana={3}{U}
type=Creature
subtype=Human Wizard
power=1
toughness=1
[/card]
[card]
name=Elkin Lair
text=At the beginning of each player's upkeep, that player exiles a card at random from his or her hand. The player may play that card this turn. At the beginning of the next end step, if the player hasn't played the card, he or she puts it into his or her graveyard.
mana={3}{R}
@@ -4294,20 +4245,6 @@ mana={1}
type=Artifact
[/card]
[card]
name=Grafted Exoskeleton
text=Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- Whenever Grafted Exoskeleton becomes unattached from a permanent, sacrifice that permanent. -- Equip {2}
mana={4}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Grafted Wargear
text=Equipped creature gets +3/+2. -- Whenever Grafted Wargear becomes unattached from a permanent, sacrifice that permanent. -- Equip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.)
mana={3}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Grand Ossuary
text=Whenever a creature dies, its controller distributes a number of +1/+1 counters equal to its power among any number of target creatures he or she controls. -- Whenever you roll {K}, each player exiles all creatures he or she controls and puts X 1/1 green Saproling creature tokens onto the battlefield, where X is the total power of the creatures he or she exiled this way. Then planeswalk.
type=Plane
@@ -4342,16 +4279,6 @@ power=5
toughness=7
[/card]
[card]
name=Graven Dominator
abilities=flying
text=Flying -- Haunt (When this creature dies, exile it haunting target creature.) -- When Graven Dominator enters the battlefield or the creature it haunts dies, each other creature becomes 1/1 until end of turn.
mana={4}{W}{W}
type=Creature
subtype=Gargoyle
power=4
toughness=4
[/card]
[card]
name=Graveyard Busybody
text=All graveyards are also your graveyards. -- Graveyard Busybody's power and toughness are each equal to the number of cards with flavor text in your graveyards.
mana={4}{U}{U}
@@ -5214,12 +5141,6 @@ power=3
toughness=3
[/card]
[card]
name=Insist
text=The next creature spell you cast this turn can't be countered by spells or abilities. -- Draw a card.
mana={G}
type=Sorcery
[/card]
[card]
name=Inspiring Statuary
text=Nonartifact spells you cast have improvise. (Your artifacts can help cast those spells. Each artifact you tap after you're done activating mana abilities pays for {1}.)
mana={3}
@@ -6687,12 +6608,6 @@ mana={5}{R}
type=Enchantment
[/card]
[card]
name=Mimeofacture
text=Replicate {3}{U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) -- Choose target permanent an opponent controls. Search that player's library for a card with the same name and put it onto the battlefield under your control. Then that player shuffles his or her library.
mana={3}{U}
type=Sorcery
[/card]
[card]
name=Minamo's Meddling
text=Counter target spell. That spell's controller reveals his or her hand, then discards each card with the same name as a card spliced onto that spell.
mana={2}{U}{U}
@@ -7799,24 +7714,6 @@ type=Plane
subtype=Kamigawa
[/card]
[card]
name=Orzhov Euthanist
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Orzhov Euthanist enters the battlefield or the creature it haunts dies, destroy target creature that was dealt damage this turn.
mana={2}{B}
type=Creature
subtype=Human Assassin
power=2
toughness=2
[/card]
[card]
name=Orzhov Pontiff
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Orzhov Pontiff enters the battlefield or the creature it haunts dies, choose one — Creatures you control get +1/+1 until end of turn; or creatures you don't control get -1/-1 until end of turn.
mana={1}{W}{B}
type=Creature
subtype=Human Cleric
power=1
toughness=1
[/card]
[card]
name=Oubliette
text=When Oubliette enters the battlefield, exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. -- When Oubliette leaves the battlefield, return the exiled card to the battlefield under its owner's control tapped with the noted number and kind of counters on it. If you do, return the exiled Aura cards to the battlefield under their owner's control attached to that permanent.
mana={1}{B}{B}
@@ -7864,12 +7761,6 @@ type=Instant
subtype=Arcane
[/card]
[card]
name=Overmaster
text=The next instant or sorcery spell you cast this turn can't be countered by spells or abilities. -- Draw a card.
mana={R}
type=Sorcery
[/card]
[card]
name=Overt Operative
text=Menace -- Whenever Overt Operative deals combat damage to a player, it assembles a Contraption. (Put the top card of your Contraption deck face up onto one of your sprockets.)
mana={3}{B}
@@ -8101,15 +7992,6 @@ mana={3}
type=Artifact
[/card]
[card]
name=Phyrexian Revoker
text=As Phyrexian Revoker enters the battlefield, name a nonland card. -- Activated abilities of sources with the chosen name can't be activated.
mana={2}
type=Artifact Creature
subtype=Horror
power=2
toughness=1
[/card]
[card]
name=Pia's Revolution
text=Whenever a nontoken artifact is put into your graveyard from the battlefield, return that card to your hand unless target opponent has Pia's Revolution deal 3 damage to him or her.
mana={2}{R}
@@ -8239,12 +8121,6 @@ mana={3}{U}
type=Sorcery
[/card]
[card]
name=Plunge into Darkness
text=Choose one — Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature; or pay X life, then look at the top X cards of your library, put one of those cards into your hand, and exile the rest. -- Entwine {B} (Choose both if you pay the entwine cost.)
mana={1}{B}
type=Instant
[/card]
[card]
name=Pointy Finger of Doom
text={3}, {T}: Spin Pointy Finger of Doom in the middle of the table so that it rotates completely at least once, then destroy the closest permanent the finger points to.
mana={4}
@@ -9203,12 +9079,6 @@ mana={1}{R}{R}
type=Instant
[/card]
[card]
name=Savage Summoning
text=Savage Summoning can't be countered. -- The next creature card you cast this turn can be cast as though it had flash. That spell can't be countered. That creature enters the battlefield with an additional +1/+1 counter on it.
mana={G}
type=Instant
[/card]
[card]
name=Save Life
text=Choose one Target player gains 2½ life; or prevent the next 2½ damage that would be dealt to target creature this turn. -- Gotcha Whenever an opponent says "Save" or "Life," you may say "Gotcha" If you do, return Save Life from your graveyard to your hand.
mana={W}
@@ -9330,12 +9200,6 @@ text=Hidden agenda (Start the game with this conspiracy face down in the command
type=Conspiracy
[/card]
[card]
name=Seize the Soul
text=Destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield. -- Haunt (When this spell card is put into a graveyard after resolving, exile it haunting target creature.) -- When the creature Seize the Soul haunts dies, destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield.
mana={2}{B}{B}
type=Instant
[/card]
[card]
name=Selective Adaptation
text=Reveal the top seven cards of your library. Choose from among them a card with flying, a card with first strike, and so on for double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, trample, and vigilance. Put one of the chosen cards onto the battlefield, the other chosen cards into your hand, and the rest into your graveyard.
mana={4}{G}{G}
@@ -10717,15 +10581,6 @@ text=Double agenda (Start the game with this conspiracy face down in the command
type=Conspiracy
[/card]
[card]
name=Summoner's Egg
text=Imprint — When Summoner's Egg enters the battlefield, you may exile a card from your hand face down. -- When Summoner's Egg dies, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control.
mana={4}
type=Artifact Creature
subtype=Construct
power=0
toughness=4
[/card]
[card]
name=Suncleanser
text=When Suncleanser enters the battlefield, choose one — -- • Remove all counters from target creature. It can't have counters put on it for as long as Suncleanser remains on the battlefield. -- • Target opponent loses all counters. That player can't get counters for as long as Suncleanser remains on the battlefield.
mana={1}{W}
+2 -1
View File
@@ -197,7 +197,8 @@ public:
PUT_IN_GRAVEARD,
PUT_IN_HAND,
PUT_IN_LIBRARY_TOP,
PUT_IN_EXILE
PUT_IN_EXILE,
PUT_IN_LIBRARY_BOTTOM
} FizzleMode;
protected:
+2 -1
View File
@@ -321,7 +321,8 @@ class Constants
WASCOMMANDER = 194,
SHOWOPPONENTHAND = 195,
SHOWCONTROLLERHAND = 196,
NB_BASIC_ABILITIES = 197,
HASREPLICATE = 197,
NB_BASIC_ABILITIES = 198,
RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics
+15 -1
View File
@@ -1377,7 +1377,21 @@ void ActionStack::Fizzle(Interruptible * action, FizzleMode fizzleMode)
spell->source->controller()->game->putInExile(spell->source);
break;
case PUT_IN_LIBRARY_TOP:
spell->source->controller()->game->putInLibrary(spell->source);
case PUT_IN_LIBRARY_BOTTOM:
MTGCardInstance * _target = spell->source->controller()->game->putInLibrary(spell->source);
if (_target && fizzleMode == PUT_IN_LIBRARY_BOTTOM){
MTGLibrary * library = _target->owner->game->library;
vector<MTGCardInstance *>oldOrder = library->cards;
vector<MTGCardInstance *>newOrder;
newOrder.push_back(_target);
for(unsigned int k = 0;k < oldOrder.size();++k)
{
MTGCardInstance * rearranged = oldOrder[k];
if(rearranged != _target)
newOrder.push_back(rearranged);
}
library->cards = newOrder;
}
break;
}
}
+2 -2
View File
@@ -165,7 +165,7 @@ MTGCardInstance * CardDescriptor::match_or(MTGCardInstance * card)
// Quantified restrictions are always AND-ed:
if (foretoldComparisonMode && !valueInRange(foretoldComparisonMode, card->foretellTurn, foretellTurn))
return NULL;
if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked))
if (kickedComparisonMode && (!valueInRange(kickedComparisonMode, card->kicked, kicked) || card->has(Constants::HASREPLICATE)))
return NULL;
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power))
return NULL;
@@ -213,7 +213,7 @@ MTGCardInstance * CardDescriptor::match_and(MTGCardInstance * card)
if (foretoldComparisonMode && !valueInRange(foretoldComparisonMode, card->foretellTurn, foretellTurn))
match = NULL;
if (kickedComparisonMode && !valueInRange(kickedComparisonMode, card->kicked, kicked))
if (kickedComparisonMode && (!valueInRange(kickedComparisonMode, card->kicked, kicked) || card->has(Constants::HASREPLICATE)))
match = NULL;
if (powerComparisonMode && !valueInRange(powerComparisonMode, card->getPower(), power))
match = NULL;
+4 -1
View File
@@ -2963,6 +2963,9 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
} else if (zone == "librarytop")
{
fizzleMode = ActionStack::PUT_IN_LIBRARY_TOP;
} else if (zone == "librarybottom")
{
fizzleMode = ActionStack::PUT_IN_LIBRARY_BOTTOM;
}
Spell * starget = NULL;
if (spell)
@@ -2975,7 +2978,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
//Fizzle (counterspell...)
found = s.find("fizzle");
if (found != string::npos)
if (found != string::npos && s.find("nofizzle") == string::npos) //Fix to allow adding nofizzle ability to cards which originally have not (e.g. with transforms or lord keywords)
{
Spell * starget = NULL;
if (spell)
+2 -1
View File
@@ -227,7 +227,8 @@ const char* Constants::MTGBasicAbilities[] = {
"nomovetrigger", //no trigger when playing these cards (e.g. fake ability cards such as Davriel Conditions, Davriel Offers, Annihilation Rooms)
"wascommander", //It was the current commander (e.g. after it flipped or morphed)
"showopponenthand", //opponent plays with his hand revealed.
"showcontrollerhand" //controller plays with his hand revealed.
"showcontrollerhand", //controller plays with his hand revealed.
"hasreplicate" //Kicker cost is a replicate cost (eg. "Vacuumelt")
};
map<string,int> Constants::MTGBasicAbilitiesMap;
+5 -5
View File
@@ -526,7 +526,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
while(previousManaPool->canAfford(withKickerCost,card->has(Constants::ANYTYPEOFMANA)))
{
withKickerCost->add(withKickerCost->getKicker());
if(!card->basicAbilities[Constants::HASNOKICKER]) card->kicked += 1; //Some kicker costs are not a real kicker (e.g. Fuse cost).
if(!card->basicAbilities[Constants::HASNOKICKER] || card->basicAbilities[Constants::HASREPLICATE]) card->kicked += 1; //Some kicker costs are not a real kicker (e.g. Fuse cost) or they are a replicate cost (eg. "Vacuumelt").
}
for(int i = 0;i < card->kicked;i++)
player->getManaPool()->pay(card->getManaCost()->getKicker());
@@ -537,7 +537,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
{
player->getManaPool()->pay(card->getManaCost()->getKicker());
payResult = ManaCost::MANA_PAID_WITH_KICKER;
if(!card->basicAbilities[Constants::HASNOKICKER]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost).
if(!card->basicAbilities[Constants::HASNOKICKER] || card->basicAbilities[Constants::HASREPLICATE]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost) or they are a replicate cost (eg. "Vacuumelt").
card->alternateCostPaid[ManaCost::MANA_PAID_WITH_KICKER] = 1;
}
delete withKickerCost;
@@ -681,7 +681,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
{
if (!game->targetListIsSet(card))
{
if(!card->basicAbilities[Constants::HASNOKICKER]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost).
if(!card->basicAbilities[Constants::HASNOKICKER] || card->basicAbilities[Constants::HASREPLICATE]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost) or they are a replicate cost (eg. "Vacuumelt").
return 0;
}
}
@@ -704,7 +704,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
while(previousManaPool->canAfford(withKickerCost,card->has(Constants::ANYTYPEOFMANA)))
{
withKickerCost->add(withKickerCost->getKicker());
if(!card->basicAbilities[Constants::HASNOKICKER]) card->kicked += 1; //Some kicker costs are not a real kicker (e.g. Fuse cost).
if(!card->basicAbilities[Constants::HASNOKICKER] || card->basicAbilities[Constants::HASREPLICATE]) card->kicked += 1; //Some kicker costs are not a real kicker (e.g. Fuse cost) or they are a replicate cost (eg. "Vacuumelt").
}
for(int i = 0;i < card->kicked;i++)
player->getManaPool()->pay(card->getManaCost()->getKicker());
@@ -715,7 +715,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
{
player->getManaPool()->pay(card->getManaCost()->getKicker());
payResult = ManaCost::MANA_PAID_WITH_KICKER;
if(!card->basicAbilities[Constants::HASNOKICKER]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost).
if(!card->basicAbilities[Constants::HASNOKICKER] || card->basicAbilities[Constants::HASREPLICATE]) card->kicked = 1; //Some kicker costs are not a real kicker (e.g. Fuse cost) or they are a replicate cost (eg. "Vacuumelt").
card->alternateCostPaid[ManaCost::MANA_PAID_WITH_KICKER] = 1;
}
delete withKickerCost;
+10 -2
View File
@@ -1295,9 +1295,17 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
}
}
}
else if (s == "ishuman")//return if controller is Human or AI
else if (s == "ishuman" || s == "mycolnum")//return if controller is Human or AI - return the number of colors of a card.
{
intValue = (card->controller()->isAI())?0:1;
intValue = 0;
if (s == "ishuman")
intValue = (card->controller()->isAI())?0:1;
else if (s == "mycolnum") {
for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i){
if(card->hasColor(i))
intValue +=1;
}
}
}
else if (s == "pexperience" || s == "oexperience")
{