From bf3d35463f88428028de6e1f45115a2ed3539946 Mon Sep 17 00:00:00 2001 From: valfieri Date: Mon, 14 Dec 2020 19:20:05 +0100 Subject: [PATCH] Added commander mode achievement and improved its graphic resources, added fixed primitives, fixes RNA set file, added new keyword and events to code the ability of six-side die roll. --- JGE/include/JGui.h | 1 + .../bin/Res/graphics/commander_unlocked.png | Bin 0 -> 160253 bytes projects/mtg/bin/Res/sets/RNA/_cards.dat | 70 +- .../bin/Res/sets/primitives/borderline.txt | 896 +++++++++++++++++- projects/mtg/bin/Res/sets/primitives/mtg.txt | 9 +- .../bin/Res/sets/primitives/planeswalkers.txt | 6 +- .../bin/Res/sets/primitives/unsupported.txt | 106 +-- projects/mtg/include/AllAbilities.h | 67 +- projects/mtg/include/Credits.h | 1 + projects/mtg/include/GameOptions.h | 1 + projects/mtg/include/GameStateDuel.h | 1 + projects/mtg/include/MTGCardInstance.h | 4 +- projects/mtg/include/WEvent.h | 6 + projects/mtg/src/AllAbilities.cpp | 164 +++- projects/mtg/src/Credits.cpp | 15 + projects/mtg/src/DeckMenuItem.cpp | 3 + projects/mtg/src/GameOptions.cpp | 1 + projects/mtg/src/GameStateAwards.cpp | 4 + projects/mtg/src/GameStateMenu.cpp | 6 + projects/mtg/src/MTGAbility.cpp | 39 +- projects/mtg/src/MTGCardInstance.cpp | 2 + projects/mtg/src/WEvent.cpp | 11 + 22 files changed, 1224 insertions(+), 189 deletions(-) create mode 100644 projects/mtg/bin/Res/graphics/commander_unlocked.png diff --git a/JGE/include/JGui.h b/JGE/include/JGui.h index 2d263ded1..faf6e2f4b 100644 --- a/JGE/include/JGui.h +++ b/JGE/include/JGui.h @@ -30,6 +30,7 @@ const int kInfoMenuID = -200; const int kRandomPlayerMenuID = -11; const int kRandomAIPlayerMenuID = -12; const int kEvilTwinMenuID = -14; +const int kCommanderMenuID = -33; class JGuiListener { diff --git a/projects/mtg/bin/Res/graphics/commander_unlocked.png b/projects/mtg/bin/Res/graphics/commander_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..899a2b50b64589dcd80f6a17e3b2051af4f52dc4 GIT binary patch literal 160253 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 E3yc|sX#fBK literal 0 HcmV?d00001 diff --git a/projects/mtg/bin/Res/sets/RNA/_cards.dat b/projects/mtg/bin/Res/sets/RNA/_cards.dat index 3d14cfbe3..1b0c74d6d 100644 --- a/projects/mtg/bin/Res/sets/RNA/_cards.dat +++ b/projects/mtg/bin/Res/sets/RNA/_cards.dat @@ -1105,102 +1105,52 @@ id=457364 rarity=C [/card] [card] -primitive=Bedazzle +primitive=Bedeck // Bedazzle id=457365 rarity=R [/card] [card] -primitive=Bedeck -id=457365 -rarity=R -[/card] -[card] -primitive=Carnage +primitive=Carnival // Carnage id=457366 rarity=U [/card] [card] -primitive=Carnival -id=457366 -rarity=U -[/card] -[card] -primitive=Colossus +primitive=Collision // Colossus id=457367 rarity=U [/card] [card] -primitive=Collision -id=457367 -rarity=U -[/card] -[card] -primitive=Consume +primitive=Consecrate // Consume id=457368 rarity=U [/card] [card] -primitive=Consecrate -id=457368 -rarity=U -[/card] -[card] -primitive=Deploy +primitive=Depose // Deploy id=457369 rarity=U [/card] [card] -primitive=Depose -id=457369 -rarity=U -[/card] -[card] -primitive=Incongruity +primitive=Incubation // Incongruity id=457370 rarity=U [/card] [card] -primitive=Incubation -id=457370 -rarity=U -[/card] -[card] -primitive=Replicate +primitive=Repudiate // Replicate id=457371 rarity=R [/card] [card] -primitive=Repudiate -id=457371 -rarity=R -[/card] -[card] -primitive=Revenge +primitive=Revival // Revenge id=457372 rarity=R [/card] [card] -primitive=Revival -id=457372 -rarity=R -[/card] -[card] -primitive=Threat +primitive=Thrash // Threat id=457373 rarity=R [/card] [card] -primitive=Thrash -id=457373 -rarity=R -[/card] -[card] -primitive=Warden -id=457374 -rarity=R -[/card] -[card] -primitive=Warrant +primitive=Warrant // Warden id=457374 rarity=R [/card] diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 890766b69..d9bb69531 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -1043,6 +1043,16 @@ power=3 toughness=3 [/card] [card] +name=Amplifire +auto=@each my upkeep:counter(0/0,1,Effect) && name(Reveal cards) Reveal:1 revealzone(mylibrary) revealuntil(creature|mylibrary) optionone choice name(Choose creature) target(creature|reveal) transforms((,newability[thisforeach(variable{power}) all(Amplifire[counter{0/0.1.Effect}]|mybattlefield) 2/2 uynt],newability[all(Amplifire[counter{0/0.1.Effect}]|mybattlefield) -1/-1 uynt])) forever optiononeend optiontwo choice name(put on bottom) all(*|reveal) bottomoflibrary optiontwoend afterrevealed all(Amplifire[counter{0/0.1.Effect}]|mybattlefield) counter(0/0,-1,Effect) afterrevealedend revealend +text=At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, Amplifire's base power becomes twice that card's power and its base toughness becomes twice that card's toughness. Put the revealed cards on the bottom of your library in a random order. +mana={2}{R}{R} +type=Creature +subtype=Elemental +power=1 +toughness=1 +[/card] +[card] name=Anara, Wolvid Familiar abilities=partner auto=this(variable{controllerturn}>0) lord(*[iscommander]|mybattlefield) indestructible @@ -1290,7 +1300,7 @@ toughness=2 name=Angelic Ascension target=creature,planeswalker auto=moveTo(Exile) -auto=token(Angel Ang) opponent +auto=token(Angel Ang) targetController text=Exile target creature or planeswalker. Its controller creates a 4/4 white Angel creature token with flying. mana={1}{W} type=Instant @@ -1755,6 +1765,17 @@ mana={2}{U} type=Enchantment [/card] [card] +name=Arcane Artisan +auto={2}{U}{T}:name(Choose player) name(Choose player) target(player) draw:1 targetedplayer && ability$!name(Choose one) choice name(Exile a creature card) notatarget(creature|myhand) moveto(exile) and!(clone addtype(ArcaneCreated))! _ choice name(Exile a non-creature card) notatarget(*[-creature]|myhand) moveto(exile)!$ targetedplayer +auto=@movedTo(this|nonbattlezone) from(battlefield):moveTo(exile) all(*[ArcaneCreated]|battlefield) +text={2}{U}, {T}: Target player draws a card, then exiles a card from their hand. If a creature card is exiled this way, that player creates a token that's a copy of that card. -- When Arcane Artisan leaves the battlefield, exile all tokens created with it at the beginning of the next end step. +mana={2}{U} +type=Creature +subtype=Human Wizard +power=0 +toughness=3 +[/card] +[card] name=Arcane Encyclopedia auto={3}{T}:draw:1 text={3}, {T}: Draw a card. @@ -2320,6 +2341,20 @@ mana={2}{U} type=Enchantment [/card] [card] +name=As Luck Would Have It +abilities=opponentshroud +auto=@dierolled(creature|battlefield) result(1):counter(0/0,1,Luck) all(this) +auto=@dierolled(creature|battlefield) result(2):counter(0/0,2,Luck) all(this) +auto=@dierolled(creature|battlefield) result(3):counter(0/0,3,Luck) all(this) +auto=@dierolled(creature|battlefield) result(4):counter(0/0,4,Luck) all(this) +auto=@dierolled(creature|battlefield) result(5):counter(0/0,5,Luck) all(this) +auto=@dierolled(creature|battlefield) result(6):counter(0/0,6,Luck) all(this) +auto=this(counter{0/0.100.Luck}=)) wingame controller +text=Hexproof -- Whenever you roll a die, put a number of luck counters on As Luck Would Have It equal to the result. Then if there are 100 or more luck counters on As Luck Would Have It, you win the game. (Count both rolls if you reroll a die.) +mana={G} +type=Enchantment +[/card] +[card] name=Ashaya, Soul of the Wild anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive auto=lord(creature[-token]|myBattlefield) becomes(land forest) @@ -2828,6 +2863,14 @@ mana={G} type=Instant [/card] [card] +name=Awaken the Erstwhile +auto=count(type:*:myhand) && all(*|myhand) reject && token(Zombie,Creature Zombie,2/2,black)*countedamount +auto=count(type:*:opponenthand) && all(*|opponenthand) reject && token(Zombie,Creature Zombie,2/2,black)*countedamount opponent +text=Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. +mana={3}{B}{B} +type=Sorcery +[/card] +[card] name=Awaken the Sky Tyrant auto=@damageof(player) from(*|opponentstack,opponentbattlefield,opponentgraveyard,opponenthand,opponentexile,opponentsideboard):may sacrifice && token(Dragon,Creature Dragon,5/5,red,flying) controller text=When a source an opponent controls deals damage to you, sacrifice Awaken the Sky Tyrant. If you do, create a 5/5 red Dragon creature token with flying. @@ -3623,6 +3666,15 @@ mana={G}{U} type=Sorcery [/card] [card] +name=Bedeck // Bedazzle +other={4}{B}{R} name(Bedazzle) +auto=ifnot paid(alternative) then target(creature|battlefield) 3/-3 ueot +auto=ifnot paid(alternative) then target(land[-basic]|battlefield) destroy && ability$!name(Choose one) choice name(Damage opponent) damage:2 opponent _ choice name(Damage planeswalker) damage:2 target(planeswalker)!$ controller +text=Target creature gets +3/-3 until end of turn. // Destroy target nonbasic land. Bedazzle deals 2 damage to target opponent or planeswalker. +mana={BR}{BR} +type=Instant +[/card] +[card] name=Bedevil target=artifact,creature,planeswalker auto=destroy @@ -3850,6 +3902,18 @@ power=2 toughness=2 [/card] [card] +name=Biogenic Upgrade +target=creature +restriction=type(creature|battlefield)~morethan~0 +auto=transforms((,newability[counter(1/1.1)],newability[thisforeach(counter{1/1.1}) counter(1/1.1) all(this)])) oneshot +auto=choice name(Give other 2 counters to same creature) name(Give other 2 counters to same creature) counter(1/1,4) +auto=if type(creature|battlefield)~morethan~1 then choice name(Give 2 counters to another creature) name(Give 2 counters to another creature) target(other creature) transforms((,newability[counter(1/1.2)],newability[thisforeach(counter{1/1.1}) counter(1/1.1) all(this)])) oneshot +auto=if type(creature|battlefield)~morethan~2 then choice name(Give 1 counter to other 2 creatures) name(Give 1 counter to other 2 creatures) target(<2>other creature) transforms((,newability[counter(1/1.1)],newability[thisforeach(counter{1/1.1}) counter(1/1.1) all(this)])) oneshot +text=Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. +mana={4}{G}{G} +type=Sorcery +[/card] +[card] name=Biowaste Blob auto=lord(*[ooze]|mybattlefield) 1/1 auto=@each my upkeep restriction{type(*[iscommander]|myBattlefield)~morethan~0}:clone all(this) @@ -4566,6 +4630,16 @@ mana={4}{B}{B} type=Artifact [/card] [card] +name=Bloodstone Goblin +auto=@movedto(*[kicked>=1]|mystack):transforms((,newability[1/1],newability[menace])) ueot +text=Whenever you cast a spell, if that spell was kicked, Bloodstone Goblin gets +1/+1 and gains menace until end of turn. (It can't be blocked except by two or more creatures.) +mana={1}{R} +type=Creature +subtype=Goblin Warrior +power=2 +toughness=2 +[/card] +[card] name=Bloodsworn Steward abilities=flying auto=lord(creature[iscommander]|mybattlefield) 2/2 @@ -4756,6 +4830,17 @@ power=4 toughness=4 [/card] [card] +name=Bolt Bend +target=*[instant;sorcery]|stack +auto=fizzle +auto=activate castcard(copied noevent) +other={R} name(Reduced cast) +otherestriction=type(creature[power>=4]|mybattlefield)~morethan~0 +text=This spell costs {3} less to cast if you control a creature with power 4 or greater. -- Change the target of target spell or ability with a single target. +mana={3}{R} +type=Instant +[/card] +[card] name=Bolt Hound abilities=haste auto=@combat(attakcing) source(this):all(other creature|myBattlefield) 1/0 ueot @@ -5058,7 +5143,7 @@ toughness=1 [card] name=Boreal Elemental abilities=flying -auto=@targeted(this) from(opponentstack):add{2} opponent +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Flying -- Spells your opponents cast that target Boreal Elemental cost {2} more to cast. mana={4}{U} type=Creature @@ -5200,6 +5285,7 @@ toughness=3 [card] name=Bramble Sovereign auto=@movedto(creature[-token]|mybattlefield):all(trigger[to]) pay[[{1}{G}]] clone +auto=@movedto(creature[-token]|opponentbattlefield):all(trigger[to]) pay[[{1}{G}]] clone and!( moveTo(opponentBattlefield) )! text=Whenever another nontoken creature enters the battlefield, you may pay {1}{G}. If you do, that creature's controller creates a token that's a copy of that creature. mana={2}{G}{G} type=Creature @@ -5970,7 +6056,7 @@ type=Sorcery [card] name=Callaphe, Beloved of the Sea auto=type:manaU:mybattlefield/3 cdaactive -auto=@targeted(creature,enchantment|myBattlefield) from(opponentstack):altercost(colorless,+1) +auto=@targeted(*[creature;enchantment]|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 1 more) name(This spell costs 1 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) oneshot text=Callaphe’s power is equal to your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) -- Creatures and enchantments you control have “Spells your opponents cast that target this permanent cost {1} more to cast”. mana={1}{U}{U} type=Legendary Enchantment Creature @@ -6152,6 +6238,16 @@ power=4 toughness=4 [/card] [card] +name=Captive Audience +auto=moveto(opponentbattlefield) +auto=@each my upkeep:this(counter{0/0.1.Choice}=0) lifeset:4 controller && counter(0/0,1,Choice) all(this) +auto=@each my upkeep:this(counter{0/0.1.Choice}=1) all(*|myhand) reject && counter(0/0,1,Choice) all(this) +auto=@each my upkeep:this(counter{0/0.1.Choice}=2) token(Zombie,Creature Zombie,2/2,black)*5 opponent && counter(0/0,1,Choice) all(this) +text=Captive Audience enters the battlefield under the control of an opponent of your choice. -- At the beginning of your upkeep, choose one that hasn't been chosen — -- • Your life total becomes 4. -- • Discard your hand. -- • Each opponent creates five 2/2 black Zombie creature tokens. +mana={5}{B}{R} +type=Enchantment +[/card] +[card] name=Capture Sphere abilities=flash target=creature @@ -6183,6 +6279,16 @@ power=7 toughness=6 [/card] [card] +name=Carnival // Carnage +other={2}{B}{R} name(Carnage) +otherrestriction=myturnonly +auto=ifnot paid(alternative) then ability$!name(Choose one) choice name(Damage opponent's target) target(*[creature;planeswalker]|opponentbattlefield) damage:1 && damage:1 opponent _ choice name(Damage your target) target(*[creature;planeswalker]|mybattlefield) damage:1 && damage:1 controller!$ controller +auto=if paid(alternative) then damage:3 opponent && ability$!name(Discard 2 cards) notatarget(<2>*|myhand) reject!$ opponent +text=Carnival deals 1 damage to target creature or planeswalker and 1 damage to that permanent's controller. -- Carnage deals 3 damage to target opponent. That player discards two cards. +mana={BR} +type=Instant +[/card] +[card] name=Carom target=creature auto=absorb ueot @@ -6525,9 +6631,9 @@ type=Enchantment [card] name=Cavalier of Dawn abilities=vigilance -auto=@movedTo(graveyard) from(this|battlefield):moveTo(myhand) target(artifact,enchantment|mygraveyard) -auto=choice target(*[-land]|mybattlefield) destroy && token(Golem,Artifact Creature Golem,3/3) -auto=choice target(*[-land]|opponentbattlefield) destroy && token(Golem,Artifact Creature Golem,3/3) && moveto(opponentbattlefield) target(golem|mybattlefield) +auto=@movedTo(this|graveyard) from(battlefield):moveTo(myhand) target(*[artifact;enchantment]|mygraveyard) +auto=choice name(Destroy your land) target(*[-land]|mybattlefield) destroy && token(Golem,Artifact Creature Golem,3/3) +auto=choice name(Destroy opponent's land) target(*[-land]|opponentbattlefield) destroy && token(Golem,Artifact Creature Golem,3/3) opponent text=Vigilance -- When Cavalier of Dawn enters the battlefield, destroy up to one target nonland permanent. Its controller creates a 3/3 colorless Golem artifact creature token. -- When Cavalier of Dawn dies, return target artifact or enchantment card from your graveyard to your hand. mana={2}{W}{W}{W} type=Creature @@ -7222,8 +7328,7 @@ toughness=5 [/card] [card] name=Charix, the Raging Isle -auto=lord(*[aura;instant;sorcery]|opponentcastingzone) altercost(colorless, +2) -auto=@targeted(this) from(opponentstack):add{2} opponent +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot auto={3}:type:island:myBattlefield/-type:island:myBattlefield ueot text=Spells your opponents cast that target Charix, the Raging Isle cost {2} more to cast. -- {3}:Charix gets +X/-X until end of turn, where X is the number of Islands you control. mana={2}{U}{U} @@ -7307,6 +7412,16 @@ power=1 toughness=2 [/card] [card] +name=Cheering Fanatic +auto=@combat(attacking) source(this):target(*[-land]|mycastingzone) altercost(colorless,-1) ueot +text=Whenever Cheering Fanatic attacks, choose a card name. Spells with the chosen name cost 1 less to cast this turn. +mana={1}{R} +type=Creature +subtype=Goblin +power=2 +toughness=2 +[/card] +[card] name=Chemister's Insight auto=draw:2 flashback={3}{U}{D(*|myhand)} @@ -7396,6 +7511,15 @@ power=4 toughness=4 [/card] [card] +name=Chittering Doom +auto=@dierolled(creature|battlefield) result(4):token(Squirrel,Creature Squirrel,1/1,green) +auto=@dierolled(creature|battlefield) result(5):token(Squirrel,Creature Squirrel,1/1,green) +auto=@dierolled(creature|battlefield) result(6):token(Squirrel,Creature Squirrel,1/1,green) +text=Whenever you roll a 4 or higher on a die, create a 1/1 green Squirrel creature token. +mana={3}{G} +type=Enchantment +[/card] +[card] name=Chittering Harvester abilities=mutate otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 @@ -7655,6 +7779,14 @@ mana={R} type=Sorcery [/card] [card] +name=Clam-I-Am +auto=@dierolled(creature|battlefield) result(3):all(this) rolladie 6 winability donothing winabilityend loseability donothing loseabilityend rollend +text=Whenever you roll a 3 on a six-sided die, you may reroll that die. +mana={2}{U} +type=Summon +subtype=Clamfolk +[/card] +[card] name=Clambassadors auto=@damaged(player) from(this):target(*[creature;artifact;land]|mybattlefield) moveTo(opponentbattlefield) text=If Clambassadors damages any player, choose an artifact, creature, or land you control. That player gains control of that artifact, creature, or land. @@ -8133,6 +8265,15 @@ power=2 toughness=5 [/card] [card] +name=Collision // Colossus +other={R}{G} name(Colossus) +auto=ifnot paid(alternative) then damage:6 target(creature[flying]) +auto=if paid(alternative) then target(creature) transforms((,newability[4/2],newability[trample])) ueot +text=Collision deals 6 damage to target creature with flying. // Target creature gets +4/+2 and gains trample until end of turn. +mana={1}{RG} +type=Instant +[/card] +[card] name=Colorful Feiyi Sparrow abilities=flying text=Flying. (This creature can't be blocked except by creatures with flying or reach.) @@ -8238,6 +8379,14 @@ power=2 toughness=2 [/card] [card] +name=Combo Attack +target=<2>creature|mybattlefield +auto=transforms((,newability[target(creature) dynamicability])) oneshot +text=Two target creatures your team controls each deal damage equal to their power to target creature. +mana={2}{G} +type=Sorcery +[/card] +[card] name=Comet Storm kicker=multi{1} auto=if compare(kicked)~equalto~0 then name(damage 1 target) name(damage 1 target) target(*[creature;player;planeswalker]) damage:X @@ -8641,6 +8790,18 @@ power=2 toughness=10 [/card] [card] +name=Consecrate // Consume +other={2}{W}{B} name(Consume) +otherrestriction=myturnonly +auto=ifnot paid(alternative) then draw:1 controller +auto=ifnot paid(alternative) then target(creature|graveyard) moveto(exile) +auto=if paid(alternative) then choice name(Target controller) name(Target controller) life:power:highest:creature:myBattlefield controller && ability$!name(Sacrifice creature) sacrifice notatarget(creature[power=power:highest:creature:myBattlefield]|mybattlefield)!$ controller +auto=if paid(alternative) then choice name(Target opponent) name(Target opponent) life:power:highest:creature:opponentBattlefield controller && ability$!name(Sacrifice creature) sacrifice notatarget(creature[power=power:highest:creature:myBattlefield]|mybattlefield)!$ opponent +text=Exile target card from a graveyard. -- Draw a card. // Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +mana={1}{WB} +type=Instant +[/card] +[card] name=Consign // Oblivion target=*[-land] auto=moveto(ownerhand) @@ -9393,6 +9554,15 @@ mana={2}{G} type=Instant [/card] [card] +name=Cry of the Carnarium +auto=all(creature|battlefield) -2/-2 ueot +auto=all(creature[fresh]|graveyard) moveto(exile) +auto=all(creature) exiledeath ueot +text=All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. +mana={1}{B}{B} +type=Sorcery +[/card] +[card] name=Crypt Lurker auto=choice name(Do Nothing) donothing auto=choice name(Sacrifice a creature) sacrifice notatarget(creature|mybattlefield) && draw:1 controller @@ -10705,6 +10875,15 @@ power=2 toughness=1 [/card] [card] +name=Deliver Unto Evil +auto=moveto(exile) all(this) +auto=if type(planeswalker[bolas]|mybattlefield)~morethan~0 then target(*|mygraveyard) moveto(myhand) +auto=if type(planeswalker[bolas]|mybattlefield)~equalto~0 then abilitiy$!name(Choose 2 cards) name(Choose 2 cards) target(<2>*|opponentgraveyard) moveto(opponenthand)!$ opponent +text=Choose up to four target cards in your graveyard. If you control a Bolas planeswalker, return those cards to your hand. Otherwise, an opponent chooses two of them. Leave the chosen cards in your graveyard and put the rest into your hand. -- Exile Deliver Unto Evil. +mana={2}{B} +type=Sorcery +[/card] +[card] name=Demanding Dragon abilities=flying auto=damage:5 target(opponent) @@ -10862,6 +11041,17 @@ power=2 toughness=2 [/card] [card] +name=Depose // Deploy +other={2}{W}{U} name(Deploy) +auto=ifnot paid(alternative) then draw:1 controller +auto=ifnot paid(alternative) then target(creature) tap(noevent) +auto=if paid(alternative) then token(Thopter,Artifact Creature Thopter,1/1,flying)*2 +auto=if paid(alternative) then life:type:creature:mybattlefield controller +text=Tap target creature. -- Draw a card. // Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. +mana={1}{WU} +type=Instant +[/card] +[card] name=Depths of Desire target=creature auto=moveto(ownerhand) @@ -11904,6 +12094,15 @@ power=4 toughness=5 [/card] [card] +name=Dovin's Acuity +auto=life:2 controller +auto=draw:1 controller +auto=@movedto(*[instant]|mystack) restriction{assorcery}:may moveto(ownerhand) all(this) +text=When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card. -- Whenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. +mana={1}{W}{U} +type=Enchantment +[/card] +[card] name=Dovin's Automaton auto=aslongas(planeswalker[Dovin]|mybattlefield) +2/+2 auto=aslongas(planeswalker[Dovin]|mybattlefield) vigilance @@ -11915,6 +12114,14 @@ power=3 toughness=3 [/card] [card] +name=Dovin's Dismissal +auto=may target(creature[tapped]) moveto(ownerlibrary) +auto=ability$!name(Choose one) choice name(Don't search) donothing _ choice name(Search library) moveto(myhand) target(Dovin, Architect of Law|mylibrary) _ choice name(Search graveyard) moveto(myhand) target(Dovin, Architect of Law|mygraveyard)!$ controller +text=Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. +mana={2}{W}{U} +type=Instant +[/card] +[card] name=Dovin's Veto abilities=nofizzle target=*[-creature]|stack @@ -13153,6 +13360,17 @@ power=1 toughness=1 [/card] [card] +name=Elfhame Druid +auto={T}:add{G} +auto={T} restriction{type(*[haskicker]|myhand)~morethan~0}:add{G}{G} +text={T}: Add{G}. -- {T}: Add {G}{G}. Spend this mana only to cast kicked spells. +mana={1}{G} +type=Creature +subtype=Elf Druid +power=0 +toughness=2 +[/card] +[card] name=Eliminate auto=choice name(Destroy creature) target(creature[manacost<=3]) destroy auto=choice name(Destroy planeswalker) target(planeswalker[manacost<=3]) destroy @@ -14053,6 +14271,7 @@ type=Sorcery [card] name=Esior, Wardwing Familiar abilities=flying,partner +auto=@targeted(*[iscommander]|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 3 more) name(This spell costs 3 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) oneshot text=Flying -- Spells your opponents cast that target one or more commanders you control cost {3} more to cast. -- Partner (You can have two commanders if both have partner.) mana={1}{U} type=Legendary Creature @@ -15106,6 +15325,20 @@ auto={1}{S}:target(*[Phoenix]|mygraveyard) moveto(myBattlefield) and!(tap(noeven type=Artifact [/card] [card] +name=Feather, the Redeemed +abilities=flying +auto=@targeted(creature|mybattlefield) from(sorcery|myzones):transforms((,newability[all(sorcery|mystack) moveto(exile)])) ueot +auto=@targeted(creature|mybattlefield) from(sorcery|myzones):name(Return sorcery from exile) transforms((,newability[name(Return sorcery from exile) phaseaction[endofturn] target(sorcery[fresh]|myexile) moveto(myhand)])) ueot +auto=@targeted(creature|mybattlefield) from(instant|myzones):transforms((,newability[all(instant|mystack) moveto(exile)])) ueot +auto=@targeted(creature|mybattlefield) from(instant|myzones):name(Return instant from exile) transforms((,newability[name(Return instant from exile) phaseaction[endofturn] target(instant[fresh]|myexile) moveto(myhand)])) ueot +text=Flying -- Whenever you cast an instant or sorcery spell that targets a creature you control, exile that card instead of putting it into your graveyard as it resolves. If you do, return it to your hand at the beginning of the next end step. +mana={R}{W}{W} +type=Legendary Creature +subtype=Angel +power=3 +toughness=4 +[/card] +[card] name=Feed the Swarm auto=name(destroy) target(*[creature;enchantment]|opponentBattlefield) transforms((,newability[destroy],newability[life:-manacost opponent])) oneshot text=Destroy target creature or enchantment an opponent controls. You lose life equal to that permanent's converted mana cost. @@ -15113,6 +15346,16 @@ mana={1}{B} type=Sorcery [/card] [card] +name=Feisty Stegosaurus +auto=name(Choose creature and roll a die) name(Choose creature and roll a die) target(creature|opponentBattlefield) rolladie 6 winability damage:lastrollresult winabilityend loseability damage:lastrollresult loseabilityend rollend +text=When this creature enters the battlefield, roll a six-sided die. This creature deals damage equal to the result to target creature an opponent controls. +mana={4}{R} +type=Host Creature +subtype=Dinosaur +power=2 +toughness=1 +[/card] +[card] name=Feiyi Snake abilities=reach text=Reach (This creature can block creatures with flying.) @@ -15392,7 +15635,10 @@ toughness=1 [card] name=Fiendish Duo abilities=First strike -auto=@damage(from) notatarget(*|myBattlefield,myStack,myGraveyard,mySideboard) transforms((,newability[@damage:twicethatmuch])) +auto=@damagefoeof(player) from(*[instant;sorcery]|stack,Graveyard):damage:thatmuch all(trigger[to]) +auto=@damagefoeof(player) from(*[enchantment;artifact;land;planeswalker]|battlefield,Graveyard):damage:thatmuch all(trigger[to]) +auto=@damagefoeof(player) from(creature[-Fiendish Duo]|battlefield,Graveyard):damage:thatmuch all(trigger[to]) +auto=@combatdamagefoeof(player) from(this):damage:thatmuch all(trigger[to]) text=First strike -- If a source would deal damage to an opponent, it deals double that damage to that player instead. mana={4}{R}{R} type=Creature @@ -15552,6 +15798,15 @@ mana={3}{B}{B} type=Sorcery [/card] [card] +name=Final Payment +target=creature +auto=destroy +other={W}{B}{L:5} name(Pay 5 Life) +text=As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment. -- Destroy target creature. +mana={W}{B}{S(*[creature;enchantment]|mybattlefield)} +type=Instant +[/card] +[card] name=Final Reward target=creature auto=moveto(exile) @@ -15624,10 +15879,11 @@ type=Instant [/card] [card] name=Fire // Ice -auto=choice {1}{R}:damage:1 target(creature,player,planeswalker) && damage:1 target(creature,player,planeswalker) -auto=choice {1}{U}:tap target(*|battlefield) && draw:1 controller +other={1}{U} name(Ice) +auto=ifnot paid(alternative) then thisforeach(variable{2}) ability$!name(Choose one) choice name(Damage creature) damage:1 target(creature) _ choice name(Damage player) damage:1 target(player) _ choice name(Damage planeswalker) damage:1 target(planeswalker)!$ controller +auto=if paid(alternative) then name(Tap target permanent) name(Tap target permanent) target(*|battlefield) tap(noevent) && draw:1 controller text=Fire deals 2 damage divided as you choose among one or two targets. -- Tap target permanent. Draw a card. -mana={0} +mana={1}{R} type=Instant [/card] [card] @@ -16302,6 +16558,14 @@ mana={1}{U} type=Artifact [/card] [card] +name=Font of Agonies +auto=@lifelostof(player):counter(0/0,Blood,thatmuch) all(this) +auto={1}{B}{C(0/0,-4,Blood)}:target(creature) destroy +text=Whenever you pay life, put that many blood counters on Font of Agonies. -- {1}{B}, Remove four blood counters from Font of Agonies: Destroy target creature. +mana={B} +type=Enchantment +[/card] +[card] name=Food auto={2}{T}{S}:life:3 text={2}, {T}, Sacrifice this artifact: You gain 3 life. @@ -16337,6 +16601,16 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Forbidding Spirit +auto=all(creature|opponentbattlefield) transforms((,newability[attackcost:2])) uynt +text=When Forbidding Spirit enters the battlefield, until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays 2 for each of those creatures. +mana={1}{W}{W} +type=Creature +subtype=Spirit Cleric +power=3 +toughness=3 +[/card] +[card] name=Force of Despair other={E(*[black]|myhand)} otherrestriction=opponentturnonly @@ -16665,9 +16939,9 @@ power=3 toughness=2 [/card] [card] -name=Frilled Mystic +name=Frilled Mystic abilities=flash -auto=may if type(*|stack)~morethan~0 then fizzle target(*|stack) +auto=if type(*|stack)~morethan~0 then may name(Counter spell) target(*|stack) fizzle text=Flash -- When Frilled Mystic enters the battlefield, you may counter target spell. mana={G}{G}{U}{U} type=Creature @@ -16941,8 +17215,8 @@ toughness=3 [/card] [card] name=Gaea's Herald -auto=lord(creature|mystack) nofizzle -auto=lord(creature|opponentstack) nofizzle +auto=@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle +auto=@targeted(creature|opponentstack) from(instant|myzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|myzones) fizzle text=Creature spells can't be countered. mana={1}{G} type=Creature @@ -17034,6 +17308,17 @@ power=2 toughness=2 [/card] [card] +name=Galloping Lizrog +abilities=trample +auto=all(creature[counter{1/1.1}]|mybattlefield) transforms((,newability[thisforeach(counter{1/1.1}) may counter(1/1.-1) all(this) && counter(1/1.2) target(Galloping Lizrog[fresh]|mybattlefield)])) ueot +text=Trample -- When Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. +mana={3}{G}{U} +type=Creature +subtype=Frog Lizard +power=3 +toughness=3 +[/card] +[card] name=Game Plan auto=moveto(opponentlibrary) all(*|opponenthand) auto=moveto(opponentlibrary) all(*|opponentgraveyard) && shuffle @@ -17228,9 +17513,9 @@ type=Artifact [/card] [card] name=Gatebreaker Ram -auto=foreach(land[gate]|myBattlefield) 1/1 -auto=aslongas(land[gate]|myBattlefield) vigilance >1 -auto=aslongas(land[gate]|myBattlefield) trample >1 +auto=foreach(gate|myBattlefield) 1/1 +auto=aslongas(gate|myBattlefield) vigilance >1 +auto=aslongas(gate|myBattlefield) trample >1 text=Gatebreaker Ram gets +1/+1 for each Gate you control. -- As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample. mana={2}{G} type=Creature @@ -17379,14 +17664,25 @@ toughness=1 [/card] [card] name=Generous Gift -target=* +target=*|battlefield auto=destroy -auto=@movedto(*|graveyard):(Elephant:creature Elephant:3/3:green) controller +auto=token(Elephant,Creature Elephant,3/3,green) targetController text=Destroy target permanent. Its controller creates a 3/3 green Elephant creature token. mana={2}{W} type=Instant [/card] [card] +name=Generous Patron +auto=target(creature) counter(1/1) +auto=@counteradded(any) from(creature|opponentbattlefield):may draw:1 controller +text=When Generous Patron enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two other target creatures.) -- Whenever you put one or more counters on a creature you don't control, draw a card. +mana={2}{G} +type=Creature +subtype=Elf Advisor +power=1 +toughness=4 +[/card] +[card] name=Generous Stray auto=draw:1 text=When Generous Stray enters the battlefield, draw a card. @@ -18499,6 +18795,21 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Goblin Goliath +auto=token(Goblin,Creature Goblin,1/1,red) +auto={3}{R}{T}:lord(*|mybattlefield) transforms((DoubleActive)) ueot +auto=@damagefoeof(player) from(*[instant;sorcery]|mystack,myGraveyard) restriction{type(*[DoubleActive]|mybattlefield)~morethan~0}:damage:thatmuch all(trigger[to]) +auto=@damagefoeof(player) from(*[enchantment;artifact;land;planeswalker]|mybattlefield,myGraveyard) restriction{type(*[DoubleActive]|mybattlefield)~morethan~0}:damage:thatmuch all(trigger[to]) +auto=@damagefoeof(player) from(creature[-Goblin Goliath]|mybattlefield,myGraveyard) restriction{type(*[DoubleActive]|mybattlefield)~morethan~0}:damage:thatmuch all(trigger[to]) +auto=@combatdamagefoeof(player) from(this) restriction{type(*[DoubleActive]|mybattlefield)~morethan~0}:damage:thatmuch all(trigger[to]) +text=When Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have. -- {3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. +mana={4}{R}{R} +type=Creature +subtype=Goblin Mutant +power=5 +toughness=4 +[/card] +[card] name=Goblin Instigator auto=token(Goblin,Creature Goblin,1/1,red) text=When Goblin Instigator enters the battlefield, create a 1/1 red Goblin creature token. @@ -18616,6 +18927,19 @@ power=5 toughness=6 [/card] [card] +name=God-Eternal Kefnet +abilities=flying +auto=@movedTo(this|graveyard) from(battlefield):all(trigger[to]) moveTo(mylibrary) and!( moverandom(*) from(mylibrary) to(mylibrary) and!(moverandom(*) from(mylibrary) to(mylibrary))! )! +auto=@movedTo(this|exile) from(battlefield):all(trigger[to]) moveTo(mylibrary) and!( moverandom(*) from(mylibrary) to(mylibrary) and!(moverandom(*) from(mylibrary) to(mylibrary))! )! +auto=@drawof(player):may activate castcard(copied noevent) target(*[sorcery;instant]|myhand) limit:1 +text=Flying -- You may reveal the first card you draw each turn as you draw it. Whenever you reveal an instant or sorcery card this way, copy that card and you may cast the copy. That copy costs {2} less to cast. -- When God-Eternal Kefnet dies or is put into exile from the battlefield, you may put it into its owner's library third from the top. +mana={2}{U}{U} +type=Legendary Creature +subtype=Zombie God +power=4 +toughness=5 +[/card] +[card] name=God-Eternal Oketra abilities=double strike auto=@movedTo(creature|mystack):create(zombie warrior:creature zombie warrior:4/4:black:vigilance) @@ -18952,6 +19276,17 @@ power=0 toughness=0 [/card] [card] +name=Grand Warlord Radha +abilities=haste +auto=@each my blockers:foreach(creature[attacking]|mybattlefield) ability$!name(Choose one) choice name(Add red mana) add{R} doesntempty _ choice name(Add green mana) add{G} doesntempty!$ controller +text=Haste -- Whenever one or more creatures you control attack, add that much mana in any combination of {R} and/or {G}. Until end of turn, you don't lose this mana as steps and phases end. +mana={2}{R}{G} +type=Legendary Creature +subtype=Elf Warrior +power=3 +toughness=4 +[/card] +[card] name=Granitic Titan abilities=menace autohand=__CYCLING__({2}) @@ -19407,6 +19742,18 @@ mana={2}{B} type=Instant [/card] [card] +name=Ground Pounder +auto={3}{G}:all(this) rolladie 6 winability lastrollresult/lastrollresult ueot winabilityend loseability lastrollresult/lastrollresult ueot loseabilityend rollend +auto=@dierolled(creature|battlefield) result(5):name(Gains trample) name(Gains trample) all(this) transforms((,newability[trample])) ueot +auto=@dierolled(creature|battlefield) result(6):name(Gains trample) name(Gains trample) all(this) transforms((,newability[trample])) ueot +text={3}{G}: Roll a six-sided die. Ground Pounder gets +X/+X until end of turn, where X is the result. -- Whenever you roll a 5 or higher on a die, Ground Pounder gains trample until end of turn. +mana={1}{G} +type=Creature +subtype=Goblin Warrior +power=2 +toughness=2 +[/card] +[card] name=Grow from the Ashes kicker={2} auto=Kicker {2} @@ -19536,6 +19883,13 @@ power=3 toughness=3 [/card] [card] +name=Guardian Project +auto=@movedto(creature[-token]|mybattlefield):all(trigger[to]) transforms((,newability[if type(creature[share!name!]|mybattlefield)~lessthan~2 then if type(creature[share!name!]|mygraveyard)~lessthan~1 then draw:1 controller])) ueot +text=Whenever a nontoken creature enters the battlefield under your control, if it doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +mana={3}{G} +type=Enchantment +[/card] +[card] name=Guardian Seraph abilities=flying auto=@targeted(controller):prevent:1 controller @@ -19837,6 +20191,17 @@ text=Hall of the Bandit Lord enters the battlefield tapped. -- {T}, Pay 3 life: type=Legendary Land [/card] [card] +name=Hallar, the Firefletcher +abilities=trample +auto=@movedto(*[kicked>=1]|mystack):transforms((,newability[counter(1/1.1)],newability[thisforeach(counter{1/1.1}) damage:1 opponent])) oneshot +text=Trample -- Whenever you cast a spell, if that spell was kicked, put a +1/+1 counter on Hallar, the Firefletcher, then Hallar deals damage equal to the number of +1/+1 counters on it to each opponent. +mana={1}{R}{G} +type=Legendary Creature +subtype=Elf Archer +power=3 +toughness=3 +[/card] +[card] name=Hallowed Priest auto=@lifeof(player) from(*[-Alhammarret's Archive;-Angel of Vitality;-Boon Reflection]):counter(1/1,1) text=Whenever you gain life, put a +1/+1 counter on Hallowed Priest @@ -19879,6 +20244,22 @@ power=5 toughness=2 [/card] [card] +name=Hammer Jammer +auto={3}{G}:all(this) rolladie 6 winability counter(1/1,lastrollresult) winabilityend loseability counter(1/1,lastrollresult) loseabilityend rollend +auto=@dierolled(creature|battlefield) result(1):name(Get counter) name(Get counter) removeallcounters(1/1) && transforms((,newability[counter(1/1.1)])) all(this) +auto=@dierolled(creature|battlefield) result(2):name(Get counters) name(Get counters) removeallcounters(1/1) && transforms((,newability[counter(1/1.2)])) all(this) +auto=@dierolled(creature|battlefield) result(3):name(Get counters) name(Get counters) removeallcounters(1/1) && transforms((,newability[counter(1/1.3)])) all(this) +auto=@dierolled(creature|battlefield) result(4):name(Get counters) name(Get counters) removeallcounters(1/1) && transforms((,newability[counter(1/1.4)])) all(this) +auto=@dierolled(creature|battlefield) result(5):name(Get counters) name(Get counters) removeallcounters(1/1) && transforms((,newability[counter(1/1.5)])) all(this) +auto=@dierolled(creature|battlefield) result(6):name(Get counters) name(Get counters) removeallcounters(1/1) && transforms((,newability[counter(1/1.6)])) all(this) +text=As Hammer Jammer enters the battlefield, roll a six-sided die. Hammer Jammer enters the battlefield with a number of +1/+1 counters on it equal to the result. -- Whenever you roll a die, remove all +1/+1 counters from Hammer Jammer, then put a number of +1/+1 counters on it equal to the result. +mana={3}{R} +type=Creature +subtype=Goblin Warrior +power=0 +toughness=0 +[/card] +[card] name=Hammer of Nazahn auto={4}:equip auto=teach(creature) indestructible && 2/0 @@ -19964,6 +20345,14 @@ power=2 toughness=2 [/card] [card] +name=Haphazard Bombardment +auto=target(<4>*[-enchantment]|opponentbattlefield) counter(0/0,1,Aim) +auto=@each my endofturn:if type(*[counter{0/0.1.Aim}]|opponentbattlefield)~morethan~1 then ability$!name(Destroy creature) destroy notatarget(*[counter{0/0.1.Aim}]|mybattlefield)!$ opponent +text=When Haphazard Bombardment enters the battlefield, choose four nonenchantment permanents you don't control and put an aim counter on each of them. -- At the beginning of your end step, if two or more permanents you don't control have an aim counter on them, destroy one of those permanents at random. +mana={5}{R} +type=Enchantment +[/card] +[card] name=Happily Ever After auto=draw:1 controller auto=draw:1 opponent @@ -22052,6 +22441,22 @@ mana={4}{R}{R} type=Sorcery [/card] [card] +name=Immolation Shaman +auto={3}{R}{R}:transforms((,newability[3/3],newability[menace])) ueot +auto=@targeted(*|opponentzones) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +auto=@targeted(*|myzones) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +auto=@damagefoeof(player) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +auto=@damageof(player) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +auto=@lifefoeof(player) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +auto=@lifeof(player) from(*[creature;artifact;land]|opponentzones):damage:1 opponent +text=Whenever an opponent activates an ability of an artifact, creature, or land that isn't a mana ability, Immolation Shaman deals 1 damage to that player. -- {3}{R}{R}: Immolation Shaman gets +3/+3 and gains menace until end of turn. +mana={1}{R} +type=Creature +subtype=Viashino Shaman +power=1 +toughness=3 +[/card] +[card] name=Immortal Phoenix abilities=flying auto=@movedTo(this|graveyard) from(battlefield):all(trigger[to]) moveto(ownerhand) @@ -22304,6 +22709,19 @@ mana={4}{G}{G}{G}{G} type=Sorcery [/card] [card] +name=Incubation // Incongruity +abilities=flash +other={1}{G}{U} name(Incongruity) +restriction=myturnonly +aicode=activate moveto(myhand) target(creature[zpos<=5]|mylibrary) +auto=ifnot paid(alternative) then name(Look 5 cards) reveal:5 optionone name(Get a creature) target(<1>creature|reveal) moveto(myhand) optiononeend optiontwo name(put bottom of library) all(*|reveal) bottomoflibrary optiontwoend revealend +auto=if paid(alternative) then choice name(Exile opponent's creature) name(Exile opponent's creature) target(creature|opponentBattlefield) moveTo(exile) && token(Frog Lizard,Creature Frog Lizard,3/3,green) opponent +auto=if paid(alternative) then choice name(Exile your creature) name(Exile your creature) target(creature|mybattlefield) moveTo(exile) && token(Frog Lizard,Creature Frog Lizard,3/3,green) +text=Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. -- Exile target creature. That creature's controller creates a 3/3 green Frog Lizard creature token. +mana={GU} +type=Sorcery +[/card] +[card] name=Incubation Druid auto=this(variable{plandg}>0) {t}:out{g} auto=this(variable{plandu}>0) {t}:out{u} @@ -23264,6 +23682,18 @@ mana={U}{R} type=Instant [/card] [card] +name=Izzet Chemister +abilities=haste +auto={R}{T}:name(Exile instant or sorcery) name(Exile instant or sorcery) target(*[instant;sorcery]|mygraveyard) moveto(exile) and!( transforms((,newability[counter(0/0.1.IzzetExiled)])) forever )! +auto={1}{R}{T}{S}:name(Cast cards exiled with Izzet) name(Cast cards exiled with Izzet) target(*[counter{0/0.1.IzzetExiled}]|myexile) activate castcard(normal) +text=Haste -- {R}, {T}: Exile target instant or sorcery card from your graveyard. -- {1}{R}, {T}, Sacrifice Izzet Chemister: Cast any number of cards exiled with Izzet Chemister without paying their mana costs. +mana={2}{R} +type=Creature +subtype=Goblin Wizard +power=1 +toughness=3 +[/card] +[card] name=Izzet Locket auto={T}:Add{U} auto={T}:Add{R} @@ -23683,7 +24113,7 @@ toughness=1 [card] name=Jubilant Skybonder abilities=flying -auto=lord(creatures[flying]|myBattlefield) transforms((,newability[@targeted(this) from(*[instant;sorcery;enchantment]|opponentcastingzone):altercost(colorless, +2)])) +auto=@targeted(creature|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Flying -- Creatures you control with flying have "Spells your opponents cast that target this creature cost 2 more to cast." mana={1}{WU}{WU} type=Creature @@ -24856,6 +25286,16 @@ power=3 toughness=3 [/card] [card] +name=Knight of Sorrows +auto=@movedTo(this|graveyard) from(battlefield):token(Spirit,Creature Spirit,1/1,white,black,flying) +text=Knight of Sorrows can block an additional creature each combat. -- Afterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) +mana={4}{W} +type=Creature +subtype=Human Knight +power=3 +toughness=3 +[/card] +[card] name=Knight of the Ebon Legion auto={2}{B}:deathtouch && 3/3 auto=@each my endofturn foelost(4):1/1 @@ -25003,6 +25443,7 @@ type=Instant [/card] [card] name=Kopala, Warden of Waves +auto=@targeted(merfolk|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Spells your opponents cast that target a Merfolk you control cost {2} more to cast. -- Abilities your opponents activate that target a Merfolk you control cost {2} more to activate. mana={1}{U}{U} type=Legendary Creature @@ -25375,6 +25816,22 @@ mana={B} type=Instant [/card] [card] +name=Last One Standing +restriction=type(creature|battlefield)~morethan~0 +auto=count(type:creature:mybattlefield) && countb(type:creature:opponentbattlefield) +auto=if compare(countedbamount)~equalto~0 then thisforeach(variable{countedamountminus1minusend}) moverandom(creature) from(battlefield) to(graveyard) +auto=if compare(countedamount)~equalto~0 then thisforeach(variable{countedbamountminus1minusend}) moverandom(creature) from(opponentbattlefield) to(opponentgraveyard) +auto=if compare(countedamount)~equalto~compare(countedbamount) then thisforeach(variable{countedamountminus1minusend}) moverandom(creature) from(battlefield) to(graveyard) +auto=if compare(countedamount)~equalto~compare(countedbamount) then all(creature|opponentbattlefield) destroy +auto=if compare(countedamount)~morethan~compare(countedbamount) then thisforeach(variable{countedamountminus1minusend}) moverandom(creature) from(battlefield) to(graveyard) +auto=if compare(countedamount)~morethan~compare(countedbamount) then all(creature|opponentbattlefield) destroy +auto=if compare(countedamount)~lessthan~compare(countedbamount) then thisforeach(variable{countedbamountminus1minusend}) moverandom(creature) from(opponentbattlefield) to(opponentgraveyard) +auto=if compare(countedamount)~lessthan~compare(countedbamount) then all(creature|myBattlefield) destroy +text=Choose a creature at random, then destroy the rest. +mana={1}{B}{R} +type=Sorcery +[/card] +[card] name=Last-Ditch Effort target=creature,player auto=if type(*[creature]|mybattlefield)~morethan~0 then choice name(Sacrifice 1 creature) ability$!sacrifice notatarget(*[creature]|mybattlefield)!$ controller && damage:1 @@ -25538,6 +25995,20 @@ power=2 toughness=4 [/card] [card] +name=Lavinia, Azorius Renegade +auto=maxCast(*[-creature;manacost>=type:land:opponentbattlefieldplus1plusend])0 opponent ueot +auto=@each opponent untap:transforms((,white,blue,newability[maxCast(*[-creature;manacost>=type:land:opponentbattlefieldplus1plusend])0 opponent ueot])) ueot +auto=@each my untap:transforms((,white,blue,newability[maxCast(*[-creature;manacost>=type:land:opponentbattlefieldplus1plusend])0 opponent ueot])) ueot +auto=@movedto(land|opponentBattlefield):transforms((,white,blue,newability[maxCast(*[-creature;manacost<=type:land:opponentbattlefield])9999 opponent ueot],newability[maxCast(*[-creature;manacost>=type:land:opponentbattlefieldplus1plusend])0 opponent ueot])) ueot +auto=@movedto(land|nonbattlezone) from(opponentBattlefield):transforms((,white,blue,newability[maxCast(*[-creature;manacost>=type:land:opponentbattlefieldplus1plusend])0 opponent ueot])) ueot +text=Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. -- Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. +mana={W}{U} +type=Legendary Creature +subtype=Human Soldier +power=2 +toughness=2 +[/card] +[card] name=Law-Rune Enforcer auto={1}{T}:tap target(creature[manacost>=2]) text={1}, {T}: Tap target creature with converted mana cost 2 or greater. @@ -25991,8 +26462,8 @@ type=Enchantment [card] name=Leyline of Lifeforce abilities=leyline -auto=lord(creature|mystack) nofizzle -auto=lord(creature|opponentstack) nofizzle +auto=@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle +auto=@targeted(creature|opponentstack) from(instant|myzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|myzones) fizzle text=If Leyline of Lifeforce is in your opening hand, you may begin the game with it on the battlefield. -- Creature spells can't be countered. mana={2}{G}{G} type=Enchantment @@ -26054,6 +26525,16 @@ mana={3}{B}{B} type=Sorcery [/card] [card] +name=Lich's Mastery +abilities=opponentshroud,cantlose +auto=@lifeof(player):draw:thatmuch controller +auto=@lifelostof(player):ability$!name(Choose one) choice name(Exile permanent from battlefield) moveto(exile) notatarget(*|mybattlefield) _ choice name(Exile card from hand) moveto(exile) notatarget(*|myhand) _ choice name(Exile card from graveyard) moveto(exile) notatarget(*|mygraveyard)!$ controller +auto=@movedto(this|nonbattlezone) from(battlefield):wingame opponent +text=Hexproof -- You can't lose the game. -- Whenever you gain life, draw that many cards. -- Whenever you lose life, for each 1 life you lost, exile a permanent you control or a card from your hand or graveyard. -- When Lich's Mastery leaves the battlefield, you lose the game. +mana={3}{B}{B}{B} +type=Legendary Enchantment +[/card] +[card] name=Licia, Sanguine Tribune abilities=first strike,lifelink anyzone=this(variable{lifegain}=1) changecost(colorless:-1) forcedalive @@ -26975,6 +27456,37 @@ power=2 toughness=4 [/card] [card] +name=Lumbering Battlement +abilities=vigilance +auto=choice name(Exile 0 creatures) name(Exile 0 creatures) donothing +auto=if type(creature[-token]|mybattlefield)~morethan~0 then choice name(Exile 1 creature) name(Exile 1 creature) transforms((,newability[target(creature[-token|mybattlefield) (blink)forsrc],newability[2/2])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~1 then choice name(Exile 2 creatures) name(Exile 2 creatures) transforms((,newability[target(<2>creature[-token|mybattlefield) (blink)forsrc],newability[4/4])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~2 then choice name(Exile 3 creatures) name(Exile 3 creatures) transforms((,newability[target(<3>creature[-token|mybattlefield) (blink)forsrc],newability[6/6])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~3 then choice name(Exile 4 creatures) name(Exile 4 creatures) transforms((,newability[target(<4>creature[-token|mybattlefield) (blink)forsrc],newability[8/8])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~4 then choice name(Exile 5 creatures) name(Exile 5 creatures) transforms((,newability[target(<5>creature[-token|mybattlefield) (blink)forsrc],newability[10/10])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~5 then choice name(Exile 6 creatures) name(Exile 6 creatures) transforms((,newability[target(<6>creature[-token|mybattlefield) (blink)forsrc],newability[12/12])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~6 then choice name(Exile 7 creatures) name(Exile 7 creatures) transforms((,newability[target(<7>creature[-token|mybattlefield) (blink)forsrc],newability[14/14])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~7 then choice name(Exile 8 creatures) name(Exile 8 creatures) transforms((,newability[target(<8>creature[-token|mybattlefield) (blink)forsrc],newability[16/16])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~8 then choice name(Exile 9 creatures) name(Exile 9 creatures) transforms((,newability[target(<9>creature[-token|mybattlefield) (blink)forsrc],newability[18/18])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~9 then choice name(Exile 10 creatures) name(Exile 10 creatures) transforms((,newability[target(<10>creature[-token|mybattlefield) (blink)forsrc],newability[20/20])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~10 then choice name(Exile 11 creatures) name(Exile 11 creatures) transforms((,newability[target(<11>creature[-token|mybattlefield) (blink)forsrc],newability[22/22])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~11 then choice name(Exile 12 creatures) name(Exile 12 creatures) transforms((,newability[target(<12>creature[-token|mybattlefield) (blink)forsrc],newability[24/24])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~12 then choice name(Exile 13 creatures) name(Exile 13 creatures) transforms((,newability[target(<13>creature[-token|mybattlefield) (blink)forsrc],newability[26/26])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~13 then choice name(Exile 14 creatures) name(Exile 14 creatures) transforms((,newability[target(<14>creature[-token|mybattlefield) (blink)forsrc],newability[28/28])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~14 then choice name(Exile 15 creatures) name(Exile 15 creatures) transforms((,newability[target(<15>creature[-token|mybattlefield) (blink)forsrc],newability[30/30])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~15 then choice name(Exile 16 creatures) name(Exile 16 creatures) transforms((,newability[target(<16>creature[-token|mybattlefield) (blink)forsrc],newability[32/32])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~16 then choice name(Exile 17 creatures) name(Exile 17 creatures) transforms((,newability[target(<17>creature[-token|mybattlefield) (blink)forsrc],newability[34/34])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~17 then choice name(Exile 18 creatures) name(Exile 18 creatures) transforms((,newability[target(<18>creature[-token|mybattlefield) (blink)forsrc],newability[36/36])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~18 then choice name(Exile 19 creatures) name(Exile 19 creatures) transforms((,newability[target(<19>creature[-token|mybattlefield) (blink)forsrc],newability[38/38])) forever +auto=if type(creature[-token]|mybattlefield)~morethan~19 then choice name(Exile 20 creatures) name(Exile 20 creatures) transforms((,newability[target(<20>creature[-token|mybattlefield) (blink)forsrc],newability[40/40])) forever +text=Vigilance -- When Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. -- Lumbering Battlement gets +2/+2 for each card exiled with it. +mana={4}{W} +type=Creature +subtype=Beast +power=4 +toughness=5 +[/card] +[card] name=Luminarch Aspirant auto=@each my combatbegins:counter(1/1,1) target(creature|myBattlefield) text=At the beginning of combat on your turn, put a +1/+1 counter on target creature you control. @@ -28778,7 +29290,7 @@ name=Misdirection other={E(*[blue]|myhand)} name(Exile blue card) target=*|stack auto=fizzle -auto=castcard(copied noevent) +auto=activate castcard(copied noevent) text=You may exile a blue card from your hand rather than pay Misdirection's mana cost. -- Change the target of target spell with a single target. mana={3}{U}{U} type=Instant @@ -29858,6 +30370,18 @@ mana={1}{G} type=Sorcery [/card] [card] +name=Navigator's Compass +auto=life:3 controller +auto={T}:ueot name(land becomes a plains) transforms((plains)) target(land|mybattlefield) +auto={T}:ueot name(land becomes an island) transforms((island)) target(land|mybattlefield) +auto={T}:ueot name(land becomes a swamp) transforms((swamp)) target(land|mybattlefield) +auto={T}:ueot name(land becomes a mountain) transforms((mountain)) target(land|mybattlefield) +auto={T}:ueot name(land becomes a forest) transforms((forest)) target(land|mybattlefield) +text=When Navigator's Compass enters the battlefield, you gain 3 life. -- {T}: Until end of turn, target land you control becomes the basic land type of your choice in addition to its other types. +mana={1} +type=Artifact +[/card] +[card] name=Navigator's Ruin auto=@each my endofturn restriction{raid}:deplete:4 opponent text=Raid — At the beginning of your end step, if you attacked with a creature this turn, target opponent puts the top four cards of his or her library into his or her graveyard. @@ -33053,6 +33577,17 @@ mana={1}{B}{B} type=Sorcery [/card] [card] +name=Pestilent Spirit +abilities=menace,deathtouch +auto=@damaged(creature) from(*[instant;sorcery]|mystack,myGraveyard):all(trigger[to]) destroy +text=Menace, deathtouch -- Instant and sorcery spells you control have deathtouch. (Any amount of damage they deal to a creature is enough to destroy it.) +mana={2}{B} +type=Creature +subtype=Spirit +power=3 +toughness=2 +[/card] +[card] name=Petalmane Baku auto={1}{C(0/0,-1,Ki)}:ability$! choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller auto=@movedTo(spirit,arcane|mystack):may counter(0/0,1,Ki) @@ -33579,6 +34114,24 @@ mana={6}{W}{W} type=Sorcery [/card] [card] +name=Plaza of Harmony +auto=if type(*[gate]|mybattlefield)~morethan~1 then life:3 controller +auto={T}:add{C} +auto={T} restriction{type(Gateway Plaza|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add black) add{B} _ choice name(Add green) add{G} _ choice name(Add red) add{R} _ choice name(Add white) add{W} _ choice name(Add blue) add{U}!$ controller +auto={T} restriction{type(Azorius Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add blue) add{U}!$ controller +auto={T} restriction{type(Boros Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add red) add{R}!$ controller +auto={T} restriction{type(Dimir Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add black) add{B} _ choice name(Add blue) add{U}!$ controller +auto={T} restriction{type(Golgari Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add black) add{B} _ choice name(Add green) add{G}!$ controller +auto={T} restriction{type(Gruul Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add red) add{R} _ choice name(Add green) add{G}!$ controller +auto={T} restriction{type(Izzet Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add red) add{R} _ choice name(Add blue) add{U}!$ controller +auto={T} restriction{type(Orzhov Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add black) add{B}!$ controller +auto={T} restriction{type(Rakdos Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add red) add{R} _ choice name(Add black) add{B}!$ controller +auto={T} restriction{type(Selesnya Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add green) add{G}!$ controller +auto={T} restriction{type(Simic Guildgate|mybattlefield)~morethan~0}:ability$!name(Choose one) choice name(Add blue) add{U} _ choice name(Add green) add{G}!$ controller +text=When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life. -- {T}: Add {C}. -- {T}: Add one mana of any type that a Gate you control could produce. +type=Land +[/card] +[card] name=Pledge of Unity auto=all(creature|myBattlefield) counter(1/1) auto=life:type:creature:myBattlefield @@ -33994,6 +34547,16 @@ power=2 toughness=1 [/card] [card] +name=Priest of Forgotten Gods +auto={T}{S(other creature|mybattlefield)}{S(other creature|mybattlefield)}:target(player) ability$!name(Sacrifice Creature) name(Sacrifice Creature) notatarget(creature|mybattlefield) sacrifice and!(life:-2 controller)! !$ targetedplayer && add{B}{B} controller && draw:1 controller +text={T}, Sacrifice two other creatures: Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card. +mana={1}{B} +type=Creature +subtype=Human Cleric +power=1 +toughness=2 +[/card] +[card] name=Priest of the Wakening Sun auto={3}{W}{W}{S}:moveto(myhand) target(dinosaur|mylibrary) auto=@each my upkeep if type(dinosaur|myhand)~morethan~0:life:2 controller @@ -34355,6 +34918,7 @@ toughness=5 [card] name=Prowling Serpopard abilities=nofizzle +auto=@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle text=Prowling Serpopard can't be countered. -- Creature spells you control can't be countered. mana={1}{G}{G} type=Creature @@ -34521,7 +35085,7 @@ type=Instant [/card] [card] name=Pursued Whale -auto=@targeted(this) from(*[instant;sorcery;enchantment;aura]|opponentcastingzone):altercost(colorless, +3) +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 3 more) name(This spell costs 3 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) oneshot auto=token(Pirate Pur) opponent text=When Pursued Whale enters the battlefield, each opponent creates a 1/1 red Pirate creature token with "This creature can't block" and "Creatures you control attack each combat if able." -- Spells your opponents cast that target Pursued Whale cost 3 more to cast. mana={5}{U}{U} @@ -35265,8 +35829,8 @@ toughness=4 [/card] [card] name=Rampage of the Clans -auto=destroy all(artifact,enchantment) -auto=@movedto(artifact,enchantment|graveyard):(Centaur:creature Centaur:3/3:green:) controller +auto=all(artifact|battlefield) transforms((,newability[destroy],newability[create(Centaur:Creature Centaur:3/3:green)])) oneshot +auto=all(enchantment|battlefield) transforms((,newability[destroy],newability[create(Centaur:Creature Centaur:3/3:green)])) oneshot text=Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. mana={3}{G} type=Instant @@ -35503,6 +36067,19 @@ type=Artifact subtype=Equipment [/card] [card] +name=Ravager Wurm +auto=choice name(Counter 1/1 and destroy land) all(this) transforms((,newability[counter(1/1.1)])) forever && target(land[basic]) destroy +auto=choice name(Counter 1/1 and fights creature) transforms((,newability[counter(1/1.1)],newability[target(creature|opponentbattlefield) dynamicability])) forever +auto=choice name(Haste and destroy land) all(this) transforms((,newability[haste all(this)])) forever && target(land[basic]) destroy +auto=choice name(Haste and fights creature) transforms((,newability[haste all(this)],newability[target(creature|opponentbattlefield) dynamicability])) forever +text=Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) -- When Ravager Wurm enters the battlefield, choose up to one — -- • Ravager Wurm fights target creature you don't control. -- • Destroy target land with an activated ability that isn't a mana ability. +mana={3}{R}{G}{G} +type=Creature +subtype=Wurm +power=4 +toughness=5 +[/card] +[card] name=Ravenous Chupacabra auto=destroy target(creature|opponentBattlefield) text=When Ravenous Chupacabra enters the battlefield, destroy target creature an opponent controls. @@ -36234,6 +36811,16 @@ mana={2}{R} type=Enchantment [/card] [card] +name=Repudiate // Replicate +other={1}{G}{U} name(Replicate) +otherrestriction=myturnonly +auto=ifnot paid(alternative) then name(Counter target spell) target(*|stack) fizzle +auto=if paid(alternative) then name(Copy creature) clone target(creature|mybattlefield) +text=Counter target activated or triggered ability. -- (Mana abilities can't be targeted.) -- Create a token that's a copy of target creature you control. +mana={GU}{GU} +type=Instant +[/card] +[card] name=Rescue from the Underworld target=creature|mygraveyard auto=phaseaction[my upkeep once]:moveto(mybattlefield) && moveTo(mybattlefield) target(creature|mygraveyard) @@ -36493,6 +37080,15 @@ mana={1}{W} type=Instant [/card] [card] +name=Revival // Revenge +other={4}{W}{B} name(Revenge) +auto=if paid(alternative) then life:lifetotal controller && life:-halfupopponentlifetotal opponent +auto=ifnot paid(alternative) then target(creature[manacost<=3]|mygraveyard) moveto(mybattlefield) +text=Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. -- Double your life total. Target opponent loses half their life, rounded up. +mana={WB}{WB} +type=Sorcery +[/card] +[card] name=Reyav, Master Smith auto=@combat(attacking) source(creature[enchanted]|myBattlefield):all(trigger[to]) transforms((,newability[double strike])) ueot auto=@combat(attacking) source(creature[geared]|myBattlefield):all(trigger[to]) transforms((,newability[double strike])) ueot @@ -36683,6 +37279,14 @@ mana={3}{B}{B} type=Sorcery [/card] [card] +name=Rhythm of the Wild +auto=@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle +auto=@movedto(creature[-token]|mybattlefield):choice name(Gains riot) name(Gains riot) all(trigger[to]) transforms((,newability[choice name(Counter 1/1) counter(1/1.1)],newability[choice name(Haste) haste all(this)])) forever +text=Creature spells you control can't be countered. -- Nontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) +mana={1}{R}{G} +type=Enchantment +[/card] +[card] name=Rhythmic Water Vortex target=creature auto=moveTo(ownerhand) @@ -37402,6 +38006,20 @@ mana={X}{R}{R} type=Sorcery [/card] [card] +name=Rona, Disciple of Gix +auto=lord(*[counter{0/0.1.RonaExiled}]|myexile) canplayfromexile +auto=if type(*[artifact]|mygraveyard)~morethan~0 then choice name(Exile artifact card) name(Exile artifact card) target(*[artifact]|mygraveyard) moveto(exile) and!( transforms((,newability[counter(0/0.1.RonaExiled)])) forever )! +auto=if type(*[legendary]|mygraveyard)~morethan~0 then choice name(Exile legendary card) name(Exile legendary card) target(*[legendary]|mygraveyard) moveto(exile) and!( transforms((,newability[counter(0/0.1.RonaExiled)])) forever )! +auto=if type(*[saga]|mygraveyard)~morethan~0 then choice name(Exile saga card) name(Exile saga card) target(*[saga]|mygraveyard) moveto(exile) and!( transforms((,newability[counter(0/0.1.RonaExiled)])) forever )! +auto={4}{T}:all(*[zpos=1]|mylibrary) moveto(exile) and!( transforms((,newability[counter(0/0.1.RonaExiled)])) forever )! +text=When Rona, Disciple of Gix enters the battlefield, you may exile target historic card from your graveyard. (Artifacts, legendaries, and Sagas are historic.) -- You may cast spells from among cards exiled with Rona. -- {4}, {T}: Exile the top card of your library. +mana={1}{U}{B} +type=Legendary Creature +subtype=Human Artificer +power=2 +toughness=2 +[/card] +[card] name=Rookie Mistake target=creature auto=0/2 ueot @@ -37766,6 +38384,35 @@ mana={3}{R} type=Sorcery [/card] [card] +name=Rumbling Ruin +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 1) name(Total of 1/1 couinters is 1) all(creature[power<=1]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 2) name(Total of 1/1 couinters is 2) all(creature[power<=2]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 3) name(Total of 1/1 couinters is 3) all(creature[power<=3]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 4) name(Total of 1/1 couinters is 4) all(creature[power<=4]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 5) name(Total of 1/1 couinters is 5) all(creature[power<=5]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 6) name(Total of 1/1 couinters is 6) all(creature[power<=6]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 7) name(Total of 1/1 couinters is 7) all(creature[power<=7]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 8) name(Total of 1/1 couinters is 8) all(creature[power<=8]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 9) name(Total of 1/1 couinters is 9) all(creature[power<=9]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 10) name(Total of 1/1 couinters is 10) all(creature[power<=10]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 11) name(Total of 1/1 couinters is 11) all(creature[power<=11]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 12) name(Total of 1/1 couinters is 12) all(creature[power<=12]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 13) name(Total of 1/1 couinters is 13) all(creature[power<=13]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 14) name(Total of 1/1 couinters is 14) all(creature[power<=14]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 15) name(Total of 1/1 couinters is 15) all(creature[power<=15]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 16) name(Total of 1/1 couinters is 16) all(creature[power<=16]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 17) name(Total of 1/1 couinters is 17) all(creature[power<=17]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 18) name(Total of 1/1 couinters is 18) all(creature[power<=18]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 19) name(Total of 1/1 couinters is 19) all(creature[power<=19]|opponentbattlefield) transforms((,newability[cantblock])) ueot +auto=if type(creature[counter{1/1}]|mybattlefield)~morethan~0 then choice name(Total of 1/1 couinters is 20) name(Total of 1/1 couinters is 20) all(creature[power<=20]|opponentbattlefield) transforms((,newability[cantblock])) ueot +text=When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. +mana={5}{R} +type=Creature +subtype=Elemental +power=6 +toughness=6 +[/card] +[card] name=Rumbling Sentry auto=scry:1 scrycore delayed dontshow donothing scrycoreend scryend text=When Rumbling Sentry enters the battlefield, scry 1. @@ -39413,7 +40060,8 @@ type=Sorcery [card] name=Secure the Scene target=*[-land] -auto=moveTo(exile) token(Soldier Sec) targetcontroller +auto=moveTo(exile) +auto=token(Soldier Sec) targetcontroller text=Exile target nonland permanent. Its controller creates a 1/1 white Soldier creature token. mana={4}{W} type=Sorcery @@ -40410,13 +41058,22 @@ toughness=3 [card] name=Shield of the Avatar auto={2}:equip -auto=prevent:type:creature:myBattlefield all(mytgt) +auto=teach(creature) transforms((,newability[@targeted(this):prevent:type:creature:myBattlefield all(this)])) text=If a source would deal damage to equipped creature, prevent X of that damage, where X is the number of creatures you control. -- Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) mana={1} type=Artifact subtype=Equipment [/card] [card] +name=Shield of the Realm +auto={1}:equip +auto=teach(creature) transforms((,newability[@targeted(this):prevent:2 all(this)])) +text=If a source would deal damage to equipped creature, prevent 2 of that damage. -- Equip {1} +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Shifting Ceratops abilities=protection from blue auto=nofizzle @@ -40492,6 +41149,14 @@ power=5 toughness=6 [/card] [card] +name=Shimmer of Possibility +aicode=activate moveto(myhand) all(*[zpos<=1]|mylibrary) +auto=name(Look 4 cards) reveal:4 optionone name(Get a card) target(<1>*|reveal) moveto(myhand) optiononeend optiontwo name(put bottom of library) all(*|reveal) bottomoflibrary optiontwoend revealend +text=Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. +mana={1}{U} +type=Sorcery +[/card] +[card] name=Shimmerscale Drake abilities=flying autohand=__CYCLING__({2}) @@ -40727,7 +41392,7 @@ toughness=4 name=Shunt target=*|stack auto=fizzle -auto=castcard(copied noevent) +auto=activate castcard(copied noevent) text=Change the target of target spell with a single target. mana={1}{R}{R} type=Instant @@ -41223,6 +41888,18 @@ power=1 toughness=1 [/card] [card] +name=Single Combat +auto=maxCast(creature)0 opponent +auto=maxCast(planeswalker)0 opponent +auto=maxCast(creature)0 controller +auto=maxCast(planeswalker)0 controller +auto=ability$! notatarget(*[creature;planeswalker]|mybattlefield) sacrifice !$ controller +auto=ability$! notatarget(*[creature;planeswalker]|mybattlefield) sacrifice !$ opponent +text=Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn. +mana={3}{W}{W} +type=Sorcery +[/card] +[card] name=Sinister Sabotage target=*|stack auto=fizzle @@ -42152,6 +42829,13 @@ mana={4} type=Artifact [/card] [card] +name=Smothering Tithe +auto=@drawfoeof(player):ability$!name(pay or create treasure) pay[[{2}]] donothing?token(Treasure Sur) opponent!$ opponent +text=Whenever an opponent draws a card, that player may pay {2} . If the player doesn't, you create a Treasure token. (It's an artifact with " {T}, Sacrifice this artifact: Add one mana of any color.") +mana={3}{W} +type=Enchantment +[/card] +[card] name=Snake Xyr type=Creature subtype=Snake @@ -43110,7 +43794,7 @@ type=Instant [card] name=Spellbreaker Behemoth abilities=nofizzle -auto=all(creature[power<=5|mystack) transforms((,newability[nofizzle])) forever +auto=@targeted(creature[power>=5]|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle text=Spellbreaker Behemoth can't be countered. -- Creature spells you control with power 5 or greater can't be countered. mana={1}{R}{G}{G} type=Creature @@ -43262,6 +43946,17 @@ power=4 toughness=4 [/card] [card] +name=Sphinx of New Prahv +abilities=flying,vigilance +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot +text=Flying, vigilance -- Spells your opponents cast that target Sphinx of New Prahv cost 2 more to cast. +mana={W}{W}{U}{U} +type=Creature +subtype=Sphinx +power=4 +toughness=3 +[/card] +[card] name=Sphinx of the Guildpact abilities=flying auto=cantbetargetof(*[-multicolor;-colorless]|opponentBattlefield,opponenthand,opponentgraveyard,opponentstack) @@ -44200,6 +44895,18 @@ power=5 toughness=4 [/card] [card] +name=Steel Squirrel +auto={6}:all(this) rolladie 6 winability donothing winabilityend loseability donothing loseabilityend rollend +auto=@dierolled(creature|battlefield) result(5):name(Get 5/5) name(Get 5/5) 5/5 ueot +auto=@dierolled(creature|battlefield) result(6):name(Get 6/6) name(Get 6/6) 6/6 ueot +text=Whenever you roll a 5 or higher on a die, Steel Squirrel gets +X/+X until end of turn, where X is the result. -- {6}: Roll a six-sided die. +mana={2} +type=Artifact Creature +subtype=Squirrel +power=1 +toughness=1 +[/card] +[card] name=Steel-Plume Marshal abilities=flying auto=@combat(attacking) source(this):all(other creature[attacking]|mybattlefield) 2/2 ueot @@ -45275,8 +45982,7 @@ toughness=3 [card] name=Surrak Dragonclaw abilities=flash,nofizzle -#lord nofizzle doesn't seem to work -auto=lord(*|mystack) nofizzle +auto=@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle auto=lord(other creature|mybattlefield) trample text=Flash -- Surrak Dragonclaw can't be countered. -- Creature spells you control can't be countered. -- Other creatures you control have trample. mana={2}{G}{U}{R} @@ -45427,7 +46133,7 @@ type=Sorcery name=Swerve target=*|stack auto=fizzle -auto=castcard(copied noevent) +auto=activate castcard(copied noevent) text=Change the target of target spell with a single target. mana={U}{R} type=Instant @@ -45714,7 +46420,7 @@ toughness=3 name=Syr Elenora, the Discerning anyzone=type:*:myhand/4 cdaactive auto=draw:1 controller -auto=@targeted(this) from(opponentstack):add{2} opponent +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Syr Elenora, the Discerning's power is equal to the number of cards in your hand. -- When Syr Elenora enters the battlefield, draw a card. -- Spells your opponents cast that target Syr Elenora cost 2 more to cast. mana={3}{U}{U} type=Legendary Creature @@ -46587,7 +47293,7 @@ toughness=5 [card] name=Terror of the Peaks abilities=flying -auto=@targeted(this) from(*|opponentcastingzone):life:-3 opponent +auto=@targeted(this) from(*|opponentzones):life:-3 opponent auto=@movedTo(creature|mybattlefield):all(trigger[to]) transforms((,newability[choice name(Don't damage) donothing],newability[choice name(damage creature) target(creature) dynamicability oneshot],newability[choice name(damage player) target(player) dynamicability oneshot],newability[choice name(damage planeswalker) target(planeswalker) dynamicability])) oneshot text=Flying -- Spells your opponents cast that target Terror of the Peaks cost an additional 3 life to cast. -- Whenever another creature enters the battlefield under your control, Terror of the Peaks deals damage equal to that creature's power to any target. mana={3}{R}{R} @@ -46638,6 +47344,17 @@ power=0 toughness=3 [/card] [card] +name=Teysa Karlov +auto=lord(creature[token]|mybattlefield) vigilance +auto=lord(creature[token]|mybattlefield) lifelink +text=If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. -- Creature tokens you control have vigilance and lifelink. +mana={2}{W}{B} +type=Legendary Creature +subtype=Human Advisor +power=2 +toughness=4 +[/card] +[card] name=Tezzeret's Betrayal target=creature auto=destroy @@ -46894,16 +47611,17 @@ type=Enchantment subtype=Saga [/card] [card] -name=The Flame of Keld +name=The Flame of Keld auto=counter(0/0,1,Lore) auto=@each my firstmain:counter(0/0,1,Lore) -auto=reject all(*|myhand) -auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) draw:2 controller -auto=@damaged(creature|opponentBattlefield) from(*[instant;sorcery;red]|mystack,myGraveyard):this(counter{0/0.3.Lore}) all(trigger[to]) transforms((,newability[damage:2])) oneshot -auto=@damaged(creature|opponentBattlefield) from(*[creature;enchantment;artifact;land;planeswalker;red]|mybattlefield,myGraveyard):this(counter{0/0.3.Lore}) all(trigger[to]) transforms((,newability[damage:2])) oneshot -auto=@damagefoeof(player) from(*[instant;sorcery;red]|mystack,myGraveyard):this(counter{0/0.3.Lore}) ability$!name(Damage opponent) damage:2 opponent!$ controller -auto=@damagefoeof(player) from(*[creature;enchantment;artifact;land;planeswalker;red]|mybattlefield,myGraveyard):this(counter{0/0.3.Lore}) ability$!name(Damage opponent) damage:2 opponent!$ controller -auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) sacrifice(this) +auto=all(*|myhand) reject +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) draw:2 controller +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}=) moveto(myhand) target(*[land;creature]|mygraveyard) +auto=@damaged(creature|opponentBattlefield) from(*[instant;sorcery;red]|mystack,myGraveyard):this(counter{0/0.3.Lore}=) all(trigger[to]) transforms((,newability[damage:2])) oneshot +auto=@damaged(creature|opponentBattlefield) from(*[creature;enchantment;artifact;land;planeswalker;red]|mybattlefield,myGraveyard):this(counter{0/0.3.Lore}=) all(trigger[to]) transforms((,newability[damage:2])) oneshot +auto=@damagefoeof(player) from(*[instant;sorcery;red]|mystack,myGraveyard):this(counter{0/0.3.Lore}=) ability$!name(Damage opponent) damage:2 opponent!$ controller +auto=@damagefoeof(player) from(*[creature;enchantment;artifact;land;planeswalker;red]|mybattlefield,myGraveyard):this(counter{0/0.3.Lore}=) ability$!name(Damage opponent) damage:2 opponent!$ controller +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.4.Lore}) sacrifice(this) text=(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.) -- I — Discard your hand. -- II — Draw two cards. -- III — If a red source you control would deal damage to a permanent or player this turn, it deals that much damage plus 2 to that permanent or player instead. mana={1}{R} type=Enchantment @@ -47073,6 +47791,16 @@ power=10 toughness=10 [/card] [card] +name=Theater of Horrors +auto=@each my upkeep:moveto(exile) all(*[zpos=1]|mylibrary) +auto=this(variable{oplifelost}>0) lord(*[land;instant;sorcery]|myexile) transforms((,canplayfromexile)) +auto={3}{R}:name(Damage opponent) name(Damage opponent) damage:1 opponent +auto={3}{R}:name(Damage planeswalker) name(Damage planeswalker) damage:1 target(planeswalker) +text=At the beginning of your upkeep, exile the top card of your library. -- During your turn, if an opponent lost life this turn, you may play lands and cast spells from among cards exiled with Theater of Horrors. -- {3}{R}: Theater of Horrors deals 1 damage to target opponent or planeswalker. +mana={1}{B}{R} +type=Enchantment +[/card] +[card] name=Thicket Crasher abilities=trample auto=lord(creature[elemental]|mybattlefield) trample <1 @@ -47296,6 +48024,16 @@ mana={4} type=Legendary Artifact [/card] [card] +name=Thrash // Threat +other={2}{R}{G} name(Threat) +otherrestricction=myturnonly +auto=if paid(alternative) then token(Beast,Creature Beast,4/4,red,green,trample) +auto=ifnot paid(alternative) then target(creature) transforms((,newability[dynamicability target(*[creature;planeswalker]|opponentbattlefield)])) ueot +text=Target creature you control deals damage equal to its power to target creature or planeswalker you don't control. -- Create a 4/4 red and green Beast creature token with trample. +mana={RG}{RG} +type=Instant +[/card] +[card] name=Thrash of Raptors auto=aslongas(other dinosaur|mybattlefield) 2/0 auto=aslongas(other dinosaur|mybattlefield) trample @@ -48005,6 +48743,17 @@ power=* toughness=* [/card] [card] +name=Titanic Brawl +target=creature|mybattlefield +other={G} name(Target creature with 1/1 counter) +otherrestriction=type(creature[counter{1/1}]|mybattlefield)~morethan~0,type(creature|opponentbattlefield)~morethan~0 +auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot +restriction=type(creature|opponentbattlefield)~morethan~0 +text=This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it. -- Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) +mana={1}{G} +type=Instant +[/card] +[card] name=Titan Hunter auto=@each my end:restriction{-morbid}:life:-4 controller auto=@each opponent end:restriction{-morbid}:life:-4 opponent @@ -48053,6 +48802,17 @@ mana={1}{B}{G}{U} type=Enchantment [/card] [card] +name=Tithe Taker +auto=while(restriction{myturnonly}) lord(*|opponentcastingzone) altercost( colorless,+1) +auto=@movedTo(this|graveyard) from(battlefield):token(Spirit,Creature Spirit,1/1,white,black,flying) +text=During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities. -- Afterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) +mana={1}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=1 +[/card] +[card] name=Tithebearer Giant auto=draw:1 && life:-1 text=When Tithebearer Giant enters the battlefield, you draw a card and you lose 1 life. @@ -48214,6 +48974,18 @@ power=1 toughness=3 [/card] [card] +name=Tomik, Distinguished Advokist +abilities=flying +auto=lord(land|mygraveyard,mybattlefield) opponentshroud +auto=lord(land|opponentgraveyard,opponentbattlefield) cantbetargetof(*|opponentzones) +text=Flying -- Lands on the battlefield and land cards in graveyards can't be the targets of spells or abilities your opponents control. -- Your opponents can't play land cards from graveyards. +mana={W}{W} +type=Legendary Creature +subtype=Human Advisor +power=2 +toughness=3 +[/card] +[card] name=Toothy, Imaginary Friend abilities=partner auto=may moveto(myhand) notatarget(pir, imaginative rascal|mylibrary) @@ -50421,7 +51193,7 @@ toughness=1 [card] name=Veil of Summer auto=if thisturn(*[blue;black]|opponentstack)~morethan~0 then draw:1 controller -auto=lord(*|myStack) nofizzle ueot +auto=all(*|mybattlefield) transforms((,newability[@targeted(*|mystack) from(instant|opponentzones):choice name(Spells can't be countered) name(Spells can't be countered) all(instant|opponentzones) fizzle])) ueot auto=lord(*|myBattlefield) cantbetargetof(*[blue;black]) ueot text=Draw a card if an opponent has cast a blue or black spell this turn. Spells you control can't be countered this turn. You and permanents you control gain hexproof from blue and from black until end of turn. (You and they can't be the targets of blue or black spells or abilities your opponents control.) mana={G} @@ -50690,6 +51462,14 @@ power=3 toughness=3 [/card] [card] +name=Verity Circle +auto=@tapped(creature[-attacking]|opponentbattlefield):may draw:1 controller +auto={4}{U}:tap target(creature[-flying]) +text=Whenever a creature an opponent controls becomes tapped, if it isn't being declared as an attacker, you may draw a card. -- {4}{U}: Tap target creature without flying. +mana={2}{U} +type=Enchantment +[/card] +[card] name=Verix Bladewing abilities=flying kicker={3} @@ -51877,6 +52657,16 @@ mana={1}{C} type=Instant [/card] [card] +name=Warrant // Warden +other={3}{W}{U} name(Warden) +otherrestriction=myturnonly +auto=ifnot paid(alternative) then target(creature[blocking;attacking]) moveto(ownerlibrary) +auto=if paid(alternative) then token(Sphinx,Creature Sphinx,4/4,blue,white,vigilance,flying) +text=Put target attacking or blocking creature on top of its owner's library. // Create a 4/4 white and blue Sphinx creature token with flying and vigilance. +mana={WU}{WU} +type=Instant +[/card] +[card] name=Warrior abilities=trample,haste text=Trample, Haste @@ -52515,6 +53305,20 @@ mana={1}{W} type=Instant [/card] [card] +name=Willing Test Subject +abilities=reach +auto={6}:all(this) rolladie 6 winability donothing winabilityend loseability donothing loseabilityend rollend +auto=@dierolled(creature|battlefield) result(4):name(Get 1/1 counter) name(Get 1/1 counter) counter(1/1) all(this) +auto=@dierolled(creature|battlefield) result(5):name(Get 1/1 counter) name(Get 1/1 counter) counter(1/1) all(this) +auto=@dierolled(creature|battlefield) result(6):name(Get 1/1 counter) name(Get 1/1 counter) counter(1/1) all(this) +text=Reach -- Whenever you roll a 4 or higher on a die, put a +1/+1 counter on Willing Test Subject. -- {6}: Roll a six-sided die. +mana={2}{G} +type=Creature +subtype=Spider Monkey Scientist +power=2 +toughness=2 +[/card] +[card] name=Wilt target=artifact,enchantment auto=destroy diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index b1c517490..73a9a43cb 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -34231,8 +34231,11 @@ toughness=7 [card] name=Elderwood Scion abilities=trample,lifelink -auto=@targeted(this) from(mystack): altercost(colorless,-2) -auto=@targeted(this) from(opponentstack):add{2} opponent +auto=@targeted(this) from(instant[manacost=2]|myzones):choice name(This spell costs 2 less) name(This spell costs 2 less) add{C} controller +auto=@targeted(this) from(sorcery[manacost=2]|myzones):choice name(This spell costs 2 less) name(This spell costs 2 less) add{C} controller +auto=@targeted(this) from(instant[manacost>=3]|myzones):choice name(This spell costs 2 less) name(This spell costs 2 less) add{C}{C} controller +auto=@targeted(this) from(sorcery[manacost>=3]|myzones):choice name(This spell costs 2 less) name(This spell costs 2 less) add{C}{C} controller +auto=@targeted(this) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot text=Trample, Lifelink -- Spells you cast that target Elderwood Scion cost {2} less to cast. Spells your opponents cast that target Elderwood Scion cost {2} more to cast. mana={3}{G}{W} type=Creature @@ -110539,7 +110542,7 @@ toughness=6 [card] name=Sphinx of the Final Word abilities=nofizzle,flying,opponentshroud -auto=lord(*[instant;sorcery]|mystack) nofizzle +auto=@targeted(*[instant;sorcery]|mystack) from(instant|opponentzones):choice name(Instant and sorcery can't be countered) name(Instant and sorcery can't be countered) all(instant|opponentzones) fizzle text=Sphinx of the Final Word can't be countered. -- Flying, hexproof -- Instant and sorcery spells you control can't be countered by spells or abilities. mana={5}{U}{U} type=Creature diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index be065e739..a685f4370 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -626,8 +626,8 @@ subtype=Davriel name=Domri, Anarch of Bolas auto=counter(0/0,3,loyalty) auto=lord(other creature|myBattlefield) +1/+0 -auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) add{R} && lord(*[creature]|myStack) nofizzle ueot -auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) add{G} && lord(*[creature]|myStack) nofizzle ueot +auto={C(0/0,1,Loyalty)}:name(+1: Add Red mana and creatures can't be countered this turn) transforms((,newability[add{R}],newability[@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle])) ueot +auto={C(0/0,1,Loyalty)}:name(+1: Add Green mana and creatures can't be countered this turn) transforms((,newability[add{G}],newability[@targeted(creature|mystack) from(instant|opponentzones):choice name(Creaure can't be countered) name(Creaure can't be countered) all(instant|opponentzones) fizzle])) ueot auto={C(0/0,-2,Loyalty)}:name(-2: Target creature fights another creature) target(creature|myBattlefield) transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot text=Creatures you control get +1/+0. -- +1: Add {R} or {G}. Creature spells you cast this turn can't be countered. -- -2: Target creature you control fights target creature you don't control. mana={1}{R}{G} @@ -1352,7 +1352,7 @@ subtype=Karn [card] name=Kasmina, Enigmatic Mentor auto=counter(0/0,5,loyalty) -auto=lord(*|opponentStack) altercost(colorless:+2) +auto=@targeted(*[creature;planeswalker]|myBattlefield) from(*[instant;sorcery]|opponentzones):choice name(This spell costs 2 more) name(This spell costs 2 more) target(*[instant;sorcery]|opponentzones) transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot auto={C(0/0,-2,Loyalty)}:name(-2: Create a 2/2 Wizard, draw and discard a card) token(Wizard,Creature Wizard,2/2,blue) && ability$!name(Draw a card) draw:1!$ controller && ability$!name(discard a card) notatarget(*|myhand) reject!$ conroller text=Spells your opponents cast that target a creature or planeswalker you control cost {2} more to cast. -- −2: Create a 2/2 blue Wizard creature token. Draw a card, then discard a card. mana={3}{U} diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 0c8dcd6c9..2aac1587e 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -572,12 +572,6 @@ power=1 toughness=1 [/card] [card] -name=As Luck Would Have It -text=Hexproof -- Whenever you roll a die, put a number of luck counters on As Luck Would Have It equal to the result. Then if there are 100 or more luck counters on As Luck Would Have It, you win the game. (Count both rolls if you reroll a die.) -mana={G} -type=Enchantment -[/card] -[card] name=Ashcloud Phoenix abilities=flying text=Flying -- When Ashcloud Phoenix dies, return it to the battlefield face down. -- Morph {4}{R}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- When Ashcloud Phoenix is turned face up, it deals 2 damage to each player. @@ -1102,6 +1096,15 @@ mana={1}{G} type=Instant [/card] [card] +name=Biomancer's Familiar +text=Activated abilities of creatures you control cost {2} less to activate. This effect can't reduce the mana in that cost to less than one mana. -- {T}: The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters on it. +mana={G}{U} +type=Creature +subtype=Mutant +power=2 +toughness=2 +[/card] +[card] name=Bioplasm text=Whenever Bioplasm attacks, exile the top card of your library. If it's a creature card, Bioplasm gets +X/+Y until end of turn, where X is the exiled creature card's power and Y is its toughness. mana={3}{G}{G} @@ -2155,12 +2158,6 @@ power=1 toughness=1 [/card] [card] -name=Chittering Doom -text=Whenever you roll a 4 or higher on a die, create a 1/1 green Squirrel creature token. -mana={3}{G} -type=Enchantment -[/card] -[card] name=Chivalrous Chevalier text=Flying -- When Chivalrous Chevalier enters the battlefield, return a creature you control to its owner's hand unless you compliment an opponent. mana={4}{W} @@ -2239,13 +2236,6 @@ type=Summon subtype=Clamfolk [/card] [card] -name=Clam-I-Am -text=Whenever you roll a 3 on a six-sided die, you may reroll that die. -mana={2}{U} -type=Summon -subtype=Clamfolk -[/card] -[card] name=Clarion Ultimatum text=Choose five permanents you control. For each of those permanents, you may search your library for a card with the same name as that permanent. Put those cards onto the battlefield tapped, then shuffle your library. mana={G}{G}{W}{W}{W}{U}{U} @@ -2909,6 +2899,12 @@ mana={2}{W} type=Enchantment [/card] [card] +name=Damping Sphere +text=If a land is tapped for two or more mana, it produces {C} instead of any other type and amount. -- Each spell a player casts costs 1 more to cast for each other spell that player has cast this turn. +mana={2} +type=Artifact +[/card] +[card] name=Dance of Many text=When Dance of Many enters the battlefield, put a token that's a copy of target nontoken creature onto the battlefield. -- When Dance of Many leaves the battlefield, exile the token. -- When the token leaves the battlefield, sacrifice Dance of Many. -- At the beginning of your upkeep, sacrifice Dance of Many unless you pay {U}{U}. mana={U}{U} @@ -4219,15 +4215,6 @@ mana={R} type=Instant [/card] [card] -name=Feisty Stegosaurus -text=When this creature enters the battlefield, roll a six-sided die. This creature deals damage equal to the result to target creature an opponent controls. -mana={4}{R} -type=Host Creature -subtype=Dinosaur -power=2 -toughness=1 -[/card] -[card] name=Fell the Mighty text=Destroy all creatures with power greater than target creature's power. mana={4}{W} @@ -4923,6 +4910,12 @@ mana={2}{W}{W} type=Enchantment [/card] [card] +name=Gideon's Sacrifice +text=Choose a creature or planeswalker you control. All damage that would be dealt this turn to you and permanents you control is dealt to the chosen permanent instead (if it's still on the battlefield) . +mana={W} +type=Instant +[/card] +[card] name=Gift Horse text=Whenever you crank Gift Horse, roll two six-sided dice. Create a number of 1/1 red Goblin creature tokens equal to the difference between those results. type=Artifact @@ -5498,15 +5491,6 @@ mana={4}{R}{R} type=Enchantment [/card] [card] -name=Ground Pounder -text={3}{G}: Roll a six-sided die. Ground Pounder gets +X/+X until end of turn, where X is the result. -- Whenever you roll a 5 or higher on a die, Ground Pounder gains trample until end of turn. -mana={1}{G} -type=Creature -subtype=Goblin Warrior -power=2 -toughness=2 -[/card] -[card] name=Grove of the Dreampods text=When you planeswalk to Grove of the Dreampods or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. -- Whenever you roll {K}, return target creature card from your graveyard to the battlefield. type=Plane @@ -5709,15 +5693,6 @@ mana={3}{R} type=Sorcery [/card] [card] -name=Hammer Jammer -text=As Hammer Jammer enters the battlefield, roll a six-sided die. Hammer Jammer enters the battlefield with a number of +1/+1 counters on it equal to the result. -- Whenever you roll a die, remove all +1/+1 counters from Hammer Jammer, then put a number of +1/+1 counters on it equal to the result. -mana={3}{R} -type=Creature -subtype=Goblin Warrior -power=0 -toughness=0 -[/card] -[card] name=Hammerfest Boomtacular text=Whenever you cast a spell with a Goblin Explosioneers watermark, Hammerfest Boomtacular deals 2 damage to any target. mana={3}{R}{R} @@ -6855,6 +6830,15 @@ power=1 toughness=2 [/card] [card] +name=Jodah, Archmage Eternal +text=Flying -- You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. +mana={1}{U}{R}{W} +type=Legendary Creature +subtype=Human Wizard +power=4 +toughness=3 +[/card] +[card] name=Jotun Grunt text=Cumulative upkeep—Put two cards from a single graveyard on the bottom of their owner's library. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) mana={1}{W} @@ -8447,6 +8431,12 @@ power=3 toughness=4 [/card] [card] +name=Mirror March +text=Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. +mana={5}{R} +type=Enchantment +[/card] +[card] name=Mirror Mirror text=Mirror Mirror comes into play tapped. -- {7}, {T}, Sacrifice Mirror Mirror: At end of turn, exchange life totals with target player and exchange all cards in play that you control, and all cards in your hand, library, and graveyard, with that player until end of game. mana={7} @@ -9283,6 +9273,12 @@ mana={3}{U} type=Enchantment [/card] [card] +name=Oath of Teferi +text=When Oath of Teferi enters the battlefield, exile another target permanent you control. Return it to the battlefield under its owner's control at the beginning of the next end step. -- You may activate the loyalty abilities of planeswalkers you control twice each turn rather than only once. +mana={3}{W}{U} +type=Legendary Enchantment +[/card] +[card] name=Oathkeeper, Takeno's Daisho text=Equipped creature gets +3/+1. -- Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. -- When Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature. -- Equip {2} mana={3} @@ -12735,15 +12731,6 @@ mana={4}{R}{R} type=Instant [/card] [card] -name=Steel Squirrel -text=Whenever you roll a 5 or higher on a die, Steel Squirrel gets +X/+X until end of turn, where X is the result. -- {6}: Roll a six-sided die. -mana={2} -type=Artifact Creature -subtype=Squirrel -power=1 -toughness=1 -[/card] -[card] name=Stet, Draconic Proofreader text=Flying -- Whenever Stet, Draconic Proofreader attacks, you may exile a card from your graveyard. When you do, Stet, Draconic Proofreader deals 4 damage to any target whose name begins with the same letter as the exiled card. -- {W}: Delete the first letter of target permanent or player's name until end of turn. mana={4}{R}{R} @@ -14805,15 +14792,6 @@ power=2 toughness=3 [/card] [card] -name=Willing Test Subject -text=Reach -- Whenever you roll a 4 or higher on a die, put a +1/+1 counter on Willing Test Subject. -- {6}: Roll a six-sided die. -mana={2}{G} -type=Creature -subtype=Spider Monkey Scientist -power=2 -toughness=2 -[/card] -[card] name=Winding Constrictor text=If one or more counters would be placed on an artifact or creature you control, that many plus one of each of those kinds of counters are placed on that permanent instead. -- If you would get one or more counters, you get that many plus one of each of those kinds of counters instead. mana={B}{G} diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 76a8f8514..adcd728e7 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -655,9 +655,9 @@ private: if(card->playerTarget) intValue = card->playerTarget->curses.size(); } - else if (s == "lifetotal") + else if (s == "lifetotal" || s == "opponentlifetotal") { - intValue = target->controller()->life; + intValue = (s == "lifetotal")?target->controller()->life:target->controller()->opponent()->life; } else if (s == "startinglife") { @@ -729,9 +729,9 @@ private: { intValue = (s == "mypoisoncount")?target->controller()->poisonCount:target->controller()->opponent()->poisonCount; } - else if (s == "opponentlifetotal") + else if(s == "lastrollresult" || s == "lastrollchoice") { - intValue = target->controller()->opponent()->life; + intValue = (s == "lastrollresult")?target->lastRollResult:target->dieSide; } else if (s == "pdrewcount" || s == "odrewcount") { @@ -1762,6 +1762,36 @@ public: } }; +class TrCardRolledDie: public Trigger +{ +public: + bool limitOnceATurn; + int triggeredTurn; + int rollresult; + TrCardRolledDie(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false, int rollresult = 0) : + Trigger(observer, id, source,once, tc),limitOnceATurn(limitOnceATurn), rollresult(rollresult) + { + } + + int triggerOnEventImpl(WEvent * event) + { + WEventCardRollDie * e = dynamic_cast (event); + if (!e) return 0; + if (limitOnceATurn && triggeredTurn == game->turn) + return 0; + if (rollresult > 0 && rollresult != e->card->lastRollResult) + return 0; + if (!tc->canTarget(e->card)) return 0; + triggeredTurn = game->turn; + return 1; + } + + TrCardRolledDie * clone() const + { + return NEW TrCardRolledDie(*this); + } +}; + class TrTokenCreated: public Trigger { public: @@ -7411,6 +7441,35 @@ public: GenericFlipACoin * clone() const; ~GenericFlipACoin(); +}; +//------------------------------------------------ +//Roll a die and call it, with win or lose abilities +class AASetDie: public InstantAbility +{ +public: + int side; + string abilityToAlter; + string abilityWin; + string abilityLose; + MTGAbility * abilityAltered; + AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1,string toAdd = ""); + int resolve(); + const string getMenuText(); + AASetDie * clone() const; + ~AASetDie(); +}; +class GenericRollDie: public ActivatedAbility +{ +public: + string baseAbility; + AASetDie * setDie; + int userchoice; + GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL, int userchoice = 0); + int resolve(); + const string getMenuText(); + GenericRollDie * clone() const; + ~GenericRollDie(); + }; //------------ class GenericPaidAbility: public ActivatedAbility diff --git a/projects/mtg/include/Credits.h b/projects/mtg/include/Credits.h index a6db0b04d..e1847a459 100644 --- a/projects/mtg/include/Credits.h +++ b/projects/mtg/include/Credits.h @@ -44,6 +44,7 @@ private: time_t gameLength; int isDifficultyUnlocked(DeckStats * stats); int isEvilTwinUnlocked(); + int isCommanderUnlocked(); int isRandomDeckUnlocked(); int IsMoreAIDecksUnlocked(DeckStats * stats); string unlockedTextureName; diff --git a/projects/mtg/include/GameOptions.h b/projects/mtg/include/GameOptions.h index 3dba984b5..63d2dc7fb 100644 --- a/projects/mtg/include/GameOptions.h +++ b/projects/mtg/include/GameOptions.h @@ -89,6 +89,7 @@ public: EVILTWIN_MODE_UNLOCKED, RANDOMDECK_MODE_UNLOCKED, AWARD_COLLECTOR, + COMMANDER_MODE_UNLOCKED, LAST_NAMED, //Any option after this does not look up in optionNames. SET_UNLOCKS = LAST_NAMED + 1, //For sets. }; diff --git a/projects/mtg/include/GameStateDuel.h b/projects/mtg/include/GameStateDuel.h index 95fb46ff8..c6a9fc3db 100644 --- a/projects/mtg/include/GameStateDuel.h +++ b/projects/mtg/include/GameStateDuel.h @@ -255,6 +255,7 @@ public: MENUITEM_RANDOM_AI = kRandomAIPlayerMenuID, MENUITEM_MAIN_MENU = -13, MENUITEM_EVIL_TWIN = kEvilTwinMenuID, + MENUITEM_COMMANDER = kCommanderMenuID, MENUITEM_MULLIGAN = -15, MENUITEM_UNDO = -16, #ifdef TESTSUITE diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index f04d83bf2..1aebc8595 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -113,7 +113,9 @@ public: int chooseacolor; string chooseasubtype; int coinSide;//1 = tails - + int dieSide; + int lastRollResult; + int stillInUse(); int didattacked; int didblocked; diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 563cfe4ad..7a6e1583a 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -366,6 +366,12 @@ struct WEventCardSurveiled : public WEventCardUpdate { virtual Targetable * getTarget(int target); }; +//roll die event +struct WEventCardRollDie : public WEventCardUpdate { + WEventCardRollDie(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + //mutation event struct WEventCardMutated : public WEventCardUpdate { WEventCardMutated(MTGCardInstance * card); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 21eed8202..d58ba7a85 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -2670,7 +2670,7 @@ AASetTypeChosen::~AASetTypeChosen() } // -//choosing a type or color +//choosing flip coin GenericFlipACoin::GenericFlipACoin(GameObserver* observer, int id, MTGCardInstance * source, Targetable *,string _toAdd, ManaCost * cost) : ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd) { @@ -2717,7 +2717,7 @@ GenericFlipACoin::~GenericFlipACoin() { } -//set color choosen +//set coin result AASetCoin::AASetCoin(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target,int _side , string toAlter): InstantAbility(observer, id, source),side(_side), abilityToAlter(toAlter) { @@ -2810,6 +2810,166 @@ AASetCoin::~AASetCoin() { } +// +//rolling a 6 side die +GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice) : +ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice) +{ + this->GetId(); + setDie = NULL; +} + +int GenericRollDie::resolve() +{ + if (!target) + return 0; + vectorselection; + if(userchoice > 0 && userchoice < 7){ + setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, baseAbility); + MTGAbility * set = setDie->clone(); + set->oneShot = true; + game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target; + set->resolve(); + SAFE_DELETE(setDie); + } else{ + for (int i = 1; i < 7; ++i) + { + setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i, baseAbility); + MTGAbility * set = setDie->clone(); + set->oneShot = true; + selection.push_back(set); + SAFE_DELETE(setDie); + } + } + if(selection.size() > 1) + { + MTGAbility * a1 = NEW MenuAbility(game, this->GetId(), target, source, false, selection); + game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target; + a1->resolve(); + } + return 1; + +} + +const string GenericRollDie::getMenuText() +{ +return "Roll a Die"; +} + +GenericRollDie * GenericRollDie::clone() const +{ + GenericRollDie * a = NEW GenericRollDie(*this); + return a; +} + +GenericRollDie::~GenericRollDie() +{ +} + +//set color choosen + AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, string toAlter): + InstantAbility(observer, id, source),side(_side), abilityToAlter(toAlter) +{ + this->target = _target; + abilityAltered = NULL; +} + +int AASetDie::resolve() +{ + MTGCardInstance * _target = (MTGCardInstance *)target; + _target->dieSide = side; + + int roll = 1 + game->getRandomGenerator()->random() % 6; + _target->lastRollResult = roll; + WEvent * e = NEW WEventCardRollDie(_target); + game->receiveEvent(e); + vectorWin = parseBetween(abilityToAlter,"winability "," winabilityend"); + if(Win.size()) + { + abilityWin = Win[1]; + } + vectorLose = parseBetween(abilityToAlter,"loseability "," loseabilityend"); + if(Lose.size()) + { + abilityLose = Lose[1]; + } + + if(abilityWin.size() && roll == side) + { + AbilityFactory af(game); + abilityAltered = af.parseMagicLine(abilityWin, 0, NULL, _target); + abilityAltered->canBeInterrupted = false; + if(abilityAltered->oneShot) + { + abilityAltered->resolve(); + SAFE_DELETE(abilityAltered); + } + else + { + abilityAltered->addToGame(); + } + MTGAbility * message = NEW MTGEventText(game,this->GetId(), source, "You Won The Die Roll"); + message->oneShot = true; + message->addToGame(); + } + else if(abilityWin.size() && !abilityLose.size()) + { + MTGAbility * message = NEW MTGEventText(game,this->GetId(), source, "You Lost The Die Roll"); + message->oneShot = true; + message->addToGame(); + } + else if(abilityLose.size() && roll != side) + { + AbilityFactory af(game); + abilityAltered = af.parseMagicLine(abilityLose, 0, NULL, _target); + abilityAltered->canBeInterrupted = false; + if(abilityAltered->oneShot) + { + abilityAltered->resolve(); + SAFE_DELETE(abilityAltered); + } + else + { + abilityAltered->addToGame(); + } + MTGAbility * message = NEW MTGEventText(game,this->GetId(), source, "You Lost The Die Roll"); + message->oneShot = true; + message->addToGame(); + } + else if(abilityLose.size()) + { + MTGAbility * message = NEW MTGEventText(game,this->GetId(), source, "You Won The Die Roll"); + message->oneShot = true; + message->addToGame(); + } + _target->skipDamageTestOnce = true; + return 1; +} + +const string AASetDie::getMenuText() +{ + if(side == 1) + return "Your choice is 1"; + if(side == 2) + return "Your choice is 2"; + if(side == 3) + return "Your choice is 3"; + if(side == 4) + return "Your choice is 4"; + if(side == 5) + return "Your choice is 5"; + return "Your choice is 6"; +} + +AASetDie * AASetDie::clone() const +{ + return NEW AASetDie(*this); +} + +AASetDie::~AASetDie() +{ +} + //paying for an ability as an effect but as a cost GenericPaidAbility::GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string _newName, string _castRestriction, string mayCost, string _toAdd, bool asAlternate, ManaCost * cost) : diff --git a/projects/mtg/src/Credits.cpp b/projects/mtg/src/Credits.cpp index 3d5732bf2..19d7c1153 100644 --- a/projects/mtg/src/Credits.cpp +++ b/projects/mtg/src/Credits.cpp @@ -277,6 +277,12 @@ void Credits::compute(GameObserver* g, GameApp * _app) goa = (GameOptionAward*) &options[Options::EVILTWIN_MODE_UNLOCKED]; goa->giveAward(); } + else if ((unlocked = isCommanderUnlocked())) + { + unlockedTextureName = "commander_unlocked.png"; + goa = (GameOptionAward*) &options[Options::COMMANDER_MODE_UNLOCKED]; + goa->giveAward(); + } else if ((unlocked = isRandomDeckUnlocked())) { unlockedTextureName = "randomdeck_unlocked.png"; @@ -669,6 +675,15 @@ int Credits::isEvilTwinUnlocked() return 0; } +int Credits::isCommanderUnlocked() +{ + if (options[Options::COMMANDER_MODE_UNLOCKED].number) + return 0; + if (p1->life >= 40 && p2->game->graveyard->nb_cards && (p1->game->graveyard->nb_cards < p2->game->graveyard->nb_cards)) + return 1; + return 0; +} + int Credits::isRandomDeckUnlocked() { if (0 == options[Options::DIFFICULTY].number) diff --git a/projects/mtg/src/DeckMenuItem.cpp b/projects/mtg/src/DeckMenuItem.cpp index cd37be3d4..191e841fa 100644 --- a/projects/mtg/src/DeckMenuItem.cpp +++ b/projects/mtg/src/DeckMenuItem.cpp @@ -61,6 +61,9 @@ DeckMenuItem::DeckMenuItem(DeckMenu* _parent, int id, int fontId, string text, f case kRandomAIPlayerMenuID: mImageFilename = "noavatar.jpg"; break; + case kCommanderMenuID: + mImageFilename = "noavatar.jpg"; + break; case kEvilTwinMenuID: { mImageFilename = "avatar.jpg"; diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index d1a60f875..7891fe7ac 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -74,6 +74,7 @@ const string Options::optionNames[] = { "prx_eviltwin", "prx_rnddeck", "aw_collector", + "prx_commander", }; diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp index 8135e0c20..4a6e54051 100644 --- a/projects/mtg/src/GameStateAwards.cpp +++ b/projects/mtg/src/GameStateAwards.cpp @@ -91,6 +91,10 @@ void GameStateAwards::Start() btn = NEW WGuiButton(aw, GUI_AWARD_BUTTON, Options::AWARD_COLLECTOR, this); listview->Add(btn); + aw = NEW WGuiAward(Options::COMMANDER_MODE_UNLOCKED, "Commander Format", "Play a Commander Format game."); + btn = NEW WGuiButton(aw, GUI_AWARD_BUTTON, Options::COMMANDER_MODE_UNLOCKED, this); + listview->Add(btn); + wgh = NEW WGuiHeader(""); listview->Add(wgh); diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp index 8cef40409..f2abe2d43 100644 --- a/projects/mtg/src/GameStateMenu.cpp +++ b/projects/mtg/src/GameStateMenu.cpp @@ -222,6 +222,8 @@ void GameStateMenu::fillScroller() scroller->Add(_("You haven't unlocked the random deck mode yet")); if (!options[Options::EVILTWIN_MODE_UNLOCKED].number) scroller->Add(_("You haven't unlocked the evil twin mode yet")); + if (!options[Options::COMMANDER_MODE_UNLOCKED].number) + scroller->Add(_("You haven't unlocked the commander format yet")); //Unlocked sets int nbunlocked = 0; @@ -264,6 +266,10 @@ int GameStateMenu::gamePercentComplete() { if (options[Options::EVILTWIN_MODE_UNLOCKED].number) done++; + total++; + if (options[Options::COMMANDER_MODE_UNLOCKED].number) + done++; + //Unlocked sets total+= setlist.size(); for (int i = 0; i < setlist.size(); i++) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 8f268658d..913fe4f11 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1216,23 +1216,33 @@ 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,limitOnceATurn); + return NEW TrCardMutated(observer, id, card, tc, once, limitOnceATurn); //Surveil has been performed from controller if (TargetChooser * tc = parseSimpleTC(s, "surveiled", card)) - return NEW TrCardSurveiled(observer, id, card, tc,once,limitOnceATurn); + return NEW TrCardSurveiled(observer, id, card, tc, once, limitOnceATurn); + + //Roll die has been performed from a card + if (TargetChooser * tc = parseSimpleTC(s, "dierolled", card)){ + int rollresult = 0; + vectorres = parseBetween(s, "result(",")"); + if(res.size()){ + rollresult = atoi(res[1].c_str()); + } + return NEW TrCardRolledDie(observer, id, card, tc, once, limitOnceATurn, rollresult); + } //Token has been created if (TargetChooser * tc = parseSimpleTC(s, "tokencreated", card)) - return NEW TrTokenCreated(observer, id, card, tc,once); + return NEW TrTokenCreated(observer, id, card, tc, once); //Card is sacrificed if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card)) - return NEW TrCardSacrificed(observer, id, card, tc,once); + return NEW TrCardSacrificed(observer, id, card, tc ,once); //Card is Discarded if (TargetChooser * tc = parseSimpleTC(s, "discarded", card)) - return NEW TrCardDiscarded(observer, id, card, tc,once); + return NEW TrCardDiscarded(observer, id, card, tc, once); //Card is cycled if (TargetChooser * tc = parseSimpleTC(s, "cycled", card)) @@ -2585,7 +2595,23 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG if (splitFlipCoin.size()) { string a1 = splitFlipCoin[1]; - MTGAbility * a = NEW GenericFlipACoin(observer, id, card, target,a1); + MTGAbility * a = NEW GenericFlipACoin(observer, id, card, target, a1); + a->oneShot = 1; + a->canBeInterrupted = false; + return a; + } + + //roll a die + vector splitRollDie = parseBetween(s, "rolladie ", " rollend"); + if (splitRollDie.size()) + { + string a1 = splitRollDie[1]; + int userchoice = 0; + if(a1[0] >= 48 && a1[0] <= 57){ + userchoice = a1[0] - 48; + a1 = a1.substr(2); + } + MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice); a->oneShot = 1; a->canBeInterrupted = false; return a; @@ -2600,6 +2626,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG a->canBeInterrupted = false; return a; } + //Upkeep Cost found = s.find("upcost"); if (found != string::npos) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 25babaed2..435c04769 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -262,6 +262,8 @@ void MTGCardInstance::initMTGCI() chooseacolor = -1; chooseasubtype = ""; coinSide = -1; + dieSide = 0; + lastRollResult = 0; isAttacking = NULL; storedCard = NULL; storedSourceCard = NULL; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 624b6089b..bb5b0f56a 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -297,6 +297,11 @@ WEventCardSurveiled::WEventCardSurveiled(MTGCardInstance * card) : { } +WEventCardRollDie::WEventCardRollDie(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} + WEventCardMutated::WEventCardMutated(MTGCardInstance * card) : WEventCardUpdate(card) { @@ -516,6 +521,12 @@ Targetable * WEventCardSurveiled::getTarget(int target) return NULL; } +Targetable * WEventCardRollDie::getTarget(int target) +{ + if (target) return card; + return NULL; +} + Targetable * WEventTokenCreated::getTarget(int target) { if (target) return card;