Merge pull request #656 from kevlahnota/master
Manacost Changes, Anyzone for CDA, PayZero Cost
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
|
||||
[card]
|
||||
name=Aeon Chronicler
|
||||
auto=phandcount/phandcount cdaactive
|
||||
anyzone=phandcount/phandcount cdaactive
|
||||
autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:draw:1
|
||||
suspend(0)={X}{3}{U}
|
||||
text=Aeon Chronicler's power and toughness are each equal to the number of cards in your hand. -- Suspend X - {X}{3}{U}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{U} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card.
|
||||
@@ -878,7 +878,7 @@ type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Adamaro, First to Desire
|
||||
auto=type:*:opponenthand/type:*:opponenthand cdaactive
|
||||
anyzone=type:*:opponenthand/type:*:opponenthand cdaactive
|
||||
text=Adamaro, First to Desire's power and toughness are each equal to the number of cards in the hand of the opponent with the most cards in hand.
|
||||
mana={1}{R}{R}
|
||||
type=Legendary Creature
|
||||
@@ -1493,7 +1493,7 @@ subtype=Ajani
|
||||
[/card]
|
||||
[card]
|
||||
name=Avatar Token
|
||||
auto=lifetotal/lifetotal cdaactive
|
||||
anyzone=lifetotal/lifetotal cdaactive
|
||||
type=Creature
|
||||
subtype=Avatar
|
||||
power=*
|
||||
@@ -2351,7 +2351,7 @@ toughness=1
|
||||
[card]
|
||||
name=Altar Golem
|
||||
abilities=trample,doesnotuntap
|
||||
auto=type:creature:battlefield/type:creature:battlefield cdaactive
|
||||
anyzone=type:creature:battlefield/type:creature:battlefield cdaactive
|
||||
auto={T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}{T(creature|myBattlefield)}:untap
|
||||
text=Trample -- Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. -- Altar Golem doesn't untap during your untap step. -- Tap five untapped creatures you control: Untap Altar Golem.
|
||||
mana={7}
|
||||
@@ -2937,7 +2937,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Ancient Ooze
|
||||
auto=pancientooze/pancientooze cdaactive
|
||||
anyzone=pancientooze/pancientooze cdaactive
|
||||
text=Ancient Ooze's power and toughness are each equal to the total converted mana cost of other creatures you control.
|
||||
mana={5}{G}{G}
|
||||
type=Creature
|
||||
@@ -8068,7 +8068,7 @@ toughness=2
|
||||
[card]
|
||||
name=Battle Squadron
|
||||
abilities=flying
|
||||
auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive
|
||||
anyzone=type:creature:myBattlefield/type:creature:myBattlefield cdaactive
|
||||
text=Flying -- Battle Squadron's power and toughness are each equal to the number of creatures you control.
|
||||
mana={3}{R}{R}
|
||||
type=Creature
|
||||
@@ -8381,7 +8381,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Beast of Burden
|
||||
auto=type:creature:Battlefield/type:creature:Battlefield cdaactive
|
||||
anyzone=type:creature:Battlefield/type:creature:Battlefield cdaactive
|
||||
text=Beast of Burden's power and toughness are each equal to the number of creatures on the battlefield.
|
||||
mana={6}
|
||||
type=Artifact Creature
|
||||
@@ -8671,7 +8671,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Benalish Commander
|
||||
auto=type:soldier:mybattlefield/type:soldier:mybattlefield cdaactive
|
||||
anyzone=type:soldier:mybattlefield/type:soldier:mybattlefield cdaactive
|
||||
autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:token(Soldier,Creature Soldier,1/1,white)
|
||||
suspend(0)={X}{W}{W}
|
||||
text=Benalish Commander's power and toughness are each equal to the number of Soldiers you control. -- Suspend X - {X}{W}{W}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{W}{W} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Benalish Commander while it's exiled, put a 1/1 white Soldier creature token onto the battlefield.
|
||||
@@ -11580,7 +11580,8 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Boneyard Wurm
|
||||
auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
text=Boneyard Wurm's power and toughness are each equal to the number of creature cards in your graveyard.
|
||||
mana={1}{G}
|
||||
type=Creature
|
||||
@@ -12926,7 +12927,7 @@ toughness=4
|
||||
[card]
|
||||
name=Broodstar
|
||||
abilities=affinityartifacts,flying
|
||||
auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
text=Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -- Flying -- Broodstar's power and toughness are each equal to the number of artifacts you control.
|
||||
mana={8}{U}{U}
|
||||
type=Creature
|
||||
@@ -14097,8 +14098,9 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Cantivore
|
||||
alias=001100
|
||||
abilities=vigilance
|
||||
auto=type:enchantment:graveyard/type:enchantment:graveyard cdaactive
|
||||
anyzone=type:enchantment:graveyard/type:enchantment:graveyard cdaactive
|
||||
text=Vigilance -- Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards.
|
||||
mana={1}{W}{W}
|
||||
type=Creature
|
||||
@@ -18065,8 +18067,9 @@ type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Cognivore
|
||||
alias=001100
|
||||
abilities=flying
|
||||
auto=type:instant:graveyard/type:instant:graveyard cdaactive
|
||||
anyzone=type:instant:graveyard/type:instant:graveyard cdaactive
|
||||
text=Flying -- Cognivore's power and toughness are each equal to the number of instant cards in all graveyards.
|
||||
mana={6}{U}{U}
|
||||
type=Creature
|
||||
@@ -18086,7 +18089,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Coiling Woodworm
|
||||
auto=type:forest:battlefield/1 cdaactive
|
||||
anyzone=type:forest:battlefield/1 cdaactive
|
||||
text=Coiling Woodworm's power is equal to the number of Forests on the battlefield.
|
||||
mana={2}{G}
|
||||
type=Creature
|
||||
@@ -20220,7 +20223,7 @@ toughness=4
|
||||
[card]
|
||||
name=Crowd of Cinders
|
||||
abilities=fear
|
||||
auto=type:*[black]:myBattlefield/type:*[black]:myBattlefield cdaactive
|
||||
anyzone=type:*[black]:myBattlefield/type:*[black]:myBattlefield cdaactive
|
||||
text=Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -- Crowd of Cinders's power and toughness are each equal to the number of black permanents you control.
|
||||
mana={3}{B}
|
||||
type=Creature
|
||||
@@ -20455,7 +20458,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Crusader of Odric
|
||||
auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
text=Crusader of Odric's power and toughness are each equal to the number of creatures you control.
|
||||
mana={2}{W}
|
||||
type=Creature
|
||||
@@ -21338,7 +21341,7 @@ subtype=Aura
|
||||
[/card]
|
||||
[card]
|
||||
name=Dakkon Blackblade
|
||||
auto=type:land:myBattlefield/type:land:myBattlefield cdaactive
|
||||
anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive
|
||||
text=Dakkon Blackblade's power and toughness are each equal to the number of lands you control.
|
||||
mana={2}{W}{U}{U}{B}
|
||||
type=Legendary Creature
|
||||
@@ -21401,7 +21404,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Dakmor Sorceress
|
||||
auto=type:swamp:myBattlefield/4 cdaactive
|
||||
anyzone=type:swamp:myBattlefield/4 cdaactive
|
||||
text=Dakmor Sorceress's power is equal to the number of Swamps you control.
|
||||
mana={5}{B}
|
||||
type=Creature
|
||||
@@ -21917,7 +21920,7 @@ type=Artifact
|
||||
[card]
|
||||
name=Darksteel Juggernaut
|
||||
abilities=mustattack,indestructible
|
||||
auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
text=Darksteel Juggernaut's power and toughness are equal to the number of artifacts you control. -- Darksteel Juggernaut is indestructible and attacks each turn if able.
|
||||
mana={5}
|
||||
type=Artifact Creature
|
||||
@@ -22113,7 +22116,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Dauntless Dourbark
|
||||
auto=pdauntless/pdauntless cdaactive
|
||||
anyzone=pdauntless/pdauntless cdaactive
|
||||
auto=aslongas(other treefolk|myBattlefield) trample
|
||||
text=Dauntless Dourbark's power and toughness are each equal to the number of Forests you control plus the number of Treefolk you control. -- Dauntless Dourbark has trample as long as you control another Treefolk.
|
||||
mana={3}{G}
|
||||
@@ -22257,7 +22260,7 @@ toughness=1
|
||||
[card]
|
||||
name=Dauthi Warlord
|
||||
abilities=shadow
|
||||
auto=type:creature[shadow]:battlefield/1 cdaactive
|
||||
anyzone=type:creature[shadow]:battlefield/1 cdaactive
|
||||
text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- Dauthi Warlord's power is equal to the number of creatures with shadow on the battlefield.
|
||||
mana={1}{B}
|
||||
type=Creature
|
||||
@@ -24371,7 +24374,8 @@ text=Destroy target artifact with converted mana cost X. It can't be regenerated
|
||||
[/card]
|
||||
[card]
|
||||
name=Detritivore
|
||||
auto=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:land[-basic]:opponentgraveyard/type:land[-basic]:opponentgraveyard cdaactive
|
||||
autoexile=@counterremoved(0/0,1,Time) from(sourcecard) suspended:destroy target(land[-basic])
|
||||
suspend(0)={X}{3}{R}
|
||||
text=Detritivore's power and toughness are each equal to the number of nonbasic land cards in your opponents' graveyards. -- Suspend X - {X}{3}{R}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{R} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land.
|
||||
@@ -25844,7 +25848,7 @@ type=Artifact
|
||||
[card]
|
||||
name=Doubtless One
|
||||
auto=spiritlink
|
||||
auto=type:cleric:battlefield/type:cleric:battlefield cdaactive
|
||||
anyzone=type:cleric:battlefield/type:cleric:battlefield cdaactive
|
||||
text=Doubtless One's power and toughness are each equal to the number of Clerics on the battlefield. -- Whenever Doubtless One deals damage, you gain that much life.
|
||||
mana={3}{W}
|
||||
type=Creature
|
||||
@@ -26976,7 +26980,7 @@ toughness=5
|
||||
[card]
|
||||
name=Drift of the Dead
|
||||
abilities=defender
|
||||
auto=type:land[snow]:myBattlefield/type:land[snow]:myBattlefield cdaactive
|
||||
anyzone=type:land[snow]:myBattlefield/type:land[snow]:myBattlefield cdaactive
|
||||
text=Defender (This creature can't attack.) -- Drift of the Dead's power and toughness are each equal to the number of snow lands you control.
|
||||
mana={3}{B}
|
||||
type=Creature
|
||||
@@ -27335,7 +27339,7 @@ toughness=1
|
||||
[card]
|
||||
name=Drove of Elves
|
||||
abilities=opponentshroud
|
||||
auto=type:*[green]:myBattlefield/type:*[green]:myBattlefield cdaactive
|
||||
anyzone=type:*[green]:myBattlefield/type:*[green]:myBattlefield cdaactive
|
||||
text=Drove of Elves's power and toughness are each equal to the number of green permanents you control. -- Drove of Elves can't be the target of spells or abilities your opponents control.
|
||||
mana={3}{G}
|
||||
type=Creature
|
||||
@@ -27686,7 +27690,7 @@ toughness=1
|
||||
[card]
|
||||
name=Dungrove Elder
|
||||
abilities=opponentshroud
|
||||
auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) -- Dungrove Elder's power and toughness are each equal to the number of Forests you control.
|
||||
mana={2}{G}
|
||||
type=Creature
|
||||
@@ -29051,7 +29055,7 @@ type=Sorcery
|
||||
name=Elephant T1
|
||||
type=Creature
|
||||
subtype=Elephant
|
||||
auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
text=This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard.
|
||||
power=*
|
||||
toughness=*
|
||||
@@ -30620,7 +30624,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Entropic Specter
|
||||
auto=type:*:opponenthand/type:*:opponenthand cdaactive
|
||||
anyzone=type:*:opponenthand/type:*:opponenthand cdaactive
|
||||
auto=@damageof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ controller
|
||||
auto=@damagefoeof(player) from(this):ability$!name(discard) target(*|myhand) reject!$ opponent
|
||||
text=Flying -- As Entropic Specter enters the battlefield, choose an opponent. -- Entropic Specter's power and toughness are each equal to the number of cards in the chosen player's hand. -- Whenever Entropic Specter deals damage to a player, that player discards a card.
|
||||
@@ -32256,7 +32260,7 @@ toughness=1
|
||||
[card]
|
||||
name=Faerie Swarm
|
||||
abilities=flying
|
||||
auto=type:*[blue]:myBattlefield/type:*[blue]:myBattlefield cdaactive
|
||||
anyzone=type:*[blue]:myBattlefield/type:*[blue]:myBattlefield cdaactive
|
||||
text=Flying -- Faerie Swarm's power and toughness are each equal to the number of blue permanents you control.
|
||||
mana={3}{U}
|
||||
type=Creature
|
||||
@@ -37804,7 +37808,7 @@ type=Instant
|
||||
name=Geist-Honored Monk
|
||||
abilities=vigilance
|
||||
auto=token(Spirit,Creature Spirit,1/1,white,flying)*2
|
||||
auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
text=Vigilance -- Geist-Honored Monk's power and toughness are each equal to the number of creatures you control. -- When Geist-Honored Monk enters the battlefield, put two 1/1 white Spirit creature tokens with flying onto the battlefield.
|
||||
mana={3}{W}{W}
|
||||
type=Creature
|
||||
@@ -41603,7 +41607,7 @@ toughness=3
|
||||
[card]
|
||||
name=Gravecrawler
|
||||
abilities=cantblock
|
||||
autograveyard=aslongas(zombie|myBattlefield) transforms((,newability[CanPlayFromGraveyard]))
|
||||
autograveyard=aslongas(zombie|myBattlefield) CanPlayFromGraveyard
|
||||
text=Gravecrawler can't block. -- You may cast Gravecrawler from your graveyard as long as you control a Zombie.
|
||||
mana={B}
|
||||
type=Creature
|
||||
@@ -44933,7 +44937,7 @@ subtype=Arcane
|
||||
[card]
|
||||
name=Heedless One
|
||||
abilities=trample
|
||||
auto=type:elf:battlefield/type:elf:battlefield cdaactive
|
||||
anyzone=type:elf:battlefield/type:elf:battlefield cdaactive
|
||||
text=Trample -- Heedless One's power and toughness are each equal to the number of Elves on the battlefield.
|
||||
mana={3}{G}
|
||||
type=Creature
|
||||
@@ -50066,7 +50070,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Jagged-Scar Archers
|
||||
auto=type:elf:myBattlefield/type:elf:myBattlefield cdaactive
|
||||
anyzone=type:elf:myBattlefield/type:elf:myBattlefield cdaactive
|
||||
auto={T}:target(creature[flying]) dynamicability<!powerstrike!>
|
||||
text=Jagged-Scar Archers's power and toughness are each equal to the number of Elves you control. -- {T}: Jagged-Scar Archers deals damage equal to its power to target creature with flying.
|
||||
mana={1}{G}{G}
|
||||
@@ -51346,7 +51350,7 @@ abilities=defender
|
||||
[/card]
|
||||
[card]
|
||||
name=Kagemaro, First to Suffer
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto={B}{S}:-type:*:myhand/-type:*:myhand all(creature)
|
||||
text=Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand. -- {B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand.
|
||||
mana={3}{B}{B}
|
||||
@@ -51417,7 +51421,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Kalonian Twingrove
|
||||
auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
auto=token(-383290)
|
||||
text=Kalonian Twingrove's power and toughness are each equal to the number of Forests you control. -- When Kalonian Twingrove enters the battlefield, put a green Treefolk Warrior creature token onto the battlefield with "this creature's power and toughness are each equal to the number of forests you control."
|
||||
mana={5}{G}
|
||||
@@ -51428,7 +51432,7 @@ toughness=*
|
||||
[/card]
|
||||
[card]
|
||||
name=Treefolk Warrior
|
||||
auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
text=This creature's power and toughness are each equal to the number of forests you control.
|
||||
color=green
|
||||
type=Creature
|
||||
@@ -52469,7 +52473,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Keldon Warlord
|
||||
auto=type:creature[-wall]:myBattlefield/type:creature[-wall]:myBattlefield cdaactive
|
||||
anyzone=type:creature[-wall]:myBattlefield/type:creature[-wall]:myBattlefield cdaactive
|
||||
text=Keldon Warlord's power and toughness are each equal to the number of non-Wall creatures you control.
|
||||
mana={2}{R}{R}
|
||||
type=Creature
|
||||
@@ -53129,7 +53133,7 @@ toughness=2
|
||||
[card]
|
||||
name=Kithkin Rabble
|
||||
abilities=vigilance
|
||||
auto=type:*[white]:myBattlefield/type:*[white]:myBattlefield cdaactive
|
||||
anyzone=type:*[white]:myBattlefield/type:*[white]:myBattlefield cdaactive
|
||||
text=Vigilance -- Kithkin Rabble's power and toughness are each equal to the number of white permanents you control.
|
||||
mana={3}{W}
|
||||
type=Creature
|
||||
@@ -53253,7 +53257,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Kiyomaro, First to Stand
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto=aslongas(*|myhand) vigilance >3
|
||||
auto=@damaged(creature,player) from(this) restriction{type(*|myhand)~morethan~6}:if type(*|myhand)~morethan~6 then life:7 controller
|
||||
text=Kiyomaro, First to Stand's power and toughness are each equal to the number of cards in your hand. -- As long as you have four or more cards in hand, Kiyomaro has vigilance. -- Whenever Kiyomaro deals damage, if you have seven or more cards in hand, you gain 7 life.
|
||||
@@ -53756,7 +53760,7 @@ toughness=1
|
||||
[card]
|
||||
name=Kolaghan Forerunners
|
||||
abilities=trample
|
||||
auto=type:creature:mybattlefield/3 cdaactive
|
||||
anyzone=type:creature:mybattlefield/3 cdaactive
|
||||
other={R}{2} name(Dash)
|
||||
auto=if paid(alternative) then transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveto(ownerhand) all(this)])) forever
|
||||
text=Trample -- Kolaghan Forerunners's power is equal to the number of creatures you control. -- Dash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.)
|
||||
@@ -53990,7 +53994,7 @@ toughness=1
|
||||
[card]
|
||||
name=Korlash Heir to Blackblade
|
||||
auto={discard(korlash heir to blackblade|myhand)}:moveto(mybattlefield) and!(tap)! target(<upto:2>swamp|mylibrary)
|
||||
auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive
|
||||
anyzone=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive
|
||||
auto={1}{B}:regenerate
|
||||
text=Korlash, Heir to Blackblade's power and toughness are each equal to the number of Swamps you control. -- {1}{B}: Regenerate Korlash. -- Grandeur - Discard another card named Korlash, Heir to Blackblade: Search your library for up to two Swamp cards, put them onto the battlefield tapped, then shuffle your library.
|
||||
mana={2}{B}{B}
|
||||
@@ -54444,7 +54448,7 @@ subtype=Aura
|
||||
[card]
|
||||
name=Krovikan Mist
|
||||
abilities=flying
|
||||
auto=type:illusion:battlefield/type:illusion:battlefield cdaactive
|
||||
anyzone=type:illusion:battlefield/type:illusion:battlefield cdaactive
|
||||
text=Flying -- Krovikan Mist's power and toughness are each equal to the number of Illusions on the battlefield.
|
||||
mana={1}{U}
|
||||
type=Creature
|
||||
@@ -56072,7 +56076,8 @@ toughness=5
|
||||
[/card]
|
||||
[card]
|
||||
name=Lhurgoyf
|
||||
auto=type:creature:graveyard/plusonetype:creature:graveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:creature:graveyard/plusonetype:creature:graveyard cdaactive
|
||||
text=Lhurgoyf's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1.
|
||||
mana={2}{G}{G}
|
||||
type=Creature
|
||||
@@ -57452,7 +57457,8 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Lord of Extinction
|
||||
auto=type:*:graveyard/type:*:graveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:*:graveyard/type:*:graveyard cdaactive
|
||||
text=Lord of Extinction's power and toughness are each equal to the number of cards in all graveyards.
|
||||
mana={3}{B}{G}
|
||||
type=Creature
|
||||
@@ -58816,8 +58822,9 @@ toughness=6
|
||||
[/card]
|
||||
[card]
|
||||
name=Magnivore
|
||||
alias=001100
|
||||
abilities=haste
|
||||
auto=type:sorcery:graveyard/type:sorcery:graveyard cdaactive
|
||||
anyzone=type:sorcery:graveyard/type:sorcery:graveyard cdaactive
|
||||
text=Haste (This creature can attack the turn it comes under your control.) -- Magnivore's power and toughness are each equal to the number of sorcery cards in all graveyards.
|
||||
mana={2}{R}{R}
|
||||
type=Creature
|
||||
@@ -59639,7 +59646,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Maraxus of Keld
|
||||
auto=type:*[-tapped&-enchantment;-tapped&-planeswalker]/type:*[-tapped&-enchantment;-tapped&-planeswalker] cdaactive
|
||||
anyzone=type:*[-tapped&-enchantment;-tapped&-planeswalker]/type:*[-tapped&-enchantment;-tapped&-planeswalker] cdaactive
|
||||
text=Maraxus of Keld's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control.
|
||||
mana={4}{R}{R}
|
||||
type=Legendary Creature
|
||||
@@ -60025,7 +60032,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Maro
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
text=Maro's power and toughness are each equal to the number of cards in your hand.
|
||||
mana={2}{G}{G}
|
||||
type=Creature
|
||||
@@ -60558,7 +60565,7 @@ toughness=2
|
||||
[card]
|
||||
name=Master of Etherium
|
||||
auto=lord(other creature[artifact]|mybattlefield) 1/1
|
||||
auto=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
anyzone=type:artifact:mybattlefield/type:artifact:mybattlefield cdaactive
|
||||
text=Master of Etherium's power and toughness are each equal to the number of artifacts you control. -- Other artifact creatures you control get +1/+1.
|
||||
mana={2}{U}
|
||||
type=Artifact Creature
|
||||
@@ -60663,7 +60670,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Masumaro, First to Live
|
||||
auto=twicetype:*:myhand/twicetype:*:myhand cdaactive
|
||||
anyzone=twicetype:*:myhand/twicetype:*:myhand cdaactive
|
||||
text=Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand.
|
||||
mana={3}{G}{G}{G}
|
||||
type=Legendary Creature
|
||||
@@ -60673,7 +60680,7 @@ toughness=*
|
||||
[/card]
|
||||
[card]
|
||||
name=Matca Rioters
|
||||
auto=pbasiclandtypes/pbasiclandtypes cdaactive
|
||||
anyzone=pbasiclandtypes/pbasiclandtypes cdaactive
|
||||
text=Domain - Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control.
|
||||
mana={2}{G}
|
||||
type=Creature
|
||||
@@ -63699,7 +63706,7 @@ toughness=8
|
||||
[card]
|
||||
name=Molimo, Maro-Sorcerer
|
||||
abilities=trample
|
||||
auto=type:land:myBattlefield/type:land:myBattlefield cdaactive
|
||||
anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive
|
||||
text=Trample (If this creature would deal enough damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker.) -- Molimo, Maro-Sorcerer's power and toughness are each equal to the number of lands you control.
|
||||
mana={4}{G}{G}{G}
|
||||
type=Legendary Creature
|
||||
@@ -64584,8 +64591,9 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Mortivore
|
||||
alias=001100
|
||||
auto={B}:regenerate
|
||||
auto=type:creature:graveyard/type:creature:graveyard cdaactive
|
||||
anyzone=type:creature:graveyard/type:creature:graveyard cdaactive
|
||||
text=Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -- {B}: Regenerate Mortivore. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.)
|
||||
mana={2}{B}{B}
|
||||
type=Creature
|
||||
@@ -64980,7 +64988,7 @@ toughness=2
|
||||
[card]
|
||||
name=Multani, Maro-Sorcerer
|
||||
abilities=shroud
|
||||
auto=type:*:hand/type:*:hand cdaactive
|
||||
anyzone=type:*:hand/type:*:hand cdaactive
|
||||
text=Shroud (This permanent can't be the target of spells or abilities.) -- Multani's power and toughness are each equal to the total number of cards in all players' hands.
|
||||
mana={4}{G}{G}
|
||||
type=Legendary Creature
|
||||
@@ -65793,7 +65801,7 @@ subtype=Shapeshifter
|
||||
name=Nameless One
|
||||
facedown={3}
|
||||
autofacedown={2}{U}:morph
|
||||
auto=type:wizard:battlefield/type:wizard:battlefield cdaactive
|
||||
anyzone=type:wizard:battlefield/type:wizard:battlefield cdaactive
|
||||
text=Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. -- Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)
|
||||
mana={3}{U}
|
||||
type=Creature
|
||||
@@ -67248,7 +67256,7 @@ type=Sorcery
|
||||
[card]
|
||||
name=Nightmare
|
||||
abilities=flying
|
||||
auto=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive
|
||||
anyzone=type:swamp:mybattlefield/type:swamp:mybattlefield cdaactive
|
||||
text=Flying -- Nightmare's power and toughness are each equal to the number of Swamps you control.
|
||||
mana={5}{B}
|
||||
type=Creature
|
||||
@@ -67366,7 +67374,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Nightstalker Engine
|
||||
auto=type:creature:myGraveyard/3 cdaactive
|
||||
anyzone=type:creature:myGraveyard/3 cdaactive
|
||||
text=Nightstalker Engine's power is equal to the number of creature cards in your graveyard.
|
||||
mana={4}{B}
|
||||
type=Creature
|
||||
@@ -70197,7 +70205,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Overbeing of Myth
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto=@each my draw:draw:1
|
||||
text=Overbeing of Myth's power and toughness are each equal to the number of cards in your hand. -- At the beginning of your draw step, draw an additional card.
|
||||
mana={GU}{GU}{GU}{GU}{GU}
|
||||
@@ -70450,7 +70458,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Pack Rat
|
||||
auto=type:rat:mybattlefield/type:rat:mybattlefield cdaactive
|
||||
anyzone=type:rat:mybattlefield/type:rat:mybattlefield cdaactive
|
||||
auto={2}{B}{discard(*|myhand)}:token(253624)
|
||||
text=Pack Rat's power and toughness are each equal to the number of Rats you control. -- {2}{B}, Discard a card: Put a token onto the battlefield that's a copy of Pack Rat.
|
||||
mana={1}{B}
|
||||
@@ -70694,7 +70702,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Pallimud
|
||||
auto=type:land[tapped]:opponentbattlefield/3 cdaactive
|
||||
anyzone=type:land[tapped]:opponentbattlefield/3 cdaactive
|
||||
text=As Pallimud enters the battlefield, choose an opponent. -- Pallimud's power is equal to the number of tapped lands the chosen player controls.
|
||||
mana={2}{R}
|
||||
type=Creature
|
||||
@@ -71900,7 +71908,7 @@ toughness=6
|
||||
[/card]
|
||||
[card]
|
||||
name=Pestilence Rats
|
||||
auto=othertype:rat:battlefield/3 cdaactive
|
||||
anyzone=othertype:rat:battlefield/3 cdaactive
|
||||
text=Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.)
|
||||
mana={2}{B}
|
||||
type=Creature
|
||||
@@ -73404,7 +73412,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Plague Rats
|
||||
auto=allmyname/allmyname cdaactive
|
||||
anyzone=allmyname/allmyname cdaactive
|
||||
text=Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield.
|
||||
mana={2}{B}
|
||||
type=Creature
|
||||
@@ -74639,7 +74647,7 @@ subtype=Aura
|
||||
[card]
|
||||
name=Primalcrux
|
||||
abilities=trample
|
||||
auto=type:manag:mybattlefield/type:manag:mybattlefield cdaactive
|
||||
anyzone=type:manag:mybattlefield/type:manag:mybattlefield cdaactive
|
||||
text=Trample -- Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control.
|
||||
mana={G}{G}{G}{G}{G}{G}
|
||||
type=Creature
|
||||
@@ -75329,7 +75337,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Psychosis Crawler
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto=@drawof(player):life:-1 opponent
|
||||
text=Psychosis Crawler's power and toughness are each equal to the number of cards in your hand. - Whenever you draw a card, each opponent loses 1 life.
|
||||
mana={5}
|
||||
@@ -78392,7 +78400,7 @@ toughness=2
|
||||
[card]
|
||||
name=Reckless One
|
||||
abilities=haste
|
||||
auto=type:goblin:battlefield/type:goblin:battlefield cdaactive
|
||||
anyzone=type:goblin:battlefield/type:goblin:battlefield cdaactive
|
||||
text=Haste -- Reckless One's power and toughness are each equal to the number of Goblins on the battlefield.
|
||||
mana={3}{R}
|
||||
type=Creature
|
||||
@@ -79780,8 +79788,9 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Revenant
|
||||
alias=001100
|
||||
abilities=flying
|
||||
auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
text=Flying -- Revenant's power and toughness are each equal to the number of creature cards in your graveyard.
|
||||
mana={4}{B}
|
||||
type=Creature
|
||||
@@ -81838,7 +81847,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Rubblehulk
|
||||
auto=type:land:mybattlefield/type:land:mybattlefield cdaactive
|
||||
anyzone=type:land:mybattlefield/type:land:mybattlefield cdaactive
|
||||
autohand={1}{R}{G}{discard}:name(bloodrush) target(creature[attacking]) type:land:mybattlefield/type:land:mybattlefield ueot
|
||||
text=Rubblehulk's power and toughness are each equal to the number of lands you control. -- Bloodrush — {1}{R}{G}, Discard Rubblehulk: Target attacking creature gets +X/+X until end of turn, where X is the number of lands you control.
|
||||
mana={4}{R}{G}
|
||||
@@ -82362,7 +82371,7 @@ type=Artifact
|
||||
[card]
|
||||
name=Rusting Golem
|
||||
auto=fading:5
|
||||
auto=counter{0%0.1.Fade}/counter{0%0.1.Fade} cdaactive
|
||||
anyzone=counter{0%0.1.Fade}/counter{0%0.1.Fade} cdaactive
|
||||
text=Fading 5 (This creature enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Rusting Golem's power and toughness are each equal to the number of fade counters on it.
|
||||
mana={4}
|
||||
type=Artifact Creature
|
||||
@@ -84429,7 +84438,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Scion of the Wild
|
||||
auto=type:creature:myBattlefield/type:creature:myBattlefield cdaactive
|
||||
anyzone=type:creature:myBattlefield/type:creature:myBattlefield cdaactive
|
||||
text=Scion of the Wild's power and toughness are each equal to the number of creatures you control.
|
||||
mana={1}{G}{G}
|
||||
type=Creature
|
||||
@@ -86546,7 +86555,7 @@ toughness=3
|
||||
name=Serpent of the Endless Sea
|
||||
abilities=cantattack
|
||||
auto=aslongas(island|opponentBattlefield) -cantattack
|
||||
auto=type:island:myBattlefield/type:island:myBattlefield cdaactive
|
||||
anyzone=type:island:myBattlefield/type:island:myBattlefield cdaactive
|
||||
text=Serpent of the Endless Sea's power and toughness are each equal to the number of Islands you control. -- Serpent of the Endless Sea can't attack unless defending player controls an Island.
|
||||
mana={4}{U}
|
||||
type=Creature
|
||||
@@ -86619,7 +86628,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Serra Avatar
|
||||
auto=lifetotal/lifetotal cdaactive
|
||||
anyzone=lifetotal/lifetotal cdaactive
|
||||
autograveyard=moveTo(ownerlibrary) && shuffle
|
||||
text=Serra Avatar's power and toughness are each equal to your life total. -- When Serra Avatar is put into a graveyard from anywhere, shuffle it into its owner's library.
|
||||
mana={4}{W}{W}{W}
|
||||
@@ -89377,7 +89386,7 @@ toughness=5
|
||||
[/card]
|
||||
[card]
|
||||
name=Sima Yi, Wei Field Marshal
|
||||
auto=type:swamp:myBattlefield/4 cdaactive
|
||||
anyzone=type:swamp:myBattlefield/4 cdaactive
|
||||
text=Sima Yi, Wei Field Marshal's power is equal to the number of Swamps you control.
|
||||
mana={5}{B}
|
||||
type=Legendary Creature
|
||||
@@ -90842,7 +90851,7 @@ toughness=3
|
||||
[card]
|
||||
name=Skyshroud War Beast
|
||||
abilities=trample
|
||||
auto=type:land[-basic]:opponentBattlefield/type:land[-basic]:opponentBattlefield cdaactive
|
||||
anyzone=type:land[-basic]:opponentBattlefield/type:land[-basic]:opponentBattlefield cdaactive
|
||||
text=Trample -- As Skyshroud War Beast enters the battlefield, choose an opponent. -- Skyshroud War Beast's power and toughness are each equal to the number of nonbasic lands the chosen player controls.
|
||||
mana={1}{G}
|
||||
type=Creature
|
||||
@@ -90926,7 +90935,8 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Slag Fiend
|
||||
auto=type:artifact:graveyard/type:artifact:graveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:artifact:graveyard/type:artifact:graveyard cdaactive
|
||||
text=Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards.
|
||||
mana={R}
|
||||
type=Creature
|
||||
@@ -92448,7 +92458,7 @@ toughness=1
|
||||
[card]
|
||||
name=Soramaro, First to Dream
|
||||
abilities=flying
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto={4}{H(land|myBattlefield)}:draw:1
|
||||
text=Flying -- Soramaro, First to Dream's power and toughness are each equal to the number of cards in your hand. -- {4}, Return a land you control to its owner's hand: Draw a card.
|
||||
mana={4}{U}{U}
|
||||
@@ -93035,7 +93045,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Soulless One
|
||||
auto=pgbzombie/pgbzombie cdaactive
|
||||
anyzone=pgbzombie/pgbzombie cdaactive
|
||||
text=Soulless One's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards.
|
||||
mana={3}{B}
|
||||
type=Creature
|
||||
@@ -93092,7 +93102,7 @@ type=Instant
|
||||
[card]
|
||||
name=Soulsurge Elemental
|
||||
abilities=first strike
|
||||
auto=type:creature:myBattlefield/1 cdaactive
|
||||
anyzone=type:creature:myBattlefield/1 cdaactive
|
||||
text=First strike -- Soulsurge Elemental's power is equal to the number of creatures you control.
|
||||
mana={3}{R}
|
||||
type=Creature
|
||||
@@ -93637,7 +93647,7 @@ toughness=1
|
||||
[card]
|
||||
name=Spellheart Chimera
|
||||
abilities=flying,trample
|
||||
auto=pginstantsorcery/3 cdaactive
|
||||
anyzone=pginstantsorcery/3 cdaactive
|
||||
text=Flying. -- Trample. -- Spellheart Chimera's power is equal to the number of instant and sorcery cards in your graveyard.
|
||||
mana={1}{U}{R}
|
||||
type=Creature
|
||||
@@ -94631,8 +94641,9 @@ color=green
|
||||
[/card]
|
||||
[card]
|
||||
name=Splinterfright
|
||||
alias=001100
|
||||
abilities=trample
|
||||
auto=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
anyzone=type:creature:mygraveyard/type:creature:mygraveyard cdaactive
|
||||
auto=@each my upkeep:deplete:2 controller
|
||||
text=Trample -- Splinterfright's power and toughness are each equal to the number of creature cards in your graveyard -- At the beginning of your upkeep, put the top two cards of your library into your graveyard.
|
||||
mana={2}{G}
|
||||
@@ -95035,7 +95046,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Squelching Leeches
|
||||
auto=type:swamp:myBattlefield/type:swamp:myBattlefield cdaactive
|
||||
anyzone=type:swamp:myBattlefield/type:swamp:myBattlefield cdaactive
|
||||
text=Squelching Leeches's power and toughness are each equal to the number of Swamps you control.
|
||||
mana={2}{B}{B}
|
||||
type=Creature
|
||||
@@ -97237,7 +97248,7 @@ toughness=6
|
||||
[card]
|
||||
name=Sturmgeist
|
||||
abilities=flying
|
||||
auto=type:*:myhand/type:*:myhand cdaactive
|
||||
anyzone=type:*:myhand/type:*:myhand cdaactive
|
||||
auto=@combatdamaged(player) from(this):draw:1 controller
|
||||
text=Flying -- Sturmgeist's power and toughness are each equal to the number of cards in your hand. -- Whenever Sturmgeist deals combat damage to a player, draw a card.
|
||||
mana={3}{U}{U}
|
||||
@@ -98406,7 +98417,7 @@ toughness=0
|
||||
[/card]
|
||||
[card]
|
||||
name=Swarm of Rats
|
||||
auto=type:rat:mybattlefield/1 cdaactive
|
||||
anyzone=type:rat:mybattlefield/1 cdaactive
|
||||
text=Swarm of Rats's power is equal to the number of Rats you control.
|
||||
mana={1}{B}
|
||||
type=Creature
|
||||
@@ -98894,7 +98905,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Sylvan Yeti
|
||||
auto=type:*:myhand/4 cdaactive
|
||||
anyzone=type:*:myhand/4 cdaactive
|
||||
text=Sylvan Yeti's power is equal to the number of cards in your hand.
|
||||
mana={2}{G}{G}
|
||||
type=Creature
|
||||
@@ -99087,11 +99098,10 @@ text=Syphon Soul deals 2 damage to each other player. You gain life equal to the
|
||||
mana={2}{B}
|
||||
type=Sorcery
|
||||
[/card]
|
||||
#workaround szadek.
|
||||
[card]
|
||||
name=Szadek, Lord of Secrets
|
||||
alias=89092
|
||||
abilities=flying
|
||||
auto=@combatdamaged(player) from(this):deplete:thatmuch opponent && life:thatmuch opponent && counter(1/1,thatmuch)
|
||||
text=Flying -- If Szadek, Lord of Secrets would deal combat damage to a player, instead put that many +1/+1 counters on Szadek and that player puts that many cards from the top of his or her library into his or her graveyard.
|
||||
mana={3}{U}{U}{B}{B}
|
||||
type=Legendary Creature
|
||||
@@ -99741,7 +99751,7 @@ toughness=7
|
||||
[/card]
|
||||
[card]
|
||||
name=Tarmogoyf
|
||||
auto=gravecardtypes/plusonegravecardtypes cdaactive
|
||||
anyzone=gravecardtypes/plusonegravecardtypes cdaactive
|
||||
text=Tarmogoyf's power is equal to the number of card types among cards in all graveyards and its toughness is equal to that number plus 1. (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal.)
|
||||
mana={1}{G}
|
||||
type=Creature
|
||||
@@ -100774,8 +100784,9 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Terravore
|
||||
alias=001100
|
||||
abilities=trample
|
||||
auto=type:land:graveyard/type:land:graveyard cdaactive
|
||||
anyzone=type:land:graveyard/type:land:graveyard cdaactive
|
||||
text=Trample -- Terravore's power and toughness are each equal to the number of land cards in all graveyards.
|
||||
mana={1}{G}{G}
|
||||
type=Creature
|
||||
@@ -100972,6 +100983,18 @@ mana={3}{p(U)}
|
||||
type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Thada Adel, Acquisitor
|
||||
abilities=islandwalk
|
||||
auto=@combatdamagefoeof(player) from(this):name(exile artifact) notatarget(artifact|opponentlibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile],newability[phaseactionmulti[endofturn once] moveto(ownerexile) all(this|exile)])) ueot)!
|
||||
auto=@combatdamageof(player) from(this):name(exile artifact) notatarget(artifact|mylibrary) moveto(myexile) and!( transforms((,newability[canplayfromexile],newability[phaseactionmulti[endofturn once] moveto(ownerexile) all(this|exile)])) ueot)!
|
||||
text=Islandwalk -- Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles his or her library. Until end of turn, you may play that card.
|
||||
mana={1}{U}{U}
|
||||
type=Legendary Creature
|
||||
subtype=Merfolk Rogue
|
||||
power=2
|
||||
toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Thalakos Deceiver
|
||||
abilities=shadow
|
||||
auto=@combat(notblocked) source(this):may moveTo(myBattlefield) target(creature|opponentBattlefield) && sacrifice all(this)
|
||||
@@ -102682,7 +102705,7 @@ toughness=5
|
||||
[card]
|
||||
name=Tidewalker
|
||||
auto=foreach(island|myBattlefield) counter(0/0,1,Time) oneshot
|
||||
auto=counter{0%0.1.Time}/counter{0%0.1.Time} cdaactive
|
||||
anyzone=counter{0%0.1.Time}/counter{0%0.1.Time} cdaactive
|
||||
auto=vanishing:0
|
||||
text=Tidewalker enters the battlefield with a time counter on it for each Island you control. -- Vanishing (At the beginning of your upkeep, remove a time counter from this permanent. When the last is removed, sacrifice it.) -- Tidewalker's power and toughness are each equal to the number of time counters on it.
|
||||
mana={2}{U}
|
||||
@@ -105849,7 +105872,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Uktabi Wildcats
|
||||
auto=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
anyzone=type:forest:mybattlefield/type:forest:mybattlefield cdaactive
|
||||
auto={G}{S(forest|myBattlefield)}:regenerate
|
||||
text=Uktabi Wildcats's power and toughness are each equal to the number of Forests you control. -- {G}, Sacrifice a Forest: Regenerate Uktabi Wildcats.
|
||||
mana={4}{G}
|
||||
@@ -105987,7 +106010,8 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Umbra Stalker
|
||||
auto=type:manab:mygraveyard/type:manab:mygraveyard cdaactive
|
||||
alias=001100
|
||||
anyzone=type:manab:mygraveyard/type:manab:mygraveyard cdaactive
|
||||
text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard.
|
||||
mana={4}{B}{B}{B}
|
||||
type=Creature
|
||||
@@ -106105,6 +106129,17 @@ type=Enchantment
|
||||
subtype=Aura
|
||||
[/card]
|
||||
[card]
|
||||
name=Undead Alchemist
|
||||
auto=lord(zombie|mybattlefield) libraryeater
|
||||
auto=@movedTo(creature|opponentgraveyard) from(opponentlibrary):all(trigger[to]) moveto(exile) and!(token(Zombie,Creature Zombie,2/2,black) controller)!
|
||||
text=If a Zombie you control would deal combat damage to a player, instead that player puts that many cards from the top of his or her library into his or her graveyard. -- Whenever a creature card is put into an opponent's graveyard from his or her library, exile that card and put a 2/2 black Zombie creature token onto the battlefield.
|
||||
mana={3}{U}
|
||||
type=Creature
|
||||
subtype=Zombie
|
||||
power=4
|
||||
toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Undead Executioner
|
||||
auto=@movedto(this|graveyard) from(battlefield):may target(creature) -2/-2 ueot
|
||||
text=When Undead Executioner dies, you may have target creature get -2/-2 until end of turn.
|
||||
@@ -109886,7 +109921,7 @@ toughness=2
|
||||
name=Elemental
|
||||
type=Creature
|
||||
subtype=Elemental
|
||||
auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
text=This creature's power and toughness are each equal to the number of creature cards in its controller's battlefield.
|
||||
power=*
|
||||
toughness=*
|
||||
@@ -112163,7 +112198,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Wayfaring Temple
|
||||
auto=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
anyzone=type:creature:mybattlefield/type:creature:mybattlefield cdaactive
|
||||
auto=@combatdamaged(player) from(this) restriction{type(creature[token]|mybattlefield)~morethan~0}:name(populate) clone notatarget(creature[token]|mybattlefield)
|
||||
text=Wayfaring Temple's power and toughness are each equal to the number of creatures you control. -- Whenever Wayfaring Temple deals combat damage to a player, populate. (Put a token onto the battlefield that's a copy of a creature token you control.)
|
||||
mana={1}{G}{W}
|
||||
@@ -113235,7 +113270,7 @@ toughness=4
|
||||
[card]
|
||||
name=Wilderness Elemental
|
||||
abilities=trample
|
||||
auto=type:land[-basic]:opponentbattlefield/3 cdaactive
|
||||
anyzone=type:land[-basic]:opponentbattlefield/3 cdaactive
|
||||
text=Trample -- Wilderness Elemental's power is equal to the number of nonbasic lands your opponents control.
|
||||
mana={1}{R}{G}
|
||||
type=Creature
|
||||
@@ -115332,7 +115367,7 @@ type=Legendary Land
|
||||
[/card]
|
||||
[card]
|
||||
name=Yavimaya Kavu
|
||||
auto=type:creature[red]:battlefield/type:creature[green]:battlefield cdaactive
|
||||
anyzone=type:creature[red]:battlefield/type:creature[green]:battlefield cdaactive
|
||||
text=Yavimaya Kavu's power is equal to the number of red creatures on the battlefield. -- Yavimaya Kavu's toughness is equal to the number of green creatures on the battlefield.
|
||||
mana={2}{R}{G}
|
||||
type=Creature
|
||||
@@ -115754,7 +115789,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Zendikar Incarnate
|
||||
auto=type:land:mybattlefield/4 cdaactive
|
||||
anyzone=type:land:mybattlefield/4 cdaactive
|
||||
text=Zendikar Incarnate's power is equal to the number of lands you control.
|
||||
mana={2}{R}{G}
|
||||
type=Creature
|
||||
|
||||
@@ -12498,6 +12498,7 @@ text=Pyrotechnics deals 4 damage divided as you choose among any number of targe
|
||||
mana={4}{R}
|
||||
type=Sorcery
|
||||
[/card]
|
||||
#anyzone is basic for now and used for cdaactive
|
||||
[card]
|
||||
name=Qasali Ambusher
|
||||
text=Reach -- If a creature is attacking you and you control a Forest and a Plains, you may cast Qasali Ambusher without paying its mana cost and as though it had flash.
|
||||
@@ -12812,6 +12813,7 @@ mana={2}{U}
|
||||
type=Enchantment
|
||||
subtype=Aura
|
||||
[/card]
|
||||
#needs suspend ability not suspend activated ability
|
||||
[card]
|
||||
name=Reality Strobe
|
||||
text=Return target permanent to its owner's hand. Exile Reality Strobe with three time counters on it. -- Suspend 3 - {2}{U} (Rather than cast this card from your hand, you may pay {2}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)
|
||||
@@ -13490,6 +13492,7 @@ subtype=Elemental
|
||||
power=3
|
||||
toughness=2
|
||||
[/card]
|
||||
#seems possible
|
||||
[card]
|
||||
name=Roiling Horror
|
||||
text=Roiling Horror's power and toughness are each equal to your life total minus the life total of an opponent with the most life. -- Suspend X - {X}{B}{B}{B}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{B}{B}{B} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) -- Whenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life.
|
||||
@@ -13939,6 +13942,7 @@ subtype=Giant Warrior
|
||||
power=4
|
||||
toughness=5
|
||||
[/card]
|
||||
#modded ingest
|
||||
[card]
|
||||
name=Scalpelexis
|
||||
text=Flying (This creature can't be blocked except by creatures with flying or reach.) -- Whenever Scalpelexis deals combat damage to a player, that player exiles the top four cards of his or her library. If two or more of those cards have the same name, repeat this process.
|
||||
@@ -14093,6 +14097,7 @@ text=Look at the top X cards of target opponent's library. Exile one of those ca
|
||||
mana={X}{U}{B}
|
||||
type=Sorcery
|
||||
[/card]
|
||||
#moverandom?
|
||||
[card]
|
||||
name=Search for Survivors
|
||||
text=Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it.
|
||||
@@ -14480,6 +14485,7 @@ mana={3}{U}
|
||||
type=Instant
|
||||
subtype=Arcane
|
||||
[/card]
|
||||
#phaseactionmulti?
|
||||
[card]
|
||||
name=Shifty Doppelganger
|
||||
text={3}{U}, Exile Shifty Doppelganger: You may put a creature card from your hand onto the battlefield. If you do, that creature gains haste until end of turn. At the beginning of the next end step, sacrifice that creature. If you do, return Shifty Doppelganger to the battlefield.
|
||||
@@ -14944,6 +14950,7 @@ type=Enchantment
|
||||
subtype=Aura
|
||||
text=Enchant creature Enchanted creature gets +1/+1 and has "Whenever this creature deals damage to an opponent, you may draw a card." Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.)
|
||||
[/card]
|
||||
#manaflashback rule
|
||||
[card]
|
||||
name=Snapcaster Mage
|
||||
abilities=flash
|
||||
@@ -16224,12 +16231,6 @@ type=Sorcery
|
||||
text=Put a 1/1 colorless Expansion-Symbol creature token into play for each different expansion symbol among permanents you control.
|
||||
[/card]
|
||||
[card]
|
||||
name=Syncopate
|
||||
text=Counter target spell unless its controller pays {X}. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.
|
||||
mana={X}{U}
|
||||
type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Synod Artificer
|
||||
text={X}, {T}: Tap X target noncreature artifacts. -- {X}, {T}: Untap X target noncreature artifacts.
|
||||
mana={2}{U}
|
||||
@@ -16490,15 +16491,6 @@ type=Planeswalker
|
||||
subtype=Tezzeret
|
||||
[/card]
|
||||
[card]
|
||||
name=Thada Adel, Acquisitor
|
||||
text=Islandwalk -- Whenever Thada Adel, Acquisitor deals combat damage to a player, search that player's library for an artifact card and exile it. Then that player shuffles his or her library. Until end of turn, you may play that card.
|
||||
mana={1}{U}{U}
|
||||
type=Legendary Creature
|
||||
subtype=Merfolk Rogue
|
||||
power=2
|
||||
toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Thalakos Dreamsower
|
||||
text=Shadow (This creature can block or be blocked by only creatures with shadow.) -- You may choose not to untap Thalakos Dreamsower during your untap step. -- Whenever Thalakos Dreamsower deals damage to an opponent, tap target creature. That creature doesn't untap during its controller's untap step for as long as Thalakos Dreamsower remains tapped.
|
||||
mana={2}{U}
|
||||
@@ -17284,17 +17276,6 @@ mana={2}{U}
|
||||
type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Undead Alchemist
|
||||
auto=@combatdamaged(player) from(zombie|mybattlefield):deplete:thatmuch opponent && life:thatmuch opponent
|
||||
auto=@movedTo(creature|opponentgraveyard) from(opponentlibrary):token(Zombie,Creature Zombie,2/2,black)
|
||||
text=If a Zombie you control would deal combat damage to a player, instead that player puts that many cards from the top of his or her library into his or her graveyard. -- Whenever a creature card is put into an opponent's graveyard from his or her library, exile that card and put a 2/2 black Zombie creature token onto the battlefield.
|
||||
mana={3}{U}
|
||||
type=Creature
|
||||
subtype=Zombie
|
||||
power=4
|
||||
toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Undercity Informer
|
||||
text={1}, Sacrifice a creature: Target player reveals cards from the top of his or her library until he or she reveals a land card, then puts those cards into his or her graveyard.
|
||||
mana={2}{B}
|
||||
|
||||
@@ -213,7 +213,7 @@ public:
|
||||
COUNTERS = 30,
|
||||
PUT_INTO_PLAY_WITH_KICKER = 31,
|
||||
STANDARD_FIZZLER = 32,
|
||||
CASTINGRAVEYARD_COST = 33,
|
||||
PAYZERO_COST = 33,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -254,24 +254,7 @@ public:
|
||||
bool isTargetter();
|
||||
int cardistargetter;
|
||||
int myconvertedcost;
|
||||
ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost)
|
||||
{
|
||||
if(card->isLand())
|
||||
return oldCost;
|
||||
|
||||
if(!card)
|
||||
return NULL;
|
||||
//i don't know why this method doesn't affect cards in hand, but is working on other zones....//
|
||||
//pay zero costs//
|
||||
//kicker???...//
|
||||
//morph cost todo//
|
||||
//trinisphere must be here below//
|
||||
if(card->has(Constants::TRINISPHERE))
|
||||
for(int jj = oldCost->getConvertedCost(); jj < 3; jj++)
|
||||
oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1);
|
||||
|
||||
return oldCost;
|
||||
};
|
||||
ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost);
|
||||
|
||||
void eventattacked();
|
||||
void eventattackedAlone();
|
||||
|
||||
@@ -237,7 +237,8 @@ class Constants
|
||||
PAYZERO = 119,
|
||||
TRINISPHERE = 120,
|
||||
CANPLAYFROMEXILE = 121,
|
||||
NB_BASIC_ABILITIES = 122,
|
||||
LIBRARYEATER = 122,
|
||||
NB_BASIC_ABILITIES = 123,
|
||||
|
||||
|
||||
RARITY_S = 'S', //Special Rarity
|
||||
|
||||
@@ -175,18 +175,21 @@ public:
|
||||
virtual MTGMorphCostRule * clone() const;
|
||||
};
|
||||
|
||||
class MTGPlayFromGraveyardRule: public MTGAlternativeCostRule
|
||||
class MTGPayZeroRule: public MTGAlternativeCostRule
|
||||
{
|
||||
public:
|
||||
int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL);
|
||||
int reactToClick(MTGCardInstance * card);
|
||||
string CustomName;
|
||||
virtual ostream& toString(ostream& out) const;
|
||||
MTGPlayFromGraveyardRule(GameObserver* observer, int _id);
|
||||
MTGPayZeroRule(GameObserver* observer, int _id);
|
||||
const string getMenuText()
|
||||
{
|
||||
return "Cast Card From Graveyard";
|
||||
if(CustomName.size())
|
||||
return CustomName.c_str();
|
||||
return "Pay Zero To Cast";
|
||||
}
|
||||
virtual MTGPlayFromGraveyardRule * clone() const;
|
||||
virtual MTGPayZeroRule * clone() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -627,6 +627,10 @@ int OrderedAIAction::getEfficiency()
|
||||
{
|
||||
efficiency += 65;
|
||||
}
|
||||
else if (dynamic_cast<MTGAlternativeCostRule *>(a))
|
||||
{
|
||||
efficiency += 55;
|
||||
}
|
||||
SAFE_DELETE(transAbility);
|
||||
return efficiency;
|
||||
}
|
||||
@@ -1726,6 +1730,310 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
cd.setType(type);
|
||||
card = NULL;
|
||||
gotPayments = vector<MTGAbility*>();
|
||||
//canplayfromgraveyard
|
||||
while ((card = cd.nextmatch(game->graveyard, card))&& card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||
{
|
||||
if (!CanHandleCost(card->getManaCost(),card))
|
||||
continue;
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LAND))
|
||||
{
|
||||
if (game->playRestrictions->canPutIntoZone(card, game->inPlay) == PlayRestriction::CANT_PLAY)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
|
||||
continue;
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1]))
|
||||
continue;
|
||||
|
||||
if(hints && hints->HintSaysItsForCombo(observer,card))
|
||||
{
|
||||
if(hints->canWeCombo(observer,card,this))
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
nextCardToPlay = card;
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||
return activateCombo();
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
int hasX = card->getManaCost()->hasX();
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(card,card->getManaCost());
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
|
||||
{
|
||||
TargetChooserFactory tcf(observer);
|
||||
TargetChooser * tc = tcf.createTargetChooser(card);
|
||||
int shouldPlayPercentage = 0;
|
||||
if (tc)
|
||||
{
|
||||
int hasTarget = chooseTarget(tc,NULL,NULL,true);
|
||||
if(
|
||||
(tc->maxtargets > hasTarget && tc->maxtargets > 1 && !tc->targetMin && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS) ||//target=<3>creature
|
||||
(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS && hasTarget < 1)//target=creatures
|
||||
)
|
||||
hasTarget = 0;
|
||||
if (!hasTarget)//single target covered here.
|
||||
{
|
||||
SAFE_DELETE(tc);
|
||||
continue;
|
||||
}
|
||||
shouldPlayPercentage = 90;
|
||||
if(tc->targetMin && hasTarget < tc->maxtargets)
|
||||
shouldPlayPercentage = 0;
|
||||
if(tc->maxtargets > 1 && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS && hasTarget <= tc->maxtargets)
|
||||
{
|
||||
int maxA = hasTarget-tc->maxtargets;
|
||||
shouldPlayPercentage += (10*maxA);//reduce the chances of playing multitarget if we are not above max targets.
|
||||
}
|
||||
if(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS)
|
||||
{
|
||||
shouldPlayPercentage = 40 + (10*hasTarget);
|
||||
int totalCost = pMana->getConvertedCost()-currentCost;
|
||||
int totalTargets = hasTarget+hasTarget;
|
||||
if(hasX && totalCost <= totalTargets)// {x} spell with unlimited targeting tend to divide damage, we want atleast 1 damage per target before casting.
|
||||
{
|
||||
shouldPlayPercentage = 0;
|
||||
}
|
||||
}
|
||||
SAFE_DELETE(tc);
|
||||
}
|
||||
else
|
||||
{
|
||||
int shouldPlay = effectBadOrGood(card);
|
||||
if (shouldPlay == BAKA_EFFECT_GOOD)
|
||||
{
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (BAKA_EFFECT_DONTKNOW == shouldPlay)
|
||||
{
|
||||
//previously shouldPlayPercentage = 80;, I found this a little to high
|
||||
//for cards which AI had no idea how to use.
|
||||
shouldPlayPercentage = 60;
|
||||
}
|
||||
else if (card->isLand())
|
||||
{
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (!card->isLand() && card->has(Constants::PAYZERO))
|
||||
{
|
||||
shouldPlayPercentage = 70;
|
||||
}
|
||||
else
|
||||
{
|
||||
// shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance.
|
||||
shouldPlayPercentage = 1;
|
||||
}
|
||||
|
||||
}
|
||||
//Reduce the chances of playing a spell with X cost if available mana is low
|
||||
if (hasX)
|
||||
{
|
||||
int xDiff = pMana->getConvertedCost() - currentCost;
|
||||
if (xDiff < 0)
|
||||
xDiff = 0;
|
||||
shouldPlayPercentage = shouldPlayPercentage - static_cast<int> ((shouldPlayPercentage * 1.9f) / (1 + xDiff));
|
||||
}
|
||||
if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti)
|
||||
{
|
||||
shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost()));
|
||||
if(shouldPlayPercentage <= 10)
|
||||
shouldPlayPercentage = shouldPlayPercentage/3;
|
||||
}
|
||||
DebugTrace("Should I play " << (card ? card->name : "Nothing" ) << "?" << endl
|
||||
<<"shouldPlayPercentage = "<< shouldPlayPercentage);
|
||||
if(card->getRestrictions().size())
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
}
|
||||
int randomChance = randomGenerator.random();
|
||||
int chance = randomChance % 100;
|
||||
if (chance > shouldPlayPercentage)
|
||||
continue;
|
||||
if(shouldPlayPercentage <= 10)
|
||||
{
|
||||
DebugTrace("shouldPlayPercentage was less than 10 this was a lottery roll on RNG");
|
||||
}
|
||||
nextCardToPlay = card;
|
||||
maxCost = currentCost;
|
||||
if (hasX)
|
||||
maxCost = pMana->getConvertedCost();
|
||||
}
|
||||
}
|
||||
//canplayfromexile
|
||||
while ((card = cd.nextmatch(game->exile, card))&& card->has(Constants::CANPLAYFROMEXILE))
|
||||
{
|
||||
if (!CanHandleCost(card->getManaCost(),card))
|
||||
continue;
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LAND))
|
||||
{
|
||||
if (game->playRestrictions->canPutIntoZone(card, game->inPlay) == PlayRestriction::CANT_PLAY)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
|
||||
continue;
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1]))
|
||||
continue;
|
||||
|
||||
if(hints && hints->HintSaysItsForCombo(observer,card))
|
||||
{
|
||||
if(hints->canWeCombo(observer,card,this))
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
nextCardToPlay = card;
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(nextCardToPlay->getManaCost()) || nextCardToPlay->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(nextCardToPlay,nextCardToPlay->getManaCost());
|
||||
return activateCombo();
|
||||
}
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
int hasX = card->getManaCost()->hasX();
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(card->getManaCost()) || card->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(card,card->getManaCost());
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost())))
|
||||
{
|
||||
TargetChooserFactory tcf(observer);
|
||||
TargetChooser * tc = tcf.createTargetChooser(card);
|
||||
int shouldPlayPercentage = 0;
|
||||
if (tc)
|
||||
{
|
||||
int hasTarget = chooseTarget(tc,NULL,NULL,true);
|
||||
if(
|
||||
(tc->maxtargets > hasTarget && tc->maxtargets > 1 && !tc->targetMin && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS) ||//target=<3>creature
|
||||
(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS && hasTarget < 1)//target=creatures
|
||||
)
|
||||
hasTarget = 0;
|
||||
if (!hasTarget)//single target covered here.
|
||||
{
|
||||
SAFE_DELETE(tc);
|
||||
continue;
|
||||
}
|
||||
shouldPlayPercentage = 90;
|
||||
if(tc->targetMin && hasTarget < tc->maxtargets)
|
||||
shouldPlayPercentage = 0;
|
||||
if(tc->maxtargets > 1 && tc->maxtargets != TargetChooser::UNLITMITED_TARGETS && hasTarget <= tc->maxtargets)
|
||||
{
|
||||
int maxA = hasTarget-tc->maxtargets;
|
||||
shouldPlayPercentage += (10*maxA);//reduce the chances of playing multitarget if we are not above max targets.
|
||||
}
|
||||
if(tc->maxtargets == TargetChooser::UNLITMITED_TARGETS)
|
||||
{
|
||||
shouldPlayPercentage = 40 + (10*hasTarget);
|
||||
int totalCost = pMana->getConvertedCost()-currentCost;
|
||||
int totalTargets = hasTarget+hasTarget;
|
||||
if(hasX && totalCost <= totalTargets)// {x} spell with unlimited targeting tend to divide damage, we want atleast 1 damage per target before casting.
|
||||
{
|
||||
shouldPlayPercentage = 0;
|
||||
}
|
||||
}
|
||||
SAFE_DELETE(tc);
|
||||
}
|
||||
else
|
||||
{
|
||||
int shouldPlay = effectBadOrGood(card);
|
||||
if (shouldPlay == BAKA_EFFECT_GOOD)
|
||||
{
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (BAKA_EFFECT_DONTKNOW == shouldPlay)
|
||||
{
|
||||
//previously shouldPlayPercentage = 80;, I found this a little to high
|
||||
//for cards which AI had no idea how to use.
|
||||
shouldPlayPercentage = 60;
|
||||
}
|
||||
else if (card->isLand())
|
||||
{
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (!card->isLand() && card->has(Constants::PAYZERO))
|
||||
{
|
||||
shouldPlayPercentage = 70;
|
||||
}
|
||||
else
|
||||
{
|
||||
// shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance.
|
||||
shouldPlayPercentage = 1;
|
||||
}
|
||||
|
||||
}
|
||||
//Reduce the chances of playing a spell with X cost if available mana is low
|
||||
if (hasX)
|
||||
{
|
||||
int xDiff = pMana->getConvertedCost() - currentCost;
|
||||
if (xDiff < 0)
|
||||
xDiff = 0;
|
||||
shouldPlayPercentage = shouldPlayPercentage - static_cast<int> ((shouldPlayPercentage * 1.9f) / (1 + xDiff));
|
||||
}
|
||||
if(card->getManaCost() && card->getManaCost()->getKicker() && card->getManaCost()->getKicker()->isMulti)
|
||||
{
|
||||
shouldPlayPercentage = 10* size_t(gotPayments.size())/int(1+(card->getManaCost()->getConvertedCost()+card->getManaCost()->getKicker()->getConvertedCost()));
|
||||
if(shouldPlayPercentage <= 10)
|
||||
shouldPlayPercentage = shouldPlayPercentage/3;
|
||||
}
|
||||
DebugTrace("Should I play " << (card ? card->name : "Nothing" ) << "?" << endl
|
||||
<<"shouldPlayPercentage = "<< shouldPlayPercentage);
|
||||
if(card->getRestrictions().size())
|
||||
{
|
||||
AbilityFactory af(observer);
|
||||
int canPlay = af.parseCastRestrictions(card,card->controller(),card->getRestrictions());
|
||||
if(!canPlay)
|
||||
continue;
|
||||
}
|
||||
int randomChance = randomGenerator.random();
|
||||
int chance = randomChance % 100;
|
||||
if (chance > shouldPlayPercentage)
|
||||
continue;
|
||||
if(shouldPlayPercentage <= 10)
|
||||
{
|
||||
DebugTrace("shouldPlayPercentage was less than 10 this was a lottery roll on RNG");
|
||||
}
|
||||
nextCardToPlay = card;
|
||||
maxCost = currentCost;
|
||||
if (hasX)
|
||||
maxCost = pMana->getConvertedCost();
|
||||
}
|
||||
}
|
||||
while ((card = cd.nextmatch(game->hand, card)))
|
||||
{
|
||||
if (!CanHandleCost(card->getManaCost(),card))
|
||||
@@ -1829,6 +2137,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
{
|
||||
shouldPlayPercentage = 90;
|
||||
}
|
||||
else if (!card->isLand() && card->has(Constants::PAYZERO))
|
||||
{
|
||||
shouldPlayPercentage = 70;
|
||||
}
|
||||
else
|
||||
{
|
||||
// shouldPlay == baka_effect_bad giving it a 1 for odd ball lottery chance.
|
||||
@@ -2109,6 +2421,56 @@ int AIPlayerBaka::computeActions()
|
||||
nextCardToPlay = NULL;
|
||||
count++;
|
||||
}
|
||||
|
||||
if(nextCardToPlay == NULL)//check if there is a free card to play, play it....
|
||||
{//TODO: add potential mana if we can pay if there is a cost increaser in play
|
||||
CardDescriptor cd;
|
||||
if (game->hand->hasAbility(Constants::PAYZERO))
|
||||
{
|
||||
//Attempt to put free cards into play
|
||||
cd.init();
|
||||
cd.SetExclusionColor(Constants::MTG_COLOR_LAND);
|
||||
MTGCardInstance *freecard = cd.match(game->hand);
|
||||
int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay);
|
||||
if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1))
|
||||
{
|
||||
MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST);
|
||||
AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action
|
||||
clickstream.push(aa);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (game->graveyard->hasAbility(Constants::PAYZERO) && game->graveyard->hasAbility(Constants::CANPLAYFROMGRAVEYARD))
|
||||
{
|
||||
//Attempt to put free cards into play
|
||||
cd.init();
|
||||
cd.SetExclusionColor(Constants::MTG_COLOR_LAND);
|
||||
MTGCardInstance *freecard = cd.match(game->graveyard);
|
||||
int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay);
|
||||
if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMGRAVEYARD) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100))
|
||||
{
|
||||
MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST);
|
||||
AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action
|
||||
clickstream.push(aa);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (game->exile->hasAbility(Constants::PAYZERO) && game->exile->hasAbility(Constants::CANPLAYFROMEXILE))
|
||||
{
|
||||
//Attempt to put free cards into play
|
||||
cd.init();
|
||||
cd.SetExclusionColor(Constants::MTG_COLOR_LAND);
|
||||
MTGCardInstance *freecard = cd.match(game->exile);
|
||||
int canCastCard = game->playRestrictions->canPutIntoZone(freecard, game->inPlay);
|
||||
if (freecard && (canCastCard == PlayRestriction::CAN_PLAY) && freecard->has(Constants::PAYZERO) && freecard->has(Constants::CANPLAYFROMEXILE) && (freecard->getIncreasedManaCost()->getConvertedCost() < 1) && (freecard->alias != 001100))
|
||||
{
|
||||
MTGAbility * castFreeCard = observer->mLayers->actionLayer()->getAbility(MTGAbility::PAYZERO_COST);
|
||||
AIAction * aa = NEW AIAction(this, castFreeCard, freecard); //TODO putinplay action
|
||||
clickstream.push(aa);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}//end
|
||||
}
|
||||
|
||||
SAFE_DELETE(currentMana);
|
||||
|
||||
@@ -126,7 +126,35 @@ int Damage::resolve()
|
||||
}
|
||||
_target->doDamageTest = 1;
|
||||
}
|
||||
if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
|
||||
{
|
||||
if(source->has(Constants::LIBRARYEATER) && typeOfDamage == 1)
|
||||
{
|
||||
for (int j = damage; j > 0; j--)
|
||||
{
|
||||
if(((Player*)target)->game->library->nb_cards)
|
||||
((Player*)target)->game->putInZone(((Player*)target)->game->library->cards[((Player*)target)->game->library->nb_cards - 1], ((Player*)target)->game->library, ((Player*)target)->game->graveyard);
|
||||
}
|
||||
damage = 0;
|
||||
}
|
||||
if(source->alias == 89092 && typeOfDamage == 1)//Szadek Lord of Secrets
|
||||
{
|
||||
for (int j = damage; j > 0; j--)
|
||||
{
|
||||
if(((Player*)target)->game->library->nb_cards)
|
||||
((Player*)target)->game->putInZone(((Player*)target)->game->library->cards[((Player*)target)->game->library->nb_cards - 1], ((Player*)target)->game->library, ((Player*)target)->game->graveyard);
|
||||
|
||||
source->counters->addCounter(1, 1);
|
||||
}
|
||||
damage = 0;
|
||||
}
|
||||
if (!damage)
|
||||
{
|
||||
state = RESOLVED_NOK;
|
||||
delete (e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int a = damage;
|
||||
|
||||
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (source->has(Constants::WITHER) || source->has(
|
||||
|
||||
@@ -1156,7 +1156,7 @@ void GameObserver::Affinity()
|
||||
card->getManaCost()->remove(color,1);
|
||||
}
|
||||
}
|
||||
//SAFE_DELETE(original);
|
||||
SAFE_DELETE(original);
|
||||
}//end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1156,10 +1156,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
observer->addObserver(NEW MTGMorphCostRule(observer, -1));
|
||||
return NULL;
|
||||
}
|
||||
found = s.find("playfromgraveyardrule");
|
||||
found = s.find("payzerorule");
|
||||
if(found != string::npos)
|
||||
{
|
||||
observer->addObserver(NEW MTGPlayFromGraveyardRule(observer, -1));
|
||||
observer->addObserver(NEW MTGPayZeroRule(observer, -1));
|
||||
return NULL;
|
||||
}
|
||||
//this rule handles attacking ability during attacker phase
|
||||
@@ -3080,7 +3080,11 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
}
|
||||
else if(s.find("cdaactive") != string::npos)
|
||||
{
|
||||
return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true);
|
||||
MTGAbility * a = NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true);
|
||||
a->forcedAlive = 1;
|
||||
a->forceDestroy = -1;
|
||||
return a;
|
||||
//return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,true);
|
||||
}
|
||||
else
|
||||
return NEW APowerToughnessModifier(observer, id, card, target, wppt,s,nonstatic);
|
||||
@@ -3689,9 +3693,6 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
|
||||
badAbilities[(int)Constants::WEAK] = true;
|
||||
badAbilities[(int)Constants::NOLIFEGAIN] = true;
|
||||
badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true;
|
||||
badAbilities[(int)Constants::CANTLOSE] = false;
|
||||
badAbilities[(int)Constants::CANTLIFELOSE] = false;
|
||||
badAbilities[(int)Constants::CANTMILLLOSE] = false;
|
||||
|
||||
if (AInstantBasicAbilityModifierUntilEOT * abi = dynamic_cast<AInstantBasicAbilityModifierUntilEOT *>(a))
|
||||
{
|
||||
@@ -3754,7 +3755,7 @@ int AbilityFactory::getAbilities(vector<MTGAbility *> * v, Spell * spell, MTGCar
|
||||
if (dest == zones->exile)
|
||||
{
|
||||
magicText = card->magicTexts["exile"];
|
||||
card->exileEffects = true;
|
||||
card->exileEffects = true;
|
||||
break;
|
||||
}
|
||||
if (dest == zones->library)
|
||||
|
||||
@@ -918,6 +918,25 @@ JQuadPtr MTGCardInstance::getIcon()
|
||||
return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB);
|
||||
}
|
||||
|
||||
ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * oldCost)
|
||||
{
|
||||
if(card->isLand())
|
||||
return oldCost;
|
||||
|
||||
if(!card)
|
||||
return oldCost;
|
||||
//use forcedalive//
|
||||
//pay zero costs//
|
||||
//kicker???...//
|
||||
//morph cost todo//
|
||||
//trinisphere must be here below//
|
||||
if(card->has(Constants::TRINISPHERE))
|
||||
for(int jj = oldCost->getConvertedCost(); jj < 3; jj++)
|
||||
oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1);
|
||||
|
||||
return oldCost;
|
||||
}
|
||||
|
||||
MTGCardInstance * MTGCardInstance::getNextPartner()
|
||||
{
|
||||
MTGInPlay * inplay = controller()->game->inPlay;
|
||||
|
||||
@@ -93,6 +93,16 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
|
||||
}
|
||||
}
|
||||
}
|
||||
if (key == "anyzone")
|
||||
{
|
||||
if (!primitive) primitive = NEW CardPrimitive();
|
||||
primitive->addMagicText(val,"hand");
|
||||
primitive->addMagicText(val,"library");
|
||||
primitive->addMagicText(val,"graveyard");
|
||||
primitive->addMagicText(val,"stack");
|
||||
primitive->addMagicText(val,"exile");
|
||||
primitive->addMagicText(val);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'b': //buyback
|
||||
|
||||
@@ -148,9 +148,10 @@ const char* Constants::MTGBasicAbilities[] = {
|
||||
"protectionfromcoloredspells",
|
||||
"mygcreatureexiler",
|
||||
"oppgcreatureexiler",
|
||||
"payzero",
|
||||
"zerocast",
|
||||
"trinisphere",
|
||||
"canplayfromexile"
|
||||
"canplayfromexile",
|
||||
"libraryeater"
|
||||
};
|
||||
|
||||
map<string,int> Constants::MTGBasicAbilitiesMap;
|
||||
|
||||
@@ -284,8 +284,10 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
{
|
||||
int cardsinhand = game->players[0]->game->hand->nb_cards;
|
||||
Player * player = game->currentlyActing();
|
||||
if (!player->game->hand->hasCard(card))
|
||||
return 0;
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
if ((game->turn < 1) && (cardsinhand != 0) && (card->basicAbilities[(int)Constants::LEYLINE])
|
||||
&& game->getCurrentGamePhase() == MTG_PHASE_FIRSTMAIN
|
||||
&& game->players[0]->game->graveyard->nb_cards == 0
|
||||
@@ -295,7 +297,7 @@ int MTGPutInPlayRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
|
||||
if (card->basicAbilities[(int)Constants::LEYLINE])
|
||||
{
|
||||
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
|
||||
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp);
|
||||
Spell * spell = NEW Spell(game, copy);
|
||||
spell->resolve();
|
||||
delete spell;
|
||||
@@ -412,7 +414,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
|
||||
delete previousManaPool;
|
||||
if (card->isLand())
|
||||
{
|
||||
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
|
||||
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp);
|
||||
Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, payResult);
|
||||
spell->resolve();
|
||||
delete spellCost;
|
||||
@@ -421,7 +423,7 @@ int MTGPutInPlayRule::reactToClick(MTGCardInstance * card)
|
||||
else
|
||||
{
|
||||
Spell * spell = NULL;
|
||||
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack);
|
||||
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack);
|
||||
if (game->targetChooser)
|
||||
{
|
||||
spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, payResult, 0);
|
||||
@@ -475,8 +477,10 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
if(OptionKicker::KICKER_ALWAYS == options[Options::KICKERPAYMENT].number)
|
||||
return 0;
|
||||
Player * player = game->currentlyActing();
|
||||
if(!player->game->hand->hasCard(card))
|
||||
return 0;
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
ManaCost * kicker = card->getManaCost()->getKicker();
|
||||
if(!kicker)
|
||||
{
|
||||
@@ -484,8 +488,12 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
|
||||
return 0;
|
||||
}
|
||||
ManaCost * playerMana = player->getManaPool();
|
||||
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
|
||||
withKickerCost->add(withKickerCost->getKicker());
|
||||
ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());
|
||||
if(card->getIncreasedManaCost()->getConvertedCost())
|
||||
withKickerCost->add(card->getIncreasedManaCost());
|
||||
if(card->getReducedManaCost()->getConvertedCost())
|
||||
withKickerCost->remove(card->getReducedManaCost());
|
||||
withKickerCost->add(card->model->data->getManaCost()->getKicker());
|
||||
if(!playerMana->canAfford(withKickerCost))
|
||||
{
|
||||
delete withKickerCost;
|
||||
@@ -503,12 +511,16 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
||||
return 0;
|
||||
|
||||
Player * player = game->currentlyActing();
|
||||
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());//using pointers here alters the real cost of the card.
|
||||
if (card->getManaCost()->getKicker()->isMulti)
|
||||
ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());//using pointers here alters the real cost of the card.
|
||||
if(card->getIncreasedManaCost()->getConvertedCost())
|
||||
withKickerCost->add(card->getIncreasedManaCost());
|
||||
if(card->getReducedManaCost()->getConvertedCost())
|
||||
withKickerCost->remove(card->getReducedManaCost());
|
||||
if (card->model->data->getManaCost()->getKicker()->isMulti)
|
||||
{
|
||||
while(player->getManaPool()->canAfford(withKickerCost))
|
||||
{
|
||||
withKickerCost->add(withKickerCost->getKicker());
|
||||
withKickerCost->add(card->model->data->getManaCost()->getKicker());
|
||||
card->kicked += 1;
|
||||
}
|
||||
card->kicked -= 1;
|
||||
@@ -518,7 +530,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
||||
}
|
||||
else
|
||||
{
|
||||
withKickerCost->add(withKickerCost->getKicker());
|
||||
withKickerCost->add(card->model->data->getManaCost()->getKicker());
|
||||
card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
|
||||
}
|
||||
if (withKickerCost->isExtraPaymentSet())
|
||||
@@ -545,7 +557,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
||||
delete previousManaPool;
|
||||
if (card->isLand())
|
||||
{
|
||||
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->temp);
|
||||
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->temp);
|
||||
Spell * spell = NEW Spell(game, 0,copy,NULL,NULL, ManaCost::MANA_PAID_WITH_KICKER);
|
||||
spell->resolve();
|
||||
delete spellCost;
|
||||
@@ -554,7 +566,7 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
|
||||
else
|
||||
{
|
||||
Spell * spell = NULL;
|
||||
MTGCardInstance * copy = player->game->putInZone(card, player->game->hand, player->game->stack);
|
||||
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack);
|
||||
if (game->targetChooser)
|
||||
{
|
||||
spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0);
|
||||
@@ -616,7 +628,9 @@ PermanentAbility(observer, _id)
|
||||
int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
{
|
||||
ManaCost * alternateCost = card->getManaCost()->getAlternative();
|
||||
if (!game->currentlyActing()->game->hand->hasCard(card))
|
||||
if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card))
|
||||
return 0;
|
||||
if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
return isReactingToClick( card, mana, alternateCost );
|
||||
}
|
||||
@@ -630,7 +644,12 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
|
||||
if(!allowedToAltCast(card,player))
|
||||
return 0;
|
||||
|
||||
if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size())
|
||||
|
||||
if(card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||
alternativeName = "Alternate Cast From Graveyard";
|
||||
else if(card->has(Constants::CANPLAYFROMEXILE))
|
||||
alternativeName = "Alternate Cast From Exile";
|
||||
else if(card->model->data->getManaCost()->getAlternative() && card->model->data->getManaCost()->getAlternative()->alternativeName.size())
|
||||
alternativeName = card->model->data->getManaCost()->getAlternative()->alternativeName;
|
||||
|
||||
if (card->isLand())
|
||||
@@ -763,8 +782,10 @@ MTGAlternativeCostRule(observer, _id)
|
||||
int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
{
|
||||
Player * player = game->currentlyActing();
|
||||
if (!player->game->hand->hasCard(card))
|
||||
return 0;
|
||||
if (!player->game->hand->hasCard(card) && !player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card))
|
||||
return 0;
|
||||
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
|
||||
return 0;
|
||||
if(!allowedToCast(card,player))
|
||||
return 0;
|
||||
return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->getBuyback() );
|
||||
@@ -1129,46 +1150,60 @@ MTGMorphCostRule * MTGMorphCostRule::clone() const
|
||||
//-------------------------------------------------------------------------
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
MTGPlayFromGraveyardRule::MTGPlayFromGraveyardRule(GameObserver* observer, int _id) :
|
||||
MTGPayZeroRule::MTGPayZeroRule(GameObserver* observer, int _id) :
|
||||
MTGAlternativeCostRule(observer, _id)
|
||||
{
|
||||
aType = MTGAbility::CASTINGRAVEYARD_COST;
|
||||
aType = MTGAbility::PAYZERO_COST;
|
||||
}
|
||||
|
||||
int MTGPlayFromGraveyardRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
|
||||
{
|
||||
Player * player = game->currentlyActing();
|
||||
ManaCost * cost = card->getManaCost();
|
||||
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL));
|
||||
if(card->getIncreasedManaCost()->getConvertedCost())
|
||||
cost->add(card->getIncreasedManaCost());
|
||||
if(card->getReducedManaCost()->getConvertedCost())
|
||||
cost->remove(card->getReducedManaCost());
|
||||
|
||||
if (!player->game->graveyard->hasCard(card))
|
||||
if(card->isLand())
|
||||
return 0;
|
||||
if (!card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||
if(!card->has(Constants::PAYZERO))
|
||||
return 0;
|
||||
|
||||
if (!player->game->graveyard->hasCard(card) && !player->game->exile->hasCard(card) && !player->game->hand->hasCard(card))
|
||||
return 0;
|
||||
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
|
||||
return 0;
|
||||
if(card->has(Constants::CANPLAYFROMGRAVEYARD))
|
||||
CustomName = "Zero Cast From Graveyard";
|
||||
else if(card->has(Constants::CANPLAYFROMEXILE))
|
||||
CustomName = "Zero Cast From Exile";
|
||||
else
|
||||
CustomName = "Zero Cast From Anywhere";
|
||||
|
||||
return MTGAlternativeCostRule::isReactingToClick(card, mana, cost);
|
||||
}
|
||||
|
||||
int MTGPlayFromGraveyardRule::reactToClick(MTGCardInstance * card)
|
||||
int MTGPayZeroRule::reactToClick(MTGCardInstance * card)
|
||||
{
|
||||
if (!isReactingToClick(card))
|
||||
return 0;
|
||||
|
||||
ManaCost * cost = card->getManaCost();
|
||||
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL));
|
||||
|
||||
card->paymenttype = MTGAbility::CASTINGRAVEYARD_COST;
|
||||
card->paymenttype = MTGAbility::PAYZERO_COST;
|
||||
|
||||
return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OTHERCOST);
|
||||
return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID);
|
||||
}
|
||||
|
||||
ostream& MTGPlayFromGraveyardRule::toString(ostream& out) const
|
||||
ostream& MTGPayZeroRule::toString(ostream& out) const
|
||||
{
|
||||
out << "MTGPlayFromGraveyardRule ::: (";
|
||||
out << "MTGPayZeroRule ::: (";
|
||||
return MTGAbility::toString(out) << ")";
|
||||
}
|
||||
|
||||
MTGPlayFromGraveyardRule * MTGPlayFromGraveyardRule::clone() const
|
||||
MTGPayZeroRule * MTGPayZeroRule::clone() const
|
||||
{
|
||||
return NEW MTGPlayFromGraveyardRule(*this);
|
||||
return NEW MTGPayZeroRule(*this);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1718,7 +1753,7 @@ int MTGMomirRule::reactToClick(MTGCardInstance * card_to_discard, int cardId)
|
||||
ManaCost * cost = player->getManaPool();
|
||||
player->getManaPool()->pay(cost);
|
||||
MTGCardInstance * card = genCreature(cardId);
|
||||
player->game->putInZone(card_to_discard, player->game->hand, player->game->graveyard);
|
||||
player->game->putInZone(card_to_discard, card_to_discard->currentZone, player->game->graveyard);
|
||||
|
||||
player->game->stack->addCard(card);
|
||||
Spell * spell = NEW Spell(game, card);
|
||||
|
||||
Reference in New Issue
Block a user