Fixed primitives, added new ability "exploits" to sacrifice a creature, added new trigger "exploited" and improved all primitives with Exploit ability, improved "tokencreated" and "sacrificed" triggers to allow "turnlimited" option, improved "flip" ability in order to keep track of current zone before flip.

This commit is contained in:
Vittorio Alfieri
2021-11-03 22:17:18 +01:00
parent 3baa6acaaf
commit 79e560e2b2
8 changed files with 132 additions and 50 deletions
+4 -1
View File
@@ -2,8 +2,11 @@
## [master] (https://github.com/WagicProject/wagic/tree/master) ## [master] (https://github.com/WagicProject/wagic/tree/master)
### 03/11/21
- *Committed:* Fixed primitives, added new ability "exploits" to sacrifice a creature, added new trigger "exploited" and improved all primitives with Exploit ability, improved "tokencreated" and "sacrificed" triggers to allow "turnlimited" option, improved "flip" ability in order to keep track of current zone before flip. ([Vitty85](https://github.com/Vitty85))
### 31/10/21 ### 31/10/21
- *Committed:* Fixed primitives, added new macro "_TRAINING_" for new ability "Training", added new trigger "trained", added "trainer" restriction to check if player controls an attacking creature with greater power than the current one, improved "ninjutsu" ability when the targeted card is already in play (e.g. "Olivia, Crimson Bride"), improved "flip" ability in order to add the "andability" option and in ordeer to prevent flipped auras go to graveyard, improved "andability" option for "imprint", "haunt" and "conjure" ability, improved "retarget" and "newtarget" keywords with "fromplay" option (to use with flipped auras e.g. "Vengeful Strangler"), replaced old "praidcount" and "oraidcount" with new keywords "pattackedcount" and "oattackedcount". ([Vitty85](https://github.com/Vitty85)) - *Committed:* Fixed primitives, added new macro "_TRAINING_" for new ability "Training", added new trigger "trained", added "trainer" restriction to check if player controls an attacking creature with greater power than the current one, improved "ninjutsu" ability when the targeted card is already in play (e.g. "Olivia, Crimson Bride"), improved "flip" ability in order to add the "andability" option and in ordeer to prevent flipped auras go to graveyard, improved "andability" option for "imprint", "haunt" and "conjure" ability, improved "retarget" and "newtarget" keywords with "fromplay" option (to use with flipped auras e.g. "Vengeful Strangler"), replaced old "praidcount" and "oraidcount" with new keywords "pattackedcount" and "oattackedcount". https://github.com/WagicProject/wagic/commit/3baa6acaaf8a994b0fea3c142d14d99d20246da5 ([Vitty85](https://github.com/Vitty85))
### 27/10/21 ### 27/10/21
- *Committed:* Fixed "Mindbreak Trap", "Summary Dismissa" and "Obeka, Brute Chronologis" primitives. https://github.com/WagicProject/wagic/commit/051f498e54b186bf71c44d7b6595754fbf0d6ab1 ([Vitty85](https://github.com/Vitty85)) - *Committed:* Fixed "Mindbreak Trap", "Summary Dismissa" and "Obeka, Brute Chronologis" primitives. https://github.com/WagicProject/wagic/commit/051f498e54b186bf71c44d7b6595754fbf0d6ab1 ([Vitty85](https://github.com/Vitty85))
@@ -110,8 +110,8 @@ toughness=*
[/card] [/card]
[card] [card]
name=Abrade name=Abrade
auto=choice damage:3 target(creature) auto=if type(creature|battlefield)~morethan~0 then choice name(Deals 3 damage) name(Deals 3 damage) damage:3 target(creature)
auto=choice destroy target(artifact) auto=if type(artifact|battlefield)~morethan~0 then choice name(Destroy artifact) name(Destroy artifact) destroy target(artifact)
text=Choose one -- Abrade deals 3 damage to target creature. -- Destroy target artifact. text=Choose one -- Abrade deals 3 damage to target creature. -- Destroy target artifact.
mana={1}{R} mana={1}{R}
type=Instant type=Instant
@@ -13139,8 +13139,9 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Conspicuous Snoop name=Conspicuous Snoop
#MISSING: has all activated abilities
abilities=showfromtoplibrary abilities=showfromtoplibrary
auto=if type(goblin[zpos=1]|mylibrary)~morethan~0 then may activate castcard(normal) all(*[zpos=1]|mylibrary) auto=aslongas(goblin[zpos=1]|mylibrary) canplayfromlibrarytop >0
text=Play with the top card of your library revealed. -- You may cast Goblin spells from the top of your library. -- As long as the top card of your library is a Goblin card, Conspicuous Snoop has all activated abilities of that card. text=Play with the top card of your library revealed. -- You may cast Goblin spells from the top of your library. -- As long as the top card of your library is a Goblin card, Conspicuous Snoop has all activated abilities of that card.
mana={R}{R} mana={R}{R}
type=Creature type=Creature
@@ -30200,7 +30201,7 @@ toughness=6
[card] [card]
name=Gurmag Drowner name=Gurmag Drowner
aicode=activate transforms((,newability[target(*[zpos<=4]|mylibrary) moveto(myhand) and!( all(*[zpos<=4]|mylibrary) moveto(mygraveyard) )!])) ueot aicode=activate transforms((,newability[target(*[zpos<=4]|mylibrary) moveto(myhand) and!( all(*[zpos<=4]|mylibrary) moveto(mygraveyard) )!])) ueot
auto=may name(Exploit) sacrifice target(creature|mybattlefield) && name(look) reveal:4 optionone name(Get a card) target(*|reveal) moveto(myhand) optiononeend optiontwo name(put in graveyard) all(*|reveal) moveto(graveyard) optiontwoend revealend auto=may name(Exploit) exploits target(creature|mybattlefield) && name(look) reveal:4 optionone name(Get a card) target(*|reveal) moveto(myhand) optiononeend optiontwo name(put in graveyard) all(*|reveal) moveto(graveyard) optiontwoend revealend
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Gurmag Drowner exploits a creature, look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Gurmag Drowner exploits a creature, look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard.
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -40378,7 +40379,7 @@ toughness=1
[card] [card]
name=Loathsome Curator name=Loathsome Curator
abilities=menace abilities=menace
auto=may name(Exploit) target(creature|mybattlefield) transforms((,newability[sacrifice],newability[name(Destroy creature) target(creature[manacost<=3]|opponentbattlefield) destroy])) oneshot auto=may name(Exploit) target(creature|mybattlefield) exploits and!( transforms((,newability[name(Destroy creature) target(creature[manacost<=3]|opponentbattlefield) destroy])) oneshot )!
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- Menace -- When Loathsome Curator exploits a creature, destroy target creature you don't control with mana value 3 or less. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- Menace -- When Loathsome Curator exploits a creature, destroy target creature you don't control with mana value 3 or less.
mana={4}{B} mana={4}{B}
type=Creature type=Creature
@@ -51613,7 +51614,7 @@ color=black
[/card] [/card]
[card] [card]
name=Profaner of the Dead name=Profaner of the Dead
auto=may name(Exploit) target(creature|mybattlefield) sacrifice and!( transforms((,newability[name(Return creatures) all(creature[toughness<=tminus1minusend]|opponentbattlefield) moveto(ownerhand)])) oneshot )! auto=may name(Exploit) target(creature|mybattlefield) exploits and!( transforms((,newability[name(Return creatures) all(creature[toughness<=tminus1minusend]|opponentbattlefield) moveto(ownerhand)])) oneshot )!
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Profaner of the Dead exploits a creature, return to their owners' hands all creatures your opponents control with toughness less than the exploited creature's toughness. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Profaner of the Dead exploits a creature, return to their owners' hands all creatures your opponents control with toughness less than the exploited creature's toughness.
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -61541,7 +61542,7 @@ toughness=1
[card] [card]
name=Silumgar Scavenger name=Silumgar Scavenger
abilities=flying abilities=flying
auto=may name(Exploit) sacrifice target(creature|mybattlefield) && all(this) transforms((,newability[haste])) ueot auto=may name(Exploit) exploits target(creature|mybattlefield) && all(this) transforms((,newability[haste])) ueot
auto=@movedto(other creature|graveyard) from(mybattlefield):counter(1/1) auto=@movedto(other creature|graveyard) from(mybattlefield):counter(1/1)
text=Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- Whenever another creature you control dies, put a +1/+1 counter on Silumgar Scavenger. It gains haste until end of turn if it exploited that creature. text=Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- Whenever another creature you control dies, put a +1/+1 counter on Silumgar Scavenger. It gains haste until end of turn if it exploited that creature.
mana={4}{B} mana={4}{B}
+14 -32
View File
@@ -6709,9 +6709,10 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Asylum Visitor name=Asylum Visitor
abilities=madness
auto=@each myupkeep restriction{type(*|myhand)~lessthan~1}:draw:1 && life:-1 auto=@each myupkeep restriction{type(*|myhand)~lessthan~1}:draw:1 && life:-1
auto=@each opponent upkeep restriction{type(*|opponenthand)~lessthan~1}:draw:1 && life:-1 auto=@each opponent upkeep restriction{type(*|opponenthand)~lessthan~1}:draw:1 && life:-1
autohand=@discarded(this):may pay[[{1}{B}]] moveto(mystack) && exiledeath ueot autoexile=restriction{discarded} pay({1}{B}) name(pay 1B to cast) activate name(pay 1B to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard)
text=At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life. -- Madness {1}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) text=At the beginning of each player's upkeep, if that player has no cards in hand, you draw a card and you lose 1 life. -- Madness {1}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)
mana={1}{B} mana={1}{B}
type=Creature type=Creature
@@ -46235,7 +46236,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Giant Trap Door Spider name=Giant Trap Door Spider
auto={1}{R}{G}{T}:moveTo(exile) all(this) && moveTo(exile) target(creature[attacking;-flying|opponentBattlefield) auto={1}{R}{G}{T}:moveTo(exile) all(this) && moveTo(exile) target(creature[attacking;-flying]|opponentBattlefield)
text={1}{R}{G}, {T}: Exile Giant Trap Door Spider and target creature without flying that's attacking you. text={1}{R}{G}, {T}: Exile Giant Trap Door Spider and target creature without flying that's attacking you.
mana={1}{R}{G} mana={1}{R}{G}
type=Creature type=Creature
@@ -56409,7 +56410,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Hunting Kavu name=Hunting Kavu
auto={1}{R}{G}{T}:moveTo(exile) all(this) && moveTo(exile) target(creature[attacking;-flying|opponentBattlefield) auto={1}{R}{G}{T}:moveTo(exile) all(this) && moveTo(exile) target(creature[attacking;-flying]|opponentBattlefield)
text={1}{R}{G}, {T}: Exile Hunting Kavu and target creature without flying that's attacking you. text={1}{R}{G}, {T}: Exile Hunting Kavu and target creature without flying that's attacking you.
mana={1}{R}{G} mana={1}{R}{G}
type=Creature type=Creature
@@ -74416,7 +74417,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Minister of Pain name=Minister of Pain
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && all(creature|opponentbattlefield) -1/-1 ueot auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && all(creature|opponentbattlefield) -1/-1 ueot
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Minister of Pain exploits a creature, creatures your opponents control get -1/-1 until end of turn. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Minister of Pain exploits a creature, creatures your opponents control get -1/-1 until end of turn.
mana={2}{B} mana={2}{B}
type=Creature type=Creature
@@ -90291,7 +90292,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Qarsi Sadist name=Qarsi Sadist
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(opponent) life:-2],newability[life:2 controller])) forever auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && transforms((,newability[target(opponent) life:-2],newability[life:2 controller])) forever
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Qarsi Sadist exploits a creature, target opponent loses 2 life and you gain 2 life. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Qarsi Sadist exploits a creature, target opponent loses 2 life and you gain 2 life.
mana={1}{B} mana={1}{B}
type=Creature type=Creature
@@ -91598,7 +91599,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Rakshasa Gravecaller name=Rakshasa Gravecaller
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && token(Zombie,Creature Zombie,2/2,black)*2 auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && token(Zombie,Creature Zombie,2/2,black)*2
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Rakshasa Gravecaller exploits a creature, put two 2/2 black Zombie creature tokens onto the battlefield. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Rakshasa Gravecaller exploits a creature, put two 2/2 black Zombie creature tokens onto the battlefield.
mana={4}{B} mana={4}{B}
type=Creature type=Creature
@@ -105019,7 +105020,7 @@ toughness=1
name=Sidisi, Undead Vizier name=Sidisi, Undead Vizier
abilities=deathtouch,hiddenface abilities=deathtouch,hiddenface
aicode=activate moveto(myhand) notatarget(*|mylibrary) aicode=activate moveto(myhand) notatarget(*|mylibrary)
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) and!( reveal:plibrarycount optionone name(choose card) target(*|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myhand))! afterrevealedend revealend )! auto=may name(Exploit) exploits notatarget(creature|mybattlefield) and!( reveal:plibrarycount optionone name(choose card) target(*|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myhand))! afterrevealedend revealend )!
text=Deathtouch -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi, Undead Vizier exploits a creature, you may search your library for a card, put it into your hand, then shuffle your library. text=Deathtouch -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi, Undead Vizier exploits a creature, you may search your library for a card, put it into your hand, then shuffle your library.
mana={3}{B}{B} mana={3}{B}{B}
type=Legendary Creature type=Legendary Creature
@@ -105029,7 +105030,7 @@ toughness=6
[/card] [/card]
[card] [card]
name=Sidisi's Faithful name=Sidisi's Faithful
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[moveto(myhand) target(creature|battlefield)])) forever auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && transforms((,newability[moveto(myhand) target(creature|battlefield)])) forever
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi's Faithful exploits a creature, return target creature to its owner's hand. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Sidisi's Faithful exploits a creature, return target creature to its owner's hand.
mana={U} mana={U}
type=Creature type=Creature
@@ -105637,7 +105638,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Silumgar Butcher name=Silumgar Butcher
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(creature|battlefield) -3/-3 ueot])) forever auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && transforms((,newability[target(creature|battlefield) -3/-3 ueot])) forever
text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Butcher exploits a creature, target creature gets -3/-3 until end of turn. text=Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Butcher exploits a creature, target creature gets -3/-3 until end of turn.
mana={4}{B} mana={4}{B}
type=Creature type=Creature
@@ -105657,7 +105658,7 @@ type=Artifact
[card] [card]
name=Silumgar Sorcerer name=Silumgar Sorcerer
abilities=flash,flying abilities=flash,flying
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && transforms((,newability[target(creature|stack) fizzle])) forever auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && transforms((,newability[target(creature|stack) fizzle])) forever
text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Sorcerer exploits a creature, counter target creature spell. text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Silumgar Sorcerer exploits a creature, counter target creature spell.
mana={1}{U}{U} mana={1}{U}{U}
type=Creature type=Creature
@@ -112830,27 +112831,8 @@ type=Instant
[/card] [/card]
[card] [card]
name=Starfield of Nyx name=Starfield of Nyx
auto=@each my upkeep:may target(enchantment|mygraveyard) castcard(putinplay) auto=@each my upkeep:may name(Return enchantment) target(enchantment|mygraveyard) moveto(mybattlefield)
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura]) transforms((Creature,setpower=manacost,settoughness=manacost)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=4]) transforms((,newability[becomes(Creature)],setpower=4,settoughness=4)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=5]) transforms((,newability[becomes(Creature)],setpower=5,settoughness=5)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=6]) transforms((,newability[becomes(Creature)],setpower=6,settoughness=6)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=7]) transforms((,newability[becomes(Creature)],setpower=7,settoughness=7)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=8]) transforms((,newability[becomes(Creature)],setpower=8,settoughness=8)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=9]) transforms((,newability[becomes(Creature)],setpower=9,settoughness=9)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=10]) transforms((,newability[becomes(Creature)],setpower=10,settoughness=10)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=11]) transforms((,newability[becomes(Creature)],setpower=11,settoughness=11)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=12]) transforms((,newability[becomes(Creature)],setpower=12,settoughness=12)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=13]) transforms((,newability[becomes(Creature)],setpower=13,settoughness=13)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=14]) transforms((,newability[becomes(Creature)],setpower=14,settoughness=14)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=15]) transforms((,newability[becomes(Creature)],setpower=15,settoughness=15)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=16]) transforms((,newability[becomes(Creature)],setpower=16,settoughness=16)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=17]) transforms((,newability[becomes(Creature)],setpower=17,settoughness=17)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=18]) transforms((,newability[becomes(Creature)],setpower=18,settoughness=18)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=19]) transforms((,newability[becomes(Creature)],setpower=19,settoughness=19)) >4
auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=20]) transforms((,newability[becomes(Creature)],setpower=20,settoughness=20)) >4
text=At the beginning of your upkeep, you may return target enchantment card from your graveyard to the battlefield. As long as you control five or more enchantments, each other non-Aura enchantment you control is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost. text=At the beginning of your upkeep, you may return target enchantment card from your graveyard to the battlefield. As long as you control five or more enchantments, each other non-Aura enchantment you control is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost.
mana={4}{W} mana={4}{W}
type=Enchantment type=Enchantment
@@ -130843,7 +130825,7 @@ toughness=5
[card] [card]
name=Vulturous Aven name=Vulturous Aven
abilities=flying abilities=flying
auto=may name(Exploit) sacrifice notatarget(creature|mybattlefield) && draw:2 controller && life:-2 controller auto=may name(Exploit) exploits notatarget(creature|mybattlefield) && draw:2 controller && life:-2 controller
text=Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Vulturous Aven exploits a creature, you draw two cards and you lose 2 life. text=Flying -- Exploit (When this creature enters the battlefield, you may sacrifice a creature.) -- When Vulturous Aven exploits a creature, you draw two cards and you lose 2 life.
mana={3}{B} mana={3}{B}
type=Creature type=Creature
+54 -2
View File
@@ -937,7 +937,9 @@ class TrTokenCreated: public Trigger
{ {
public: public:
bool thiscontroller, thisopponent; bool thiscontroller, thisopponent;
TrTokenCreated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false) : bool limitOnceATurn;
int triggeredTurn;
TrTokenCreated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false) :
Trigger(observer, id, source,once, tc) Trigger(observer, id, source,once, tc)
{ {
} }
@@ -946,7 +948,10 @@ public:
{ {
WEventTokenCreated * e = dynamic_cast<WEventTokenCreated *> (event); WEventTokenCreated * e = dynamic_cast<WEventTokenCreated *> (event);
if (!e) return 0; if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
if (!tc->canTarget(e->card)) return 0; if (!tc->canTarget(e->card)) return 0;
triggeredTurn = game->turn;
return 1; return 1;
} }
@@ -959,7 +964,9 @@ public:
class TrCardSacrificed: public Trigger class TrCardSacrificed: public Trigger
{ {
public: public:
TrCardSacrificed(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false) : bool limitOnceATurn;
int triggeredTurn;
TrCardSacrificed(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false) :
Trigger(observer, id, source, once, tc) Trigger(observer, id, source, once, tc)
{ {
} }
@@ -968,6 +975,8 @@ public:
{ {
WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event); WEventCardSacrifice * e = dynamic_cast<WEventCardSacrifice *> (event);
if (!e) return 0; if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
MTGCardInstance * check = e->cardAfter; MTGCardInstance * check = e->cardAfter;
MTGGameZone * oldZone = e->cardAfter->currentZone; MTGGameZone * oldZone = e->cardAfter->currentZone;
check->currentZone = check->previousZone; check->currentZone = check->previousZone;
@@ -983,6 +992,7 @@ public:
return 0; return 0;
} }
check->currentZone = oldZone; check->currentZone = oldZone;
triggeredTurn = game->turn;
return 1; return 1;
} }
@@ -992,6 +1002,47 @@ public:
} }
}; };
class TrCardExploited: public Trigger
{
public:
bool limitOnceATurn;
int triggeredTurn;
TrCardExploited(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false) :
Trigger(observer, id, source, once, tc)
{
}
int triggerOnEventImpl(WEvent * event)
{
WEventCardExploited * e = dynamic_cast<WEventCardExploited *> (event);
if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
MTGCardInstance * check = e->cardAfter;
MTGGameZone * oldZone = e->cardAfter->currentZone;
check->currentZone = check->previousZone;
if (check->next && (check->next->currentZone|| check->isToken))
{
check = e->cardAfter->next;
oldZone = e->cardAfter->next->currentZone;
check->currentZone = e->cardAfter->next->previousZone;
}
if (!tc->canTarget(check,true))
{
check->currentZone = oldZone;
return 0;
}
check->currentZone = oldZone;
triggeredTurn = game->turn;
return 1;
}
TrCardExploited * clone() const
{
return NEW TrCardExploited(*this);
}
};
class TrCardDiscarded: public Trigger class TrCardDiscarded: public Trigger
{ {
public: public:
@@ -1732,6 +1783,7 @@ class AASacrificeCard: public ActivatedAbility
{ {
public: public:
MTGAbility * andAbility; MTGAbility * andAbility;
bool isExploited;
AASacrificeCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target); AASacrificeCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target);
int resolve(); int resolve();
const string getMenuText(); const string getMenuText();
+7
View File
@@ -195,6 +195,13 @@ struct WEventCardSacrifice : public WEventCardUpdate {
virtual Targetable * getTarget(int target); virtual Targetable * getTarget(int target);
}; };
//event when card is exploited.
struct WEventCardExploited : public WEventCardUpdate {
MTGCardInstance * cardAfter;
WEventCardExploited(MTGCardInstance * card,MTGCardInstance * afterCard);
virtual Targetable * getTarget(int target);
};
//event when card is discarded. //event when card is discarded.
struct WEventCardDiscard : public WEventCardUpdate { struct WEventCardDiscard : public WEventCardUpdate {
WEventCardDiscard(MTGCardInstance * card); WEventCardDiscard(MTGCardInstance * card);
+16 -5
View File
@@ -4133,6 +4133,7 @@ AASacrificeCard::AASacrificeCard(GameObserver* observer, int _id, MTGCardInstanc
{ {
target = _target; target = _target;
andAbility = NULL; andAbility = NULL;
isExploited = false;
} }
int AASacrificeCard::resolve() int AASacrificeCard::resolve()
@@ -4140,14 +4141,18 @@ int AASacrificeCard::resolve()
MTGCardInstance * _target = (MTGCardInstance *) target; MTGCardInstance * _target = (MTGCardInstance *) target;
if (_target) if (_target)
{ {
if(_target->mutation && _target->parentCards.size() > 0) return 0; // Mutated down cards cannot be sacrificed, they will follow the fate of top-card if(_target->mutation && _target->parentCards.size() > 0) return 0; // Mutated down cards cannot be sacrificed or exploited, they will follow the fate of top-card
Player * p = _target->controller(); Player * p = _target->controller();
MTGCardInstance * beforeCard = _target; MTGCardInstance * beforeCard = _target;
p->game->putInGraveyard(_target); p->game->putInGraveyard(_target);
while(_target->next) while(_target->next)
_target = _target->next; _target = _target->next;
WEvent * e = NEW WEventCardSacrifice(beforeCard,_target); WEvent * e = NEW WEventCardSacrifice(beforeCard, _target);
game->receiveEvent(e); game->receiveEvent(e);
if(isExploited){
WEvent * e = NEW WEventCardExploited(beforeCard, _target);
game->receiveEvent(e);
}
if(andAbility) if(andAbility)
{ {
MTGAbility * andAbilityClone = andAbility->clone(); MTGAbility * andAbilityClone = andAbility->clone();
@@ -4169,7 +4174,10 @@ int AASacrificeCard::resolve()
const string AASacrificeCard::getMenuText() const string AASacrificeCard::getMenuText()
{ {
return "Sacrifice"; if(isExploited)
return "Exploit";
else
return "Sacrifice";
} }
AASacrificeCard * AASacrificeCard::clone() const AASacrificeCard * AASacrificeCard::clone() const
@@ -4802,10 +4810,12 @@ int AAFlip::resolve()
} }
while (_target->next) while (_target->next)
_target = _target->next; _target = _target->next;
MTGGameZone * currentZone = NULL;
if(forcetype != "" && _target) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising). if(forcetype != "" && _target) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising).
{ {
currentZone = _target->currentZone; // Added to keep track of current zone before flip.
for (int i = ((int)_target->types.size())-1; i >= 0; --i) for (int i = ((int)_target->types.size())-1; i >= 0; --i)
_target->removeType(_target->types[i]); _target->removeType(_target->types[i]);
list<int> typesToAdd; list<int> typesToAdd;
@@ -4994,9 +5004,10 @@ int AAFlip::resolve()
if(forcetype != "" && _target && _target->isPermanent()) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising). if(forcetype != "" && _target && _target->isPermanent()) // Added to flip Modal Double Faced cards (e.g. Zendikar Rising).
{ {
if(!currentZone) currentZone = _target->controller()->game->hand; // If NULL, we consider hand as the default currentZone.
_target->castMethod = Constants::CAST_NORMALLY; _target->castMethod = Constants::CAST_NORMALLY;
_target->controller()->game->battlefield->addCard(_target); _target->controller()->game->battlefield->addCard(_target);
WEvent * e = NEW WEventZoneChange(_target, _target->controller()->game->hand, _target->controller()->game->battlefield); WEvent * e = NEW WEventZoneChange(_target, currentZone, _target->controller()->game->battlefield);
game->receiveEvent(e); game->receiveEvent(e);
} else { } else {
WEvent * e = NEW WEventCardTransforms(_target); WEvent * e = NEW WEventCardTransforms(_target);
+15 -3
View File
@@ -1363,11 +1363,15 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
//Token has been created //Token has been created
if (TargetChooser * tc = parseSimpleTC(s, "tokencreated", card)) if (TargetChooser * tc = parseSimpleTC(s, "tokencreated", card))
return NEW TrTokenCreated(observer, id, card, tc, once); return NEW TrTokenCreated(observer, id, card, tc, once, limitOnceATurn);
//Card is sacrificed //Card is sacrificed
if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card)) if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card))
return NEW TrCardSacrificed(observer, id, card, tc, once); return NEW TrCardSacrificed(observer, id, card, tc, once, limitOnceATurn);
//Card is exploited
if (TargetChooser * tc = parseSimpleTC(s, "exploited", card))
return NEW TrCardExploited(observer, id, card, tc, once, limitOnceATurn);
//Card is Discarded //Card is Discarded
if (TargetChooser * tc = parseSimpleTC(s, "discarded", card)) if (TargetChooser * tc = parseSimpleTC(s, "discarded", card))
@@ -3626,10 +3630,11 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
if (s.find("sacrifice") != string::npos) if (s.find("sacrifice") != string::npos || s.find("exploits") != string::npos)
{ {
MTGAbility *a = NEW AASacrificeCard(observer, id, card, target); MTGAbility *a = NEW AASacrificeCard(observer, id, card, target);
a->oneShot = 1; a->oneShot = 1;
((AASacrificeCard*)a)->isExploited = (s.find("exploits") != string::npos)?true:false; // added to allow the Exploit trigger.
if(storedAndAbility.size()) if(storedAndAbility.size())
{ {
string stored = storedAndAbility; string stored = storedAndAbility;
@@ -7004,6 +7009,13 @@ int TriggeredAbility::receiveEvent(WEvent * e)
resolve(); resolve();
return 1; return 1;
} }
if(dynamic_cast<WEventCardExploited*>(e))
{
//exploited event must resolve instantly or by the time they do the cards that triggered them
//have already been put in graveyard.
resolve();
return 1;
}
if(dynamic_cast<WEventCardDiscard*>(e)) if(dynamic_cast<WEventCardDiscard*>(e))
{ {
//discard event must resolve instantly or by the time they do the cards that triggered them //discard event must resolve instantly or by the time they do the cards that triggered them
+14
View File
@@ -110,6 +110,11 @@ WEventCardSacrifice::WEventCardSacrifice(MTGCardInstance * card, MTGCardInstance
{ {
} }
WEventCardExploited::WEventCardExploited(MTGCardInstance * card, MTGCardInstance * after) :
WEventCardUpdate(card),cardAfter(after)
{
}
WEventCardDiscard::WEventCardDiscard(MTGCardInstance * card) : WEventCardDiscard::WEventCardDiscard(MTGCardInstance * card) :
WEventCardUpdate(card) WEventCardUpdate(card)
{ {
@@ -440,6 +445,15 @@ Targetable * WEventCardSacrifice::getTarget(int target)
return NULL; return NULL;
} }
Targetable * WEventCardExploited::getTarget(int target)
{
if (target)
{
return cardAfter;
}
return NULL;
}
Targetable * WEventCardDiscard::getTarget(int target) Targetable * WEventCardDiscard::getTarget(int target)
{ {
if (target) return card; if (target) return card;