Added new features and triggers to game about tokens and counters, fixed and added new primitives.

This commit is contained in:
valfieri
2020-07-10 19:53:46 +02:00
parent fc40971dc7
commit 52e3177ef2
11 changed files with 1042 additions and 732 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -11876,7 +11876,7 @@ type=Land
[card]
name=Blinkmoth Urn
auto=@each my firstmain sourcenottapped:all(artifact|mybattlefield) add{1}
auto=@each opponentfirstmain sourcenottapped:all(artifact|opponentbattlefield) add{1}
auto=@each opponent firstmain sourcenottapped:all(artifact|opponentbattlefield) add{1}
text=At the beginning of each player's precombat main phase, if Blinkmoth Urn is untapped, that player adds {1} to his or her mana pool for each artifact he or she controls.
mana={5}
type=Artifact
@@ -49486,7 +49486,7 @@ toughness=3
name=Grand Architect
auto=lord(other creature[blue]|myBattlefield) 1/1
auto={U}:target(creature[artifact]) becomes(blue)
auto={T(creature[blue]|mybattlefield)}:Add{2}
auto={T(creature[blue]|mybattlefield)}:if type(artifact|myhand,mybattlefield)~morethan~0 then add{C}{C}
text=Other blue creatures you control get +1/+1. -- {U}:Target artifact creature becomes blue until end of turn. -- Tap an untapped blue creature you control: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.
mana={1}{U}{U}
type=Creature
@@ -78956,7 +78956,7 @@ type=Artifact
[card]
name=Necrogen Mists
auto=@each my upkeep:reject target(*|myhand)
auto=@each opponentupkeep:ability$!name(discard) target(*|myhand) reject!$ opponent
auto=@each opponent upkeep:ability$!name(discard) target(*|myhand) reject!$ opponent
text=At the beginning of each player's upkeep, that player discards a card.
mana={2}{B}
type=Enchantment

View File

@@ -3200,15 +3200,6 @@ mana={U}{U}
type=Enchantment
[/card]
[card]
name=Deepglow Skate
text=When Deepglow Skate enters the battlefield, double the number of each kind of counter on any number of target permanents.
mana={4}{U}
type=Creature
subtype=Fish
power=3
toughness=3
[/card]
[card]
name=Defective Detective
text=Defective Detective can't be blocked. -- When Defective Detective enters the battlefield, a person outside the game looks at target opponent's hand and chooses a card from it. That player reveals that card.
mana={2}{U}
@@ -3591,12 +3582,6 @@ mana={5}{G}
type=Sorcery
[/card]
[card]
name=Doubling Season
text=If an effect would put one or more tokens onto the battlefield under your control, it puts twice that many of those tokens onto the battlefield instead. -- If an effect would place one or more counters on a permanent you control, it places twice that many of those counters on that permanent instead.
mana={4}{G}
type=Enchantment
[/card]
[card]
name=Dovin Baan
auto=counter(0/0,3,loyalty)
text=+1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. -- -1: You gain 2 life and draw a card. -- -7: You get an emblem with "Your opponents can't untap more than two permanents during their untap steps."
@@ -14631,16 +14616,6 @@ mana={5}
type=Legendary Artifact
[/card]
[card]
name=Ulamog's Nullifier
abilities=devoid
text=Devoid (This card has no color.) -- Flash -- Flying -- When Ulamog's Nullifier enters the battlefield, you may put two cards your opponents own from exile into their owners' graveyards. If you do, counter target spell.
mana={2}{U}{B}
type=Creature
subtype=Eldrazi Processor
power=2
toughness=3
[/card]
[card]
name=Umbra Mystic
text=Auras attached to permanents you control have totem armor. (If an enchanted permanent you control would be destroyed, instead remove all damage from it and destroy an Aura attached to it.)
mana={2}{W}
@@ -14710,64 +14685,12 @@ text=Black legendary creatures you control have "bands with other legendary crea
type=Land
[/card]
[card]
name=Unifying Theory
text=Whenever a player casts a spell, that player may pay {2}. If the player does, he or she draws a card.
mana={1}{U}
type=Enchantment
[/card]
[card]
name=Unliving Psychopath
text={B}: Unliving Psychopath gets +1/-1 until end of turn. -- {B}, {T}: Destroy target creature with power less than Unliving Psychopath's power.
mana={2}{B}{B}
type=Creature
subtype=Zombie Assassin
power=0
toughness=4
[/card]
[card]
name=Unnatural Aggression
text=Devoid (This card has no color.) -- Target creature you control fights target creature an opponent controls. If the creature an opponent controls would die this turn, exile it instead.
mana={2}{G}
type=Instant
[/card]
[card]
name=Unpredictable Cyclone
text=If a cycling ability of another nonland card would cause you to draw a card, instead exile cards from the top of your library until you exile a card that shares a card type with the cycled card. You may cast that card without paying its mana cost. Then put the exiled cards that weren't cast this way on the bottom of your library in a random order. -- Cycling {2} ({2}, Discard this card: Draw a card.)
mana={3}{R}{R}
type=Enchantment
[/card]
[card]
name=Unsettled Mariner
abilities=changeling
auto=@targeted(*|mybattlefield) from(*|opponentbattlefield,opponenthand,opponentstack,opponentgraveyard,opponentexile,opponentlibrary):transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever
text=Changeling (This card is every creature type.) -- Whenever you or a permanent you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {1}.
mana={W}{U}
type=Creature
subtype=Shapeshifter
power=2
toughness=2
[/card]
[card]
name=Unstable Footing
text=Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.) -- Damage can't be prevented this turn. If Unstable Footing was kicked, it deals 5 damage to target player.
mana={R}
type=Instant
[/card]
[card]
name=Untaidake, the Cloud Keeper
text=Untaidake, the Cloud Keeper enters the battlefield tapped. -- {T}, Pay 2 life: Add {2} to your mana pool. Spend this mana only to cast legendary spells.
type=Legendary Land
[/card]
[card]
name=Urborg Panther
text={B}, Sacrifice Urborg Panther: Destroy target creature blocking Urborg Panther. -- Sacrifice a creature named Feral Shadow, a creature named Breathstealer, and Urborg Panther: Search your library for a card named Spirit of the Night and put that card onto the battlefield. Then shuffle your library.
mana={2}{B}
type=Creature
subtype=Nightstalker Cat
power=2
toughness=2
[/card]
[card]
name=Uro, Titan of Nature's Wrath
text=When Uro enters the battlefield, sacrifice it unless it escaped. -- Whenever Uro enters the battlefield or attacks, you gain 3 life and draw a card, then you may put a land card from your hand onto the battlefield. -- Escape— {G}{G}{U}{U}, Exile five other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.)
mana={1}{G}{U}
@@ -14777,12 +14700,6 @@ power=6
toughness=6
[/card]
[card]
name=Urza's Armor
text=If a source would deal damage to you, prevent 1 of that damage.
mana={6}
type=Artifact
[/card]
[card]
name=Urza's Avenger
text={0}: Urza's Avenger gets -1/-1 and gains your choice of banding, flying, first strike, or trample until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)
mana={6}
@@ -14792,12 +14709,6 @@ power=4
toughness=4
[/card]
[card]
name=Urza's Bauble
text={T}, Sacrifice Urza's Bauble: Look at a card at random in target player's hand. You draw a card at the beginning of the next turn's upkeep.
mana={0}
type=Artifact
[/card]
[card]
name=Urza's Contact Lenses
text=Urza's Contact Lenses comes into play tapped and does not untap during its controller's untap phase. -- All players play with their hands face up. -- Clap your hands twice: Tap or untap Urza's Contact Lenses.
mana={0}
@@ -14820,18 +14731,6 @@ mana={2}
type=Artifact
[/card]
[card]
name=Urza's Miter
text=Whenever an artifact you control is put into a graveyard from the battlefield, if it wasn't sacrificed, you may pay {3}. If you do, draw a card.
mana={3}
type=Artifact
[/card]
[card]
name=Urza's Rage
text=Kicker {8}{R} (You may pay an additional {8}{R} as you cast this spell.) -- Urza's Rage can't be countered by spells or abilities. -- Urza's Rage deals 3 damage to target creature or player. If Urza's Rage was kicked, instead it deals 10 damage to that creature or player and the damage can't be prevented.
mana={2}{R}
type=Instant
[/card]
[card]
name=Urza's Science Fair Project
text={2}: Roll a six-sided die for Urza's Science Fair Project. -- 1 It gets -2/-2 until end of turn. -- 2 It deals no combat damage this turn. -- 3 Attacking does not cause it to tap this turn. -- 4 It gains first strike until end of turn. -- 5 It gains flying until end of turn. -- 6 It gets +2/+2 until end of turn.
mana={6}
@@ -14872,13 +14771,6 @@ mana={W}
type=Instant
[/card]
[card]
name=Vanguard's Shield
text=Equipped creature gets +0/+3 and can block an additional creature. -- Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.)
mana={2}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Vanish into Memory
text=Exile target creature. You draw cards equal to that creature's power. At the beginning of your next upkeep, return that card to the battlefield under its owner's control. If you do, discard cards equal to its toughness.
mana={2}{W}{U}
@@ -14900,24 +14792,6 @@ mana={3}{W}
type=Enchantment
[/card]
[card]
name=Vedalken Engineer
text={T}: Add two mana of any one color to your mana pool. Spend this mana only to cast artifact spells or activate abilities of artifacts.
mana={1}{U}
type=Creature
subtype=Vedalken Artificer
power=1
toughness=1
[/card]
[card]
name=Vedalken Plotter
text=When Vedalken Plotter enters the battlefield, exchange control of target land you control and target land an opponent controls.
mana={2}{U}
type=Creature
subtype=Vedalken Wizard
power=1
toughness=1
[/card]
[card]
name=Veil of Secrecy
text=Target creature gains shroud until end of turn and is unblockable this turn. -- Splice onto Arcane—Return a blue creature you control to its owner's hand. (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={1}{U}
@@ -14931,25 +14805,12 @@ mana={G}
type=Instant
[/card]
[card]
name=Veiled Crocodile
text=When a player has no cards in hand, if Veiled Crocodile is an enchantment, Veiled Crocodile becomes a 4/4 Crocodile creature.
mana={2}{U}
type=Enchantment
[/card]
[card]
name=Veiled Sentry
text=When an opponent casts a spell, if Veiled Sentry is an enchantment, Veiled Sentry becomes an Illusion creature with power and toughness each equal to that spell's converted mana cost.
mana={U}
type=Enchantment
[/card]
[card]
name=Venarian Gold
text=Enchant creature -- When Venarian Gold enters the battlefield, tap enchanted creature and put X sleep counters on it. -- Enchanted creature doesn't untap during its controller's untap step if it has a sleep counter on it. -- At the beginning of the upkeep of enchanted creature's controller, remove a sleep counter from that creature.
mana={X}{U}{U}
type=Enchantment
subtype=Aura
[/card]
[card]
name=Vengeful Archon
abilities=flying
text=Flying -- {X}: Prevent the next X damage that would be dealt to you this turn. If damage is prevented this way, Vengeful Archon deals that much damage to target player.
@@ -14960,46 +14821,12 @@ power=7
toughness=7
[/card]
[card]
name=Vengeful Dreams
text=As an additional cost to cast Vengeful Dreams, discard X cards. -- Exile X target attacking creatures.
mana={W}{W}
type=Instant
[/card]
[card]
name=Vengeful Rebirth
text=Return target card from your graveyard to your hand. If you return a nonland card to your hand this way, Vengeful Rebirth deals damage equal to that card's converted mana cost to target creature or player. -- Exile Vengeful Rebirth.
mana={4}{R}{G}
type=Sorcery
[/card]
[card]
name=Venomous Breath
text=Choose target creature. At end of combat, destroy all creatures that blocked or were blocked by it this turn.
mana={3}{G}
type=Instant
[/card]
[card]
name=Venser, Shaper Savant
abilities=flash
text=Flash (You may cast this spell any time you could cast an instant.) -- When Venser, Shaper Savant enters the battlefield, return target spell or permanent to its owner's hand.
mana={2}{U}{U}
type=Legendary Creature
subtype=Human Wizard
power=2
toughness=2
[/card]
[card]
name=Verdant Confluence
text=Choose three. You may choose the same mode more than once. -- • Put two +1/+1 counters on target creature. -- • Return target permanent card from your graveyard to your hand. -- • Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.
mana={4}{G}{G}
type=Sorcery
[/card]
[card]
name=Verdant Crescendo
text=Search your library for a basic land card and put it onto the battlefield tapped. Search your library and graveyard for a card named Nissa, Nature's Artisan, reveal it, and put it into your hand. Then shuffle your library.
mana={3}{G}
type=Sorcery
[/card]
[card]
name=Very Cryptic Command (a)
text=Choose two — -- • Switch target creature's power and toughness until end of turn. -- • Target creature can't be blocked this turn. -- • Draw a card. If that card's art is by Wayne England, you may reveal it and draw another card. -- • Assemble a Contraption.
mana={1}{U}{U}{U}
@@ -15069,39 +14896,6 @@ mana={4}
type=Artifact
[/card]
[card]
name=Vexing Devil
text=When Vexing Devil enters the battlefield, any opponent may have it deal 4 damage to him or her. If a player does, sacrifice Vexing Devil.
mana={R}
type=Creature
subtype=Devil
power=4
toughness=3
[/card]
[card]
name=Vicious Betrayal
text=As an additional cost to cast Vicious Betrayal, sacrifice any number of creatures. -- Target creature gets +2/+2 until end of turn for each creature sacrificed this way.
mana={3}{B}{B}
type=Sorcery
[/card]
[card]
name=Victimize
text=Choose two target creature cards in your graveyard. Sacrifice a creature. If you do, return the chosen cards to the battlefield tapped.
mana={2}{B}
type=Sorcery
[/card]
[card]
name=View from Above
text=Target creature gains flying until end of turn. If you control a white permanent, return View from Above to its owner's hand.
mana={1}{U}
type=Instant
[/card]
[card]
name=Vigil for the Lost
text=Whenever a creature you control dies, you may pay {X}. If you do, you gain X life.
mana={3}{W}
type=Enchantment
[/card]
[card]
name=Vile Bile
text=Whenever a player's skin or fingernail touches Vile Bile, that player loses 2 life.
mana={1}{B}
@@ -15111,40 +14905,12 @@ power=2{1/2}
toughness=2{1/2}
[/card]
[card]
name=Vintara Elephant
abilities=trample
text=Trample -- {3}: Vintara Elephant loses trample until end of turn. Any player may activate this ability.
mana={4}{G}
type=Creature
subtype=Elephant
power=4
toughness=3
[/card]
[card]
name=Violent Eruption
text=Violent Eruption deals 4 damage divided as you choose among any number of target creatures and/or players. -- Madness {1}{R}{R} (If you discard this card, you may cast it for its madness cost instead of putting it into your graveyard.)
mana={1}{R}{R}{R}
type=Instant
[/card]
[card]
name=Virulent Wound
text=Put a -1/-1 counter on target creature. When that creature dies this turn, its controller gets a poison counter.
mana={B}
type=Instant
[/card]
[card]
name=Vision Charm
text=Choose one — Target player puts the top four cards of his or her library into his or her graveyard; or choose a land type and a basic land type, and each land of the first chosen type becomes the second chosen type until end of turn; or target artifact phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during his or her next untap step.)
mana={U}
type=Instant
[/card]
[card]
name=Visions
text=Look at the top five cards of target player's library. You may then have that player shuffle that library.
mana={W}
type=Sorcery
[/card]
[card]
name=Vital Surge
text=You gain 3 life. -- Splice onto Arcane {1}{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={1}{G}
@@ -15171,25 +14937,6 @@ power=0
toughness=4
[/card]
[card]
name=Voice of Many
text=When Voice of Many enters the battlefield, draw a card for each opponent who controls fewer creatures than you.
mana={2}{G}{G}
type=Creature
subtype=Elf Druid
power=3
toughness=3
[/card]
[card]
name=Void Maw
abilities=trample
text=Trample -- If another creature would die, exile it instead. -- Put a card exiled with Void Maw into its owner's graveyard: Void Maw gets +2/+2 until end of turn.
mana={4}{B}{B}
type=Creature
subtype=Horror
power=4
toughness=5
[/card]
[card]
name=Voidmage Husher
abilities=flash
text=Flash (You may cast this spell any time you could cast an instant.) -- When Voidmage Husher enters the battlefield, counter target activated ability. (Mana abilities can't be targeted.) -- Whenever you cast a spell, you may return Voidmage Husher to its owner's hand.
@@ -15237,18 +14984,6 @@ mana={4}{R}
type=Instant
[/card]
[card]
name=Volcanic Vision
text=Return target instant or sorcery card from your graveyard to your hand. Volcanic Vision deals damage equal to that card's converted mana cost to each creature your opponents control. Exile Volcanic Vision.
mana={5}{R}{R}
type=Sorcery
[/card]
[card]
name=Volcanic Wind
text=Volcanic Wind deals X damage divided as you choose among any number of target creatures, where X is the number of creatures on the battlefield as you cast Volcanic Wind.
mana={4}{R}{R}
type=Sorcery
[/card]
[card]
name=Volcano Hellion
text=Volcano Hellion has echo {X}, where X is your life total. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) -- When Volcano Hellion enters the battlefield, it deals an amount of damage of your choice to you and target creature. The damage can't be prevented.
mana={2}{R}{R}
@@ -15258,12 +14993,6 @@ power=6
toughness=5
[/card]
[card]
name=Volley of Boulders
text=Volley of Boulders deals 6 damage divided as you choose among any number of target creatures and/or players. -- Flashback {R}{R}{R}{R}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
mana={8}{R}
type=Sorcery
[/card]
[card]
name=Volrath's Curse
text=Enchant creature -- Enchanted creature can't attack or block, and its activated abilities can't be activated. That creature's controller may sacrifice a permanent for that player to ignore this effect until end of turn. -- {1}{U}: Return Volrath's Curse to its owner's hand.
mana={1}{U}
@@ -15271,12 +15000,6 @@ type=Enchantment
subtype=Aura
[/card]
[card]
name=Volrath's Dungeon
text=Pay 5 life: Destroy Volrath's Dungeon. Any player may activate this ability but only during his or her turn. -- Discard a card: Target player puts a card from his or her hand on top of his or her library. Activate this ability only any time you could cast a sorcery.
mana={2}{B}{B}
type=Enchantment
[/card]
[card]
name=Volrath's Motion Sensor
text=When Volrath's Motion Sensor comes into play, choose target hand controlled by an opponent. Enchanted player balances Volrath's Motion Sensor on the back of that hand. -- If Volrath's Motion Sensor falls off the hand, sacrifice Volrath's Motion Sensor and that player loses 3 life.
mana={B}
@@ -15312,15 +15035,6 @@ power=4
toughness=4
[/card]
[card]
name=Voracious Vacuum
text=When this creature enters the battlefield, put a +1/+1 counter on target creature.
mana={3}
type=Host Artifact Creature
subtype=Construct
power=1
toughness=1
[/card]
[card]
name=Vortex Elemental
text={U}: Put Vortex Elemental and each creature blocking or blocked by it on top of their owners' libraries, then those players shuffle their libraries. -- {3}{U}{U}: Target creature blocks Vortex Elemental this turn if able.
mana={U}
@@ -15340,16 +15054,6 @@ power=2
toughness=1
[/card]
[card]
name=Wall of Corpses
abilities=defender
text=Defender (This creature can't attack.) -- {B}, Sacrifice Wall of Corpses: Destroy target creature Wall of Corpses is blocking.
mana={1}{B}
type=Creature
subtype=Wall
power=0
toughness=2
[/card]
[card]
name=Wall of Deceit
abilities=defender
text=Defender (This creature can't attack.) -- {3}: Turn Wall of Deceit face down. -- Morph {U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)
@@ -15369,16 +15073,6 @@ power=0
toughness=4
[/card]
[card]
name=Wall of Glare
abilities=defender
text=Defender (This creature can't attack.) -- Wall of Glare can block any number of creatures.
mana={1}{W}
type=Creature
subtype=Wall
power=0
toughness=5
[/card]
[card]
name=Wall of Shadows
abilities=defender
text=Defender (This creature can't attack.) -- Prevent all damage that would be dealt to Wall of Shadows by creatures it's blocking. -- Wall of Shadows can't be the target of spells that can target only Walls or of abilities that can target only Walls.
@@ -15424,22 +15118,6 @@ mana={4}
type=Artifact
[/card]
[card]
name=Wandering Eye
abilities=flying
text=Flying -- Players play with their hands revealed.
mana={2}{U}
type=Creature
subtype=Illusion
power=1
toughness=3
[/card]
[card]
name=War Barge
text={3}: Target creature gains islandwalk until end of turn. When War Barge leaves the battlefield this turn, destroy that creature. A creature destroyed this way can't be regenerated.
mana={4}
type=Artifact
[/card]
[card]
name=War Elephant
abilities=trample,banding
text=Trample; banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)
@@ -15482,27 +15160,12 @@ type=Enchantment
subtype=Aura
[/card]
[card]
name=Warmonger
text={2}: Warmonger deals 1 damage to each creature without flying and each player. Any player may activate this ability.
mana={3}{R}
type=Creature
subtype=Minotaur Monger
power=3
toughness=3
[/card]
[card]
name=Warp World
text=Each player shuffles all permanents he or she owns into his or her library, then reveals that many cards from the top of his or her library. Each player puts all artifact, creature, and land cards revealed this way onto the battlefield, then does the same for enchantment cards, then puts all cards revealed this way that weren't put onto the battlefield on the bottom of his or her library.
mana={5}{R}{R}{R}
type=Sorcery
[/card]
[card]
name=Warping Wail
text=({C} represents colorless mana.) -- Choose one — -- • Exile target creature with power or toughness 1 or less. -- • Counter target sorcery spell. -- • Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {C} to your mana pool."
mana={1}{C}
type=Instant
[/card]
[card]
name=Warrior en-Kor
text={0}: The next 1 damage that would be dealt to Warrior en-Kor this turn is dealt to target creature you control instead.
mana={W}{W}
@@ -15521,16 +15184,6 @@ power=2
toughness=1
[/card]
[card]
name=Watcher in the Web
abilities=reach
text=Reach (This creature can block creatures with flying.) -- Watcher in the Web can block an additional seven creatures each combat.
mana={4}{G}
type=Creature
subtype=Spider
power=2
toughness=5
[/card]
[card]
name=Water Gun Balloon Game
text=As Water Gun Balloon Game comes into play, each player puts a pop counter on a 0. -- Whenever a player plays a spell, move that player's pop counter up 1. -- Whenever a player's pop counter hits 5, that player puts a 5/5 pink Giant Teddy Bear creature token into play and resets all pop counters to 0.
mana={2}
@@ -15548,24 +15201,12 @@ mana={5}{G}{G}
type=Sorcery
[/card]
[card]
name=Wax // Wane
text=Target creature gets +2/+2 until end of turn. -- // -- Destroy target enchantment.
mana={G} // {W}
type=Instant // Instant
[/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 // Tear
text=Destroy target artifact. -- // -- Destroy target enchantment. -- -- Fuse (You may cast one or both halves of this card from your hand.)
mana={1}{R} // {W}
type=Instant // Instant
[/card]
[card]
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.)
mana={G}{G}
@@ -15615,25 +15256,12 @@ mana={2}{U}{U}
type=Sorcery
[/card]
[card]
name=Well of Knowledge
text={2}: Draw a card. Any player may activate this ability but only during his or her draw step.
mana={3}
type=Artifact
[/card]
[card]
name=Wet Willie of the Damned
text=Wet Willie of the Damned deals 2½ damage to target creature or player and you gain 2½ life.
mana={2}{B}{B}
type=Sorcery
[/card]
[card]
name=Wheel of Sun and Moon
text=Enchant player -- If a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library.
mana={GW}{GW}
type=Enchantment
subtype=Aura
[/card]
[card]
name=When Fluffy Bunnies Attack
text=Target creature gets -X/-X until end of turn, where X is the number of times the letter of your choice appears in that creature's name.
mana={3}{B}
@@ -15740,15 +15368,6 @@ text=Who -- {X}{W} -- Instant -- Target player gains X life. -- ----- -- What --
type=Instant
[/card]
[card]
name=Wicked Akuba
text={B}: Target player dealt damage by Wicked Akuba this turn loses 1 life.
mana={B}{B}
type=Creature
subtype=Spirit
power=2
toughness=2
[/card]
[card]
name=Widespread Panic
text=Whenever a spell or ability causes its controller to shuffle his or her library, that player puts a card from his or her hand on top of his or her library.
mana={2}{R}
@@ -15761,27 +15380,12 @@ type=Artifact
subtype=Contraption
[/card]
[card]
name=Wild Crocodile
text=When this creature enters the battlefield, search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.
mana={1}{G}
type=Host Creature
subtype=Crocodile
power=1
toughness=1
[/card]
[card]
name=Wild Evocation
text=At the beginning of each player's upkeep, that player reveals a card at random from his or her hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
mana={5}{R}
type=Enchantment
[/card]
[card]
name=Wild Might
text=Target creature gets +1/+1 until end of turn. That creature gets an additional +4/+4 until end of turn unless any player pays {2}.
mana={1}{G}
type=Instant
[/card]
[card]
name=Wild Pair
text=Whenever a creature enters the battlefield, if you cast it from your hand, you may search your library for a creature card with the same total power and toughness and put it onto the battlefield. If you do, shuffle your library.
mana={4}{G}{G}
@@ -15794,12 +15398,6 @@ mana={2}{R}{R}
type=Instant
[/card]
[card]
name=Wild Slash
text=Ferocious — If you control a creature with power 4 or greater, damage can't be prevented this turn. -- Wild Slash deals 2 damage to target creature or player.
mana={R}
type=Instant
[/card]
[card]
name=Wild Swing
text=Choose three target nonenchantment permanents. Destroy one of them at random.
mana={3}{R}
@@ -15857,28 +15455,12 @@ type=Plane
subtype=Belenon
[/card]
[card]
name=Winds of Abandon
abilities=overload
other={4}{W}{W} name(Overload)
target=creature|opponentbattlefield
auto=moveto(exile)
text=Exile target creature you don't control. For each creature exiled this way, its controller searches their library for a basic land card. Those players put those cards onto the battlefield tapped, then shuffle their libraries. -- Overload {4}{W}{W} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.")
mana={1}{W}
type=Sorcery
[/card]
[card]
name=Winter's Chill
text=Cast Winter's Chill only during combat before blockers are declared. -- X can't be greater than the number of snow lands you control. -- Choose X target attacking creatures. For each of those creatures, its controller may pay {1} or {2}. If that player doesn't, destroy that creature at end of combat. If that player pays only {1}, prevent all combat damage that would be dealt to and dealt by that creature this combat.
mana={X}{U}
type=Instant
[/card]
[card]
name=Winterflame
text=Choose one or both — -- • Tap target creature. -- • Winterflame deals 2 damage to target creature.
mana={1}{U}{R}
type=Instant
[/card]
[card]
name=Wishmonger
text={2}: Target creature gains protection from the color of its controller's choice until end of turn. Any player may activate this ability.
mana={3}{W}
@@ -15888,12 +15470,6 @@ power=3
toughness=3
[/card]
[card]
name=Withdraw
text=Return target creature to its owner's hand. Then return another target creature to its owner's hand unless its controller pays {1}.
mana={U}{U}
type=Instant
[/card]
[card]
name=Wojek Apothecary
text=Radiance — {T}: Prevent the next 1 damage that would be dealt to target creature and each other creature that shares a color with it this turn.
mana={2}{W}{W}
@@ -16028,16 +15604,6 @@ mana={4}{WU}{WU}{WU}{WU}
type=Sorcery
[/card]
[card]
name=Wormfang Crab
abilities=unblockable.
text=Wormfang Crab is unblockable. -- When Wormfang Crab enters the battlefield, an opponent chooses a permanent you control other than Wormfang Crab and exiles it. -- When Wormfang Crab leaves the battlefield, return the exiled card to the battlefield under its owner's control.
mana={3}{U}
type=Creature
subtype=Nightmare Crab
power=3
toughness=6
[/card]
[card]
name=Worms of the Earth
text=Players can't play lands. -- Lands can't enter the battlefield. -- At the beginning of each upkeep, any player may sacrifice two lands or have Worms of the Earth deal 5 damage to him or her. If a player does either, destroy Worms of the Earth.
mana={2}{B}{B}{B}
@@ -16079,12 +15645,6 @@ type=Legendary Planeswalker
subtype=Wrenn
[/card]
[card]
name=Wretched Confluence
text=Choose three. You may choose the same mode more than once. -- • Target player draws a card and loses 1 life. -- • Target creature gets -2/-2 until end of turn. -- • Return target creature card from your graveyard to your hand.
mana={3}{B}{B}
type=Instant
[/card]
[card]
name=Write into Being
text=Look at the top two cards of your library. Manifest one of those cards, then put the other on the top or bottom of your library. (To manifest a card, put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.)
mana={2}{U}
@@ -16100,21 +15660,6 @@ power=2
toughness=2
[/card]
[card]
name=Xenic Poltergeist
text={T}: Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost.
mana={1}{B}{B}
type=Creature
subtype=Spirit
power=1
toughness=1
[/card]
[card]
name=Yare
text=Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn.
mana={2}{W}
type=Instant
[/card]
[card]
name=Yarok, the Desecrated
text=Deathtouch, lifelink -- If a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.
mana={2}{B}{G}{U}
@@ -16240,16 +15785,6 @@ power=2
toughness=4
[/card]
[card]
name=Zerapa Minotaur
abilities=first strike
text=First strike -- {2}: Zerapa Minotaur loses first strike until end of turn. Any player may activate this ability.
mana={2}{R}{R}
type=Creature
subtype=Minotaur
power=3
toughness=3
[/card]
[card]
name=Zhalfirin Crusader
abilities=flanking
text=Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -- {1}{W}: The next 1 damage that would be dealt to Zhalfirin Crusader this turn is dealt to target creature or player instead.

View File

@@ -578,13 +578,9 @@ private:
{
intValue = card->controller()->opponent()->energyCount;
}
else if (s == "pyidarocount")
else if (s == "pyidarocount" || s == "oyidarocount")
{
intValue = card->controller()->yidaroCount;
}
else if (s == "oyidarocount")
{
intValue = card->controller()->opponent()->yidaroCount;
intValue = (s == "pyidarocount")?card->controller()->yidaroCount:card->controller()->opponent()->yidaroCount;
}
else if (s == "praidcount")
{
@@ -1672,6 +1668,29 @@ public:
}
};
class TrTokenCreated: public Trigger
{
public:
bool thiscontroller, thisopponent;
TrTokenCreated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) :
Trigger(observer, id, source,once, tc)
{
}
int triggerOnEventImpl(WEvent * event)
{
WEventTokenCreated * e = dynamic_cast<WEventTokenCreated *> (event);
if (!e) return 0;
if (!tc->canTarget(e->card)) return 0;
return 1;
}
TrTokenCreated * clone() const
{
return NEW TrTokenCreated(*this);
}
};
class TrCardSacrificed: public Trigger
{
public:
@@ -1920,8 +1939,10 @@ class TrCounter: public Trigger
public:
Counter * counter;
int type;
TrCounter(GameObserver* observer, int id, MTGCardInstance * source, Counter * counter, TargetChooser * tc, int type = 0,bool once = false) :
Trigger(observer, id, source, once, tc),counter(counter), type(type)
bool duplicate;
MTGCardInstance * counterException; //added exception to avid a counter loop (eg. Doubling Season)
TrCounter(GameObserver* observer, int id, MTGCardInstance * source, Counter * counter, TargetChooser * tc, int type = 0, bool once = false, bool duplicate = false, MTGCardInstance * counterException = NULL) :
Trigger(observer, id, source, once, tc), counter(counter), type(type), duplicate(duplicate), counterException(counterException)
{
}
@@ -1931,8 +1952,15 @@ public:
if (!e) return 0;
if (type == 0 && !e->removed) return 0;
if (type == 1 && !e->added) return 0;
if (!(e->power == counter->power && e->toughness == counter->toughness && e->name == counter->name)) return 0;
if (counterException && e->source && !strcmp(counterException->data->name.c_str(), e->source->data->name.c_str())) return 0; //If the source of counter gain/loss it's the exception card it doesn't have effect (loop avoidance);
if (counter && !(e->power == counter->power && e->toughness == counter->toughness && e->name == counter->name)) return 0;
if (tc && !tc->canTarget(e->targetCard)) return 0;
if (duplicate){
if(type == 1)
e->targetCard->counters->addCounter(e->name.c_str(),e->power,e->toughness,true,true,e->source);
else
e->targetCard->counters->removeCounter(counter->name.c_str(),counter->power,counter->toughness,true,true,e->source);
}
return 1;
}
@@ -2147,13 +2175,35 @@ class AAProliferate: public ActivatedAbility
{
public:
bool allcounters;
AAProliferate(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,ManaCost * cost = NULL);
AAProliferate(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost = NULL);
int resolve();
const string getMenuText();
AAProliferate * clone() const;
~AAProliferate();
};
class AADuplicateCounters: public ActivatedAbility
{
public:
bool allcounters;
AADuplicateCounters(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost = NULL);
int resolve();
const string getMenuText();
AADuplicateCounters * clone() const;
~AADuplicateCounters();
};
class AARemoveSingleCounter: public ActivatedAbility
{
public:
int nb;
AARemoveSingleCounter(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost = NULL, int nb = 1);
int resolve();
const string getMenuText();
AARemoveSingleCounter * clone() const;
~AARemoveSingleCounter();
};
//MultiAbility : triggers several actions for a cost
class MultiAbility: public ActivatedAbility
{
@@ -2243,13 +2293,14 @@ public:
int who;
string with;
string types;
string options;
list<int> awith;
list<int> colors;
list<int> typesToAdd;
MTGAbility * andAbility;
AACloner(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL, int who = 0,
string abilitiesStringList = "",string typeslist = "");
string abilitiesStringList = "", string typeslist = "", string optionsList = "");
int resolve();
const string getMenuText();
virtual ostream& toString(ostream& out) const;
@@ -4060,6 +4111,8 @@ public:
andAbilityClone->addToGame();
}
}
WEvent * e = NEW WEventTokenCreated(myToken);
source->getObserver()->receiveEvent(e); // triggers the @tokencreated event for any other listener.
delete spell;
}
return 1;
@@ -7035,7 +7088,7 @@ public:
bool noEvent;
bool putinplay;
bool asNormalMadness;
bool alternative;
bool alternative;
AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay,bool asNormalMadness = false,bool alternative = false);
int testDestroy(){return 0;};

View File

@@ -19,7 +19,7 @@ public:
int init(MTGCardInstance * _target, const char * _name, int _power, int _toughness);
bool sameAs(const char * _name, int _power, int _toughness);
bool cancels(int _power, int _toughness);
int cancelCounter(int power, int toughness);
int cancelCounter(int power, int toughness, MTGCardInstance * _source);
int added();
int removed();
};
@@ -29,14 +29,14 @@ class Counters
{
public:
int mCount;
vector<Counter *>counters;
vector<Counter *>counters;
MTGCardInstance * target;
Counters(MTGCardInstance * _target);
~Counters();
int addCounter(const char * _name, int _power = 0, int _toughness = 0, bool _noevent = false);
int addCounter(const char * _name, int _power = 0, int _toughness = 0, bool _noevent = false, bool duplicated = false, MTGCardInstance * _source = NULL);
int addCounter(int _power, int _toughness);
int addCounter(int _power, int _toughness, bool _noevent);
int removeCounter(const char * _name, int _power = 0, int _toughness = 0);
int removeCounter(const char * _name, int _power = 0, int _toughness = 0, bool _noevent = false, bool duplicated = false, MTGCardInstance * _source = NULL);
int removeCounter(int _power, int _toughness);
Counter * hasCounter(const char * _name, int _power = 0, int _toughness = 0);
Counter * hasCounter(int _power, int _toughness);

View File

@@ -63,7 +63,8 @@ struct WEventCounters : public WEvent {
int toughness;
bool added;
bool removed;
WEventCounters(Counters *counter,string name,int power, int toughness,bool added = false, bool removed = false);
MTGCardInstance * source;
WEventCounters(Counters *counter,string name,int power, int toughness,bool added = false, bool removed = false, MTGCardInstance * source = NULL);
using WEvent::getTarget;
virtual Targetable * getTarget();
};
@@ -357,6 +358,12 @@ struct WEventCardMutated : public WEventCardUpdate {
virtual Targetable * getTarget(int target);
};
//token creation event
struct WEventTokenCreated : public WEventCardUpdate {
WEventTokenCreated(MTGCardInstance * card);
virtual Targetable * getTarget(int target);
};
std::ostream& operator<<(std::ostream&, const WEvent&);
#endif

View File

@@ -1894,7 +1894,7 @@ AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, M
}
if(!maxNb || (maxNb && currentAmount < maxNb))
{
_target->counters->addCounter(name.c_str(), power, toughness);
_target->counters->addCounter(name.c_str(), power, toughness, false, false, source);
}
}
}
@@ -1904,7 +1904,7 @@ AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, M
{
while (_target->next)
_target = _target->next;
_target->counters->removeCounter(name.c_str(), power, toughness);
_target->counters->removeCounter(name.c_str(), power, toughness, false, false, source);
}
}
@@ -1920,7 +1920,7 @@ AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, M
{
if (_target->counters->counters[i]->cancels(power, toughness) && !name.size() && _target->counters->counters[i]->nb > 0)
{
_target->counters->counters[i]->cancelCounter(power,toughness);
_target->counters->counters[i]->cancelCounter(power,toughness, source);
}
}
}
@@ -2157,8 +2157,147 @@ AARemoveAllCounter * AARemoveAllCounter::clone() const
return NEW AARemoveAllCounter(*this);
}
//remove a single counter of a spefic kind chosen by user
AARemoveSingleCounter::AARemoveSingleCounter(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost, int nb) :
ActivatedAbility(observer, id, source, cost, 0), nb(nb)
{
this->GetId();
}
int AARemoveSingleCounter::resolve()
{
if (!target)
return 0;
vector<MTGAbility*>pcounters;
Player * pTarget = dynamic_cast<Player *>(target);
MTGCardInstance * cTarget = dynamic_cast<MTGCardInstance *>(target);
if(pTarget && pTarget->poisonCount)
{
MTGAbility * a = NEW AAAlterPoison(game, game->mLayers->actionLayer()->getMaxId(), source, target, -nb, NULL);
a->oneShot = true;
pcounters.push_back(a);
}
else if(pTarget && pTarget->energyCount)
{
MTGAbility * a = NEW AAAlterEnergy(game, game->mLayers->actionLayer()->getMaxId(), source, target, -nb, NULL);
a->oneShot = true;
pcounters.push_back(a);
}
else if (cTarget && cTarget->counters)
{
Counters * counters = cTarget->counters;
for(size_t i = 0; i < counters->counters.size(); ++i)
{
Counter * counter = counters->counters[i];
MTGAbility * a = NEW AACounter(game, game->mLayers->actionLayer()->getMaxId(), source, cTarget,"", counter->name.c_str(), counter->power, counter->toughness, -nb, 0);
a->oneShot = true;
pcounters.push_back(a);
}
}
if(pcounters.size())
{
MTGAbility * a = NEW MenuAbility(game, this->GetId(), target, source,false,pcounters);
a->resolve();
}
return 1;
}
const string AARemoveSingleCounter::getMenuText()
{
return "Remove single specific counter";
}
AARemoveSingleCounter * AARemoveSingleCounter::clone() const
{
return NEW AARemoveSingleCounter(*this);
}
AARemoveSingleCounter::~AARemoveSingleCounter()
{
}
//duplicate counters
AADuplicateCounters::AADuplicateCounters(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost) :
ActivatedAbility(observer, id, source, cost, 0)
{
this->GetId();
allcounters = false;
}
int AADuplicateCounters::resolve()
{
if (!target)
return 0;
vector<MTGAbility*>pcounters;
Player * pTarget = dynamic_cast<Player *>(target);
MTGCardInstance * cTarget = dynamic_cast<MTGCardInstance *>(target);
if(pTarget && pTarget->poisonCount)
{
MTGAbility * a = NEW AAAlterPoison(game, game->mLayers->actionLayer()->getMaxId(), source, target, pTarget->poisonCount, NULL);
a->oneShot = true;
pcounters.push_back(a);
}
else if(pTarget && pTarget->energyCount)
{
MTGAbility * a = NEW AAAlterEnergy(game, game->mLayers->actionLayer()->getMaxId(), source, target, pTarget->energyCount, NULL);
a->oneShot = true;
pcounters.push_back(a);
}
else if (cTarget && cTarget->counters)
{
Counters * counters = cTarget->counters;
for(size_t i = 0; i < counters->counters.size(); ++i)
{
Counter * counter = counters->counters[i];
MTGAbility * a = NEW AACounter(game, game->mLayers->actionLayer()->getMaxId(), source, cTarget,"", counter->name.c_str(), counter->power, counter->toughness, counter->nb, 0);
a->oneShot = true;
pcounters.push_back(a);
}
}
if(pcounters.size())
{
if(allcounters)
{
for(size_t j = 0; j < pcounters.size(); j++)
{
pcounters[j]->resolve();
}
}
else
{
MTGAbility * a = NEW MenuAbility(game, this->GetId(), target, source,false,pcounters);
a->resolve();
}
}
return 1;
}
const string AADuplicateCounters::getMenuText()
{
if(allcounters)
return "Duplicate all Counters";
return "Duplicate specific Counters";
}
AADuplicateCounters * AADuplicateCounters::clone() const
{
return NEW AADuplicateCounters(*this);
}
AADuplicateCounters::~AADuplicateCounters()
{
}
//proliferate a target
AAProliferate::AAProliferate(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,ManaCost * cost) :
AAProliferate::AAProliferate(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, ManaCost * cost) :
ActivatedAbility(observer, id, source, cost, 0)
{
this->GetId();
@@ -2193,7 +2332,7 @@ int AAProliferate::resolve()
for(size_t i = 0; i < counters->counters.size(); ++i)
{
Counter * counter = counters->counters[i];
MTGAbility * a = NEW AACounter(game, game->mLayers->actionLayer()->getMaxId(), source, cTarget,"", counter->name.c_str(), counter->power, counter->toughness, 1,0);
MTGAbility * a = NEW AACounter(game, game->mLayers->actionLayer()->getMaxId(), source, cTarget,"", counter->name.c_str(), counter->power, counter->toughness, 1, 0);
a->oneShot = true;
pcounters.push_back(a);
}
@@ -4366,12 +4505,13 @@ AALifeSet::~AALifeSet()
//AACloner
//cloning...this makes a token thats a copy of the target.
AACloner::AACloner(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, ManaCost * _cost, int who,
string abilitiesStringList,string TypesList) :
string abilitiesStringList, string TypesList, string optionsList) :
ActivatedAbility(observer, _id, _source, _cost, 0), who(who)
{
aType = MTGAbility::CLONING;
target = _target;
source = _source;
options = optionsList;
if (abilitiesStringList.size() > 0)
{
PopulateAbilityIndexVector(awith, abilitiesStringList);
@@ -4497,6 +4637,10 @@ int AACloner::resolve()
andAbilityClone->addToGame();
}
}
if(options.find("notrigger") == string::npos){ // check if the @tokencreated trigger has to be activated or not
WEvent * e = NEW WEventTokenCreated(spell->source);
source->getObserver()->receiveEvent(e); // triggers the @tokencreated event for any other listener.
}
delete spell;
}
return 1;

View File

@@ -38,14 +38,14 @@ bool Counter::cancels(int _power, int _toughness)
return (power == -_power && toughness == -_toughness);
}
int Counter::cancelCounter(int power, int toughness)
int Counter::cancelCounter(int power, int toughness, MTGCardInstance * _source)
{
while(this->target->counters->hasCounter(power,toughness) && this->target->counters->hasCounter(power*-1,toughness*-1))
{
GameObserver *g = this->target->getObserver();
this->removed();
this->nb--;
WEvent * t = NEW WEventCounters(NULL,"",power*-1,toughness*-1,false,true);
WEvent * t = NEW WEventCounters(NULL,"",power*-1,toughness*-1,false,true,_source);
dynamic_cast<WEventCounters*>(t)->targetCard = this->target;
g->receiveEvent(t);
this->target->counters->removeCounter(power,toughness);
@@ -98,7 +98,7 @@ Counters::~Counters()
}
}
int Counters::addCounter(const char * _name, int _power, int _toughness, bool _noevent)
int Counters::addCounter(const char * _name, int _power, int _toughness, bool _noevent, bool duplicated, MTGCardInstance * _source)
{
/*420.5n If a permanent has both a +1/+1 counter and a -1/-1 counter on it, N +1/+1 and N -1/-1 counters are removed from it, where N is the smaller of the number of +1/+1 and -1/-1 counters on it.*/
GameObserver *g = target->getObserver();
@@ -112,9 +112,12 @@ int Counters::addCounter(const char * _name, int _power, int _toughness, bool _n
{
counters[i]->added();
counters[i]->nb++;
WEvent * j = NEW WEventCounters(this,_name,_power,_toughness,true,false);
dynamic_cast<WEventCounters*>(j)->targetCard = this->target;
g->receiveEvent(j);
if (!duplicated)
{
WEvent * j = NEW WEventCounters(this,_name,_power,_toughness,true,false,_source);
dynamic_cast<WEventCounters*>(j)->targetCard = this->target;
g->receiveEvent(j);
}
delete(e);
return mCount;
}
@@ -122,13 +125,13 @@ int Counters::addCounter(const char * _name, int _power, int _toughness, bool _n
Counter * counter = NEW Counter(target, _name, _power, _toughness);
counters.push_back(counter);
counter->added();
if (!_noevent)
mCount++;
if (!_noevent && !duplicated)
{
WEvent * w = NEW WEventCounters(this,_name,_power,_toughness,true,false);
WEvent * w = NEW WEventCounters(this,_name,_power,_toughness,true,false,_source);
dynamic_cast<WEventCounters*>(w)->targetCard = this->target;
g->receiveEvent(w);
}
mCount++;
/*the damage test should be handled on game state based effect i think*/
//this->target->doDamageTest = 1;
//this->target->afterDamage();
@@ -160,7 +163,7 @@ int Counters::init()
return 1;
}
int Counters::removeCounter(const char * _name, int _power, int _toughness)
int Counters::removeCounter(const char * _name, int _power, int _toughness, bool _noevent, bool duplicated, MTGCardInstance * _source)
{
for (int i = 0; i < mCount; i++)
{
@@ -172,10 +175,12 @@ int Counters::removeCounter(const char * _name, int _power, int _toughness)
counters[i]->removed();
counters[i]->nb--;
GameObserver *g = target->getObserver();
WEvent * e = NEW WEventCounters(this,_name,_power,_toughness,false,true);
dynamic_cast<WEventCounters*>(e)->targetCard = this->target;
g->receiveEvent(e);
if (!_noevent && !duplicated)
{
WEvent * e = NEW WEventCounters(this,_name,_power,_toughness,false,true,_source);
dynamic_cast<WEventCounters*>(e)->targetCard = this->target;
g->receiveEvent(e);
}
// special case: when the last time counter is removed from non-suspended card
// sacrifice that card
if (!target->suspended && counters[i]->name == "time" && counters[i]->nb == 0) {

View File

@@ -1072,9 +1072,8 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
fromTc = tcf.createTargetChooser(starget, card);
fromTc->targetter = NULL; //avoid protection from
}
TriggeredAbility * mover = NEW TrCardAddedToZone(observer, id, card, (TargetZoneChooser *) toTc,
toTcCard, (TargetZoneChooser *) fromTc, fromTcCard, once, sourceUntapped, isSuspended, limitOnceATurn);
if(neverRemove)
TriggeredAbility * mover = NEW TrCardAddedToZone(observer, id, card, (TargetZoneChooser *) toTc, toTcCard, (TargetZoneChooser *) fromTc, fromTcCard, once, sourceUntapped, isSuspended, limitOnceATurn);
if(neverRemove && mover)
{
mover->forcedAlive = 1;
mover->forceDestroy = -1;
@@ -1172,6 +1171,10 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
//Card is mutated
if (TargetChooser * tc = parseSimpleTC(s, "mutated", card))
return NEW TrCardMutated(observer, id, card, tc,once);
//Token has been created
if (TargetChooser * tc = parseSimpleTC(s, "tokencreated", card))
return NEW TrTokenCreated(observer, id, card, tc,once);
//Card is sacrificed
if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card))
@@ -1331,17 +1334,35 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
if (s.find("counteradded(") != string::npos)
{
vector<string>splitCounter = parseBetween(s,"counteradded(",")");
Counter * counter = parseCounter(splitCounter[1],card,NULL);
Counter * counter = NULL;
bool duplicate = false;
if(s.find("(duplicateall)") != string::npos)
duplicate = true;
else if(s.find("(any)") == string::npos)
counter = parseCounter(splitCounter[1],card,NULL);
TargetChooser * tc = parseSimpleTC(s, "from", card);
return NEW TrCounter(observer, id, card, counter, tc, 1,once);
TargetChooser *exception = parseSimpleTC(s, "except", card); // Added a new keyword except to specify a counter add/remove exception in order to avoid counter loop (eg. Doubling Season)
if(exception)
return NEW TrCounter(observer, id, card, counter, tc, 1, once, duplicate, exception->source);
else
return NEW TrCounter(observer, id, card, counter, tc, 1, once, duplicate);
}
if (s.find("counterremoved(") != string::npos)
{
vector<string>splitCounter = parseBetween(s,"counterremoved(",")");
Counter * counter = parseCounter(splitCounter[1],card,NULL);
Counter * counter = NULL;
bool duplicate = false;
if(s.find("(duplicateall)") != string::npos)
duplicate = true;
else if(s.find("(any)") == string::npos)
counter = parseCounter(splitCounter[1],card,NULL);
TargetChooser * tc = parseSimpleTC(s, "from", card);
return NEW TrCounter(observer, id, card, counter, tc, 0,once);
TargetChooser *exception = parseSimpleTC(s, "except", card); // Added a new keyword except to specify a counter add/remove exception in order to avoid counter loop (eg. Doubling Season)
if(exception)
return NEW TrCounter(observer, id, card, counter, tc, 0, once, duplicate, exception->source);
else
return NEW TrCounter(observer, id, card, counter, tc, 0, once, duplicate);
}
int who = 0;
@@ -3047,6 +3068,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
{
string with = "";
string types = "";
string options = "";
vector<string> splitWith = parseBetween(s, "with(", ")");
if (splitWith.size())
{
@@ -3057,7 +3079,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
{
types = splitTypes[1];
}
MTGAbility * a = NEW AACloner(observer, id, card, target, 0, who, with,types);
vector<string> splitOptions = parseBetween(s, "options(", ")");
if (splitOptions.size())
{
options = splitOptions[1];
}
MTGAbility * a = NEW AACloner(observer, id, card, target, 0, who, with, types, options);
a->oneShot = 1;
if(storedAndAbility.size())
{
@@ -3132,7 +3159,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
bool asNormalMadness = splitCastCard[1].find("madness") != string::npos;
bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos;
bool putinplay = splitCastCard[1].find("putinplay") != string::npos;
bool alternative = splitCastCard[1].find("alternative") != string::npos;
bool alternative = splitCastCard[1].find("alternative") != string::npos;
string nameCard = "";
if(splitCastCard[1].find("named!:") != string::npos)
{
@@ -3719,6 +3746,28 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
string splitCounterTrack = splitCounterTracking[1];
return NEW ACounterTracker(observer, id, card, target,splitCounterTrack);
}
//duplicate counters
vector<string> splitDuplicateCounters = parseBetween(s, "duplicatecounters(", ")");
if (splitDuplicateCounters.size())
{
MTGAbility * a = NEW AADuplicateCounters(observer, id, card, target, NULL);
a->oneShot = 1;
a->canBeInterrupted = false;
string counterString = splitDuplicateCounters[1];
if(counterString.find("all") != string::npos)
((AADuplicateCounters*)a)->allcounters = true;
return a;
}
//remove single counter of any type
vector<string> splitRemoveSpecificCounters = parseBetween(s, "removesinglecountertype(", ")");
if (splitRemoveSpecificCounters.size())
{
int nb = atoi(splitRemoveSpecificCounters[1].c_str());
MTGAbility * a = NEW AARemoveSingleCounter(observer, id, card, target, NULL, nb);
a->oneShot = 1;
a->canBeInterrupted = false;
return a;
}
//removes all counters of the specifified type.
vector<string> splitRemoveCounter = parseBetween(s, "removeallcounters(", ")");
if (splitRemoveCounter.size())
@@ -4176,7 +4225,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
((AAProliferate*)a)->allcounters = true;
return a;
}
//frozen, next untap this does not untap.
found = s.find("frozen");
if (found != string::npos)

View File

@@ -911,7 +911,7 @@ int MTGAlternativeCostRule::reactToClick(MTGCardInstance * card, ManaCost *alter
ManaCost * Xcost = NEW ManaCost();
Xcost->copy(alternateCost);
Xcost->add(Constants::MTG_COLOR_ARTIFACT, card->setX);
card->X = card->setX; // Fix to don't loose X value on alternative cast
card->X = card->setX; // Fix to don't loose X value on alternative cast
Xcost->remove(7, 1);//remove the X
if (playerMana->canAfford(Xcost))
{
@@ -3414,7 +3414,7 @@ int MTGNewLegend::receiveEvent(WEvent * e)
{
if(card->basicAbilities[(int)Constants::MUTATE] && card->alternateCostPaid[(int)ManaCost::MANA_PAID_WITH_ALTERNATIVE])
return 0; // The Leged rule for Mutating card will be checked later just if it's a Mutation Over choice
CheckLegend(card);
CheckLegend(card);
return 1;
}
}

View File

@@ -43,8 +43,8 @@ WEventCardUpdate::WEventCardUpdate(MTGCardInstance * card) :
}
;
WEventCounters::WEventCounters(Counters *counter,string name,int power,int toughness,bool added,bool removed) :
WEvent(),counter(counter),name(name),power(power),toughness(toughness),added(added),removed(removed)
WEventCounters::WEventCounters(Counters *counter,string name,int power,int toughness,bool added,bool removed, MTGCardInstance* source) :
WEvent(),counter(counter),name(name),power(power),toughness(toughness),added(added),removed(removed),source(source)
{
}
@@ -291,6 +291,11 @@ WEventCardMutated::WEventCardMutated(MTGCardInstance * card) :
WEventCardUpdate(card)
{
}
WEventTokenCreated::WEventTokenCreated(MTGCardInstance * card) :
WEventCardUpdate(card)
{
}
;
Targetable * WEventDamage::getTarget(int target)
@@ -495,6 +500,12 @@ Targetable * WEventCardMutated::getTarget(int target)
return NULL;
}
Targetable * WEventTokenCreated::getTarget(int target)
{
if (target) return card;
return NULL;
}
Targetable * WEventplayerEnergized::getTarget(Player * player)
{
if (player) return player;