Added/fixed primitives, refactored and improved almost all transforming human cards (included all the Werewolves), improved "flip ability and "doubleside" ability adding a new "backside" option, fixed a bug on "doubleside" ability for planeswalkers, added "backside=" key to CardPrimitive in order to specify the other side of double-faced cards, added "hasbackside" option to target chooser in order to find cards which have a back side, added "dualfaced" that return 1 if a card has a backside card, fixed loyalty counter ability on planeswalker flip (is was not resolving correctly), changed type of damageToController, damageToOpponent, damageToCreature, wasDealtDamage, combatdamageToOpponent from bool to int in order to retrieve those values if needed, added "totaldmg" keyword that returns the total amount of damage dealt by a creature in the current turn, added new restriction "coven in order to check if a player controls three or more creatures with different powers, added new ability "hasdisturb" when the Retrace cost of a card is a disturb cost (e.g. "Beloved Beggar").

This commit is contained in:
Vittorio Alfieri
2021-09-04 01:48:47 +02:00
parent 236f677f2a
commit cc16db7256
23 changed files with 768 additions and 492 deletions

View File

@@ -2,8 +2,11 @@
## [master] (https://github.com/WagicProject/wagic/tree/master) ## [master] (https://github.com/WagicProject/wagic/tree/master)
### 04/09/21
- *Committed:* Added/fixed primitives, refactored and improved almost all transforming human cards (included all the Werewolves), improved "flip ability and "doubleside" ability adding a new "backside" option, fixed a bug on "doubleside" ability for planeswalkers, added "backside=" key to CardPrimitive in order to specify the other side of double-faced cards, added "hasbackside" option to target chooser in order to find cards which have a back side, added "dualfaced" that return 1 if a card has a backside card, fixed loyalty counter ability on planeswalker flip (is was not resolving correctly), changed type of damageToController, damageToOpponent, damageToCreature, wasDealtDamage, combatdamageToOpponent from bool to int in order to retrieve those values if needed, added "totaldmg" keyword that returns the total amount of damage dealt by a creature in the current turn, added new restriction "coven in order to check if a player controls three or more creatures with different powers, added new ability "hasdisturb" when the Retrace cost of a card is a disturb cost (e.g. "Beloved Beggar"). ([Vitty85](https://github.com/Vitty85))
### 03/09/21 ### 03/09/21
- *Committed:* Fixed primitives, fixed some possible crashes on Commander Format. ([Vitty85](https://github.com/Vitty85)) - *Committed:* Fixed primitives, fixed some possible crashes on Commander Format. https://github.com/WagicProject/wagic/commit/236f677f2a08d538191de5c16970340dcd39c5f0 ([Vitty85](https://github.com/Vitty85))
### 02/09/21 ### 02/09/21
- *Committed:* Added/fixed primitives, updated the "missing_cards_by_sets" folder, fixed several crash on Commander Format, fixed a possible crash using "and!()!" with "imprint", added a new macros "_REBOUND_" and "_GOAD_" related to rebound and goad abilities and refactored all cards using them, implemented a new keywords "haunt", "hasprey", "preyname" and "isprey" related the haunting ability and improved all cards using it, Added "commander" and "\*" to HINT castpriority for AI decks in order to allow the user to give a cast priority to commanders. https://github.com/WagicProject/wagic/commit/001cea95bd501ca47b6510037af2725508f321d5 ([Vitty85](https://github.com/Vitty85)) - *Committed:* Added/fixed primitives, updated the "missing_cards_by_sets" folder, fixed several crash on Commander Format, fixed a possible crash using "and!()!" with "imprint", added a new macros "_REBOUND_" and "_GOAD_" related to rebound and goad abilities and refactored all cards using them, implemented a new keywords "haunt", "hasprey", "preyname" and "isprey" related the haunting ability and improved all cards using it, Added "commander" and "\*" to HINT castpriority for AI decks in order to allow the user to give a cast priority to commanders. https://github.com/WagicProject/wagic/commit/001cea95bd501ca47b6510037af2725508f321d5 ([Vitty85](https://github.com/Vitty85))

View File

@@ -33,12 +33,6 @@ power=0
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Waxing Moon
text=Transform up to one target Werewolf you control. Creatures you control gain trample until end of turn.
mana={1}{G}
type=Instant
[/card]
[card]
name=Mirrorwing Dragon name=Mirrorwing Dragon
abilities=flying abilities=flying
text=Flying -- Whenever a player casts an instant or sorcery spell that targets only Mirrorwing Dragon, that player copies that spell for each other creature he or she controls that the spell could target. Each copy targets a different one of those creatures. text=Flying -- Whenever a player casts an instant or sorcery spell that targets only Mirrorwing Dragon, that player copies that spell for each other creature he or she controls that the spell could target. Each copy targets a different one of those creatures.

View File

@@ -97,6 +97,15 @@ mana={2}
type=Artifact type=Artifact
[/card] [/card]
[card] [card]
name=Exiled Doomsayer
text=All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.)
mana={1}{W}
type=Creature
subtype=Human Cleric
power=1
toughness=2
[/card]
[card]
name=Grip of Chaos name=Grip of Chaos
text=Whenever a spell or ability is put onto the stack, if it has a single target, reselect its target at random. (Select from among all legal targets.) text=Whenever a spell or ability is put onto the stack, if it has a single target, reselect its target at random. (Select from among all legal targets.)
mana={4}{R}{R} mana={4}{R}{R}

View File

@@ -1,7 +1,7 @@
grade=borderline grade=borderline
#Bordeline Primitives Pack for Wagic the Homebrew. #Bordeline Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card #Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#I sorted this programatically - Vitty85 07-08-2021 #I sorted this programatically - Vitty85 04-09-2021
[card] [card]
name=+2 Mace name=+2 Mace
auto={3}:equip auto={3}:equip
@@ -5081,11 +5081,12 @@ subtype=Equipment
[/card] [/card]
[card] [card]
name=Bearer of Overwhelming Truths name=Bearer of Overwhelming Truths
backside=Daring Sleuth
abilities=prowess abilities=prowess
auto=@movedTo(*[-creature]|mystack):1/1 ueot auto=@movedTo(*[-creature]|mystack):1/1 ueot
auto=@combatdamagefoeof(player) from(this):name(Create clue) token(Clue) controller auto=@combatdamagefoeof(player) from(this):name(Create clue) token(Clue) controller
auto=@combatdamageof(player) from(this):name(Create clue) token(Clue) controller auto=@combatdamageof(player) from(this):name(Create clue) token(Clue) controller
text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Bearer of Overwhelming Truths deals combat damage to a player, investigate. (Create a colorless Clue artifact token with “{2}, Sacrifice this artifact: Draw a card.”) text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Whenever Bearer of Overwhelming Truths deals combat damage to a player, investigate. (Create a colorless Clue artifact token with “{2}, Sacrifice this artifact: Draw a card.”) // Daring Sleuth
type=Creature type=Creature
subtype=Human Wizard subtype=Human Wizard
power=3 power=3
@@ -10091,10 +10092,12 @@ type=Instant
[/card] [/card]
[card] [card]
name=Chandra, Fire of Kaladesh name=Chandra, Fire of Kaladesh
auto=@movedTo(*[red]|mystack):untap all(this) backside=Chandra, Roaring Flame
auto=@movedto(Moonmist|stack):name(Transform Human Shaman) moveto(ownerBattlefield) && flip(Chandra, Roaring Flame) restriction=compare(isflipped)~equalto~0
auto={T}:damage:1 target(player) limit^moveto(exile) and!(moveto(mybattlefield) and!(counter(0/0,4,Loyalty) && flip(Chandra, Roaring Flame) )! )!^3 anyzone={0}:doubleside(backside)
text=Whenever you cast a red spell, untap Chandra, Fire of Kaladesh. -- {T}: Chandra, Fire of Kaladesh deals 1 damage to target player. If Chandra has dealt 3 or more damage this turn, exile her, then return her to the battlefield transformed under her owner's control. auto=@movedTo(*[red]|mystack) restriction{compare(isflipped)~equalto~0}:untap
auto={T}:name(Deal 1 damage) target(player) damage:1 && if compare(totaldmg)~morethan~2 then all(this) moveto(exile) and!( moveto(ownerbattlefield) and!( flip(backside) )! )!
text=Whenever you cast a red spell, untap Chandra, Fire of Kaladesh. -- {T}: Chandra, Fire of Kaladesh deals 1 damage to target player. If Chandra has dealt 3 or more damage this turn, exile her, then return her to the battlefield transformed under her owner's control. // Chandra, Roaring Flame
mana={1}{R}{R} mana={1}{R}{R}
type=Legendary Creature type=Legendary Creature
subtype=Human Shaman subtype=Human Shaman
@@ -14291,9 +14294,11 @@ toughness=1
[/card] [/card]
[card] [card]
name=Daring Sleuth name=Daring Sleuth
auto=@movedto(Moonmist|stack):name(Transform Human Rogue) flip(Bearer of Overwhelming Truths) backside=Bearer of Overwhelming Truths
auto=@sacrificed(Clue|mybattlefield):flip(Bearer of Overwhelming Truths) restriction=compare(isflipped)~equalto~0
text=When you sacrifice a Clue, transform Daring Sleuth. anyzone={0}:doubleside(backside)
auto=@sacrificed(Clue|mybattlefield):flip(backside)
text=When you sacrifice a Clue, transform Daring Sleuth. // Bearer of Overwhelming Truths
mana={1}{U} mana={1}{U}
type=Creature type=Creature
subtype=Human Rogue subtype=Human Rogue
@@ -20634,16 +20639,6 @@ power=3
toughness=3 toughness=3
[/card] [/card]
[card] [card]
name=Exiled Doomsayer
#It's not possible to alter the morph cost ATM.
text=All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.)
mana={1}{W}
type=Creature
subtype=Human Cleric
power=1
toughness=2
[/card]
[card]
name=Exotic Orchard name=Exotic Orchard
auto=this(variable{olandg}>0) {t}:out{g} auto=this(variable{olandg}>0) {t}:out{g}
auto=this(variable{olandu}>0) {t}:out{u} auto=this(variable{olandu}>0) {t}:out{u}
@@ -30086,10 +30081,11 @@ type=Instant
[/card] [/card]
[card] [card]
name=Hinterland Hermit name=Hinterland Hermit
auto=if cantargetcard(*[fresh]|*) then if compare(isflipped)~equalto~0 then if type(Vildin-Pack Alpha|mybattlefield)~morethan~0 then may name(Transform Human Werewolf) name(Transform Human Werewolf) name(Transform Human Werewolf) flip(Hinterland Scourge) backside=Hinterland Scourge
auto=@movedto(Moonmist|stack):name(Transform Human Werewolf) flip(Hinterland Scourge) restriction=compare(isflipped)~equalto~0
auto=@each upkeep restriction{lastturn(*|stack)~lessthan~1}:name(Transform Human Werewolf) flip(Hinterland Scourge) anyzone={0}:doubleside(backside)
text=At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Hermit. auto=@each upkeep restriction{lastturn(*|stack)~lessthan~1}:name(Transform Human Werewolf) flip(backside)
text=At the beginning of each upkeep, if no spells were cast last turn, transform Hinterland Hermit. // Hinterland Scourge
mana={1}{R} mana={1}{R}
type=Creature type=Creature
subtype=Human Werewolf subtype=Human Werewolf
@@ -30101,7 +30097,7 @@ name=Hinterland Scourge
auto=@each upkeep restriction{lastturn(*|mystack)~morethan~1,lastturn(*|opponentstack)~lessthan~2}:name(Transform Werewolf) flip(Hinterland Hermit) auto=@each upkeep restriction{lastturn(*|mystack)~morethan~1,lastturn(*|opponentstack)~lessthan~2}:name(Transform Werewolf) flip(Hinterland Hermit)
auto=@each upkeep restriction{lastturn(*|opponentstack)~morethan~1}:name(Transform Werewolf) flip(Hinterland Hermit) auto=@each upkeep restriction{lastturn(*|opponentstack)~morethan~1}:name(Transform Werewolf) flip(Hinterland Hermit)
auto=_ATTACKING_all(creature|opponentbattlefield) transforms((,newability[mustblock])) ueot auto=_ATTACKING_all(creature|opponentbattlefield) transforms((,newability[mustblock])) ueot
text=Hinterland Scourge must be blocked if able. -- At the beginning of each upkeep, if a player cast two or more spells last turn, transform Hinterland Scourge. text=Hinterland Scourge must be blocked if able. -- At the beginning of each upkeep, if a player cast two or more spells last turn, transform Hinterland Scourge. // Hinterland Hermit
type=Creature type=Creature
subtype=Werewolf subtype=Werewolf
color=red color=red
@@ -33510,10 +33506,11 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Jace, Vryn's Prodigy name=Jace, Vryn's Prodigy
auto=@movedto(Moonmist|stack):name(Transform Human Wizard) flip(Jace, Telepath Unbound) backside=Jace, Telepath Unbound
auto={T}:draw:1 controller && ability$!name(Discard a card) reject notatarget(*|myhand)!$ controller restriction{type(*|mygraveyard)~lessthan~4} restriction=compare(isflipped)~equalto~0
auto={T}:draw:1 controller && ability$!name(Discard a card) reject notatarget(*|myhand)!$ controller && moveto(exile) and!( moveto(mybattlefield) and!( haste && counter(0/0,5,Loyalty) && flip(Jace^ Telepath Unbound) )! )! restriction{type(*|mygraveyard)~morethan~3} anyzone={0}:doubleside(backside)
text={T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battlefield transformed under his owner's control. auto={T}:name(Draw and discard) draw:1 controller && transforms((,newability[name(Discard a card) target(*|myhand) reject and!( if type(*|mygraveyard)~morethan~4 then all(this) moveto(exile) and!( moveto(ownerbattlefield) and!( flip(backside) )! )! )!])) forever
text={T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn's Prodigy, then return him to the battlefield transformed under his owner's control. // Jace, Telepath Unbound
mana={1}{U} mana={1}{U}
type=Legendary Creature type=Legendary Creature
subtype=Human Wizard subtype=Human Wizard
@@ -36348,10 +36345,12 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Kytheon, Hero of Akros name=Kytheon, Hero of Akros
auto=@movedto(Moonmist|stack):name(Transform Human Soldier) moveto(ownerBattlefield) && flip(Gideon, Battle-Forged) backside=Gideon, Battle-Forged
auto=_BATTALION_moveto(exile) and!( moveto(mybattlefield) and!(counter(0/0,3,Loyalty) && flip(Gideon, Battle-Forged) restriction=compare(isflipped)~equalto~0
auto={2}{W}:all(this) indestructible ueot anyzone={0}:doubleside(backside)
text=At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon, then return him to the battlefield transformed under his owner's control. -- {2}{W}: Kytheon gains indestructible until end of turn. auto=_BATTALION_moveto(exile) and!( moveto(ownerbattlefield) and!( flip(backside) )! )!
auto={2}{W}:name(Gains indestructible) transforms((,newability[indestructible])) ueot
text=At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon, then return him to the battlefield transformed under his owner's control. -- {2}{W}: Kytheon gains indestructible until end of turn. // Gideon, Battle-Forged
mana={W} mana={W}
type=Legendary Creature type=Legendary Creature
subtype=Human Soldier subtype=Human Soldier
@@ -37644,9 +37643,11 @@ type=Instant
[card] [card]
name=Liliana, Heretical Healer name=Liliana, Heretical Healer
abilities=lifelink abilities=lifelink
auto=@movedto(Moonmist|stack):name(Transform Human Cleric) flip(Liliana, Defiant Necromancer) backside=Liliana, Defiant Necromancer
auto=@movedTo(other creature[-token]|graveyard) from(myBattlefield):name(Liliana, Defiant Necromancer) moveto(exile) and!( moveto(mybattlefield) and!( transforms((,newability[counter(0/0.3.Loyalty)],newability[flip(Liliana^ Defiant Necromancer)],newability[name(Create Zombie) token(Zombie Lil)])) oneshot )! )! restriction=compare(isflipped)~equalto~0
text=Lifelink -- Whenever another nontoken creature you control dies, exile Liliana, Heretical Healer, then return her to the battlefield transformed under her owner's control. If you do, put a 2/2 black Zombie creature token onto the battlefield. anyzone={0}:doubleside(backside)
auto=@movedTo(other creature[-token]|graveyard) from(myBattlefield):name(Liliana, Defiant Necromancer) moveto(exile) and!( moveto(ownerbattlefield) and!( transforms((,newability[flip(backside)],newability[name(Create Zombie) token(Zombie Lil)])) oneshot )! )!
text=Lifelink -- Whenever another nontoken creature you control dies, exile Liliana, Heretical Healer, then return her to the battlefield transformed under her owner's control. If you do, put a 2/2 black Zombie creature token onto the battlefield. // Liliana, Defiant Necromancer
mana={1}{B}{B} mana={1}{B}{B}
type=Legendary Creature type=Legendary Creature
subtype=Human Cleric subtype=Human Cleric
@@ -38904,7 +38905,7 @@ toughness=4
[/card] [/card]
[card] [card]
name=Magda, Brazen Outlaw name=Magda, Brazen Outlaw
auto=lord(dwarf|mybattlefield) 1/0 auto=lord(other dwarf|mybattlefield) 1/0
auto=@tapped(dwarf|mybattlefield):token(Treasure Sur) auto=@tapped(dwarf|mybattlefield):token(Treasure Sur)
auto={S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}:name(Search dragon or artifact) target(*[dragon;artifact]|mylibrary) moveto(myBattlefield) and!( shuffle )! auto={S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}{S(*[treasure]|mybattlefield)}:name(Search dragon or artifact) target(*[dragon;artifact]|mylibrary) moveto(myBattlefield) and!( shuffle )!
text=Other Dwarves you control get +1/+0. -- Whenever a Dwarf you control becomes tapped, create a Treasure token. -- Sacrifice five Treasures: Search your library for an artifact or Dragon card, put that card onto the battlefield, then shuffle your library. text=Other Dwarves you control get +1/+0. -- Whenever a Dwarf you control becomes tapped, create a Treasure token. -- Sacrifice five Treasures: Search your library for an artifact or Dragon card, put that card onto the battlefield, then shuffle your library.
@@ -40751,12 +40752,12 @@ toughness=4
[/card] [/card]
[card] [card]
name=Mila, Crafty Companion name=Mila, Crafty Companion
backside=Lukka, Wayward Bonder
other={4}{R}{R} name(Lukka, Wayward Bonder) other={4}{R}{R} name(Lukka, Wayward Bonder)
otherrestriction=can play planeswalker,compare(isflipped)~equalto~1 otherrestriction=can play planeswalker,compare(isflipped)~equalto~1
restriction=compare(isflipped)~equalto~0 restriction=compare(isflipped)~equalto~0
anyzone={0}:doubleside(Lukka, Wayward Bonder) anyzone={0}:doubleside(backside)
autostack=if paid(alternative) then name(Lukka, Wayward Bonder) name(Lukka, Wayward Bonder) flip(Lukka, Wayward Bonder) forcetype(Legendary Planeswalker) autostack=if paid(alternative) then name(Lukka, Wayward Bonder) name(Lukka, Wayward Bonder) flip(backside) forcetype(Legendary Planeswalker)
auto=if paid(alternative) then counter(0/0,5,Loyalty)
auto=@each blockers restriction{compare(isflipped)~equalto~0,type(creature[attacking]|opponentbattlefield)~morethan~0}:may name(Opponent attacked planeswalker) all(*[planeswalker]|mybattlefield) counter(0/0,1,Loyalty) auto=@each blockers restriction{compare(isflipped)~equalto~0,type(creature[attacking]|opponentbattlefield)~morethan~0}:may name(Opponent attacked planeswalker) all(*[planeswalker]|mybattlefield) counter(0/0,1,Loyalty)
auto=@targeted(*|mybattlefield) from(*|opponentzones) restriction{compare(isflipped)~equalto~0}:may name(Draw a card) draw:1 controller auto=@targeted(*|mybattlefield) from(*|opponentzones) restriction{compare(isflipped)~equalto~0}:may name(Draw a card) draw:1 controller
text=Whenever an opponent attacks one or more planeswalkers you control, put a loyalty counter on each planeswalker you control. -- Whenever a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card. // {4}{R}{R} Lukka, Wayward Bonder text=Whenever an opponent attacks one or more planeswalkers you control, put a loyalty counter on each planeswalker you control. -- Whenever a permanent you control becomes the target of a spell or ability an opponent controls, you may draw a card. // {4}{R}{R} Lukka, Wayward Bonder
@@ -41677,6 +41678,7 @@ toughness=5
[/card] [/card]
[card] [card]
name=Moonmist name=Moonmist
auto=all(human[hasbackside]|battlefield) transforms((,newability[flip(backside)])) forever
auto=preventAllCombatDamage from(creature[-wolf;-werewolf]|battlefield) ueot auto=preventAllCombatDamage from(creature[-wolf;-werewolf]|battlefield) ueot
text=Transform all Humans. Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. (Only double-faced cards can be transformed.) text=Transform all Humans. Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. (Only double-faced cards can be transformed.)
mana={1}{G} mana={1}{G}
@@ -41685,8 +41687,8 @@ type=Instant
[card] [card]
name=Moraug, Fury of Akoum name=Moraug, Fury of Akoum
auto=@combat(attacking) source(creature|myBattlefield):all(trigger[to]) 1/0 ueot auto=@combat(attacking) source(creature|myBattlefield):all(trigger[to]) 1/0 ueot
auto=_LANDFALL_if compare(currentphase)~equalto~4 then nextphasealter(add,combatphaseswithmain,controller,after<this>) else if compare(currentphase)~equalto~10 then nextphasealter(add,combatphaseswithmain,controller,after<this>) else auto=_LANDFALL_if compare(currentphase)~equalto~4 then nextphasealter(add,combatphases,controller,after<this>) else if compare(currentphase)~equalto~10 then nextphasealter(add,combatphases,controller,after<this>) else
auto=_LANDFALL_all(creature|mybattlefield) transforms((,newability[@each my combatends turnlimited:phaseaction[combatbegins once sourceinplay] untap])) ueot auto=_LANDFALL_if compare(currentphase)~equalto~4 then all(creature|mybattlefield) transforms((,newability[phaseaction[combatbegins next once sourceinplay] untap])) ueot else if compare(currentphase)~equalto~10 then all(creature|mybattlefield) transforms((,newability[phaseaction[combatbegins once sourceinplay] untap])) ueot
text=Each creature you control gets +1/+0 for each time it has attacked this turn. -- Landfall — Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. text=Each creature you control gets +1/+0 for each time it has attacked this turn. -- Landfall — Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control.
mana={4}{R}{R} mana={4}{R}{R}
type=Legendary Creature type=Legendary Creature
@@ -43227,9 +43229,12 @@ toughness=2
[card] [card]
name=Nicol Bolas, the Ravager name=Nicol Bolas, the Ravager
abilities=flying abilities=flying
auto=ability$!name(discard) reject notatarget(*|myhand)!$ opponent backside=Nicol Bolas, the Arisen
auto={4}{U}{B}{R}:moveto(exile) and!(moveto(mybattlefield) and!(counter(0/0,7,Loyalty) && flip(Nicol Bolas, the Arisen))! )! asSorcery restriction=compare(isflipped)~equalto~0
text=Flying -- When Nicol Bolas, the Ravager enters the battlefield, each opponent discards a card. -- {4}{U}{B}{R}: Exile Nicol Bolas, the Ravager, then return him to the battlefield transformed under his owner's control. Activate this ability only any time you could cast a sorcery. anyzone={0}:doubleside(backside)
auto=ability$!name(Discard a card) name(Discard a card) reject notatarget(*|myhand)!$ opponent
auto={4}{U}{B}{R}:name(Exile and transform) moveto(exile) and!(moveto(ownerbattlefield) and!( flip(backside) )! )! asSorcery
text=Flying -- When Nicol Bolas, the Ravager enters the battlefield, each opponent discards a card. -- {4}{U}{B}{R}: Exile Nicol Bolas, the Ravager, then return him to the battlefield transformed under his owner's control. Activate this ability only any time you could cast a sorcery. // Nicol Bolas, the Arisen
mana={1}{U}{B}{R} mana={1}{U}{B}{R}
type=Legendary Creature type=Legendary Creature
subtype=Elder Dragon subtype=Elder Dragon
@@ -43667,10 +43672,12 @@ subtype=Aura
[/card] [/card]
[card] [card]
name=Nissa, Vastwood Seer name=Nissa, Vastwood Seer
aicode=activate target(forest[basic]|mylibrary) moveto(myhand) backside=Nissa, Sage Animist
auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>forest[basic]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend restriction=compare(isflipped)~equalto~0
auto=@movedto(land|mybattlefield) restriction{type(land|mybattlefield)~morethan~6}:all(this) moveto(exile) and!( moveto(mybattlefield) and!(counter(0/0,3,Loyalty) && flip(Nissa, Sage Animist) )! )! anyzone={0}:doubleside(backside)
text=When Nissa, Vastwood Seer enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle your library. -- Whenever a land enters the battlefield under your control, if you control seven or more lands, exile Nissa, then return her to the battlefield transformed under her owner's control. auto=may name(Search basic forest) target(forest[basic]|mylibrary) moveto(myhand) and!( shuffle )!
auto=@movedto(land|mybattlefield) restriction{type(land|mybattlefield)~morethan~6}:name(Exile and transforms) moveto(exile) and!( moveto(mybattlefield) and!( flip(backside) )! )!
text=When Nissa, Vastwood Seer enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle your library. -- Whenever a land enters the battlefield under your control, if you control seven or more lands, exile Nissa, then return her to the battlefield transformed under her owner's control. // Nissa, Sage Animist
mana={2}{G} mana={2}{G}
type=Legendary Creature type=Legendary Creature
subtype=Elf Scout subtype=Elf Scout
@@ -47950,9 +47957,10 @@ type=Instant
[/card] [/card]
[card] [card]
name=Price of Betrayal name=Price of Betrayal
target=artifact,creature,planeswalker auto=if type(artifact|battlefield)~morethan~0 then choice name(Remove 5 counters from an artifact) name(Remove 5 counters from an artifact) target(artifact) removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1)
auto=counter(1/1,-5) auto=if type(creature|battlefield)~morethan~0 then choice name(Remove 5 counters from a creature) name(Remove 5 counters from a creature) target(creature) removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1)
auto=counter(0/0,-5,loyalty) auto=if type(planeswalker|battlefield)~morethan~0 then choice name(Remove 5 counters from a planeswalker) name(Remove 5 counters from a planeswalker) target(planeswalker) removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1)
auto=choice name(Remove 5 counters from opponent) target(opponent) removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1) && removesinglecountertype(1)
text=Remove up to five counters from target artifact, creature, planeswalker, or opponent. text=Remove up to five counters from target artifact, creature, planeswalker, or opponent.
mana={B} mana={B}
type=Sorcery type=Sorcery
@@ -60226,8 +60234,8 @@ type=Artifact
[card] [card]
name=Spark Double name=Spark Double
auto=choice name(Don't copy anything) donothing auto=choice name(Don't copy anything) donothing
auto=choice name(Copy creature) target(creature|mybattlefield) copy and!( transforms((-legendary)) forever and!(counter(1/1))! )! auto=choice name(Copy creature) target(creature|mybattlefield) copy options(nolegend) and!( counter(1/1) )!
auto=choice name(Copy planeswalker) target(planeswalker|mybattlefield) copy and!( transforms((-legendary)) forever and!(counter(0/0,1,Loyalty))! )! auto=choice name(Copy planeswalker) target(planeswalker|mybattlefield) copy options(nolegend) and!( counter(0/0,1,Loyalty) )!
text=You may have Spark Double enter the battlefield as a copy of a creature or planeswalker you control, except it enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker, and it isn't legendary if that permanent is legendary. text=You may have Spark Double enter the battlefield as a copy of a creature or planeswalker you control, except it enters with an additional +1/+1 counter on it if it's a creature, it enters with an additional loyalty counter on it if it's a planeswalker, and it isn't legendary if that permanent is legendary.
mana={3}{U} mana={3}{U}
type=Creature type=Creature
@@ -69750,14 +69758,14 @@ toughness=1
[/card] [/card]
[card] [card]
name=Valki, God of Lies name=Valki, God of Lies
backside=Tibalt, Cosmic Impostor
other={5}{B}{R} name(Tibalt, Cosmic Impostor) other={5}{B}{R} name(Tibalt, Cosmic Impostor)
otherrestriction=can play planeswalker,compare(isflipped)~equalto~1 otherrestriction=can play planeswalker,compare(isflipped)~equalto~1
restriction=compare(isflipped)~equalto~0 restriction=compare(isflipped)~equalto~0
anyzone={0}:doubleside(Tibalt, Cosmic Impostor) anyzone={0}:doubleside(backside)
autostack=if paid(alternative) then flip(Tibalt, Cosmic Impostor) forcetype(Legendary Planeswalker) autostack=if paid(alternative) then flip(backside) forcetype(Legendary Planeswalker)
auto=ifnot paid(alternative) then if type(creature|opponenthand)~morethan~0 then name(Reveal hand and exile creature) name(Reveal hand and exile creature) name(Reveal hand and exile creature) target(creature|opponenthand) imprint auto=ifnot paid(alternative) then if type(creature|opponenthand)~morethan~0 then name(Reveal hand and exile creature) name(Reveal hand and exile creature) name(Reveal hand and exile creature) target(creature|opponenthand) imprint
auto=ifnot paid(alternative) then if type(creature|opponenthand)~equalto~0 then name(Reveal hand) name(Reveal hand) name(Reveal hand) target(*|opponenthand) moveto(opponenthand) auto=ifnot paid(alternative) then if type(creature|opponenthand)~equalto~0 then name(Reveal hand) name(Reveal hand) name(Reveal hand) target(*|opponenthand) moveto(opponenthand)
auto=if paid(alternative) then counter(0/0,5,Loyalty)
auto=this(variable{hasevict}>0) this(variable{iscopied}<1) transforms((,newability[@movedto(this|nonbattlezone) from(battlefield):name(Put back exiled creature) target(creature[evictname]|opponentexile) moveTo(opponenthand)])) auto=this(variable{hasevict}>0) this(variable{iscopied}<1) transforms((,newability[@movedto(this|nonbattlezone) from(battlefield):name(Put back exiled creature) target(creature[evictname]|opponentexile) moveTo(opponenthand)]))
auto=this(variable{hasevict}>0) this(variable{evictmc}=0) this(variable{iscopied}<1) {0}:name(Becomes copy of exiled creature) copy target(creature[evictname]|opponentexile) auto=this(variable{hasevict}>0) this(variable{evictmc}=0) this(variable{iscopied}<1) {0}:name(Becomes copy of exiled creature) copy target(creature[evictname]|opponentexile)
auto=this(variable{hasevict}>0) this(variable{evictmc}=1) this(variable{iscopied}<1) {1}:name(Becomes copy of exiled creature) copy target(creature[evictname]|opponentexile) auto=this(variable{hasevict}>0) this(variable{evictmc}=1) this(variable{iscopied}<1) {1}:name(Becomes copy of exiled creature) copy target(creature[evictname]|opponentexile)
@@ -72411,6 +72419,14 @@ mana={G}
type=Instant type=Instant
[/card] [/card]
[card] [card]
name=Waxing Moon
auto=may name(Transform a werewolf) target(werewolf[hasbackside]|mybattlefield) transforms((,newability[flip(backside)])) forever
auto=all(creature|mybattlefield) transforms((,newability[trample])) ueot
text=Transform up to one target Werewolf you control. Creatures you control gain trample until end of turn.
mana={1}{G}
type=Instant
[/card]
[card]
name=Wayward Guide-Beast name=Wayward Guide-Beast
abilities=trample,haste abilities=trample,haste
auto=@combatdamaged(player) from(this):moveTo(ownerHand) target(land|myBattlefield) auto=@combatdamaged(player) from(this):moveTo(ownerHand) target(land|myBattlefield)

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
grade=borderline grade=borderline
#Planeswalkers Primitives Pack for Wagic the Homebrew. #Planeswalkers Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card #Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#We sorted this in alphabetical order - Luruz & Vitty85 07-08-2021 #We sorted this in alphabetical order - Luruz & Vitty85 04-09-2021
[card] [card]
name=Abian, Luvion Usurper name=Abian, Luvion Usurper
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
@@ -557,11 +557,12 @@ subtype=Chandra
[/card] [/card]
[card] [card]
name=Chandra, Roaring Flame name=Chandra, Roaring Flame
auto=counter(0/0.4.loyalty) backside=Chandra, Fire of Kaladesh
auto=counter(0/0,4,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Deals 2 damage to player or planeswalker) damage:2 target(player,planeswalker) auto={C(0/0,1,Loyalty)}:name(+1: Deals 2 damage to player or planeswalker) damage:2 target(player,planeswalker)
auto={C(0/0,-2,Loyalty)}:name(-2: Deals 2 damage to creature) damage:2 target(creature) auto={C(0/0,-2,Loyalty)}:name(-2: Deals 2 damage to creature) damage:2 target(creature)
auto={C(0/0,-7,Loyalty)}:name(-7: Deals 6 damage with Emblem) damage:6 opponent && emblem transforms((,newability[@each opponent upkeep:damage:3 opponent])) forever dontremove auto={C(0/0,-7,Loyalty)}:name(-7: Deals 6 damage with Emblem) emblem transforms((newability[damage:6 opponent],newability[@each opponent upkeep:damage:3 opponent])) forever dontremove
text=+1: Chandra, Roaring Flame deals 2 damage to target player or planeswalker. -- 2: Chandra, Roaring Flame deals 2 damage to target creature. -- 7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with At the beginning of your upkeep, this emblem deals 3 damage to you. text=+1: Chandra, Roaring Flame deals 2 damage to target player or planeswalker. -- 2: Chandra, Roaring Flame deals 2 damage to target creature. -- 7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you." // Chandra, Fire of Kaladesh
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Chandra subtype=Chandra
color=red color=red
@@ -904,22 +905,23 @@ subtype=Garruk
[/card] [/card]
[card] [card]
name=Garruk Relentless name=Garruk Relentless
backside=Garruk, the Veil-Cursed
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto=this(counter{0/0.1.loyalty}<3) flip(Garruk, the Veil-Cursed) auto=this(counter{0/0.1.loyalty}<3) flip(backside)
auto={0}:name(+0: Garruk fights target creature) target(creature) dynamicability<!mytgt powerstrike tosrc!> damage:3 auto={0}:name(+0: Garruk fights a creature) target(creature) dynamicability<!powerstrike eachother!> && damage:3
auto={0}:name(+0: Create a 2/2 Wolf) token(Wolf,Creature Wolf,2/2,green) auto={0}:name(+0: Create a 2/2 Wolf) token(Wolf,Creature Wolf,2/2,green)
text=When Garruk Relentless has two or fewer loyalty counters on him, transform him. -- 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him. -- 0: Put a 2/2 green Wolf creature token onto the battlefield. text=When Garruk Relentless has two or fewer loyalty counters on him, transform him. -- 0: Garruk Relentless deals 3 damage to target creature. That creature deals damage equal to its power to him. -- 0: Put a 2/2 green Wolf creature token onto the battlefield. // Garruk, the Veil-Cursed
mana={3}{G} mana={3}{G}
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Garruk subtype=Garruk
[/card] [/card]
[card] [card]
name=Garruk, the Veil-Cursed name=Garruk, the Veil-Cursed
aicode=activate target(creature|mylibrary) moveto(myhand) backside=Garruk Relentless
auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 Wolf) token(Wolf,Creature Wolf,1/1,black,deathtouch) auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 Wolf) token(Wolf,Creature Wolf,1/1,black,deathtouch)
auto={C(0/0,-1,Loyalty)}{S(creature|myBattlefield)}:name(-1: Search creature) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>creature|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend auto={C(0/0,-1,Loyalty)}{S(creature|myBattlefield)}:name(-1: Search creature) target(creature|mylibrary) moveto(myhand) and!( shuffle )!
auto={C(0/0,-3,Loyalty)}:name(-3: Creatures gets +X/+X and trample) all(creature|mybattlefield) trample ueot && all(creature|mybattlefield) foreach(creature|mygraveyard) 1/1 ueot auto={C(0/0,-3,Loyalty)}:name(-3: Creatures gets +X/+X and trample) all(creature|mybattlefield) transforms((,newability[trample],newability[type:creature:mygraveyard/type:creature:mygraveyard])) ueot
text=+1: Put a 1/1 black Wolf creature token with deathtouch onto the battlefield. -- -1: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library. -- -3: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard. text=+1: Put a 1/1 black Wolf creature token with deathtouch onto the battlefield. -- -1: Sacrifice a creature. If you do, search your library for a creature card, reveal it, put it into your hand, then shuffle your library. -- -3: Creatures you control gain trample and get +X/+X until end of turn, where X is the number of creature cards in your graveyard. // Garruk Relentless
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Garruk subtype=Garruk
color=black,green color=black,green
@@ -1052,11 +1054,12 @@ subtype=Gideon
[/card] [/card]
[card] [card]
name=Gideon, Battle-Forged name=Gideon, Battle-Forged
backside=Kytheon, Hero of Akros
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Target creature attacks Gideon) target(creature|opponentbattlefield) mustattack uynt auto={C(0/0,2,Loyalty)}:name(+2: Target creature attacks Gideon) target(creature|opponentbattlefield) mustattack uynt
auto={C(0/0,-1,Loyalty)}:name(+1: Target creature is indestructible and untap it) untap target(creature) && indestructible uynt auto={C(0/0,-1,Loyalty)}:name(+1: Target creature is indestructible and untap it) target(creature) transforms((,newability[untap],newability[indestructible])) uynt
auto={C(0/0,0,Loyalty)}:name(+0: Transforms Gideon into a 4/4 Human Indestructible) transforms((Human Soldier Creature Planeswalker,setpower=4,settoughness=4,indestructible)) ueot && transforms((,newability[preventAllDamage to(this)])) ueot auto={C(0/0,0,Loyalty)}:name(+0: Transforms Gideon into a 4/4 Human Indestructible) transforms((Human Soldier Creature,setpower=4,settoughness=4,newability[indestructible],newability[preventAllDamage to(this)])) ueot
text=+2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controllers next turn if able. -- +1: Until your next turn, target creature gains indestructible. Untap that creature. -- 0: Until end of turn, Gideon, Battle-Forged becomes a 4/4 Human Soldier creature with indestructible thats still a planeswalker. Prevent all damage that would be dealt to him this turn. text=+2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controllers next turn if able. -- +1: Until your next turn, target creature gains indestructible. Untap that creature. -- 0: Until end of turn, Gideon, Battle-Forged becomes a 4/4 Human Soldier creature with indestructible thats still a planeswalker. Prevent all damage that would be dealt to him this turn. // Kytheon, Hero of Akros
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Gideon subtype=Gideon
color=white color=white
@@ -1307,12 +1310,13 @@ subtype=Jace
[/card] [/card]
[card] [card]
name=Jace, Telepath Unbound name=Jace, Telepath Unbound
backside=Jace, Vryn's Prodigy
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: don't target any creature) donothing auto={C(0/0,1,Loyalty)}:name(+1: don't target any creature) donothing
auto={C(0/0,1,Loyalty)}:name(+1: target creature gets -2/0) target(creature) -2/0 uynt auto={C(0/0,1,Loyalty)}:name(+1: target creature gets -2/0) target(creature) -2/0 uynt
auto={C(0/0,-3,Loyalty)}:name(-3: choose an instant or sorcery you may from graveyard) target(*[instant;sorcery]|mygraveyard) transforms((,newability[canplayfromgraveyard],newability[gainedexiledeath])) ueot auto={C(0/0,-3,Loyalty)}:name(-3: choose an instant or sorcery you may from graveyard) target(*[instant;sorcery]|mygraveyard) transforms((,newability[canplayfromgraveyard],newability[gainedexiledeath])) ueot
auto={C(0/0,-9,Loyalty)}:name(-9: emblem mills opponent cards) emblem transforms((,newability[@movedTo(*|mystack):deplete:5 opponent])) forever dontremove auto={C(0/0,-9,Loyalty)}:name(-9: emblem mills opponent cards) emblem transforms((,newability[@movedTo(*|mystack):deplete:5 opponent])) forever dontremove
text=+1: Up to one target creature gets -2/-0 until your next turn. -- -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead. -- -9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard." text=+1: Up to one target creature gets -2/-0 until your next turn. -- -3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead. -- -9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard." // Jace, Vryn's Prodigy
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Jace subtype=Jace
color=blue color=blue
@@ -1657,6 +1661,7 @@ subtype=Liliana
[/card] [/card]
[card] [card]
name=Liliana, Defiant Necromancer name=Liliana, Defiant Necromancer
backside=Liliana, Heretical Healer
auto=counter(0/0,3,Loyalty) auto=counter(0/0,3,Loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Each player discards a card) transforms((,newability[ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller],newability[ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ opponent])) oneshot auto={C(0/0,2,Loyalty)}:name(+2: Each player discards a card) transforms((,newability[ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller],newability[ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ opponent])) oneshot
auto={C(0/0,0,Loyalty)}:name(-0: Reanimate non-legendary creature with manacost 0) moveto(mybattlefield) target(creature[-legendary;manacost=0]|mygraveyard) auto={C(0/0,0,Loyalty)}:name(-0: Reanimate non-legendary creature with manacost 0) moveto(mybattlefield) target(creature[-legendary;manacost=0]|mygraveyard)
@@ -1805,6 +1810,7 @@ subtype=Lukka
[/card] [/card]
[card] [card]
name=Lukka, Wayward Bonder name=Lukka, Wayward Bonder
backside=Mila, Crafty Companion
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,1,Loyalty)}:name(+1: Don't discard any card) donothing auto={C(0/0,1,Loyalty)}:name(+1: Don't discard any card) donothing
auto={C(0/0,1,Loyalty)}:name(+1: Discard and draw) target(*|myhand) transforms((,newability[reject],newability[if cantargetcard(*[creature]|*) then draw:2 else draw:1])) oneshot auto={C(0/0,1,Loyalty)}:name(+1: Discard and draw) target(*|myhand) transforms((,newability[reject],newability[if cantargetcard(*[creature]|*) then draw:2 else draw:1])) oneshot
@@ -1820,7 +1826,7 @@ name=Mordenkainen
auto=counter(0/0,5,Loyalty) auto=counter(0/0,5,Loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Draw 2 cards) draw:2 && transforms((,newability[name(Put on bottom) target(*|myhand) bottomoflibrary])) forever auto={C(0/0,2,Loyalty)}:name(+2: Draw 2 cards) draw:2 && transforms((,newability[name(Put on bottom) target(*|myhand) bottomoflibrary])) forever
auto={C(0/0,-2,Loyalty)}:name(-2: Create Dog Illusion) token(Dog Mor) auto={C(0/0,-2,Loyalty)}:name(-2: Create Dog Illusion) token(Dog Mor)
auto={C(0/0,-10,Loyalty)}:name(-10: Exchange hand and library) token(Mordenkainen Emblem,Emblem,0/0,shroud,indestructible) and!( transforms((,newability[nomaxhand],newability[all(*|myhand) moveto(myreveal) and!( all(*|mylibrary) moveto(myhand) and!( all(*|myreveal) moveto(mylibrary) and!( shuffle )! )! )!])) forever auto={C(0/0,-10,Loyalty)}:name(-10: Exchange hand and library) token(Mordenkainen Emblem,Emblem,0/0,shroud,indestructible,notrigger) and!( transforms((,newability[nomaxhand],newability[all(*|myhand) moveto(myreveal) and!( all(*|mylibrary) moveto(myhand) and!( all(*|myreveal) moveto(mylibrary) and!( shuffle )! )! )!])) forever
text=+2: Draw two cards, then put a card from your hand on the bottom of your library. -- -2: Create a blue Dog Illusion creature token with "This creatures power and toughness are each equal to twice the number of cards in your hand." -- -10: Exchange your hand and library, then shuffle. You get an emblem with "You have no maximum hand size." text=+2: Draw two cards, then put a card from your hand on the bottom of your library. -- -2: Create a blue Dog Illusion creature token with "This creatures power and toughness are each equal to twice the number of cards in your hand." -- -10: Exchange your hand and library, then shuffle. You get an emblem with "You have no maximum hand size."
mana={4}{U}{U} mana={4}{U}{U}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -2000,13 +2006,14 @@ subtype=Bolas
[/card] [/card]
[card] [card]
name=Nicol Bolas, the Arisen name=Nicol Bolas, the Arisen
backside=Nicol Bolas, the Ravager
auto=counter(0/0,7,Loyalty) auto=counter(0/0,7,Loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Draw two cards) draw:2 controller auto={C(0/0,2,Loyalty)}:name(+2: Draw two cards) draw:2 controller
auto={C(0/0,-3,Loyalty)}:name(-3: Deals 10 damage to creature or planeswalker) damage:10 target(creature,planeswalker) auto={C(0/0,-3,Loyalty)}:name(-3: Deals 10 damage to creature or planeswalker) damage:10 target(creature,planeswalker)
auto={C(0/0,-4,Loyalty)}:name(-4: Reanimate a creature or planeswalker) target(*[creature;planeswalker]|graveyard) moveto(myBattlefield) auto={C(0/0,-4,Loyalty)}:name(-4: Reanimate a creature or planeswalker) target(*[creature;planeswalker]|graveyard) moveto(myBattlefield)
auto={C(0/0,-12,Loyalty)}:name(-12: Exile opponent library except one) moveTo(opponentexile) all(*[zpos<=type:*:opponentlibraryminus1minusend]|opponentlibrary) auto={C(0/0,-12,Loyalty)}:name(-12: Exile opponent library except one) moveTo(opponentexile) all(*[zpos<=type:*:opponentlibraryminus1minusend]|opponentlibrary)
auto={C(0/0,-12,Loyalty)}:name(-12: Exile your library except one) moveTo(myexile) all(*[zpos<=type:*:mylibraryminus1minusend]|mylibrary) auto={C(0/0,-12,Loyalty)}:name(-12: Exile your library except one) moveTo(myexile) all(*[zpos<=type:*:mylibraryminus1minusend]|mylibrary)
text=+2: Draw two cards. -- -3: Nicol Bolas, the Arisen deals 10 damage to target creature or planeswalker. -- -4: Put target creature or planeswalker card from a graveyard onto the battlefield under your control. -- -12: Exile all but the bottom card of target player's library. text=+2: Draw two cards. -- -3: Nicol Bolas, the Arisen deals 10 damage to target creature or planeswalker. -- -4: Put target creature or planeswalker card from a graveyard onto the battlefield under your control. -- -12: Exile all but the bottom card of target player's library. // Nicol Bolas, the Ravager
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Bolas subtype=Bolas
color=blue,black,red color=blue,black,red
@@ -2087,12 +2094,13 @@ subtype=Nissa
[/card] [/card]
[card] [card]
name=Nissa, Sage Animist name=Nissa, Sage Animist
backside=Nissa, Vastwood Seer
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
aicode=activate transforms((,newability[if type(land[zpos=1]|mylibrary)~morethan~0 then target(land[zpos=1]|mylibrary) moveto(ownerbattlefield) else target(*[zpos=1]|mylibrary) moveto(ownerhand)])) ueot aicode=activate transforms((,newability[if type(land[zpos=1]|mylibrary)~morethan~0 then target(land[zpos=1]|mylibrary) moveto(ownerbattlefield) else target(*[zpos=1]|mylibrary) moveto(ownerhand)])) ueot
auto={C(0/0,1,Loyalty)}:name(+1: Reveal the top and put land on battlefield) reveal:1 optionone target(<1>land|reveal) moveto(ownerbattlefield) optiononeend optiontwo target(<1>*|reveal) moveto(ownerhand) optiontwoend revealend auto={C(0/0,1,Loyalty)}:name(+1: Reveal the top and put land on battlefield) reveal:1 optionone target(<1>land|reveal) moveto(ownerbattlefield) optiononeend optiontwo target(<1>*|reveal) moveto(ownerhand) optiontwoend revealend
auto={C(0/0,-2,Loyalty)}:name(-2: Create a Legendary 4/4 Elemental named Ashaya) create(Ashaya, the Awoken World:Legendary Creature Elemental:4/4:green) auto={C(0/0,-2,Loyalty)}:name(-2: Create a Legendary 4/4 Elemental named Ashaya) create(Ashaya, the Awoken World:Legendary Creature Elemental:4/4:green)
auto={C(0/0,-7,Loyalty)}:name(-7: Untap up to six land an becomes 6/6) target(<upto:6>land) transforms((Creature Elemental,newability[untap],setpower=6,settoughness=6)) forever auto={C(0/0,-7,Loyalty)}:name(-7: Untap up to six land an becomes 6/6) target(<upto:6>land) transforms((Creature Elemental,newability[untap],setpower=6,settoughness=6)) forever
text=+1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. -- -2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield. -- -7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. text=+1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. -- -2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield. -- -7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. // Nissa, Vastwood Seer
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Nissa subtype=Nissa
color=green color=green
@@ -2844,8 +2852,9 @@ type=Legendary Planeswalker
[/card] [/card]
[card] [card]
name=Tibalt, Cosmic Impostor name=Tibalt, Cosmic Impostor
backside=Valki, God of Lies
auto=counter(0/0,5,Loyalty) auto=counter(0/0,5,Loyalty)
auto=token(Tibalt Emblem,Emblem,0/0,shroud,indestructible,notrigger,nomovetrigger) and!( transforms((,newability[lord(*[counter{0/0.1.TibaltExiled}]|myexile) canplayfromexile],newability[lord(*[counter{0/0.1.TibaltExiled}]|myexile) anytypeofmana],newability[{0}:name(Cast from opponent exile) target(*[counter{0/0.1.TibaltExiled}]|opponentexile) moveto(myexile) and!( transforms((,newability[counter(0/0.1.TibaltExiled)],newability[canplayfromexile],newability[anytypeofmana],newability[phaseaction[endofturn once checkex] moveTo(ownerexile)],newability[phaseaction[untap once checkex] counter(0/0.1.TibaltExiled)])) ueot )!])) forever )! auto=token(Tibalt Emblem,Emblem,0/0,shroud,indestructible,notrigger) and!( transforms((,newability[lord(*[counter{0/0.1.TibaltExiled}]|myexile) canplayfromexile],newability[lord(*[counter{0/0.1.TibaltExiled}]|myexile) anytypeofmana],newability[{0}:name(Cast from opponent exile) target(*[counter{0/0.1.TibaltExiled}]|opponentexile) moveto(myexile) and!( transforms((,newability[counter(0/0.1.TibaltExiled)],newability[canplayfromexile],newability[anytypeofmana],newability[phaseaction[endofturn once checkex] moveTo(ownerexile)],newability[phaseaction[untap once checkex] counter(0/0.1.TibaltExiled)])) ueot )!])) forever )!
auto={C(0/0,2,Loyalty)}:name(+2: Exile the top card) all(*[zpos=1]|library) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )! auto={C(0/0,2,Loyalty)}:name(+2: Exile the top card) all(*[zpos=1]|library) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )!
auto={C(0/0,-3,Loyalty)}:name(-3: Exile target artifact or creature) target(*[artifact;creature]|battlefield) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )! auto={C(0/0,-3,Loyalty)}:name(-3: Exile target artifact or creature) target(*[artifact;creature]|battlefield) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )!
auto={C(0/0,-8,Loyalty)}:name(-8: Exile all cards from all graveyards) all(*|graveyard) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )! auto={C(0/0,-8,Loyalty)}:name(-8: Exile all cards from all graveyards) all(*|graveyard) moveto(ownerexile) and!( counter(0/0,1,TibaltExiled) )!

View File

@@ -2,7 +2,7 @@ grade=unsupported
#The cards in this file are not implemented/incomplete yet. #The cards in this file are not implemented/incomplete yet.
#Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017 #Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card #Please keep these card alphabetized, and try to have the "name=" line at the top of each card
#I sorted this programatically - Vitty85 07-08-2021 #I sorted this programatically - Vitty85 04-09-2021
[card] [card]
name="Ach! Hans, Run!" name="Ach! Hans, Run!"
text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn. text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn.
@@ -3100,6 +3100,15 @@ mana={2}{B}{B}
type=Sorcery type=Sorcery
[/card] [/card]
[card] [card]
name=Exiled Doomsayer
text=All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.)
mana={1}{W}
type=Creature
subtype=Human Cleric
power=1
toughness=2
[/card]
[card]
name=Experiment Kraj name=Experiment Kraj
text=Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it. -- {T}: Put a +1/+1 counter on target creature. text=Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it. -- {T}: Put a +1/+1 counter on target creature.
mana={2}{G}{G}{U}{U} mana={2}{G}{G}{U}{U}
@@ -11822,12 +11831,6 @@ text={T}: Add {1}{1} . Spend this mana only to cast spells with watermarks.
type=Land type=Land
[/card] [/card]
[card] [card]
name=Waxing Moon
text=Transform up to one target Werewolf you control. Creatures you control gain trample until end of turn.
mana={1}{G}
type=Instant
[/card]
[card]
name=Wear Away name=Wear Away
text=Destroy target artifact or enchantment. -- Splice onto Arcane {3}{G} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) text=Destroy target artifact or enchantment. -- Splice onto Arcane {3}{G} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.)
mana={G}{G} mana={G}{G}

View File

@@ -47,6 +47,7 @@ class CardDescriptor: public MTGCardInstance
int zposition; int zposition;
int hasKickerCost; int hasKickerCost;
int hasFlashbackCost; int hasFlashbackCost;
int hasBackSide;
int hasXCost; int hasXCost;
int anyCounter; int anyCounter;
int init(); int init();
@@ -54,6 +55,7 @@ class CardDescriptor: public MTGCardInstance
void unsecureSetKicked(int i); void unsecureSetKicked(int i);
void unsecureSetHasKickerCost(int i); void unsecureSetHasKickerCost(int i);
void unsecureSetHasFlashbackCost(int i); void unsecureSetHasFlashbackCost(int i);
void unsecureSetHasBackSide(int i);
void unsecureSetTapped(int i); void unsecureSetTapped(int i);
void unsecuresetfresh(int k); void unsecuresetfresh(int k);
void unsecuresetrecent(int j); void unsecuresetrecent(int j);

View File

@@ -54,6 +54,7 @@ public:
string text; string text;
string name; string name;
string nameOrig; string nameOrig;
string backSide;
int init(); int init();
uint8_t colors; uint8_t colors;

View File

@@ -66,11 +66,11 @@ public:
int damageInflictedAsCommander; int damageInflictedAsCommander;
int numofcastfromcommandzone; int numofcastfromcommandzone;
int auras; int auras;
bool wasDealtDamage; int wasDealtDamage;
bool combatdamageToOpponent; int combatdamageToOpponent;
bool damageToOpponent; int damageToOpponent;
bool damageToController; int damageToController;
bool damageToCreature; int damageToCreature;
bool isProvoked; bool isProvoked;
MTGCardInstance * ProvokeTarget; MTGCardInstance * ProvokeTarget;
MTGCardInstance * Provoker; MTGCardInstance * Provoker;

View File

@@ -323,7 +323,8 @@ class Constants
SHOWCONTROLLERHAND = 196, SHOWCONTROLLERHAND = 196,
HASREPLICATE = 197, HASREPLICATE = 197,
ISPREY = 198, ISPREY = 198,
NB_BASIC_ABILITIES = 199, HASDISTURB = 199,
NB_BASIC_ABILITIES = 200,
RARITY_S = 'S', //Special Rarity RARITY_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics RARITY_M = 'M', //Mythics

View File

@@ -4609,12 +4609,15 @@ int AATurnSide::resolve()
if(_target->controller()->isAI() && _target->isFlipped) _target->isFlipped = false; // If it's AI calling back we just have to reset isFLipped flag and then return. if(_target->controller()->isAI() && _target->isFlipped) _target->isFlipped = false; // If it's AI calling back we just have to reset isFLipped flag and then return.
if(!_target->isFlipped && _SideName == "") return 0; // No need to turn front if card has not been flipped before. if(!_target->isFlipped && _SideName == "") return 0; // No need to turn front if card has not been flipped before.
if(!_target->isFlipped){ if(!_target->isFlipped){
if(_SideName == "backside" && _target->backSide != "")
_SideName = _target->backSide; // Added to allow to turn a card on its backside.
fcard = MTGCollection()->getCardByName(_SideName); fcard = MTGCollection()->getCardByName(_SideName);
if(!fcard) return 0; if(!fcard) return 0;
sideCard = NEW MTGCardInstance(fcard, _target->controller()->game); sideCard = NEW MTGCardInstance(fcard, _target->controller()->game);
_target->nameOrig = _target->name; _target->nameOrig = _target->name;
_target->name = sideCard->name; _target->name = sideCard->name;
_target->setName(sideCard->name); _target->setName(sideCard->name);
_target->backSide = sideCard->backSide;
if(!sideCard) return 0; if(!sideCard) return 0;
if(sideCard->getManaCost()){ if(sideCard->getManaCost()){
if(_target->getManaCost()->getAlternative()){ if(_target->getManaCost()->getAlternative()){
@@ -4625,6 +4628,10 @@ int AATurnSide::resolve()
sideCard->getManaCost()->setMorph(NEW ManaCost()); sideCard->getManaCost()->setMorph(NEW ManaCost());
sideCard->getManaCost()->getMorph()->copy(_target->getManaCost()->getMorph()); // Keep orignal morph cost to cast the original card with morph. sideCard->getManaCost()->getMorph()->copy(_target->getManaCost()->getMorph()); // Keep orignal morph cost to cast the original card with morph.
} }
if(_target->getManaCost()->getRetrace()){
sideCard->getManaCost()->setRetrace(NEW ManaCost());
sideCard->getManaCost()->getRetrace()->copy(_target->getManaCost()->getRetrace()); // Keep orignal retrace cost to cast the original card with retrace (e.g. cards with disturb cost).
}
_target->getManaCost()->copy(sideCard->getManaCost()); // Show the other side cost mana symbols. _target->getManaCost()->copy(sideCard->getManaCost()); // Show the other side cost mana symbols.
if(_target->numofcastfromcommandzone > 0){ //In case you turn side of a previuosly casted commander if(_target->numofcastfromcommandzone > 0){ //In case you turn side of a previuosly casted commander
_target->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT,2*_target->numofcastfromcommandzone); _target->getManaCost()->add(Constants::MTG_COLOR_ARTIFACT,2*_target->numofcastfromcommandzone);
@@ -4733,9 +4740,11 @@ int AAFlip::resolve()
if(flipStats.size()) if(flipStats.size())
{ {
if(flipStats == "myorigname" && _target->nameOrig != "") if(flipStats == "myorigname" && _target->nameOrig != "")
flipStats = _target->nameOrig; // Added to undo the copy effect at end of turn for a generic card (es. Shapeshifter transformations). flipStats = _target->nameOrig; // Added to undo the copy effect at end of turn for a generic card (e.g. Shapeshifter transformations).
else if(flipStats == "chosenname" && _target->chooseaname != "") else if(flipStats == "chosenname" && _target->chooseaname != "")
flipStats = _target->chooseaname; // Added to allow the transformation of a card in a choosen name. flipStats = _target->chooseaname; // Added to allow the transformation of a card in a choosen name.
else if(flipStats == "backside" && _target->backSide != "")
flipStats = _target->backSide; // Added to allow the transformation of a card in its backside (e.g. Werewolves transformations).
MTGCard * fcard = MTGCollection()->getCardByName(flipStats); MTGCard * fcard = MTGCollection()->getCardByName(flipStats);
if(!fcard) return 0; if(!fcard) return 0;
MTGCardInstance * myFlip = NEW MTGCardInstance(fcard, _target->controller()->game); MTGCardInstance * myFlip = NEW MTGCardInstance(fcard, _target->controller()->game);
@@ -4747,6 +4756,7 @@ int AAFlip::resolve()
_target->nameOrig = nameOrig; // Saves the orignal card name before to flip the card. _target->nameOrig = nameOrig; // Saves the orignal card name before to flip the card.
_target->name = myFlip->name; _target->name = myFlip->name;
_target->setName(myFlip->name); _target->setName(myFlip->name);
_target->backSide = myFlip->backSide;
if(!isflipcard)//transform card if(!isflipcard)//transform card
{ {
_target->getManaCost()->resetCosts(); _target->getManaCost()->resetCosts();
@@ -4812,7 +4822,13 @@ int AAFlip::resolve()
{ {
if (a->oneShot) if (a->oneShot)
{ {
a->resolve(); if(_target->hasType(Subtypes::TYPE_PLANESWALKER)){ // Fix to don't let planeswalker die on flip (since the counter ability is not resolving correctly during flip).
AACounter * tmp = dynamic_cast<AACounter *>(a);
if(tmp && tmp->counterstring.find("loyalty") != string::npos){
for (int j = 0; j < tmp->nb; j++)
_target->counters->addCounter("loyalty", 0, 0, true);
} else a->resolve();
} else a->resolve();
SAFE_DELETE(a); SAFE_DELETE(a);
} }
else else
@@ -4820,9 +4836,7 @@ int AAFlip::resolve()
a->addToGame(); a->addToGame();
MayAbility * dontAdd = dynamic_cast<MayAbility*>(a); MayAbility * dontAdd = dynamic_cast<MayAbility*>(a);
if(!dontAdd) if(!dontAdd)
{
_target->cardsAbilities.push_back(a); _target->cardsAbilities.push_back(a);
}
} }
} }
} }

View File

@@ -24,6 +24,7 @@ CardDescriptor::CardDescriptor()
zposition = -1; zposition = -1;
hasKickerCost = 0; hasKickerCost = 0;
hasFlashbackCost = 0; hasFlashbackCost = 0;
hasBackSide = 0;
hasXCost = 0; hasXCost = 0;
compareName =""; compareName ="";
nameComparisonMode = COMPARISON_NONE; nameComparisonMode = COMPARISON_NONE;
@@ -72,6 +73,11 @@ void CardDescriptor::unsecureSetHasFlashbackCost(int k)
hasFlashbackCost = k; hasFlashbackCost = k;
} }
void CardDescriptor::unsecureSetHasBackSide(int k)
{
hasBackSide = k;
}
void CardDescriptor::unsecureSetTapped(int i) void CardDescriptor::unsecureSetTapped(int i)
{ {
tapped = i; tapped = i;
@@ -277,6 +283,11 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
match = NULL; match = NULL;
} }
if ((hasBackSide == -1 && card->backSide != "") || (hasBackSide == 1 && card->backSide == ""))
{
match = NULL;
}
if ((hasXCost == -1 && card->getManaCost()->hasX()) || (hasXCost == 1 && !card->getManaCost()->hasX())) if ((hasXCost == -1 && card->getManaCost()->hasX()) || (hasXCost == 1 && !card->getManaCost()->hasX()))
{ {
match = NULL; match = NULL;
@@ -400,13 +411,13 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
{ {
match = NULL; match = NULL;
} }
if ((CDdamaged == -1 && card->wasDealtDamage) || (CDdamaged == 1 && !card->wasDealtDamage)) if ((CDdamaged == -1 && card->wasDealtDamage > 0) || (CDdamaged == 1 && card->wasDealtDamage == 0))
{ {
match = NULL; match = NULL;
} }
if ((CDdamager == -1 && (card->damageToOpponent || card->damageToController || card->damageToCreature)) if ((CDdamager == -1 && (card->damageToOpponent > 0 || card->damageToController > 0 || card->damageToCreature > 0))
|| (CDdamager == 1 && !(card->damageToOpponent || card->damageToController || card->damageToCreature))) || (CDdamager == 1 && !(card->damageToOpponent > 0 || card->damageToController > 0 || card->damageToCreature > 0)))
{ {
match = NULL; match = NULL;
} }
@@ -414,17 +425,17 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
if(CDopponentDamaged == -1 || CDopponentDamaged == 1 || CDcontrollerDamaged == -1 || CDcontrollerDamaged == 1) if(CDopponentDamaged == -1 || CDopponentDamaged == 1 || CDcontrollerDamaged == -1 || CDcontrollerDamaged == 1)
{ {
Player * p = card->controller(); Player * p = card->controller();
if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p) if ((CDopponentDamaged == -1 && card->damageToOpponent > 0 && card->controller() == p)
|| (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == 1 && card->damageToOpponent == 0 && card->controller() == p)
|| (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent()) || (CDopponentDamaged == -1 && card->damageToController > 0 && card->controller() == p->opponent())
|| (CDopponentDamaged == 1 && !card->damageToController && card->controller() == p->opponent())) || (CDopponentDamaged == 1 && card->damageToController == 0 && card->controller() == p->opponent()))
{ {
match = NULL; match = NULL;
} }
if ((CDcontrollerDamaged == -1 && card->damageToController && card->controller() == p) if ((CDcontrollerDamaged == -1 && card->damageToController > 0 && card->controller() == p)
|| (CDcontrollerDamaged == 1 && !card->damageToController && card->controller() == p) || (CDcontrollerDamaged == 1 && card->damageToController == 0 && card->controller() == p)
|| (CDcontrollerDamaged == -1 && card->damageToOpponent && card->controller() == p->opponent()) || (CDcontrollerDamaged == -1 && card->damageToOpponent > 0 && card->controller() == p->opponent())
|| (CDcontrollerDamaged == 1 && !card->damageToOpponent && card->controller() == p->opponent())) || (CDcontrollerDamaged == 1 && card->damageToOpponent == 0 && card->controller() == p->opponent()))
{ {
match = NULL; match = NULL;
} }

View File

@@ -444,11 +444,11 @@ void CardGui::Render()
renderer->DrawRect(actX - (13 * actZ), actY + ymody + 4 * actZ, 25.5f * actZ, 14 * actZ, renderer->DrawRect(actX - (13 * actZ), actY + ymody + 4 * actZ, 25.5f * actZ, 14 * actZ,
ARGB(((static_cast<unsigned char>(actA))),20,20,20)); ARGB(((static_cast<unsigned char>(actA))),20,20,20));
//damaged or buffed or powered down //damaged or buffed or powered down
if(card->wasDealtDamage && card->life <= 2) if(card->wasDealtDamage > 0 && card->life <= 2)
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,0,0));//red critical and damaged mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,0,0));//red critical and damaged
else if(!card->wasDealtDamage && card->pbonus < 0) else if(card->wasDealtDamage == 0 && card->pbonus < 0)
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),216,191,216));//thistle powered down mFont->SetColor(ARGB(static_cast<unsigned char>(actA),216,191,216));//thistle powered down
else if(!card->wasDealtDamage && card->pbonus >= 3) else if(card->wasDealtDamage == 0 && card->pbonus >= 3)
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,0));//yellow buff mFont->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,0));//yellow buff
else if(card->hasType("legendary") && card->hasType("eldrazi") && !card->has(Constants::CHANGELING)) else if(card->hasType("legendary") && card->hasType("eldrazi") && !card->has(Constants::CHANGELING))
mFont->SetColor(ARGB(static_cast<unsigned char>(actA),238,130,238));//violet legendary eldrazi mFont->SetColor(ARGB(static_cast<unsigned char>(actA),238,130,238));//violet legendary eldrazi
@@ -1532,6 +1532,18 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
cd.unsecureSetHasFlashbackCost(1); cd.unsecureSetHasFlashbackCost(1);
} }
} }
//Has backside
else if (attribute.find("hasbackside") != string::npos)
{
if (minus)
{
cd.unsecureSetHasBackSide(-1);
}
else
{
cd.unsecureSetHasBackSide(1);
}
}
//Token //Token
else if (attribute.find("token") != string::npos) else if (attribute.find("token") != string::npos)
{ {

View File

@@ -255,18 +255,18 @@ int Damage::resolve()
target->nonCombatDamage += damage; target->nonCombatDamage += damage;
} }
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (((MTGCardInstance*)target)->basicAbilities[Constants::UNDAMAGEABLE] == 0)){ if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (((MTGCardInstance*)target)->basicAbilities[Constants::UNDAMAGEABLE] == 0)){
((MTGCardInstance*)target)->wasDealtDamage = true; ((MTGCardInstance*)target)->wasDealtDamage += damage;
((MTGCardInstance*)source)->damageToCreature = true; ((MTGCardInstance*)source)->damageToCreature += damage;
} }
if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER) if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
{ {
if(target == source->controller()) if(target == source->controller())
{ {
((MTGCardInstance*)source)->damageToController = true; ((MTGCardInstance*)source)->damageToController += damage;
} }
else else
{ {
((MTGCardInstance*)source)->damageToOpponent = true; ((MTGCardInstance*)source)->damageToOpponent += damage;
if(((MTGCardInstance*)source)->basicAbilities[Constants::ISCOMMANDER]) if(((MTGCardInstance*)source)->basicAbilities[Constants::ISCOMMANDER])
((MTGCardInstance*)source)->damageInflictedAsCommander += damage; ((MTGCardInstance*)source)->damageInflictedAsCommander += damage;
} }
@@ -274,7 +274,7 @@ int Damage::resolve()
if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes. if ( typeOfDamage == 1 && target == source->controller()->opponent() )//add vector prowledtypes.
{ {
source->controller()->dealsdamagebycombat = 1; // for restriction check source->controller()->dealsdamagebycombat = 1; // for restriction check
((MTGCardInstance*)source)->combatdamageToOpponent = true; //check ((MTGCardInstance*)source)->combatdamageToOpponent += damage; //check
vector<string> values = MTGAllCards::getCreatureValuesById();//getting a weird crash here. rarely. vector<string> values = MTGAllCards::getCreatureValuesById();//getting a weird crash here. rarely.
for (size_t i = 0; i < values.size(); ++i) for (size_t i = 0; i < values.size(); ++i)
{ {

View File

@@ -1026,12 +1026,12 @@ void GameObserver::gameStateBasedEffects()
c->flanked -= 1; c->flanked -= 1;
} }
c->fresh = 0; c->fresh = 0;
if(c->wasDealtDamage && c->isInPlay(this)) if(c->wasDealtDamage > 0 && c->isInPlay(this))
c->wasDealtDamage = false; c->wasDealtDamage = 0;
c->damageToController = false; c->damageToController = 0;
c->damageToOpponent = false; c->damageToOpponent = 0;
c->combatdamageToOpponent = false; c->combatdamageToOpponent = 0;
c->damageToCreature = false; c->damageToCreature = 0;
c->isAttacking = NULL; c->isAttacking = NULL;
c->isProvoked = false; c->isProvoked = false;
c->ProvokeTarget = NULL; c->ProvokeTarget = NULL;

View File

@@ -693,7 +693,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
check = restriction[i].find("didcombatdamagetofoe"); check = restriction[i].find("didcombatdamagetofoe");
if(check != string::npos) if(check != string::npos)
{ {
if(!card->combatdamageToOpponent) if(card->combatdamageToOpponent == 0)
return 0; return 0;
} }
@@ -825,6 +825,28 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
if(!found) if(!found)
return 0; return 0;
} }
check = restriction[i].find("coven"); //Player controls three or more creatures with different powers
if(check != string::npos)
{
if(player != observer->currentPlayer)
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)){
for(unsigned int j = i+1; j < observer->currentPlayer->game->inPlay->cards.size() && !found; j++){
if(observer->currentPlayer->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && observer->currentPlayer->game->inPlay->cards[j]->power != observer->currentPlayer->game->inPlay->cards[i]->power){
for(unsigned int k = j+1; k < observer->currentPlayer->game->inPlay->cards.size() && !found; k++){
if(observer->currentPlayer->game->inPlay->cards[k]->hasType(Subtypes::TYPE_CREATURE) && (observer->currentPlayer->game->inPlay->cards[k]->power != observer->currentPlayer->game->inPlay->cards[i]->power && observer->currentPlayer->game->inPlay->cards[k]->power != observer->currentPlayer->game->inPlay->cards[j]->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)
{ {
@@ -6531,15 +6553,17 @@ int ActivatedAbility::isReactingToClick(MTGCardInstance * card, ManaCost * mana)
return 0; return 0;
}*/ }*/
// Improved the check to avoid the multiple triggers in case of abilities gained from other cards (e.g. Kasmina, Enigma Sage) // Improved the check to avoid the multiple triggers in case of abilities gained from other cards (e.g. Kasmina, Enigma Sage)
for(unsigned int k = 0;k < card->getObserver()->mLayers->actionLayer()->mObjects.size();++k) bool turnSide = false;
for(unsigned int k = 0; k < card->getObserver()->mLayers->actionLayer()->mObjects.size(); ++k)
{ {
ActivatedAbility * check = dynamic_cast<ActivatedAbility*>(card->getObserver()->mLayers->actionLayer()->mObjects[k]); ActivatedAbility * check = dynamic_cast<ActivatedAbility*>(card->getObserver()->mLayers->actionLayer()->mObjects[k]);
if(check && check->source == card && check->counters) turnSide = card->isFlipped && !card->isInPlay(card->getObserver());
if(!turnSide && check && check->source == card && check->counters)
return 0; return 0;
} }
if (player != game->currentPlayer) if (player != game->currentPlayer)
return 0; return 0;
if (cPhase != MTG_PHASE_FIRSTMAIN && cPhase != MTG_PHASE_SECONDMAIN) if (!turnSide && (cPhase != MTG_PHASE_FIRSTMAIN && cPhase != MTG_PHASE_SECONDMAIN))
return 0; return 0;
} }
if (source->has(Constants::NOACTIVATED) || (source->mutation && source->parentCards.size() > 0)) // Mutated Over/Under card doesn't have to react to click anymore if (source->has(Constants::NOACTIVATED) || (source->mutation && source->parentCards.size() > 0)) // Mutated Over/Under card doesn't have to react to click anymore

View File

@@ -74,6 +74,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to
myconvertedcost = getManaCost()->getConvertedCost(); myconvertedcost = getManaCost()->getConvertedCost();
revealedLast = NULL; revealedLast = NULL;
MadnessPlay = false; MadnessPlay = false;
backSide = card->data->backSide;
} }
MTGCardInstance * MTGCardInstance::createSnapShot() MTGCardInstance * MTGCardInstance::createSnapShot()
@@ -140,7 +141,7 @@ void MTGCardInstance::copy(MTGCardInstance * card, bool nolegend)
setText(data->text); //The text is retrieved from the data anyways setText(data->text); //The text is retrieved from the data anyways
setName(data->name); setName(data->name);
backSide = data->backSide;
power = data->power;//layer 7a power = data->power;//layer 7a
toughness = data->toughness;//layer 7a toughness = data->toughness;//layer 7a
power += pbonus;//layer 7b power += pbonus;//layer 7b
@@ -242,14 +243,14 @@ void MTGCardInstance::initMTGCI()
damageInflictedAsCommander = 0; damageInflictedAsCommander = 0;
numofcastfromcommandzone = 0; numofcastfromcommandzone = 0;
auras = 0; auras = 0;
combatdamageToOpponent = false; combatdamageToOpponent = 0;
damageToOpponent = false; damageToOpponent = 0;
damageToController = false; damageToController = 0;
damageToCreature = false; damageToCreature = 0;
isProvoked = false; isProvoked = false;
ProvokeTarget = NULL; ProvokeTarget = NULL;
Provoker = NULL; Provoker = NULL;
wasDealtDamage = false; wasDealtDamage = 0;
isDualWielding = false; isDualWielding = false;
suspended = false; suspended = false;
isBestowed = false; isBestowed = false;

View File

@@ -113,7 +113,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
} }
break; break;
case 'b': //buyback/Bestow case 'b': //buyback/Bestow/backside
if (!primitive) primitive = NEW CardPrimitive(); if (!primitive) primitive = NEW CardPrimitive();
if (key[1] == 'e' && key[2] == 's') if (key[1] == 'e' && key[2] == 's')
{ //bestow { //bestow
@@ -125,6 +125,12 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi
cost->setBestow(ManaCost::parseManaCost(value)); cost->setBestow(ManaCost::parseManaCost(value));
} }
} }
else
if (key[1] == 'a' && key[2] == 'c')
{ //backside
if (!primitive) primitive = NEW CardPrimitive();
primitive->backSide = val;
}
else//buyback else//buyback
if (ManaCost * cost = primitive->getManaCost()) if (ManaCost * cost = primitive->getManaCost())
{ {

View File

@@ -228,8 +228,9 @@ const char* Constants::MTGBasicAbilities[] = {
"wascommander", //It was the current commander (e.g. after it flipped or morphed) "wascommander", //It was the current commander (e.g. after it flipped or morphed)
"showopponenthand", //opponent plays with his hand revealed. "showopponenthand", //opponent plays with his hand revealed.
"showcontrollerhand", //controller plays with his hand revealed. "showcontrollerhand", //controller plays with his hand revealed.
"hasreplicate", //Kicker cost is a replicate cost (eg. "Vacuumelt") "hasreplicate", //Kicker cost is a replicate cost (e.g. "Vacuumelt")
"isprey" //Creature has been haunted by some other card. "isprey", //Creature has been haunted by some other card.
"hasdisturb" //Retrace cost is a disturb cost (e.g. "Beloved Beggar")
}; };
map<string,int> Constants::MTGBasicAbilitiesMap; map<string,int> Constants::MTGBasicAbilitiesMap;

View File

@@ -583,6 +583,18 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
cd->unsecureSetHasFlashbackCost(1); cd->unsecureSetHasFlashbackCost(1);
} }
} }
//Has backside
else if (attribute.find("hasbackside") != string::npos)
{
if (minus)
{
cd->unsecureSetHasBackSide(-1);
}
else
{
cd->unsecureSetHasBackSide(1);
}
}
//Token //Token
else if (attribute.find("token") != string::npos) else if (attribute.find("token") != string::npos)
{ {

View File

@@ -669,7 +669,7 @@ ThisDamaged::ThisDamaged(int wasDealtDamage)
int ThisDamaged::match(MTGCardInstance * card) int ThisDamaged::match(MTGCardInstance * card)
{ {
int result = 0; int result = 0;
if(card->wasDealtDamage) if(card->wasDealtDamage > 0)
result = 1; result = 1;
return matchValue(result); return matchValue(result);
} }

View File

@@ -1315,9 +1315,14 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
{ {
intValue = (s == "plastshlturn")?card->controller()->lastShuffleTurn:card->controller()->opponent()->lastShuffleTurn; intValue = (s == "plastshlturn")?card->controller()->lastShuffleTurn:card->controller()->opponent()->lastShuffleTurn;
} }
else if (s == "hasprey") else if (s == "hasprey" || s == "dualfaced" || s == "totaldmg")
{ {
intValue = (card->hauntedCard)?1:0; if (s == "hasprey")
intValue = (card->hauntedCard)?1:0;
else if (s == "dualfaced")
intValue = (card->backSide != "")?1:0;
else if (s == "totaldmg")
intValue = (card->damageToController + card->damageToCreature + card->damageToOpponent);
} }
else if(!intValue)//found nothing, try parsing a atoi else if(!intValue)//found nothing, try parsing a atoi
{ {