Implemented "Battle" type from MOM set (they are like planeswalkers), added some new primitives from MOM set, fixed some primitives targeting any target.

This commit is contained in:
Vittorio Alfieri
2023-05-11 15:57:08 +02:00
parent f395274c0b
commit 6ef8b45709
15 changed files with 225 additions and 44 deletions

View File

@@ -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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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(<upto:1>*[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<!powerstrike!>])) 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}

View File

@@ -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}

View File

@@ -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])

View File

@@ -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:

View File

@@ -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
@@ -2814,6 +2814,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))
{
if(hints->canWeCombo(observer,card,this))
@@ -2982,6 +2985,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))
{
if(hints->canWeCombo(observer,card,this))
@@ -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)
{

View File

@@ -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)
{
vector<MTGAbility*>selection;
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<MTGCardInstance*>(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);

View File

@@ -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;

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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;

View File

@@ -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<WEventCounters*>(event))
{
@@ -3978,7 +3986,6 @@ int MTGPlaneswalkerDamage::receiveEvent(WEvent * event)
removel->targetCard->toGrave(true);
return 1;
}
}
return 0;
}

View File

@@ -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
);
}

View File

@@ -141,19 +141,21 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
several = s.find("<anyamount>");
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);

View File

@@ -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)

View File

@@ -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;