diff --git a/projects/mtg/bin/Res/rules/Commander.txt b/projects/mtg/bin/Res/rules/Commander.txt index e63d6210c..54a41dae2 100644 --- a/projects/mtg/bin/Res/rules/Commander.txt +++ b/projects/mtg/bin/Res/rules/Commander.txt @@ -86,6 +86,7 @@ auto=@movedto(other *|battlefield) restriction{type(*[isflipped]|nonbattlezone)~ #Monarch rule auto=@each my endofturn restriction{compare(pmonarch)~morethan~0}:draw:1 +auto=@combatdamageof(player) restriction{compare(pmonarch)~morethan~0}:becomesmonarch opponent #reset Creature damage at the cleanup phase auto=@each cleanup:all(*|myBattlefield) resetDamage diff --git a/projects/mtg/bin/Res/rules/mtg.txt b/projects/mtg/bin/Res/rules/mtg.txt index 5c79f4692..281d06485 100644 --- a/projects/mtg/bin/Res/rules/mtg.txt +++ b/projects/mtg/bin/Res/rules/mtg.txt @@ -85,6 +85,7 @@ auto=@movedto(other *|battlefield) restriction{type(*[isflipped]|nonbattlezone)~ #Monarch rule auto=@each my endofturn restriction{compare(pmonarch)~morethan~0}:draw:1 +auto=@combatdamageof(player) restriction{compare(pmonarch)~morethan~0}:becomesmonarch opponent #reset Creature damage at the cleanup phase auto=@each cleanup:all(*|myBattlefield) resetDamage \ No newline at end of file diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index b00ea7c28..a3ccd49ff 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -3938,8 +3938,8 @@ toughness=3 [/card] [card] name=Avenging Huntbonder -abilities=Double Strike -auto=@combat(attacking) source(this):transforms((,newability[counter(0/0,1,Double Strike)],newability[this(counter{0/0.1.Double Strike}>=1) double strike])) target(other creature[attacking]) +abilities=double strike +auto=@combat(attacking) source(this):name(Put double strike counter) target(other creature[attacking]) transforms((,newability[counter(0/0.1.DoubleStrike)],newability[this(counter{0/0.1.DoubleStrike}>=1) double strike])) forever text=Double strike -- Whenever Avenging Huntbonder attacks, put a double strike counter on another target attacking creature. mana={3}{W}{W} type=Creature @@ -3951,7 +3951,7 @@ toughness=3 name=Avian Oddity abilities=flying,cycling autohand=__CYCLING__({2}{U}) -autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Flying],newability[this(counter{0/0.1.Flying}>=1) flying target(creature|myBattlefield)])) +autohand=@cycled(this|myHand):name(Put flying counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Flying],newability[this(counter{0/0.1.Flying}>=1) flying])) forever text=Flying -- Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -- When you cycle Avian Oddity, put a flying counter on target creature you control. mana={3}{U} type=Creature @@ -5120,9 +5120,9 @@ name=Beast Viv auto=this(counter{0/0.1.Vigilance}>=1) vigilance auto=this(counter{0/0.1.Reach}>=1) reach auto=this(counter{0/0.1.Trample}>=1) trample -auto=choice name(Vigilance) counter(0/0,1,Vigilance) -auto=choice name(Reach) counter(0/0,1,Reach) -auto=choice name(Trample) counter(0/0,1,Trample) +auto=choice name(Vigilance counter) counter(0/0,1,Vigilance) +auto=choice name(Reach counter) counter(0/0,1,Reach) +auto=choice name(Trample counter) counter(0/0,1,Trample) type=Creature subttype=Beast power=3 @@ -6318,8 +6318,7 @@ toughness=2 name=Blood Curdle target=creature auto=destroy -auto=counter(0/0,1,Menace) -auto=transforms((,newability[this(counter{0/0.1.Menace}>=1) menace])) +auto=name(Put menace counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Menace)],newability[this(counter{0/0.1.Menace}>=1) menace])) forever text=Destroy target creature. Put a menace counter on a creature you control. (It can't be blocked except by two or more creatures.) mana={3}{B} type=Instant @@ -7218,8 +7217,8 @@ type=Sorcery name=Boot Nipper auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch auto=this(counter{0/0.1.Lifelink}>=1) lifelink -auto=choice name(Deathtouch) counter(0/0,1,Deathtouch) -auto=choice name(Lifelink) counter(0/0,1,Lifelink) +auto=choice name(Deathtouch counter) counter(0/0,1,Deathtouch) +auto=choice name(Lifelink counter) counter(0/0,1,Lifelink) text=Boot Nipper enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. mana={1}{B} type=Creature @@ -8439,9 +8438,7 @@ toughness=3 [card] name=Call of the Death-Dweller target=creature[manacost<=3]|myGraveyard -auto=moveTo(myBattlefield) -auto=counter(0/0,1,Menace) target(creature[manacost<=3] -auto=transforms((,newability[this(counter{0/0.1.Menace}>=1) menace target(creature[manacost<=3])])) +auto=moveTo(myBattlefield) and!( transforms((,newability[counter(0/0.1.Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch],newability[counter(0/0.1.Menace)],newability[this(counter{0/0.1.Menace}>=1) menace])) forever )! text=Return up to two target creature cards with total converted mana cost 3 or less from your graveyard to the battlefield. Put a deathtouch counter on either of them. Then put a menace counter on either of them. mana={2}{B} type=Sorcery @@ -13119,7 +13116,7 @@ subtype=Equipment [card] name=Crystalline Giant auto=this(counter{0/0.1.Flying}>=1) flying -auto=this(counter{0/0.1.First Strike}>=1) first strike +auto=this(counter{0/0.1.FirstStrike}>=1) first strike auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch auto=this(counter{0/0.1.Hexproof}>=1) opponentshroud auto=this(counter{0/0.1.Lifelink}>=1) lifelink @@ -14033,10 +14030,20 @@ power=3 toughness=2 [/card] [card] +name=Daxos Spirit Token +anyzone=pexperience/pexperience cdaactive +text=This creature’s power and toughness are each equal to the number of experience counters you have. +type=Enchantment Creature +subtype=Spirit +color=black,white +power=* +toughness=* +[/card] +[card] name=Daxos the Returned auto=@movedTo(enchantment|mystack):alterexperience:1 controller -auto={1}{W}{B}: token(Spirit,Creature Enchantment Spirit,[anyzone:type:alterexperience:mybattlefield/type:alterexperience:mybattlefield cdaactive],withe,black) -text=Whenever you cast an enchantment spell, you get an experience counter. -- {1}{W}{B}: Create a white and black Spirit enchantment creature token. It has “This creature’s power and toughness are each equal to the number of experience counters you have.” +auto={1}{W}{B}:name(Create Spirit) token(Daxos Spirit Token) +text=Whenever you cast an enchantment spell, you get an experience counter. -- {1}{W}{B}: Create a white and black Spirit enchantment creature token. It has "This creature’s power and toughness are each equal to the number of experience counters you have." mana={1}{W}{B} type=Legendary Creature subtype=Zombie Soldier @@ -16239,8 +16246,7 @@ type=Enchantment [/card] [card] name=Domesticated Hydra -auto=this(cantargetcard(*[-monstrous]) {X}{G}{G}{G}:becomes(monstrous) forever && counter(1/1,X) -auto=aslongas(this[monstrous]|myBattlefield) trample +auto=this(cantargetcard(*[-monstrous]) {X}{G}{G}{G}:becomes(monstrous) forever && counter(1/1,X) && transforms((,newability[trample])) forever text={X}{G}{G}{G}: Monstrosity X. (If this creature isn’t monstrous, put X +1/+1 counters on it and it becomes monstrous.) -- As long as Domesticated Hydra is monstrous, it has trample. mana={2}{G}{G} type=Creature @@ -17663,8 +17669,8 @@ toughness=1 [/card] [card] name=Duskfang Mentor -auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Lifelink)],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) -auto={1}{W}{T}:counter(1/1,1) all(creature[lifelink]|myBattlefield) +auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0.1.Lifelink)],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) forever +auto={1}{B}{T}:counter(1/1,1) all(creature[lifelink]|myBattlefield) text=When Duskfang Mentor enters the battlefield, put a lifelink counter on target non-Human creature you control. -- {1}{B}, {T}: Put a +1/+1 counter on each creature you control with lifelink. mana={2}{B} type=Creature @@ -20358,7 +20364,7 @@ type=Sorcery [card] name=Ezuri, Claw of Progress auto=@movedTo(creature[power<=2]|myBattlefield):alterexperience:1 controller -auto=@each my combatbegins:foreach(anyzone:alterexperience) counter(1/1,1) target(other creature|myBattlefield) +auto=@each my combatbegins:name(Put 1/1 counters) counter(1/1,pexperience) target(other creature|myBattlefield) text=Whenever a creature with power 2 or less enters the battlefield under your control, you get an experience counter. -- At the beginning of combat on your turn, put X +1/+1 counters on another target creature you control, where X is the number of experience counters you have. mana={2}{G}{U} type=Legendary Creature @@ -22646,8 +22652,8 @@ subtype=Aura name=Flycatcher Giraffid auto=this(counter{0/0.1.Vigilance}>=1) vigilance auto=this(counter{0/0.1.Reach}>=1) reach -auto=choice name(Flying) counter(0/0,1,Vigilance) -auto=choice name(First Strike) counter(0/0,1,Reach) +auto=choice name(Vigilance counter) counter(0/0,1,Vigilance) +auto=choice name(Reach counter) counter(0/0,1,Reach) text=Flycatcher Giraffid enters the battlefield with your choice of a vigilance counter or a reach counter on it. mana={4}{G} type=Creature @@ -23275,8 +23281,8 @@ toughness=6 [/card] [card] name=Frillscare Mentor -auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Menace)],newability[this(counter{0/0.1.Menace}>=1) menace])) -auto={1}{W}{T}:counter(1/1,1) all(creature[Menace]|myBattlefield) +auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0.1.Menace)],newability[this(counter{0/0.1.Menace}>=1) menace])) forever +auto={2}{R}{T}:counter(1/1,1) all(creature[Menace]|myBattlefield) text=When Frillscare Mentor enters the battlefield, put a menace counter on target non-Human creature you control. (It can't be blocked except by two or more creatures.) -- {2}{R}, {T}: Put a +1/+1 counter on each creature you control with menace. mana={2}{R} type=Creature @@ -23491,8 +23497,7 @@ type=Sorcery name=Fully Grown target=creature auto=3/3 ueot -auto=counter(0/0,1,Trample) -auto=transforms((,newability[this(counter{0/0.1.Trample}>=1) trample])) +auto=transforms((,newability[counter(0/0.1.Trample)],newability[this(counter{0/0.1.Trample}>=1) trample])) forever text=Target creature gets +3/+3 until end of turn. Put a trample counter on it. mana={2}{G} type=Instant @@ -27075,9 +27080,9 @@ name=Grimdancer auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch auto=this(counter{0/0.1.Lifelink}>=1) lifelink auto=this(counter{0/0.1.Menace}>=1) menace -auto=choice name(Menace & Deathtouch) counter(0/0,1,Menace) && counter(0/0,1,Deathtouch) -auto=choice name(Menace & Lifelink) counter(0/0,1,Deathtouch) && counter(0/0,1,Lifelink) -auto=choice name(Lifelink & Deathtouch) counter(0/0,1,Lifelink) && counter(0/0,1,Deathtouch) +auto=choice name(Menace and Deathtouch counters) counter(0/0,1,Menace) && counter(0/0,1,Deathtouch) +auto=choice name(Menace and Lifelink counters) counter(0/0,1,Deathtouch) && counter(0/0,1,Lifelink) +auto=choice name(Lifelink and Deathtouch counters) counter(0/0,1,Lifelink) && counter(0/0,1,Deathtouch) text=Grimdancer enters the battlefield with your choice of two different counters on it from among menace, deathtouch, and lifelink. mana={1}{B}{B} type=Creature @@ -28692,8 +28697,7 @@ toughness=2 name=Heightened Reflexes target=creature auto=1/0 ueot -auto=counter(0/0,1,First Strike) -auto=transforms((,newability[this(counter{0/0.1.First Strike}>=1) first strike])) +auto=transforms((,newability[counter(0/0.1.FirstStrike)],newability[this(counter{0/0.1.FirstStrike}>=1) first strike])) forever text=Target creature gets +1/+0 until end of turn. Put a first strike counter on it. mana={R} type=Instant @@ -28721,9 +28725,9 @@ toughness=3 [card] name=Helica Glider auto=this(counter{0/0.1.Flying}>=1) flying -auto=this(counter{0/0.1.First Strike}>=1) first strike +auto=this(counter{0/0.1.FirstStrike}>=1) first strike auto=choice name(Flying) counter(0/0,1,Flying) -auto=choice name(First Strike) counter(0/0,1,First Strike) +auto=choice name(First Strike) counter(0/0,1,FirstStrike) text=Helica Glider enters the battlefield with your choice of a flying counter or a first strike counter on it. mana={2}{W} type=Creature @@ -29619,6 +29623,7 @@ auto=mypoolsave(green) auto=mypoolsave(blue) auto=mypoolsave(artifact) auto=mypoolsave(land) +auto=@movedto(this|nonbattlezone) from(battlefield):name(Terminate effect) name(Terminate effect) transforms((,newability[mypoolsave(red) terminate],newability[mypoolsave(green) terminate],newability[mypoolsave(blue) terminate],newability[mypoolsave(black) terminate],newability[mypoolsave(white) terminate],newability[mypoolsave(artifact) terminate],newability[mypoolsave(land) terminate])) oneshot auto=@each untap restriction{compare(mybluepoolcount)~morethan~0}:thisforeach(variable{mybluepoolcount}) add{C} && removemana({U}) auto=@each untap restriction{compare(mygreenpoolcount)~morethan~0}:thisforeach(variable{mygreenpoolcount}) add{C} && removemana({G}) auto=@each untap restriction{compare(myredpoolcount)~morethan~0}:thisforeach(variable{myredpoolcount})add{C} && removemana({R}) @@ -29678,8 +29683,8 @@ type=Artifact [/card] [card] name=Hornbash Mentor -auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Trample)],newability[this(counter{0/0.1.Trample}>=1) trample])) -auto={1}{W}{T}:counter(1/1,1) all(creature[trample]|myBattlefield) +auto=name(Put trample counter) target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0.1.Trample)],newability[this(counter{0/0.1.Trample}>=1) trample])) forever +auto={2}{G}{T}:counter(1/1) all(creature[trample]|myBattlefield) text=When Hornbash Mentor enters the battlefield, put a trample counter on target non-Human creature you control. -- {2}{G}, {T}: Put a +1/+1 counter on each creature you control with trample. mana={2}{G} type=Creature @@ -30114,7 +30119,7 @@ type=Sorcery [card] name=Hunted Nightmare abilities=menace -auto=notatarget(creature[-human]) transforms((,newability[counter(0/0,1,Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) opponent +auto=ability$!name(Put Deathtouch counter) name(Put Deathtouch counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) forever!$ opponent text=Menace -- When Hunted Nightmare enters the battlefield, target opponent puts a deathtouch counter on a creature they control. mana={1}{B}{B} type=Creature @@ -33399,9 +33404,9 @@ type=Sorcery [/card] [card] name=Kalemne, Disciple of Iroas -abilities=double strike, vigilance +abilities=double strike,vigilance auto=@movedto(creature[manacost>=5]|mystack):alterexperience:1 controller -auto=foreach(anyzone:alterexperience) 1/1 +auto=lord(this) pexperience/pexperience nonstatic text=Double strike, vigilance -- Whenever you cast a creature spell with converted mana cost 5 or greater, you get an experience counter. -- Kalemne, Disciple of Iroas gets +1/+1 for each experience counter you have. mana={2}{R}{W} type=Legendary Creature @@ -33979,9 +33984,9 @@ toughness=3 [/card] [card] name=Kelsien, the Plague -abilities=Vigilance,haste -anyzone=type:alterexperience:nonbattlezone/type:alterexperience:nonbattlezone cdaactive -auto={T}:damage:1 target(creature|opponentBattlefield) transforms((,newability[_DIES_alterexperience:1 controller +abilities=vigilance,haste +auto=lord(this) pexperience/pexperience nonstatic +auto={T}:name(Damage creature) target(creature|opponentbattlefield) transforms((,newability[_DIES_alterexperience:1 opponent],newability[damage:1])) ueot text=Vigilance, haste -- Kelsien, the Plague gets +1/+1 for each experience counter you have. -- {T}: Kelsien deals 1 damage to target creature you don’t control. When that creature dies this turn, you get an experience counter. mana={R}{W}{B} type=Legendary Creature @@ -34326,7 +34331,7 @@ type=Sorcery [/card] [card] name=Kindred Summons -auto=activatechooseatype all(creature[chosentype]|mybattlefield) transforms((,newability[target(creature[share!types!]|mylibrary) moveto(mybattlefield) and! shuffle )!])) oneshot activatechooseend +auto=activatechooseatype transforms((,newability[reveal:plibrarycount optionone name(Get creatures) target(creature[chosentype]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) all(*|reveal) moveto(mylibrary) and!( shuffle )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!( moveTo(myBattlefield) )! afterrevealedend revealend])) oneshot activatechooseend text=Choose a creature type. Reveal cards from the top of your library until you reveal X creature cards of the chosen type, where X is the number of creatures you control of that type. Put those cards onto the battlefield, then shuffle the rest of the revealed cards into your library. mana={5}{G}{G} type=Instant @@ -35212,6 +35217,7 @@ auto=mypoolsave(green) auto=mypoolsave(blue) auto=mypoolsave(artifact) auto=mypoolsave(land) +auto=@movedto(this|nonbattlezone) from(battlefield):name(Terminate effect) name(Terminate effect) transforms((,newability[mypoolsave(red) terminate],newability[mypoolsave(green) terminate],newability[mypoolsave(blue) terminate],newability[mypoolsave(black) terminate],newability[mypoolsave(white) terminate],newability[mypoolsave(artifact) terminate],newability[mypoolsave(land) terminate])) oneshot auto=@each untap restriction{compare(mybluepoolcount)~morethan~0}:thisforeach(variable{mybluepoolcount}) add{C} && removemana({U}) auto=@each untap restriction{compare(mygreenpoolcount)~morethan~0}:thisforeach(variable{mygreenpoolcount}) add{C} && removemana({G}) auto=@each untap restriction{compare(myredpoolcount)~morethan~0}:thisforeach(variable{myredpoolcount})add{C} && removemana({R}) @@ -36274,6 +36280,7 @@ toughness=3 name=Leyline Tyrant abilities=flying auto=mypoolsave(red) +auto=@movedto(this|nonbattlezone) from(battlefield):name(Terminate effect) name(Terminate effect) transforms((,newability[mypoolsave(red) terminate])) oneshot auto=_DIES_:choice name(Pay X red mana) name(Pay X red mana) ability$!name(Damage X) pay[[{X:red}]] name(Damage any target) target(player,creature,planeswalker) damage:X!$ controller text=Flying -- You don't lose unspent red mana as steps and phases end. -- When Leyline Tyrant dies, you may pay any amount of {R}. When you do, it deals that much damage to any target. mana={2}{R}{R} @@ -37679,7 +37686,7 @@ subtype=Aura [card] name=Luminous Broodmoth abilities=flying -auto=@movedto(creature[-flying]|myGraveyard) from(myBattlefield):all(trigger[to]) moveTo(myBattlefield) and!( transforms((,newability[counter(0/0.1.Flying],newability[this(counter{0/0.1.Flying}>=1) flying])) forever )! +auto=@movedto(creature[-flying;-counter{0/0.1.Flying}]|myGraveyard) from(myBattlefield):all(trigger[to]) moveTo(myBattlefield) and!( transforms((,newability[counter(0/0.1.Flying)],newability[this(counter{0/0.1.Flying}>=1) flying])) forever )! text=Flying -- Whenever a creature you control without flying dies, return it to the battlefield under its owner's control with a flying counter on it. mana={2}{W}{W} type=Creature @@ -39340,6 +39347,17 @@ type=Sorcery subtype=Lesson [/card] [card] +name=Meren of Clan Nel Toth +auto=@movedTo(other creature|graveyard) from(myBattlefield):alterexperience:1 controller +auto=@each my endofturn restriction{type(creature|mygraveyard)~morethan~0}:name(Choose a creature) target(creature|mygraveyard) transforms((,newability[if compare(manacost)~morethan~compare(pexperience) then moveto(myhand) else moveto(mybattlefield)])) oneshot +text=Whenever another creature you control dies, you get an experience counter. -- At the beginning of your end step, choose target creature card in your graveyard. If that card's converted mana cost is less than or equal to the number of experience counters you have, return it to the battlefield. Otherwise, put it into your hand. +mana={2}{B}{G} +type=Legendary Creature +subtype=Human Shaman +power=3 +toughness=4 +[/card] +[card] name=Merfolk Branchwalker aicode=activate transforms((,newability[explores],newability[if type(land[zpos=1]|mylibrary)~lessthan~1 then all(this) counter(1/1) else all(land[zpos=1]|mylibrary) moveto(myhand)])) oneshot auto=name(Explores) reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[counter(1/1)])) forever optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) oneshot optiontwoend afterrevealed explores afterrevealedend revealend @@ -39967,8 +39985,8 @@ subtype=Aura [card] name=Mirri, Weatherlight Duelist abilities=first strike -auto=aslongas(this[tapped]) lord(creature[-attacking]|opponentbattlefield) cantattack -auto=aslongas(this[tapped]) lord(creature[-attacking]|opponentbattlefield) cantpwattack +auto=this(tapped) lord(creature[-attacking]|opponentbattlefield) cantattack +auto=this(tapped) lord(creature[-attacking]|opponentbattlefield) cantpwattack auto=@combat(attacking) source(this):aslongas(creature[blocking]|opponentBattlefield) lord(creature[-blocking]|opponentbattlefield) cantblock text=First strike -- Whenever Mirri, Weatherlight Duelist attacks, each opponent can't block with more than one creature this combat. -- As long as Mirri, Weatherlight Duelist is tapped, no more than one creature can attack you each combat. mana={1}{G}{W} @@ -40395,9 +40413,9 @@ type=Instant [/card] [card] name=Momentum Rumbler -auto=this(counter{0/0.1.First Strike}>=1) first strike -auto=@combat(attacking) source(this):this(counter{0/0.1.First Strike}<1) counter(0/0,1,First Strike) -auto=@combat(attacking) source(this):this(counter{0/0.1.First Strike}>0) double strike ueot +auto=this(counter{0/0.1.FirstStrike}>=1) first strike +auto=@combat(attacking) source(this) restriction{compare(hascntfirststrike)~equalto~0)}:name(Put first strike counter) counter(0/0,1,FirstStrike) +auto=@combat(attacking) source(this):this(cantargetcard(*[first strike]|*) transforms((,newability[double strike])) ueot text=Whenever Momentum Rumbler attacks, if it doesn't have first strike, put a first strike counter on it. -- Whenever Momentum Rumbler attacks, if it has first strike, it gains double strike until end of turn. mana={3}{R} type=Creature @@ -43507,6 +43525,7 @@ toughness=4 [card] name=Omnath, Locus of Mana auto=mypoolsave(green) +auto=@movedto(this|nonbattlezone) from(battlefield):name(Terminate effect) name(Terminate effect) transforms((,newability[mypoolsave(green) terminate])) oneshot anyzone=mygreenpoolcountplus1plusend/mygreenpoolcountplus1plusend cdaactive text=Green mana doesn't empty from your mana pool as steps and phases end. -- Omnath, Locus of Mana gets +1/+1 for each green mana in your mana pool. mana={2}{G} @@ -50047,8 +50066,9 @@ type=Sorcery [/card] [card] name=Return from Extinction -auto=choice moveto(myhand) target(creature|mygraveyard) -auto=choice moveto(myhand) target(<2>creature[share!types!]|mygraveyard) +restriction=type(creature|mygraveyard)~morethan~0 +auto=choice name(Return 1 creature) target(creature|mygraveyard) moveTo(myhand) +auto=if type(creature|mygraveyard)~morethan~1 then choice name(Return 2 creatures) name(Return 2 creatures) target(creature|mygraveyard) moveTo(myhand) and!( transforms((,newability[name(Choose another creature) target(other *[creature;share!types!]|mygraveyard) moveTo(myhand)])) oneshot )! text=Choose one — -- • Return target creature card from your graveyard to your hand. -- • Return two target creature cards that share a creature type from your graveyard to your hand. mana={1}{B} type=Sorcery @@ -52549,7 +52569,7 @@ toughness=1 name=Sanctuary Smasher abilities=first strike,cycling autohand=__CYCLING__({2}{R}) -autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,First Strike],newability[this(counter{0/0.1.First Strike}>=1) first strike target(creature|myBattlefield)])) +autohand=@cycled(this|myHand):name(Put a first strike counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.FirstStrike],newability[this(counter{0/0.1.FirstStrike}>=1) first strike])) forever text=First strike -- Cycling {2}{R} ({2}{R}, Discard this card: Draw a card.) -- When you cycle Sanctuary Smasher, put a first strike counter on target creature you control. mana={4}{R}{R} type=Creature @@ -59398,7 +59418,7 @@ type=Instant name=Splendor Mare abilities=lifelink,cycling autohand=__CYCLING__({1}{W}) -autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Lifelink],newability[this(counter{0/0.1.Lifelink}>=1) lifelink target(creature|myBattlefield)])) +autohand=@cycled(this|myHand):name(Put lifelink counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Lifelink],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) forever text=Lifelink -- Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.) -- When you cycle Splendor Mare, put a lifelink counter on target creature you control. mana={2}{W} type=Creature @@ -59475,8 +59495,7 @@ type=Instant name=Spontaneous Flight target=creature auto=2/2 ueot -auto=counter(0/0,1,Flying) -auto=transforms((,newability[this(counter{0/0.1.Flying}>=1) flying])) +auto=transforms((,newability[counter(0/0.1.Flying)],newability[this(counter{0/0.1.Flying}>=1) flying])) forever text=Target creature gets +2/+2 until end of turn. Put a flying counter on it. mana={2}{W} type=Instant @@ -61156,8 +61175,8 @@ type=Instant name=Sudden Spinnerets target=creature auto=1/3 ueot -auto=counter(0/0,1,Reach) -auto=transforms((,newability[this(counter{0/0.1.Reach}>=1) reach],newability[untap(this)])) +auto=untap +auto=transforms((,newability[counter(0/0.1.Reach)],newability[this(counter{0/0.1.Reach}>=1) reach])) forever text=Target creature gets +1/+3 until end of turn. Put a reach counter on it. Untap it. mana={G} type=Instant @@ -62313,28 +62332,28 @@ toughness=4 [/card] [card] name=Taj-Nar Swordsmith -aicode=activate moveTo(mybattlefield) target(equipment|mylibrary) -auto=name(May pay X for equipment) may pay[[{0}]]:name(search equipment) Reveal:type:[Equipment<=0]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=0]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=0]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{1}]]:name(search equipment) Reveal:type:[Equipment<=1]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=1]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=1]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{2}]]:name(search equipment) Reveal:type:[Equipment<=2]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=2]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=2]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{3}]]:name(search equipment) Reveal:type:[Equipment<=3]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=3]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=3]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{4}]]:name(search equipment) Reveal:type:[Equipment<=4]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=4]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=4]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{5}]]:name(search equipment) Reveal:type:[Equipment<=5]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=5]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=5]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{6}]]:name(search equipment) Reveal:type:[Equipment<=6]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=6]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=6]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{7}]]:name(search equipment) Reveal:type:[Equipment<=7]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=7]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=7]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{8}]]:name(search equipment) Reveal:type:[Equipment<=8]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=8]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=8]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{9}]]:name(search equipment) Reveal:type:[Equipment<=9]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=9]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=9]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{10}]]:name(search equipment) Reveal:type:[Equipment<=10]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=10]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=10]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{11}]]:name(search equipment) Reveal:type:[Equipment<=11]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=11]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=11]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{12}]]:name(search equipment) Reveal:type:[Equipment<=12]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=12]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=12]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{13}]]:name(search equipment) Reveal:type:[Equipment<=13]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=13]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=13]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{14}]]:name(search equipment) Reveal:type:[Equipment<=14]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=14]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=14]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{15}]]:name(search equipment) Reveal:type:[Equipment<=15]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=15]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=15]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{16}]]:name(search equipment) Reveal:type:[Equipment<=16]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=16]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=16]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{17}]]:name(search equipment) Reveal:type:[Equipment<=17]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=17]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=17]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{18}]]:name(search equipment) Reveal:type:[Equipment<=18]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=18]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=18]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{19}]]:name(search equipment) Reveal:type:[Equipment<=19]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=19]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=19]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend -auto=name(May pay X for equipment) may pay[[{20}]]:name(search equipment) Reveal:type:[Equipment<=20]:mylibrary revealzone(mylibrary) optionone name(choose an equipment) target(<1>[equipment<=20]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mybattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>[equipment<=20]|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend +auto=choice name(Don't pay) donothing +auto=choice name(X = 0) transforms((,newability[name(Search equipment) target(equipment[manacost=0]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 1) transforms((,newability[pay[[{1}]] name(Pay and search equipment) target(equipment[manacost<=1]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 2) transforms((,newability[pay[[{2}]] name(Pay and search equipment) target(equipment[manacost<=2]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 3) transforms((,newability[pay[[{3}]] name(Pay and search equipment) target(equipment[manacost<=3]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 4) transforms((,newability[pay[[{4}]] name(Pay and search equipment) target(equipment[manacost<=4]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 5) transforms((,newability[pay[[{5}]] name(Pay and search equipment) target(equipment[manacost<=5]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 6) transforms((,newability[pay[[{6}]] name(Pay and search equipment) target(equipment[manacost<=6]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 7) transforms((,newability[pay[[{7}]] name(Pay and search equipment) target(equipment[manacost<=7]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 8) transforms((,newability[pay[[{8}]] name(Pay and search equipment) target(equipment[manacost<=8]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 9) transforms((,newability[pay[[{9}]] name(Pay and search equipment) target(equipment[manacost<=9]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 10) transforms((,newability[pay[[{10}]] name(Pay and search equipment) target(equipment[manacost<=10]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 11) transforms((,newability[pay[[{11}]] name(Pay and search equipment) target(equipment[manacost<=11]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 12) transforms((,newability[pay[[{12}]] name(Pay and search equipment) target(equipment[manacost<=12]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 13) transforms((,newability[pay[[{13}]] name(Pay and search equipment) target(equipment[manacost<=13]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 14) transforms((,newability[pay[[{14}]] name(Pay and search equipment) target(equipment[manacost<=14]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 15) transforms((,newability[pay[[{15}]] name(Pay and search equipment) target(equipment[manacost<=15]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 16) transforms((,newability[pay[[{16}]] name(Pay and search equipment) target(equipment[manacost<=16]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 17) transforms((,newability[pay[[{17}]] name(Pay and search equipment) target(equipment[manacost<=17]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 18) transforms((,newability[pay[[{18}]] name(Pay and search equipment) target(equipment[manacost<=18]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 19) transforms((,newability[pay[[{19}]] name(Pay and search equipment) target(equipment[manacost<=19]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot +auto=choice name(X = 20) transforms((,newability[pay[[{20}]] name(Pay and search equipment) target(equipment[manacost<=20]|mylibrary) moveTo(mybattlefield) and!( shuffle )!])) oneshot text=When Taj-Nar Swordsmith enters the battlefield, you may pay {X}. If you do, search your library for an Equipment card with converted mana cost X or less and put that card onto the battlefield. Then shuffle your library. mana={3}{W} type=Creature @@ -65151,7 +65170,7 @@ toughness=6 name=Titanoth Rex abilities=trample,cycling autohand=__CYCLING__({1}{G}) -autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Trample],newability[this(counter{0/0.1.Trample}>=1) trample target(creature|myBattlefield)]))) +autohand=@cycled(this|myHand):name(Put trample counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Trample],newability[this(counter{0/0.1.Trample}>=1) trample]))) forever text=Trample -- Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.) -- When you cycle Titanoth Rex, put a trample counter on target creature you control. mana={7}{G}{G} type=Creature @@ -66971,9 +66990,7 @@ type=Instant [card] name=Unbreakable Bond target=creature|myGraveyard -auto=moveTo(myBattlefield) -auto=counter(0/0,1,Lifelink) -auto=transforms((,newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) +auto=moveTo(myBattlefield) and!( transforms((,newability[counter(0/0.1.Lifelink)],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) forever )! text=Return target creature card from your graveyard to the battlefield with a lifelink counter on it. mana={4}{B} type=Sorcery @@ -67221,9 +67238,7 @@ toughness=4 [card] name=Unexpected Fangs target=creature -auto=counter(1/1,1) -auto=counter(0/0,1,Lifelink) -auto=transforms((,newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) +auto=transforms((,newability[counter(1/1)],newability[counter(0/0.1.Lifelink)],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) forever text=Put a +1/+1 counter and a lifelink counter on target creature. mana={1}{B} type=Instant @@ -69378,7 +69393,7 @@ toughness=3 name=Void Beckoner abilities=deathtouch,cycling autohand=__CYCLING__({2}{B}) -autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) target(creature|myBattlefield)] +autohand=@cycled(this|myHand):name(Put Deathtouch counter) target(creature|myBattlefield) transforms((,newability[counter(0/0.1.Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) forever text=Deathtouch -- Cycling {2}{B} ({2}{B}, Discard this card: Draw a card.) -- When you cycle Void Beckoner, put a deathtouch counter on target creature you control. mana={6}{B}{B} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 23a6e3050..8aa2f2ba2 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -299,7 +299,7 @@ autostack=if casted(this) then choice target(opponent) life:-3 && life:3 control text=Emerge {6}{B} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Abundant Maw, target opponent loses 3 life and you gain 3 life. mana={8} other={emerge}{6}{B} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Leech power=6 @@ -23958,7 +23958,7 @@ type=Instant name=Crown of Ascension target=creature auto=flying -auto={S}:transforms((,newability[all(creature[share!types!]) flying ueot])) ueot +auto={S}:transforms((,newability[all(*[creature;share!types!]) flying ueot])) ueot text=Enchant creature -- Enchanted creature has flying. -- Sacrifice Crown of Ascension: Enchanted creature and other creatures that share a creature type with it gain flying until end of turn. mana={1}{U} type=Enchantment @@ -23969,7 +23969,7 @@ name=Crown of Awe target=creature auto=protection from black auto=protection from red -auto={S}:transforms((,newability[all(creature[share!types!]) protection from black ueot],newability[all(creature[share!types!]) protection from red ueot])) ueot +auto={S}:transforms((,newability[all(*[creature;share!types!]) protection from black ueot],newability[all(*[creature;share!types!]) protection from red ueot])) ueot text=Enchant creature -- Enchanted creature has protection from black and from red. -- Sacrifice Crown of Awe: Enchanted creature and other creatures that share a creature type with it gain protection from black and from red until end of turn. mana={1}{W} type=Enchantment @@ -24006,7 +24006,7 @@ name=Crown of Fury target=creature auto=1/0 auto=first strike -auto={S}:transforms((,newability[all(creature[share!types!]) first strike ueot],newability[all(creature[share!types!]) 1/0 ueot])) ueot +auto={S}:transforms((,newability[all(*[creature;share!types!]) first strike ueot],newability[all(*[creature;share!types!]) 1/0 ueot])) ueot text=Enchant creature -- Enchanted creature gets +1/+0 and has first strike. -- Sacrifice Crown of Fury: Enchanted creature and other creatures that share a creature type with it get +1/+0 and gain first strike until end of turn. mana={1}{R} type=Enchantment @@ -24016,7 +24016,7 @@ subtype=Aura name=Crown of Suspicion target=creature auto=2/-1 -auto={S}:transforms((,newability[all(creature[share!types!]) 2/-1 ueot])) ueot +auto={S}:transforms((,newability[all(*[creature;share!types!]) 2/-1 ueot])) ueot text=Enchant creature -- Enchanted creature gets +2/-1. -- Sacrifice Crown of Suspicion: Enchanted creature and other creatures that share a creature type with it get +2/-1 until end of turn. mana={1}{B} type=Enchantment @@ -24026,7 +24026,7 @@ subtype=Aura name=Crown of Vigor target=creature auto=1/1 -auto={S}:transforms((,newability[all(creature[share!types!]) 1/1 ueot])) ueot +auto={S}:transforms((,newability[all(*[creature;share!types!]) 1/1 ueot])) ueot text=Enchant creature -- Enchanted creature gets +1/+1. -- Sacrifice Crown of Vigor: Enchanted creature and other creatures that share a creature type with it get +1/+1 until end of turn. mana={1}{G} type=Enchantment @@ -27459,7 +27459,7 @@ autostack=if casted(this) then all(creature|mybattlefield) transforms((,newabili text=Emerge {6}{G}{G}{G} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Decimator of the Provinces, creatures you control get +2/+2 and gain trample until end of turn. -- Trample, haste mana={10} other={emerge}{6}{G}{G}{G} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Boar power=7 @@ -30188,7 +30188,7 @@ autostack=if casted(this) then ability$!name(Reveal) reveal:type:*:opponenthand text=Emerge {5}{B}{B} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Distended Mindbender, target opponent reveals his or her hand. You choose from it a nonland card with converted mana cost 3 or less and a card with converted mana cost 4 or greater. That player discards those cards. mana={8} other={emerge}{5}{B}{B} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Insect power=5 @@ -32499,7 +32499,7 @@ auto=opponentshroud ueot text=Flash (You may cast this spell any time you could cast an instant.) -- Emerge {7}{U} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- Drownyard Behemoth has hexproof as long as it entered the battlefield this turn. mana={9} other={emerge}{7}{U} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Crab power=5 @@ -34185,7 +34185,7 @@ autostack=if casted(this) then target(*|battlefield) tap text=Flash -- Emerge {5}{U}{U} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Elder Deep-Fiend, tap up to four target permanents. mana={8} other={emerge}{5}{U}{U} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Octopus power=5 @@ -46469,7 +46469,8 @@ toughness=2 [/card] [card] name=Giltspire Avenger -auto={t}:target(creature[controllerdamager]) destroy +auto={T}:name(Destroy opponent creature) target(creature[opponentdamager]|opponentbattlefield) destroy +auto={T}:name(Destroy your creature) target(creature[controllerdamager]|mybattlefield) destroy abilities=exalted text=Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.) -- {T}: Destroy target creature that dealt damage to you this turn. mana={G}{W}{U} @@ -49643,8 +49644,7 @@ type=Land [/card] [card] name=Gravepurge -target=creature|mygraveyard -auto=moveTo(mylibrary) +auto=may name(Return creature to library) target(creature|mygraveyard) moveTo(mylibrary) auto=draw:1 controller text=Put any number of target creature cards from your graveyard on top of your library. -- Draw a card. mana={2}{B} @@ -58253,8 +58253,8 @@ toughness=1 [/card] [card] name=Ink Dissolver -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then deplete:3 opponent )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then deplete:3 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then deplete:3 opponent )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then deplete:3 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Ink Dissolver, you may reveal it. If you do, each opponent puts the top three cards of his or her library into his or her graveyard. mana={1}{U} type=Creature @@ -59396,7 +59396,7 @@ autostack=if casted(this) then token(Insect,creature insect, 1/1,green)*2 text=Emerge {6}{G} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast It of the Horrid Swarm, put two 1/1 green Insect creature tokens onto the battlefield. mana={8} other={emerge}{6}{G} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Insect power=4 @@ -63239,7 +63239,7 @@ toughness=3 [/card] [card] name=Kithkin Zephyrnaut -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then +2/+2 ueot && flying ueot && vigilance ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then +2/+2 ueot && flying ueot && vigilance ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Kithkin Zephyrnaut, you may reveal it. If you do, Kithkin Zephyrnaut gets +2/+2 and gains flying and vigilance until end of turn. mana={2}{W} type=Creature @@ -63891,7 +63891,7 @@ toughness=3 [card] name=Konda's Banner auto={2}:equip target(creature[legendary]|mybattlefield) -auto=teach(creature) transforms((,newability[lord(creature[share!color!]) 1/1],newability[lord(creature[share!types!]) 1/1])) +auto=teach(creature) transforms((,newability[lord(creature[share!color!]) 1/1],newability[lord(*[creature;share!types!]) 1/1])) text=Konda's Banner can be attached only to a legendary creature. -- Creatures that share a color with equipped creature get +1/+1. -- Creatures that share a creature type with equipped creature get +1/+1. -- Equip {2} mana={2} type=Legendary Artifact @@ -65579,7 +65579,7 @@ autostack=if casted(this) then target(*[-land]|battlefield) moveto(ownerlibrary) text=Emerge {5}{G}{U} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Lashweed Lurker, you may put target nonland permanent on top of its owner's library. mana={8} other={emerge}{5}{G}{U} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Horror power=5 @@ -66094,7 +66094,7 @@ toughness=2 [card] name=Leaf-Crowned Elder aicode=activate target(creature[share!types!zpos=1]|mylibrary) castcard(normal) -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then may castcard(restricted) target(*|reveal) optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then may castcard(restricted) target(*|reveal) optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Leaf-Crowned Elder, you may reveal it. If you do, you may play that card without paying its mana cost. mana={2}{G}{G} type=Creature @@ -75047,7 +75047,7 @@ toughness=4 [/card] [card] name=Mistform Warchief -auto=lord(creature[share!types!]|mycastingzone) altercost(colorless,-1) chooseend +auto=lord(*[creature;share!types!]|mycastingzone) altercost(colorless,-1) chooseend auto={T}:activatechooseatype all(this) becomes(removecreaturesubtypes) && becomes(chosentype) ueot activatechooseend text=Creature spells you cast that share a creature type with Mistform Warchief cost {1} less to cast. -- {T}: Mistform Warchief becomes the creature type of your choice until end of turn. mana={2}{U} @@ -75290,7 +75290,7 @@ autostack=if casted(this) then may destroy target(artifact,enchantment) text=Emerge {7}{G} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Mockery of Nature, you may destroy target artifact or enchantment. mana={9} other={emerge}{7}{G} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Beast power=6 @@ -76922,8 +76922,8 @@ toughness=3 [/card] [card] name=Mudbutton Clanger -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then all(this) 1/1 ueot )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then all(this) +1/+1 ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then all(this) 1/1 ueot )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then all(this) +1/+1 ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Mudbutton Clanger, you may reveal it. If you do, Mudbutton Clanger gets +1/+1 until end of turn. mana={R} type=Creature @@ -79808,8 +79808,8 @@ toughness=1 [/card] [card] name=Nightshade Schemers -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then life:-2 opponent )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then life:-2 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then life:-2 opponent )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then life:-2 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Flying -- Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Nightshade Schemers, you may reveal it. If you do, each opponent loses 2 life. mana={4}{B} type=Creature @@ -84648,7 +84648,7 @@ toughness=1 [card] name=Patron of the Akki other={kgoblin} name(Goblin Offering) -otherrestriction=compare(ishumannt)~morethan~0,type(goblin|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(goblin|myBattlefield)~morethan~0 abilities=offering auto=@combat(attacking) source(this):all(creature[attacking]) 2/0 ueot text=Goblin offering (You may cast this card any time you could cast an instant by sacrificing a Goblin and paying the difference in mana costs between this and the sacrificed Goblin. Mana cost includes color.) -- Whenever Patron of the Akki attacks, creatures you control get +2/+0 until end of turn. @@ -84661,7 +84661,7 @@ toughness=5 [card] name=Patron of the Kitsune other={kfox} name(Fox Offering) -otherrestriction=compare(ishumannt)~morethan~0,type(fox|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(fox|myBattlefield)~morethan~0 abilities=offering auto=@each blockers:may life:type:creature[attacking]:battlefield controller text=Fox offering (You may cast this card any time you could cast an instant by sacrificing a Fox and paying the difference in mana costs between this and the sacrificed Fox. Mana cost includes color.) -- Whenever a creature attacks, you may gain 1 life. @@ -84674,7 +84674,7 @@ toughness=6 [card] name=Patron of the Moon other={kmoonfolk} name(Moonfolk Offering) -otherrestriction=compare(ishumannt)~morethan~0,type(moonfolk|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(moonfolk|myBattlefield)~morethan~0 abilities=flying,offering auto={1}:name(put 2 lands in play) moveto(mybattlefield) and!(tap(noevent))! notatarget(land|myhand) text=Moonfolk offering (You may cast this card any time you could cast an instant by sacrificing a Moonfolk and paying the difference in mana costs between this and the sacrificed Moonfolk. Mana cost includes color.) -- Flying -- {1}: Put up to two land cards from your hand onto the battlefield tapped. @@ -84687,7 +84687,7 @@ toughness=4 [card] name=Patron of the Nezumi other={krat} name(Rat Offering) -otherrestriction=compare(ishumannt)~morethan~0,type(rat|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(rat|myBattlefield)~morethan~0 abilities=offering auto=@movedto(*|opponentgraveyard) from(battlefield):life:-1 opponent text=Rat offering (You may cast this card any time you could cast an instant by sacrificing a Rat and paying the difference in mana costs between this and the sacrificed Rat. Mana cost includes color.) -- Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. @@ -84700,7 +84700,7 @@ toughness=6 [card] name=Patron of the Orochi other={ksnake} name(Snake Offering) -otherrestriction=compare(ishumannt)~morethan~0,type(snake|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(snake|myBattlefield)~morethan~0 abilities=offering auto={T}:name(untap all green creatures and forests) untap all(forest) && untap all(creature[green]) limit:1 text=Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.) -- {T}: Untap all Forests and all green creatures. Activate this ability only once each turn. @@ -90092,8 +90092,8 @@ type=Sorcery [/card] [card] name=Pyroclast Consul -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then damage:2 all(creature|battlefield) )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then all(creature|battlefield) damage:2 optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then damage:2 all(creature|battlefield) )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then all(creature|battlefield) damage:2 optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Pyroclast Consul, you may reveal it. If you do, Pyroclast Consul deals 2 damage to each creature. mana={3}{R}{R} type=Creature @@ -92863,8 +92863,9 @@ type=Enchantment [/card] [card] name=Reciprocate -target=creature[controllerdamager] -auto=moveto(exile) +restriction=type(creature[damager]|battlefield)~morethan~0 +auto=if type(creature[opponentdamager]|opponentbattlefield)~morethan~0 then choice name(Exile opponent creature) name(Exile opponent creature) target(creature[opponentdamager]|opponentbattlefield) moveto(exile) +auto=if type(creature[controllerdamager]|mybattlefield)~morethan~0 then choice name(Exile your creature) name(Exile your creature) target(creature[controllerdamager]|mybattlefield) moveto(exile) text=Exile target creature that dealt damage to you this turn. mana={W} type=Instant @@ -94444,7 +94445,8 @@ type=Instant [/card] [card] name=Retaliate -auto=all(creature[controllerdamager]) destroy +auto=all(creature[opponentdamager]|opponentbattlefield) destroy +auto=all(creature[controllerdamager]|mybattlefield) destroy text=Destroy all creatures that dealt damage to you this turn. mana={2}{W}{W} type=Instant @@ -102176,8 +102178,8 @@ toughness=4 [/card] [card] name=Sensation Gorger -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then reject all(*|hand) && draw:4 all(player) )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then all(player) discard:20 && draw:4 optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then reject all(*|hand) && draw:4 all(player) )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then all(player) discard:20 && draw:4 optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Sensation Gorger, you may reveal it. If you do, each player discards his or her hand and draws four cards. mana={1}{R}{R} type=Creature @@ -110255,7 +110257,8 @@ toughness=2 [card] name=Spear of Heliod auto=lord(creature|mybattlefield) 1/1 -auto={1}{W}{W}{T}:target(creature[controllerdamager]|battlefield) destroy +auto={1}{W}{W}{T}:name(Destroy opponent creature) target(creature[opponentdamager]|opponentbattlefield) destroy +auto={1}{W}{W}{T}:name(Destroy your creature) target(creature[controllerdamager]|mybattlefield) destroy text=Creatures you control get +1/+1. -- {1}{W}{W}, {T}: Destroy target creature that dealt damage to you this turn. mana={1}{W}{W} type=Legendary Enchantment Artifact @@ -112186,8 +112189,8 @@ type=Sorcery [/card] [card] name=Squeaking Pie Grubfellows -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then ability$!name(discard) reject notatarget(*|myhand)!$ opponent )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then discard:1 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then ability$!name(discard) reject notatarget(*|myhand)!$ opponent )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then discard:1 opponent optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Squeaking Pie Grubfellows, you may reveal it. If you do, each opponent discards a card. mana={3}{B} type=Creature @@ -113731,7 +113734,7 @@ toughness=2 [card] name=Stoneforge Masterwork auto={2}:equip -auto=teach(creature) transforms((,newability[foreach(other creature[share!types!]|mybattlefield) 1/1])) +auto=teach(creature) transforms((,newability[foreach(other *[creature;share!types!]|mybattlefield) 1/1])) text=Equipped creature gets +1/+1 for each other creature you control that shares a creature type with it. -- Equip {2} mana={1} type=Artifact @@ -126414,13 +126417,16 @@ auto=mypoolsave(blue) auto=mypoolsave(black) auto=mypoolsave(white) auto=mypoolsave(green) -auto=mypoolsave(colorless) +auto=mypoolsave(artifact) +auto=mypoolsave(land) auto=opponentpoolsave(red) auto=opponentpoolsave(green) auto=opponentpoolsave(blue) auto=opponentpoolsave(black) auto=opponentpoolsave(white) -auto=opponentpoolsave(colorless) +auto=opponentpoolsave(artifact) +auto=opponentpoolsave(land) +auto=@movedto(this|nonbattlezone) from(battlefield):name(Terminate effect) name(Terminate effect) transforms((,newability[mypoolsave(red) terminate],newability[mypoolsave(green) terminate],newability[mypoolsave(blue) terminate],newability[mypoolsave(black) terminate],newability[mypoolsave(white) terminate],newability[mypoolsave(artifact) terminate],newability[mypoolsave(land) terminate],newability[opponentpoolsave(red) terminate],newability[opponentpoolsave(green) terminate],newability[opponentpoolsave(blue) terminate],newability[opponentpoolsave(black) terminate],newability[opponentpoolsave(white) terminate],newability[opponentpoolsave(artifact) terminate],newability[opponentpoolsave(land) terminate])) oneshot text=Mana pools don't empty as steps and phases end. mana={3}{G} type=Enchantment @@ -128431,7 +128437,7 @@ autostack=if casted(this) then may moveTo(myhand) target(instant,sorcery|mygrave text=Emerge {6}{U} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Vexing Scuttler, you may return target instant or sorcery card from your graveyard to your hand. mana={8} other={emerge}{6}{U} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Crab power=4 @@ -131561,8 +131567,8 @@ toughness=3 [/card] [card] name=Wandering Graybeard -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then life:4 controller)!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then life:4 controller optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then life:4 controller)!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then life:4 controller optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Wandering Graybeard, you may reveal it. If you do, you gain 4 life. mana={3}{W}{W} type=Creature @@ -132397,8 +132403,8 @@ toughness=4 [/card] [card] name=Waterspout Weavers -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then all(creature|mybattlefield) flying ueot)!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then all(creature|mybattlefield) flying ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then all(creature|mybattlefield) flying ueot)!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then all(creature|mybattlefield) flying ueot optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Waterspout Weavers, you may reveal it. If you do, each creature you control gains flying until end of turn. mana={3}{U}{U} type=Creature @@ -134591,8 +134597,8 @@ toughness=2 [/card] [card] name=Winnower Patrol -aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(creature[share!types!]|*) then all(this) counter(1/1) )!)! -auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(creature[share!types!]|reveal)~morethan~0 then all(this) counter(1/1,1) optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend +aicode=activate target(*[zpos=1]|mylibrary) moveto(mylibrary) and!(moveto(mylibrary) and!(if cantargetcard(*[creature;share!types!]|*) then all(this) counter(1/1) )!)! +auto=@each my upkeep:name(Kinship) reveal:1 optionone if type(*[creature;share!types!]|reveal)~morethan~0 then all(this) counter(1/1,1) optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text=Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Winnower Patrol, you may reveal it. If you do, put a +1/+1 counter on Winnower Patrol. mana={2}{G} type=Creature @@ -135954,7 +135960,7 @@ autostack=if casted(this) then draw:1 text=Emerge {5}{U} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.) -- When you cast Wretched Gryff, draw a card. -- Flying mana={7} other={emerge}{5}{U} name(Emerge) -otherrestriction=compare(ishumannt)~morethan~0,type(creature|myBattlefield)~morethan~0 +otherrestriction=compare(ishuman)~morethan~0,type(creature|myBattlefield)~morethan~0 type=Creature subtype=Eldrazi Hippogriff power=3 diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index c2588045b..ba54304a5 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -627,6 +627,7 @@ subtype=Daretti name=Daretti, Scrap Savant abilities=canbecommander auto=counter(0/0,3,loyalty) +auto={C(0/0,2,Loyalty)}:name(+2: Don't discard) donothing auto={C(0/0,2,Loyalty)}:name(+2: Discard and Draw) reject notatarget(*|myhand) and!( draw:1 controller )! auto={C(0/0,-2,Loyalty)}:name(-2: Sacrifice an Artifact) sacrifice notatarget(artifact|mybattlefield) and!( moveto(mybattlefield) target(artifact|mygraveyard) )! auto={C(0/0,-10,Loyalty)}:name(-10: Emblem: "Reanimate artifacts") emblem transforms((,newability[@movedTo(artifact|mygraveyard) from(battlefield):all(trigger[to]) phaseaction[endofturn once] moveTo(mybattlefield)])) forever dontremove diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 11cd4a173..2e59dcade 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -2962,7 +2962,6 @@ name=Double Stroke text=Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.) -- Whenever you cast an instant or sorcery spell with the chosen name, you may copy it. You may choose new targets for the copy. type=Conspiracy [/card] - [card] name=Doubling Chant text=For each creature you control, you may search your library for a creature card with the same name as that creature. Put those cards onto the battlefield, then shuffle your library. @@ -6939,15 +6938,6 @@ power=3 toughness=3 [/card] [card] -name=Meren of Clan Nel Toth -text=Whenever another creature you control dies, you get an experience counter. -- At the beginning of your end step, choose target creature card in your graveyard. If that card's converted mana cost is less than or equal to the number of experience counters you have, return it to the battlefield. Otherwise, put it into your hand. -mana={2}{B}{G} -type=Legendary Creature -subtype=Human Shaman -power=3 -toughness=4 -[/card] -[card] name=Merieke Ri Berit text=Merieke Ri Berit doesn't untap during your untap step. -- {T}: Gain control of target creature for as long as you control Merieke Ri Berit. When Merieke Ri Berit leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated. mana={W}{U}{B} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6ac1592a0..5cdfbe6d5 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -499,7 +499,34 @@ public: return NEW TrplayerEnergized(*this); } }; +class TrplayerExperienced: public Trigger +{ +public: + bool thiscontroller, thisopponent; + TrplayerExperienced(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false, bool thiscontroller = false, bool thisopponent = false) : + Trigger(observer, id, source,once, tc),thiscontroller(thiscontroller),thisopponent(thisopponent) + { + } + int triggerOnEventImpl(WEvent * event) + { + WEventplayerExperienced * e = dynamic_cast (event); + if (!e) return 0; + if (!tc->canTarget(e->player)) return 0; + if(thiscontroller) + if(e->player != source->controller()) + return 0; + if(thisopponent) + if(e->player == source->controller()) + return 0; + return 1; + } + + TrplayerExperienced * clone() const + { + return NEW TrplayerExperienced(*this); + } +}; class TrplayerMonarch: public Trigger { public: @@ -4023,6 +4050,19 @@ public: AAAlterEnergy * clone() const; ~AAAlterEnergy(); }; +//Experience Counter +class AAAlterExperience: public ActivatedAbilityTP +{ +public: + int experience; + + AAAlterExperience(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int energy, ManaCost * _cost = NULL, + int who = TargetChooser::UNSET); + int resolve(); + const string getMenuText(); + AAAlterExperience * clone() const; + ~AAAlterExperience(); +}; //Boast Event class AABoastEvent: public ActivatedAbilityTP { @@ -5164,7 +5204,8 @@ class AManaPoolSaver: public MTGAbility public: string Color; bool OtherPlayer; - AManaPoolSaver(GameObserver* observer, int id, MTGCardInstance * source,string Color = "",bool otherPlayer = false); + bool RemovePool; + AManaPoolSaver(GameObserver* observer, int id, MTGCardInstance * source, string Color = "", bool otherPlayer = false, bool removePool = false); int addToGame(); int destroy(); AManaPoolSaver * clone() const; @@ -5177,7 +5218,7 @@ public: REDrawReplacement * re; MTGAbility * replacer; bool OtherPlayer; - ADrawReplacer(GameObserver* observer, int id, MTGCardInstance * source, MTGAbility * _replace = NULL,bool otherPlayer = false); + ADrawReplacer(GameObserver* observer, int id, MTGCardInstance * source, MTGAbility * _replace = NULL, bool otherPlayer = false); int addToGame(); int destroy(); ADrawReplacer * clone() const; diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index c853124b1..9eaee946f 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -43,6 +43,7 @@ public: int extraTurn; int drawCounter; int energyCount; + int experienceCount; int yidaroCount; int dungeonCompleted; int numOfCommandCast; diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 8404c45b5..adeb78421 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -352,6 +352,15 @@ struct WEventplayerEnergized : public WEvent { virtual Targetable * getTarget(Player * player); }; +//alterexperience event +struct WEventplayerExperienced : public WEvent { + WEventplayerExperienced(Player * player, int nb_count); + Player * player; + int nb_count; + using WEvent::getTarget; + virtual Targetable * getTarget(Player * player); +}; + //monarch event struct WEventplayerMonarch : public WEvent { WEventplayerMonarch(Player * player); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 6400f7a30..697c809c8 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1376,6 +1376,8 @@ int AAAlterEnergy::resolve() if(pTarget) { pTarget->energyCount += energy; + if(pTarget->energyCount < 0) + pTarget->energyCount = 0; if(energy > 0) { WEvent * e = NEW WEventplayerEnergized(pTarget, energy); @@ -1401,6 +1403,49 @@ AAAlterEnergy::~AAAlterEnergy() { } +//AA Experience Counters +AAAlterExperience::AAAlterExperience(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int experience, ManaCost * _cost, + int who) : + ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), experience(experience) +{ +} + +int AAAlterExperience::resolve() +{ + Damageable * _target = (Damageable *) getTarget(); + if (_target) + { + Player * pTarget = (Player*)_target; + if(pTarget) + { + pTarget->experienceCount += experience; + if(pTarget->experienceCount < 0) + pTarget->experienceCount = 0; + if(experience > 0) + { + WEvent * e = NEW WEventplayerExperienced(pTarget, experience); + game->receiveEvent(e); + }//todo loses experience event + } + } + return 0; +} + +const string AAAlterExperience::getMenuText() +{ + WParsedInt parsedNum(experience); + return _(parsedNum.getStringValue() + " Experience ").c_str(); +} + +AAAlterExperience * AAAlterExperience::clone() const +{ + return NEW AAAlterExperience(*this); +} + +AAAlterExperience::~AAAlterExperience() +{ +} + //Damage Prevent AADamagePrevent::AADamagePrevent(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int preventing, ManaCost * _cost, int who) : @@ -2615,6 +2660,12 @@ int AARemoveSingleCounter::resolve() a->oneShot = true; pcounters.push_back(a); } + else if(pTarget && pTarget->experienceCount) + { + MTGAbility * a = NEW AAAlterExperience(game, game->mLayers->actionLayer()->getMaxId(), source, target, -nb, NULL); + a->oneShot = true; + pcounters.push_back(a); + } else if (cTarget && cTarget->counters) { Counters * counters = cTarget->counters; @@ -2688,6 +2739,16 @@ int AADuplicateCounters::resolve() a->oneShot = true; pcounters.push_back(a); } + else if(pTarget && pTarget->experienceCount) + { + MTGAbility * a = NULL; + if(single) + a = NEW AAAlterExperience(game, game->mLayers->actionLayer()->getMaxId(), source, target, 1, NULL); + else + a = NEW AAAlterExperience(game, game->mLayers->actionLayer()->getMaxId(), source, target, pTarget->experienceCount, NULL); + a->oneShot = true; + pcounters.push_back(a); + } else if (cTarget && cTarget->counters) { Counters * counters = cTarget->counters; @@ -2768,6 +2829,12 @@ int AAProliferate::resolve() a->oneShot = true; pcounters.push_back(a); } + else if(pTarget && pTarget->experienceCount && pTarget == source->controller()) + { + MTGAbility * a = NEW AAAlterExperience(game, game->mLayers->actionLayer()->getMaxId(), source, target, 1, NULL); + a->oneShot = true; + pcounters.push_back(a); + } else if (cTarget && cTarget->counters) { Counters * counters = cTarget->counters; @@ -3517,23 +3584,37 @@ GenericPaidAbility::~GenericPaidAbility() SAFE_DELETE(baseAbility); } -//saves a listed mana type until end of turn. -AManaPoolSaver::AManaPoolSaver(GameObserver* observer, int id, MTGCardInstance * source,string color, bool otherPlayer) : -MTGAbility(observer, id, source),Color(color),OtherPlayer(otherPlayer) +//saves a listed mana type. +AManaPoolSaver::AManaPoolSaver(GameObserver* observer, int id, MTGCardInstance * source,string color, bool otherPlayer, bool removePool) : +MTGAbility(observer, id, source),Color(color),OtherPlayer(otherPlayer),RemovePool(removePool) { } int AManaPoolSaver::addToGame() { int colorInt = Constants::GetColorStringIndex(Color.c_str()); - source->controller()->poolDoesntEmpty->add(colorInt,1); + if(OtherPlayer){ + if(RemovePool) + source->controller()->opponent()->poolDoesntEmpty->remove(colorInt,1); + else + source->controller()->opponent()->poolDoesntEmpty->add(colorInt,1); + } + else { + if(RemovePool) + source->controller()->poolDoesntEmpty->remove(colorInt,1); + else + source->controller()->poolDoesntEmpty->add(colorInt,1); + } return 1; } int AManaPoolSaver::destroy() { int colorInt = Constants::GetColorStringIndex(Color.c_str()); - source->controller()->poolDoesntEmpty->remove(colorInt,1); + if(OtherPlayer) + source->controller()->opponent()->poolDoesntEmpty->remove(colorInt,1); + else + source->controller()->poolDoesntEmpty->remove(colorInt,1); return 1; } @@ -6099,6 +6180,22 @@ int AARemoveMana::resolve() return 1; } manaPool->Empty(); + } + else if(game->getCurrentGamePhase() == MTG_PHASE_ENDOFTURN && !forceclean) + { + if(player->poolDoesntEmpty->getConvertedCost()) + { + ManaCost * toSave = NEW ManaCost(); + for(int k = Constants::MTG_COLOR_ARTIFACT; k < Constants::NB_Colors;k++) + { + if(player->poolDoesntEmpty->getCost(k)) + toSave->add(k,manaPool->getCost(k)); + } + player->getManaPool()->pay(manaPool->Diff(toSave)); + delete(toSave); + return 1; + } + manaPool->Empty(); } else manaPool->Empty(); @@ -7144,14 +7241,9 @@ ATransformer::ATransformer(GameObserver* observer, int id, MTGCardInstance * sou if (stypes.find("allsubtypes") != string::npos || stypes.find("removecreaturesubtypes") != string::npos) { - const vector values = MTGAllCards::getValuesById(); - for (size_t i = 0; i values = MTGAllCards::getCreatureValuesById(); + for (size_t i = 0; i < values.size(); ++i) + types.push_back(MTGAllCards::findType(values.at(i))); } else { diff --git a/projects/mtg/src/CardDescriptor.cpp b/projects/mtg/src/CardDescriptor.cpp index bfc0a7761..ef6acf83b 100644 --- a/projects/mtg/src/CardDescriptor.cpp +++ b/projects/mtg/src/CardDescriptor.cpp @@ -411,9 +411,9 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card) match = NULL; } - if(CDopponentDamaged == -1 || CDopponentDamaged == 1) + if(CDopponentDamaged == -1 || CDopponentDamaged == 1 || CDcontrollerDamaged == -1 || CDcontrollerDamaged == 1) { - Player * p = card->controller()->opponent();//controller()->opponent(); + Player * p = card->controller(); if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent()) diff --git a/projects/mtg/src/GuiStatic.cpp b/projects/mtg/src/GuiStatic.cpp index 718e990ae..adc880dfe 100644 --- a/projects/mtg/src/GuiStatic.cpp +++ b/projects/mtg/src/GuiStatic.cpp @@ -33,6 +33,7 @@ void GuiAvatar::Render() int life = player->life; int poisonCount = player->poisonCount; int energyCount = player->energyCount; + int experienceCount = player->experienceCount; WFont * mFont = WResourceManager::Instance()->GetWFont(Fonts::MAIN_FONT); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); TargetChooser * tc = NULL; @@ -166,6 +167,23 @@ void GuiAvatar::Render() break; } } + //experience + char experience[15]; + if (experienceCount > 0) + { + sprintf(experience, "%i", experienceCount); + switch (corner) + { + case TOP_LEFT: + mFont->SetColor(ARGB((int)actA / 1, 255, 0, 255)); + mFont->DrawString(experience, actX + 2, actY + 24); + break; + case BOTTOM_RIGHT: + mFont->SetColor(ARGB((int)actA / 1 ,255, 0, 255)); + mFont->DrawString(experience, actX - 10, actY - 27, JGETEXT_RIGHT); + break; + } + } PlayGuiObject::Render(); } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 2179c8adf..a0f1041e3 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1192,7 +1192,6 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell attackingTrigger,attackedAloneTrigger,notBlockedTrigger,attackBlockedTrigger,blockingTrigger); } - //energized player - controller of card if (TargetChooser * tc = parseSimpleTC(s, "energizedof", card)) return NEW TrplayerEnergized(observer, id, card, tc,once,true,false); @@ -1201,6 +1200,14 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell if (TargetChooser * tc = parseSimpleTC(s, "energizedfoeof", card)) return NEW TrplayerEnergized(observer, id, card, tc,once,false,true); + //experienced player - controller of card + if (TargetChooser * tc = parseSimpleTC(s, "experiencedof", card)) + return NEW TrplayerExperienced(observer, id, card, tc,once,true,false); + + //experienced player - opponent of card controller + if (TargetChooser * tc = parseSimpleTC(s, "experiencedfoeof", card)) + return NEW TrplayerExperienced(observer, id, card, tc,once,false,true); + //becomes monarch - controller of card if (TargetChooser * tc = parseSimpleTC(s, "becomesmonarchof", card)) return NEW TrplayerMonarch(observer, id, card, tc,once,true,false); @@ -2619,14 +2626,15 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return NEW APaired(observer,id, card,card->myPair,a); return NULL; } + //mana of the listed type doesnt get emptied from the pools. vectorcolorType = parseBetween(s,"poolsave(",")",false); if (colorType.size()) { - return NEW AManaPoolSaver(observer,id, card,colorType[1],s.find("opponentpool")!=string::npos); + return NEW AManaPoolSaver(observer, id, card, colorType[1], s.find("opponentpool")!=string::npos, s.find("terminate") != string::npos);// Added a way to terminate effect when source card leave battlefield. } - //opponent replace draw with + //opponent replace draw with found = s.find("opponentreplacedraw "); if (found != string::npos) { @@ -3690,6 +3698,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //alter experience + vector splitExperience = parseBetween(s, "alterexperience:", " ", false); + if (splitExperience.size()) + { + int exp = atoi(splitExperience[1].c_str()); + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AAAlterExperience(observer, id, card, t, exp, NULL, who); + a->oneShot = 1; + return a; + } + //alter dungeon completed vector splitDungeonCompleted = parseBetween(s, "completedungeon:", " ", false); if (splitDungeonCompleted.size()) diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 1d59fb5c3..ae9f0aa2c 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -35,6 +35,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * extraTurn = 0; drawCounter = 0; energyCount = 0; + experienceCount = 0; yidaroCount = 0; dungeonCompleted = 0; numOfCommandCast = 0; diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index 9b80210ed..5c362841b 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -602,6 +602,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) p->damageCount = initState.playerData[i].player->damageCount; p->preventable = initState.playerData[i].player->preventable; p->energyCount = initState.playerData[i].player->energyCount; + p->experienceCount = initState.playerData[i].player->experienceCount; p->yidaroCount = initState.playerData[i].player->yidaroCount; p->dungeonCompleted = initState.playerData[i].player->dungeonCompleted; p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 8e34f6bd0..28c3fabc6 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -287,6 +287,11 @@ WEventplayerEnergized::WEventplayerEnergized(Player * player, int nb_count) : { } +WEventplayerExperienced::WEventplayerExperienced(Player * player, int nb_count) : + player(player), nb_count(nb_count) +{ +} + WEventplayerMonarch::WEventplayerMonarch(Player * player) : player(player) { @@ -605,6 +610,12 @@ Targetable * WEventplayerEnergized::getTarget(Player * player) return NULL; } +Targetable * WEventplayerExperienced::getTarget(Player * player) +{ + if (player) return player; + return NULL; +} + Targetable * WEventplayerMonarch::getTarget(Player * player) { if (player) return player; diff --git a/projects/mtg/src/WParsedInt.cpp b/projects/mtg/src/WParsedInt.cpp index 5ca2c9529..5aa10a6ed 100644 --- a/projects/mtg/src/WParsedInt.cpp +++ b/projects/mtg/src/WParsedInt.cpp @@ -1289,6 +1289,10 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) { intValue = (card->controller()->isAI())?0:1; } + else if (s == "pexperience" || s == "oexperience") + { + intValue = (s == "pexperience")?card->controller()->experienceCount:card->controller()->opponent()->experienceCount; + } else if(!intValue)//found nothing, try parsing a atoi { intValue = atoi(s.c_str());