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".

This commit is contained in:
Vittorio Alfieri
2021-10-31 21:40:37 +01:00
parent 051f498e54
commit 3baa6acaaf
11 changed files with 262 additions and 57 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)
### 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))
### 27/10/21 ### 27/10/21
- *Committed:* Fixed "Mindbreak Trap", "Summary Dismissa" and "Obeka, Brute Chronologis" primitives. ([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))
### 23/10/21 ### 23/10/21
- *Committed:* Fixed a Bug in MusicExist method of GameStateDuel class when filename parameter was empty (this could lead to a wrong check on which soundtrack has to be played). https://github.com/WagicProject/wagic/commit/0824ea39843003d2ef1af1e4b7fdf11e35347fd7 ([Vitty85](https://github.com/Vitty85)) - *Committed:* Fixed a Bug in MusicExist method of GameStateDuel class when filename parameter was empty (this could lead to a wrong check on which soundtrack has to be played). https://github.com/WagicProject/wagic/commit/0824ea39843003d2ef1af1e4b7fdf11e35347fd7 ([Vitty85](https://github.com/Vitty85))
@@ -15,6 +15,9 @@
# Dies, Evergreen # Dies, Evergreen
#AUTO_DEFINE _DIES_ @movedTo(this|graveyard) from(battlefield): #AUTO_DEFINE _DIES_ @movedTo(this|graveyard) from(battlefield):
# Training
#AUTO_DEFINE _TRAINING_ @combat(attacking) source(this) restriction{trainer}:name(Training) dotrain
# Goad # Goad
#AUTO_DEFINE _GOAD_ transforms((,newability[counter(0/0.1.Goaded)],newability[this(counter{0/0.1.Goaded}>0) mustattack],newability[phaseaction[endofturn next once sourceinplay] removeallcounters(0/0.-1.Goaded)])) forever #AUTO_DEFINE _GOAD_ transforms((,newability[counter(0/0.1.Goaded)],newability[this(counter{0/0.1.Goaded}>0) mustattack],newability[phaseaction[endofturn next once sourceinplay] removeallcounters(0/0.-1.Goaded)])) forever
@@ -1506,7 +1506,7 @@ name=Amphin Mutineer
auto=if type(creature[-salamander]|opponentbattlefield)~morethan~0 then choice name(Exile opponent's creature) name(Exile opponent's creature) moveto(exile) target(creature[-salamander]|opponentbattlefield) && token(Salamander Warrior,Creature Salamander Warrior,4/3,blue) opponent auto=if type(creature[-salamander]|opponentbattlefield)~morethan~0 then choice name(Exile opponent's creature) name(Exile opponent's creature) moveto(exile) target(creature[-salamander]|opponentbattlefield) && token(Salamander Warrior,Creature Salamander Warrior,4/3,blue) opponent
auto=if type(creature[-salamander]|myBattlefield)~morethan~0 then choice name(Exile your creature) name(Exile your creature) moveto(exile) target(creature[-salamander]|mybattlefield) && token(Salamander Warrior,Creature Salamander Warrior,4/3,blue) auto=if type(creature[-salamander]|myBattlefield)~morethan~0 then choice name(Exile your creature) name(Exile your creature) moveto(exile) target(creature[-salamander]|mybattlefield) && token(Salamander Warrior,Creature Salamander Warrior,4/3,blue)
auto=choice name(Don't exile any creature) name(Don't exile any creature) donothing auto=choice name(Don't exile any creature) name(Don't exile any creature) donothing
autograveyard={4}{U}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={4}{U}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Amphin Mutineer enters the battlefield, exile up to one target non-Salamander creature. That creature's controller creates a 4/3 blue Salamander Warrior creature token. -- Encore {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Amphin Mutineer enters the battlefield, exile up to one target non-Salamander creature. That creature's controller creates a 4/3 blue Salamander Warrior creature token. -- Encore {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -8283,7 +8283,7 @@ toughness=3
[card] [card]
name=Briarblade Adept name=Briarblade Adept
auto=_ATTACKING_target(creature|opponentbattlefield) -1/-1 ueot auto=_ATTACKING_target(creature|opponentbattlefield) -1/-1 ueot
autograveyard={3}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={3}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Whenever Briarblade Adept attacks, target creature an opponent controls gets -1/-1 until end of turn. -- Encore {3}{B} ({3}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Whenever Briarblade Adept attacks, target creature an opponent controls gets -1/-1 until end of turn. -- Encore {3}{B} ({3}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={4}{B} mana={4}{B}
type=Creature type=Creature
@@ -12165,7 +12165,7 @@ toughness=5
name=Coastline Marauders name=Coastline Marauders
abilities=trample abilities=trample
auto=_ATTACKING_type:land:opponentbattlefield/0 ueot auto=_ATTACKING_type:land:opponentbattlefield/0 ueot
autograveyard={4}{R}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={4}{R}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Trample -- Whenever Coastline Marauders attacks, it gets +1/+0 until end of turn for each land defending player controls. -- Encore {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Trample -- Whenever Coastline Marauders attacks, it gets +1/+0 until end of turn for each land defending player controls. -- Encore {4}{R}{R} ({4}{R}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={2}{R} mana={2}{R}
type=Creature type=Creature
@@ -20560,7 +20560,7 @@ toughness=1
name=Elvish Dreadlord name=Elvish Dreadlord
abilities=deathtouch abilities=deathtouch
auto=@movedto(this|ownergraveyard) from(battlefield):all(creature[-elf]|battlefield) -3/-3 ueot auto=@movedto(this|ownergraveyard) from(battlefield):all(creature[-elf]|battlefield) -3/-3 ueot
autograveyard={5}{B}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={5}{B}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Deathtouch -- When Elvish Dreadlord dies, non-Elf creatures get -3/-3 until end of turn. -- Encore {5}{B}{B} ({5}{B}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Deathtouch -- When Elvish Dreadlord dies, non-Elf creatures get -3/-3 until end of turn. -- Encore {5}{B}{B} ({5}{B}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={3}{B}{B} mana={3}{B}{B}
type=Creature type=Creature
@@ -22268,7 +22268,7 @@ type=Sorcery
[card] [card]
name=Exquisite Huntmaster name=Exquisite Huntmaster
auto=_DIES_token(Elf Warrior,Creature Elf Warrior,1/1,green) auto=_DIES_token(Elf Warrior,Creature Elf Warrior,1/1,green)
autograveyard={4}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={4}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Exquisite Huntmaster dies, create a 1/1 green Elf Warrior creature token. -- Encore {4}{B} ({4}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Exquisite Huntmaster dies, create a 1/1 green Elf Warrior creature token. -- Encore {4}{B} ({4}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={3}{B} mana={3}{B}
type=Creature type=Creature
@@ -23055,7 +23055,7 @@ toughness=2
[card] [card]
name=Fathom Fleet Swordjack name=Fathom Fleet Swordjack
auto=_ATTACKING_target(planeswalker,player) damage:type:artifact:mybattlefield auto=_ATTACKING_target(planeswalker,player) damage:type:artifact:mybattlefield
autograveyard={5}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={5}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Whenever Fathom Fleet Swordjack attacks, it deals damage to the player or planeswalker it's attacking equal to the number of artifacts you control. -- Encore {5}{R} ({5}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Whenever Fathom Fleet Swordjack attacks, it deals damage to the player or planeswalker it's attacking equal to the number of artifacts you control. -- Encore {5}{R} ({5}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={3}{R} mana={3}{R}
type=Creature type=Creature
@@ -23840,7 +23840,7 @@ toughness=3
[card] [card]
name=Fin-Clade Fugitives name=Fin-Clade Fugitives
auto=cantbeblockedby(creature[power<=2]) auto=cantbeblockedby(creature[power<=2])
autograveyard={4}{G}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={4}{G}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Fin-Clade Fugitives can't be blocked by creatures with power 2 or less. -- Encore {4}{G} ({4}{G}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Fin-Clade Fugitives can't be blocked by creatures with power 2 or less. -- Encore {4}{G} ({4}{G}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={5}{G} mana={5}{G}
type=Creature type=Creature
@@ -34075,7 +34075,7 @@ type=Sorcery
[card] [card]
name=Impulsive Pilferer name=Impulsive Pilferer
auto=_DIES_token(Treasure Sur) auto=_DIES_token(Treasure Sur)
autograveyard={3}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={3}{R}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Impulsive Pilferer dies, create a Treasure token. (It's an artifact with " {T}, Sacrifice this artifact: Add one mana of any color.") -- Encore {3}{R} ({3}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Impulsive Pilferer dies, create a Treasure token. (It's an artifact with " {T}, Sacrifice this artifact: Add one mana of any color.") -- Encore {3}{R} ({3}{R}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={R} mana={R}
type=Creature type=Creature
@@ -36589,7 +36589,7 @@ toughness=5
name=Kangee's Lieutenant name=Kangee's Lieutenant
abilities=flying abilities=flying
auto=_ATTACKING_all(creature[attacking;flying]) 1/1 ueot auto=_ATTACKING_all(creature[attacking;flying]) 1/1 ueot
autograveyard={5}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={5}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Flying -- Whenever Kangee's Lieutenant attacks, attacking creatures with flying get +1/+1 until end of turn. -- Encore {5}{W} ({5}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Flying -- Whenever Kangee's Lieutenant attacks, attacking creatures with flying get +1/+1 until end of turn. -- Encore {5}{W} ({5}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={2}{W} mana={2}{W}
type=Creature type=Creature
@@ -37577,7 +37577,7 @@ toughness=2
[card] [card]
name=Kinsbaile Courier name=Kinsbaile Courier
auto=counter(1/1) target(creature) auto=counter(1/1) target(creature)
autograveyard={2}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={2}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Kinsbaile Courier enters the battlefield, put a +1/+1 counter on target creature. -- Encore {2}{W} ({2}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Kinsbaile Courier enters the battlefield, put a +1/+1 counter on target creature. -- Encore {2}{W} ({2}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={2}{W} mana={2}{W}
type=Creature type=Creature
@@ -37695,7 +37695,7 @@ toughness=2
name=Kitesail Skirmisher name=Kitesail Skirmisher
abilities=flying abilities=flying
auto=_ATTACKING_name(Other creature gains flying) target(other creature|myBattlefield) transforms((,newability[flying])) ueot auto=_ATTACKING_name(Other creature gains flying) target(other creature|myBattlefield) transforms((,newability[flying])) ueot
autograveyard={4}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={4}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Flying -- Whenever Kitesail Skirmisher attacks, another target creature attacking the same player or planeswalker gains flying until end of turn. -- Encore {4}{U} ({4}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Flying -- Whenever Kitesail Skirmisher attacks, another target creature attacking the same player or planeswalker gains flying until end of turn. -- Encore {4}{U} ({4}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -49932,7 +49932,7 @@ type=Artifact
[card] [card]
name=Phyrexian Triniform name=Phyrexian Triniform
auto=_DIES_token(Golem,Creature Artifact Golem,3/3)*3 auto=_DIES_token(Golem,Creature Artifact Golem,3/3)*3
autograveyard={12}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={12}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Phyrexian Triniform dies, create three 3/3 colorless Golem artifact creature tokens. -- Encore {12} ({12}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Phyrexian Triniform dies, create three 3/3 colorless Golem artifact creature tokens. -- Encore {12} ({12}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={9} mana={9}
type=Artifact Creature type=Artifact Creature
@@ -53148,7 +53148,7 @@ type=Instant
[card] [card]
name=Rakshasa Debaser name=Rakshasa Debaser
auto=_ATTACKING_moveTo(myBattlefield) target(creature|opponentgraveyard) auto=_ATTACKING_moveTo(myBattlefield) target(creature|opponentgraveyard)
autograveyard={6}{B}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={6}{B}{B}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Whenever Rakshasa Debaser attacks, put target creature card from defending player's graveyard onto the battlefield under your control. -- Encore {6}{B}{B} ({6}{B}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Whenever Rakshasa Debaser attacks, put target creature card from defending player's graveyard onto the battlefield under your control. -- Encore {6}{B}{B} ({6}{B}{B}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={4}{B}{B} mana={4}{B}{B}
type=Creature type=Creature
@@ -63856,7 +63856,7 @@ type=Sorcery
[card] [card]
name=Soul of Eternity name=Soul of Eternity
anyzone=lifetotal/lifetotal cdaactive anyzone=lifetotal/lifetotal cdaactive
autograveyard={7}{W}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={7}{W}{W}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=Soul of Eternity's power and toughness are each equal to your life total. -- Encore {7}{W}{W} ({7}{W}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=Soul of Eternity's power and toughness are each equal to your life total. -- Encore {7}{W}{W} ({7}{W}{W}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={5}{W}{W} mana={5}{W}{W}
type=Creature type=Creature
@@ -66739,9 +66739,8 @@ toughness=2
[/card] [/card]
[card] [card]
name=Strangling Grasp name=Strangling Grasp
target=creature,planeswalker|opponentbattlefield target=*[creature;planeswalker]|opponentbattlefield
backside=Vengeful Strangler backside=Vengeful Strangler
auto=@each my upkeep:ability$!name(Sacrifice a non-land permanent) name(Sacrifice a non-land permanent) target(*[-land]|mybattlefield) sacrifice and!( life:-1 controller )! !$ opponent
text=Enchant creature or planeswalker an opponent controls -- At the beginning of your upkeep, enchanted permanent's controller sacrifices a nonland permanent and loses 1 life. // Vengeful Strangler text=Enchant creature or planeswalker an opponent controls -- At the beginning of your upkeep, enchanted permanent's controller sacrifices a nonland permanent and loses 1 life. // Vengeful Strangler
type=Enchantment type=Enchantment
subtype=Aura subtype=Aura
@@ -72668,7 +72667,7 @@ toughness=4
[card] [card]
name=Trove Tracker name=Trove Tracker
auto=_DIES_draw:1 controller auto=_DIES_draw:1 controller
autograveyard={5}{U}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(unearth,haste,mustattack))! asSorcery autograveyard={5}{U}{U}:name(Activate Encore) name(Activate Encore) moveto(exile) and!(clone with(treason,haste,mustattack))! asSorcery
text=When Trove Tracker dies, draw a card. -- Encore {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) text=When Trove Tracker dies, draw a card. -- Encore {5}{U}{U} ({5}{U}{U}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.)
mana={2}{U} mana={2}{U}
type=Creature type=Creature
@@ -75070,7 +75069,7 @@ abilities=cantblock
backside=Strangling Grasp backside=Strangling Grasp
restriction=compare(isflipped)~equalto~0 restriction=compare(isflipped)~equalto~0
anyzone={0}:doubleside(backside) anyzone={0}:doubleside(backside)
auto=_DIES_name(Return transformed) name(Return transformed) activate castcard(copied noevent named!:Strangling Grasp:!) auto=_DIES_name(Return transformed) name(Return transformed) flip(backside) forcetype(Enchantment Aura) and!( transforms((,newability[name(Attach to creature or planeswalker) retargetfromplay target(*[creature;planeswalker]|opponentbattlefield)],newability[@each opponent upkeep:ability$!name(Sacrifice a non-land permanent) name(Sacrifice a non-land permanent) target(*[-land;-Strangling Grasp]|mybattlefield) sacrifice and!( life:-1 controller )! !$ controller])) forever )!
text=Vengeful Strangler can't block. -- When Vengeful Strangler dies, return it to the battlefield transformed under your control attached to target creature or planeswalker an opponent controls. // Strangling Grasp text=Vengeful Strangler can't block. -- When Vengeful Strangler dies, return it to the battlefield transformed under your control attached to target creature or planeswalker an opponent controls. // Strangling Grasp
mana={1}{B} mana={1}{B}
type=Creature type=Creature
@@ -75080,7 +75079,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Vengeful Warchief name=Vengeful Warchief
auto=@lifelostof(player) restriction{compare(thatmuch)~equalto~compare(lifelost)} turnlimited:1/1 auto=@lifelostof(player) restriction{compare(thatmuch)~equalto~compare(lifelost)} turnlimited:name(Put 1/1 counter) counter(1/1)
text=Whenever you lose life for the first time each turn, put a +1/+1 counter on Vengeful Warchief. (Damage causes loss of life.) text=Whenever you lose life for the first time each turn, put a +1/+1 counter on Vengeful Warchief. (Damage causes loss of life.)
mana={4}{B} mana={4}{B}
type=Creature type=Creature
+58 -14
View File
@@ -772,6 +772,33 @@ public:
} }
}; };
class TrCardTrained: public Trigger
{
public:
bool limitOnceATurn;
int triggeredTurn;
TrCardTrained(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false) :
Trigger(observer, id, source,once, tc),limitOnceATurn(limitOnceATurn)
{
}
int triggerOnEventImpl(WEvent * event)
{
WEventCardTrained * e = dynamic_cast<WEventCardTrained *> (event);
if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn)
return 0;
if (!tc->canTarget(e->card)) return 0;
triggeredTurn = game->turn;
return 1;
}
TrCardTrained * clone() const
{
return NEW TrCardTrained(*this);
}
};
class TrCardScryed: public Trigger class TrCardScryed: public Trigger
{ {
public: public:
@@ -1582,6 +1609,17 @@ public:
AAHaunt * clone() const; AAHaunt * clone() const;
~AAHaunt(); ~AAHaunt();
}; };
//AATrain
class AATrain: public ActivatedAbility
{
public:
MTGAbility * andAbility;
AATrain(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL);
int resolve();
const string getMenuText();
AATrain * clone() const;
~AATrain();
};
//AAConjure //AAConjure
class AAConjure: public ActivatedAbility class AAConjure: public ActivatedAbility
{ {
@@ -1750,18 +1788,21 @@ public:
int resolve() int resolve()
{ {
MTGCardInstance * _target = (MTGCardInstance *) target; MTGCardInstance * _target = (MTGCardInstance *) target;
if(!_target) if(!_target)
return 0; return 0;
MTGCardInstance * copy = _target->controller()->game->putInZone(_target,_target->currentZone, MTGCardInstance * newcard = _target;
source->controller()->game->temp); Spell * spell = NULL;
Spell * spell = NEW Spell(game, copy); if(_target->currentZone != _target->controller()->game->battlefield){ // If the card is already in play no need to recast a spell (e.g. "Olivia, Crimson Bride").
spell->resolve(); MTGCardInstance * copy = _target->controller()->game->putInZone(_target,_target->currentZone, source->controller()->game->temp);
MTGCardInstance * newcard = spell->source; spell = NEW Spell(game, copy);
spell->resolve();
newcard = spell->source;
}
newcard->summoningSickness = 0; newcard->summoningSickness = 0;
newcard->tap(); newcard->tap();
newcard->setAttacker(1); newcard->setAttacker(1);
delete spell; SAFE_DELETE(spell);
return 1; return 1;
} }
@@ -4359,11 +4400,12 @@ public:
class AANewTarget: public ActivatedAbility class AANewTarget: public ActivatedAbility
{ {
public: public:
bool retarget; bool retarget;
bool reequip; bool reequip;
bool newhook; bool newhook;
int mutation; int mutation;
AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, bool retarget = false, ManaCost * _cost = NULL, bool reequip = false, bool newhook = false, int mutation = 0); bool fromplay;
AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost = NULL, bool retarget = false, bool reequip = false, bool newhook = false, int mutation = 0, bool fromplay = false);
int resolve(); int resolve();
const string getMenuText(); const string getMenuText();
AANewTarget * clone() const; AANewTarget * clone() const;
@@ -4419,6 +4461,7 @@ public:
class AAFlip: public InstantAbility class AAFlip: public InstantAbility
{ {
public: public:
MTGAbility * andAbility;
vector<MTGAbility *> currentAbilities; vector<MTGAbility *> currentAbilities;
string flipStats; string flipStats;
bool isflipcard; bool isflipcard;
@@ -4430,6 +4473,7 @@ public:
int testDestroy(); int testDestroy();
const string getMenuText(); const string getMenuText();
AAFlip * clone() const; AAFlip * clone() const;
~AAFlip();
}; };
/* dynamic ability build*/ /* dynamic ability build*/
class AADynamic: public ActivatedAbility class AADynamic: public ActivatedAbility
+2 -1
View File
@@ -332,7 +332,8 @@ class Constants
HASAFTERMATH = 205, HASAFTERMATH = 205,
NOENTERTRG = 206, NOENTERTRG = 206,
NODIETRG = 207, NODIETRG = 207,
NB_BASIC_ABILITIES = 208, TRAINING = 208,
NB_BASIC_ABILITIES = 209,
RARITY_S = 'S', //Special Rarity RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics RARITY_M = 'M', //Mythics
+6
View File
@@ -395,6 +395,12 @@ struct WEventCardForetold : public WEventCardUpdate {
virtual Targetable * getTarget(int target); virtual Targetable * getTarget(int target);
}; };
//training event
struct WEventCardTrained : public WEventCardUpdate {
WEventCardTrained(MTGCardInstance * card);
virtual Targetable * getTarget(int target);
};
//scry event //scry event
struct WEventCardScryed : public WEventCardUpdate { struct WEventCardScryed : public WEventCardUpdate {
WEventCardScryed(MTGCardInstance * card); WEventCardScryed(MTGCardInstance * card);
+108 -14
View File
@@ -2262,7 +2262,6 @@ int AAImprint::resolve()
{ {
andAbilityClone->addToGame(); andAbilityClone->addToGame();
} }
SAFE_DELETE(andAbility); //moved here because in destructor it can cause a crash.
} }
return 1; return 1;
} }
@@ -2276,11 +2275,15 @@ const string AAImprint::getMenuText()
AAImprint * AAImprint::clone() const AAImprint * AAImprint::clone() const
{ {
return NEW AAImprint(*this); AAImprint * a = NEW AAImprint(*this);
if(andAbility)
a->andAbility = andAbility->clone();
return a;
} }
AAImprint::~AAImprint() AAImprint::~AAImprint()
{ {
SAFE_DELETE(andAbility);
} }
//AAHaunt //AAHaunt
@@ -2317,7 +2320,6 @@ int AAHaunt::resolve()
{ {
andAbilityClone->addToGame(); andAbilityClone->addToGame();
} }
SAFE_DELETE(andAbility); //moved here because in destructor it can cause a crash.
} }
return 1; return 1;
} }
@@ -2331,11 +2333,76 @@ const string AAHaunt::getMenuText()
AAHaunt * AAHaunt::clone() const AAHaunt * AAHaunt::clone() const
{ {
return NEW AAHaunt(*this); AAHaunt * a = NEW AAHaunt(*this);
if(andAbility)
a->andAbility = andAbility->clone();
return a;
} }
AAHaunt::~AAHaunt() AAHaunt::~AAHaunt()
{ {
SAFE_DELETE(andAbility);
}
//AATrain
AATrain::AATrain(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, ManaCost * _cost) :
ActivatedAbility(observer, _id, _source, _cost, 0)
{
target = _target;
andAbility = NULL;
}
int AATrain::resolve()
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if (_target && _target->hasType(Subtypes::TYPE_CREATURE) && _target->isAttacker())
{
if(_target->mutation && _target->parentCards.size() > 0) return 0; // Mutated down cards cannot be trained, they will follow the fate of top-card
while(_target->next)
_target = _target->next;
if(_target->counters)
_target->counters->addCounter(1,1);
WEvent * e = NEW WEventCardTrained(_target);
game->receiveEvent(e);
if(andAbility)
{
MTGAbility * andAbilityClone = andAbility->clone();
andAbilityClone->target = _target;
if(andAbility->oneShot)
{
andAbilityClone->resolve();
SAFE_DELETE(andAbilityClone);
}
else
{
andAbilityClone->addToGame();
}
}
return 1;
}
return 0;
}
const string AATrain::getMenuText()
{
return "Training";
}
AATrain * AATrain::clone() const
{
AATrain * a = NEW AATrain(*this);
if(andAbility)
a->andAbility = andAbility->clone();
return a;
}
AATrain::~AATrain()
{
SAFE_DELETE(andAbility);
} }
//AAConjure //AAConjure
@@ -2401,7 +2468,10 @@ const string AAConjure::getMenuText()
AAConjure * AAConjure::clone() const AAConjure * AAConjure::clone() const
{ {
return NEW AAConjure(*this); AAConjure * a = NEW AAConjure(*this);
if(andAbility)
a->andAbility = andAbility->clone();
return a;
} }
AAConjure::~AAConjure() AAConjure::~AAConjure()
@@ -4271,8 +4341,8 @@ AAFrozen * AAFrozen::clone() const
} }
// chose a new target for an aura or enchantment and equip it note: VERY basic right now. // chose a new target for an aura or enchantment and equip it note: VERY basic right now.
AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget, ManaCost * _cost, bool reequip, bool newhook, int mutation) : AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost, bool retarget, bool reequip, bool newhook, int mutation, bool fromplay) :
ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget),reequip(reequip),newhook(newhook),mutation(mutation) ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget),reequip(reequip),newhook(newhook),mutation(mutation),fromplay(fromplay)
{ {
target = _target; target = _target;
} }
@@ -4288,17 +4358,18 @@ int AANewTarget::resolve()
if (_target && !reequip && !mutation) if (_target && !reequip && !mutation)
{ {
while (_target->next) while (_target->next)
_target = _target->next; _target = _target->next;
_target->controller()->game->putInZone(_target, _target->currentZone, if(!fromplay){
_target->owner->game->exile); _target->controller()->game->putInZone(_target, _target->currentZone, _target->owner->game->exile);
_target = _target->next; _target = _target->next;
}
MTGCardInstance * refreshed = source->controller()->game->putInZone(_target,_target->currentZone,source->controller()->game->battlefield); MTGCardInstance * refreshed = source->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->battlefield);
Spell * reUp = NEW Spell(game, refreshed); Spell * reUp = NEW Spell(game, refreshed);
if(reUp->source->hasSubtype(Subtypes::TYPE_AURA)) if(reUp->source->hasSubtype(Subtypes::TYPE_AURA))
{ {
reUp->source->target = source; reUp->source->target = source;
reUp->resolve(); reUp->resolve();
if(reUp->source->spellTargetType == "") reUp->source->spellTargetType = "creature"; // Fix to prevent flipped auras go to graveyard.
} }
if(_target->hasSubtype(Subtypes::TYPE_EQUIPMENT)) if(_target->hasSubtype(Subtypes::TYPE_EQUIPMENT))
{ {
@@ -4706,6 +4777,7 @@ AAFlip::AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardIn
InstantAbility(observer, id, card, _target),flipStats(flipStats),isflipcard(isflipcard),forcedcopy(forcedcopy),forcetype(forcetype),backfromcopy(backfromcopy) InstantAbility(observer, id, card, _target),flipStats(flipStats),isflipcard(isflipcard),forcedcopy(forcedcopy),forcetype(forcetype),backfromcopy(backfromcopy)
{ {
target = _target; target = _target;
andAbility = NULL;
} }
int AAFlip::resolve() int AAFlip::resolve()
@@ -4773,6 +4845,7 @@ int AAFlip::resolve()
if(myFlip->getManaCost()) if(myFlip->getManaCost())
_target->getManaCost()->copy(myFlip->getManaCost()); _target->getManaCost()->copy(myFlip->getManaCost());
} }
_target->spellTargetType = myFlip->spellTargetType; // Fix to prevent flipped auras go to graveyard.
_target->colors = myFlip->colors; _target->colors = myFlip->colors;
_target->types = myFlip->types; _target->types = myFlip->types;
_target->text = myFlip->text; _target->text = myFlip->text;
@@ -4931,7 +5004,20 @@ int AAFlip::resolve()
} }
} }
} }
if(andAbility)
{
MTGAbility * andAbilityClone = andAbility->clone();
andAbilityClone->target = _target;
if(andAbility->oneShot)
{
andAbilityClone->resolve();
SAFE_DELETE(andAbilityClone);
}
else
{
andAbilityClone->addToGame();
}
}
currentAbilities.clear(); currentAbilities.clear();
testDestroy(); testDestroy();
} }
@@ -4966,9 +5052,17 @@ const string AAFlip::getMenuText()
AAFlip * AAFlip::clone() const AAFlip * AAFlip::clone() const
{ {
AAFlip * a = NEW AAFlip(*this); AAFlip * a = NEW AAFlip(*this);
if(andAbility)
a->andAbility = andAbility->clone();
a->forceDestroy = 1; a->forceDestroy = 1;
return a; return a;
} }
AAFlip::~AAFlip()
{
SAFE_DELETE(andAbility);
}
// AADYNAMIC: dynamic ability builder // AADYNAMIC: dynamic ability builder
AADynamic::AADynamic(GameObserver* observer, int id, MTGCardInstance * card, Damageable * _target,int type,int effect,int who,int amountsource,MTGAbility * storedAbility, ManaCost * _cost) : AADynamic::AADynamic(GameObserver* observer, int id, MTGCardInstance * card, Damageable * _target,int type,int effect,int who,int amountsource,MTGAbility * storedAbility, ManaCost * _cost) :
ActivatedAbility(observer, id, card, _cost, 0),type(type),effect(effect),who(who),amountsource(amountsource),storedAbility(storedAbility) ActivatedAbility(observer, id, card, _cost, 0),type(type),effect(effect),who(who),amountsource(amountsource),storedAbility(storedAbility)
+48 -5
View File
@@ -847,6 +847,20 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if(!found) if(!found)
return 0; return 0;
} }
check = restriction[i].find("trainer"); //Player controls an attacking creature with greater power than the current one.
if(check != string::npos)
{
if(player != observer->currentPlayer || !card->isAttacker())
return 0;
bool found = false;
for(unsigned int i = 0; i < observer->currentPlayer->game->inPlay->cards.size() && !found; i++){
if(observer->currentPlayer->game->inPlay->cards[i]->hasType(Subtypes::TYPE_CREATURE) && observer->currentPlayer->game->inPlay->cards[i]->isAttacker() && observer->currentPlayer->game->inPlay->cards[i]->power > card->power){
found = true;
}
}
if(!found)
return 0;
}
check = restriction[i].find("can play"); check = restriction[i].find("can play");
if(check != string::npos) if(check != string::npos)
{ {
@@ -1274,6 +1288,10 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
if (TargetChooser * tc = parseSimpleTC(s, "foretold", card)) if (TargetChooser * tc = parseSimpleTC(s, "foretold", card))
return NEW TrCardForetold(observer, id, card, tc, once, limitOnceATurn); return NEW TrCardForetold(observer, id, card, tc, once, limitOnceATurn);
//Train has been performed from a card
if (TargetChooser * tc = parseSimpleTC(s, "trained", card))
return NEW TrCardTrained(observer, id, card, tc, once, limitOnceATurn);
//Scry has been performed from a card //Scry has been performed from a card
if (TargetChooser * tc = parseSimpleTC(s, "scryed", card)) if (TargetChooser * tc = parseSimpleTC(s, "scryed", card))
return NEW TrCardScryed(observer, id, card, tc, once, limitOnceATurn); return NEW TrCardScryed(observer, id, card, tc, once, limitOnceATurn);
@@ -3422,6 +3440,22 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
} }
} }
//train a creature
found = s.find("dotrain");
if (found != string::npos)
{
MTGAbility * a = NEW AATrain(observer, id, card, target);
a->oneShot = 1;
//andability
if(storedAndAbility.size())
{
string stored = storedAndAbility;
storedAndAbility.clear();
((AATrain*)a)->andAbility = parseMagicLine(stored, id, spell, card);
}
return a;
}
//Conjure a card //Conjure a card
found = s.find("conjure"); found = s.find("conjure");
if (found != string::npos) if (found != string::npos)
@@ -4638,6 +4672,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
bool backfromcopy = (s.find("undocpy") != string::npos)?true:false; // Added to undo the copy effect at end of turn (es. Scion of the Ur-Dragon). bool backfromcopy = (s.find("undocpy") != string::npos)?true:false; // Added to undo the copy effect at end of turn (es. Scion of the Ur-Dragon).
bool transmode = card->getdoubleFaced() == "kamiflip"?true:false; bool transmode = card->getdoubleFaced() == "kamiflip"?true:false;
MTGAbility * a = NEW AAFlip(observer, id, card, target, flipStats, transmode, false, forcetype, backfromcopy); MTGAbility * a = NEW AAFlip(observer, id, card, target, flipStats, transmode, false, forcetype, backfromcopy);
//andability
if(storedAndAbility.size())
{
string stored = storedAndAbility;
storedAndAbility.clear();
((AAFlip*)a)->andAbility = parseMagicLine(stored, id, spell, card);
}
return a; return a;
} }
@@ -4859,10 +4900,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//get a new target - retarget and newtarget makes the card refreshed - from exile to play... //get a new target - retarget and newtarget makes the card refreshed - from exile to play (or from play to play)...
if ((s.find("retarget") != string::npos) || s.find("newtarget") != string::npos) if ((s.find("retarget") != string::npos) || s.find("newtarget") != string::npos)
{ {
MTGAbility * a = NEW AANewTarget(observer, id, card,target, (s.find("retarget") != string::npos)); MTGAbility * a = NEW AANewTarget(observer, id, card, target, NULL, (s.find("retarget") != string::npos), false, false, 0, (s.find("fromplay") != string::npos));
a->oneShot = 1; a->oneShot = 1;
return a; return a;
} }
@@ -4870,15 +4911,15 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
//get a new target for puresteel paladin...etc for equipments inplay only.. newhook & rehook supports stone hewer basic... the card is reequipped //get a new target for puresteel paladin...etc for equipments inplay only.. newhook & rehook supports stone hewer basic... the card is reequipped
if ((s.find("rehook") != string::npos) || s.find("newhook") != string::npos) if ((s.find("rehook") != string::npos) || s.find("newhook") != string::npos)
{ {
MTGAbility * a = NEW AANewTarget(observer, id, card,target, false,NULL,true,(s.find("newhook") != string::npos)); MTGAbility * a = NEW AANewTarget(observer, id, card,target, NULL, false, true, (s.find("newhook") != string::npos));
a->oneShot = 1; a->oneShot = 1;
return a; return a;
} }
//get a new target for muatations //get a new target for mutations
if ((s.find("mutateover") != string::npos) || s.find("mutateunder") != string::npos) if ((s.find("mutateover") != string::npos) || s.find("mutateunder") != string::npos)
{ {
MTGAbility * a = NEW AANewTarget(observer, id, card,target, false,NULL,false,false,(s.find("mutateover") != string::npos)?1:2); MTGAbility * a = NEW AANewTarget(observer, id, card, target, NULL, false, false, false, (s.find("mutateover") != string::npos)?1:2);
a->oneShot = 1; a->oneShot = 1;
return a; return a;
} }
@@ -5359,6 +5400,8 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
return BAKA_EFFECT_GOOD; return BAKA_EFFECT_GOOD;
if (dynamic_cast<AAHaunt *> (a)) if (dynamic_cast<AAHaunt *> (a))
return BAKA_EFFECT_GOOD; return BAKA_EFFECT_GOOD;
if (dynamic_cast<AATrain *> (a))
return BAKA_EFFECT_GOOD;
if (dynamic_cast<ABestow *> (a)) if (dynamic_cast<ABestow *> (a))
return BAKA_EFFECT_GOOD; return BAKA_EFFECT_GOOD;
if (dynamic_cast<AExert *> (a)) if (dynamic_cast<AExert *> (a))
+2 -1
View File
@@ -238,7 +238,8 @@ const char* Constants::MTGBasicAbilities[] = {
"isconspiracy", //The card is a conspiracy (e.g. "Double Stroke") "isconspiracy", //The card is a conspiracy (e.g. "Double Stroke")
"hasaftermath", //Flashback cost is an aftemath cost (e.g. "Claim // Fame") "hasaftermath", //Flashback cost is an aftemath cost (e.g. "Claim // Fame")
"noentertrg", //Creatures entering the battlefield don't cause abilities to trigger (e.g. "Hushbringer"). "noentertrg", //Creatures entering the battlefield don't cause abilities to trigger (e.g. "Hushbringer").
"nodietrg" //Creatures dying don't cause abilities to trigger (e.g. "Hushbringer"). "nodietrg", //Creatures dying don't cause abilities to trigger (e.g. "Hushbringer").
"training" //Has training ability (e.g. "Gryff Rider")
}; };
map<string,int> Constants::MTGBasicAbilitiesMap; map<string,int> Constants::MTGBasicAbilitiesMap;
+11
View File
@@ -317,6 +317,11 @@ WEventCardForetold::WEventCardForetold(MTGCardInstance * card) :
{ {
} }
WEventCardTrained::WEventCardTrained(MTGCardInstance * card) :
WEventCardUpdate(card)
{
}
WEventCardScryed::WEventCardScryed(MTGCardInstance * card) : WEventCardScryed::WEventCardScryed(MTGCardInstance * card) :
WEventCardUpdate(card) WEventCardUpdate(card)
{ {
@@ -573,6 +578,12 @@ Targetable * WEventCardForetold::getTarget(int target)
return NULL; return NULL;
} }
Targetable * WEventCardTrained::getTarget(int target)
{
if (target) return card;
return NULL;
}
Targetable * WEventCardScryed::getTarget(int target) Targetable * WEventCardScryed::getTarget(int target)
{ {
if (target) return card; if (target) return card;
+2 -2
View File
@@ -475,9 +475,9 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
{ {
intValue = (s == "pdevotionoffset")?card->controller()->devotionOffset:card->controller()->opponent()->devotionOffset; intValue = (s == "pdevotionoffset")?card->controller()->devotionOffset:card->controller()->opponent()->devotionOffset;
} }
else if (s == "praidcount" || s == "oraidcount") else if (s == "pattackedcount" || s == "oattackedcount")
{ {
intValue = (s == "praidcount")?card->controller()->raidcount:card->controller()->opponent()->raidcount; intValue = (s == "pattackedcount")?card->controller()->raidcount:card->controller()->opponent()->raidcount;
} }
else if (s == "pstormcount" || s == "ostormcount") else if (s == "pstormcount" || s == "ostormcount")
{ {