Merge branch 'master' into cmake

This commit is contained in:
xawotihs
2016-06-07 23:35:26 +02:00
34 changed files with 12994 additions and 2149 deletions
+427 -95
View File
@@ -937,6 +937,17 @@ text={T}: Add {1} to your mana pool. -- {T}: Add {W} or {U} to your mana pool. A
type=Land type=Land
[/card] [/card]
[card] [card]
name=Adarkar Windform
abilities=flying
auto={1}{i}:-flying target(creature)
text=Flying -- {1}{S}i}: Target creature loses flying until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={4}{U}
type=Snow Creature
subtype=Illusion
power=3
toughness=3
[/card]
[card]
name=Addle name=Addle
target=player target=player
auto=chooseacolor target(*[chosencolor]|targetedpersonshand) reject chooseend auto=chooseacolor target(*[chosencolor]|targetedpersonshand) reject chooseend
@@ -1501,11 +1512,23 @@ toughness=*
color=white color=white
[/card] [/card]
[card] [card]
name=Ajani Steadfast
auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: add 1 loyalty) donothing restriction{compare(cantargetcre)~lessthan~1}
auto={C(0/0,1,Loyalty)}:name(+1: multi transform) target(creature) transforms((,newability[1/1],newability[vigilance],newability[first strike],newability[lifelink])) ueot restriction{compare(cantargetcre)~morethan~0}
auto={C(0/0,-2,Loyalty)}:name(-2: 1/1 counters) all(creature|mybattlefield) counter(1/1,1) && all(other planeswalker|mybattlefield) counter(0/0,1,Loyalty)
auto={C(0/0,-7,Loyalty)}:name(-7: emblem) emblem transforms((,newability[forcefield controller])) forever dontremove
text=+1: Until end of turn, up to one target creature gets +1/+1 and gains first strike, vigilance, and lifelink. -- -2: Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control. -- -7: You get an emblem with "If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage."
mana={3}{W}
type=Planeswalker
subtype=Ajani
[/card]
[card]
name=Ajani Vengeant name=Ajani Vengeant
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:frozen target(*) auto={C(0/0,1,Loyalty)}:name(+1: tap and hold) frozen target(*)
auto={C(0/0,-2,Loyalty)}:damage:3 target(creature,player) && life:3 controller auto={C(0/0,-2,Loyalty)}:name(-2: damage and gain life) damage:3 target(creature,player) && life:3 controller
auto={C(0/0,-7,Loyalty)}:target(player) destroy all(land|targetedpersonsbattlefield) auto={C(0/0,-7,Loyalty)}:name(-7: ultimate) target(player) destroy all(land|targetedpersonsbattlefield)
text=+1: Target permanent doesn't untap during its controller's next untap step. -- -2: Ajani Vengeant deals 3 damage to target creature or player and you gain 3 life. -- -7: Destroy all lands target player controls. text=+1: Target permanent doesn't untap during its controller's next untap step. -- -2: Ajani Vengeant deals 3 damage to target creature or player and you gain 3 life. -- -7: Destroy all lands target player controls.
mana={2}{R}{W} mana={2}{R}{W}
type=Planeswalker type=Planeswalker
@@ -1514,9 +1537,10 @@ subtype=Ajani
[card] [card]
name=Ajani, Caller of the Pride name=Ajani, Caller of the Pride
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(add counter) ability$!target(creature|battlefield) counter(1/1,1)!$ controller auto={C(0/0,1,Loyalty)}:name(+1: add 1 loyalty) donothing restriction{compare(cantargetcre)~lessthan~1}
auto={C(0/0,-3,Loyalty)}:name(gain ability) flying && double strike target(creature|battlefield) ueot auto={C(0/0,1,Loyalty)}:name(+1: +1/+1 counter) target(creature|battlefield) counter(1/1,1) restriction{compare(cantargetcre)~morethan~0}
auto={C(0/0,-8,Loyalty)}:token(Cat,Creature Cat,2/2,white)*lifetotal auto={C(0/0,-3,Loyalty)}:name(-3: double strike and flying) flying && double strike target(creature|battlefield) ueot
auto={C(0/0,-8,Loyalty)}:name(-8: ultimate) token(Cat,Creature Cat,2/2,white)*lifetotal
text=+1: Put a +1/+1 counter on up to one target creature. -- -3: Target creature gains flying and double strike until end of turn. -- -8: Put X 2/2 white Cat creature tokens onto the battlefield, where X is your life total. text=+1: Put a +1/+1 counter on up to one target creature. -- -3: Target creature gains flying and double strike until end of turn. -- -8: Put X 2/2 white Cat creature tokens onto the battlefield, where X is your life total.
mana={1}{W}{W} mana={1}{W}{W}
type=Planeswalker type=Planeswalker
@@ -3641,8 +3665,8 @@ text=Multikicker (You may pay an additional any number of times as you cast thi
type=Creature type=Creature
subtype=Bird subtype=Bird
mana={2}{W} mana={2}{W}
power=1 power=2
toughness=1 toughness=2
[/card] [/card]
[card] [card]
name=Aphetto Alchemist name=Aphetto Alchemist
@@ -4562,6 +4586,14 @@ power=2
toughness=5 toughness=5
[/card] [/card]
[card] [card]
name=Ardent Plea
abilities=exalted
autostack=if casted(this) then cascade:plibrarycount
text=Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={1}{W}{U}
type=Enchantment
[/card]
[card]
name=Ardent Recruit name=Ardent Recruit
auto=aslongas(artifact|mybattlefield) 2/2 >2 auto=aslongas(artifact|mybattlefield) 2/2 >2
text=Metalcraft - Ardent Recruit gets +2/+2 as long as you control three or more artifacts. text=Metalcraft - Ardent Recruit gets +2/+2 as long as you control three or more artifacts.
@@ -10364,6 +10396,17 @@ mana={2}{B}{G}
type=Enchantment type=Enchantment
[/card] [/card]
[card] [card]
name=Bloodbraid Elf
abilities=haste
autostack=if casted(this) then cascade:plibrarycount
text=Haste -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={2}{R}{G}
type=Creature
subtype=Elf Berserker
power=3
toughness=2
[/card]
[card]
name=Bloodchief Ascension name=Bloodchief Ascension
auto=@each endofturn foelost(2):may counter(0/0,1,Quest) auto=@each endofturn foelost(2):may counter(0/0,1,Quest)
auto=@movedTo(*|opponentgraveyard):this(counter{0/0.3.Quest}) life:-2 opponent && this(counter{0/0.3.Quest}) life:2 controller auto=@movedTo(*|opponentgraveyard):this(counter{0/0.3.Quest}) life:-2 opponent && this(counter{0/0.3.Quest}) life:2 controller
@@ -11712,6 +11755,16 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Boreal Centaur
auto={i}:1/1 limit:1
text={S}i}: Boreal Centaur gets +1/+1 until end of turn. Activate this ability only once each turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={1}{G}
type=Snow Creature
subtype=Centaur Warrior
power=2
toughness=2
[/card]
[card]
name=Boreal Druid name=Boreal Druid
auto={T}:Add{1} auto={T}:Add{1}
text={T}: Add {1} to your mana pool. text={T}: Add {1} to your mana pool.
@@ -11722,6 +11775,17 @@ power=1
toughness=1 toughness=1
[/card] [/card]
[card] [card]
name=Boreal Griffin
abilities=flying
auto={i}:first strike
text=Flying -- {S}i}: Boreal Griffin gains first strike until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={3}{W}{W}
type=Snow Creature
subtype=Griffin
power=3
toughness=2
[/card]
[card]
name=Boreal Shelf name=Boreal Shelf
auto=tap auto=tap
auto={T}:Add{U} auto={T}:Add{U}
@@ -14315,6 +14379,14 @@ mana={3}{U}{U}
type=Sorcery type=Sorcery
[/card] [/card]
[card] [card]
name=Captured Sunlight
autostack=if casted(this) then cascade:plibrarycount
auto=life:4 controller
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -- You gain 4 life.
mana={2}{G}{W}
type=Sorcery
[/card]
[card]
name=Carapace name=Carapace
target=creature target=creature
auto=0/2 auto=0/2
@@ -15838,9 +15910,9 @@ toughness=3
[card] [card]
name=Chandra Ablaze name=Chandra Ablaze
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:name(discard a card) all(this) transforms((,newability[reject notatarget(*|myhand)],newability[@discarded(*[red]|myhand) once:damage:4 target(*[creature;player])])) ueot auto={C(0/0,1,Loyalty)}:name(+1: discard a card) all(this) transforms((,newability[reject notatarget(*|myhand)],newability[@discarded(*[red]|myhand) once:damage:4 target(*[creature;player])])) ueot
auto={C(0/0,-2,Loyalty)}:name(discard hand) reject all(*|hand) && draw:3 all(player) auto={C(0/0,-2,Loyalty)}:name(-2: discard hand) reject all(*|hand) && draw:3 all(player)
auto={C(0/0,-7,Loyalty)}:name(cast cards) castcard(restricted) target(<anyamount>*[instant;sorcery]|mygraveyard) auto={C(0/0,-7,Loyalty)}:name(-7: cast cards) castcard(restricted) target(<anyamount>*[instant;sorcery]|mygraveyard)
text=+1: Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to target creature or player. -- -2: Each player discards his or her hand, then draws three cards. -- -7: Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs. text=+1: Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to target creature or player. -- -2: Each player discards his or her hand, then draws three cards. -- -7: Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs.
mana={4}{R}{R} mana={4}{R}{R}
type=Planeswalker type=Planeswalker
@@ -15849,18 +15921,18 @@ subtype=Chandra
[card] [card]
name=Chandra Nalaar name=Chandra Nalaar
auto=counter(0/0,6,loyalty) auto=counter(0/0,6,loyalty)
auto={C(0/0,1,Loyalty)}:name(1 damage to player) damage:1 target(player) auto={C(0/0,1,Loyalty)}:name(+1: 1 damage to player) damage:1 target(player)
auto={C(0/0,-1,Loyalty)}:name(1 damage to creature) damage:1 target(creature) auto={C(0/0,-1,Loyalty)}:name(-1: 1 damage to creature) damage:1 target(creature)
auto={C(0/0,-2,Loyalty)}:name(2 damage to creature) damage:2 target(creature) auto={C(0/0,-2,Loyalty)}:name(-2: 2 damage to creature) damage:2 target(creature)
auto={C(0/0,-3,Loyalty)}:name(3 damage to creature) damage:3 target(creature) auto={C(0/0,-3,Loyalty)}:name(-3: 3 damage to creature) damage:3 target(creature)
auto={C(0/0,-4,Loyalty)}:name(4 damage to creature) damage:4 target(creature) auto={C(0/0,-4,Loyalty)}:name(-4: 4 damage to creature) damage:4 target(creature)
auto={C(0/0,-5,Loyalty)}:name(5 damage to creature) damage:5 target(creature) auto={C(0/0,-5,Loyalty)}:name(-5: 5 damage to creature) damage:5 target(creature)
auto={C(0/0,-6,Loyalty)}:name(6 damage to creature) damage:6 target(creature) auto={C(0/0,-6,Loyalty)}:name(-6: 6 damage to creature) damage:6 target(creature)
auto={C(0/0,-7,Loyalty)}:name(7 damage to creature) damage:7 target(creature) auto={C(0/0,-7,Loyalty)}:name(-7: 7 damage to creature) damage:7 target(creature)
auto={C(0/0,-8,Loyalty)}:name(8 damage to creature) damage:8 target(creature) auto={C(0/0,-8,Loyalty)}:name(-8: 8 damage to creature) damage:8 target(creature)
auto={C(0/0,-9,Loyalty)}:name(9 damage to creature) damage:9 target(creature) auto={C(0/0,-9,Loyalty)}:name(-9: 9 damage to creature) damage:9 target(creature)
auto={C(0/0,-10,Loyalty)}:name(10 damage to creature) damage:10 target(creature) auto={C(0/0,-10,Loyalty)}:name(-10: 10 damage to creature) damage:10 target(creature)
auto={C(0/0,-8,Loyalty)}:name(10 damage to player and all of his creatures) target(player) damage:10 && damage:10 all(creature|targetedpersonsbattlefield) auto={C(0/0,-8,Loyalty)}:name(-8: 10 damage to player and all of his creatures) target(player) damage:10 && damage:10 all(creature|targetedpersonsbattlefield)
text=+1: Chandra Nalaar deals 1 damage to target player. -- -X: Chandra Nalaar deals X damage to target creature. -- -8: Chandra Nalaar deals 10 damage to target player and each creature he or she controls. text=+1: Chandra Nalaar deals 1 damage to target player. -- -X: Chandra Nalaar deals X damage to target creature. -- -8: Chandra Nalaar deals 10 damage to target player and each creature he or she controls.
mana={3}{R}{R} mana={3}{R}{R}
type=Planeswalker type=Planeswalker
@@ -16420,6 +16492,17 @@ power=1
toughness=1 toughness=1
[/card] [/card]
[card] [card]
name=Chilling Shade
abilities=flying
auto={i}:1/1
text=Flying -- {S}i}: Chilling Shade gets +1/+1 until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={2}{B}
type=Snow Creature
subtype=Shade
power=1
toughness=1
[/card]
[card]
name=Chime of Night name=Chime of Night
target=creature target=creature
auto=@movedTo(this|graveyard) from(battlefield):destroy target(creature[-black]) auto=@movedTo(this|graveyard) from(battlefield):destroy target(creature[-black])
@@ -23973,6 +24056,15 @@ mana={3}{B}{B}
type=Sorcery type=Sorcery
[/card] [/card]
[card] [card]
name=Demonic Dread
target=creature|battlefield
auto=cantblock
autostack=if casted(this) then cascade:plibrarycount
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -- Target creature can't block this turn.
mana={1}{B}{R}
type=Sorcery
[/card]
[card]
name=Demonic Hordes name=Demonic Hordes
auto={T}:destroy target(land) auto={T}:destroy target(land)
auto=upcostmulti[{B}{B}{B}] tap && ability$!name(sacrifice land) notatarget(land|opponentbattlefield) sacrifice!$ opponent auto=upcostmulti[{B}{B}{B}] tap && ability$!name(sacrifice land) notatarget(land|opponentbattlefield) sacrifice!$ opponent
@@ -24087,6 +24179,15 @@ mana={1}{G}
type=Enchantment type=Enchantment
[/card] [/card]
[card] [card]
name=Deny Reality
target=*|battlefield
auto=moveTo(ownerhand)
autostack=if casted(this) then cascade:plibrarycount
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -- Return target permanent to its owner's hand.
mana={3}{U}{B}
type=Sorcery
[/card]
[card]
name=Denying Wind name=Denying Wind
target=player target=player
auto=moveto(exile) target(<upto:7>*|targetedpersonslibrary) auto=moveto(exile) target(<upto:7>*|targetedpersonslibrary)
@@ -24691,6 +24792,17 @@ power=1
toughness=1 toughness=1
[/card] [/card]
[card] [card]
name=Diamond Faerie
abilities=flying
auto={1}{i}:all(creature[snow]|mybattlefield) 1/1 ueot
text=Flying -- {1}{S}i}: Snow creatures you control get +1/+1 until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={2}{G}{W}{U}
type=Snow Creature
subtype=Faerie
power=3
toughness=3
[/card]
[card]
name=Diamond Kaleidoscope name=Diamond Kaleidoscope
auto={3}{T}:token(Prism,creature artifact prism, 0/1, artifact) auto={3}{T}:token(Prism,creature artifact prism, 0/1, artifact)
auto={S(prism|myBattlefield)}:Add{W} auto={S(prism|myBattlefield)}:Add{W}
@@ -29299,9 +29411,9 @@ toughness=3
[card] [card]
name=Elspeth Tirel name=Elspeth Tirel
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,2,Loyalty)}:life:type:creature:mybattlefield auto={C(0/0,2,Loyalty)}:name(+2: gain life) life:type:creature:mybattlefield
auto={C(0/0,-2,Loyalty)}:token(Soldier,Creature Soldier,1/1,white)*3 auto={C(0/0,-2,Loyalty)}:name(-2: soldier) token(Soldier,Creature Soldier,1/1,white)*3
auto={C(0/0,-5,Loyalty)}:destroy all(other *[-land;-token]) auto={C(0/0,-5,Loyalty)}:name(-5: ultimate) destroy all(other *[-land;-token])
text=+2: You gain 1 life for each creature you control. -- -2: Put three 1/1 white Soldier creature tokens onto the battlefield. -- -5: Destroy all other permanents except for lands and tokens. text=+2: You gain 1 life for each creature you control. -- -2: Put three 1/1 white Soldier creature tokens onto the battlefield. -- -5: Destroy all other permanents except for lands and tokens.
mana={3}{W}{W} mana={3}{W}{W}
type=Planeswalker type=Planeswalker
@@ -29310,9 +29422,9 @@ subtype=Elspeth
[card] [card]
name=Elspeth, Knight-Errant name=Elspeth, Knight-Errant
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:token(Soldier,Creature Soldier,1/1,white) auto={C(0/0,1,Loyalty)}:name(+1: soldier) token(Soldier,Creature Soldier,1/1,white)
auto={C(0/0,1,Loyalty)}:3/3 && flying target(creature) auto={C(0/0,1,Loyalty)}:name(+1: +3/+3 flying) 3/3 && flying target(creature)
auto={C(0/0,-8,Loyalty)}:name(emblem) emblem transforms((,newability[lord(*[artifact;creature;land;enchantment]|mybattlefield) indestructible])) forever dontremove auto={C(0/0,-8,Loyalty)}:name(-8: emblem) emblem transforms((,newability[lord(*[artifact;creature;land;enchantment]|mybattlefield) indestructible])) forever dontremove
text=+1: Put a 1/1 white Soldier creature token onto the battlefield. -- +1: Target creature gets +3/+3 and gains flying until end of turn. -- -8: For the rest of the game, artifacts, creatures, enchantments, and lands you control are indestructible. text=+1: Put a 1/1 white Soldier creature token onto the battlefield. -- +1: Target creature gets +3/+3 and gains flying until end of turn. -- -8: For the rest of the game, artifacts, creatures, enchantments, and lands you control are indestructible.
mana={2}{W}{W} mana={2}{W}{W}
type=Planeswalker type=Planeswalker
@@ -30536,6 +30648,16 @@ mana={W}
type=Instant type=Instant
[/card] [/card]
[card] [card]
name=Enlisted Wurm
autostack=if casted(this) then cascade:plibrarycount
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={4}{G}{W}
type=Creature
subtype=Wurm
power=5
toughness=5
[/card]
[card]
name=Enormous Baloth name=Enormous Baloth
mana={6}{G} mana={6}{G}
type=Creature type=Creature
@@ -31417,6 +31539,17 @@ power=4
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Etherium-Horn Sorcerer
auto={1}{U}{R}:moveto(ownerhand)
autostack=if casted(this) then cascade:plibrarycount
text={1}{U}{R}: Return Etherium-Horn Sorcerer to its owner's hand. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={4}{U}{R}
type=Artifact Creature
subtype=Minotaur Wizard
power=3
toughness=6
[/card]
[card]
name=Etherium Abomination name=Etherium Abomination
autograveyard={1}{U}{B}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever autograveyard={1}{U}{B}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever
text=Unearth {1}{U}{B} ({1}{U}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) text=Unearth {1}{U}{B} ({1}{U}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.)
@@ -36772,6 +36905,17 @@ power=5
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Frost Raptor
abilities=flying
auto={i}:shroud
text=Flying -- {S}i{S}i}: Frost Raptor gains shroud until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={2}{U}
type=Snow Creature
subtype=Bird
power=2
toughness=2
[/card]
[card]
name=Frost Walker name=Frost Walker
auto=@targeted(this):sacrifice auto=@targeted(this):sacrifice
text=When Frost Walker becomes the target of a spell or ability, sacrifice it. text=When Frost Walker becomes the target of a spell or ability, sacrifice it.
@@ -37572,10 +37716,10 @@ toughness=3
[card] [card]
name=Garruk, Apex Predator name=Garruk, Apex Predator
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:name(destroy Planeswalker) destroy target(other planeswalker|battlefield) auto={C(0/0,1,Loyalty)}:name(+1: destroy Planeswalker) destroy target(other planeswalker|battlefield)
auto={C(0/0,1,Loyalty)}:name(3/3 Beast) token(Beast,Creature Beast,3/3,deathtouch,black) auto={C(0/0,1,Loyalty)}:name(+1: Beast) token(Beast,Creature Beast,3/3,deathtouch,black)
auto={C(0/0,-3,Loyalty)}:name(Destroy Creature) target(creature) dynamicability<!mytgt toughnesslifegain srccontroller!> && destroy auto={C(0/0,-3,Loyalty)}:name(-3: Destroy creature) target(creature) dynamicability<!mytgt toughnesslifegain srccontroller!> && destroy
auto={C(0/0,-8,Loyalty)}:name(Emblem) emblem transforms((,newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) 5/5 ueot],newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) trample ueot])) forever dontremove auto={C(0/0,-8,Loyalty)}:name(-8: Emblem) emblem transforms((,newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) 5/5 ueot],newability[@combat(attacking) source(creature|mybattlefield):all(trigger[to]) trample ueot])) forever dontremove
text=+1: Destroy another target planeswalker. -- +1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield. -- -3: Destroy target creature. You gain life equal to its toughness. -- -8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn." -- Starting Loyalty {5} text=+1: Destroy another target planeswalker. -- +1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield. -- -3: Destroy target creature. You gain life equal to its toughness. -- -8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn." -- Starting Loyalty {5}
mana={5}{B}{G} mana={5}{B}{G}
type=Planeswalker type=Planeswalker
@@ -37584,9 +37728,9 @@ subtype=Garruk
[card] [card]
name=Garruk, Primal Hunter name=Garruk, Primal Hunter
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:token(Beast,Creature Beast,3/3,green) auto={C(0/0,1,Loyalty)}:name(+1: beast) token(Beast,Creature Beast,3/3,green)
auto={C(0/0,-3,Loyalty)}:draw:power:highest:*:mybattlefield auto={C(0/0,-3,Loyalty)}:name(-3: draw) draw:power:highest:*:mybattlefield
auto={C(0/0,-6,Loyalty)}:foreach(land|mybattlefield) token(-22010012) auto={C(0/0,-6,Loyalty)}:name(-6: ultimate) foreach(land|mybattlefield) token(-22010012)
text=+1: Put a 3/3 green Beast creature token onto the battlefield. -- -3: Draw cards equal to the greatest power among creatures you control. -- -6: Put a 6/6 green Wurm creature token onto the battlefield for each land you control. text=+1: Put a 3/3 green Beast creature token onto the battlefield. -- -3: Draw cards equal to the greatest power among creatures you control. -- -6: Put a 6/6 green Wurm creature token onto the battlefield for each land you control.
mana={2}{G}{G}{G} mana={2}{G}{G}{G}
type=Planeswalker type=Planeswalker
@@ -37605,8 +37749,8 @@ color=Green
name=Garruk Relentless name=Garruk Relentless
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto=this(counter{0/0.1.loyalty}<3) flip(Garruk the Veil-Cursed) auto=this(counter{0/0.1.loyalty}<3) flip(Garruk the Veil-Cursed)
auto={0}:target(creature) dynamicability<!mytgt powerstrike tosrc!> damage:3 auto={0}:name(0: powerstrike) target(creature) dynamicability<!mytgt powerstrike tosrc!> damage:3
auto={0}:token(Wolf,Creature Wolf,2/2,green) auto={0}:name(0: wolf) token(Wolf,Creature Wolf,2/2,green)
text=When Garruk Relentless has two or fewer loyalty counters on him, transform him. -- 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him. -- 0: Put a 2/2 green Wolf creature token onto the battlefield. text=When Garruk Relentless has two or fewer loyalty counters on him, transform him. -- 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him. -- 0: Put a 2/2 green Wolf creature token onto the battlefield.
mana={3}{G} mana={3}{G}
type=Planeswalker type=Planeswalker
@@ -37614,9 +37758,9 @@ subtype=Garruk
[/card] [/card]
[card] [card]
name=Garruk the Veil-Cursed name=Garruk the Veil-Cursed
auto={C(0/0,1,Loyalty)}:token(Wolf,Creature Wolf,1/1,black,deathtouch) auto={C(0/0,1,Loyalty)}:name(+1: wolf) token(Wolf,Creature Wolf,1/1,black,deathtouch)
auto={C(0/0,-1,Loyalty)}{S(creature|myBattlefield)}:name(fetch creature) moveTo(ownerhand) notatarget(creature|mylibrary) auto={C(0/0,-1,Loyalty)}{S(creature|myBattlefield)}:name(-1: fetch creature) moveTo(ownerhand) notatarget(creature|mylibrary)
auto={C(0/0,-3,Loyalty)}:all(creature|mybattlefield) trample ueot && all(creature|mybattlefield) foreach(creature|mygraveyard) 1/1 ueot auto={C(0/0,-3,Loyalty)}:name(-3: ultimate) all(creature|mybattlefield) trample ueot && all(creature|mybattlefield) foreach(creature|mygraveyard) 1/1 ueot
text=+1: Put a 1/1 black Wolf creature token with deathtouch onto the battlefield. -- -1: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library. -- -3: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard. text=+1: Put a 1/1 black Wolf creature token with deathtouch onto the battlefield. -- -1: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library. -- -3: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard.
type=Planeswalker type=Planeswalker
subtype=Garruk subtype=Garruk
@@ -37625,9 +37769,9 @@ subtype=Garruk
[card] [card]
name=Garruk Wildspeaker name=Garruk Wildspeaker
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:untap target(<2>land) auto={C(0/0,1,Loyalty)}:name(+1: untap) untap target(<2>land)
auto={C(0/0,-1,Loyalty)}:token(Beast,Creature Beast,3/3,green) auto={C(0/0,-1,Loyalty)}:name(-1: beast) token(Beast,Creature Beast,3/3,green)
auto={C(0/0,-4,Loyalty)}:all(creature|mybattlefield) 3/3 && all(creature|mybattlefield) trample auto={C(0/0,-4,Loyalty)}:name(-4: overrun) all(creature|mybattlefield) 3/3 && all(creature|mybattlefield) trample
text=+1: Untap two target lands. -- -1: Put a 3/3 green Beast creature token onto the battlefield. -- -4: Creatures you control get +3/+3 and gain trample until end of turn. text=+1: Untap two target lands. -- -1: Put a 3/3 green Beast creature token onto the battlefield. -- -4: Creatures you control get +3/+3 and gain trample until end of turn.
mana={2}{G}{G} mana={2}{G}{G}
type=Planeswalker type=Planeswalker
@@ -37953,6 +38097,17 @@ power=0
toughness=1 toughness=1
[/card] [/card]
[card] [card]
name=Gelid Shackles
target=creature
auto=cantblock
auto=noactivatedability
auto={i}:defender
text=Enchant creature -- Enchanted creature can't block and its activated abilities can't be activated. -- {S}i}: Enchanted creature gains defender until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={W}
type=Snow Enchantment
subtype=Aura
[/card]
[card]
name=Gemini Engine name=Gemini Engine
auto=@combat(attacking) source(this):token(Twin,Gemini Creature,p/t,battleready) && all(Twin[gemini]|mybattlefield) phaseaction[combatends,sourceinplay] sacrifice auto=@combat(attacking) source(this):token(Twin,Gemini Creature,p/t,battleready) && all(Twin[gemini]|mybattlefield) phaseaction[combatends,sourceinplay] sacrifice
text=Whenever Gemini Engine attacks, put a colorless Construct artifact creature token named Twin onto the battlefield attacking. Its power is equal to Gemini Engine's power and its toughness is equal to Gemini Engine's toughness. Sacrifice the token at end of combat. text=Whenever Gemini Engine attacks, put a colorless Construct artifact creature token named Twin onto the battlefield attacking. Its power is equal to Gemini Engine's power and its toughness is equal to Gemini Engine's toughness. Sacrifice the token at end of combat.
@@ -38922,9 +39077,9 @@ toughness=2
[card] [card]
name=Gideon, Champion of Justice name=Gideon, Champion of Justice
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(target opponent) target(opponent) deplete:0 && foreach(creature|targetedpersonsbattlefield) counter(0/0,1,loyalty) all(this) auto={C(0/0,1,Loyalty)}:name(+1: target opponent) target(opponent) deplete:0 && foreach(creature|targetedpersonsbattlefield) counter(0/0,1,loyalty) all(this)
auto={0}:transforms((Human Soldier Creature,setpower=counter{0%0.1.Loyalty},settoughness=counter{0%0.1.Loyalty},indestructible)) ueot && transforms((,newability[preventAllDamage to(this)])) ueot auto={0}:name(0: transform) transforms((Human Soldier Creature,setpower=counter{0%0.1.Loyalty},settoughness=counter{0%0.1.Loyalty},indestructible)) ueot && transforms((,newability[preventAllDamage to(this)])) ueot
auto={C(0/0,-15,Loyalty)}:name(exile other permanents) moveto(exile) all(other *) auto={C(0/0,-15,Loyalty)}:name(-15: exile other permanents) moveto(exile) all(other *)
text=+1: Put a loyalty counter on Gideon, Champion of Justice for each creature target opponent controls. -- 0: Until end of turn, Gideon, Champion of Justice becomes an indestructible Human Soldier creature with power and toughness each equal to the number of loyalty counters on him. He's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -15: Exile all other permanents. text=+1: Put a loyalty counter on Gideon, Champion of Justice for each creature target opponent controls. -- 0: Until end of turn, Gideon, Champion of Justice becomes an indestructible Human Soldier creature with power and toughness each equal to the number of loyalty counters on him. He's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -15: Exile all other permanents.
mana={2}{W}{W} mana={2}{W}{W}
type=Planeswalker type=Planeswalker
@@ -40506,6 +40661,17 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Goblin Rimerunner
auto={T}:cantblock target(creature)
auto={i}:haste
text={T}: Target creature can't block this turn. -- {S}i}: Goblin Rimerunner gains haste until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={2}{R}
type=Snow Creature
subtype=Goblin Warrior
power=2
toughness=2
[/card]
[card]
name=Goblin Rock Sled name=Goblin Rock Sled
abilities=trample,cantattack abilities=trample,cantattack
auto=@combat(attacking) source(this):frozen auto=@combat(attacking) source(this):frozen
@@ -50049,9 +50215,9 @@ type=Artifact
[card] [card]
name=Jace Beleren name=Jace Beleren
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,2,Loyalty)}:draw:1 controller && draw:1 opponent auto={C(0/0,2,Loyalty)}:name(+2: each player draw) draw:1 controller && draw:1 opponent
auto={C(0/0,-1,Loyalty)}:draw:1 target(player) auto={C(0/0,-1,Loyalty)}:name(-1: draw 1) draw:1 target(player)
auto={C(0/0,-10,Loyalty)}:deplete:20 target(player) auto={C(0/0,-10,Loyalty)}:name(-10: deplete 20) deplete:20 target(player)
text=+2: Each player draws a card. -- -1: Target player draws a card. -- -10: Target player puts the top twenty cards of his or her library into his or her graveyard. text=+2: Each player draws a card. -- -1: Target player draws a card. -- -10: Target player puts the top twenty cards of his or her library into his or her graveyard.
mana={1}{U}{U} mana={1}{U}{U}
type=Planeswalker type=Planeswalker
@@ -50060,9 +50226,9 @@ subtype=Jace
[card] [card]
name=Jace, Memory Adept name=Jace, Memory Adept
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:deplete:1 target(player) && draw:1 controller auto={C(0/0,1,Loyalty)}:name(+1: deplete) deplete:1 target(player) && draw:1 controller
auto={0}:deplete:10 target(player) auto={0}:name(0: deplete 10) deplete:10 target(player)
auto={C(0/0,-7,Loyalty)}:target(<anyamount>player) draw:20 auto={C(0/0,-7,Loyalty)}:name(-7: draw 20) target(<anyamount>player) draw:20
text=+1: Draw a card. Target player puts the top card of his or her library into his or her graveyard. -- 0: Target player puts the top ten cards of his or her library into his or her graveyard. -- -7: Any number of target players each draw twenty cards. text=+1: Draw a card. Target player puts the top card of his or her library into his or her graveyard. -- 0: Target player puts the top ten cards of his or her library into his or her graveyard. -- -7: Any number of target players each draw twenty cards.
mana={3}{U}{U} mana={3}{U}{U}
type=Planeswalker type=Planeswalker
@@ -52074,6 +52240,18 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Kathari Remnant
abilities=flying
auto={B}:regenerate
autostack=if casted(this) then cascade:plibrarycount
text=Flying -- {B}: Regenerate Kathari Remnant. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={2}{U}{B}
type=Creature
subtype=Bird Skeleton
power=0
toughness=1
[/card]
[card]
name=Kathari Screecher name=Kathari Screecher
abilities=flying abilities=flying
autograveyard={2}{U}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever autograveyard={2}{U}:moveto(mybattlefield) && transforms((,unearth,haste)) asSorcery forever
@@ -53071,7 +53249,7 @@ name=Kiora, the Crashing Wave
auto=counter(0/0,2,loyalty) auto=counter(0/0,2,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Prevention) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt auto={C(0/0,1,Loyalty)}:name(+1: Prevention) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt
auto={C(0/0,-1,Loyalty)}:name(-1: Draw 1 and Lands +1) draw:1 controller && maxPlay(land)+1 ueot auto={C(0/0,-1,Loyalty)}:name(-1: Draw 1 and Lands +1) draw:1 controller && maxPlay(land)+1 ueot
auto={C(0/0,-5,Loyalty)}:emblem name(-5: Emblem) transforms((,newability[@each my endofturn:token(-378521) controller])) forever dontremove auto={C(0/0,-5,Loyalty)}:name(-5: Emblem) emblem transforms((,newability[@each my endofturn:token(-378521) controller])) forever dontremove
text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield." -- Starting Loyalty (2) text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield." -- Starting Loyalty (2)
mana={2}{G}{U} mana={2}{G}{U}
type=Planeswalker type=Planeswalker
@@ -54187,9 +54365,9 @@ type=Land
[card] [card]
name=Koth of the Hammer name=Koth of the Hammer
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:untap target(mountain) && transforms((Elemental Creature,setpower=4,settoughness=4,red)) ueot auto={C(0/0,1,Loyalty)}:name(+1: untap) untap target(mountain) && transforms((Elemental Creature,setpower=4,settoughness=4,red)) ueot
auto={C(0/0,-2,Loyalty)}:foreach(mountain|myBattlefield) add{R} auto={C(0/0,-2,Loyalty)}:name(-2: add mana) foreach(mountain|myBattlefield) add{R}
auto={C(0/0,-5,Loyalty)}:name(emblem) emblem transforms((,newability[lord(mountain|mybattlefield) {t}:damage:1 target(creature)],newability[lord(mountain|mybattlefield) {t}:damage:1 target(player)])) forever dontremove auto={C(0/0,-5,Loyalty)}:name(-5: emblem) emblem transforms((,newability[lord(mountain|mybattlefield) {t}:damage:1 target(creature)],newability[lord(mountain|mybattlefield) {t}:damage:1 target(player)])) forever dontremove
text=+1: Untap target Mountain. It becomes a 4/4 red Elemental creature until end of turn. It's still a land. -- -2: Add {R} to your mana pool for each Mountain you control. -- -5: You get an emblem with "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'" text=+1: Untap target Mountain. It becomes a 4/4 red Elemental creature until end of turn. It's still a land. -- -2: Add {R} to your mana pool for each Mountain you control. -- -5: You get an emblem with "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'"
mana={2}{R}{R} mana={2}{R}{R}
type=Planeswalker type=Planeswalker
@@ -56799,9 +56977,9 @@ toughness=4
[card] [card]
name=Liliana Vess name=Liliana Vess
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer auto={C(0/0,1,Loyalty)}:name(+1: discard) target(player) ability$!name(discard) target(*|myhand) reject!$ targetedplayer
auto={C(0/0,-2,Loyalty)}:target(*|mylibrary) moveTo(library) auto={C(0/0,-2,Loyalty)}:name(-2: fetch) target(*|mylibrary) moveTo(library)
auto={C(0/0,-8,Loyalty)}:moveTo(mybattlefield) all(creature|graveyard) auto={C(0/0,-8,Loyalty)}:name(-8: reanimate) moveTo(mybattlefield) all(creature|graveyard)
text=+1: Target player discards a card. -- -2: Search your library for a card, then shuffle your library and put that card on top of it. -- -8: Put all creature cards in all graveyards onto the battlefield under your control. text=+1: Target player discards a card. -- -2: Search your library for a card, then shuffle your library and put that card on top of it. -- -8: Put all creature cards in all graveyards onto the battlefield under your control.
mana={3}{B}{B} mana={3}{B}{B}
type=Planeswalker type=Planeswalker
@@ -56810,9 +56988,9 @@ subtype=Liliana
[card] [card]
name=Liliana of the Dark Realms name=Liliana of the Dark Realms
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:name(fetch) moveTo(hand) target(swamp|myLibrary) auto={C(0/0,1,Loyalty)}:name(+1: fetch) moveTo(hand) target(swamp|myLibrary)
auto={C(0/0,-3,Loyalty)}:name(choose) ability$!choice name(+X/+X) target(creature) type:land:mybattlefield/type:land:mybattlefield ueot _ choice name(-X/-X) target(creature) -type:land:mybattlefield/-type:land:mybattlefield ueot!$ controller auto={C(0/0,-3,Loyalty)}:name(-3: choose) ability$!choice name(+X/+X) target(creature) type:land:mybattlefield/type:land:mybattlefield ueot _ choice name(-X/-X) target(creature) -type:land:mybattlefield/-type:land:mybattlefield ueot!$ controller
auto={C(0/0,-6,Loyalty)}:name(emblem) emblem transforms((,newability[lord(swamp|mybattlefield) {T}:add{B}{B}{B}{B}])) forever dontremove auto={C(0/0,-6,Loyalty)}:name(-6: emblem) emblem transforms((,newability[lord(swamp|mybattlefield) {T}:add{B}{B}{B}{B}])) forever dontremove
text=+1: Search your library for a Swamp card, reveal it, and put it into your hand. Then shuffle your library. -- -3: Target creature gets +X/+X or -X/-X until end of turn, where X is the number of Swamps you control. -- -6: You get an emblem with "Swamps you control have '{T}: Add {B}{B}{B}{B} to your mana pool.'" text=+1: Search your library for a Swamp card, reveal it, and put it into your hand. Then shuffle your library. -- -3: Target creature gets +X/+X or -X/-X until end of turn, where X is the number of Swamps you control. -- -6: You get an emblem with "Swamps you control have '{T}: Add {B}{B}{B}{B} to your mana pool.'"
mana={2}{B}{B} mana={2}{B}{B}
type=Planeswalker type=Planeswalker
@@ -58597,6 +58775,13 @@ power=5
toughness=6 toughness=6
[/card] [/card]
[card] [card]
name=Maelstrom Nexus
auto=@movedto(*|mystack) restriction{thisturn(*|mystack)~lessthan~2}:all(trigger[to]) transforms((,newability[cascade:plibrarycount])) ueot
text=The first spell you cast each turn has cascade. (When you cast your first spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={W}{U}{B}{R}{G}
type=Enchantment
[/card]
[card]
name=Maelstrom Pulse name=Maelstrom Pulse
target=*[-land] target=*[-land]
auto=all(*[share!name!]) destroy auto=all(*[share!name!]) destroy
@@ -67285,9 +67470,9 @@ toughness=7
[card] [card]
name=Nicol Bolas, Planeswalker name=Nicol Bolas, Planeswalker
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,3,Loyalty)}:destroy target(*[-creature]|battlefield) auto={C(0/0,3,Loyalty)}:name(+3: destroy) destroy target(*[-creature]|battlefield)
auto={C(0/0,-2,Loyalty)}:name(gain control) moveTo(mybattlefield) target(creature) auto={C(0/0,-2,Loyalty)}:name(-2: gain control) moveTo(mybattlefield) target(creature)
auto={C(0/0,-9,Loyalty)}:target(player) damage:7 && all(this) transforms((,newability[ability$!notatarget(<7>*|mybattlefield) sacrifice!$ targetedplayer],newability[ability$!notatarget(<7>*|myhand) reject!$ targetedplayer])) auto={C(0/0,-9,Loyalty)}:name(-9: ultimate) target(player) damage:7 && all(this) transforms((,newability[ability$!notatarget(<7>*|mybattlefield) sacrifice!$ targetedplayer],newability[ability$!notatarget(<7>*|myhand) reject!$ targetedplayer]))
text=+3: Destroy target noncreature permanent. -- -2: Gain control of target creature. -- -9: Nicol Bolas, Planeswalker deals 7 damage to target player. That player discards seven cards, then sacrifices seven permanents. text=+3: Destroy target noncreature permanent. -- -2: Gain control of target creature. -- -9: Nicol Bolas, Planeswalker deals 7 damage to target player. That player discards seven cards, then sacrifices seven permanents.
mana={4}{U}{B}{B}{R} mana={4}{U}{B}{B}{R}
type=Planeswalker type=Planeswalker
@@ -67799,9 +67984,9 @@ mana={4}{B}{B}
[card] [card]
name=Nissa, Worldwaker name=Nissa, Worldwaker
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:name(land becomes 4/4) target(land|mybattlefield) becomes(Elemental Creature,4/4,trample) forever auto={C(0/0,1,Loyalty)}:name(+1: land becomes 4/4) target(land|mybattlefield) becomes(Elemental Creature,4/4,trample) forever
auto={C(0/0,1,Loyalty)}:name(untap up to 4 forest) target(<upto:4>forest|mybattlefield) untap auto={C(0/0,1,Loyalty)}:name(+1: untap up to 4 forest) target(<upto:4>forest|mybattlefield) untap
auto={C(0/0,-7,Loyalty)}:name(search Lands) moveTo(mybattlefield) target(<anyamount>land[basic]|mylibrary) and!( becomes(Elemental Creature,4/4,trample) forever )! oneshot auto={C(0/0,-7,Loyalty)}:name(-7: search Lands) moveTo(mybattlefield) target(<anyamount>land[basic]|mylibrary) and!( becomes(Elemental Creature,4/4,trample) forever )! oneshot
text=+1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. -- +1: Untap up to four target Forests. -- -7: Search your library for any number of basic land cards, put them onto the battlefield, then shuffle your library. Those lands become 4/4 Elemental creatures with trample. They're still lands. text=+1: Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. -- +1: Untap up to four target Forests. -- -7: Search your library for any number of basic land cards, put them onto the battlefield, then shuffle your library. Those lands become 4/4 Elemental creatures with trample. They're still lands.
mana={3}{G}{G} mana={3}{G}{G}
type=Planeswalker type=Planeswalker
@@ -67810,9 +67995,9 @@ subtype=Nissa
[card] [card]
name=Nissa Revane name=Nissa Revane
auto=counter(0/0,2,loyalty) auto=counter(0/0,2,loyalty)
auto={C(0/0,1,Loyalty)}:moveTo(mybattlefield) target(Nissa's Chosen|mylibrary) auto={C(0/0,1,Loyalty)}:name(+1: fetch) moveTo(mybattlefield) target(Nissa's Chosen|mylibrary)
auto={C(0/0,1,Loyalty)}:life:twicetype:elf:mybattlefield controller auto={C(0/0,1,Loyalty)}:name(+1: gain life) life:twicetype:elf:mybattlefield controller
auto={C(0/0,-7,Loyalty)}:moveTo(mybattlefield) target(<anyamount>creature[elf]|mylibrary) auto={C(0/0,-7,Loyalty)}:name(-7: ultimate) moveTo(mybattlefield) target(<anyamount>creature[elf]|mylibrary)
text=+1: Search your library for a card named Nissa's Chosen and put it onto the battlefield. Then shuffle your library. -- +1: You gain 2 life for each Elf you control. -- -7: Search your library for any number of Elf creature cards and put them onto the battlefield. Then shuffle your library. text=+1: Search your library for a card named Nissa's Chosen and put it onto the battlefield. Then shuffle your library. -- +1: You gain 2 life for each Elf you control. -- -7: Search your library for any number of Elf creature cards and put them onto the battlefield. Then shuffle your library.
mana={2}{G}{G} mana={2}{G}{G}
type=Planeswalker type=Planeswalker
@@ -69101,6 +69286,16 @@ power=1
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Ohran Yeti
auto={2}{i}:first strike target(creature[snow])
text={2}{S}i}: Target snow creature gains first strike until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={3}{R}
type=Snow Creature
subtype=Yeti
power=3
toughness=3
[/card]
[card]
name=Ojutai, Soul of Winter name=Ojutai, Soul of Winter
abilities=flying,vigilance abilities=flying,vigilance
auto=@combat(attacking) source(dragon|mybattlefield):name(tap & Freeze) target(*[-land]|opponentbattlefield) transforms((,newability[tap],newability[frozen])) uynt auto=@combat(attacking) source(dragon|mybattlefield):name(tap & Freeze) target(*[-land]|opponentbattlefield) transforms((,newability[tap],newability[frozen])) uynt
@@ -72812,6 +73007,17 @@ power=7
toughness=7 toughness=7
[/card] [/card]
[card] [card]
name=Phyrexian Ironfoot
auto=doesnotuntap
auto={1}{i}:untap
text=Phyrexian Ironfoot doesn't untap during your untap step. -- {1}{S}i}: Untap Phyrexian Ironfoot. ({S}i} can be paid with one mana from a snow permanent.)
mana={3}
type=Snow Artifact Creature
subtype=Construct
power=3
toughness=4
[/card]
[card]
name=Phyrexian Lens name=Phyrexian Lens
auto={L}{T}:Add{W} auto={L}{T}:Add{W}
auto={L}{T}:Add{U} auto={L}{T}:Add{U}
@@ -72954,6 +73160,17 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Phyrexian Snowcrusher
abilities=mustattack
auto={1}{i}:1/0
text=Phyrexian Snowcrusher attacks each turn if able. -- {1}{S}i}: Phyrexian Snowcrusher gets +1/+0 until end of turn. ({S}i} can be paid with one mana from a snow permanent.)
mana={6}
type=Snow Artifact Creature
subtype=Juggernaut
power=6
toughness=5
[/card]
[card]
name=Phyrexian Soulgorger name=Phyrexian Soulgorger
auto=cumulativeupcost[{S(creature|myBattlefield)}] sacrifice auto=cumulativeupcost[{S(creature|myBattlefield)}] sacrifice
text=Cumulative upkeep - Sacrifice a creature. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) text=Cumulative upkeep - Sacrifice a creature. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)
@@ -73862,6 +74079,16 @@ power=4
toughness=4 toughness=4
[/card] [/card]
[card] [card]
name=Platinum Emperion
abilities=cantchangelife
mana={8}
type=Artifact Creature
subtype=Golem
power=8
toughness=8
text=Your life total can't change. (You can't gain or lose life. You can't pay any amount of life except 0.)
[/card]
[card]
name=Plaxcaster Frogling name=Plaxcaster Frogling
auto=counter(1/1,3) auto=counter(1/1,3)
auto={2}:shroud target(creature[counter{1/1.1}]) auto={2}:shroud target(creature[counter{1/1.1}])
@@ -77358,9 +77585,10 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Ral Zarek name=Ral Zarek
auto={C(0/0,1,Loyalty)}:tap target(*) && ability$!untap target(*)!$ controller auto=counter(0/0,4,loyalty)
auto={C(0/0,-2,Loyalty)}:damage:3 target(creature,player) auto={C(0/0,1,Loyalty)}:name(+1: tap and untap) tap target(*) && ability$!untap target(*)!$ controller
auto={C(0/0,-7,Loyalty)}:flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend auto={C(0/0,-2,Loyalty)}:name(-2: 3 damage) damage:3 target(creature,player)
auto={C(0/0,-7,Loyalty)}:name(-7: ultimate) flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend && flipacoin winability turns:+1 controller winabilityend flipend
text=+1: Tap target permanent, then untap another target permanent. -- -2: Ral Zarek deals 3 damage to target creature or player. -- -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads. text=+1: Tap target permanent, then untap another target permanent. -- -2: Ral Zarek deals 3 damage to target creature or player. -- -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads.
mana={2}{U}{R} mana={2}{U}{R}
type=Planeswalker type=Planeswalker
@@ -80548,6 +80776,51 @@ power=1
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Rime Transfusion
target=creature
auto=2/1
auto=teach(creature) {i}:cantbeblockedby(creature[-snow]) ueot
text=Enchant creature -- Enchanted creature gets +2/+1 and has "{S}i}: This creature can't be blocked this turn except by snow creatures." ({S}i} can be paid with one mana from a snow permanent.)
mana={1}{B}
type=Snow Enchantment
subtype=Aura
[/card]
[card]
name=Rimebound Dead
auto={i}:regenerate
text={S}i}: Regenerate Rimebound Dead. ({S}i} can be paid with one mana from a snow permanent.)
mana={B}
type=Snow Creature
subtype=Skeleton
power=1
toughness=1
[/card]
[card]
name=Rimefeather Owl
abilities=flying
anyzone=type:snow:battlefield/type:snow:battlefield cdaactive
auto={1}{i}:counter(0/0,1,Ice) target(*)
auto=lord(*[counter{0/0.1.Ice}]) transforms((snow))
text=Flying -- Rimefeather Owl's power and toughness are each equal to the number of snow permanents on the battlefield. -- {1}{S}i}: Put an ice counter on target permanent. -- Permanents with ice counters on them are snow.
mana={5}{U}{U}
type=Snow Creature
subtype=Bird
power=*
toughness=*
[/card]
[card]
name=Rimescale Dragon
abilities=flying
auto={2}{i}:name(tap) target(creature) transforms((,newability[counter(0/0.1.Ice)]))
auto=lord(creature[counter{0/0.1.Ice}]) doesnotuntap
text=Flying -- {2}{S}i}: Tap target creature and put an ice counter on it. ({S}i} can be paid with one mana from a snow permanent.) -- Creatures with ice counters on them don't untap during their controllers' untap steps.
mana={5}{R}{R}
type=Snow Creature
subtype=Dragon
power=5
toughness=5
[/card]
[card]
name=Rimewind Taskmage name=Rimewind Taskmage
auto=aslongas(*[snow]|myBattlefield) {1}{T}:tap target(*) >3 auto=aslongas(*[snow]|myBattlefield) {1}{T}:tap target(*) >3
auto=aslongas(*[snow]|myBattlefield) {1}{T}:untap target(*) >3 auto=aslongas(*[snow]|myBattlefield) {1}{T}:untap target(*) >3
@@ -83759,9 +84032,9 @@ toughness=1
[card] [card]
name=Sarkhan Vol name=Sarkhan Vol
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:all(creature|mybattlefield) 1/1 && all(creature|mybattlefield) haste auto={C(0/0,1,Loyalty)}:name(+1: +1/+1 haste) all(creature|mybattlefield) 1/1 && all(creature|mybattlefield) haste
auto={C(0/0,-2,Loyalty)}:target(creature) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot auto={C(0/0,-2,Loyalty)}:name(-2: gain control) target(creature) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot
auto={C(0/0,-6,Loyalty)}:token(Dragon,Creature Dragon,4/4,red,flying)*5 auto={C(0/0,-6,Loyalty)}:name(-6: 5 Dragons) token(Dragon,Creature Dragon,4/4,red,flying)*5
text=+1: Creatures you control get +1/+1 and gain haste until end of turn. -- -2: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -- -6: Put five 4/4 red Dragon creature tokens with flying onto the battlefield. text=+1: Creatures you control get +1/+1 and gain haste until end of turn. -- -2: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -- -6: Put five 4/4 red Dragon creature tokens with flying onto the battlefield.
mana={2}{R}{G} mana={2}{R}{G}
type=Planeswalker type=Planeswalker
@@ -87562,6 +87835,16 @@ power=4
toughness=4 toughness=4
[/card] [/card]
[card] [card]
name=Shardless Agent
autostack=if casted(this) then cascade:plibrarycount
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={1}{G}{U}
type=Artifact Creature
subtype=Human Rogue
power=2
toughness=2
[/card]
[card]
name=Shared Discovery name=Shared Discovery
auto=draw:3 auto=draw:3
text=As an additional cost to cast Shared Discovery, tap four untapped creatures you control. -- Draw three cards. text=As an additional cost to cast Shared Discovery, tap four untapped creatures you control. -- Draw three cards.
@@ -92768,9 +93051,9 @@ type=Sorcery
[card] [card]
name=Sorin, Lord of Innistrad name=Sorin, Lord of Innistrad
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,1,Loyalty)}:token(Vampire,Creature Vampire,1/1,black,lifelink) auto={C(0/0,1,Loyalty)}:name(+1: vampire token) token(Vampire,Creature Vampire,1/1,black,lifelink)
auto={C(0/0,-2,Loyalty)}:name(emblem) emblem transforms((,newability[lord(creature|mybattlefield) 1/0])) forever dontremove auto={C(0/0,-2,Loyalty)}:name(-2: emblem) emblem transforms((,newability[lord(creature|mybattlefield) 1/0])) forever dontremove
auto={C(0/0,-6,Loyalty)}:target(<upto:3>other creature,planeswalker) destroy and!(moveto(mybattlefield))! auto={C(0/0,-6,Loyalty)}:name(-6: destroy) target(<upto:3>other creature,planeswalker) destroy and!(moveto(mybattlefield))!
text=+1: Put a 1/1 black Vampire creature token with lifelink onto the battlefield. -- -2: You get an emblem with "Creatures you control get +1/+0." -- -6: Destroy up to three target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control. text=+1: Put a 1/1 black Vampire creature token with lifelink onto the battlefield. -- -2: You get an emblem with "Creatures you control get +1/+0." -- -6: Destroy up to three target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control.
mana={2}{W}{B} mana={2}{W}{B}
type=Planeswalker type=Planeswalker
@@ -95445,6 +95728,17 @@ power=5
toughness=5 toughness=5
[/card] [/card]
[card] [card]
name=Stalking Yeti
auto=target(creature|opponentbattlefield) dynamicability<!powerstrike eachother!>
auto={2}{i}:moveTo(ownerhand) asSorcery
text=When Stalking Yeti enters the battlefield, if it's on the battlefield, it deals damage equal to its power to target creature an opponent controls and that creature deals damage equal to its power to Stalking Yeti. -- {2}{S}i}: Return Stalking Yeti to its owner's hand. Activate this ability only any time you could cast a sorcery. ({S}i} can be paid with one mana from a snow permanent.)
mana={2}{R}{R}
type=Snow Creature
subtype=Yeti
power=3
toughness=3
[/card]
[card]
name=Stalwart Aven name=Stalwart Aven
abilities=flying abilities=flying
auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever])) auto=this(cantargetcard(*[-renown]) transforms((,newability[@combatdamaged(player) from(this):counter(1/1) && becomes(renown) forever]))
@@ -96744,6 +97038,14 @@ power=4
toughness=4 toughness=4
[/card] [/card]
[card] [card]
name=Stormcaller's Boon
auto={S}:lord(creature|myBattlefield) flying ueot
autostack=if casted(this) then cascade:plibrarycount
text=Sacrifice Stormcaller's Boon: Creatures you control gain flying until end of turn. -- Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
mana={2}{W}{U}
type=Enchantment
[/card]
[card]
name=Stormcloud Djinn name=Stormcloud Djinn
abilities=flying,cloud abilities=flying,cloud
auto={R}{R}:2/0 && damage:1 controller auto={R}{R}:2/0 && damage:1 controller
@@ -99764,9 +100066,9 @@ toughness=4
[card] [card]
name=Tamiyo, the Moon Sage name=Tamiyo, the Moon Sage
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(tap permanent) target(*) tap && frozen auto={C(0/0,1,Loyalty)}:name(+1: tap permanent) target(*) tap && frozen
auto={C(0/0,-2,Loyalty)}:name(draw a card) target(player) draw:type:creature[tapped]:targetedpersonsbattlefield controller auto={C(0/0,-2,Loyalty)}:name(-2: draw a card) target(player) draw:type:creature[tapped]:targetedpersonsbattlefield controller
auto={C(0/0,-8,Loyalty)}:name(emblem) emblem transforms((,newability[nomaxhand],newability[@movedTo(*[-token]|mygraveyard):may name(reclaim) moveTo(myhand) all(trigger[to])])) forever dontremove auto={C(0/0,-8,Loyalty)}:name(-8: emblem) emblem transforms((,newability[nomaxhand],newability[@movedTo(*[-token]|mygraveyard):may name(reclaim) moveTo(myhand) all(trigger[to])])) forever dontremove
text=+1: Tap target permanent. It doesn't untap during its controller's next untap step. -- -2: Draw a card for each tapped creature target player controls. -- -8: You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." text=+1: Tap target permanent. It doesn't untap during its controller's next untap step. -- -2: Draw a card for each tapped creature target player controls. -- -8: You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand."
mana={3}{U}{U} mana={3}{U}{U}
type=Planeswalker type=Planeswalker
@@ -101180,7 +101482,7 @@ toughness=4
[card] [card]
name=Tezzeret the Seeker name=Tezzeret the Seeker
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:untap target(<upto:2>artifact) auto={C(0/0,1,Loyalty)}:name(+1: untap) untap target(<upto:2>artifact)
auto={0}:name(X = 0) target(artifact[manacost<=0]|mylibrary) moveTo(mybattlefield) auto={0}:name(X = 0) target(artifact[manacost<=0]|mylibrary) moveTo(mybattlefield)
auto={C(0/0,-1,Loyalty)}:name(X = 1) target(artifact[manacost<=1]|mylibrary) moveTo(mybattlefield) auto={C(0/0,-1,Loyalty)}:name(X = 1) target(artifact[manacost<=1]|mylibrary) moveTo(mybattlefield)
auto={C(0/0,-2,Loyalty)}:name(X = 2) target(artifact[manacost<=2]|mylibrary) moveTo(mybattlefield) auto={C(0/0,-2,Loyalty)}:name(X = 2) target(artifact[manacost<=2]|mylibrary) moveTo(mybattlefield)
@@ -101192,7 +101494,7 @@ auto={C(0/0,-7,Loyalty)}:name(X = 7) target(artifact[manacost<=7]|mylibrary) mov
auto={C(0/0,-8,Loyalty)}:name(X = 8) target(artifact[manacost<=8]|mylibrary) moveTo(mybattlefield) auto={C(0/0,-8,Loyalty)}:name(X = 8) target(artifact[manacost<=8]|mylibrary) moveTo(mybattlefield)
auto={C(0/0,-9,Loyalty)}:name(X = 9) target(artifact[manacost<=9]|mylibrary) moveTo(mybattlefield) auto={C(0/0,-9,Loyalty)}:name(X = 9) target(artifact[manacost<=9]|mylibrary) moveTo(mybattlefield)
auto={C(0/0,-10,Loyalty)}:name(X = 10) target(artifact[manacost<=10]|mylibrary) moveTo(mybattlefield) auto={C(0/0,-10,Loyalty)}:name(X = 10) target(artifact[manacost<=10]|mylibrary) moveTo(mybattlefield)
auto={C(0/0,-5,Loyalty)}:name(transform your artifacts) all(artifact|mybattlefield) becomes(Artifact Creature,5/5) ueot auto={C(0/0,-5,Loyalty)}:name(-5: transform your artifacts) all(artifact|mybattlefield) becomes(Artifact Creature,5/5) ueot
text=+1: Untap up to two target artifacts. -- -X: Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -- -5: Artifacts you control become 5/5 artifact creatures until end of turn. text=+1: Untap up to two target artifacts. -- -X: Search your library for an artifact card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -- -5: Artifacts you control become 5/5 artifact creatures until end of turn.
mana={3}{U}{U} mana={3}{U}{U}
type=Planeswalker type=Planeswalker
@@ -101613,6 +101915,17 @@ mana={1}{G}{G}
type=Sorcery type=Sorcery
[/card] [/card]
[card] [card]
name=Thermopod
auto={i}:haste
auto={S(creature|myBattlefield)}:Add{R}
text={S}i}: Thermopod gains haste until end of turn. ({S}i} can be paid with one mana from a snow permanent.) -- Sacrifice a creature: Add {R} to your mana pool.
mana={4}{R}
type=Snow Creature
subtype=Slug
power=4
toughness=3
[/card]
[card]
name=Thicket Basilisk name=Thicket Basilisk
auto=@combat(blocking,blocked) source(this) from(creature[-wall]):all(trigger[from]) phaseaction[combatends once] destroy auto=@combat(blocking,blocked) source(this) from(creature[-wall]):all(trigger[from]) phaseaction[combatends once] destroy
text=Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. text=Whenever Thicket Basilisk blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat.
@@ -102764,9 +103077,9 @@ type=Instant
[card] [card]
name=Tibalt, the Fiend-Blooded name=Tibalt, the Fiend-Blooded
auto=counter(0/0,2,Loyalty) auto=counter(0/0,2,Loyalty)
auto={counter(0/0,1,Loyalty)}:name(draw and random discard) draw:1 controller && discard:1 controller auto={counter(0/0,1,Loyalty)}:name(+1: draw and random discard) draw:1 controller && discard:1 controller
auto={counter(0/0,-4,Loyalty)}:name(damage target player) target(player) damage:type:*:targetedpersonshand auto={counter(0/0,-4,Loyalty)}:name(-4: damage target player) target(player) damage:type:*:targetedpersonshand
auto={counter(0/0,-6,Loyalty)}:name(gain control creatures) all(creature|battlefield) moveTo(mybattlefield) && all(creature) transforms((,newability[untap],newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)])) ueot auto={counter(0/0,-6,Loyalty)}:name(-6: gain control creatures) all(creature|battlefield) moveTo(mybattlefield) && all(creature) transforms((,newability[untap],newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)])) ueot
text=+1: Draw a card, then discard a card at random. -- -4: Tibalt, the Fiend-Blooded deals damage equal to the number of cards in target player's hand to that player. -- -6: Gain control of all creatures until end of turn. Untap them. They gain haste until end of turn. text=+1: Draw a card, then discard a card at random. -- -4: Tibalt, the Fiend-Blooded deals damage equal to the number of cards in target player's hand to that player. -- -6: Gain control of all creatures until end of turn. Untap them. They gain haste until end of turn.
mana={R}{R} mana={R}{R}
type=Planeswalker type=Planeswalker
@@ -108482,9 +108795,9 @@ toughness=5
[card] [card]
name=Venser, the Sojourner name=Venser, the Sojourner
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,2,Loyalty)}:(blink)ueot target(*|mybattlefield) auto={C(0/0,2,Loyalty)}:name(+2: exile) (blink)ueot target(*|mybattlefield)
auto={C(0/0,-1,Loyalty)}:all(creature) unblockable ueot auto={C(0/0,-1,Loyalty)}:name(-1: unblockable) all(creature) unblockable ueot
auto={C(0/0,-8,Loyalty)}:name(emblem) emblem transforms((,newability[@movedto(*|mystack):choice target(*|battlefield) moveto(exile)])) forever dontremove auto={C(0/0,-8,Loyalty)}:name(-8: emblem) emblem transforms((,newability[@movedto(*|mystack):choice target(*|battlefield) moveto(exile)])) forever dontremove
text=+2: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step. -- -1: Creatures are unblockable this turn. -- -8: You get an emblem with "Whenever you cast a spell, exile target permanent." text=+2: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step. -- -1: Creatures are unblockable this turn. -- -8: You get an emblem with "Whenever you cast a spell, exile target permanent."
mana={3}{W}{U} mana={3}{W}{U}
type=Planeswalker type=Planeswalker
@@ -109493,6 +109806,14 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[card] [card]
name=Violent Outburst
autostack=if casted(this) then cascade:plibrarycount
auto=lord(creature|myBattlefield) 1/0
text=Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.) -- Creatures you control get +1/+0 until end of turn.
mana={1}{R}{G}
type=Instant
[/card]
[card]
name=Violent Ultimatum name=Violent Ultimatum
target=<3>* target=<3>*
auto=destroy auto=destroy
@@ -110671,9 +110992,9 @@ subtype=Aura
[card] [card]
name=Vraska the Unseen name=Vraska the Unseen
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:name(dread) transforms((,newability[@combatdamaged(this) from(creature):all(trigger[from]) destroy])) uynt auto={C(0/0,1,Loyalty)}:name(+1: dread) transforms((,newability[@combatdamaged(this) from(creature):all(trigger[from]) destroy])) uynt
auto={C(0/0,-3,Loyalty)}:destroy target(*[-land]) auto={C(0/0,-3,Loyalty)}:name(-3: destroy) destroy target(*[-land])
auto={C(0/0,-7,Loyalty)}:token(-290538)*3 auto={C(0/0,-7,Loyalty)}:name(-7: assassin) token(-290538)*3
text=+1: Until your next turn, whenever a creature deals combat damage to Vraska the Unseen, destroy that creature. -- -3: Destroy target nonland permanent. -- -7: Put three 1/1 black Assassin creature tokens onto the battlefield with "Whenever this creature deals combat damage to a player, that player loses the game." text=+1: Until your next turn, whenever a creature deals combat damage to Vraska the Unseen, destroy that creature. -- -3: Destroy target nonland permanent. -- -7: Put three 1/1 black Assassin creature tokens onto the battlefield with "Whenever this creature deals combat damage to a player, that player loses the game."
mana={3}{B}{G} mana={3}{B}{G}
type=Planeswalker type=Planeswalker
@@ -116485,6 +116806,17 @@ power=2
toughness=0 toughness=0
[/card] [/card]
[card] [card]
name=Zombie Musher
abilities=snowforestlandwalk,snowplainslandwalk,snowmountainlandwalk,snowislandlandwalk,snowswamplandwalk
auto={i}:regenerate
text=Snow landwalk -- {S}i}: Regenerate Zombie Musher. ({S}i} can be paid with one mana from a snow permanent.)
mana={3}{B}
type=Snow Creature
subtype=Zombie
power=2
toughness=3
[/card]
[card]
name=Zombie Outlander name=Zombie Outlander
abilities=protection from green abilities=protection from green
text=Protection from green text=Protection from green
File diff suppressed because it is too large Load Diff
@@ -9,7 +9,10 @@ manapool:{W}{W}{W}{W}{W}{W}{W}
[PLAYER2] [PLAYER2]
life:20 life:20
[DO] [DO]
#apex hawks is {2}{W} so the mana remaining will be {W}{W}{W}{W}
Apex Hawks Apex Hawks
#apex hawks has {1}{W} multikicker so we can afford {2}{W}{W} since our mana is {W}{W}{W}{W}
#it will come with two +1/+1 counters making it 1 4/4 Flyer
choice 1 choice 1
next next
next next
@@ -22,5 +25,6 @@ COMBATDAMAGE
inplay:Apex Hawks,Fervor inplay:Apex Hawks,Fervor
manapool:{0} manapool:{0}
[PLAYER2] [PLAYER2]
life:17 #life must be 16 not 17.....(20 - 4)
[END] life:16
[END]
@@ -0,0 +1,25 @@
#Testing Sphere of Resistance
#It must not crash with buyback
[INIT]
FIRSTMAIN
[PLAYER1]
inplay:Sphere of Resistance,Swamp
hand:Capsize
manapool:{6}{U}{U}{U}{U}
[PLAYER2]
[DO]
Capsize
# pay buyback
choice 1
Sphere of Resistance
Capsize
Swamp
[ASSERT]
FIRSTMAIN
[PLAYER1]
graveyard:Capsize
hand:Sphere of Resistance,Swamp
manapool{0}
[PLAYER2]
[END]
+1
View File
@@ -635,6 +635,7 @@ spark_elemental.txt
spectral_shield_CANTBETARGETOF.txt spectral_shield_CANTBETARGETOF.txt
spell_rupture.txt spell_rupture.txt
spell_rupture_2.txt spell_rupture_2.txt
Sphere_of_Resistance.txt
sphinx_summoner.txt sphinx_summoner.txt
spirit_link.txt spirit_link.txt
spirit_link_i173.txt spirit_link_i173.txt
@@ -33,7 +33,8 @@ blinkmoth nexus
COMBATATTACKERS COMBATATTACKERS
[PLAYER1] [PLAYER1]
inplay:blinkmoth nexus inplay:blinkmoth nexus
manapool:{1} #changed to {c} since all colorless produced are now {c}
manapool:{c}
[PLAYER2] [PLAYER2]
life:19 life:19
[END] [END]
+2 -1
View File
@@ -17,5 +17,6 @@ graveyard:lightning bolt
manapool:{0} manapool:{0}
[PLAYER2] [PLAYER2]
graveyard:cathodion graveyard:cathodion
manapool:{3} #changed to {c} since all colorless produced are now {c}
manapool:{c}{c}{c}
[END] [END]
@@ -18,6 +18,7 @@ FIRSTMAIN
hand:Elvish Berserker,White Knight,Llanowar Elves,Rancor,Tranquility,Lotus Petal hand:Elvish Berserker,White Knight,Llanowar Elves,Rancor,Tranquility,Lotus Petal
inplay:Library of Alexandria inplay:Library of Alexandria
library:Soul Warden library:Soul Warden
manapool:{1} #changed to {c} since all colorless produced are now {c}
manapool:{c}
[PLAYER2] [PLAYER2]
[END] [END]
@@ -18,6 +18,7 @@ FIRSTMAIN
hand:Elvish Berserker,White Knight,Llanowar Elves,Rancor,Tranquility,Lotus Petal,Lhurgoyf,Mawcor hand:Elvish Berserker,White Knight,Llanowar Elves,Rancor,Tranquility,Lotus Petal,Lhurgoyf,Mawcor
inplay:Library of Alexandria inplay:Library of Alexandria
library:Soul Warden library:Soul Warden
manapool:{1} #changed to {c} since all colorless produced are now {c}
manapool:{c}
[PLAYER2] [PLAYER2]
[END] [END]
+2 -1
View File
@@ -15,7 +15,8 @@ FIRSTMAIN
[PLAYER1] [PLAYER1]
graveyard:black knight,Spoils Of Evil graveyard:black knight,Spoils Of Evil
life:22 life:22
manapool:{2} #changed to {c} since all colorless produced are now {c}
manapool:{c}{c}
[PLAYER2] [PLAYER2]
graveyard:swamp,grizzly bears,dragon engine graveyard:swamp,grizzly bears,dragon engine
[END] [END]
+2 -1
View File
@@ -19,6 +19,7 @@ choice 1
firstmain firstmain
[PLAYER1] [PLAYER1]
inplay:Urza's Mine,Urza's Power Plant,Urza's Tower inplay:Urza's Mine,Urza's Power Plant,Urza's Tower
manapool:{4} #changed to {c} since all colorless produced are now {c}
manapool:{c}{c}{c}{c}
[PLAYER2] [PLAYER2]
[END] [END]
+2 -1
View File
@@ -18,6 +18,7 @@ Urza's Tower
firstmain firstmain
[PLAYER1] [PLAYER1]
inplay:Urza's Mine,Urza's Power Plant,Urza's Tower,Deserted Temple inplay:Urza's Mine,Urza's Power Plant,Urza's Tower,Deserted Temple
manapool:{5} #changed to {c} since all colorless produced are now {c}
manapool:{c}{c}{c}{c}{c}
[PLAYER2] [PLAYER2]
[END] [END]
@@ -12,6 +12,7 @@ Urza's Mine
FIRSTMAIN FIRSTMAIN
[PLAYER1] [PLAYER1]
inplay:Urza's Mine,1090,Urza's Power Plant,1091 inplay:Urza's Mine,1090,Urza's Power Plant,1091
manapool:{2} #changed to {c} since all colorless produced are now {c}
manapool:{c}{c}
[PLAYER2] [PLAYER2]
[END] [END]
+78 -6
View File
@@ -584,6 +584,18 @@ private:
if (target->controller()->life >= target->controller()->initLife) if (target->controller()->life >= target->controller()->initLife)
intValue = 1; intValue = 1;
} }
else if (s == "plibrarycount")
{
intValue = 0;
if (target->controller()->game->library->nb_cards)
intValue = target->controller()->game->library->nb_cards;
}
else if (s == "olibrarycount")
{
intValue = 0;
if (target->controller()->opponent()->game->library->nb_cards)
intValue = target->controller()->opponent()->game->library->nb_cards;
}
else if (s == "highestlifetotal") else if (s == "highestlifetotal")
{ {
intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->opponent()->life:target->controller()->life; intValue = target->controller()->life <= target->controller()->opponent()->life? target->controller()->opponent()->life:target->controller()->life;
@@ -652,6 +664,10 @@ private:
{ {
intValue = target->controller()->epic; intValue = target->controller()->epic;
} }
else if (s == "snowcount")
{//this is just to count the number of snow mana produced ... just for debugging purposes...
intValue = target->controller()->snowManaG + target->controller()->snowManaU +target->controller()->snowManaR + target->controller()->snowManaB + target->controller()->snowManaW + target->controller()->snowManaC;
}
else if (s == "p" || s == "power") else if (s == "p" || s == "power")
{ {
intValue = target->getCurrentPower(); intValue = target->getCurrentPower();
@@ -778,6 +794,46 @@ private:
intValue = 1; intValue = 1;
}//end }//end
} }
else if (s == "cantargetmycre")// can target my creature
{
intValue = 0;
for (int j = card->controller()->game->battlefield->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->game->battlefield->cards[j]->hasType("creature") && !card->controller()->game->battlefield->cards[j]->protectedAgainst(card))
{
intValue += 1;
}
}
}
else if (s == "cantargetoppocre")// can target opponent creature
{
intValue = 0;
for (int j = card->controller()->opponent()->game->battlefield->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->opponent()->game->battlefield->cards[j]->hasType("creature") && !card->controller()->opponent()->game->battlefield->cards[j]->protectedAgainst(card))
{
intValue += 1;
}
}
}
else if (s == "cantargetcre")// can target any creature
{
intValue = 0;
for (int j = card->controller()->opponent()->game->battlefield->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->opponent()->game->battlefield->cards[j]->hasType("creature") && !card->controller()->opponent()->game->battlefield->cards[j]->protectedAgainst(card))
{
intValue += 1;
}
}
for (int k = card->controller()->game->battlefield->nb_cards - 1; k >= 0; --k)
{
if (card->controller()->game->battlefield->cards[k]->hasType("creature") && !card->controller()->game->battlefield->cards[k]->protectedAgainst(card))
{
intValue += 1;
}
}
}
else if (s == "controllerturn")//intvalue = 1 if its your turn this(variable{controllerturn}) else if (s == "controllerturn")//intvalue = 1 if its your turn this(variable{controllerturn})
{ {
intValue = 0; intValue = 0;
@@ -1698,7 +1754,8 @@ class AAEPIC: public ActivatedAbility
{ {
public: public:
string named; string named;
AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string _newName, ManaCost * cost = NULL); bool FField;
AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string _newName, ManaCost * cost = NULL, bool ffield = false );
int resolve(); int resolve();
const string getMenuText(); const string getMenuText();
AAEPIC * clone() const; AAEPIC * clone() const;
@@ -2356,7 +2413,8 @@ public:
{ {
if (!isReactingToClick(_card)) return 0; if (!isReactingToClick(_card)) return 0;
game->currentlyActing()->getManaPool()->pay(cost); game->currentlyActing()->getManaPool()->pay(cost);
game->currentlyActing()->life += life; if(!game->currentlyActing()->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
game->currentlyActing()->life += life;
lastUsedOn = lastChecked; lastUsedOn = lastChecked;
return 1; return 1;
} }
@@ -2964,7 +3022,7 @@ public:
{ {
if (newPhase != currentPhase && newPhase == phase && game->currentPlayer == ((MTGCardInstance *) target)->controller()) if (newPhase != currentPhase && newPhase == phase && game->currentPlayer == ((MTGCardInstance *) target)->controller())
{ {
if (!onlyIfTargetTapped || ((MTGCardInstance *) target)->isTapped()) if ((!onlyIfTargetTapped || ((MTGCardInstance *) target)->isTapped()) && (!game->currentPlayer->inPlay()->hasAbility(Constants::CANTCHANGELIFE)))
{ {
if (life > 0) if (life > 0)
{ {
@@ -4547,7 +4605,7 @@ public:
void Update(float) void Update(float)
{ {
if (newPhase != currentPhase && newPhase == phase) if (newPhase != currentPhase && newPhase == phase && !game->currentPlayer->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
{ {
if ((controller && game->currentPlayer == source->controller()) || (!controller && game->currentPlayer if ((controller && game->currentPlayer == source->controller()) || (!controller && game->currentPlayer
!= source->controller())) != source->controller()))
@@ -6019,12 +6077,26 @@ public:
string nbcardsStr; string nbcardsStr;
bool toexile; bool toexile;
AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
int who = TargetChooser::UNSET, bool toexile = false); int who = TargetChooser::UNSET, bool toexile = false);
int resolve(); int resolve();
const string getMenuText(); const string getMenuText();
AADepleter * clone() const; AADepleter * clone() const;
}; };
//AACascade
class AACascade: public ActivatedAbilityTP
{
public:
string nbcardsStr;
AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL,
int who = TargetChooser::UNSET);
int resolve();
void toCastCard(MTGCardInstance * card);
const string getMenuText();
AACascade * clone() const;
};
//Generic skip turn/extra turn //Generic skip turn/extra turn
class AAModTurn: public ActivatedAbilityTP class AAModTurn: public ActivatedAbilityTP
{ {
@@ -6193,7 +6265,7 @@ public:
{ {
Player * p = (Player *) isDamaged->damage->target; Player * p = (Player *) isDamaged->damage->target;
WParsedInt lifetoset(life_s, NULL, source); WParsedInt lifetoset(life_s, NULL, source);
if(p && p == source->controller() && p->life <= lifetoset.getValue()) if(p && p == source->controller() && p->life <= lifetoset.getValue() && !p->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
p->life = lifetoset.getValue(); p->life = lifetoset.getValue();
} }
} }
+20
View File
@@ -155,6 +155,15 @@ public:
virtual ToLibraryCost * clone() const; virtual ToLibraryCost * clone() const;
}; };
//toGraveyard cost
class ToGraveCost : public ExtraCost
{
public:
ToGraveCost(TargetChooser *_tc = NULL);
virtual int doPay();
virtual ToGraveCost * clone() const;
};
//Millyourself cost //Millyourself cost
class MillCost : public ExtraCost class MillCost : public ExtraCost
{ {
@@ -195,6 +204,17 @@ public:
virtual TapCost * clone() const; virtual TapCost * clone() const;
}; };
//Snow cost
class SnowCost : public ExtraCost
{
public:
SnowCost();
virtual int isPaymentSet();
virtual int canPay();
virtual int doPay();
virtual SnowCost * clone() const;
};
//untap cost //untap cost
class UnTapCost : public ExtraCost class UnTapCost : public ExtraCost
{ {
+3 -1
View File
@@ -89,6 +89,7 @@ public:
bool isMorphed; bool isMorphed;
bool isFlipped; bool isFlipped;
bool isPhased; bool isPhased;
bool isCascaded;
int phasedTurn; int phasedTurn;
bool graveEffects; bool graveEffects;
bool exileEffects; bool exileEffects;
@@ -254,7 +255,8 @@ public:
bool isTargetter(); bool isTargetter();
int cardistargetter; int cardistargetter;
int myconvertedcost; int myconvertedcost;
ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost); ManaCost * computeNewCost(MTGCardInstance * card,ManaCost * oldCost, ManaCost * refCost,bool noTrinisphere = false);
int countTrini;
void eventattacked(); void eventattacked();
void eventattackedAlone(); void eventattackedAlone();
+8 -3
View File
@@ -72,6 +72,7 @@ class Constants
static const string kManaRed; static const string kManaRed;
static const string kManaBlack; static const string kManaBlack;
static const string kManaWhite; static const string kManaWhite;
static const string kManaWaste;
// alternative costs constants // alternative costs constants
@@ -94,9 +95,11 @@ class Constants
MTG_COLOR_RED = 3, MTG_COLOR_RED = 3,
MTG_COLOR_BLACK = 4, MTG_COLOR_BLACK = 4,
MTG_COLOR_WHITE = 5, MTG_COLOR_WHITE = 5,
MTG_COLOR_LAND = 6, MTG_COLOR_WASTE = 6,
MTG_COLOR_LAND = 7,
MTG_NB_COLORS = 7, MTG_NB_COLORS = 8,
MTG_UNCOLORED = 0, MTG_UNCOLORED = 0,
@@ -238,7 +241,9 @@ class Constants
TRINISPHERE = 120, TRINISPHERE = 120,
CANPLAYFROMEXILE = 121, CANPLAYFROMEXILE = 121,
LIBRARYEATER = 122, LIBRARYEATER = 122,
NB_BASIC_ABILITIES = 123, DEVOID = 123,
CANTCHANGELIFE = 124,
NB_BASIC_ABILITIES = 125,
RARITY_S = 'S', //Special Rarity RARITY_S = 'S', //Special Rarity
+9
View File
@@ -43,9 +43,16 @@ public:
int extraTurn; int extraTurn;
int drawCounter; int drawCounter;
int epic; int epic;
int forcefield;
int initLife; int initLife;
int raidcount; int raidcount;
int handmodifier; int handmodifier;
int snowManaG;
int snowManaR;
int snowManaB;
int snowManaU;
int snowManaW;
int snowManaC;
vector<string> prowledTypes; vector<string> prowledTypes;
vector<MTGCardInstance*>curses; vector<MTGCardInstance*>curses;
Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL); Player(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
@@ -73,6 +80,8 @@ public:
ManaPool * getManaPool(); ManaPool * getManaPool();
void takeMulligan(); void takeMulligan();
void serumMulligan(); void serumMulligan();
bool hasPossibleAttackers();
bool noPossibleAttackers();
bool DeadLifeState(bool check = false); bool DeadLifeState(bool check = false);
ManaCost * doesntEmpty; ManaCost * doesntEmpty;
ManaCost * poolDoesntEmpty; ManaCost * poolDoesntEmpty;
+3
View File
@@ -714,6 +714,9 @@ bool AIPlayerBaka::payTheManaCost(ManaCost * cost, MTGCardInstance * target,vect
if(!cost->getConvertedCost()) if(!cost->getConvertedCost())
{ {
DebugTrace("AIPlayerBaka: Card was a land and ai cant play any more lands this turn. ");
if (target && target->isLand() && game->playRestrictions->canPutIntoZone(target, game->battlefield) == PlayRestriction::CANT_PLAY)
return false;
DebugTrace("AIPlayerBaka: Card or Ability was free to play. "); DebugTrace("AIPlayerBaka: Card or Ability was free to play. ");
if(!cost->hasX())//don't return true if it contains {x} but no cost, locks ai in a loop. ie oorchi hatchery cost {x}{x} to play. if(!cost->hasX())//don't return true if it contains {x} but no cost, locks ai in a loop. ie oorchi hatchery cost {x}{x} to play.
return true; return true;
+105 -50
View File
@@ -264,12 +264,10 @@ AADamager * AADamager::clone() const
AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) : AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who, bool toexile) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile) ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr),toexile(toexile)
{ {
} }
int AADepleter::resolve() int AADepleter::resolve()
{ {
Player * player = getPlayerFromTarget(getTarget()); Player * player = getPlayerFromTarget(getTarget());
if (player) if (player)
{ {
WParsedInt numCards(nbcardsStr, NULL, source); WParsedInt numCards(nbcardsStr, NULL, source);
@@ -300,6 +298,93 @@ AADepleter * AADepleter::clone() const
return NEW AADepleter(*this); return NEW AADepleter(*this);
} }
//AACascade
AACascade::AACascade(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost, int who) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbcardsStr(nbcardsStr)
{
}
int AACascade::resolve()
{
Player * player = getPlayerFromTarget(getTarget());
if (player)
{
WParsedInt numCards(nbcardsStr, NULL, source);
MTGLibrary * library = player->game->library;
MTGRemovedFromGame * exile = player->game->exile;
MTGCardInstance * viable = NULL;
int counter = 0;
for (int i = 0; i < numCards.getValue(); i++)
{
if (library->nb_cards)
{
for(int z = library->nb_cards; z >= 0; z--)
{
if(!library->cards[z]->isLand() && (library->cards[z]->getManaCost()->getConvertedCost() < source->getManaCost()->getConvertedCost()))
{
viable = library->cards[z];
player->game->putInZone(viable, library, exile);
{
vector<MTGCardInstance*>selectedCards;
for(int j=0; j < library->nb_cards; j++)
{
if(library->cards[j]->isCascaded)
{
library->cards[j]->isCascaded = false;
selectedCards.push_back(library->cards[j]);
}
}
if(selectedCards.size())
{
std::random_shuffle ( selectedCards.begin(), selectedCards.end() );
for(unsigned int i = 0; i < selectedCards.size();++i)
{
vector<MTGCardInstance *>oldOrder = library->cards;
vector<MTGCardInstance *>newOrder;
newOrder.push_back(selectedCards[i]);
for(unsigned int k = 0;k < oldOrder.size();++k)
{
MTGCardInstance * rearranged = oldOrder[k];
if(rearranged != selectedCards[i])
newOrder.push_back(rearranged);
}
library->cards = newOrder;
}
}
}
toCastCard(viable->next);
return 1;
}
else
{
library->cards[library->nb_cards - 1]->isCascaded=true;
counter++;
}
}
}
}
}
return 1;
}
void AACascade::toCastCard(MTGCardInstance * thisCard)
{
MTGAbility *ac = NEW AACastCard(game, game->mLayers->actionLayer()->getMaxId(), thisCard, thisCard,false,false,true,"","",false,false);
MayAbility *ma1 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ac, thisCard->clone(),true);
MTGAbility *ga1 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), thisCard,NULL,ma1);
ga1->resolve();
return;
}
const string AACascade::getMenuText()
{
return "Cascade";
}
AACascade * AACascade::clone() const
{
return NEW AACascade(*this);
}
//take extra turns or skip turns, values in the negitive will make you skip. //take extra turns or skip turns, values in the negitive will make you skip.
AAModTurn::AAModTurn(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbTurnStr, ManaCost * _cost, int who) : AAModTurn::AAModTurn(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbTurnStr, ManaCost * _cost, int who) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbTurnStr(nbTurnStr) ActivatedAbilityTP(observer, _id, card, _target, _cost, who),nbTurnStr(nbTurnStr)
@@ -394,7 +479,7 @@ int AACopier::resolve()
MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game); MTGCardInstance * myClone = NEW MTGCardInstance(clone, source->controller()->game);
source->copy(myClone); source->copy(myClone);
source->isACopier = true; source->isACopier = true;
source->copiedID = _target->copiedID; source->copiedID = _target->getMTGId();
source->modifiedbAbi = _target->modifiedbAbi; source->modifiedbAbi = _target->modifiedbAbi;
source->origbasicAbilities = _target->origbasicAbilities; source->origbasicAbilities = _target->origbasicAbilities;
if(_target->isMorphed) if(_target->isMorphed)
@@ -1220,25 +1305,15 @@ int GenericPaidAbility::resolve()
{ {
must = true; must = true;
//cost increase - reduce + trinisphere effect ability todo... //cost increase - reduce + trinisphere effect ability todo...
if(((MTGCardInstance *)target)->getIncreasedManaCost()->getConvertedCost()) optionalCost = ((MTGCardInstance *)target)->computeNewCost(((MTGCardInstance *)target),optionalCost,optionalCost);
optionalCost->add(((MTGCardInstance *)target)->getIncreasedManaCost()); if(optionalCost->extraCosts)
if(((MTGCardInstance *)target)->getReducedManaCost()->getConvertedCost())
optionalCost->remove(((MTGCardInstance *)target)->getReducedManaCost());
//trinisphere effect must be hardcoded...here..
/*if(((MTGCardInstance *)target)->has(Constants::TRINISPHERE))
{ {
if(optionalCost->getConvertedCost() == 2) for(unsigned int i = 0; i < optionalCost->extraCosts->costs.size();i++)
optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 1); optionalCost->extraCosts->costs[i]->setSource(((MTGCardInstance *)target));
else if(optionalCost->getConvertedCost() == 1) }
optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 2);
else if(optionalCost->getConvertedCost() < 1)
optionalCost->add(Constants::MTG_COLOR_ARTIFACT, 3);
}*/
} }
if(asAlternate && nomenu && optionalCost->getConvertedCost() < 1) if(asAlternate && nomenu && optionalCost->getConvertedCost() < 1)
{
nomenuAbility->resolve(); nomenuAbility->resolve();
}
else else
{ {
MenuAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, must, selection, NULL, newName); MenuAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, must, selection, NULL, newName);
@@ -1386,15 +1461,18 @@ AAFakeAbility * AAFakeAbility::clone() const
} }
//EPIC //EPIC
AAEPIC::AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, string _named,ManaCost * cost): AAEPIC::AAEPIC(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, string _named,ManaCost * cost, bool _ffield):
ActivatedAbility(observer, id, source, cost, 0),named(_named) ActivatedAbility(observer, id, source, cost, 0),named(_named),FField(_ffield)
{ {
this->target = _target; this->target = _target;
} }
int AAEPIC::resolve() int AAEPIC::resolve()
{ {
MTGCardInstance * _target = (MTGCardInstance *)target; MTGCardInstance * _target = (MTGCardInstance *)target;
_target->controller()->epic = 1; if(FField)
_target->controller()->forcefield = 1;
else
_target->controller()->epic = 1;
return 1; return 1;
} }
@@ -4081,19 +4159,8 @@ int AAlterCost::destroy()
int AAlterCost::testDestroy() int AAlterCost::testDestroy()
{ {
MTGCardInstance * _target = (MTGCardInstance *)target;
if(!this->manaReducer->isInPlay(game)) if(!this->manaReducer->isInPlay(game))
{ {
if (amount > 0)
{
_target->getIncreasedManaCost()->remove(type,amount);
refreshCost(_target);//special case for 0 cost.
}
else
{
_target->getReducedManaCost()->remove(type,abs(amount));
refreshCost(_target);//special case for 0 cost.
}
return MTGAbility::testDestroy(); return MTGAbility::testDestroy();
} }
return 0; return 0;
@@ -4102,8 +4169,10 @@ void AAlterCost::refreshCost(MTGCardInstance * card)
{ {
ManaCost * original = NEW ManaCost(); ManaCost * original = NEW ManaCost();
original->copy(card->model->data->getManaCost()); original->copy(card->model->data->getManaCost());
original->add(card->getIncreasedManaCost()); if(card->getIncreasedManaCost()->getConvertedCost())
original->remove(card->getReducedManaCost()); original->add(card->getIncreasedManaCost());
if(card->getReducedManaCost()->getConvertedCost())
original->remove(card->getReducedManaCost());
card->getManaCost()->copy(original); card->getManaCost()->copy(original);
delete original; delete original;
return; return;
@@ -4115,14 +4184,6 @@ void AAlterCost::increaseTheCost(MTGCardInstance * card)
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++) for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
{ {
card->getManaCost()->add(k,card->getIncreasedManaCost()->getCost(k)); card->getManaCost()->add(k,card->getIncreasedManaCost()->getCost(k));
if (card->getManaCost()->getAlternative())
{
card->getManaCost()->getAlternative()->add(k,card->getIncreasedManaCost()->getCost(k));
}
if (card->getManaCost()->getBuyback())
{
card->getManaCost()->getBuyback()->add(k,card->getIncreasedManaCost()->getCost(k));
}
} }
} }
return; return;
@@ -4135,14 +4196,6 @@ void AAlterCost::decreaseTheCost(MTGCardInstance * card)
for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++) for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++)
{ {
card->getManaCost()->remove(k,card->getReducedManaCost()->getCost(k)); card->getManaCost()->remove(k,card->getReducedManaCost()->getCost(k));
if (card->getManaCost()->getAlternative())
{
card->getManaCost()->getAlternative()->remove(k,card->getReducedManaCost()->getCost(k));
}
if (card->getManaCost()->getBuyback())
{
card->getManaCost()->getBuyback()->remove(k,card->getReducedManaCost()->getCost(k));
}
} }
} }
return; return;
@@ -4620,6 +4673,8 @@ int AAExchangeLife::resolve()
Damageable * _target = (Damageable *) getTarget(); Damageable * _target = (Damageable *) getTarget();
if (_target) if (_target)
{ {
if(_target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && ((Player*)_target)->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
return 0;
Player *player = source->controller(); Player *player = source->controller();
int oldlife = player->getLife(); int oldlife = player->getLife();
int targetOldLife = _target->getLife(); int targetOldLife = _target->getLife();
+6 -3
View File
@@ -244,7 +244,10 @@ void CardGui::Render()
highlightborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white"); highlightborder = game? game->getResourceManager()->GetQuad("white"):WResourceManager::Instance()->GetQuad("white");
if(fakeborder) if(fakeborder)
{ {
fakeborder->SetColor(ARGB((int)(actA),15,15,15)); if(card->has(Constants::CANPLAYFROMGRAVEYARD)||card->has(Constants::CANPLAYFROMEXILE)||card->has(Constants::PAYZERO))
fakeborder->SetColor(ARGB((int)(actA),7,235,7));//green border
else
fakeborder->SetColor(ARGB((int)(actA),15,15,15));
renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16); renderer->RenderQuad(fakeborder.get(), actX, actY, actT, (29 * actZ + 1) / 16, 42 * actZ / 16);
} }
//draw border for highlighting //draw border for highlighting
@@ -365,8 +368,8 @@ void CardGui::Render()
buff = "CT"; buff = "CT";
if(!card->isToken && card->isACopier) if(!card->isToken && card->isACopier)
buff = "C"; buff = "C";
if(card->has(Constants::PAYZERO)) //if(card->has(Constants::PAYZERO))
buff += "Z"; //buff += "Z";
if(card->alias == 1000) if(card->alias == 1000)
{ {
if(card->chooseacolor == 1) if(card->chooseacolor == 1)
+35 -10
View File
@@ -71,6 +71,9 @@ int Damage::resolve()
} }
//------------------------------------------------- //-------------------------------------------------
//Ajani Steadfast ---
if(target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && ((MTGCardInstance*)target)->hasType("planeswalker") && ((MTGCardInstance*)target)->controller()->forcefield)
damage = 1;
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE)
{ {
MTGCardInstance * _target = (MTGCardInstance *) target; MTGCardInstance * _target = (MTGCardInstance *) target;
@@ -127,7 +130,9 @@ int Damage::resolve()
_target->doDamageTest = 1; _target->doDamageTest = 1;
} }
if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
{ {//Ajani Steadfast
if(((Player*)target)->forcefield)
damage = 1;
if(source->has(Constants::LIBRARYEATER) && typeOfDamage == 1) if(source->has(Constants::LIBRARYEATER) && typeOfDamage == 1)
{ {
for (int j = damage; j > 0; j--) for (int j = damage; j > 0; j--)
@@ -191,7 +196,8 @@ int Damage::resolve()
{ {
//Damage + 1, 2, or 3 poison counters on player //Damage + 1, 2, or 3 poison counters on player
Player * _target = (Player *) target; Player * _target = (Player *) target;
a = target->dealDamage(damage); if(!_target->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
a = target->dealDamage(damage);
target->damageCount += damage; target->damageCount += damage;
if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes. if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes.
{ {
@@ -223,7 +229,10 @@ int Damage::resolve()
{ {
// "Normal" case, // "Normal" case,
//return the left over amount after effects have been applied to them. //return the left over amount after effects have been applied to them.
a = target->dealDamage(damage); if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER && ((Player *)target)->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
;//do nothing
else
a = target->dealDamage(damage);
target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount target->damageCount += damage;//the amount must be the actual damage so i changed this from 1 to damage, this fixes pdcount and odcount
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE){ if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE){
((MTGCardInstance*)target)->wasDealtDamage = true; ((MTGCardInstance*)target)->wasDealtDamage = true;
@@ -265,28 +274,44 @@ void Damage::Render()
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200]; char buffer[200];
sprintf(buffer, _("Deals %i damage to").c_str(), damage); sprintf(buffer, _("Deals %i damage to").c_str(), damage);
mFont->DrawString(buffer, x + 20, y, JGETEXT_LEFT); //mFont->DrawString(buffer, x + 20, y, JGETEXT_LEFT);
mFont->DrawString(buffer, x + 32, y + GetVerticalTextOffset(), JGETEXT_LEFT);
JRenderer * renderer = JRenderer::GetInstance(); JRenderer * renderer = JRenderer::GetInstance();
JQuadPtr quad = WResourceManager::Instance()->RetrieveCard(source, CACHE_THUMB); JQuadPtr quad = WResourceManager::Instance()->RetrieveCard(source, CACHE_THUMB);
if (quad.get()) if (quad.get())
{ {
float scale = 30 / quad->mHeight; //float scale = 30 / quad->mHeight;
renderer->RenderQuad(quad.get(), x, y, 0, scale, scale); //renderer->RenderQuad(quad.get(), x, y, 0, scale, scale);
quad->SetColor(ARGB(255,255,255,255));
float scale = mHeight / quad->mHeight;
renderer->RenderQuad(quad.get(), x + (quad->mWidth * scale / 2), y + (quad->mHeight * scale / 2), 0, scale, scale);
} }
else else
{ {
mFont->DrawString(_(source->getName()).c_str(), x, y - 15); //mFont->DrawString(_(source->getName()).c_str(), x, y - 15);
mFont->DrawString(_(source->getName()).c_str(), x, y + GetVerticalTextOffset() - 15);
} }
quad = target->getIcon(); quad = target->getIcon();
if (quad.get()) if (quad.get())
{ {
float scale = 30 / quad->mHeight; //float scale = 30 / quad->mHeight;
renderer->RenderQuad(quad.get(), x + 150, y, 0, scale, scale); //renderer->RenderQuad(quad.get(), x + 150, y, 0, scale, scale);
float backupX = quad->mHotSpotX;
float backupY = quad->mHotSpotY;
quad->SetColor(ARGB(255,255,255,255));
quad->SetHotSpot(quad->mWidth / 2, quad->mHeight / 2);
float scale = mHeight / quad->mHeight;
renderer->RenderQuad(quad.get(), x + 130, y - 0.5f + ((mHeight - quad->mHeight) / 2) + quad->mHotSpotY, 0, scale, scale);
quad->SetHotSpot(backupX, backupY);
} }
else else
{ {
//if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE)
//mFont->DrawString(_(((MTGCardInstance *) target)->getName()).c_str(), x + 120, y);
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE)
mFont->DrawString(_(((MTGCardInstance *) target)->getName()).c_str(), x + 120, y); mFont->DrawString(_(((MTGCardInstance *) target)->getName()).c_str(), x + 35, y+15 + GetVerticalTextOffset());
else if(target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
mFont->DrawString(_(((Player *) target)->getDisplayName()).c_str(), x + 35, y+15 + GetVerticalTextOffset());
} }
} }
+1 -1
View File
@@ -125,7 +125,7 @@ void DeckMenu::RenderDeckManaColors()
if (deckManaColors.size() == 6) if (deckManaColors.size() == 6)
{ {
// due to space constraints don't display icons for colorless mana. // due to space constraints don't display icons for colorless mana.
for( int colorIdx = Constants::MTG_COLOR_GREEN; colorIdx < Constants::MTG_COLOR_LAND; ++colorIdx ) for( int colorIdx = Constants::MTG_COLOR_GREEN; colorIdx < Constants::MTG_COLOR_WASTE; ++colorIdx )
{ {
if ( (deckManaColors.at(colorIdx) == '1') != 0) if ( (deckManaColors.at(colorIdx) == '1') != 0)
{ {
+1
View File
@@ -394,6 +394,7 @@ void StatsWrapper::updateStats(string filename, MTGAllCards *collection)
void StatsWrapper::updateStats(DeckDataWrapper *myDeck) void StatsWrapper::updateStats(DeckDataWrapper *myDeck)
{ {
if(!this) return;
if (!this->needUpdate || !myDeck) return; if (!this->needUpdate || !myDeck) return;
this->needUpdate = false; this->needUpdate = false;
+132 -2
View File
@@ -130,6 +130,107 @@ int ExtraManaCost::doPay()
return 1; return 1;
} }
//Snow cost
SnowCost * SnowCost::clone() const
{
SnowCost * ec = NEW SnowCost(*this);
return ec;
}
SnowCost::SnowCost() :
ExtraCost("Snow Mana")
{
}
int SnowCost::isPaymentSet()
{
if (source->controller()->getManaPool()->getConvertedCost())
{
int result = 0;
result += source->controller()->snowManaG;
result += source->controller()->snowManaU;
result += source->controller()->snowManaR;
result += source->controller()->snowManaB;
result += source->controller()->snowManaW;
result += source->controller()->snowManaC;
if (result)
{
if ((source->controller()->snowManaC && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{1}",NULL,source))) ||
(source->controller()->snowManaG && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{g}",NULL,source))) ||
(source->controller()->snowManaU && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{u}",NULL,source))) ||
(source->controller()->snowManaR && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{r}",NULL,source))) ||
(source->controller()->snowManaB && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{b}",NULL,source))) ||
(source->controller()->snowManaW && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{w}",NULL,source))) ||
(source->controller()->snowManaC && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{c}",NULL,source))))
return 1;
else
return 0;
}
}
return 0;
}
int SnowCost::canPay()
{
return isPaymentSet();
}
int SnowCost::doPay()
{
if (source->controller()->getManaPool()->getConvertedCost())
{
int result = 0;
result += source->controller()->snowManaG;
result += source->controller()->snowManaU;
result += source->controller()->snowManaR;
result += source->controller()->snowManaB;
result += source->controller()->snowManaW;
result += source->controller()->snowManaC;
if (result)
{
if (source->controller()->snowManaC && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{1}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{1}",NULL,source));
source->controller()->snowManaC -= 1;
}
else if (source->controller()->snowManaG && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{g}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{g}",NULL,source));
source->controller()->snowManaG -= 1;
}
else if (source->controller()->snowManaU && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{u}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{u}",NULL,source));
source->controller()->snowManaU -= 1;
}
else if (source->controller()->snowManaR && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{r}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{r}",NULL,source));
source->controller()->snowManaR -= 1;
}
else if (source->controller()->snowManaB && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{b}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{b}",NULL,source));
source->controller()->snowManaB -= 1;
}
else if (source->controller()->snowManaW && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{w}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{w}",NULL,source));
source->controller()->snowManaW -= 1;
}
else if (source->controller()->snowManaC && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{c}",NULL,source)))
{
source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{c}",NULL,source));
source->controller()->snowManaC -= 1;
}
else
return 0;
return 1;
}
}
return 0;
}
//life cost //life cost
LifeCost * LifeCost::clone() const LifeCost * LifeCost::clone() const
{ {
@@ -147,7 +248,7 @@ LifeCost::LifeCost(TargetChooser *_tc)
int LifeCost::canPay() int LifeCost::canPay()
{ {
MTGCardInstance * _target = (MTGCardInstance *) target; MTGCardInstance * _target = (MTGCardInstance *) target;
if(_target->controller()->life <= 0) if(_target->controller()->life <= 0 || _target->controller()->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
{ {
return 0; return 0;
} }
@@ -185,7 +286,7 @@ SpecificLifeCost::SpecificLifeCost(TargetChooser *_tc, int slc)
int SpecificLifeCost::canPay() int SpecificLifeCost::canPay()
{ {
MTGCardInstance * _target = (MTGCardInstance *) target; MTGCardInstance * _target = (MTGCardInstance *) target;
if(_target->controller()->life >= slc) if(_target->controller()->life >= slc && !_target->controller()->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
{ {
return 1; return 1;
} }
@@ -394,6 +495,35 @@ int ToLibraryCost::doPay()
return 0; return 0;
} }
//to graveyard cost
ToGraveCost * ToGraveCost::clone() const
{
ToGraveCost * ec = NEW ToGraveCost(*this);
if (tc)
ec->tc = tc->clone();
return ec;
}
ToGraveCost::ToGraveCost(TargetChooser *_tc)
: ExtraCost("Move a card to Graveyard", _tc)
{
}
int ToGraveCost::doPay()
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if (target)
{
source->storedCard = target->createSnapShot();
_target->controller()->game->putInGraveyard(target);
target = NULL;
if (tc)
tc->initTargets();
return 1;
}
return 0;
}
//Mill yourself as a cost //Mill yourself as a cost
MillCost * MillCost::clone() const MillCost * MillCost::clone() const
{ {
+66 -71
View File
@@ -600,6 +600,32 @@ void GameObserver::gameStateBasedEffects()
///////////////////////////////////// /////////////////////////////////////
for (int d = 0; d < 2; d++) for (int d = 0; d < 2; d++)
{ {
////check snow count
if (players[d]->snowManaC > players[d]->getManaPool()->getCost(0) + players[d]->getManaPool()->getCost(6))
players[d]->snowManaC = players[d]->getManaPool()->getCost(0) + players[d]->getManaPool()->getCost(6);
if (players[d]->snowManaC < 0)
players[d]->snowManaC = 0;
if (players[d]->snowManaG > players[d]->getManaPool()->getCost(1))
players[d]->snowManaG = players[d]->getManaPool()->getCost(1);
if (players[d]->snowManaG < 0)
players[d]->snowManaG = 0;
if (players[d]->snowManaU > players[d]->getManaPool()->getCost(2))
players[d]->snowManaU = players[d]->getManaPool()->getCost(2);
if (players[d]->snowManaU < 0)
players[d]->snowManaU = 0;
if (players[d]->snowManaR > players[d]->getManaPool()->getCost(3))
players[d]->snowManaR = players[d]->getManaPool()->getCost(3);
if (players[d]->snowManaR < 0)
players[d]->snowManaR = 0;
if (players[d]->snowManaB > players[d]->getManaPool()->getCost(4))
players[d]->snowManaB = players[d]->getManaPool()->getCost(4);
if (players[d]->snowManaB < 0)
players[d]->snowManaB = 0;
if (players[d]->snowManaW > players[d]->getManaPool()->getCost(5))
players[d]->snowManaW = players[d]->getManaPool()->getCost(5);
if (players[d]->snowManaW < 0)
players[d]->snowManaW = 0;
MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library, players[d]->game->exile }; MTGGameZone * dzones[] = { players[d]->game->inPlay, players[d]->game->graveyard, players[d]->game->hand, players[d]->game->library, players[d]->game->exile };
for (int k = 0; k < 5; k++) for (int k = 0; k < 5; k++)
{ {
@@ -612,6 +638,21 @@ void GameObserver::gameStateBasedEffects()
zone->cards[c]->cardistargetter = 0; zone->cards[c]->cardistargetter = 0;
} }
} }
///while checking all these zones, lets also strip devoid cards of thier colors
for (int w = 0; w < zone->nb_cards; w++)
{
MTGCardInstance * card = zone->cards[w];
for (int i = Constants::MTG_COLOR_GREEN; i <= Constants::MTG_COLOR_WHITE; ++i)
{
if (card->has(Constants::DEVOID))
{
card->removeColor(i);
}
}
}
}//check for losers if its GAMEOVER clear the stack to allow gamestateeffects to continue }//check for losers if its GAMEOVER clear the stack to allow gamestateeffects to continue
players[d]->DeadLifeState(); players[d]->DeadLifeState();
} }
@@ -912,13 +953,12 @@ void GameObserver::gameStateBasedEffects()
//Auto skip Phases //Auto skip Phases
int skipLevel = (currentPlayer->playMode == Player::MODE_TEST_SUITE || mLoading) ? Constants::ASKIP_NONE int skipLevel = (currentPlayer->playMode == Player::MODE_TEST_SUITE || mLoading) ? Constants::ASKIP_NONE
: options[Options::ASPHASES].number; : options[Options::ASPHASES].number;
int nrCreatures = currentPlayer->game->inPlay->hasType("creature")?1:0;
if (skipLevel == Constants::ASKIP_SAFE || skipLevel == Constants::ASKIP_FULL) if (skipLevel == Constants::ASKIP_SAFE || skipLevel == Constants::ASKIP_FULL)
{ {
if ((opponent()->isAI() && !(isInterrupting)) && ((mCurrentGamePhase == MTG_PHASE_UNTAP) if ((opponent()->isAI() && !(isInterrupting)) && ((mCurrentGamePhase == MTG_PHASE_UNTAP)
|| (mCurrentGamePhase == MTG_PHASE_DRAW) || (mCurrentGamePhase == MTG_PHASE_COMBATBEGIN) || (mCurrentGamePhase == MTG_PHASE_DRAW) || (mCurrentGamePhase == MTG_PHASE_COMBATBEGIN)
|| ((mCurrentGamePhase == MTG_PHASE_COMBATATTACKERS) && (nrCreatures == 0)) || ((mCurrentGamePhase == MTG_PHASE_COMBATATTACKERS) && (currentPlayer->noPossibleAttackers()))
|| mCurrentGamePhase == MTG_PHASE_COMBATEND || mCurrentGamePhase == MTG_PHASE_ENDOFTURN || mCurrentGamePhase == MTG_PHASE_COMBATEND || mCurrentGamePhase == MTG_PHASE_ENDOFTURN
|| ((mCurrentGamePhase == MTG_PHASE_CLEANUP) && (currentPlayer->game->hand->nb_cards < 8)))) || ((mCurrentGamePhase == MTG_PHASE_CLEANUP) && (currentPlayer->game->hand->nb_cards < 8))))
userRequestNextGamePhase(); userRequestNextGamePhase();
@@ -975,74 +1015,15 @@ void GameObserver::Affinity()
string type = ""; string type = "";
//only do any of the following if a card with the stated ability is in your hand. //only do any of the following if a card with the stated ability is in your hand.
ManaCost * original = NEW ManaCost(); ManaCost * original = NEW ManaCost();
ManaCost * alternate = NEW ManaCost();
ManaCost * buyback = NEW ManaCost();
ManaCost * flashback = NEW ManaCost();
ManaCost * retrace = NEW ManaCost();
original->copy(card->model->data->getManaCost()); original->copy(card->model->data->getManaCost());
alternate->copy(card->model->data->getManaCost()->getAlternative());
buyback->copy(card->model->data->getManaCost()->getBuyback());
flashback->copy(card->model->data->getManaCost()->getFlashback());
retrace->copy(card->model->data->getManaCost()->getRetrace());
//have to run alter cost before affinity or the 2 cancel each other out.
if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost()) if(card->getIncreasedManaCost()->getConvertedCost()||card->getReducedManaCost()->getConvertedCost())
{ {//start1
if(card->getIncreasedManaCost()->getConvertedCost()) if(card->getIncreasedManaCost()->getConvertedCost())
{
original->add(card->getIncreasedManaCost()); original->add(card->getIncreasedManaCost());
for(int kc = Constants::MTG_COLOR_ARTIFACT; kc < Constants::NB_Colors;kc++)
{
if (card->getManaCost()->getAlternative())
{
alternate->add(kc,card->getIncreasedManaCost()->getCost(kc));
}
if (card->getManaCost()->getBuyback())
{
buyback->add(kc,card->getIncreasedManaCost()->getCost(kc));
}
if (card->getManaCost()->getFlashback())
{
flashback->add(kc,card->getIncreasedManaCost()->getCost(kc));
}
if (card->getManaCost()->getRetrace())
{
retrace->add(kc,card->getIncreasedManaCost()->getCost(kc));
}
}
}
if(card->getReducedManaCost()->getConvertedCost()) if(card->getReducedManaCost()->getConvertedCost())
{
original->remove(card->getReducedManaCost()); original->remove(card->getReducedManaCost());
for(int kc = Constants::MTG_COLOR_ARTIFACT; kc < Constants::NB_Colors;kc++)
{
if (card->getManaCost()->getAlternative())
{
alternate->remove(kc,card->getReducedManaCost()->getCost(kc));
}
if (card->getManaCost()->getBuyback())
{
buyback->remove(kc,card->getIncreasedManaCost()->getCost(kc));
}
if (card->getManaCost()->getFlashback())
{
flashback->remove(kc,card->getIncreasedManaCost()->getCost(kc));
}
if (card->getManaCost()->getRetrace())
{
retrace->remove(kc,card->getIncreasedManaCost()->getCost(kc));
}
}
}
if(card->getManaCost()) if(card->getManaCost())
card->getManaCost()->copy(original); card->getManaCost()->copy(original);
if(card->getManaCost()->getAlternative())
card->getManaCost()->setAlternative(alternate);
if(card->getManaCost()->getBuyback())
card->getManaCost()->setBuyback(buyback);
if(card->getManaCost()->getFlashback())
card->getManaCost()->setFlashback(flashback);
if(card->getManaCost()->getRetrace())
card->getManaCost()->setRetrace(retrace);
if(card->getManaCost()->extraCosts) if(card->getManaCost()->extraCosts)
{ {
for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++) for(unsigned int i = 0; i < card->getManaCost()->extraCosts->costs.size();i++)
@@ -1050,11 +1031,11 @@ void GameObserver::Affinity()
card->getManaCost()->extraCosts->costs[i]->setSource(card); card->getManaCost()->extraCosts->costs[i]->setSource(card);
} }
} }
} }//end1
int reducem = 0; int reducem = 0;
bool resetCost = false; bool resetCost = false;
for(unsigned int na = 0; na < card->cardsAbilities.size();na++) for(unsigned int na = 0; na < card->cardsAbilities.size();na++)
{ {//start2
ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]); ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]);
if(newAff) if(newAff)
{ {
@@ -1092,7 +1073,7 @@ void GameObserver::Affinity()
card->getManaCost()->remove(removingCost); card->getManaCost()->remove(removingCost);
SAFE_DELETE(removingCost); SAFE_DELETE(removingCost);
} }
} }//end2
if(card->has(Constants::AFFINITYARTIFACTS)|| if(card->has(Constants::AFFINITYARTIFACTS)||
card->has(Constants::AFFINITYFOREST)|| card->has(Constants::AFFINITYFOREST)||
card->has(Constants::AFFINITYGREENCREATURES)|| card->has(Constants::AFFINITYGREENCREATURES)||
@@ -1100,7 +1081,7 @@ void GameObserver::Affinity()
card->has(Constants::AFFINITYMOUNTAIN)|| card->has(Constants::AFFINITYMOUNTAIN)||
card->has(Constants::AFFINITYPLAINS)|| card->has(Constants::AFFINITYPLAINS)||
card->has(Constants::AFFINITYSWAMP)) card->has(Constants::AFFINITYSWAMP))
{ {//start3
if (card->has(Constants::AFFINITYARTIFACTS)) if (card->has(Constants::AFFINITYARTIFACTS))
{ {
type = "artifact"; type = "artifact";
@@ -1155,13 +1136,27 @@ void GameObserver::Affinity()
if(card->getManaCost()->getCost(color) > 0) if(card->getManaCost()->getCost(color) > 0)
card->getManaCost()->remove(color,1); card->getManaCost()->remove(color,1);
} }
}//end3
//trinisphere... now how to implement kicker recomputation
if(card->has(Constants::TRINISPHERE))
{
for(int jj = card->getManaCost()->getConvertedCost(); jj < 3; jj++)
{
card->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT, 1);
card->countTrini++;
} }
}
else
{
if(card->countTrini)
{
card->getManaCost()->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini);
card->countTrini=0;
}
}
SAFE_DELETE(original); SAFE_DELETE(original);
SAFE_DELETE(alternate);
SAFE_DELETE(buyback);
SAFE_DELETE(flashback);
SAFE_DELETE(retrace);
}//end }//end
} }
} }
+30 -4
View File
@@ -2561,6 +2561,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//Forcefield
found = s.find("forcefield");
if (found != string::npos)
{
MTGAbility * a = NEW AAEPIC(observer, id, card, target,"Forcefield",NULL,true);
a->oneShot = 1;
return a;
}
//Damage //Damage
vector<string> splitDamage = parseBetween(s, "damage:", " ", false); vector<string> splitDamage = parseBetween(s, "damage:", " ", false);
if (splitDamage.size()) if (splitDamage.size())
@@ -2674,6 +2684,16 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//Cascade
vector<string> splitCascade = parseBetween(s, "cascade:", " ", false);
if (splitCascade.size())
{
Targetable * t = spell ? spell->getNextTarget() : NULL;
MTGAbility * a = NEW AACascade(observer, id, card, t , splitCascade[1], NULL, who);
a->oneShot = 1;
return a;
}
//modify turns //modify turns
vector<string> splitModTurn = parseBetween(s, "turns:", " ", false); vector<string> splitModTurn = parseBetween(s, "turns:", " ", false);
if (splitModTurn.size()) if (splitModTurn.size())
@@ -4379,8 +4399,11 @@ void AbilityFactory::addAbilities(int _id, Spell * spell)
case 130553:// Beacon of Immortality case 130553:// Beacon of Immortality
{ {
Player * player = spell->getNextPlayerTarget(); Player * player = spell->getNextPlayerTarget();
if (player->life < (INT_MAX / 4)) if (!player->inPlay()->hasAbility(Constants::CANTCHANGELIFE))
player->life += player->life; {
if (player->life < (INT_MAX / 4))
player->life += player->life;
}
zones->putInZone(card, spell->from, zones->library); zones->putInZone(card, spell->from, zones->library);
zones->library->shuffle(); zones->library->shuffle();
break; break;
@@ -5752,7 +5775,7 @@ const string AManaProducer::getMenuText()
menutext = _("Add "); menutext = _("Add ");
char buffer[128]; char buffer[128];
int alreadyHasOne = 0; int alreadyHasOne = 0;
for (int i = 0; i < 6; i++) for (int i = 0; i < 8; i++)
{ {
int value = output->getCost(i); int value = output->getCost(i);
if (value) if (value)
@@ -5761,8 +5784,11 @@ const string AManaProducer::getMenuText()
menutext.append(","); menutext.append(",");
sprintf(buffer, "%i ", value); sprintf(buffer, "%i ", value);
menutext.append(buffer); menutext.append(buffer);
if (i >= Constants::MTG_COLOR_GREEN && i <= Constants::MTG_COLOR_WHITE) if (i == Constants::MTG_COLOR_WASTE)
menutext.append(_(" colorless"));
else if (i >= Constants::MTG_COLOR_GREEN && i <= Constants::MTG_COLOR_WASTE)
menutext.append(_(Constants::MTGColorStrings[i])); menutext.append(_(Constants::MTGColorStrings[i]));
alreadyHasOne = 1; alreadyHasOne = 1;
} }
} }
+123 -15
View File
@@ -12,6 +12,9 @@
#include "Counters.h" #include "Counters.h"
#include "Subtypes.h" #include "Subtypes.h"
#include "AIPlayerBaka.h"
using namespace std; using namespace std;
SUPPORT_OBJECT_ANALYTICS(MTGCardInstance) SUPPORT_OBJECT_ANALYTICS(MTGCardInstance)
@@ -115,7 +118,14 @@ void MTGCardInstance::copy(MTGCardInstance * card)
AbilityFactory af(observer); AbilityFactory af(observer);
af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell); af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell);
delete spell; delete spell;
mtgid = backupid; if(observer->players[1]->playMode == Player::MODE_TEST_SUITE)
mtgid = backupid; // there must be a way to get the token id...
else
{
mtgid = card->getMTGId(); ///////////////////////////////////////////////////
setId = card->setId; // Copier/Cloner cards produces the same token...//
rarity = card->getRarity(); ///////////////////////////////////////////////////
}
castMethod = castMethodBackUP; castMethod = castMethodBackUP;
backupTargets = this->backupTargets; backupTargets = this->backupTargets;
storedCard = oldStored; storedCard = oldStored;
@@ -168,6 +178,7 @@ void MTGCardInstance::initMTGCI()
isMorphed = false; isMorphed = false;
isFlipped = false; isFlipped = false;
isPhased = false; isPhased = false;
isCascaded = false;
phasedTurn = -1; phasedTurn = -1;
didattacked = 0; didattacked = 0;
didblocked = 0; didblocked = 0;
@@ -194,6 +205,7 @@ void MTGCardInstance::initMTGCI()
storedSourceCard = NULL; storedSourceCard = NULL;
myPair = NULL; myPair = NULL;
miracle = false; miracle = false;
countTrini = 0;
for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++) for (int i = 0; i < ManaCost::MANA_PAID_WITH_SUSPEND +1; i++)
alternateCostPaid[i] = 0; alternateCostPaid[i] = 0;
@@ -918,23 +930,119 @@ JQuadPtr MTGCardInstance::getIcon()
return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB); return WResourceManager::Instance()->RetrieveCard(this, CACHE_THUMB);
} }
ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * oldCost) ManaCost * MTGCardInstance::computeNewCost(MTGCardInstance * card,ManaCost * newCost, ManaCost * refCost, bool noTrinisphere)
{ {
if(card->isLand())
return oldCost;
if(!card) if(!card)
return oldCost; return NULL;
//use forcedalive//
//pay zero costs// if(card->getIncreasedManaCost()->getConvertedCost())
//kicker???...// newCost->add(card->getIncreasedManaCost());
//morph cost todo// if(card->getReducedManaCost()->getConvertedCost())
//trinisphere must be here below// newCost->remove(card->getReducedManaCost());
if(card->has(Constants::TRINISPHERE)) if(refCost->extraCosts)
for(int jj = oldCost->getConvertedCost(); jj < 3; jj++) newCost->extraCosts = refCost->extraCosts;
oldCost->add(Constants::MTG_COLOR_ARTIFACT, 1); //affinity
int color = 0;
string type = "";
ManaCost * original = NEW ManaCost();
original->copy(newCost);
int reducem = 0;
bool resetCost = false;
for(unsigned int na = 0; na < card->cardsAbilities.size();na++)
{//start2
ANewAffinity * newAff = dynamic_cast<ANewAffinity*>(card->cardsAbilities[na]);
if(newAff)
{
if(!resetCost)
{
resetCost = true;
newCost->copy(original);
}
TargetChooserFactory tf(observer);
TargetChooser * tcn = tf.createTargetChooser(newAff->tcString,card,NULL);
return oldCost; for (int w = 0; w < 2; ++w)
{
Player *p = observer->players[w];
MTGGameZone * zones[] = { p->game->inPlay, p->game->graveyard, p->game->hand, p->game->library, p->game->stack, p->game->exile };
for (int k = 0; k < 6; k++)
{
MTGGameZone * z = zones[k];
if (tcn->targetsZone(z))
reducem += z->countByCanTarget(tcn);
}
}
SAFE_DELETE(tcn);
ManaCost * removingCost = ManaCost::parseManaCost(newAff->manaString);
for(int j = 0; j < reducem; j++)
newCost->remove(removingCost);
SAFE_DELETE(removingCost);
}
}//end2
if(card->has(Constants::AFFINITYARTIFACTS)||
card->has(Constants::AFFINITYFOREST)||
card->has(Constants::AFFINITYGREENCREATURES)||
card->has(Constants::AFFINITYISLAND)||
card->has(Constants::AFFINITYMOUNTAIN)||
card->has(Constants::AFFINITYPLAINS)||
card->has(Constants::AFFINITYSWAMP))
{//start3
if (card->has(Constants::AFFINITYARTIFACTS))
type = "artifact";
else if (card->has(Constants::AFFINITYSWAMP))
type = "swamp";
else if (card->has(Constants::AFFINITYMOUNTAIN))
type = "mountain";
else if (card->has(Constants::AFFINITYPLAINS))
type = "plains";
else if (card->has(Constants::AFFINITYISLAND))
type = "island";
else if (card->has(Constants::AFFINITYFOREST))
type = "forest";
else if (card->has(Constants::AFFINITYGREENCREATURES))
{
color = 1;
type = "creature";
}
newCost->copy(original);
int reduce = 0;
if(card->has(Constants::AFFINITYGREENCREATURES))
{
TargetChooserFactory tf(observer);
TargetChooser * tc = tf.createTargetChooser("creature[green]",NULL);
reduce = card->controller()->game->battlefield->countByCanTarget(tc);
SAFE_DELETE(tc);
}
else
reduce = card->controller()->game->battlefield->countByType(type);
for(int i = 0; i < reduce;i++)
if(newCost->getCost(color) > 0)
newCost->remove(color,1);
}//end3
SAFE_DELETE(original);
if(!noTrinisphere)
{
//trinisphere... now how to implement kicker recomputation
if(card->has(Constants::TRINISPHERE))
{
for(int jj = newCost->getConvertedCost(); jj < 3; jj++)
{
newCost->add(Constants::MTG_COLOR_ARTIFACT, 1);
card->countTrini++;
}
}
else
{
if(card->countTrini)
{
newCost->remove(Constants::MTG_COLOR_ARTIFACT, card->countTrini);
card->countTrini=0;
}
}
}
return newCost;
} }
MTGCardInstance * MTGCardInstance::getNextPartner() MTGCardInstance * MTGCardInstance::getNextPartner()
+5 -2
View File
@@ -4,7 +4,7 @@ using std::string;
#include "MTGDefinitions.h" #include "MTGDefinitions.h"
char Constants::MTGColorChars[] = {'x','g','u','r','b','w','l'}; char Constants::MTGColorChars[] = {'x','g','u','r','b','w','c','l'};
vector <const char*> Constants::MTGColorStrings; vector <const char*> Constants::MTGColorStrings;
const string Constants::kManaColorless = "colorless"; const string Constants::kManaColorless = "colorless";
@@ -13,6 +13,7 @@ const string Constants::kManaBlue = "blue";
const string Constants::kManaRed = "red"; const string Constants::kManaRed = "red";
const string Constants::kManaBlack = "black"; const string Constants::kManaBlack = "black";
const string Constants::kManaWhite = "white"; const string Constants::kManaWhite = "white";
const string Constants::kManaWaste = "waste";
int Constants::_r[7] = {75,20,20,200,50,255,128}; int Constants::_r[7] = {75,20,20,200,50,255,128};
int Constants::_g[7] = {30,140,30,15,50,255,128}; int Constants::_g[7] = {30,140,30,15,50,255,128};
@@ -151,7 +152,9 @@ const char* Constants::MTGBasicAbilities[] = {
"zerocast", "zerocast",
"trinisphere", "trinisphere",
"canplayfromexile", "canplayfromexile",
"libraryeater" "libraryeater",
"devoid",
"cantchangelife"
}; };
map<string,int> Constants::MTGBasicAbilitiesMap; map<string,int> Constants::MTGBasicAbilitiesMap;
+6
View File
@@ -375,6 +375,12 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
{ {
copy->miracle = true; copy->miracle = true;
} }
if(from == g->players[0]->game->battlefield || from == g->players[1]->game->battlefield)
if(to != g->players[0]->game->battlefield || to != g->players[1]->game->battlefield)
{
card->kicked = 0;
copy->kicked = 0;//kicked reset everflowing chalice...
}
if (card->discarded) if (card->discarded)
{//set discarded for madness... {//set discarded for madness...
if(from == g->players[0]->game->hand || from == g->players[1]->game->hand) if(from == g->players[0]->game->hand || from == g->players[1]->game->hand)
+172 -97
View File
@@ -481,84 +481,86 @@ int MTGKickerRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
return 0; return 0;
if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) if ((player->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (player->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
return 0; return 0;
ManaCost * kicker = card->getManaCost()->getKicker(); if(!allowedToCast(card,player))
if(!kicker)
{
SAFE_DELETE(kicker);
return 0; return 0;
} if(!card->getManaCost()->getKicker())
ManaCost * playerMana = player->getManaPool();
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;
return 0; return 0;
if ((card->hasType(Subtypes::TYPE_INSTANT)) || card->has(Constants::FLASH) || (card->StackIsEmptyandSorcerySpeed()))
{
if(card->controller()->epic)
return 0;
if (card->controller()->game->playRestrictions->canPutIntoZone(card, game->currentActionPlayer->game->stack) == PlayRestriction::CANT_PLAY)
return 0;
ManaCost * playerMana = player->getManaPool();
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
withKickerCost->add(card->getManaCost()->getKicker());
//cost reduction/recalculation must be here or outside somehow...
#ifdef WIN32
withKickerCost->Dump();
#endif
if (playerMana->canAfford(withKickerCost))
return 1;
} }
delete withKickerCost; return 0;
return 1;
} }
int MTGKickerRule::reactToClick(MTGCardInstance * card) int MTGKickerRule::reactToClick(MTGCardInstance * card)
{ {
if(!isReactingToClick(card, NULL)) if (!isReactingToClick(card))
return 0; return 0;
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * withKickerCost= NEW ManaCost(card->model->data->getManaCost());//using pointers here alters the real cost of the card. ManaCost * cost = card->getManaCost();
if(card->getIncreasedManaCost()->getConvertedCost())
withKickerCost->add(card->getIncreasedManaCost()); //this handles extra cost payments at the moment a card is played.
if(card->getReducedManaCost()->getConvertedCost())
withKickerCost->remove(card->getReducedManaCost()); if (cost->isExtraPaymentSet())
if (card->model->data->getManaCost()->getKicker()->isMulti)
{
while(player->getManaPool()->canAfford(withKickerCost))
{
withKickerCost->add(card->model->data->getManaCost()->getKicker());
card->kicked += 1;
}
card->kicked -= 1;
//for(int i = 0;i < card->kicked;i++)
//player->getManaPool()->pay(card->getManaCost()->kicker);
card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
}
else
{
withKickerCost->add(card->model->data->getManaCost()->getKicker());
card->paymenttype = MTGAbility::PUT_INTO_PLAY_WITH_KICKER;
}
if (withKickerCost->isExtraPaymentSet())
{ {
if (!game->targetListIsSet(card)) if (!game->targetListIsSet(card))
{ {
delete withKickerCost;
return 0; return 0;
} }
} }
else else
{ {
withKickerCost->setExtraCostsAction(this, card); cost->setExtraCostsAction(this, card);
game->mExtraPayment = withKickerCost->extraCosts; game->mExtraPayment = cost->extraCosts;
delete withKickerCost;
return 0; return 0;
} }
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
player->getManaPool()->pay(withKickerCost); int payResult = player->getManaPool()->pay(card->getManaCost());
withKickerCost->doPayExtra(); if (card->getManaCost()->getKicker())
{ //cost reduction/recalculation must be here or outside somehow...
ManaCost * withKickerCost= NEW ManaCost(card->getManaCost());
withKickerCost->add(withKickerCost->getKicker());
if (card->getManaCost()->getKicker()->isMulti)
{
while(previousManaPool->canAfford(withKickerCost))
{
withKickerCost->add(withKickerCost->getKicker());
card->kicked += 1;
}
for(int i = 0;i < card->kicked;i++)
player->getManaPool()->pay(card->getManaCost()->getKicker());
payResult = ManaCost::MANA_PAID_WITH_KICKER;
}
else if (previousManaPool->canAfford(withKickerCost))
{
player->getManaPool()->pay(card->getManaCost()->getKicker());
payResult = ManaCost::MANA_PAID_WITH_KICKER;
}
delete withKickerCost;
}
card->getManaCost()->doPayExtra();
ManaCost * spellCost = previousManaPool->Diff(player->getManaPool()); ManaCost * spellCost = previousManaPool->Diff(player->getManaPool());
delete withKickerCost;
delete previousManaPool; delete previousManaPool;
if (card->isLand()) if (card->isLand())
{ {
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, 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 * spell = NEW Spell(game, 0,copy,NULL,NULL, payResult);
spell->resolve(); spell->resolve();
delete spellCost; delete spellCost;
delete spell; delete spell;
@@ -569,21 +571,21 @@ int MTGKickerRule::reactToClick(MTGCardInstance * card)
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack);
if (game->targetChooser) if (game->targetChooser)
{ {
spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0); spell = game->mLayers->stackLayer()->addSpell(copy, game->targetChooser, spellCost, payResult, 0);
game->targetChooser = NULL; game->targetChooser = NULL;
} }
else else
{ {
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, ManaCost::MANA_PAID_WITH_KICKER, 0); spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0);
} }
if (card->has(Constants::STORM)) if (card->has(Constants::STORM))
{ {
int storm = player->game->stack->seenThisTurn("*", Constants::CAST_ALL) + player->opponent()->game->stack->seenThisTurn("*", Constants::CAST_ALL); int storm = player->game->stack->seenThisTurn("*", Constants::CAST_ALL) + player->opponent()->game->stack->seenThisTurn("*", Constants::CAST_ALL);
ManaCost * stormSpellCost = player->getManaPool(); ManaCost * spellCost = player->getManaPool();
for (int i = storm; i > 1; i--) for (int i = storm; i > 1; i--)
{ {
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, stormSpellCost, ManaCost::MANA_PAID_WITH_KICKER, 1); spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 1);
} }
}//end of storm }//end of storm
@@ -629,7 +631,14 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *
{ {
if (card->alias == 11000) if (card->alias == 11000)
return 0;//overload has its own rule return 0;//overload has its own rule
ManaCost * alternateCost = card->getManaCost()->getAlternative(); if(!card->getManaCost()->getAlternative())
return 0;
ManaCost * alternateCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getAlternative()),card->getManaCost()->getAlternative());
if(alternateCost->extraCosts)
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
{
alternateCost->extraCosts->costs[i]->setSource(card);
}
if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card)) if (!game->currentlyActing()->game->hand->hasCard(card) && !game->currentlyActing()->game->graveyard->hasCard(card) && !game->currentlyActing()->game->exile->hasCard(card))
return 0; return 0;
if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE))) if ((game->currentlyActing()->game->graveyard->hasCard(card) && !card->has(Constants::CANPLAYFROMGRAVEYARD)) || (game->currentlyActing()->game->exile->hasCard(card) && !card->has(Constants::CANPLAYFROMEXILE)))
@@ -689,9 +698,13 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card)
if ( !isReactingToClick(card)) if ( !isReactingToClick(card))
return 0; return 0;
ManaCost *alternateCost = card->getManaCost()->getAlternative(); ManaCost * alternateCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getAlternative()),card->getManaCost()->getAlternative());
card->paymenttype = MTGAbility::ALTERNATIVE_COST; card->paymenttype = MTGAbility::ALTERNATIVE_COST;
if(alternateCost->extraCosts)
for(unsigned int i = 0; i < alternateCost->extraCosts->costs.size();i++)
{
alternateCost->extraCosts->costs[i]->setSource(card);
}
return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE); return reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_ALTERNATIVE);
} }
@@ -795,7 +808,15 @@ int MTGBuyBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
return 0; return 0;
if(!allowedToCast(card,player)) if(!allowedToCast(card,player))
return 0; return 0;
return MTGAlternativeCostRule::isReactingToClick( card, mana, card->getManaCost()->getBuyback() ); if(!card->getManaCost()->getBuyback())
return 0;
ManaCost * buybackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getBuyback()),card->getManaCost()->getBuyback());
if(buybackCost->extraCosts)
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
{
buybackCost->extraCosts->costs[i]->setSource(card);
}
return MTGAlternativeCostRule::isReactingToClick( card, mana, buybackCost );
} }
int MTGBuyBackRule::reactToClick(MTGCardInstance * card) int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
@@ -803,11 +824,15 @@ int MTGBuyBackRule::reactToClick(MTGCardInstance * card)
if (!isReactingToClick(card)) if (!isReactingToClick(card))
return 0; return 0;
ManaCost * alternateCost = card->getManaCost()->getBuyback(); ManaCost * buybackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getBuyback()),card->getManaCost()->getBuyback());
if(buybackCost->extraCosts)
for(unsigned int i = 0; i < buybackCost->extraCosts->costs.size();i++)
{
buybackCost->extraCosts->costs[i]->setSource(card);
}
card->paymenttype = MTGAbility::BUYBACK_COST; card->paymenttype = MTGAbility::BUYBACK_COST;
return MTGAlternativeCostRule::reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_BUYBACK); return MTGAlternativeCostRule::reactToClick(card, buybackCost, ManaCost::MANA_PAID_WITH_BUYBACK);
} }
@@ -837,19 +862,31 @@ int MTGFlashBackRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
if (!player->game->graveyard->hasCard(card)) if (!player->game->graveyard->hasCard(card))
return 0; return 0;
return MTGAlternativeCostRule::isReactingToClick(card, mana, card->getManaCost()->getFlashback() ); if(!card->getManaCost()->getFlashback())
return 0;
ManaCost * flashbackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getFlashback()),card->getManaCost()->getFlashback());
if(flashbackCost->extraCosts)
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
{
flashbackCost->extraCosts->costs[i]->setSource(card);
}
return MTGAlternativeCostRule::isReactingToClick(card, mana, flashbackCost );
} }
int MTGFlashBackRule::reactToClick(MTGCardInstance * card) int MTGFlashBackRule::reactToClick(MTGCardInstance * card)
{ {
ManaCost * alternateCost = card->getManaCost()->getFlashback(); ManaCost * flashbackCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getFlashback()),card->getManaCost()->getFlashback());
if(flashbackCost->extraCosts)
for(unsigned int i = 0; i < flashbackCost->extraCosts->costs.size();i++)
{
flashbackCost->extraCosts->costs[i]->setSource(card);
}
if (!isReactingToClick(card)) if (!isReactingToClick(card))
return 0; return 0;
card->paymenttype = MTGAbility::FLASHBACK_COST; card->paymenttype = MTGAbility::FLASHBACK_COST;
return MTGAlternativeCostRule::reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_FLASHBACK); return MTGAlternativeCostRule::reactToClick(card, flashbackCost, ManaCost::MANA_PAID_WITH_FLASHBACK);
} }
@@ -878,12 +915,19 @@ MTGAlternativeCostRule(observer, _id)
int MTGRetraceRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana) int MTGRetraceRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
{ {
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * alternateManaCost = card->getManaCost()->getRetrace(); if(!card->getManaCost()->getRetrace())
return 0;
ManaCost * retraceCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getRetrace()),card->getManaCost()->getRetrace());
if(retraceCost->extraCosts)
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
{
retraceCost->extraCosts->costs[i]->setSource(card);
}
if (!player->game->graveyard->hasCard(card)) if (!player->game->graveyard->hasCard(card))
return 0; return 0;
return MTGAlternativeCostRule::isReactingToClick( card, mana, alternateManaCost ); return MTGAlternativeCostRule::isReactingToClick( card, mana, retraceCost );
} }
@@ -891,12 +935,17 @@ int MTGRetraceRule::reactToClick(MTGCardInstance * card)
{ {
if (!isReactingToClick(card)) if (!isReactingToClick(card))
return 0; return 0;
ManaCost * alternateCost = card->getManaCost()->getRetrace(); ManaCost * retraceCost = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getRetrace()),card->getManaCost()->getRetrace());
if(retraceCost->extraCosts)
for(unsigned int i = 0; i < retraceCost->extraCosts->costs.size();i++)
{
retraceCost->extraCosts->costs[i]->setSource(card);
}
card->paymenttype = MTGAbility::RETRACE_COST; card->paymenttype = MTGAbility::RETRACE_COST;
return MTGAlternativeCostRule::reactToClick(card, alternateCost, ManaCost::MANA_PAID_WITH_RETRACE); return MTGAlternativeCostRule::reactToClick(card, retraceCost, ManaCost::MANA_PAID_WITH_RETRACE);
} }
ostream& MTGRetraceRule::toString(ostream& out) const ostream& MTGRetraceRule::toString(ostream& out) const
@@ -1048,7 +1097,9 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
//Player * currentPlayer = game->currentPlayer; //Player * currentPlayer = game->currentPlayer;
if (!player->game->hand->hasCard(card)) 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; return 0;
if (!card->getManaCost()->getMorph()) if (!card->getManaCost()->getMorph())
return 0; return 0;
@@ -1062,7 +1113,12 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY) if (card->controller()->game->playRestrictions->canPutIntoZone(card, card->controller()->game->stack) == PlayRestriction::CANT_PLAY)
return 0; return 0;
ManaCost * playerMana = player->getManaPool(); ManaCost * playerMana = player->getManaPool();
ManaCost * morph = card->getManaCost()->getMorph(); ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph());
if(morph->extraCosts)
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
{
morph->extraCosts->costs[i]->setSource(card);
}
#ifdef WIN32 #ifdef WIN32
ManaCost * cost = card->getManaCost(); ManaCost * cost = card->getManaCost();
@@ -1070,7 +1126,7 @@ int MTGMorphCostRule::isReactingToClick(MTGCardInstance * card, ManaCost *)
#endif #endif
//cost of card. //cost of card.
if (morph && playerMana->canAfford(morph)) if (playerMana->canAfford(morph))
{ {
return 1; return 1;
} }
@@ -1085,8 +1141,13 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
return 0; return 0;
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * cost = card->getManaCost(); ManaCost * cost = card->getManaCost();
ManaCost * morph = card->getManaCost()->getMorph();
ManaCost * playerMana = player->getManaPool(); ManaCost * playerMana = player->getManaPool();
ManaCost * morph = card->computeNewCost(card,NEW ManaCost(card->model->data->getManaCost()->getMorph()),card->getManaCost()->getMorph());
if(morph->extraCosts)
for(unsigned int i = 0; i < morph->extraCosts->costs.size();i++)
{
morph->extraCosts->costs[i]->setSource(card);
}
//this handles extra cost payments at the moment a card is played. //this handles extra cost payments at the moment a card is played.
if (playerMana->canAfford(morph)) if (playerMana->canAfford(morph))
{ {
@@ -1108,7 +1169,7 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
} }
//------------------------------------------------------------------------ //------------------------------------------------------------------------
ManaCost * previousManaPool = NEW ManaCost(player->getManaPool()); ManaCost * previousManaPool = NEW ManaCost(player->getManaPool());
player->getManaPool()->pay(card->getManaCost()->getMorph()); player->getManaPool()->pay(morph);
card->getManaCost()->getMorph()->doPayExtra(); card->getManaCost()->getMorph()->doPayExtra();
int payResult = ManaCost::MANA_PAID_WITH_MORPH; int payResult = ManaCost::MANA_PAID_WITH_MORPH;
//if morph has a extra payment thats set, this code pays it.the if statement is 100% needed as it would cause a crash on cards that dont have the morph cost. //if morph has a extra payment thats set, this code pays it.the if statement is 100% needed as it would cause a crash on cards that dont have the morph cost.
@@ -1122,6 +1183,12 @@ int MTGMorphCostRule::reactToClick(MTGCardInstance * card)
card->morphed = true; card->morphed = true;
card->isMorphed = true; card->isMorphed = true;
MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack); MTGCardInstance * copy = player->game->putInZone(card, card->currentZone, player->game->stack);
copy->getManaCost()->resetCosts();//Morph has no ManaCost on stack
copy->setColor(0,1);
copy->types.clear();
string cre = "Creature";
copy->setType(cre.c_str());
copy->basicAbilities.reset();
Spell * spell = NULL; Spell * spell = NULL;
spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0); spell = game->mLayers->stackLayer()->addSpell(copy, NULL, spellCost, payResult, 0);
spell->source->morphed = true; spell->source->morphed = true;
@@ -1169,10 +1236,12 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
return 0; return 0;
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL));
if(card->getIncreasedManaCost()->getConvertedCost()) ManaCost * newCost = card->computeNewCost(card,cost,cost);
cost->add(card->getIncreasedManaCost()); if(newCost->extraCosts)
if(card->getReducedManaCost()->getConvertedCost()) for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
cost->remove(card->getReducedManaCost()); {
newCost->extraCosts->costs[i]->setSource(card);
}
if(card->isLand()) if(card->isLand())
return 0; return 0;
@@ -1187,7 +1256,7 @@ int MTGPayZeroRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
else else
CustomName = "Zero Cast From Anywhere"; CustomName = "Zero Cast From Anywhere";
return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
} }
int MTGPayZeroRule::reactToClick(MTGCardInstance * card) int MTGPayZeroRule::reactToClick(MTGCardInstance * card)
@@ -1196,14 +1265,16 @@ int MTGPayZeroRule::reactToClick(MTGCardInstance * card)
return 0; return 0;
ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL)); ManaCost * cost = NEW ManaCost(ManaCost::parseManaCost("{0}",NULL,NULL));
if(card->getIncreasedManaCost()->getConvertedCost()) ManaCost * newCost = card->computeNewCost(card,cost,cost);
cost->add(card->getIncreasedManaCost()); if(newCost->extraCosts)
if(card->getReducedManaCost()->getConvertedCost()) for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
cost->remove(card->getReducedManaCost()); {
newCost->extraCosts->costs[i]->setSource(card);
}
card->paymenttype = MTGAbility::PAYZERO_COST; card->paymenttype = MTGAbility::PAYZERO_COST;
return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID); return MTGAlternativeCostRule::reactToClick(card, newCost, ManaCost::MANA_PAID);
} }
ostream& MTGPayZeroRule::toString(ostream& out) const ostream& MTGPayZeroRule::toString(ostream& out) const
@@ -1229,10 +1300,12 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
return 0; return 0;
Player * player = game->currentlyActing(); Player * player = game->currentlyActing();
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative());
if(card->getIncreasedManaCost()->getConvertedCost()) ManaCost * newCost = card->computeNewCost(card,cost,cost);
cost->add(card->getIncreasedManaCost()); if(newCost->extraCosts)
if(card->getReducedManaCost()->getConvertedCost()) for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
cost->remove(card->getReducedManaCost()); {
newCost->extraCosts->costs[i]->setSource(card);
}
if (card->isLand()) if (card->isLand())
return 0; return 0;
@@ -1241,7 +1314,7 @@ int MTGOverloadRule::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card))) if ((!card->has(Constants::CANPLAYFROMGRAVEYARD) && player->game->graveyard->hasCard(card))||(!card->has(Constants::CANPLAYFROMEXILE) && player->game->exile->hasCard(card)))
return 0; return 0;
return MTGAlternativeCostRule::isReactingToClick(card, mana, cost); return MTGAlternativeCostRule::isReactingToClick(card, mana, newCost);
} }
int MTGOverloadRule::reactToClick(MTGCardInstance * card) int MTGOverloadRule::reactToClick(MTGCardInstance * card)
@@ -1250,14 +1323,16 @@ int MTGOverloadRule::reactToClick(MTGCardInstance * card)
return 0; return 0;
ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative()); ManaCost * cost = NEW ManaCost(card->model->data->getManaCost()->getAlternative());
if(card->getIncreasedManaCost()->getConvertedCost()) ManaCost * newCost = card->computeNewCost(card,cost,cost);
cost->add(card->getIncreasedManaCost()); if(newCost->extraCosts)
if(card->getReducedManaCost()->getConvertedCost()) for(unsigned int i = 0; i < newCost->extraCosts->costs.size();i++)
cost->remove(card->getReducedManaCost()); {
newCost->extraCosts->costs[i]->setSource(card);
}
card->paymenttype = MTGAbility::OVERLOAD_COST; card->paymenttype = MTGAbility::OVERLOAD_COST;
return MTGAlternativeCostRule::reactToClick(card, cost, ManaCost::MANA_PAID_WITH_OVERLOAD, true); return MTGAlternativeCostRule::reactToClick(card, newCost, ManaCost::MANA_PAID_WITH_OVERLOAD, true);
} }
ostream& MTGOverloadRule::toString(ostream& out) const ostream& MTGOverloadRule::toString(ostream& out) const
+36 -4
View File
@@ -139,10 +139,14 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
} }
break; break;
case 's': case 's':
if (value == "s2l") if (value.find("s2l") != string::npos)
{ //Send To Library Cost (move from anywhere to Library) { //Send To Library Cost (move from anywhere to Library)
manaCost->addExtraCost(NEW ToLibraryCost(tc)); manaCost->addExtraCost(NEW ToLibraryCost(tc));
} }
else if (value.find("s2g") != string::npos)
{ //Send to Graveyard Cost (move from anywhere to Graveyard)
manaCost->addExtraCost(NEW ToGraveCost(tc));
}
else else
{ //Sacrifice { //Sacrifice
manaCost->addExtraCost(NEW SacrificeCost(tc)); manaCost->addExtraCost(NEW SacrificeCost(tc));
@@ -229,6 +233,13 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
manaCost->addExtraCost(NEW LifeorManaCost(NULL,manaType)); manaCost->addExtraCost(NEW LifeorManaCost(NULL,manaType));
break; break;
} }
case 'i' :
{
SAFE_DELETE(tc);
manaCost->add(0,1);
manaCost->addExtraCost(NEW SnowCost);
break;
}
case 'q': case 'q':
if(value == "q") if(value == "q")
{ {
@@ -250,7 +261,7 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
{ {
manaCost->addExtraCost(NEW CycleCost(tc)); manaCost->addExtraCost(NEW CycleCost(tc));
} }
else else if(value.find("(") != string::npos)
{ {
size_t counter_start = value.find("("); size_t counter_start = value.find("(");
size_t counter_end = value.find(")", counter_start); size_t counter_end = value.find(")", counter_start);
@@ -276,9 +287,15 @@ ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstan
tc = tcf.createTargetChooser(target, c); tc = tcf.createTargetChooser(target, c);
} }
manaCost->addExtraCost(NEW CounterCost(counter, tc)); manaCost->addExtraCost(NEW CounterCost(counter, tc));
break;
} }
break; else if(value == "c")
} {
manaCost->add(Constants::MTG_COLOR_WASTE, 1);
break;
}
break;
}
default: //uncolored cost and hybrid costs and special cost default: //uncolored cost and hybrid costs and special cost
{ {
if(value == "unattach") if(value == "unattach")
@@ -742,6 +759,10 @@ int ManaCost::getConvertedCost()
ExtraCost * pMana = dynamic_cast<LifeorManaCost*>(extraCosts->costs[i]); ExtraCost * pMana = dynamic_cast<LifeorManaCost*>(extraCosts->costs[i]);
if (pMana) if (pMana)
result++; result++;
//snow cost???
ExtraCost * sMana = dynamic_cast<SnowCost*>(extraCosts->costs[i]);
if (sMana)
result++;
} }
} }
@@ -1092,6 +1113,8 @@ int ManaPool::remove(int color, int value)
int ManaPool::add(int color, int value, MTGCardInstance * source) int ManaPool::add(int color, int value, MTGCardInstance * source)
{ {
if (color == Constants::MTG_COLOR_ARTIFACT)
color = Constants::MTG_COLOR_WASTE;
int result = ManaCost::add(color, value); int result = ManaCost::add(color, value);
for (int i = 0; i < value; ++i) for (int i = 0; i < value; ++i)
{ {
@@ -1105,6 +1128,15 @@ int ManaPool::add(ManaCost * _cost, MTGCardInstance * source)
{ {
if (!_cost) if (!_cost)
return 0; return 0;
//while colorless is still exactly the same, there are now cards that require
//true colorless mana, ei:eldrazi. so whenever we add mana, we now replace it with the
//new type. keeping the old type intact for payment methods {1}{c} ....
int replaceArtifact = _cost->getCost(Constants::MTG_COLOR_ARTIFACT);
if (replaceArtifact)
{
_cost->add(Constants::MTG_COLOR_WASTE, replaceArtifact);
_cost->remove(Constants::MTG_COLOR_ARTIFACT, replaceArtifact);
}
int result = ManaCost::add(_cost); int result = ManaCost::add(_cost);
for (int i = 0; i < Constants::NB_Colors; i++) for (int i = 0; i < Constants::NB_Colors; i++)
{ {
+27 -1
View File
@@ -34,8 +34,15 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
extraTurn = 0; extraTurn = 0;
drawCounter = 0; drawCounter = 0;
epic = 0; epic = 0;
forcefield = 0;
raidcount = 0; raidcount = 0;
handmodifier = 0; handmodifier = 0;
snowManaG = 0;
snowManaR = 0;
snowManaB = 0;
snowManaU = 0;
snowManaW = 0;
snowManaC = 0;
prowledTypes.clear(); prowledTypes.clear();
doesntEmpty = NEW ManaCost(); doesntEmpty = NEW ManaCost();
poolDoesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost();
@@ -155,7 +162,8 @@ int Player::gainOrLoseLife(int value)
thatmuch = abs(value); //the value that much is a variable to be used with triggered abilities. thatmuch = abs(value); //the value that much is a variable to be used with triggered abilities.
//ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value //ie:when ever you gain life, draw that many cards. when used in a trigger draw:thatmuch, will return the value
//that the triggered event stored in the card for "that much". //that the triggered event stored in the card for "that much".
life+=value; if (!inPlay()->hasAbility(Constants::CANTCHANGELIFE))
life+=value;
if (value<0) if (value<0)
lifeLostThisTurn += abs(value); lifeLostThisTurn += abs(value);
@@ -238,6 +246,24 @@ void Player::serumMulligan()
//Draw hand no penalty //Draw hand no penalty
} }
bool Player::hasPossibleAttackers()
{
MTGGameZone * z = game->inPlay;
int nbcards = z->nb_cards;
for (int j = 0; j < nbcards; ++j)
{
MTGCardInstance * c = z->cards[j];
if (c->canAttack())
return true;
}
return false;
}
bool Player::noPossibleAttackers()
{
return !hasPossibleAttackers();
}
bool Player::DeadLifeState(bool check) bool Player::DeadLifeState(bool check)
{ {
if ((life <= 0)||(poisonCount >= 10)) if ((life <= 0)||(poisonCount >= 10))
+26 -1
View File
@@ -149,7 +149,32 @@ WEventCreatureBlockerRank::WEventCreatureBlockerRank(MTGCardInstance * card, MTG
WEventEngageMana::WEventEngageMana(int color, MTGCardInstance* card, ManaPool * destination) : WEventEngageMana::WEventEngageMana(int color, MTGCardInstance* card, ManaPool * destination) :
WEvent(), color(color), card(card), destination(destination) WEvent(), color(color), card(card), destination(destination)
{ {//controller snow
if(color == 1 && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaG += 1;
if(color == 2 && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaU += 1;
if(color == 3 && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaR += 1;
if(color == 4 && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaB += 1;
if(color == 5 && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaW += 1;
if((color == 0 || color == 6) && card->controller()->getManaPool() == destination && card->hasType("snow"))
card->controller()->snowManaC += 1;
//opponent snow
if(color == 1 && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaG += 1;
if(color == 2 && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaU += 1;
if(color == 3 && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaR += 1;
if(color == 4 && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaB += 1;
if(color == 5 && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaW += 1;
if((color == 0 || color == 6) && card->controller()->opponent()->getManaPool() == destination && card->hasType("snow"))
card->controller()->opponent()->snowManaC += 1;
} }
WEventConsumeMana::WEventConsumeMana(int color, ManaPool * source) : WEventConsumeMana::WEventConsumeMana(int color, ManaPool * source) :
WEvent(), color(color), source(source) WEvent(), color(color), source(source)