From 7db5345f9acd93fe9ce914b295a51ec07d627d15 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 12:14:47 +0800 Subject: [PATCH 1/9] attempt to fix "notatarget" notatarget must be allowed to target untargettable cards. --- projects/mtg/include/MTGCardInstance.h | 1 + projects/mtg/src/MTGAbility.cpp | 5 +++++ projects/mtg/src/MTGCardInstance.cpp | 1 + projects/mtg/src/TargetChooser.cpp | 8 ++++---- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 78414efff..3d460bfdd 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -240,6 +240,7 @@ public: int swapT; bool isSwitchedPT; bool isACopier; + bool bypassTC; void eventattacked(); void eventattackedAlone(); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 653104756..2c097b8ac 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1330,7 +1330,12 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG tcString = splitTarget[1]; if (!isTarget) + { + tc->targetter->bypassTC = true; tc->targetter = NULL; + } + else + tc->targetter->bypassTC = false; sWithoutTc = splitTarget[0]; sWithoutTc.append(splitTarget[2]); } diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 1744a8d56..b40c368e4 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -57,6 +57,7 @@ MTGCardInstance::MTGCardInstance(MTGCard * card, MTGPlayerCards * arg_belongs_to isCDA = false; isSwitchedPT = false; isACopier = false; + bypassTC = false; } MTGCardInstance * MTGCardInstance::createSnapShot() diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index ca085a98e..2c91e7bc5 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -855,10 +855,10 @@ bool TargetChooser::canTarget(Targetable * target, bool withoutProtections) if (source && targetter && card->isInPlay(observer) && !withoutProtections) { - if (card->has(Constants::SHROUD)) return false; - if (card->protectedAgainst(targetter)) return false; - if (card->CantBeTargetby(targetter)) return false; - if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return false; + if (card->has(Constants::SHROUD)) return targetter->bypassTC; + if (card->protectedAgainst(targetter)) return targetter->bypassTC; + if (card->CantBeTargetby(targetter)) return targetter->bypassTC; + if ((targetter->controller() != card->controller()) && card->has(Constants::OPPONENTSHROUD)) return targetter->bypassTC; } return true; } From 2223cd4f308a8f6a24a5aa6f5917083b637a820c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 21:36:05 +0800 Subject: [PATCH 2/9] modified castcard to support put into play for reanimated aura --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 6 +++--- projects/mtg/include/AllAbilities.h | 3 ++- projects/mtg/src/AllAbilities.cpp | 16 ++++++++++++---- projects/mtg/src/MTGAbility.cpp | 3 ++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 53d678a78..44096afbf 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -30262,7 +30262,7 @@ type=Instant [/card] [card] name=Enduring Ideal -auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!(castcard(putinplay))! auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) mana={5}{W}{W} @@ -88918,7 +88918,7 @@ type=Sorcery [card] name=Silent Sentinel abilities=flying -auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield. mana={5}{W}{W} type=Creature @@ -95343,7 +95343,7 @@ type=Instant [/card] [card] name=Starfield of Nyx -auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!( transforms((,newability[if cantargetcard(aura) then retarget target(creature|mybattlefield)])) )! +auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4 diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6ca3a9cad..e3ee2a9d6 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -6025,7 +6025,8 @@ public: string nameThis; MTGCardInstance * theNamedCard; bool noEvent; - AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent); + bool putinplay; + AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay); int testDestroy(){return 0;}; void Update(float dt); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 047608339..d773b6a3b 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5507,8 +5507,8 @@ AEquip * AEquip::clone() const } // casting a card for free, or casting a copy of a card. -AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent) : - MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent) +AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay) : + MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay) { target = _target; andAbility = NULL; @@ -5633,12 +5633,18 @@ int AACastCard::resolveSpell() MTGCardInstance * copy = NULL; if (normal ||(!_target->hasType(Subtypes::TYPE_INSTANT) && !_target->hasType(Subtypes::TYPE_SORCERY))) { - copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->battlefield,noEvent); + else + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); } else { - copy =_target->controller()->game->putInZone(_target, _target->currentZone, _target->controller()->game->stack,noEvent); + if (putinplay && (_target->hasType(Subtypes::TYPE_ARTIFACT)||_target->hasType(Subtypes::TYPE_CREATURE)||_target->hasType(Subtypes::TYPE_ENCHANTMENT)||_target->hasType(Subtypes::TYPE_PLANESWALKER))) + copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->battlefield,noEvent); + else + copy =_target->controller()->game->putInZone(_target, _target->currentZone, _target->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); } if (game->targetChooser) @@ -5693,6 +5699,8 @@ const string AACastCard::getMenuText() { if(nameThis.size()) return nameThis.c_str(); + if(putinplay) + return "Put Into Play"; return "Cast For Free"; } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 2c097b8ac..7d07d4dad 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -2331,6 +2331,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG bool asCopy = splitCastCard[1].find("copied") != string::npos; bool asNormal = splitCastCard[1].find("normal") != string::npos; bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos; + bool putinplay = splitCastCard[1].find("putinplay") != string::npos; string nameCard = ""; if(splitCastCard[1].find("named!:") != string::npos) { @@ -2340,7 +2341,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG nameCard = splitCastName[1]; } } - MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent); + MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay); a->oneShot = false; if(splitCastCard[1].find("trigger[to]") != string::npos) { From 179e973b4e0f47bf2e800952f6e4e8bf296ee96e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 23 Sep 2015 21:44:29 +0800 Subject: [PATCH 3/9] typo --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 44096afbf..84b0ed8b3 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -30262,7 +30262,7 @@ type=Instant [/card] [card] name=Enduring Ideal -auto=moveto(mybattlefield) notatarget(enchantment|mylibrary) and!(castcard(putinplay))! +auto=notatarget(enchantment|mylibrary) castcard(putinplay) auto=if compare(epicactivated)~lessthan~1 then emblem transforms((,newability[epic controller],newability[@each my upkeep:castcard(copied named!:Enduring Ideal:!)])) forever dontremove text=Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. -- Epic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) mana={5}{W}{W} @@ -88918,7 +88918,7 @@ type=Sorcery [card] name=Silent Sentinel abilities=flying -auto=@combat(attacking) source(this):may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! +auto=@combat(attacking) source(this):may target(enchantment|mygraveyard) castcard(putinplay) text=Flying -- Whenever Silent Sentinel attacks, you may return target enchantment card from your graveyard to the battlefield. mana={5}{W}{W} type=Creature @@ -95343,7 +95343,7 @@ type=Instant [/card] [card] name=Starfield of Nyx -auto=@each my upkeep:may moveto(mybattlefield) target(enchantment|mygraveyard) and!(castcard(putinplay))! +auto=@each my upkeep:may target(enchantment|mygraveyard) castcard(putinplay) auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2)) >4 auto=aslongas(enchantment|mybattlefield) lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3)) >4 From 106bcec7cfc9f290746f9cdf80b435bc35bcf45a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 06:02:46 +0800 Subject: [PATCH 4/9] bypass targetchooser --- projects/mtg/src/AllAbilities.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d773b6a3b..080918a46 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5551,6 +5551,8 @@ void AACastCard::Update(float dt) } } MTGCardInstance * toCheck = (MTGCardInstance*)target; + if(putinplay) + toCheck->bypassTC = true; if(theNamedCard) toCheck = theNamedCard; if (Spell * checkSpell = dynamic_cast(target)) From 606d18aa6e7b3eeaecb73bce1766598c21074e45 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 06:24:17 +0800 Subject: [PATCH 5/9] bypassTC on playertarget --- projects/mtg/src/TargetChooser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 2c91e7bc5..4191f1f7b 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -1337,13 +1337,13 @@ bool PlayerTargetChooser::canTarget(Targetable * target, bool) if ((targetter->controller() != targetter->controller()->opponent()) && (targetter->controller()->opponent()->game->inPlay->hasAbility(Constants::CONTROLLERSHROUD)) && targetter->controller() != target) - return false; + return targetter->bypassTC; if ((targetter->controller()->opponent()->game->inPlay->hasAbility(Constants::PLAYERSHROUD)) && targetter->controller()->opponent() == target) - return false; + return targetter->bypassTC; if ((targetter->controller()->game->inPlay->hasAbility(Constants::PLAYERSHROUD)) && targetter->controller() == target) - return false; + return targetter->bypassTC; } Player * pTarget = dynamic_cast(target); From d068388e7fa253d4a23dc74ea038ff8b767e458d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 09:53:10 +0800 Subject: [PATCH 6/9] added aura targets for castcard putinplay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the special putinplay keyword for castcard is used for aura so we can "retarget" their intended targets but without casting them instead they are put onto the battlefield and the ability is not targetted :+1: 303.4c If an Aura is enchanting an illegal object or player as defined by its enchant ability and other applicable effects, the object it was attached to no longer exists, or the player it was attached to has left the game, the Aura is put into its owner’s graveyard. (This is a state-based action. See rule 704.) 303.4f If an Aura is entering the battlefield under a player’s control by any means other than by resolving as an Aura spell, and the effect putting it onto the battlefield doesn’t specify the object or player the Aura will enchant, that player chooses what it will enchant as the Aura enters the battlefield. The player must choose a legal object or player according to the Aura’s enchant ability and any other applicable effects. --- projects/mtg/src/AllAbilities.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 080918a46..f02f76ef3 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5526,6 +5526,20 @@ void AACastCard::Update(float dt) { theNamedCard = makeCard(); } + if(putinplay) + { + MTGCardInstance * toCheck = (MTGCardInstance*)target; + toCheck->bypassTC = true; + TargetChooserFactory tcf(game); + TargetChooser * atc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); + if (toCheck->hasType(Subtypes::TYPE_AURA) && !atc->validTargetsExist()) + { + processed = true; + this->forceDestroy = 1; + return ; + } + SAFE_DELETE(atc); + } if (restricted) { MTGCardInstance * toCheck = (MTGCardInstance*)target; @@ -5551,8 +5565,6 @@ void AACastCard::Update(float dt) } } MTGCardInstance * toCheck = (MTGCardInstance*)target; - if(putinplay) - toCheck->bypassTC = true; if(theNamedCard) toCheck = theNamedCard; if (Spell * checkSpell = dynamic_cast(target)) From 64578787a0ad8a52992b5ea0308ac49f88f196b8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 12:14:58 +0800 Subject: [PATCH 7/9] NULL check --- projects/mtg/bin/Res/sets/primitives/mtg.txt | 4 ++-- projects/mtg/src/AllAbilities.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index 84b0ed8b3..ae57c2fce 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -39276,7 +39276,7 @@ toughness=2 [card] name=Glimmerpoint Stag abilities=vigilance -auto=(blink)ueot target(*) +auto=(blink)ueot target(other *) text=Vigilance -- When Glimmerpoint Stag enters the battlefield, exile another target permanent. Return that card to the battlefield under its owner's control at the beginning of the next end step. mana={2}{W}{W} type=Creature @@ -70865,7 +70865,7 @@ type=Artifact [card] name=Parallax Nexus auto=fading:5 -auto={C(0/0,-1,Fade)}:target(opponent) ability$!name(exile card from hand) (blink)forsrc target(*|myhand)!$ targetedplayer +auto={C(0/0,-1,Fade)}:target(opponent) ability$!name(exile card from hand) hand(blink)forsrc target(*|myhand)!$ targetedplayer text=Fading 5 (This enchantment enters the battlefield with five 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 Parallax Nexus: Target opponent exiles a card from his or her hand. Activate this ability only any time you could cast a sorcery. -- When Parallax Nexus leaves the battlefield, each player returns to his or her hand all cards he or she owns exiled with Parallax Nexus. mana={2}{B} type=Enchantment diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index f02f76ef3..38acabbb1 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5529,6 +5529,8 @@ void AACastCard::Update(float dt) if(putinplay) { MTGCardInstance * toCheck = (MTGCardInstance*)target; + toCheck->target = NULL; + toCheck->playerTarget = NULL; toCheck->bypassTC = true; TargetChooserFactory tcf(game); TargetChooser * atc = tcf.createTargetChooser(toCheck->spellTargetType,toCheck); From a6ec3e0a68309ef00079720a1918f81b50b93bc8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 14:14:00 +0800 Subject: [PATCH 8/9] added type check on aura if the card it enchant is legal --- projects/mtg/src/GameObserver.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index a87f85dd7..584586723 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -642,6 +642,19 @@ void GameObserver::gameStateBasedEffects() { if(card->target && !isInPlay(card->target)) players[i]->game->putInGraveyard(card); + if(card->target && isInPlay(card->target)) + { + if(card->spellTargetType.find("creature") != string::npos && !card->target->hasType("creature")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("artifact") != string::npos && !card->target->hasType("artifact")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("enchantment") != string::npos && !card->target->hasType("enchantment")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("land") != string::npos && !card->target->hasType("land")) + players[i]->game->putInGraveyard(card); + if(card->spellTargetType.find("planeswalker") != string::npos && !card->target->hasType("planeswalker")) + players[i]->game->putInGraveyard(card); + } if(card->target && isInPlay(card->target) && (card->target)->protectedAgainst(card) && !card->has(Constants::AURAWARD))//protection from quality except aura cards like flickering ward players[i]->game->putInGraveyard(card); } From 201b6d9cfa6cb3cc778b34417c40f0fb00d1ab67 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 24 Sep 2015 14:45:26 +0800 Subject: [PATCH 9/9] bypassTC turn off --- projects/mtg/src/GameObserver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 584586723..95d0311fe 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -617,6 +617,7 @@ void GameObserver::gameStateBasedEffects() card->myPair->myPair = NULL; card->myPair = NULL; } + card->bypassTC = false; //turn off bypass //////////////////////////////////////////////////// //Unattach Equipments that dont have valid targets// ////////////////////////////////////////////////////