diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index d857509f3..c63902e15 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -4684,6 +4684,17 @@ power=2 toughness=1 [/card] [card] +name=Attentive Skywarden +abilities=flying +auto=combatdamaged(player) from(this):may name(Transform incubator) target(incubator|mybattlefield) transforms((,newability[name(Becomes creature) becomes(Creature^Phyrexian) forever])) forever +text=Flying -- Whenever Attentive Skywarden deals combat damage to a player or battle, transform up to one target Incubator token you control. +mana={2}{W} +type=Creature +subtype=Phyrexian Kor +power=2 +toughness=2 +[/card] +[card] name=Atzal, Cave of Eternity auto={T}:Add{W} auto={T}:Add{U} @@ -6948,6 +6959,13 @@ power=4 toughness=4 [/card] [card] +name=Belenon War Anthem +auto=lord(creature|myBattlefield) 1/1 +text=Creatures you control get +1/+1. +color=white +type=Enchantment +[/card] +[card] name=Belfry Spirit abilities=flying auto=name(Create Bats) token(Bat,Creature Bat,1/1,black,flying)*2 @@ -8020,7 +8038,7 @@ name=Blazing Torch auto={1}:equip auto=teach(creature) cantbeblockedby(creature[Zombie]) auto=teach(creature) cantbeblockedby(creature[Vampire]) -auto=teach(creature) {T}{S(Blazing Torch)}:damage:2 target(player,creature) +auto=teach(creature) {T}{S(Blazing Torch)}:damage:2 target(player,creature,planeswalker) text=Equipped creature can't be blocked by Vampires or Zombies. -- Equipped creature has "{T}, Sacrifice Blazing Torch: Blazing Torch deals 2 damage to target creature or player." -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={1} type=Artifact @@ -18858,6 +18876,16 @@ mana={2}{W} type=Sorcery [/card] [card] +name=Cut Short +other={convoke} name(Convoke) +auto=if compare(restriction{opponentturnonly}~morethan~0) then if type(planeswalker|opponentbattlefield)~morethan~0 then choice name(Destroy activated planeswalker) name(Destroy activated planeswalker) name(Destroy activated planeswalker) target(planeswalker|opponentbattlefield) destroy +auto=if compare(restriction{myturnonly}~morethan~0) then if type(planeswalker|mybattlefield)~morethan~0 then choice name(Destroy activated planeswalker) name(Destroy activated planeswalker) name(Destroy activated planeswalker) target(planeswalker|mybattlefield) destroy +auto=if type(creature[tapped]|battlefield)~morethan~0 then choice name(Destroy tapped creature) name(Destroy tapped creature) target(creature[tapped]|battlefield) destroy +text=Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.) -- Destroy target planeswalker that was activated this turn or tapped creature. +mana={2}{W} +type=Instant +[/card] +[card] name=Cutthroat Centurion auto={S(other artifact,creature|mybattlefield)}:2/2 ueot limit:1 text=Sacrifice another artifact or creature: Cutthroat Centurion gets +2/+2 until end of turn. Activate only once each turn. @@ -25378,6 +25406,22 @@ power=1 toughness=1 [/card] [card] +name=Elesh Norn +abilities=vigilance +backside=The Argent Etchings +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=@damaged(*|mybattlefield) from(*|opponentzones):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{1}]] name(pay 1 mana) donothing?life:-2!$ opponent +auto=@damageof(player) from(*|opponentzones):name(pay or lifeloss) ability$!name(pay or lifeloss) pay[[{1}]] name(pay 1 mana) donothing?life:-2!$ opponent +auto={2}{W}{S(other creature|mybattlefield)}{S(other creature|mybattlefield)}{S(other creature|mybattlefield)}:name(Exile and transform) moveto(myexile) and!( flip(backside) forcetype(Enchantment Saga) )! asSorcery +text=Vigilance -- Whenever a source an opponent controls deals damage to you or a permanent you control, that source's controller loses 2 life unless they pay {1}. -- {2}{W}, Sacrifice three other creatures: Exile Elesh Norn, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery. +mana={2}{W}{W} +type=Legendary Creature +subtype=Phyrexian Praetor +power=3 +toughness=5 +[/card] +[card] name=Elfhame Druid auto={T}:add{G} auto=this(variable{type:*[haskicker]:myrestrictedcastingzone}>0) {T}:add{G}{G} @@ -26240,6 +26284,16 @@ power=3 toughness=3 [/card] [card] +name=Enduring Bondwarden +auto=name(Put counter on creature) target(creature|battlefield) transforms((,newability[counter(1/1)],newability[_DIES_this(counter{1/1}>=1) name(Move 1/1 counters) target(creature|myBattlefield) counter(1/1.hasnct11)])) forever +text=Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following ability until end of turn.) -- When this creature dies, put its counters on target creature you control. +mana={W} +type=Creature +subtype=Human Scout +power=0 +toughness=1 +[/card] +[card] name=Enduring Renewal auto=replacedraw if type(creature[zpos=1]|mylibrary)~morethan~0 then moveto(ownergraveyard) all(*[zpos=1]|mylibrary) else draw:1 controller auto=@movedTo(creature|mygraveyard) from(battlefield):all(trigger[to]) moveTo(myhand) @@ -37411,6 +37465,25 @@ power=1 toughness=1 [/card] [card] +name=Guildpact Paragon +aicode=activate transforms((,newability[if type(*[multicolor&zpos<=6]|mylibrary)~morethan~0 then target(*[multicolor&zpos<=6]|mylibrary) moveTo(myHand) and!( all(other *[zpos<=6]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=6]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot +auto=@movedTo(*[black&red&-green&-blue&-white]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[black&green&-red&-blue&-white]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[black&white&-green&-blue&-red]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[black&blue&-green&-red&-white]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[blue&red&-green&-black&-white]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[blue&green&-black&-red&-white]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[blue&white&-green&-red&-black]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[white&red&-green&-blue&-black]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[white&green&-red&-blue&-black]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +auto=@movedTo(*[green&red&-white&-blue&-black]|mystack):name(look top 6 cards) reveal:6 optionone name(Get multicolored card) target(*[multicolor]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend +text=Whenever you cast a spell that's exactly two colors, look at the top six cards of your library. You may reveal a card that's exactly two colors from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +type=Artifact Creature +subtype=Construct +power=5 +toughness=5 +[/card] +[card] name=Guildsworn Prowler abilities=deathtouch auto=_DIES_may name(Draw a card) draw:1 controller @@ -42612,6 +42685,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Infected Defector +auto=_DIES_name(Incubate 3) name(Incubate 3) token(Incubator^Artifact^0/0) and!( transforms((,newability[_DIES_:all(Brimaz^ Blight of Oreskos|mybattlefield) name(Phyrexian died) counter(0/0.1.BrimazEffect) notrg],newability[counter(1/1.3)],newability[{2}:name(Becomes creature) becomes(Creature^Phyrexian) forever])) forever )! +text=When Infected Defector dies, incubate 3. (Create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.) +mana={4}{W} +type=Creature +subtype=Phyrexian Knight +power=4 +toughness=3 +[/card] +[card] name=Infectious Bite target=creature|mybattlefield auto=transforms((,newability[target(creature|opponentbattlefield) dynamicability])) forever @@ -43640,6 +43723,32 @@ power=4 toughness=5 [/card] [card] +name=Invasion of Belenon +backside=Belenon War Anthem +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=name(Create knight) token(Knight,Creature Knight,2/2,white,blue,vigilance) +auto=moveto(opponentbattlefield) and!( counter(0/0,3,Defense) )! +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Enchantment) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Belenon enters the battlefield, create a 2/2 white and blue Knight creature token with vigilance. +mana={2}{W} +type=Battle +subtype=Siege +[/card] +[card] +name=Invasion of Ravnica +backside=Guildpact Paragon +restriction=compare(isflipped)~equalto~0 +anyzone={0}:doubleside(backside) +auto=name(Exile opponent permanent) target(*[multicolor]|opponentbattlefield) moveto(exile) +auto=moveto(opponentbattlefield) and!( counter(0/0,4,Defense) )! +auto=@counterremoved(0/0,1,Defense) from(this) restriction{compare(hascntdefense)~equalto~0}:name(Exile and transforms) name(Exile and transforms) moveto(ownerexile) and!( flip(backside) forcetype(Artifact Creature Construct) )! asSorcery +text=(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) -- When Invasion of Ravnica enters the battlefield, exile target nonland permanent an opponent controls that isn't exactly two colors. +mana={5} +type=Battle +subtype=Siege +[/card] +[card] name=Invasion of the Giants auto=counter(0/0,1,Lore) auto=@each my firstmain:counter(0/0,1,Lore) @@ -47312,8 +47421,8 @@ auto=if type(creature|mygraveyard)~morethan~0 then if type(artifact|battlefield) auto=if type(creature|mygraveyard)~morethan~0 then choice name(Return creature and deals damage) name(Return creature and deals damage) target(creature|mygraveyard) moveto(myhand) && ability$!name(Deals 2 damage) name(Deals 2 damage) damage:2 target(player,creature)!$ controller auto=if type(artifact|battlefield)~morethan~0 then choice name(Destroy artifact and opponent discards) name(Destroy artifact and opponent discards) target(artifact) destroy && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ opponent auto=if type(artifact|battlefield)~morethan~0 then choice name(Destroy artifact and you discard) name(Destroy artifact and you discard) target(artifact) destroy && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller -auto=choice name(Deals damage and opponent discards) damage:2 target(player,creature) && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ opponent -auto=choice name(Deals damage and you discard) damage:2 target(player,creature) && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller +auto=choice name(Deals damage and opponent discards) damage:2 target(player,creature,planeswalker) && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ opponent +auto=choice name(Deals damage and you discard) damage:2 target(player,creature,planeswalker) && ability$!name(Discard a card) name(Discard a card) notatarget(*|myhand) reject!$ controller auto=if type(artifact|battlefield)~morethan~0 then choice name(Destroy artifact and deals damage) name(Destroy artifact and deals damage) target(artifact) destroy && ability$!name(Deals 2 damage) name(Deals 2 damage) damage:2 target(player,creature)!$ controller text=Choose two -- Return target creature card from your graveyard to your hand. -- Target player discards a card. -- Destroy target artifact. -- Kolaghan's Command deals 2 damage to target creature or player. mana={1}{B}{R} @@ -57760,7 +57869,7 @@ toughness=3 [/card] [card] name=Ninja's Kunai -auto=teach(creature) {1}{T}{S(Ninja's Kunai)}:damage:3 target(player,creature) +auto=teach(creature) {1}{T}{S(Ninja's Kunai)}:damage:3 target(player,creature,planeswalker) auto={1}:equip text=Equipped creature has "{1}, {T}, Sacrifice Ninja's Kunai: Ninja's Kunai deals 3 damage to any target." -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) mana={1} @@ -63050,8 +63159,8 @@ type=Sorcery name=Pollen Remedy abilities=hasotherkicker other={W}{S(land|myBattlefield)} name(Pay kicker) -auto=if paid(alternative) then thisforeach(variable{6}) ability$!name(Prevent 1 damage) name(Prevent 1 damage) target(player,creature) prevent:1!$ controller -auto=ifnot paid(alternative) then thisforeach(variable{3}) ability$!name(Prevent 1 damage) name(Prevent 1 damage) target(player,creature) prevent:1!$ controller +auto=if paid(alternative) then thisforeach(variable{6}) ability$!name(Prevent 1 damage) name(Prevent 1 damage) target(player,creature,planeswalker) prevent:1!$ controller +auto=ifnot paid(alternative) then thisforeach(variable{3}) ability$!name(Prevent 1 damage) name(Prevent 1 damage) target(player,creature,planeswalker) prevent:1!$ controller text=Kicker - Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -- Prevent the next 3 damage that would be dealt this turn to any number of targets, divided as you choose. If this spell was kicked, prevent the next 6 damage this way instead. mana={W} type=Instant @@ -71778,7 +71887,7 @@ toughness=4 [/card] [card] name=Sanctum Guardian -auto={S}:name(Prevent all damage) target(player,creature) prevent:20 +auto={S}:name(Prevent all damage) target(player,creature,planeswalker) prevent:20 text=Sacrifice Sanctum Guardian: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. mana={1}{W}{W} type=Creature @@ -80533,7 +80642,7 @@ toughness=0 [card] name=Spitfire Bastion auto={T}:Add{R} -auto={2}{R}{T}:damage:3 target(creature,player,planeswalker) +auto={2}{R}{T}:damage:3 target(player,creature,planeswalker) text=(Transforms from Vance's Blasting Cannons.) -- {T}: Add {R} to your mana pool. -- {2}{R}, {T}: Spitfire Bastion deals 3 damage to any target. type=Legendary Land [/card] @@ -86176,6 +86285,19 @@ type=Enchantment subtype=Saga [/card] [card] +name=The Argent Etchings +auto=counter(0/0,1,Lore) +auto=@each my firstmain:counter(0/0,1,Lore) +auto=name(Incubate 2 five times) token(Incubator^Artifact^0/0)*5 and!( transforms((,newability[_DIES_:all(Brimaz^ Blight of Oreskos|mybattlefield) name(Phyrexian died) counter(0/0.1.BrimazEffect) notrg],newability[counter(1/1.2)],newability[{2}:name(Becomes creature) becomes(Creature^Phyrexian) forever],newability[name(Becomes creature) becomes(Creature^Phyrexian) forever])) forever )! +auto=name(Transform all incubators) all(incubator[-creature]|mybattlefield) transforms((,newability[name(Becomes creature) becomes(Creature^Phyrexian) forever])) forever +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.2.Lore}=) name(Creatures gain 1/1) all(creature|mybattlefield) transforms((,newability[1/1],newability[double strike])) ueot +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Destroy all prermanents) all(other *[-land;-phyrexian;-artifact) destroy +auto=@counteradded(0/0,1,Lore) from(this):this(counter{0/0.3.Lore}) name(Exile and return) moveto(myexile) and!( moveto(mybattlefield) )! +text=(As this Saga enters and after your draw step, add a lore counter.) -- I — Incubate 2 five times, then transform all Incubator tokens you control. -- II — Creatures you control get +1/+1 and gain double strike until end of turn. -- III — Destroy all other permanents except for artifacts, lands, and Phyrexians. Exile The Argent Etchings, then return it to the battlefield (front face up). +type=Enchantment +subtype=Saga +[/card] +[card] name=The Atropal abilities=deathtouch text=Deathtouch @@ -90519,7 +90641,7 @@ toughness=3 [card] name=Tyrant of Kher Ridges abilities=flying -auto=damage:4 target(creature,player,planeswalker) +auto=damage:4 target(player,creature,planeswalker) auto={R}:1/0 ueot text=Flying -- When Tyrant of Kher Ridges enters the battlefield, it deals 4 damage to any target. -- {R}: Tyrant of Kher Ridges gets +1/+0 until end of turn. mana={4}{R}{R} diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 84d241281..373952856 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -2427,7 +2427,7 @@ toughness=1 [card] name=Alabaster Potion auto=choice life:X target(player) -auto=choice prevent:X target(creature,player,planeswalker) +auto=choice prevent:X target(player,creature,planeswalker) text=Choose one -- Target player gains X life. -- Prevent the next X damage that would be dealt to any target this turn. mana={X}{W}{W} type=Instant @@ -27892,7 +27892,7 @@ type=Instant [/card] [card] name=Defender en-Vec -auto={C(0/0,-1,Fade)}:name(Prevent 2 damage) prevent:2 target(player,creature) +auto={C(0/0,-1,Fade)}:name(Prevent 2 damage) prevent:2 target(player,creature,planeswalker) auto=fading:4 text=Fading 4 (This creature enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.) -- Remove a fade counter from Defender en-Vec: Prevent the next 2 damage that would be dealt to target creature or player this turn. mana={3}{W} @@ -47429,7 +47429,7 @@ toughness=1 [/card] [card] name=Goblin Artillery -auto={T}:damage:2 target(player,creature) && damage:3 controller +auto={T}:damage:2 target(player,creature,planeswalker) && damage:3 controller text={T}: Goblin Artillery deals 2 damage to target creature or player and 3 damage to you. mana={1}{R}{R} type=Creature @@ -95158,7 +95158,7 @@ subtype=Arcane [card] name=Riddle of Lightning aicode=activate transforms((,newability[all(*[zpos=1]|mylibrary) transforms((,newability[name(Damage creature or player) target(player^creature) damage:manacost])) oneshot])) oneshot -auto=scry:3 scrycore delayed target(player,creature) damage:revealedmana scrycoreend scryend +auto=scry:3 scrycore delayed target(player,creature,planeswalker) damage:revealedmana scrycoreend scryend text=Choose target creature or player. Scry 3, then reveal the top card of your library. Riddle of Lightning deals damage equal to that card's mana value to that creature or player. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) mana={3}{R}{R} type=Instant @@ -104427,7 +104427,7 @@ toughness=1 [/card] [card] name=Shock -target=creature,player +target=player,permanent auto=Damage:2 text=Shock deals 2 damage to target creature or player. mana={R} diff --git a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt index 8bb8c5c11..f2eb8fc5f 100644 --- a/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt +++ b/projects/mtg/bin/Res/sets/primitives/planeswalkers.txt @@ -3101,7 +3101,7 @@ subtype=Ugin [card] name=Ugin, the Spirit Dragon auto=counter(0/0,7,loyalty) -auto={C(0/0,2,Loyalty)}:name(+2: Deals 3 damage to target creature or player) damage:3 target(player,creature) +auto={C(0/0,2,Loyalty)}:name(+2: Deals 3 damage to target creature or player) damage:3 target(player,creature,planeswalker) auto={C(0/0,-0,Loyalty)}:name(-0: Exile each permanent with mana cost 0) moveto(exile) all(*[white;blue;black;red;green;manacost<=0]) auto={C(0/0,-1,Loyalty)}:name(-1: Exile each permanent with mana cost 1) moveto(exile) all(*[white;blue;black;red;green;manacost<=1]) auto={C(0/0,-2,Loyalty)}:name(-2: Exile each permanent with mana cost 2) moveto(exile) all(*[white;blue;black;red;green;manacost<=2]) diff --git a/projects/mtg/include/Subtypes.h b/projects/mtg/include/Subtypes.h index ff091e198..59424e2aa 100644 --- a/projects/mtg/include/Subtypes.h +++ b/projects/mtg/include/Subtypes.h @@ -34,7 +34,8 @@ public: TYPE_EMBLEM = 19, TYPE_CONSPIRACY = 20, TYPE_BACKGROUND = 21, - LAST_TYPE = TYPE_BACKGROUND, + TYPE_BATTLE = 22, + LAST_TYPE = TYPE_BATTLE, }; protected: diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index dfe9069b8..d00154caf 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -723,7 +723,7 @@ int OrderedAIAction::getEfficiency() if (ability->source) { - if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER)) + if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER) || ability->source->hasType(Subtypes::TYPE_BATTLE)) efficiency += 40; else if(ability->source->hasType(Subtypes::TYPE_LAND)) { // probably a shockland, don't pay life if hand is empty @@ -2813,6 +2813,9 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1])) continue; + + if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1])) + continue; if(hints && hints->HintSaysItsForCombo(observer,card)) { @@ -2981,6 +2984,9 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1])) continue; + + if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1])) + continue; if(hints && hints->HintSaysItsForCombo(observer,card)) { @@ -3748,7 +3754,7 @@ int AIPlayerBaka::computeActions() else { //look for the most expensive creature we can afford. If not found, try enchantment, then artifact, etc... - const char* types[] = {"planeswalker","creature", "enchantment", "artifact", "sorcery", "instant"}; + const char* types[] = {"planeswalker","creature", "enchantment", "artifact", "sorcery", "instant", "battle"}; int count = 0; while (!nextCardToPlay && count < 6) { diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f96d3e52d..8bc00caef 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1545,7 +1545,7 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, if (_target) { WParsedInt damage(d, NULL, (MTGCardInstance *)source); - if(_target == game->opponent() && game->opponent()->inPlay()->hasType("planeswalker") && !redirected) + if(_target == game->opponent() && (game->opponent()->inPlay()->hasType("planeswalker") || game->opponent()->inPlay()->hasType("battle")) && !redirected) { vectorselection; MTGCardInstance * check = NULL; @@ -1557,7 +1557,7 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, for(int i = 0; i < checkWalkers;++i) { check = ((Player*)_target)->game->battlefield->cards[i]; - if(check->hasType(Subtypes::TYPE_PLANESWALKER)) + if(check->hasType(Subtypes::TYPE_PLANESWALKER) || check->hasType(Subtypes::TYPE_BATTLE)) { this->redirected = true; MTGAbility * setWalker = this->clone(); @@ -1591,7 +1591,7 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, const string AADamager::getMenuText() { MTGCardInstance * _target = dynamic_cast(target); - if(_target && _target->hasType(Subtypes::TYPE_PLANESWALKER)) + if(_target && _target->hasType(Subtypes::TYPE_PLANESWALKER) || _target && _target->hasType(Subtypes::TYPE_BATTLE)) return _target->name.c_str(); if(redirected) { @@ -10015,7 +10015,7 @@ int AACastCard::resolveSpell() } } - if (putinplay && (copy->hasType(Subtypes::TYPE_ARTIFACT) || copy->hasType(Subtypes::TYPE_CREATURE) || copy->hasType(Subtypes::TYPE_ENCHANTMENT) || copy->hasType(Subtypes::TYPE_PLANESWALKER))) + if (putinplay && (copy->hasType(Subtypes::TYPE_ARTIFACT) || copy->hasType(Subtypes::TYPE_CREATURE) || copy->hasType(Subtypes::TYPE_ENCHANTMENT) || copy->hasType(Subtypes::TYPE_PLANESWALKER) || copy->hasType(Subtypes::TYPE_BATTLE))) spell->resolve(); // Fixed a crash when using and!()! with namedcard permanents. if(andAbility) @@ -10041,7 +10041,7 @@ int AACastCard::resolveSpell() MTGCardInstance * copy = NULL; if ((normal || asNormalMadness)||(!_target->hasType(Subtypes::TYPE_INSTANT) && !_target->hasType(Subtypes::TYPE_SORCERY))) { - if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER)||_target->hasType(Subtypes::TYPE_BATTLE))) copy = _target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->reveal, noEvent); // Fixed a problem with previous zone of card, it cannot be directly battlefield. else copy = _target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack, noEvent); @@ -10051,7 +10051,7 @@ int AACastCard::resolveSpell() } else { - if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER)||_target->hasType(Subtypes::TYPE_BATTLE))) copy = _target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->reveal, noEvent); // Fixed a problem with previous zone of card, it cannot be directly battlefield. else copy = _target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack, noEvent); diff --git a/projects/mtg/src/Damage.cpp b/projects/mtg/src/Damage.cpp index 3ba6ab790..cf7a4f30a 100644 --- a/projects/mtg/src/Damage.cpp +++ b/projects/mtg/src/Damage.cpp @@ -75,7 +75,7 @@ int Damage::resolve() //------------------------------------------------- //Ajani Steadfast --- - if(target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && ((MTGCardInstance*)target)->hasType("planeswalker") && ((MTGCardInstance*)target)->controller()->forcefield) + if(target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && (((MTGCardInstance*)target)->hasType("planeswalker") || ((MTGCardInstance*)target)->hasType("battle")) && ((MTGCardInstance*)target)->controller()->forcefield) damage = 1; if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { @@ -310,6 +310,19 @@ int Damage::resolve() } } } + + if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE && ((MTGCardInstance*)target)->hasType(Subtypes::TYPE_BATTLE)){ // Fix life calculation for battle damage. + if (((MTGCardInstance*)target)->counters){ + Counters * counters = ((MTGCardInstance*)target)->counters; + for(size_t i = 0; i < counters->counters.size(); ++i){ + Counter * counter = counters->counters[i]; + if(counter->name == "defense"){ + target->life = counter->nb - target->damageCount; + break; + } + } + } + } //Send (Damage/Replaced effect) event to listeners observer->receiveEvent(e); return a; diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 505ba6016..c4f4d61b3 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -857,6 +857,8 @@ void GameObserver::gameStateBasedEffects() found++; if(stypes.find("planeswalker") != string::npos && card->target->hasType("planeswalker")) found++; + if(stypes.find("battle") != string::npos && card->target->hasType("battle")) + found++; } if((!found || protectionfromQ) && !card->isBestowed) diff --git a/projects/mtg/src/GuiPlay.cpp b/projects/mtg/src/GuiPlay.cpp index b5a49fa2e..a955f61f7 100644 --- a/projects/mtg/src/GuiPlay.cpp +++ b/projects/mtg/src/GuiPlay.cpp @@ -196,7 +196,7 @@ GuiPlay::~GuiPlay() bool isSpell(CardView* c) { - return c->card->isSpell() && !c->card->isCreature() && !c->card->hasType(Subtypes::TYPE_PLANESWALKER); + return c->card->isSpell() && !c->card->isCreature() && !c->card->hasType(Subtypes::TYPE_PLANESWALKER) && !c->card->hasType(Subtypes::TYPE_BATTLE); } void GuiPlay::Replace() { @@ -208,7 +208,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) && !(*it)->card->hasType(Subtypes::TYPE_BATTLE)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfSpellsN; @@ -229,7 +229,7 @@ void GuiPlay::Replace() else ++opponentCreaturesN; } - else if ((*it)->card->isLand() || (*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + else if ((*it)->card->isLand() || (*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) || (*it)->card->hasType(Subtypes::TYPE_BATTLE)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) ++selfLandsN; @@ -244,7 +244,7 @@ void GuiPlay::Replace() for (iterator it = cards.begin(); it != end_spells; ++it) if (!(*it)->card->target) { - if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + if((!(*it)->card->hasSubtype(Subtypes::TYPE_AURA)|| ((*it)->card->hasSubtype(Subtypes::TYPE_AURA) && (*it)->card->playerTarget)) && !(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) && !(*it)->card->hasType(Subtypes::TYPE_BATTLE)) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfSpells.Enstack(*it); @@ -287,7 +287,7 @@ void GuiPlay::Replace() //rerun the iter reattaching planes walkers to the back of the lands. for (iterator it = end_spells; it != cards.end(); ++it) { - if ((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) && !(*it)->card->isCreature()) + if (((*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) || (*it)->card->hasType(Subtypes::TYPE_BATTLE)) && !(*it)->card->isCreature()) { if (mpDuelLayers->getRenderedPlayer() == (*it)->card->controller()) selfLands.Enstack(*it); @@ -310,7 +310,7 @@ void GuiPlay::Render() if(dtarget && dtarget->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * ctarget = ((MTGCardInstance *)(*it)->card->isAttacking); - if(ctarget->hasType(Subtypes::TYPE_PLANESWALKER) && observer->isInPlay(ctarget) && observer->getCurrentGamePhase() < MTG_PHASE_COMBATEND) + if((ctarget->hasType(Subtypes::TYPE_PLANESWALKER) || ctarget->hasType(Subtypes::TYPE_BATTLE)) && observer->isInPlay(ctarget) && observer->getCurrentGamePhase() < MTG_PHASE_COMBATEND) { JRenderer::GetInstance()->DrawLine((*it)->actX,(*it)->actY,ctarget->view->actX,ctarget->view->actY,0.5f,ARGB(128 - wave, 255, 40, 40)); } @@ -331,7 +331,7 @@ void GuiPlay::Render() else opponentCreatures.Render(*it, cards.begin(), end_spells); } - else if(!(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER)) + else if(!(*it)->card->hasType(Subtypes::TYPE_PLANESWALKER) && !(*it)->card->hasType(Subtypes::TYPE_BATTLE)) { if (!(*it)->card->target) { diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 6cf65f8bd..d9435e818 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -521,6 +521,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe if (grave->hasType("land")) checkTypesAmount++; if (grave->hasType("artifact")) checkTypesAmount++; if (grave->hasType("planeswalker")) checkTypesAmount++; + if (grave->hasType("battle")) checkTypesAmount++; if (grave->hasType("tribal")) checkTypesAmount++; if (checkTypesAmount < 4) return 0; @@ -540,6 +541,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe if (grave->hasType("land")) checkTypesAmount++; if (grave->hasType("artifact")) checkTypesAmount++; if (grave->hasType("planeswalker")) checkTypesAmount++; + if (grave->hasType("battle")) checkTypesAmount++; if (grave->hasType("tribal")) checkTypesAmount++; if (checkTypesAmount > 3) return 0; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 2ad46b7f7..2e9e25b58 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -2055,7 +2055,7 @@ int MTGAttackRule::receiveEvent(WEvent *e) if(dtarget->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * ctarget = ((MTGCardInstance *)card->isAttacking); - if(ctarget->hasType(Subtypes::TYPE_PLANESWALKER)) + if(ctarget->hasType(Subtypes::TYPE_PLANESWALKER) || ctarget->hasType(Subtypes::TYPE_BATTLE)) card->toggleAttacker();//if a card has cantpwattack, then you cant } } @@ -2112,14 +2112,14 @@ int MTGPlaneswalkerAttackRule::isReactingToClick(MTGCardInstance * card, ManaCos { if (currentPhase == MTG_PHASE_COMBATATTACKERS && card->controller() == game->currentPlayer && card->controller() == game->currentlyActing())//on my turn and when I am the acting player. { - if(!card->controller()->opponent()->game->inPlay->hasType("planeswalker")) + if(!card->controller()->opponent()->game->inPlay->hasType("planeswalker") && !card->controller()->opponent()->game->inPlay->hasType("battle")) return 0; if(card->isPhased) return 0; if ((card->isAttacker()) || (card->canAttack(true) && card->attackPlaneswalkerCost < 1)) { if(!card->isAttacker()) - attackpwmenu = "Attack Planeswalker"; + attackpwmenu = "Attack Planeswalker or Battle"; else attackpwmenu = "Remove Attacker"; @@ -2158,7 +2158,7 @@ int MTGPlaneswalkerAttackRule::reactToClick(MTGCardInstance * card) for(int i = 0; i < checkWalkers;++i) { check = card->controller()->opponent()->game->battlefield->cards[i]; - if(check->hasType(Subtypes::TYPE_PLANESWALKER)) + if(check->hasType(Subtypes::TYPE_PLANESWALKER) || check->hasType(Subtypes::TYPE_BATTLE)) { MTGAbility * setPw = NEW AAPlaneswalkerAttacked(game, game->mLayers->actionLayer()->getMaxId(), card,check); MTGAbility * setWalker = setPw->clone(); @@ -2168,7 +2168,6 @@ int MTGPlaneswalkerAttackRule::reactToClick(MTGCardInstance * card) } } - if(selection.size()) { MTGAbility * a1 = NEW MenuAbility(game, this->GetId(), card, card,false,selection); @@ -3969,6 +3968,15 @@ int MTGPlaneswalkerDamage::receiveEvent(WEvent * event) } return 1; } + if (d->damage > 0 && card && card->hasType(Subtypes::TYPE_BATTLE)) + { + int howMany = d->damage; + for(int k = 0; k < howMany; k++) + { + card->counters->removeCounter("defense", 0, 0); + } + return 1; + } } if (WEventCounters * removel = dynamic_cast(event)) { @@ -3978,7 +3986,6 @@ int MTGPlaneswalkerDamage::receiveEvent(WEvent * event) removel->targetCard->toGrave(true); return 1; } - } return 0; } diff --git a/projects/mtg/src/Subtypes.cpp b/projects/mtg/src/Subtypes.cpp index e1ce589a4..70c602865 100644 --- a/projects/mtg/src/Subtypes.cpp +++ b/projects/mtg/src/Subtypes.cpp @@ -26,6 +26,8 @@ Subtypes::Subtypes() find("Dungeon"); find("Emblem"); find("Conspiracy"); + find("Backgorund"); + find("Battle"); } int Subtypes::find(string value, bool forceAdd) @@ -97,7 +99,12 @@ bool Subtypes::isType(unsigned int type) type == TYPE_TRIBAL || type == TYPE_PLANE || type == TYPE_SCHEME || - type == TYPE_VANGUARD + type == TYPE_VANGUARD || + type == TYPE_DUNGEON || + type == TYPE_EMBLEM || + type == TYPE_CONSPIRACY || + type == TYPE_BACKGROUND || + type == TYPE_BATTLE ); } diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 98ec1c747..c4f9b7583 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -141,19 +141,21 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta several = s.find(""); if (several != string::npos) maxtargets = TargetChooser::UNLITMITED_TARGETS; found = s.find("creature,planeswalker"); - if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker) + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker, battle) found = s.find("planeswalker,creature"); - if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker) + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker, battle) found = s.find("creature^planeswalker"); - if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker) + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker, battle) found = s.find("planeswalker^creature"); - if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker) + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "creature,planeswalker"); //Any Damageable target (player, creature, planeswalker, battle) found = s.find("permanent"); - if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "permanent"); //Any player or permanet (player, creature, planeswalker, artifact, land, enchantment) + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "permanent"); //Any player or permanent (player, creature, planeswalker, artifact, land, enchantment, battle) found = s.find("creature"); if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other); //2 Damageable target (player, creature) found = s.find("planeswalker"); if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "planeswalker"); //2 Damageable target (player, planeswalker) + found = s.find("battle"); + if (found != string::npos) return NEW DamageableTargetChooser(observer, card, maxtargets, other, false, "battle"); //2 Damageable target (player, battle) return NEW PlayerTargetChooser(observer, card, maxtargets); //Any player } @@ -967,6 +969,7 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta cd->removeType("legendary"); cd->removeType("creature"); cd->removeType("planeswalker"); + cd->removeType("battle"); cd->removeType("tribal"); if (!cd->types.size()){ int i = rand() % 10000 + 1; @@ -1527,6 +1530,8 @@ TypeTargetChooser::TypeTargetChooser(GameObserver *observer, const char * _type, addType(id); id = MTGAllCards::findType("planeswalker"); addType(id); + id = MTGAllCards::findType("battle"); + addType(id); } else if(!strcmp(_type,"permanent")){ int id = MTGAllCards::findType("creature"); addType(id); @@ -1538,6 +1543,8 @@ TypeTargetChooser::TypeTargetChooser(GameObserver *observer, const char * _type, addType(id); id = MTGAllCards::findType("enchantment"); addType(id); + id = MTGAllCards::findType("battle"); + addType(id); } else { int id = MTGAllCards::findType(_type); addType(id); diff --git a/projects/mtg/src/WGui.cpp b/projects/mtg/src/WGui.cpp index 6e957d9ae..b9f37ab75 100644 --- a/projects/mtg/src/WGui.cpp +++ b/projects/mtg/src/WGui.cpp @@ -2112,6 +2112,9 @@ void WGuiFilterItem::updateValue() mParent->addArg("Sorcery", "t:Sorcery;"); mParent->addArg("Tribal", "t:Tribal;"); mParent->addArg("Planeswalker", "t:Planeswalker;"); + mParent->addArg("Battle", "t:Battle;"); + mParent->addArg("Dungeon", "t:Dungeon;"); + mParent->addArg("Conspiracy", "t:Conspiracy;"); } else if (filterType == FILTER_SUBTYPE) diff --git a/projects/mtg/src/WParsedInt.cpp b/projects/mtg/src/WParsedInt.cpp index 299edd8ae..30131c157 100644 --- a/projects/mtg/src/WParsedInt.cpp +++ b/projects/mtg/src/WParsedInt.cpp @@ -1184,6 +1184,8 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card) intValue++; if(card->hasType(Subtypes::TYPE_ARTIFACT)) intValue++; + if(card->hasType(Subtypes::TYPE_BATTLE)) + intValue++; } } else if (s == "pcycledcount" || s == "ocycledcount") //return how may cards have been cycled this turn from a specific player. @@ -1258,6 +1260,8 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) cc = 1; if(cardHasTypeinZone("artifact",checkZone)) ac = 1; + if(cardHasTypeinZone("battle",checkZone)) + ac = 1; } } else { MTGGameZone * checkZone = (s.find("oppbattlefieldcardtypes")!=string::npos)?card->getObserver()->opponent()->game->inPlay:card->controller()->game->inPlay; @@ -1277,6 +1281,8 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) cc = 1; if(cardHasTypeinZone("artifact",checkZone)) ac = 1; + if(cardHasTypeinZone("battle",checkZone)) + ac = 1; } intValue = pc+tc+sc+lc+ic+ec+cc+ac; } @@ -1303,6 +1309,8 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) cc = 1; if(cardHasTypeinZone("artifact",checkZone)) ac = 1; + if(cardHasTypeinZone("battle",checkZone)) + ac = 1; } } else { MTGGameZone * checkZone = (s.find("oppgravecardtypes")!=string::npos)?card->getObserver()->opponent()->game->graveyard:card->controller()->game->graveyard; @@ -1322,6 +1330,8 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) cc = 1; if(cardHasTypeinZone("artifact",checkZone)) ac = 1; + if(cardHasTypeinZone("battle",checkZone)) + ac = 1; } intValue = pc+tc+sc+lc+ic+ec+cc+ac; } @@ -1334,6 +1344,7 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card) (s.find("totcntart") != string::npos && card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_ARTIFACT)) || (s.find("totcntenc") != string::npos && card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_ENCHANTMENT)) || (s.find("totcntlan") != string::npos && card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_LAND)) || + (s.find("totcntbat") != string::npos && card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_BATTLE)) || s.find("totcntall") != string::npos){ if (card->controller()->game->inPlay->cards[j]->counters){ Counters * counters = card->controller()->game->inPlay->cards[j]->counters;