Support scripted switching to different trigger context (#3349)

* Support scripted switching to different trigger context
This commit is contained in:
tool4ever
2023-07-20 10:34:31 +02:00
committed by GitHub
parent 8c5cd7df57
commit c1a265f5cc
12 changed files with 46 additions and 38 deletions

View File

@@ -86,10 +86,11 @@ public class AbilityUtils {
// But then we only need update one function at a time once the casting is // But then we only need update one function at a time once the casting is
// everywhere. // everywhere.
// Probably will move to One function solution sometime in the future // Probably will move to One function solution sometime in the future
public static CardCollection getDefinedCards(final Card hostCard, final String def, final CardTraitBase sa) { public static CardCollection getDefinedCards(final Card hostCard, final String def, CardTraitBase sa) {
CardCollection cards = new CardCollection(); CardCollection cards = new CardCollection();
String changedDef = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self String changedDef = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self
final String[] incR = changedDef.split("\\.", 2); final String[] incR = changedDef.split("\\.", 2);
sa = adjustTriggerContext(incR, sa);
String defined = incR[0]; String defined = incR[0];
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();
@@ -433,7 +434,7 @@ public class AbilityUtils {
public static int calculateAmount(final Card card, String amount, final CardTraitBase ability) { public static int calculateAmount(final Card card, String amount, final CardTraitBase ability) {
return calculateAmount(card, amount, ability, false); return calculateAmount(card, amount, ability, false);
} }
public static int calculateAmount(final Card card, String amount, final CardTraitBase ability, boolean maxto) { public static int calculateAmount(final Card card, String amount, CardTraitBase ability, boolean maxto) {
// return empty strings and constants // return empty strings and constants
if (StringUtils.isBlank(amount)) { return 0; } if (StringUtils.isBlank(amount)) { return 0; }
if (card == null) { return 0; } if (card == null) { return 0; }
@@ -508,6 +509,8 @@ public class AbilityUtils {
// modify amount string for text changes // modify amount string for text changes
calcX[1] = applyAbilityTextChangeEffects(calcX[1], ability); calcX[1] = applyAbilityTextChangeEffects(calcX[1], ability);
ability = adjustTriggerContext(calcX, ability);
Integer val = null; Integer val = null;
if (calcX[0].startsWith("Count")) { if (calcX[0].startsWith("Count")) {
val = xCount(card, calcX[1], ability); val = xCount(card, calcX[1], ability);
@@ -986,16 +989,15 @@ public class AbilityUtils {
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static PlayerCollection getDefinedPlayers(final Card card, final String def, final CardTraitBase sa) { public static PlayerCollection getDefinedPlayers(final Card card, final String def, CardTraitBase sa) {
final PlayerCollection players = new PlayerCollection(); final PlayerCollection players = new PlayerCollection();
final Player player = sa instanceof SpellAbility ? ((SpellAbility)sa).getActivatingPlayer() : card.getController();
final Game game = card == null ? null : card.getGame();
String changedDef = (def == null) ? "You" : applyAbilityTextChangeEffects(def, sa); // default to Self String changedDef = (def == null) ? "You" : applyAbilityTextChangeEffects(def, sa); // default to Self
final String[] incR = changedDef.split("\\.", 2); final String[] incR = changedDef.split("\\.", 2);
sa = adjustTriggerContext(incR, sa);
String defined = incR[0]; String defined = incR[0];
final Game game = card == null ? null : card.getGame();
final Player player = sa instanceof SpellAbility ? ((SpellAbility)sa).getActivatingPlayer() : card.getController();
if (defined.equals("Self") || defined.equals("TargetedCard") || defined.equals("ThisTargetedCard") if (defined.equals("Self") || defined.equals("TargetedCard") || defined.equals("ThisTargetedCard")
|| defined.startsWith("Valid") || getPaidCards(sa, defined) != null || defined.equals("TargetedSource") || defined.startsWith("Valid") || getPaidCards(sa, defined) != null || defined.equals("TargetedSource")
|| defined.startsWith("CardUID_")) { || defined.startsWith("CardUID_")) {
@@ -3887,4 +3889,20 @@ public class AbilityUtils {
} }
return false; return false;
} }
private static CardTraitBase adjustTriggerContext(String[] def, final CardTraitBase ctb) {
if (def[0].startsWith("Spawner>") && ctb instanceof SpellAbility) {
Trigger trig = ((SpellAbility) ctb).getTrigger();
if (trig == null) {
return ctb;
}
SpellAbility spawner = trig.getSpawningAbility();
if (spawner == null) {
return ctb;
}
def[0] = def[0].substring(8);
return spawner;
}
return ctb;
}
} }

View File

@@ -81,10 +81,6 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
overridingSA.setSVar("StoredTransform", String.valueOf(host.getTransformedTimestamp())); overridingSA.setSVar("StoredTransform", String.valueOf(host.getTransformedTimestamp()));
} }
if (sa.hasParam("CopyTriggeringObjects")) {
overridingSA.setTriggeringObjects(sa.getTriggeringObjects());
}
delTrig.setOverridingAbility(overridingSA); delTrig.setOverridingAbility(overridingSA);
} }
final TriggerHandler trigHandler = game.getTriggerHandler(); final TriggerHandler trigHandler = game.getTriggerHandler();

View File

@@ -70,10 +70,6 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect {
((AbilitySub)overridingSA).setParent(null); ((AbilitySub)overridingSA).setParent(null);
} }
if (sa.hasParam("CopyTriggeringObjects")) {
overridingSA.setTriggeringObjects(sa.getTriggeringObjects());
}
immediateTrig.setOverridingAbility(overridingSA); immediateTrig.setOverridingAbility(overridingSA);
} }

View File

@@ -186,7 +186,6 @@ public class CardFactory {
copySA = getCopiedTriggeredAbility((WrappedAbility)targetSA, c, controller); copySA = getCopiedTriggeredAbility((WrappedAbility)targetSA, c, controller);
} else { } else {
copySA = targetSA.copy(c, controller, false); copySA = targetSA.copy(c, controller, false);
c.setCastSA(copySA);
// need to copy keyword // need to copy keyword
if (targetSA.getKeyword() != null) { if (targetSA.getKeyword() != null) {
KeywordInterface kw = targetSA.getKeyword().copy(c, false); KeywordInterface kw = targetSA.getKeyword().copy(c, false);
@@ -206,13 +205,13 @@ public class CardFactory {
if (copySA instanceof Spell) { if (copySA instanceof Spell) {
Spell spell = (Spell) copySA; Spell spell = (Spell) copySA;
spell.setCastFaceDown(false); spell.setCastFaceDown(false);
c.setCastSA(copySA);
} }
//remove all costs //remove all costs
if (!copySA.isTrigger()) { if (!copySA.isTrigger()) {
copySA.setPayCosts(new Cost("", targetSA.isAbility())); copySA.setPayCosts(new Cost("", targetSA.isAbility()));
} }
copySA.setActivatingPlayer(controller);
return copySA; return copySA;
} }

View File

@@ -1072,7 +1072,6 @@ public class PhaseHandler implements java.io.Serializable {
triggerList.put(originZone.getZoneType(), currentZone.getZoneType(), saHost); triggerList.put(originZone.getZoneType(), currentZone.getZoneType(), saHost);
triggerList.triggerChangesZoneAll(game, sa); triggerList.triggerChangesZoneAll(game, sa);
} }
} }
game.copyLastState(); game.copyLastState();
loopCount++; loopCount++;

View File

@@ -5,7 +5,7 @@ PT:3/3
K:Ninjutsu:2 B K:Ninjutsu:2 B
K:etbCounter:Menace:1 K:etbCounter:Menace:1
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may remove a menace counter from it. When you do, that player reveals their hand and you choose a nonland card from it. Exile that card. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may remove a menace counter from it. When you do, that player reveals their hand and you choose a nonland card from it. Exile that card.
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ SubCounter<1/Menace> | Execute$ TrigReveal | CopyTriggeringObjects$ True | TriggerDescription$ When you do, that player reveals their hand and you choose a nonland card from it. Exile that card. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ SubCounter<1/Menace> | Execute$ TrigReveal | TriggerDescription$ When you do, that player reveals their hand and you choose a nonland card from it. Exile that card.
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ DBExile SVar:TrigReveal:DB$ RevealHand | Defined$ Spawner>TriggeredTarget | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TriggeredTarget | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ Spawner>TriggeredTarget | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True
Oracle:Ninjutsu {2}{B}\nBiting-Palm Ninja enters the battlefield with a menace counter on it.\nWhenever Biting-Palm Ninja deals combat damage to a player, you may remove a menace counter from it. When you do, that player reveals their hand and you choose a nonland card from it. Exile that card. Oracle:Ninjutsu {2}{B}\nBiting-Palm Ninja enters the battlefield with a menace counter on it.\nWhenever Biting-Palm Ninja deals combat damage to a player, you may remove a menace counter from it. When you do, that player reveals their hand and you choose a nonland card from it. Exile that card.

View File

@@ -4,8 +4,8 @@ Types:Creature Human Ninja
PT:2/1 PT:2/1
K:Ninjutsu:1 B K:Ninjutsu:1 B
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls.
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Discard<1/Creature> | Execute$ TrigDestroy | CopyTriggeringObjects$ True | TriggerDescription$ When you do, destroy target creature or planeswalker that player controls. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Discard<1/Creature> | Execute$ TrigDestroy | TriggerDescription$ When you do, destroy target creature or planeswalker that player controls.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy TriggeredTarget,Planeswalker.ControlledBy TriggeredTarget | TgtPrompt$ Select target creature or planeswalker damaged player controls SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy Spawner>TriggeredTarget,Planeswalker.ControlledBy Spawner>TriggeredTarget | TgtPrompt$ Select target creature or planeswalker damaged player controls
DeckHas:Ability$Discard DeckHas:Ability$Discard
SVar:AIPreference:DiscardCost$Creature.cmcLE3 SVar:AIPreference:DiscardCost$Creature.cmcLE3
Oracle:Ninjutsu {1}{B} ({1}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Dokuchi Silencer deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls. Oracle:Ninjutsu {1}{B} ({1}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Dokuchi Silencer deals combat damage to a player, you may discard a creature card. When you do, destroy target creature or planeswalker that player controls.

View File

@@ -5,8 +5,8 @@ PT:3/4
K:Reach K:Reach
K:Partner K:Partner
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | Execute$ TrigPayCost | TriggerZones$ Battlefield | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may pay {2}. When you do, that creature deals damage equal to its power to target creature. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | Execute$ TrigPayCost | TriggerZones$ Battlefield | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may pay {2}. When you do, that creature deals damage equal to its power to target creature.
SVar:TrigPayCost:AB$ ImmediateTrigger | Cost$ 2 | Execute$ TrigDealDamage | CopyTriggeringObjects$ True | TriggerDescription$ When you pay {2}, that creature deals damage equal to its power to target creature. SVar:TrigPayCost:AB$ ImmediateTrigger | Cost$ 2 | Execute$ TrigDealDamage | TriggerDescription$ When you pay {2}, that creature deals damage equal to its power to target creature.
SVar:TrigDealDamage:DB$ DealDamage | DamageSource$ TriggeredCardLKICopy | NumDmg$ X | ValidTgts$ Creature SVar:TrigDealDamage:DB$ DealDamage | DamageSource$ Spawner>TriggeredCardLKICopy | NumDmg$ X | ValidTgts$ Creature
SVar:X:TriggeredCard$CardPower SVar:X:Spawner>TriggeredCard$CardPower
DeckNeeds:Type$Creature DeckNeeds:Type$Creature
Oracle:Reach\nWhenever another creature enters the battlefield under your control, you may pay {2}. When you do, that creature deals damage equal to its power to target creature.\nPartner (You can have two commanders if both have partner.) Oracle:Reach\nWhenever another creature enters the battlefield under your control, you may pay {2}. When you do, that creature deals damage equal to its power to target creature.\nPartner (You can have two commanders if both have partner.)

View File

@@ -3,10 +3,10 @@ ManaCost:2 R R
Types:Creature Manticore Types:Creature Manticore
PT:4/3 PT:4/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DBTrigger | TriggerDescription$ When CARDNAME enters the battlefield, you may sacrifice another creature. When you do, CARDNAME deals damage equal to that creature's power to target creature or player. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DBTrigger | TriggerDescription$ When CARDNAME enters the battlefield, you may sacrifice another creature. When you do, CARDNAME deals damage equal to that creature's power to target creature or player.
SVar:DBTrigger:AB$ ImmediateTrigger | Cost$ Sac<1/Creature.Other/another creature> | Execute$ TrigDamage | AILogic$ SacForDamage | RememberObjects$ Sacrificed | TriggerDescription$ When you do, CARDNAME deals damage equal to that creature's power to any target. SVar:DBTrigger:AB$ ImmediateTrigger | Cost$ Sac<1/Creature.Other/another creature> | Execute$ TrigDamage | AILogic$ SacForDamage | TriggerDescription$ When you do, CARDNAME deals damage equal to that creature's power to any target.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ XPower SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ XPower
K:Embalm:5 R K:Embalm:5 R
SVar:XPower:TriggerRemembered$CardPower SVar:XPower:Spawner>Sacrificed$CardPower
SVar:AIPreferenceParams:CreatureEvalThreshold$ 200 SVar:AIPreferenceParams:CreatureEvalThreshold$ 200
DeckHas:Ability$Token|Sacrifice DeckHas:Ability$Token|Sacrifice
Oracle:When Heart-Piercer Manticore enters the battlefield, you may sacrifice another creature. When you do, Heart-Piercer Manticore deals damage equal to that creature's power to any target.\nEmbalm {5}{R} ({5}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Manticore with no mana cost. Embalm only as a sorcery.) Oracle:When Heart-Piercer Manticore enters the battlefield, you may sacrifice another creature. When you do, Heart-Piercer Manticore deals damage equal to that creature's power to any target.\nEmbalm {5}{R} ({5}{R}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Manticore with no mana cost. Embalm only as a sorcery.)

View File

@@ -5,12 +5,12 @@ K:Enchant creature
A:SP$ Attach | Cost$ W W W | ValidTgts$ Creature | AILogic$ Pump A:SP$ Attach | Cost$ W W W | ValidTgts$ Creature | AILogic$ Pump
T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.EnchantedBy | ValidBlocker$ Creature.toughnessLE3 | Execute$ DelTrigBlocker | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked by a creature with toughness 3 or less, destroy the other creature at end of combat. At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.EnchantedBy | ValidBlocker$ Creature.toughnessLE3 | Execute$ DelTrigBlocker | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked by a creature with toughness 3 or less, destroy the other creature at end of combat. At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature.
T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.toughnessLE3 | ValidBlocker$ Creature.EnchantedBy | Execute$ DelTrigBlocked | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked by a creature with toughness 3 or less, destroy the other creature at end of combat. At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.toughnessLE3 | ValidBlocker$ Creature.EnchantedBy | Execute$ DelTrigBlocked | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked by a creature with toughness 3 or less, destroy the other creature at end of combat. At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature.
SVar:DelTrigBlocked:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocked | CopyTriggeringObjects$ True | TriggerDescription$ Destroy blocked creature at end of combat. SVar:DelTrigBlocked:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat.
SVar:DelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocker | CopyTriggeringObjects$ True | TriggerDescription$ Destroy blocking creature at end of combat. SVar:DelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat.
SVar:TrigDestroyBlocked:DB$ Destroy | Defined$ TriggeredAttackerLKICopy | RememberDestroyed$ True | SubAbility$ DBDelTrigAttacker SVar:TrigDestroyBlocked:DB$ Destroy | Defined$ Spawner>TriggeredAttackerLKICopy | RememberDestroyed$ True | SubAbility$ DBDelTrigAttacker
SVar:TrigDestroyBlocker:DB$ Destroy | Defined$ TriggeredBlockerLKICopy | RememberDestroyed$ True | SubAbility$ DBDelTrigBlocker SVar:TrigDestroyBlocker:DB$ Destroy | Defined$ Spawner>TriggeredBlockerLKICopy | RememberDestroyed$ True | SubAbility$ DBDelTrigBlocker
SVar:DBDelTrigAttacker:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ DBPutCounter | RememberObjects$ TriggeredBlocker | TriggerDescription$ At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBDelTrigAttacker:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ DBPutCounter | RememberObjects$ Spawner>TriggeredBlocker | TriggerDescription$ At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBDelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ DBPutCounter | RememberObjects$ TriggeredAttacker | TriggerDescription$ At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBDelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ DBPutCounter | RememberObjects$ Spawner>TriggeredAttacker | TriggerDescription$ At the beginning of the next end step, if that creature was destroyed this way, put a +1/+1 counter on the first creature. | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBPutCounter:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1 SVar:DBPutCounter:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -5,6 +5,6 @@ PT:1/3
K:Ninjutsu:1 G K:Ninjutsu:1 G
K:etbCounter:Deathtouch:1 K:etbCounter:Deathtouch:1
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may remove a deathtouch counter from it. When you do, exile target artifact or enchantment that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may remove a deathtouch counter from it. When you do, exile target artifact or enchantment that player controls.
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ SubCounter<1/Deathtouch> | Execute$ TrigExile | CopyTriggeringObjects$ True | TriggerDescription$ When you do, exile target artifact or enchantment that player controls. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ SubCounter<1/Deathtouch> | Execute$ TrigExile | TriggerDescription$ When you do, exile target artifact or enchantment that player controls.
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Artifact.ControlledBy TriggeredTarget,Enchantment.ControlledBy TriggeredTarget | TgtPrompt$ Select target artifact or enchantment creature that player controls | Origin$ Battlefield | Destination$ Exile SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Artifact.ControlledBy Spawner>TriggeredTarget,Enchantment.ControlledBy Spawner>TriggeredTarget | TgtPrompt$ Select target artifact or enchantment creature that player controls | Origin$ Battlefield | Destination$ Exile
Oracle:Ninjutsu {1}{G}\nKappa Tech-Wrecker enters the battlefield with a deathtouch counter on it.\nWhenever Kappa Tech-Wrecker deals combat damage to a player, you may remove a deathtouch counter from it. When you do, exile target artifact or enchantment that player controls. Oracle:Ninjutsu {1}{G}\nKappa Tech-Wrecker enters the battlefield with a deathtouch counter on it.\nWhenever Kappa Tech-Wrecker deals combat damage to a player, you may remove a deathtouch counter from it. When you do, exile target artifact or enchantment that player controls.

View File

@@ -4,8 +4,8 @@ Types:Creature Human Ninja
PT:2/1 PT:2/1
K:Ninjutsu:1 B K:Ninjutsu:1 B
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may discard a card. When you do, destroy target creature or planeswalker that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigImmediateTrig | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may discard a card. When you do, destroy target creature or planeswalker that player controls.
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Discard<1/Card> | Execute$ TrigDestroy | CopyTriggeringObjects$ True | TriggerDescription$ When you do, destroy target creature or planeswalker that player controls. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Discard<1/Card> | Execute$ TrigDestroy | TriggerDescription$ When you do, destroy target creature or planeswalker that player controls.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy TriggeredTarget,Planeswalker.ControlledBy TriggeredTarget | TgtPrompt$ Select target creature or planeswalker damaged player controls SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy Spawner>TriggeredTarget,Planeswalker.ControlledBy Spawner>TriggeredTarget | TgtPrompt$ Select target creature or planeswalker damaged player controls
DeckHas:Ability$Discard DeckHas:Ability$Discard
SVar:AIPreference:DiscardCost$Card.cmcLE3 SVar:AIPreference:DiscardCost$Card.cmcLE3
Oracle:Ninjutsu {1}{B}\nWhenever Dokuchi Silencer deals combat damage to a player, you may discard a card. When you do, destroy target creature or planeswalker that player controls. Oracle:Ninjutsu {1}{B}\nWhenever Dokuchi Silencer deals combat damage to a player, you may discard a card. When you do, destroy target creature or planeswalker that player controls.