mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Merge branch '1568-znr-copy-permanent-spell' into 'master'
Resolve "ZNR: Copy Permanent Spell" Closes #1370 and #1568 See merge request core-developers/forge!3232
This commit is contained in:
@@ -970,8 +970,18 @@ public class PlayerControllerAi extends PlayerController {
|
||||
@Override
|
||||
public void orderAndPlaySimultaneousSa(List<SpellAbility> activePlayerSAs) {
|
||||
for (final SpellAbility sa : getAi().orderPlaySa(activePlayerSAs)) {
|
||||
if (prepareSingleSa(sa.getHostCard(),sa,true)) {
|
||||
if (sa.isTrigger() && prepareSingleSa(sa.getHostCard(), sa, true)) {
|
||||
ComputerUtil.playStack(sa, player, game);
|
||||
} else if (sa.isCopied()) {
|
||||
player.getGame().getStackZone().add(sa.getHostCard());
|
||||
// TODO check if static abilities needs to be run for things affecting the copy?
|
||||
if (sa.isMayChooseNewTargets() && !sa.setupTargets()) {
|
||||
// if targets can't be done, remove copy from existence
|
||||
sa.getHostCard().ceaseToExist();
|
||||
continue;
|
||||
}
|
||||
// need finally add the new spell to the stack
|
||||
player.getGame().getStack().add(sa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
package forge.ai.ability;
|
||||
|
||||
import forge.ai.AiController;
|
||||
import forge.ai.AiPlayDecision;
|
||||
import forge.ai.PlayerControllerAi;
|
||||
import forge.ai.SpellAbilityAi;
|
||||
import forge.ai.SpellApiToAi;
|
||||
import com.google.common.base.Predicate;
|
||||
import forge.ai.*;
|
||||
import forge.card.mana.ManaCost;
|
||||
import forge.game.ability.AbilityFactory;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.cost.Cost;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
public class DelayedTriggerAi extends SpellAbilityAi {
|
||||
|
||||
@@ -53,6 +57,92 @@ public class DelayedTriggerAi extends SpellAbilityAi {
|
||||
|
||||
@Override
|
||||
protected boolean canPlayAI(Player ai, SpellAbility sa) {
|
||||
// Card-specific logic
|
||||
String logic = sa.getParamOrDefault("AILogic", "");
|
||||
if (logic.equals("SpellCopy")) {
|
||||
// fetch Instant or Sorcery and AI has reason to play this turn
|
||||
// does not try to get itself
|
||||
final ManaCost costSa = sa.getPayCosts().getTotalMana();
|
||||
final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
if (!(c.isInstant() || c.isSorcery()) || c.equals(sa.getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
for (SpellAbility ab : c.getSpellAbilities()) {
|
||||
if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab))
|
||||
|| ab.hasParam("AINoRecursiveCheck")) {
|
||||
// prevent infinitely recursing mana ritual and other abilities with reentry
|
||||
continue;
|
||||
} else if ("SpellCopy".equals(ab.getParam("AILogic")) && ab.getApi() == ApiType.DelayedTrigger) {
|
||||
// don't copy another copy spell, too complex for the AI
|
||||
continue;
|
||||
}
|
||||
if (!ab.canPlay()) {
|
||||
continue;
|
||||
}
|
||||
AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab);
|
||||
// see if we can pay both for this spell and for the Effect spell we're considering
|
||||
if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) {
|
||||
ManaCost costAb = ab.getPayCosts().getTotalMana();
|
||||
ManaCost total = ManaCost.combine(costSa, costAb);
|
||||
SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false));
|
||||
// can we pay both costs?
|
||||
if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if(count == 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else if (logic.equals("NarsetRebound")) {
|
||||
// should be done in Main2, but it might broke for other cards
|
||||
//if (phase.getPhase().isBefore(PhaseType.MAIN2)) {
|
||||
// return false;
|
||||
//}
|
||||
|
||||
// fetch Instant or Sorcery without Rebound and AI has reason to play this turn
|
||||
// only need count, not the list
|
||||
final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
if (!(c.isInstant() || c.isSorcery()) || c.hasKeyword(Keyword.REBOUND)) {
|
||||
return false;
|
||||
}
|
||||
for (SpellAbility ab : c.getSpellAbilities()) {
|
||||
if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab))
|
||||
|| ab.hasParam("AINoRecursiveCheck")) {
|
||||
// prevent infinitely recursing mana ritual and other abilities with reentry
|
||||
continue;
|
||||
}
|
||||
if (!ab.canPlay()) {
|
||||
continue;
|
||||
}
|
||||
AiPlayDecision decision = ((PlayerControllerAi) ai.getController()).getAi().canPlaySa(ab);
|
||||
if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) {
|
||||
if (ComputerUtilMana.canPayManaCost(ab, ai, 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (count == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Generic logic
|
||||
SpellAbility trigsa = null;
|
||||
if (sa.hasAdditionalAbility("Execute")) {
|
||||
trigsa = sa.getAdditionalAbility("Execute");
|
||||
|
||||
@@ -7,14 +7,11 @@ import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.ai.*;
|
||||
import forge.card.mana.ManaCost;
|
||||
import forge.game.Game;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.card.*;
|
||||
import forge.game.combat.Combat;
|
||||
import forge.game.combat.CombatUtil;
|
||||
import forge.game.cost.Cost;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
@@ -109,89 +106,6 @@ public class EffectAi extends SpellAbilityAi {
|
||||
|| CardLists.getType(ai.getCardsIn(ZoneType.Battlefield), "Planeswalker").isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
randomReturn = true;
|
||||
} else if (logic.equals("SpellCopy")) {
|
||||
// fetch Instant or Sorcery and AI has reason to play this turn
|
||||
// does not try to get itself
|
||||
final ManaCost costSa = sa.getPayCosts().getTotalMana();
|
||||
final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
if (!(c.isInstant() || c.isSorcery()) || c.equals(sa.getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
for (SpellAbility ab : c.getSpellAbilities()) {
|
||||
if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab))
|
||||
|| ab.hasParam("AINoRecursiveCheck")) {
|
||||
// prevent infinitely recursing mana ritual and other abilities with reentry
|
||||
continue;
|
||||
} else if ("SpellCopy".equals(ab.getParam("AILogic")) && ab.getApi() == ApiType.Effect) {
|
||||
// don't copy another copy spell, too complex for the AI
|
||||
continue;
|
||||
}
|
||||
if (!ab.canPlay()) {
|
||||
continue;
|
||||
}
|
||||
AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab);
|
||||
// see if we can pay both for this spell and for the Effect spell we're considering
|
||||
if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) {
|
||||
ManaCost costAb = ab.getPayCosts().getTotalMana();
|
||||
ManaCost total = ManaCost.combine(costSa, costAb);
|
||||
SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false));
|
||||
// can we pay both costs?
|
||||
if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if(count == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
randomReturn = true;
|
||||
} else if (logic.equals("NarsetRebound")) {
|
||||
// should be done in Main2, but it might broke for other cards
|
||||
//if (phase.getPhase().isBefore(PhaseType.MAIN2)) {
|
||||
// return false;
|
||||
//}
|
||||
|
||||
// fetch Instant or Sorcery without Rebound and AI has reason to play this turn
|
||||
// only need count, not the list
|
||||
final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate<Card>() {
|
||||
@Override
|
||||
public boolean apply(final Card c) {
|
||||
if (!(c.isInstant() || c.isSorcery()) || c.hasKeyword(Keyword.REBOUND)) {
|
||||
return false;
|
||||
}
|
||||
for (SpellAbility ab : c.getSpellAbilities()) {
|
||||
if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab))
|
||||
|| ab.hasParam("AINoRecursiveCheck")) {
|
||||
// prevent infinitely recursing mana ritual and other abilities with reentry
|
||||
continue;
|
||||
}
|
||||
if (!ab.canPlay()) {
|
||||
continue;
|
||||
}
|
||||
AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab);
|
||||
if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) {
|
||||
if (ComputerUtilMana.canPayManaCost(ab, ai, 0)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if(count == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
randomReturn = true;
|
||||
} else if (logic.equals("Always")) {
|
||||
randomReturn = true;
|
||||
|
||||
@@ -103,7 +103,7 @@ public class GameAction {
|
||||
boolean wasFacedown = c.isFaceDown();
|
||||
|
||||
//Rule 110.5g: A token that has left the battlefield can't move to another zone
|
||||
if (c.isToken() && zoneFrom != null && !fromBattlefield) {
|
||||
if (c.isToken() && zoneFrom != null && !fromBattlefield && !zoneFrom.is(ZoneType.Stack)) {
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
@@ -1660,12 +1660,8 @@ public class AbilityUtils {
|
||||
|
||||
// Count$Kicked.<numHB>.<numNotHB>
|
||||
if (sq[0].startsWith("Kicked")) {
|
||||
if (((SpellAbility)ctb).isKicked()) {
|
||||
return CardFactoryUtil.doXMath(Integer.parseInt(sq[1]), expr, c); // Kicked
|
||||
}
|
||||
else {
|
||||
return CardFactoryUtil.doXMath(Integer.parseInt(sq[2]), expr, c); // not Kicked
|
||||
}
|
||||
boolean kicked = ((SpellAbility)ctb).isKicked() || c.getKickerMagnitude() > 0;
|
||||
return CardFactoryUtil.doXMath(Integer.parseInt(kicked ? sq[1] : sq[2]), expr, c);
|
||||
}
|
||||
|
||||
//Count$SearchedLibrary.<DefinedPlayer>
|
||||
|
||||
@@ -24,14 +24,23 @@ import java.util.List;
|
||||
public class AttachEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
public void resolve(SpellAbility sa) {
|
||||
if (sa.getHostCard().isAura() && sa.isSpell()) {
|
||||
|
||||
final Card host = sa.getHostCard();
|
||||
if (host.isAura() && sa.isSpell()) {
|
||||
final Player ap = sa.getActivatingPlayer();
|
||||
// The Spell_Permanent (Auras) version of this AF needs to
|
||||
// move the card into play before Attaching
|
||||
|
||||
sa.getHostCard().setController(ap, 0);
|
||||
final Card c = ap.getGame().getAction().moveTo(ap.getZone(ZoneType.Battlefield), sa.getHostCard(), sa);
|
||||
host.setController(ap, 0);
|
||||
|
||||
// 111.11. A copy of a permanent spell becomes a token as it resolves.
|
||||
// The token has the characteristics of the spell that became that token.
|
||||
// The token is not “created” for the purposes of any replacement effects or triggered abilities that refer to creating a token.
|
||||
if (host.isCopiedSpell()) {
|
||||
host.setCopiedSpell(false);
|
||||
host.setToken(true);
|
||||
}
|
||||
|
||||
final Card c = ap.getGame().getAction().moveToPlay(host, ap, sa);
|
||||
sa.setHostCard(c);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,9 @@ import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.game.Game;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
@@ -12,15 +14,16 @@ import forge.game.card.CardCollection;
|
||||
import forge.game.card.CardFactory;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.replacement.ReplacementType;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Lang;
|
||||
import forge.util.Localizer;
|
||||
import forge.util.CardTranslation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class CopySpellAbilityEffect extends SpellAbilityEffect {
|
||||
|
||||
@@ -56,7 +59,8 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
|
||||
@Override
|
||||
public void resolve(SpellAbility sa) {
|
||||
final Card card = sa.getHostCard();
|
||||
Player controller = sa.getActivatingPlayer();
|
||||
final Game game = card.getGame();
|
||||
List<Player> controllers = Lists.newArrayList(sa.getActivatingPlayer());
|
||||
|
||||
int amount = 1;
|
||||
if (sa.hasParam("Amount")) {
|
||||
@@ -64,13 +68,9 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
if (sa.hasParam("Controller")) {
|
||||
controller = AbilityUtils.getDefinedPlayers(card, sa.getParam("Controller"), sa).get(0);
|
||||
controllers = AbilityUtils.getDefinedPlayers(card, sa.getParam("Controller"), sa);
|
||||
}
|
||||
|
||||
boolean isOptional = sa.hasParam("Optional");
|
||||
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell", CardTranslation.getTranslatedName(card.getName())))) {
|
||||
return;
|
||||
}
|
||||
|
||||
final List<SpellAbility> tgtSpells = getTargetSpells(sa);
|
||||
|
||||
@@ -79,123 +79,143 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean mayChooseNewTargets = true;
|
||||
List<SpellAbility> copies = new ArrayList<>();
|
||||
|
||||
if (sa.hasParam("CopyMultipleSpells")) {
|
||||
final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells"));
|
||||
boolean isOptional = sa.hasParam("Optional");
|
||||
|
||||
for (int multi = 0; multi < spellCount && !tgtSpells.isEmpty(); multi++) {
|
||||
String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack", Lang.getOrdinal(multi + 1));
|
||||
SpellAbility chosen = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, prompt,
|
||||
ImmutableMap.of());
|
||||
SpellAbility copiedSpell = CardFactory.copySpellAbilityAndPossiblyHost(card, chosen.getHostCard(), chosen, true);
|
||||
copiedSpell.getHostCard().setController(card.getController(), card.getGame().getNextTimestamp());
|
||||
copiedSpell.setActivatingPlayer(controller);
|
||||
copies.add(copiedSpell);
|
||||
tgtSpells.remove(chosen);
|
||||
for (Player controller : controllers) {
|
||||
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell", CardTranslation.getTranslatedName(card.getName())))) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (sa.hasParam("CopyForEachCanTarget")) {
|
||||
|
||||
List<SpellAbility> copies = Lists.newArrayList();
|
||||
|
||||
SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa,
|
||||
Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of());
|
||||
chosenSA.setActivatingPlayer(controller);
|
||||
// Find subability or rootability that has targets
|
||||
SpellAbility targetedSA = chosenSA;
|
||||
while (targetedSA != null) {
|
||||
if (targetedSA.usesTargeting() && targetedSA.getTargets().getNumTargeted() != 0) {
|
||||
break;
|
||||
|
||||
if (sa.hasParam("CopyForEachCanTarget")) {
|
||||
// Find subability or rootability that has targets
|
||||
SpellAbility targetedSA = chosenSA;
|
||||
while (targetedSA != null) {
|
||||
if (targetedSA.usesTargeting() && targetedSA.getTargets().getNumTargeted() != 0) {
|
||||
break;
|
||||
}
|
||||
targetedSA = targetedSA.getSubAbility();
|
||||
}
|
||||
targetedSA = targetedSA.getSubAbility();
|
||||
}
|
||||
if (targetedSA == null) {
|
||||
return;
|
||||
}
|
||||
final List<GameEntity> candidates = targetedSA.getTargetRestrictions().getAllCandidates(targetedSA, true);
|
||||
if (sa.hasParam("CanTargetPlayer")) {
|
||||
// Radiate
|
||||
// Remove targeted players because getAllCandidates include all the valid players
|
||||
for(Player p : targetedSA.getTargets().getTargetPlayers())
|
||||
candidates.remove(p);
|
||||
|
||||
mayChooseNewTargets = false;
|
||||
for (GameEntity o : candidates) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true);
|
||||
resetFirstTargetOnCopy(copy, o, targetedSA);
|
||||
copies.add(copy);
|
||||
if (targetedSA == null) {
|
||||
continue;
|
||||
}
|
||||
} else {// Precursor Golem, Ink-Treader Nephilim
|
||||
final String type = sa.getParam("CopyForEachCanTarget");
|
||||
CardCollection valid = new CardCollection();
|
||||
List<Player> players = Lists.newArrayList();
|
||||
Player originalTargetPlayer = Iterables.getFirst(getTargetPlayers(chosenSA), null);
|
||||
for (final GameEntity o : candidates) {
|
||||
if (o instanceof Card) {
|
||||
valid.add((Card) o);
|
||||
} else if (o instanceof Player) {
|
||||
final Player p = (Player) o;
|
||||
if (p.equals(originalTargetPlayer))
|
||||
continue;
|
||||
if (p.isValid(type.split(","), chosenSA.getActivatingPlayer(), chosenSA.getHostCard(), sa)) {
|
||||
players.add(p);
|
||||
final List<GameEntity> candidates = targetedSA.getTargetRestrictions().getAllCandidates(targetedSA, true);
|
||||
if (sa.hasParam("CanTargetPlayer")) {
|
||||
// Radiate
|
||||
// Remove targeted players because getAllCandidates include all the valid players
|
||||
for(Player p : targetedSA.getTargets().getTargetPlayers())
|
||||
candidates.remove(p);
|
||||
|
||||
for (GameEntity o : candidates) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(sa, chosenSA);
|
||||
resetFirstTargetOnCopy(copy, o, targetedSA);
|
||||
copies.add(copy);
|
||||
}
|
||||
} else {// Precursor Golem, Ink-Treader Nephilim
|
||||
final String type = sa.getParam("CopyForEachCanTarget");
|
||||
CardCollection valid = new CardCollection();
|
||||
List<Player> players = Lists.newArrayList();
|
||||
Player originalTargetPlayer = Iterables.getFirst(getTargetPlayers(chosenSA), null);
|
||||
for (final GameEntity o : candidates) {
|
||||
if (o instanceof Card) {
|
||||
valid.add((Card) o);
|
||||
} else if (o instanceof Player) {
|
||||
final Player p = (Player) o;
|
||||
if (p.equals(originalTargetPlayer))
|
||||
continue;
|
||||
if (p.isValid(type.split(","), chosenSA.getActivatingPlayer(), chosenSA.getHostCard(), sa)) {
|
||||
players.add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
valid = CardLists.getValidCards(valid, type.split(","), chosenSA.getActivatingPlayer(), chosenSA.getHostCard(), sa);
|
||||
Card originalTarget = Iterables.getFirst(getTargetCards(chosenSA), null);
|
||||
valid.remove(originalTarget);
|
||||
mayChooseNewTargets = false;
|
||||
if (sa.hasParam("ChooseOnlyOne")) {
|
||||
Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseOne"), null);
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true);
|
||||
resetFirstTargetOnCopy(copy, choice, targetedSA);
|
||||
copies.add(copy);
|
||||
} else {
|
||||
for (final Card c : valid) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true);
|
||||
valid = CardLists.getValidCards(valid, type.split(","), chosenSA.getActivatingPlayer(), chosenSA.getHostCard(), sa);
|
||||
Card originalTarget = Iterables.getFirst(getTargetCards(chosenSA), null);
|
||||
valid.remove(originalTarget);
|
||||
|
||||
if (sa.hasParam("ChooseOnlyOne")) {
|
||||
Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseOne"), null);
|
||||
if (choice != null) {
|
||||
valid = new CardCollection(choice);
|
||||
}
|
||||
}
|
||||
|
||||
for (final Card c : valid) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(sa, chosenSA);
|
||||
resetFirstTargetOnCopy(copy, c, targetedSA);
|
||||
copies.add(copy);
|
||||
}
|
||||
}
|
||||
for (final Player p : players) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(sa, chosenSA);
|
||||
resetFirstTargetOnCopy(copy, p, targetedSA);
|
||||
copies.add(copy);
|
||||
}
|
||||
}
|
||||
for (final Player p : players) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true);
|
||||
resetFirstTargetOnCopy(copy, p, targetedSA);
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < amount; i++) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(sa, chosenSA);
|
||||
if (sa.hasParam("MayChooseTarget")) {
|
||||
copy.setMayChooseNewTargets(true);
|
||||
if (copy.usesTargeting()) {
|
||||
copy.getTargetRestrictions().setMandatory(true);
|
||||
}
|
||||
}
|
||||
|
||||
// extra case for Epic to remove the keyword and the last part of the SpellAbility
|
||||
if (sa.hasParam("Epic")) {
|
||||
copy.getHostCard().removeIntrinsicKeyword("Epic");
|
||||
SpellAbility sub = copy;
|
||||
while (sub.getSubAbility() != null && !sub.hasParam("Epic")) {
|
||||
sub = sub.getSubAbility();
|
||||
}
|
||||
if (sub != null) {
|
||||
sub.getParent().setSubAbility(sub.getSubAbility());
|
||||
}
|
||||
}
|
||||
|
||||
copies.add(copy);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa,
|
||||
Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of());
|
||||
chosenSA.setActivatingPlayer(controller);
|
||||
for (int i = 0; i < amount; i++) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(
|
||||
card, chosenSA.getHostCard(), chosenSA, true);
|
||||
|
||||
// extra case for Epic to remove the keyword and the last part of the SpellAbility
|
||||
if (sa.hasParam("Epic")) {
|
||||
copy.getHostCard().removeIntrinsicKeyword("Epic");
|
||||
SpellAbility sub = copy;
|
||||
while (sub.getSubAbility() != null && !sub.hasParam("Epic")) {
|
||||
sub = sub.getSubAbility();
|
||||
}
|
||||
if (sub != null) {
|
||||
sub.getParent().setSubAbility(sub.getSubAbility());
|
||||
}
|
||||
if (copies.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int addAmount = copies.size();
|
||||
final Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(controller);
|
||||
repParams.put(AbilityKey.SpellAbility, chosenSA);
|
||||
repParams.put(AbilityKey.Amount, addAmount);
|
||||
|
||||
switch (game.getReplacementHandler().run(ReplacementType.CopySpell, repParams)) {
|
||||
case NotReplaced:
|
||||
break;
|
||||
case Updated: {
|
||||
addAmount = (int) repParams.get(AbilityKey.Amount);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
addAmount = 0;
|
||||
}
|
||||
|
||||
if (addAmount <= 0) {
|
||||
continue;
|
||||
}
|
||||
int extraAmount = addAmount - copies.size();
|
||||
for (int i = 0; i < extraAmount; i++) {
|
||||
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(sa, chosenSA);
|
||||
// extra copies added with CopySpellReplacenment currently always has new choose targets
|
||||
copy.setMayChooseNewTargets(true);
|
||||
if (copy.usesTargeting()) {
|
||||
copy.getTargetRestrictions().setMandatory(true);
|
||||
}
|
||||
|
||||
copies.add(copy);
|
||||
}
|
||||
}
|
||||
|
||||
for(SpellAbility copySA : copies) {
|
||||
if (mayChooseNewTargets && copySA.usesTargeting()) {
|
||||
// TODO: ideally this should be implemented by way of allowing the player to cancel targeting
|
||||
// but in that case preserving whatever target was specified for the original spell (since
|
||||
// "changing targets" is the optional part).
|
||||
copySA.getTargetRestrictions().setMandatory(true);
|
||||
}
|
||||
controller.getController().playSpellAbilityForFree(copySA, mayChooseNewTargets);
|
||||
|
||||
controller.getController().orderAndPlaySimultaneousSa(copies);
|
||||
}
|
||||
} // end resolve
|
||||
|
||||
|
||||
@@ -5,7 +5,10 @@ import com.google.common.collect.Maps;
|
||||
import forge.game.ability.AbilityUtils;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.trigger.Trigger;
|
||||
import forge.game.trigger.TriggerHandler;
|
||||
@@ -21,6 +24,8 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
||||
protected String getStackDescription(SpellAbility sa) {
|
||||
if (sa.hasParam("TriggerDescription")) {
|
||||
return sa.getParam("TriggerDescription");
|
||||
} else if (sa.hasParam("SpellDescription")) {
|
||||
return sa.getParam("SpellDescription");
|
||||
}
|
||||
|
||||
return "";
|
||||
@@ -44,7 +49,8 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
||||
triggerRemembered = sa.getParam("RememberObjects");
|
||||
}
|
||||
|
||||
final Trigger delTrig = TriggerHandler.parseTrigger(mapParams, sa.getHostCard(), true);
|
||||
Card lki = CardUtil.getLKICopy(sa.getHostCard());
|
||||
final Trigger delTrig = TriggerHandler.parseTrigger(mapParams, lki, true);
|
||||
|
||||
if (triggerRemembered != null) {
|
||||
for (final String rem : triggerRemembered.split(",")) {
|
||||
@@ -67,7 +73,9 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
if (mapParams.containsKey("Execute") || sa.hasAdditionalAbility("Execute")) {
|
||||
SpellAbility overridingSA = sa.getAdditionalAbility("Execute");
|
||||
AbilitySub overridingSA = (AbilitySub)sa.getAdditionalAbility("Execute").copy(lki, false);
|
||||
// need to reset the parent, additionalAbility does set it to this
|
||||
overridingSA.setParent(null);
|
||||
overridingSA.setActivatingPlayer(sa.getActivatingPlayer());
|
||||
overridingSA.setDeltrigActivatingPlayer(sa.getActivatingPlayer()); // ensure that the original activator can be restored later
|
||||
// Set Transform timestamp when the delayed trigger is created
|
||||
|
||||
@@ -22,6 +22,14 @@ public class PermanentEffect extends SpellAbilityEffect {
|
||||
sa.getHostCard().setController(p, 0);
|
||||
final Card host = sa.getHostCard();
|
||||
|
||||
// 111.11. A copy of a permanent spell becomes a token as it resolves.
|
||||
// The token has the characteristics of the spell that became that token.
|
||||
// The token is not “created” for the purposes of any replacement effects or triggered abilities that refer to creating a token.
|
||||
if (host.isCopiedSpell()) {
|
||||
host.setCopiedSpell(false);
|
||||
host.setToken(true);
|
||||
}
|
||||
|
||||
final Card c = p.getGame().getAction().moveToPlay(host, p, sa);
|
||||
sa.setHostCard(c);
|
||||
|
||||
|
||||
@@ -3612,8 +3612,8 @@ public class Card extends GameEntity implements Comparable<Card> {
|
||||
if (multiKickerMagnitude > 0) {
|
||||
return multiKickerMagnitude;
|
||||
}
|
||||
boolean hasK1 = costsPaid.contains(OptionalCost.Kicker1);
|
||||
return hasK1 == costsPaid.contains(OptionalCost.Kicker2) ? (hasK1 ? 2 : 0) : 1;
|
||||
boolean hasK1 = isOptionalCostPaid(OptionalCost.Kicker1);
|
||||
return hasK1 == isOptionalCostPaid(OptionalCost.Kicker2) ? (hasK1 ? 2 : 0) : 1;
|
||||
}
|
||||
|
||||
private int pseudoKickerMagnitude = 0;
|
||||
|
||||
@@ -125,12 +125,13 @@ public class CardFactory {
|
||||
* which wouldn't ordinarily get set during a simple Card.copy() call.
|
||||
* </p>
|
||||
* */
|
||||
private final static Card copySpellHost(final Card source, final Card original, final SpellAbility sa, final boolean bCopyDetails){
|
||||
Player controller = sa.getActivatingPlayer();
|
||||
private final static Card copySpellHost(final SpellAbility sourceSA, final SpellAbility targetSA){
|
||||
final Card source = sourceSA.getHostCard();
|
||||
final Card original = targetSA.getHostCard();
|
||||
Player controller = sourceSA.getActivatingPlayer();
|
||||
final Card c = copyCard(original, true);
|
||||
|
||||
// change the color of the copy (eg: Fork)
|
||||
final SpellAbility sourceSA = source.getFirstSpellAbility();
|
||||
if (null != sourceSA && sourceSA.hasParam("CopyIsColor")) {
|
||||
String tmp = "";
|
||||
final String newColor = sourceSA.getParam("CopyIsColor");
|
||||
@@ -148,13 +149,14 @@ public class CardFactory {
|
||||
c.setOwner(controller);
|
||||
c.setCopiedSpell(true);
|
||||
|
||||
if (bCopyDetails) {
|
||||
c.setXManaCostPaidByColor(original.getXManaCostPaidByColor());
|
||||
c.setKickerMagnitude(original.getKickerMagnitude());
|
||||
c.setXManaCostPaidByColor(original.getXManaCostPaidByColor());
|
||||
c.setKickerMagnitude(original.getKickerMagnitude());
|
||||
|
||||
for (OptionalCost cost : original.getOptionalCostsPaid()) {
|
||||
c.addOptionalCostPaid(cost);
|
||||
}
|
||||
for (OptionalCost cost : original.getOptionalCostsPaid()) {
|
||||
c.addOptionalCostPaid(cost);
|
||||
}
|
||||
if (targetSA.isBestow()) {
|
||||
c.animateBestow();
|
||||
}
|
||||
return c;
|
||||
}
|
||||
@@ -174,44 +176,33 @@ public class CardFactory {
|
||||
* @param bCopyDetails
|
||||
* a boolean.
|
||||
*/
|
||||
public final static SpellAbility copySpellAbilityAndPossiblyHost(final Card source, final Card original, final SpellAbility sa, final boolean bCopyDetails) {
|
||||
Player controller = sa.getActivatingPlayer();
|
||||
public final static SpellAbility copySpellAbilityAndPossiblyHost(final SpellAbility sourceSA, final SpellAbility targetSA) {
|
||||
Player controller = sourceSA.getActivatingPlayer();
|
||||
|
||||
//it is only necessary to copy the host card if the SpellAbility is a spell, not an ability
|
||||
final Card c;
|
||||
if (sa.isSpell()){
|
||||
c = copySpellHost(source, original, sa, bCopyDetails);
|
||||
}
|
||||
else {
|
||||
c = original;
|
||||
}
|
||||
final Card c = targetSA.isSpell() ? copySpellHost(sourceSA, targetSA) : targetSA.getHostCard();
|
||||
|
||||
final SpellAbility copySA;
|
||||
if (sa.isTrigger() && sa.isWrapper()) {
|
||||
copySA = getCopiedTriggeredAbility((WrappedAbility)sa, c);
|
||||
if (targetSA.isTrigger() && targetSA.isWrapper()) {
|
||||
copySA = getCopiedTriggeredAbility((WrappedAbility)targetSA, c);
|
||||
} else {
|
||||
copySA = sa.copy(c, false);
|
||||
}
|
||||
|
||||
if (sa.isSpell()){
|
||||
//only update c's abilities if c is a copy.
|
||||
//(it would be nice to move this into `copySpellHost`,
|
||||
// so all the c-mutating code is together in one place.
|
||||
// but copySA doesn't exist until after `copySpellHost` finishes executing,
|
||||
// so it's hard to resolve that dependency.)
|
||||
c.getCurrentState().setNonManaAbilities(copySA);
|
||||
copySA = targetSA.copy(c, false);
|
||||
}
|
||||
|
||||
copySA.setCopied(true);
|
||||
|
||||
if (targetSA.usesTargeting()) {
|
||||
// do for SubAbilities too?
|
||||
copySA.setTargets(targetSA.getTargets().clone());
|
||||
}
|
||||
|
||||
//remove all costs
|
||||
if (!copySA.isTrigger()) {
|
||||
copySA.setPayCosts(new Cost("", sa.isAbility()));
|
||||
copySA.setPayCosts(new Cost("", targetSA.isAbility()));
|
||||
}
|
||||
copySA.setActivatingPlayer(controller);
|
||||
|
||||
if (bCopyDetails) {
|
||||
copySA.setPaidHash(sa.getPaidHash());
|
||||
}
|
||||
copySA.setPaidHash(targetSA.getPaidHash());
|
||||
return copySA;
|
||||
}
|
||||
|
||||
|
||||
@@ -2434,7 +2434,7 @@ public class CardFactoryUtil {
|
||||
inst.addTrigger(parsedTrigReturn);
|
||||
} else if (keyword.equals("Conspire")) {
|
||||
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ Conspire | Secondary$ True | TriggerDescription$ Copy CARDNAME if its conspire cost was paid";
|
||||
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1";
|
||||
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1 | MayChooseTarget$ True";
|
||||
|
||||
final Trigger conspireTrigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic);
|
||||
conspireTrigger.setOverridingAbility(AbilityFactory.getAbility(abString, card));
|
||||
@@ -2630,6 +2630,18 @@ public class CardFactoryUtil {
|
||||
|
||||
trigger.setOverridingAbility(AbilityFactory.getAbility(sb.toString(), card));
|
||||
|
||||
inst.addTrigger(trigger);
|
||||
} else if (keyword.startsWith("Gravestorm")) {
|
||||
String trigStr = "Mode$ SpellCast | ValidCard$ Card.Self | TriggerDescription$ Gravestorm (" + inst.getReminderText() + ")";
|
||||
String copyStr = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ GravestormCount | MayChooseTarget$ True";
|
||||
|
||||
SpellAbility copySa = AbilityFactory.getAbility(copyStr, card);
|
||||
copySa.setSVar("GravestormCount", "Count$ThisTurnEntered_Graveyard_from_Battlefield_Permanent");
|
||||
|
||||
final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic);
|
||||
|
||||
trigger.setOverridingAbility(copySa);
|
||||
|
||||
inst.addTrigger(trigger);
|
||||
} else if (keyword.startsWith("Haunt")) {
|
||||
final String[] k = keyword.split(":");
|
||||
@@ -3069,7 +3081,7 @@ public class CardFactoryUtil {
|
||||
inst.addTrigger(myTrigger);
|
||||
} else if (keyword.startsWith("Replicate")) {
|
||||
final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ ReplicateAmount | Secondary$ True | TriggerDescription$ Copy CARDNAME for each time you paid its replicate cost";
|
||||
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ ReplicateAmount";
|
||||
final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ ReplicateAmount | MayChooseTarget$ True";
|
||||
|
||||
final Trigger replicateTrigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic);
|
||||
final SpellAbility replicateAbility = AbilityFactory.getAbility(abString, card);
|
||||
@@ -3197,7 +3209,7 @@ public class CardFactoryUtil {
|
||||
final String actualTrigger = "Mode$ SpellCast | ValidCard$ Card.Self | Secondary$ True"
|
||||
+ "| TriggerDescription$ Storm (" + inst.getReminderText() + ")";
|
||||
|
||||
String effect = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ StormCount";
|
||||
String effect = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ StormCount | MayChooseTarget$ True";
|
||||
|
||||
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, card, intrinsic);
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ public enum Keyword {
|
||||
FORTIFY("Fortify", KeywordWithCost.class, false, "%s: Attach to target land you control. Fortify only as a sorcery."),
|
||||
FRENZY("Frenzy", KeywordWithAmount.class, false, "Whenever this creature attacks and isn't blocked, it gets +%d/+0 until end of turn."),
|
||||
GRAFT("Graft", KeywordWithAmount.class, false, "This permanent enters the battlefield with {%d:+1/+1 counter} on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this permanent onto it."),
|
||||
GRAVESTORM("Gravestorm", SimpleKeyword.class, false, "When you cast this spell, copy it for each permanent that was put into a graveyard from the battlefield this turn. You may choose new targets for the copies."),
|
||||
GRAVESTORM("Gravestorm", SimpleKeyword.class, false, "When you cast this spell, copy it for each permanent that was put into a graveyard from the battlefield this turn. If the spell has any targets, you may choose new targets for any of the copies."),
|
||||
HASTE("Haste", SimpleKeyword.class, true, "This creature can attack and {T} as soon as it comes under your control."),
|
||||
HAUNT("Haunt", SimpleKeyword.class, false, "When this is put into a graveyard, exile it haunting target creature."),
|
||||
HEXPROOF("Hexproof", Hexproof.class, false, "This can't be the target of %s spells or abilities your opponents control."),
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package forge.game.replacement;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
|
||||
public class ReplaceCopySpell extends ReplacementEffect {
|
||||
|
||||
public ReplaceCopySpell(Map<String, String> map, Card host, boolean intrinsic) {
|
||||
super(map, host, intrinsic);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.card.replacement.ReplacementEffect#canReplace(java.util.Map)
|
||||
*/
|
||||
@Override
|
||||
public boolean canReplace(Map<AbilityKey, Object> runParams) {
|
||||
if (((int) runParams.get(AbilityKey.Amount)) <= 0) {
|
||||
return false;
|
||||
}
|
||||
if (hasParam("ValidPlayer")) {
|
||||
if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (hasParam("ValidSpell")) {
|
||||
if (!matchesValid(runParams.get(AbilityKey.SpellAbility), getParam("ValidSpell").split(","), getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.card.replacement.ReplacementEffect#setReplacingObjects(java.util.HashMap, forge.card.spellability.SpellAbility)
|
||||
*/
|
||||
@Override
|
||||
public void setReplacingObjects(Map<AbilityKey, Object> runParams, SpellAbility sa) {
|
||||
sa.setReplacingObject(AbilityKey.Amount, runParams.get(AbilityKey.Amount));
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public enum ReplacementType {
|
||||
AddCounter(ReplaceAddCounter.class),
|
||||
Attached(ReplaceAttached.class),
|
||||
Counter(ReplaceCounter.class),
|
||||
CopySpell(ReplaceCopySpell.class),
|
||||
CreateToken(ReplaceToken.class),
|
||||
DamageDone(ReplaceDamage.class),
|
||||
Destroy(ReplaceDestroy.class),
|
||||
|
||||
@@ -43,6 +43,7 @@ import forge.game.cost.CostRemoveCounter;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.game.mana.Mana;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerCollection;
|
||||
import forge.game.replacement.ReplacementEffect;
|
||||
import forge.game.staticability.StaticAbility;
|
||||
import forge.game.trigger.Trigger;
|
||||
@@ -52,6 +53,7 @@ import forge.game.zone.ZoneType;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.Expressions;
|
||||
import forge.util.TextUtil;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.*;
|
||||
@@ -148,6 +150,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
private boolean undoable;
|
||||
|
||||
private boolean isCopied = false;
|
||||
private boolean mayChooseNewTargets = false;
|
||||
|
||||
private EnumSet<OptionalCost> optionalCosts = EnumSet.noneOf(OptionalCost.class);
|
||||
private TargetRestrictions targetRestrictions = null;
|
||||
@@ -863,6 +866,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
|
||||
copyHelper(clone, host);
|
||||
|
||||
// always set this to false, it is only set in CopyEffect
|
||||
clone.mayChooseNewTargets = false;
|
||||
|
||||
clone.triggeringObjects = AbilityKey.newMap(this.triggeringObjects);
|
||||
|
||||
clone.setPayCosts(getPayCosts().copy());
|
||||
@@ -884,6 +890,11 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
|
||||
clone.setPaidHash(Maps.newHashMap(getPaidHash()));
|
||||
|
||||
if (usesTargeting()) {
|
||||
// the targets need to be cloned, otherwise they might be cleared
|
||||
clone.targetChosen = getTargets().clone();
|
||||
}
|
||||
|
||||
// clear maps for copy, the values will be added later
|
||||
clone.additionalAbilities = Maps.newHashMap();
|
||||
clone.additionalAbilityLists = Maps.newHashMap();
|
||||
@@ -1287,6 +1298,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMayChooseNewTargets() {
|
||||
return mayChooseNewTargets;
|
||||
}
|
||||
public void setMayChooseNewTargets(boolean value) {
|
||||
mayChooseNewTargets = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether variable was present in the announce list.
|
||||
*/
|
||||
@@ -1358,6 +1376,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
}
|
||||
|
||||
public void setTargets(TargetChoices targets) {
|
||||
// TODO should copy the target choices?
|
||||
targetChosen = targets;
|
||||
}
|
||||
|
||||
@@ -1656,6 +1675,48 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
return p != null && p.isTargeting(o);
|
||||
}
|
||||
|
||||
public boolean setupTargets() {
|
||||
// Skip to paying if parent ability doesn't target and has no subAbilities.
|
||||
// (or trigger case where its already targeted)
|
||||
SpellAbility currentAbility = this;
|
||||
final Card source = getHostCard();
|
||||
do {
|
||||
final TargetRestrictions tgt = currentAbility.getTargetRestrictions();
|
||||
if (tgt != null && tgt.doesTarget()) {
|
||||
currentAbility.clearTargets();
|
||||
Player targetingPlayer;
|
||||
if (currentAbility.hasParam("TargetingPlayer")) {
|
||||
final PlayerCollection candidates = AbilityUtils.getDefinedPlayers(source, currentAbility.getParam("TargetingPlayer"), currentAbility);
|
||||
// activator chooses targeting player
|
||||
targetingPlayer = getActivatingPlayer().getController().chooseSingleEntityForEffect(
|
||||
candidates, currentAbility, "Choose the targeting player", null);
|
||||
} else {
|
||||
targetingPlayer = getActivatingPlayer();
|
||||
}
|
||||
currentAbility.setTargetingPlayer(targetingPlayer);
|
||||
if (!targetingPlayer.getController().chooseTargetsFor(currentAbility)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final AbilitySub subAbility = currentAbility.getSubAbility();
|
||||
if (subAbility != null) {
|
||||
// This is necessary for "TargetsWithDefinedController$ ParentTarget"
|
||||
subAbility.setParent(currentAbility);
|
||||
}
|
||||
currentAbility = subAbility;
|
||||
} while (currentAbility != null);
|
||||
return true;
|
||||
}
|
||||
public final void clearTargets() {
|
||||
final TargetRestrictions tg = getTargetRestrictions();
|
||||
if (tg != null) {
|
||||
resetTargets();
|
||||
if (hasParam("DividedAsYouChoose")) {
|
||||
tg.calculateStillToDivide(getParam("DividedAsYouChoose"), getHostCard(), this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Takes one argument like Permanent.Blue+withFlying
|
||||
@Override
|
||||
public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import forge.game.card.Card;
|
||||
import forge.game.card.CardCollection;
|
||||
import forge.game.card.CardCollectionView;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerCollection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -42,7 +43,7 @@ public class TargetChoices implements Cloneable {
|
||||
|
||||
// Card or Player are legal targets.
|
||||
private final CardCollection targetCards = new CardCollection();
|
||||
private final List<Player> targetPlayers = new ArrayList<>();
|
||||
private final PlayerCollection targetPlayers = new PlayerCollection();
|
||||
private final List<SpellAbility> targetSpells = new ArrayList<>();
|
||||
|
||||
public final int getNumTargeted() {
|
||||
@@ -70,8 +71,7 @@ public class TargetChoices implements Cloneable {
|
||||
}
|
||||
|
||||
private final boolean addTarget(final Card c) {
|
||||
if (!targetCards.contains(c)) {
|
||||
targetCards.add(c);
|
||||
if (targetCards.add(c)) {
|
||||
numTargeted++;
|
||||
return true;
|
||||
}
|
||||
@@ -79,8 +79,7 @@ public class TargetChoices implements Cloneable {
|
||||
}
|
||||
|
||||
private final boolean addTarget(final Player p) {
|
||||
if (!targetPlayers.contains(p)) {
|
||||
targetPlayers.add(p);
|
||||
if (targetPlayers.add(p)) {
|
||||
numTargeted++;
|
||||
return true;
|
||||
}
|
||||
@@ -213,16 +212,10 @@ public class TargetChoices implements Cloneable {
|
||||
if (obj instanceof TargetChoices) {
|
||||
TargetChoices compare = (TargetChoices)obj;
|
||||
|
||||
if (this.getNumTargeted() != compare.getNumTargeted()) {
|
||||
if (getNumTargeted() != compare.getNumTargeted()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < this.getTargets().size(); i++) {
|
||||
if (!compare.getTargets().get(i).equals(this.getTargets().get(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
return getTargets().equals(compare.getTargets());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -516,10 +516,17 @@ public class TriggerHandler {
|
||||
else {
|
||||
// get CardState does not work for transformed cards
|
||||
// also its about LKI
|
||||
// TODO remove this part after all spellAbility can handle LKI as host
|
||||
// Currently only true for delayed Trigger
|
||||
if (host.isInZone(ZoneType.Battlefield) || !host.hasAlternateState()) {
|
||||
// if host changes Zone with other cards, try to use original host
|
||||
if (!regtrig.getMode().equals(TriggerType.ChangesZone))
|
||||
host = game.getCardState(host);
|
||||
if (!regtrig.getMode().equals(TriggerType.ChangesZone)) {
|
||||
Card gameHost = game.getCardState(host);
|
||||
// TODO only set when the host equals the game state
|
||||
if (gameHost.equalsWithTimestamp(host)) {
|
||||
host = gameHost;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ public class TriggerSpellAbilityCast extends Trigger {
|
||||
final SpellAbility castSA = (SpellAbility) runParams.get(AbilityKey.CastSA);
|
||||
final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA);
|
||||
sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard());
|
||||
sa.setTriggeringObject(AbilityKey.SpellAbility, castSA);
|
||||
sa.setTriggeringObject(AbilityKey.SpellAbility, castSA.copy(castSA.getHostCard(), true));
|
||||
sa.setTriggeringObject(AbilityKey.StackInstance, si);
|
||||
sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards());
|
||||
sa.setTriggeringObjectsFrom(
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
@@ -65,7 +65,7 @@ import forge.util.TextUtil;
|
||||
* <p>
|
||||
* MagicStack class.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
@@ -135,14 +135,12 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
|
||||
// if the ability is a spell, but not a copied spell and its not already
|
||||
// on the stack zone, move there
|
||||
if (ability.isSpell()) {
|
||||
if (!source.isCopiedSpell()) {
|
||||
if (!source.isInZone(ZoneType.Stack)) {
|
||||
ability.setHostCard(game.getAction().moveToStack(source, ability));
|
||||
}
|
||||
if (ability.equals(source.getCastSA())) {
|
||||
source.setCastSA(ability.copy(source, true));
|
||||
}
|
||||
if (ability.isSpell() && !source.isCopiedSpell()) {
|
||||
if (!source.isInZone(ZoneType.Stack)) {
|
||||
ability.setHostCard(game.getAction().moveToStack(source, ability));
|
||||
}
|
||||
if (ability.equals(source.getCastSA())) {
|
||||
source.setCastSA(ability.copy(source, true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,6 +243,11 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
} else if (source.isFaceDown()) {
|
||||
source.turnFaceUp(null);
|
||||
}
|
||||
|
||||
// copied always add to stack zone
|
||||
if (source.isCopiedSpell()) {
|
||||
game.getStackZone().add(source);
|
||||
}
|
||||
}
|
||||
|
||||
if (sp.getApi() == ApiType.Charm && sp.hasParam("ChoiceRestriction")) {
|
||||
@@ -254,7 +257,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
|
||||
//cancel auto-pass for all opponents of activating player
|
||||
//when a new non-triggered ability is put on the stack
|
||||
if (!sp.isTrigger()) {
|
||||
if (!sp.isTrigger()) {
|
||||
for (final Player p : activator.getOpponents()) {
|
||||
p.getController().autoPassCancel();
|
||||
}
|
||||
@@ -271,18 +274,15 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
// TODO: make working triggered ability
|
||||
sp.setTotalManaSpent(totManaSpent);
|
||||
AbilityUtils.resolve(sp);
|
||||
// AbilityStatic should do nothing below
|
||||
return;
|
||||
}
|
||||
else {
|
||||
for (OptionalCost s : sp.getOptionalCosts()) {
|
||||
source.addOptionalCostPaid(s);
|
||||
}
|
||||
if (sp.isCopied()) {
|
||||
si = push(sp);
|
||||
}
|
||||
else {
|
||||
// The ability is added to stack HERE
|
||||
si = push(sp);
|
||||
}
|
||||
// The ability is added to stack HERE
|
||||
si = push(sp);
|
||||
}
|
||||
|
||||
sp.setTotalManaSpent(totManaSpent);
|
||||
@@ -292,7 +292,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
|
||||
// Copied spells aren't cast per se so triggers shouldn't run for them.
|
||||
Map<AbilityKey, Object> runParams = AbilityKey.newMap();
|
||||
if (!(sp instanceof AbilityStatic) && !sp.isCopied()) {
|
||||
if (!sp.isCopied()) {
|
||||
// Run SpellAbilityCast triggers
|
||||
runParams.put(AbilityKey.Cost, sp.getPayCosts());
|
||||
runParams.put(AbilityKey.Player, sp.getHostCard().getController());
|
||||
@@ -322,17 +322,15 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
if (sp.isCycling()) {
|
||||
activator.addCycled(sp);
|
||||
}
|
||||
|
||||
|
||||
if (sp.hasParam("Crew")) {
|
||||
// Trigger crews!
|
||||
runParams.put(AbilityKey.Vehicle, sp.getHostCard());
|
||||
runParams.put(AbilityKey.Crew, sp.getPaidList("TappedCards"));
|
||||
game.getTriggerHandler().runTrigger(TriggerType.Crewed, runParams, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Run SpellAbilityCopy triggers
|
||||
if (sp.isCopied()) {
|
||||
} else {
|
||||
// Run SpellAbilityCopy triggers
|
||||
runParams.put(AbilityKey.Activator, sp.getActivatingPlayer());
|
||||
runParams.put(AbilityKey.CopySA, si.getSpellAbility(true));
|
||||
// Run SpellCopy triggers
|
||||
@@ -345,7 +343,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
// Run BecomesTarget triggers
|
||||
// Create a new object, since the triggers aren't happening right away
|
||||
List<TargetChoices> chosenTargets = sp.getAllTargetChoices();
|
||||
if (!chosenTargets.isEmpty()) {
|
||||
if (!chosenTargets.isEmpty()) {
|
||||
runParams = Maps.newHashMap();
|
||||
SpellAbility s = sp;
|
||||
if (si != null) {
|
||||
@@ -362,7 +360,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
if (distinctObjects.contains(tgt)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
distinctObjects.add(tgt);
|
||||
if (tgt instanceof Card && !((Card) tgt).hasBecomeTargetThisTurn()) {
|
||||
runParams.put(AbilityKey.FirstTime, null);
|
||||
@@ -443,7 +441,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
// Resolving the Stack
|
||||
|
||||
// freeze the stack while we're in the middle of resolving
|
||||
freezeStack();
|
||||
freezeStack();
|
||||
setResolving(true);
|
||||
|
||||
// The SpellAbility isn't removed from the Stack until it finishes resolving
|
||||
@@ -452,21 +450,21 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
//final SpellAbility sa = pop();
|
||||
|
||||
// ActivePlayer gains priority first after Resolve
|
||||
game.getPhaseHandler().resetPriority();
|
||||
game.getPhaseHandler().resetPriority();
|
||||
|
||||
final Card source = sa.getHostCard();
|
||||
curResolvingCard = source;
|
||||
|
||||
|
||||
boolean thisHasFizzled = hasFizzled(sa, source, null);
|
||||
|
||||
|
||||
if (!thisHasFizzled) {
|
||||
game.copyLastState();
|
||||
}
|
||||
|
||||
if (thisHasFizzled) { // Fizzle
|
||||
if (sa.isBestow()) {
|
||||
// 702.102d: if its target is illegal,
|
||||
// the effect making it an Aura spell ends.
|
||||
// 702.102d: if its target is illegal,
|
||||
// the effect making it an Aura spell ends.
|
||||
// It continues resolving as a creature spell.
|
||||
source.unanimateBestow();
|
||||
game.fireEvent(new GameEventCardStatsChanged(source));
|
||||
@@ -482,7 +480,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
sa.resolve();
|
||||
// do creatures ETB from here?
|
||||
}
|
||||
|
||||
|
||||
game.fireEvent(new GameEventSpellResolved(sa, thisHasFizzled));
|
||||
finishResolving(sa, thisHasFizzled);
|
||||
|
||||
@@ -501,7 +499,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
|
||||
// remove SA and card from the stack
|
||||
removeCardFromStack(sa, si, fizzle);
|
||||
|
||||
|
||||
if (si != null) {
|
||||
remove(si);
|
||||
}
|
||||
@@ -531,10 +529,17 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
// need to update active trigger
|
||||
game.getTriggerHandler().resetActiveTriggers();
|
||||
|
||||
if (source.isCopiedSpell() || sa.isAbility()) {
|
||||
if (sa.isAbility()) {
|
||||
// do nothing
|
||||
return;
|
||||
}
|
||||
else if ((source.isInstant() || source.isSorcery() || fizzle) &&
|
||||
|
||||
if (source.isCopiedSpell() && source.isInZone(ZoneType.Stack)) {
|
||||
source.ceaseToExist();
|
||||
return;
|
||||
}
|
||||
|
||||
if ((source.isInstant() || source.isSorcery() || fizzle) &&
|
||||
source.isInZone(ZoneType.Stack)) {
|
||||
// If Spell and still on the Stack then let it goto the graveyard or replace its own movement
|
||||
Map<AbilityKey, Object> params = AbilityKey.newMap();
|
||||
@@ -864,8 +869,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
game.updateStackForView();
|
||||
game.fireEvent(new GameEventSpellRemovedFromStack(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return TextUtil.concatNoSpace(simultaneousStackEntryList.toString(),"==", frozenStack.toString(), "==", stack.toString());
|
||||
}
|
||||
|
||||
@@ -104,8 +104,12 @@ public class Zone implements java.io.Serializable, Iterable<Card> {
|
||||
if (!c.isImmutable()) {
|
||||
final Zone oldZone = game.getZoneOf(c);
|
||||
final ZoneType zt = oldZone == null ? ZoneType.Stack : oldZone.getZoneType();
|
||||
cardsAddedThisTurn.add(zt, c);
|
||||
latestStateCardsAddedThisTurn.add(zt, latestState != null ? latestState : c);
|
||||
|
||||
// only if the zoneType differss from this
|
||||
if (zt != zoneType) {
|
||||
cardsAddedThisTurn.add(zt, c);
|
||||
latestStateCardsAddedThisTurn.add(zt, latestState != null ? latestState : c);
|
||||
}
|
||||
}
|
||||
|
||||
c.setTurnInZone(game.getPhaseHandler().getTurn());
|
||||
|
||||
@@ -2,8 +2,9 @@ Name:Banish into Fable
|
||||
ManaCost:4 W U
|
||||
Types:Instant
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self+wasCastFromHand | Execute$ TrigCopy | TriggerDescription$ When you cast this spell from your hand, copy it if you control an artifact, then copy it if you control an enchantment. You may choose new targets for the copies.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE1 | SubAbility$ DBCopy
|
||||
SVar:DBCopy:DB$ CopySpellAbility| Defined$ TriggeredSpellAbility | ConditionPresent$ Enchantment.YouCtrl | ConditionCompare$ GE1
|
||||
# TODO check ruling with Twinning Staff
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE1 | MayChooseTarget$ True | SubAbility$ DBCopy
|
||||
SVar:DBCopy:DB$ CopySpellAbility| Defined$ TriggeredSpellAbility | ConditionPresent$ Enchantment.YouCtrl | ConditionCompare$ GE1 | MayChooseTarget$ True
|
||||
A:SP$ ChangeZone | Cost$ 4 W U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBToken | SpellDescription$ Return target nonland permanent to its owner's hand. You create a 2/2 white Knight creature token with vigilance.
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You | LegacyImage$ w 2 2 knight vigilance eld
|
||||
DeckHas:Ability$Token
|
||||
|
||||
@@ -2,8 +2,5 @@ Name:Bitter Ordeal
|
||||
ManaCost:2 B
|
||||
Types:Sorcery
|
||||
A:SP$ ChangeZone | Cost$ 2 B | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ Search target player's library for a card and exile it. Then that player shuffles their library.
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigGravestorm | TriggerDescription$ Gravestorm (When you cast this spell, copy it for each permanent put into a graveyard this turn. You may choose new targets for the copies.)
|
||||
SVar:TrigGravestorm:DB$CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ GravestormCount | References$ GravestormCount
|
||||
SVar:GravestormCount:Count$ThisTurnEntered_Graveyard_Permanent
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/bitter_ordeal.jpg
|
||||
Oracle:Search target player's library for a card and exile it. Then that player shuffles their library.\nGravestorm (When you cast this spell, copy it for each permanent put into a graveyard this turn. You may choose new targets for the copies.)
|
||||
K:Gravestorm
|
||||
Oracle:Search target player's library for a card and exile it. Then that player shuffles their library.\nGravestorm (When you cast this spell, copy it for each permanent that was put into a graveyard from the battlefield this turn. If the spell has any targets, you may choose new targets for any of the copies.)
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:1 R R
|
||||
Types:Sorcery
|
||||
A:SP$ Effect | Cost$ 1 R R | Name$ Bonus Round Effect | Triggers$ TrigSpellCast | SVars$ TrigCopySpell | SpellDescription$ Until end of turn, whenever a player casts an instant or sorcery spell, that player copies it and may choose new targets for the copy.
|
||||
SVar:TrigSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | TriggerZones$ Command | ValidActivatingPlayer$ Player | Execute$ TrigCopySpell | TriggerDescription$ Until end of turn, whenever a player casts an instant or sorcery spell, that player copies it and may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | Controller$ TriggeredCardController
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | Controller$ TriggeredCardController | MayChooseTarget$ True
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
AI:RemoveDeck:Random
|
||||
SVar:PlayMain1:TRUE
|
||||
|
||||
@@ -2,7 +2,5 @@ Name:Chain Lightning
|
||||
ManaCost:R
|
||||
Types:Sorcery
|
||||
A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target | NumDmg$ 3 | SubAbility$ DBCopy1 | SpellDescription$ CARDNAME deals 3 damage to any target. Then that player or that permanent's controller may pay {R}{R}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy1:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ R R | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ GE1 | SubAbility$ DBCopy2 | StackDescription$ None
|
||||
SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Parent | Controller$ Targeted | UnlessPayer$ Targeted | UnlessCost$ R R | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ EQ0 | StackDescription$ None
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_lightning.jpg
|
||||
SVar:DBCopy1:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedOrController | UnlessPayer$ TargetedOrController | UnlessCost$ R R | UnlessSwitched$ True | MayChooseTarget$ True | StackDescription$ None
|
||||
Oracle:Chain Lightning deals 3 damage to any target. Then that player or that permanent's controller may pay {R}{R}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Chain of Acid
|
||||
ManaCost:3 G
|
||||
Types:Sorcery
|
||||
A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Permanent.nonCreature | SubAbility$ DBCopy | SpellDescription$ Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | Optional$ True | AILogic$ ChainOfAcid | StackDescription$ None
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | Optional$ True | AILogic$ ChainOfAcid | StackDescription$ None | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_acid.jpg
|
||||
Oracle:Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy.
|
||||
Oracle:Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,7 +2,5 @@ Name:Chain of Plasma
|
||||
ManaCost:1 R
|
||||
Types:Instant
|
||||
A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SubAbility$ DBCopy1 | SpellDescription$ CARDNAME deals 3 damage to any target. Then that player or that permanent's controller may discard a card. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy1:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ GE1 | SubAbility$ DBCopy2 | StackDescription$ None
|
||||
SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Parent | Controller$ Targeted | UnlessPayer$ Targeted | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ EQ0 | StackDescription$ None
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_plasma.jpg
|
||||
SVar:DBCopy1:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedOrController | UnlessPayer$ TargetedOrController | UnlessCost$ Discard<1/Card> | UnlessSwitched$ True | StackDescription$ None | MayChooseTarget$ True
|
||||
Oracle:Chain of Plasma deals 3 damage to any target. Then that player or that permanent's controller may discard a card. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Chain of Silence
|
||||
ManaCost:1 W
|
||||
Types:Instant
|
||||
A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | KW$ Prevent all damage that would be dealt by CARDNAME. | IsCurse$ True | TgtPrompt$ Select target creature | SubAbility$ DBCopy | SpellDescription$ Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, they may copy this spell and may choose a new target for that copy. | StackDescription$ SpellDescription
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | Optional$ True | UnlessPayer$ TargetedController | UnlessCost$ Sac<1/Land> | UnlessSwitched$ True | UnlessAI$ Never | StackDescription$ None
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_silence.jpg
|
||||
Oracle:Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | Optional$ True | UnlessPayer$ TargetedController | UnlessCost$ Sac<1/Land> | UnlessSwitched$ True | UnlessAI$ Never | StackDescription$ None | MayChooseTarget$ True
|
||||
Oracle:Prevent all damage target creature would deal this turn. That creature's controller may sacrifice a land. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Chain of Smog
|
||||
ManaCost:1 B
|
||||
Types:Sorcery
|
||||
A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCopy | SpellDescription$ Target player discards two cards. That player may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedPlayer | Optional$ True | AILogic$ ChainOfSmog | StackDescription$ None
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedPlayer | Optional$ True | AILogic$ ChainOfSmog | StackDescription$ None | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_smog.jpg
|
||||
Oracle:Target player discards two cards. That player may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Chain of Vapor
|
||||
ManaCost:U
|
||||
Types:Instant
|
||||
A:SP$ ChangeZone | Cost$ U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCopy | StackDescription$ SpellDescription | SpellDescription$ Return target nonland permanent to its owner's hand. Then that permanent's controller may sacrifice a land. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ Sac<1/Land> | UnlessSwitched$ True | StackDescription$ None
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_vapor.jpg
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ Sac<1/Land> | UnlessSwitched$ True | StackDescription$ None | MayChooseTarget$ True
|
||||
Oracle:Return target nonland permanent to its owner's hand. Then that permanent's controller may sacrifice a land. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Chain Stasis
|
||||
ManaCost:U
|
||||
Types:Instant
|
||||
A:SP$ TapOrUntap | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBCopy | SpellDescription$ You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ 2 U | UnlessSwitched$ True | StackDescription$ Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ 2 U | UnlessSwitched$ True | MayChooseTarget$ True | StackDescription$ Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_stasis.jpg
|
||||
Oracle:You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -2,11 +2,8 @@ Name:Chandra, the Firebrand
|
||||
ManaCost:3 R
|
||||
Types:Legendary Planeswalker Chandra
|
||||
Loyalty:3
|
||||
A:AB$DealDamage | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
|
||||
A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ SpellCopy | Name$ Chandra, the Firebrand effect. | Image$ chandra_the_firebrand_effect | Triggers$ TrigCopy | SVars$ TrigCopyMain,DBCleanup | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
A:AB$DealDamage | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetMin$ 0 | TargetMax$ 6 | NumDmg$ 6 | SpellDescription$ CARDNAME deals 6 damage to each of up to six targets.
|
||||
SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/chandra_the_firebrand.jpg
|
||||
A:AB$ DealDamage | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
|
||||
A:AB$ DelayedTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ SpellCopy | Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | ThisTurn$ True | Execute$ EffTrigCopy | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
A:AB$ DealDamage | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetMin$ 0 | TargetMax$ 6 | NumDmg$ 6 | SpellDescription$ CARDNAME deals 6 damage to each of up to six targets.
|
||||
Oracle:[+1]: Chandra, the Firebrand deals 1 damage to any target.\n[−2]: When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.\n[−6]: Chandra, the Firebrand deals 6 damage to each of up to six targets.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Chandra's Regulator
|
||||
ManaCost:1 R
|
||||
Types:Legendary Artifact
|
||||
T:Mode$ AbilityCast | ValidCard$ Planeswalker.Chandra | ValidActivatingPlayer$ You | ValidSA$ Activated.Loyalty | TriggerZones$ Battlefield | Execute$ TrigCopyAbility | TriggerDescription$ Whenever you activate a loyalty ability of a Chandra planeswalker, you may pay {1}. If you do, copy that ability. You may choose new targets for the copy.
|
||||
SVar:TrigCopyAbility:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopyAbility:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
A:AB$ Draw | Cost$ 1 T Discard<1/Mountain;Card.Red/Mountain card or a red card> | NumCards$ 1 | SpellDescription$ Draw a card.
|
||||
SVar:AIPreference:SacCost$Card.Mountain,Card.Red
|
||||
DeckNeeds:Type$Chandra
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Cloven Casting
|
||||
ManaCost:5 U R
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.MultiColor,Sorcery.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored instant or sorcery spell, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/cloven_casting.jpg
|
||||
Oracle:Whenever you cast a multicolored instant or sorcery spell, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,8 +4,8 @@ Types:Enchantment Aura Curse
|
||||
K:Enchant player
|
||||
A:SP$ Attach | Cost$ 4 U | ValidTgts$ Player | AILogic$ Curse
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player.EnchantedBy | Execute$ TrigCopy | TriggerZones$ Battlefield | OptionalDecider$ TriggeredCardOpponent | TriggerDescription$ Whenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent
|
||||
# TODO each player should copy it for multiplayer
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent | MayChooseTarget$ True
|
||||
AI:RemoveDeck:All
|
||||
SVar:RemMultiplayer:True
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_echoes.jpg
|
||||
Oracle:Enchant player\nWhenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Conspiracy
|
||||
K:Hidden agenda
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.NamedCard,Sorcery.NamedCard | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell with the chosen name, you may copy it. You may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1 | MayChooseTarget$ True
|
||||
SVar:AgendaLogic:MostProminentSpellInComputerDeck
|
||||
Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nWhenever you cast an instant or sorcery spell with the chosen name, you may copy it. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Double Vision
|
||||
ManaCost:3 R R
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast your first instant or sorcery spell each turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | MayChooseTarget$ True
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:Whenever you cast your first instant or sorcery spell each turn, copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
Name:Doublecast
|
||||
ManaCost:R R
|
||||
Types:Sorcery
|
||||
A:SP$ Effect | Cost$ R R | AILogic$ SpellCopy | Name$ Doublecast Effect | Triggers$ EffTModeSpellCast | SVars$ EffTrigCopy,EffDBCleanup | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTModeSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ EffTrigCopy | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ EffDBCleanup
|
||||
SVar:EffDBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
A:SP$ DelayedTrigger | Cost$ R R | AILogic$ SpellCopy | Execute$ EffTrigCopy | ThisTurn$ True | Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:AIPriorityModifier:9
|
||||
Oracle:When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for that copy.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Enchantment Aura
|
||||
K:Enchant creature
|
||||
A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ForkStick | Description$ Enchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy."
|
||||
SVar:ForkStick:AB$ CopySpellAbility | Cost$ R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
SVar:ForkStick:AB$ CopySpellAbility | Cost$ R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/dual_casting.jpg
|
||||
Oracle:Enchant creature\nEnchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy."
|
||||
|
||||
@@ -4,7 +4,6 @@ Types:Creature Human Wizard
|
||||
PT:2/2
|
||||
K:Flash
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When CARDNAME enters the battlefield, copy target instant or sorcery spell. You may choose new targets for that copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/dualcaster_mage.jpg
|
||||
Oracle:Flash\nWhen Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,11 +4,8 @@ Types:Creature Human Wizard
|
||||
PT:2/3
|
||||
K:Level up:1 U
|
||||
SVar:maxLevel:4
|
||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ CopyOnce | CheckSVar$ X | SVarCompare$ EQ1 | Description$ LEVEL 2-3 2/4 CARDNAME gets U U,tap: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddAbility$ CopyTwice | CheckSVar$ Y | SVarCompare$ EQ1 | Description$ LEVEL 4+ 2/5 CARDNAME gets U U,tap:Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||
SVar:CopyOnce:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:CopyTwice:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||
SVar:X:Count$Valid Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL
|
||||
SVar:Y:Count$Valid Card.Self+counters_GE4_LEVEL
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg
|
||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ CopyOnce | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL | Description$ LEVEL 2-3 2/4 CARDNAME gets U U,tap: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddAbility$ CopyTwice | IsPresent$ Card.Self+counters_GE4_LEVEL | Description$ LEVEL 4+ 2/5 CARDNAME gets U U,tap:Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||
SVar:CopyOnce:AB$ CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:CopyTwice:AB$ CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||
Oracle:Level up {1}{U} ({1}{U}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-3\n2/4\n{U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy.\nLEVEL 4+\n2/5\n{U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Echo Storm
|
||||
ManaCost:3 U U
|
||||
Types:Sorcery
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$TotalCommanderCastFromCommandZone
|
||||
A:SP$ CopyPermanent | Cost$ 3 U U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Create a token that's a copy of target artifact.
|
||||
DeckHas:Ability$Token
|
||||
|
||||
@@ -3,7 +3,6 @@ ManaCost:no cost
|
||||
Types:Conspiracy
|
||||
K:Hidden agenda
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Command | TargetsValid$ Card.NamedCard+YouCtrl | Execute$ TrigCopySpell | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell, if it targets a creature you control with the chosen name, you may copy that spell and may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopySpell:DB$CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:AgendaLogic:BestCreatureInComputerDeck
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/echoing_boon.jpg
|
||||
Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nWhenever you cast an instant or sorcery spell, if it targets a creature you control with the chosen name, you may copy that spell and may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Empyrial Storm
|
||||
ManaCost:4 W W
|
||||
Types:Sorcery
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$TotalCommanderCastFromCommandZone
|
||||
A:SP$ Token | Cost$ 4 W W | TokenAmount$ 1 | TokenScript$ w_4_4_angel_flying | TokenOwner$ You | LegacyImage$ w 4 4 angel flying c18 | SpellDescription$ Create a 4/4 white Angel creature token with flying.
|
||||
DeckHas:Ability$Token
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Expansion
|
||||
ManaCost:U/R U/R
|
||||
Types:Instant
|
||||
AlternateMode: Split
|
||||
A:SP$ CopySpellAbility | Cost$ U/R U/R | ValidTgts$ Card.Instant+cmcLE4,Card.Sorcery+cmcLE4 | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy.
|
||||
A:SP$ CopySpellAbility | Cost$ U/R U/R | ValidTgts$ Card.Instant+cmcLE4,Card.Sorcery+cmcLE4 | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy.
|
||||
Oracle:Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy.
|
||||
|
||||
ALTERNATE
|
||||
|
||||
@@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ X R R | ValidTgts$ Instant.YouOwn+cmcLEX | TgtZone$ Graveyard
|
||||
SVar:DBPump:DB$ Pump | ValidTgts$ Sorcery.YouOwn+cmcLEX | TgtZone$ Graveyard | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target sorcery card in your graveyard with converted mana cost X or less | RememberObjects$ Targeted | SubAbility$ DBPlay | References$ X | StackDescription$ None
|
||||
SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered | ValidZone$ Graveyard | Controller$ You | CopyCard$ True | CopyOnce$ True | WithoutManaCost$ True | Optional$ True | Amount$ All | SubAbility$ DBRepeat
|
||||
SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Remembered | ClearRemembered$ True | ChooseOrder$ True | RepeatSubAbility$ DBCopy | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Amount$ 2 | Defined$ Remembered
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Amount$ 2 | Defined$ Remembered | MayChooseTarget$ True
|
||||
SVar:X:Count$xPaid
|
||||
Oracle:You may cast up to one target instant card and/or sorcery card from your graveyard each with converted mana cost X or less without paying their mana costs. If a card cast this way would be put into your graveyard this turn, exile it instead. If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies.
|
||||
Oracle:You may cast up to one target instant card and/or sorcery card from your graveyard each with converted mana cost X or less without paying their mana costs. If a card cast this way would be put into your graveyard this turn, exile it instead. If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies.
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
Name:Fork
|
||||
ManaCost:R R
|
||||
Types:Instant
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | CopyIsColor$ Red | OverwriteColors$ True | SpellDescription$ Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/fork.jpg
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | CopyIsColor$ Red | OverwriteColors$ True | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy.
|
||||
Oracle:Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Fury Storm
|
||||
ManaCost:2 R R
|
||||
Types:Instant
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$TotalCommanderCastFromCommandZone
|
||||
A:SP$ CopySpellAbility | Cost$ 2 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
A:SP$ CopySpellAbility | Cost$ 2 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:When you cast this spell, copy it for each time you've cast your commander from the command zone this game. You may choose new targets for the copies.\nCopy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Geistblast
|
||||
ManaCost:2 R
|
||||
Types:Instant
|
||||
A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
SVar:AIPreference:ExileFromGraveCost$Card.Self
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/geistblast.jpg
|
||||
Oracle:Geistblast deals 2 damage to any target.\n{2}{U}, Exile Geistblast from your graveyard: Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Genesis Storm
|
||||
ManaCost:4 G G
|
||||
Types:Sorcery
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$TotalCommanderCastFromCommandZone
|
||||
A:SP$ DigUntil | Cost$ 4 G G | Valid$ Permanent.nonland | ValidDescription$ nonland permanent | FoundDestination$ Battlefield | OptionalFoundMove$ True | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order.
|
||||
Oracle:When you cast this spell, copy it for each time you've cast your commander from the command zone this game. You may choose new targets for the copies.\nReveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order.
|
||||
|
||||
@@ -2,8 +2,7 @@ Name:Hive Mind
|
||||
ManaCost:5 U
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
SVar:RemMultiplayer:True
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/hive_mind.jpg
|
||||
Oracle:Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy.
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
Name:Howl of the Horde
|
||||
ManaCost:2 R
|
||||
Types:Sorcery
|
||||
A:SP$ Effect | Cost$ 2 R | AILogic$ SpellCopy | Name$ Howl of the Horde Effect 1 | Triggers$ TrigCopy | SVars$ TrigCopyMain,DBCleanup | SubAbility$ DBEffect | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. Raid — If you attacked this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy.
|
||||
SVar:DBEffect:DB$ Effect | Name$ Howl of the Horde Effect 2 | Triggers$ TrigCopy | SVars$ TrigCopyMain,DBCleanup | ConditionCheckSVar$ RaidTest | ConditionSVarCompare$ GE1 | References$ RaidTest
|
||||
A:SP$ DelayedTrigger | Cost$ 2 R | AILogic$ SpellCopy | Execute$ EffTrigCopy | ThisTurn$ True | Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | | SubAbility$ DBEffect | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell.
|
||||
SVar:DBEffect:DB$ DelayedTrigger | AILogic$ SpellCopy | Execute$ EffTrigCopy | ThisTurn$ True | Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | ConditionCheckSVar$ RaidTest | ConditionSVarCompare$ GE1 | References$ RaidTest | SpellDescription$ Raid — If you attacked this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy.
|
||||
SVar:RaidTest:Count$AttackersDeclared
|
||||
SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:AIPriorityModifier:9
|
||||
Oracle:When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.\nRaid — If you attacked this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,6 +3,5 @@ ManaCost:2
|
||||
Types:Artifact Equipment
|
||||
K:Equip:3
|
||||
T:Mode$ AbilityCast | ValidCard$ Creature.EquippedBy | TriggerZones$ Battlefield | Execute$ TrigCopyAbility | OptionalDecider$ You | TriggerDescription$ Whenever an ability of equipped creature is activated, if it isn't a mana ability, copy that ability. You may choose new targets for the copy.
|
||||
SVar:TrigCopyAbility:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionists_bracers.jpg
|
||||
SVar:TrigCopyAbility:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
Oracle:Whenever an ability of equipped creature is activated, if it isn't a mana ability, copy that ability. You may choose new targets for the copy.\nEquip {3}
|
||||
|
||||
@@ -2,8 +2,6 @@ Name:Increasing Vengeance
|
||||
ManaCost:R R
|
||||
Types:Instant
|
||||
K:Flashback:3 R R
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SubAbility$ DBCopy2 | SpellDescription$ Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.
|
||||
SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | AILogic$ Always
|
||||
SVar:X:Count$wasCastFromGraveyard.1.0
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_vengeance.jpg
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | Amount$ X | References$ X | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.
|
||||
SVar:X:Count$wasCastFromGraveyard.2.1
|
||||
Oracle:Copy target instant or sorcery spell you control. If this spell was cast from a graveyard, copy that spell twice instead. You may choose new targets for the copies.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
|
||||
|
||||
@@ -4,6 +4,5 @@ Types:Instant
|
||||
A:SP$ Charm | Cost$ 2 U U | Choices$ DBCounter,DBChangeTargets,DBCopySpellAbility | Defined$ You
|
||||
SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Counter target spell | SpellDescription$ Counter target spell.
|
||||
SVar:DBChangeTargets:DB$ ChangeTargets | TargetType$ Spell | Optional$ True | ValidTgts$ Card | SpellDescription$ You may choose new targets for target spell.
|
||||
SVar:DBCopySpellAbility:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/insidious_will.jpg
|
||||
SVar:DBCopySpellAbility:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:Choose one —\n• Counter target spell.\n• You may choose new targets for target spell.\n• Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ Name:Izzet Guildmage
|
||||
ManaCost:UR UR
|
||||
Types:Creature Human Wizard
|
||||
PT:2/2
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 R | ValidTgts$ Sorcery.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_guildmage.jpg
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 R | ValidTgts$ Sorcery.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
Oracle:{2}{U}: Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy.\n{2}{R}: Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,10 +2,9 @@ Name:Izzet Steam Maze
|
||||
ManaCost:no cost
|
||||
Types:Plane Ravnica
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player | Execute$ TrigCopy | TriggerZones$ Command | TriggerDescription$ Whenever a player casts an instant or sorcery spell, that player copies it. The player may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredActivator
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredActivator | MayChooseTarget$ True
|
||||
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, instant and sorcery spells you cast this turn cost {3} less to cast.
|
||||
SVar:RolledChaos:DB$ Effect | StaticAbilities$ ReduceSPcost
|
||||
SVar:ReduceSPcost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ 3 | Description$ Instant and sorcery spells you cast this turn cost 3 less to cast.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_steam_maze.jpg
|
||||
SVar:AIRollPlanarDieParams:Mode$ Always | RollInMain1$ True
|
||||
Oracle:Whenever a player casts an instant or sorcery spell, that player copies it. The player may choose new targets for the copy.\nWhenever you roll {CHAOS}, instant and sorcery spells you cast this turn cost {3} less to cast.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:1 G U R
|
||||
Types:Legendary Creature Elemental Dinosaur
|
||||
PT:4/4
|
||||
T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast your first instant spell each turn, if CARDNAME is tapped, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ConditionPresent$ Card.Self+tapped | Defined$ TriggeredSpellAbility | AILogic$ Always
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ConditionPresent$ Card.Self+tapped | Defined$ TriggeredSpellAbility | AILogic$ Always | MayChooseTarget$ True
|
||||
SVar:BuffedBy:Instant
|
||||
T:Mode$ SpellCopy | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you copy an instant spell, put a +1/+1 counter on CARDNAME.
|
||||
DeckHas:Ability$Counters
|
||||
|
||||
@@ -3,6 +3,5 @@ ManaCost:2 R R
|
||||
Types:Legendary Creature Ogre Spirit
|
||||
PT:4/3
|
||||
T:Mode$ AbilityCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCopyAbility | TriggerDescription$ Whenever you activate an ability of an artifact, if it isn't a mana ability, you may pay {R}. If you do, copy that ability. You may choose new targets for the copy.
|
||||
SVar:TrigCopyAbility:AB$ CopySpellAbility | Cost$ R | Defined$ TriggeredSpellAbility
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/kurkesh_onakke_ancient.jpg
|
||||
SVar:TrigCopyAbility:AB$ CopySpellAbility | Cost$ R | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
Oracle:Whenever you activate an ability of an artifact, if it isn't a mana ability, you may pay {R}. If you do, copy that ability. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:U R
|
||||
Types:Creature Human Wizard
|
||||
PT:2/2
|
||||
A:AB$ Draw | Cost$ 3 U T | NumCards$ 1 | SpellDescription$ Draw a card.
|
||||
A:AB$ CopySpellAbility | Cost$ X R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ X R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy.
|
||||
SVar:X:Targeted$CardManaCost
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:{3}{U}, {T}: Draw a card.\n{X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy.
|
||||
|
||||
8
forge-gui/res/cardsfolder/l/lithoform_engine.txt
Normal file
8
forge-gui/res/cardsfolder/l/lithoform_engine.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Name:Lithoform Engine
|
||||
ManaCost:4
|
||||
Types:Legendary Artifact
|
||||
A:AB$ CopySpellAbility | Cost$ 2 T | TgtPrompt$ Select target activated or triggered ability you control | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Card | MayChooseTarget$ True | StackDescription$ SpellDescription | SpellDescription$ Copy target activated or triggered ability you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 3 T | TgtPrompt$ Select target instant or sorcery spell you control | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 4 T | TgtPrompt$ Select target permanent spell you control | ValidTgts$ Permanent.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target permanent spell you control. (The copy becomes a token.)
|
||||
Oracle:{2}, {T}: Copy target activated or triggered ability you control. You may choose new targets for the copy.\n{3}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy.\n{4}, {T}: Copy target permanent spell you control. (The copy becomes a token.)
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Lucky Clover
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.Adventure,Sorcery.Adventure | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Adventure instant or sorcery spell, copy it. You may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Whenever you cast an Adventure instant or sorcery spell, copy it. You may choose new targets for the copy.
|
||||
|
||||
@@ -5,6 +5,6 @@ PT:3/2
|
||||
K:Companion:Special:UniqueNames:Each nonland card in your starting deck has a different name.
|
||||
K:Flash
|
||||
T:Mode$ ChangesZone | ValidCard$ Card.Self+wasCast | Origin$ Any | Destination$ Battlefield | Execute$ TrigCopy | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtPrompt$ Select target instant or sorcery spell you control
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtPrompt$ Select target instant or sorcery spell you control | MayChooseTarget$ True
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:Companion — Each nonland card in your starting deck has a different name. (If this card is your chosen companion, you may cast it once from outside the game.)\nFlash\nWhen Lutri, the Spellchaser enters the battlefield, if you cast it, copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,7 +3,6 @@ ManaCost:B B
|
||||
Types:Instant
|
||||
A:SP$ Destroy | Cost$ B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature.
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerDescription$ Morbid — When you cast CARDNAME, if a creature died this turn, you may copy CARDNAME and may choose a new target for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/malicious_affliction.jpg
|
||||
Oracle:Morbid — When you cast Malicious Affliction, if a creature died this turn, you may copy Malicious Affliction and may choose a new target for the copy.\nDestroy target nonblack creature.
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:2/4
|
||||
S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ Player | Description$ Play with the top card of your library revealed.
|
||||
S:Mode$ Continuous | Affected$ Instant.TopLibrary+YouCtrl,Sorcery.TopLibrary+YouCtrl | AffectedZone$ Library | EffectZone$ Battlefield | MayPlay$ True | Description$ You may cast the top card of your library if it's an instant or sorcery card.
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.wasCastFromLibrary,Sorcery.wasCastFromLibrary | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell from your library, copy it. You may choose new targets for this copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/melek_izzet_paragon.jpg
|
||||
Oracle:Play with the top card of your library revealed.\nYou may cast the top card of your library if it's an instant or sorcery card.\nWhenever you cast an instant or sorcery spell from your library, copy it. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Meletis Charlatan
|
||||
ManaCost:2 U
|
||||
Types:Creature Human Wizard
|
||||
PT:2/3
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | AILogic$ OnceIfViable | AITgts$ OwnedOnly | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/meletis_charlatan.jpg
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | AILogic$ OnceIfViable | AITgts$ OwnedOnly | MayChooseTarget$ True | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy.
|
||||
Oracle:{2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Mirari
|
||||
ManaCost:5
|
||||
Types:Legendary Artifact
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopy | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may pay {3}. If you do, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:AB$CopySpellAbility | Cost$ 3 | Defined$ TriggeredSpellAbility | AILogic$ AlwaysIfViable
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/mirari.jpg
|
||||
SVar:TrigCopy:AB$CopySpellAbility | Cost$ 3 | Defined$ TriggeredSpellAbility | AILogic$ AlwaysIfViable | MayChooseTarget$ True
|
||||
Oracle:Whenever you cast an instant or sorcery spell, you may pay {3}. If you do, copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
Name:Mirror Sheen
|
||||
ManaCost:1 UR UR
|
||||
Types:Enchantment
|
||||
A:AB$ CopySpellAbility | Cost$ 1 UR UR | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetValidTargeting$ You | AILogic$ AlwaysIfViable | SpellDescription$ Copy target instant or sorcery spell that targets you. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_sheen.jpg
|
||||
A:AB$ CopySpellAbility | Cost$ 1 UR UR | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetValidTargeting$ You | AILogic$ AlwaysIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell that targets you. You may choose new targets for the copy.
|
||||
Oracle:{1}{U/R}{U/R}: Copy target instant or sorcery spell that targets you. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,7 +3,6 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
K:CARDNAME enters the battlefield tapped.
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 C T Sac<1/CARDNAME> | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 C T Sac<1/CARDNAME> | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
A:AB$ CopyPermanent | Cost$ 4 C T Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumCopies$ 1 | SpellDescription$ Create a token that's a copy of target creature you control.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/mirrorpool.jpg
|
||||
Oracle:Mirrorpool enters the battlefield tapped.\n{T}: Add {C}.\n{2}{C}, {T}, Sacrifice Mirrorpool: Copy target instant or sorcery spell you control. You may choose new targets for the copy.\n{4}{C}, {T}, Sacrifice Mirrorpool: Create a token that's a copy of target creature you control.
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:3/3
|
||||
K:Morph:1 U U
|
||||
A:AB$ SetState | Cost$ 3 U U | Defined$ Self | Mode$ TurnFace | SpellDescription$ Turn CARDNAME face down.
|
||||
T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | MayChooseTarget$ True
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/mischievous_quanar.jpg
|
||||
Oracle:{3}{U}{U}: Turn Mischievous Quanar face down.\nMorph {1}{U}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Mischievous Quanar is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy.
|
||||
|
||||
@@ -5,11 +5,8 @@ Loyalty:6
|
||||
A:AB$ PeekAndReveal | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | AILogic$ Main2 | PeekAmount$ 1 | RevealValid$ Card.nonCreature+nonLand | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBChangeZone | SpellDescription$ Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.
|
||||
SVar:DBChangeZone:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Hand | ConditionDefined$ Remembered | ConditionPresent$ Card.nonCreature+nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanupOne
|
||||
SVar:DBCleanupOne:DB$ Cleanup | ClearRemembered$ True
|
||||
A:AB$Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Name$ Narset Transcendent effect. | Triggers$ AddRebound | SVars$ AddReboundMain,DBCleanupTwo | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)
|
||||
SVar:AddRebound:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | OneOff$ True | Execute$ AddReboundMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound.
|
||||
SVar:AddReboundMain:DB$ Pump | Defined$ TriggeredCard| KW$ Rebound | PumpZone$ Stack | SubAbility$ DBCleanupTwo
|
||||
SVar:DBCleanupTwo:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
A:AB$ DelayedTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ NarsetRebound | Stackable$ False | Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | Execute$ AddRebound | SpellDescription$ When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)
|
||||
SVar:AddRebound:DB$ Pump | Defined$ TriggeredCard | KW$ Rebound | PumpZone$ Stack
|
||||
A:AB$ Effect | Cost$ SubCounter<9/LOYALTY> | Name$ Emblem - Narset Transcendent | StaticAbilities$ STNarset | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Your opponents can't cast noncreature spells."
|
||||
SVar:STNarset:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Caster$ Opponent | EffectZone$ Command | Description$ Your opponents can't cast noncreature spells.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/narset_transcendent.jpg
|
||||
Oracle:[+1]: Look at the top card of your library. If it's a noncreature, nonland card, you may reveal it and put it into your hand.\n[-2]: When you cast your next instant or sorcery spell from your hand this turn, it gains rebound. (Exile the spell as it resolves. At the beginning of your next upkeep, you may cast that card from exile without paying its mana cost.)\n[-9]: You get an emblem with "Your opponents can't cast noncreature spells."
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Name:Narset's Reversal
|
||||
ManaCost:U U
|
||||
Types:Instant
|
||||
A:SP$ CopySpellAbility | Cost$ U U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SubAbility$ DBReturn | SpellDescription$ Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy.
|
||||
A:SP$ CopySpellAbility | Cost$ U U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SubAbility$ DBReturn | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy.
|
||||
SVar:DBReturn:DB$ChangeZone | Defined$ Targeted | Origin$ Stack | Destination$ Hand
|
||||
Oracle:Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Legendary Creature Human Wizard
|
||||
PT:3/3
|
||||
K:Flash
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When CARDNAME enters the battlefield, copy target instant or sorcery spell you control. You may choose new targets for that copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtPrompt$ Select target instant or sorcery spell you control | TargetType$ Spell
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtPrompt$ Select target instant or sorcery spell you control | TargetType$ Spell | MayChooseTarget$ True
|
||||
S:Mode$ Continuous | Affected$ Wizard.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Wizards you control get +1/+1.
|
||||
DeckHints:Type$Wizard
|
||||
Oracle:Flash\nWhen Naru Meha, Master Wizard enters the battlefield, copy target instant or sorcery spell you control. You may choose new targets for the copy.\nOther Wizards you control get +1/+1.
|
||||
|
||||
@@ -4,7 +4,6 @@ Types:Creature Human Wizard
|
||||
PT:2/2
|
||||
A:AB$ Draw | Cost$ 1 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard
|
||||
SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 U R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/nivix_guildmage.jpg
|
||||
Oracle:{1}{U}{R}: Draw a card, then discard a card.\n{2}{U}{R}: Copy target instant or sorcery spell you control. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,8 +4,7 @@ AlternateMode: Split
|
||||
Types:Instant
|
||||
A:SP$ FlipACoin | Cost$ U R | NoCall$ True | HeadsSubAbility$ OddCounter | TailsSubAbility$ OddCopy | TgtZone$ Stack | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target Instant or Sorcery spell | SpellDescription$ Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy.
|
||||
SVar:OddCounter:DB$ Counter | Defined$ Targeted
|
||||
SVar:OddCopy:DB$ CopySpellAbility | Defined$ Targeted
|
||||
SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=107445&type=card
|
||||
SVar:OddCopy:DB$ CopySpellAbility | Defined$ Targeted | MayChooseTarget$ True
|
||||
Oracle:Flip a coin. If it comes up heads, counter target instant or sorcery spell. If it comes up tails, copy that spell and you may choose new targets for the copy.
|
||||
|
||||
ALTERNATE
|
||||
|
||||
@@ -13,7 +13,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | Execute$ DBInitSV
|
||||
SVar:DBInitSVar:DB$ StoreSVar | SVar$ FullyCharged | Type$ Number | Expression$ 0 | References$ FullyCharged
|
||||
SVar:FullyCharged:Number$0
|
||||
AlternateMode:DoubleFaced
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_amulet.jpg
|
||||
Oracle:Instant and sorcery spells you cast cost {1} less to cast.\nWhenever you cast an instant or sorcery spell, put a charge counter on Primal Amulet. Then if there are four or more charge counters on it, you may remove those counters and transform it.
|
||||
|
||||
ALTERNATE
|
||||
@@ -23,6 +22,5 @@ ManaCost:no cost
|
||||
Types:Land
|
||||
A:AB$ Mana | Cost$ T | Produced$ Any | TriggersWhenSpent$ TrigCopy | SpellDescription$ Add one mana of any color. When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerDescription$ When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_wellspring.jpg
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
Oracle:(Transforms from Primal Amulet.)\n{T}: Add one mana of any color. When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
|
||||
@@ -2,8 +2,7 @@ Name:Psychic Rebuttal
|
||||
ManaCost:1 U
|
||||
Types:Instant
|
||||
A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TargetValidTargeting$ You | TgtPrompt$ Select target spell that targets you | ValidTgts$ Instant,Sorcery | RememberCountered$ True | SubAbility$ DBCopy | SpellDescription$ Counter target instant or sorcery spell that targets you. Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may copy the spell countered this way. You may choose new targets for the copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | References$ X | SubAbility$ DBCleanup
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | References$ X | MayChooseTarget$ True | SubAbility$ DBCleanup
|
||||
SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_rebuttal.jpg
|
||||
Oracle:Counter target instant or sorcery spell that targets you. \nSpell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may copy the spell countered this way. You may choose new targets for the copy.
|
||||
Oracle:Counter target instant or sorcery spell that targets you. \nSpell mastery — If there are two or more instant and/or sorcery cards in your graveyard, you may copy the spell countered this way. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,11 +3,10 @@ ManaCost:1 R
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.sharesNameWith YourGraveyard,Sorcery.sharesNameWith YourGraveyard | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell that has the same name as a card in your graveyard, you may put a quest counter on CARDNAME.
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE2_QUEST | Execute$ TrigCopySpell | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell while CARDNAME has two or more quest counters on it, you may copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 | ConditionDefined$ TriggeredCard
|
||||
SVar:TrigCopySpell:DB$CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always
|
||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 | ConditionDefined$ TriggeredCard
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | MayChooseTarget$ True
|
||||
DeckHints:Keyword$Retrace & Keyword$Flashback
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
DeckHas:Ability$Counters
|
||||
SVar:MaxQuestEffect:2
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancer_ascension.jpg
|
||||
Oracle:Whenever you cast an instant or sorcery spell that has the same name as a card in your graveyard, you may put a quest counter on Pyromancer Ascension.\nWhenever you cast an instant or sorcery spell while Pyromancer Ascension has two or more quest counters on it, you may copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,6 +3,5 @@ ManaCost:5
|
||||
Types:Legendary Artifact
|
||||
A:AB$ Mana | Cost$ T | Produced$ R | TriggersWhenSpent$ TrigCopy | SpellDescription$ Add {R}. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant.Red,Sorcery.Red | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerDescription$ When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancers_goggles.jpg
|
||||
Oracle:{T}: Add {R}. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
Oracle:{T}: Add {R}. When that mana is spent to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy.
|
||||
|
||||
@@ -6,10 +6,8 @@ T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Tr
|
||||
T:Mode$ SpellCopy | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | Secondary$ True | TriggerDescription$ Whenever you cast or copy an instant or sorcery spell, CARDNAME deals 1 damage to target opponent or planeswalker.
|
||||
SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1
|
||||
A:AB$ Scry | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ScryNum$ 1 | SpellDescription$ Scry 1.
|
||||
A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ SpellCopy | Triggers$ EffTModeSpellCast | SVars$ EffTrigCopy,EffDBCleanup | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTModeSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ EffTrigCopy | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ EffDBCleanup
|
||||
SVar:EffDBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
A:AB$ DelayedTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ SpellCopy | Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | ThisTurn$ True | Execute$ EffTrigCopy | SpellDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:BuffedBy:Instant,Sorcery
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:Whenever you cast or copy an instant or sorcery spell, Ral, Storm Conduit deals 1 damage to target opponent or planeswalker.\n[+2]: Scry 1.\n[-2]: When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,11 +3,9 @@ ManaCost:3 R
|
||||
AlternateMode: Split
|
||||
Types:Instant
|
||||
A:SP$ Pump | Cost$ 3 R | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select target spell | PumpZone$ Stack | StackDescription$ None | SubAbility$ DBDmg | SpellDescription$ CARDNAME deals damage to target spell's controller equal to that spell's converted mana cost.
|
||||
|
||||
SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X
|
||||
SVar:X:Targeted$CardManaCost
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/refuse_cooperate.jpg
|
||||
Oracle:Refuse deals damage to target spell's controller equal to that spell's converted mana cost.
|
||||
|
||||
ALTERNATE
|
||||
@@ -16,5 +14,5 @@ Name:Cooperate
|
||||
ManaCost:2 U
|
||||
Types:Instant
|
||||
K:Aftermath
|
||||
A:SP$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nCopy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
A:SP$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nCopy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Reiterate
|
||||
ManaCost:1 R R
|
||||
Types:Instant
|
||||
K:Buyback:3
|
||||
A:SP$ CopySpellAbility | Cost$ 1 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/reiterate.jpg
|
||||
A:SP$ CopySpellAbility | Cost$ 1 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nCopy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
Name:Repeated Reverberation
|
||||
ManaCost:2 R R
|
||||
Types:Instant
|
||||
A:SP$ Effect | Cost$ 2 R R | AILogic$ SpellCopy | Name$ Repeated Reverberation Effect | Triggers$ TrigCopy,TrigCopy2 | SVars$ TrigCopyMain,DBCleanup | SpellDescription$ When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies.
|
||||
SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerZones$ Command | TriggerDescription$ When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies.
|
||||
SVar:TrigCopy2:Mode$ AbilityCast | ValidSA$ Activated.Loyalty | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies.
|
||||
SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 2 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
|
||||
A:SP$ DelayedTrigger | Cost$ 2 R R | AILogic$ SpellCopy | Mode$ SpellAbilityCast | ValidSA$ Spell.Instant,Spell.Sorcery,Activated.Loyalty | ValidActivatingPlayer$ You | ThisTurn$ True | Execute$ EffTrigCopy | SpellDescription$ When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies.
|
||||
SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 2 | MayChooseTarget$ True
|
||||
Oracle:When you next cast an instant spell, cast a sorcery spell, or activate a loyalty ability this turn, copy that spell or ability twice. You may choose new targets for the copies.
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
Name:Reverberate
|
||||
ManaCost:R R
|
||||
Types:Instant
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberate.jpg
|
||||
A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,7 +4,6 @@ Types:Legendary Creature Human Wizard
|
||||
PT:2/2
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopySpell | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may pay {U}{R}. If you do, copy that spell. You may choose new targets for the copy.
|
||||
T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+Other+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever another nontoken creature enters the battlefield under your control, you may pay {G}{U}. If you do, create a token that's a copy of that creature.
|
||||
SVar:TrigCopySpell:AB$CopySpellAbility | Cost$ U R | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:AB$CopyPermanent | Cost$ G U | Defined$ TriggeredCard
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/riku_of_two_reflections.jpg
|
||||
SVar:TrigCopySpell:AB$ CopySpellAbility | Cost$ U R | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:TrigCopy:AB$ CopyPermanent | Cost$ G U | Defined$ TriggeredCard
|
||||
Oracle:Whenever you cast an instant or sorcery spell, you may pay {U}{R}. If you do, copy that spell. You may choose new targets for the copy.\nWhenever another nontoken creature enters the battlefield under your control, you may pay {G}{U}. If you do, create a token that's a copy of that creature.
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Rings of Brighthearth
|
||||
ManaCost:3
|
||||
Types:Artifact
|
||||
T:Mode$ AbilityCast | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCopySpell | OptionalDecider$ You | TriggerDescription$ Whenever you activate an ability, if it isn't a mana ability, you may pay {2}. If you do, copy that ability. You may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:AB$CopySpellAbility | Cost$ 2 | Defined$ TriggeredSpellAbility
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/rings_of_brighthearth.jpg
|
||||
SVar:TrigCopySpell:AB$ CopySpellAbility | Cost$ 2 | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
Oracle:Whenever you activate an ability, if it isn't a mana ability, you may pay {2}. If you do, copy that ability. You may choose new targets for the copy.
|
||||
|
||||
@@ -12,6 +12,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
A:AB$ DamageAll | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 3 | ValidCards$ Creature.tapped | Planeswalker$ True | ValidDescription$ each tapped creature target player controls. | SpellDescription$ CARDNAME deals 3 damage to each tapped creature target player controls
|
||||
A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | EffectOwner$ Targeted | Name$ Emblem - Rowan Kenrith | Image$ emblem_rowan_kenrith | Triggers$ CopyAbility | SVars$ TrigCopy | Duration$ Permanent | AILogic$ Always | SpellDescription$ Target player gets an emblem with "Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy."
|
||||
SVar:CopyAbility:Mode$ AbilityCast | ValidActivatingPlayer$ You | TriggerZones$ Command | Execute$ TrigCopy | TriggerDescription$ Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
DeckHints:Name$Will Kenrith
|
||||
Oracle:[+2]: During target player's next turn, each creature that player controls attacks if able.\n[-2]: Rowan Kenrith deals 3 damage to each tapped creature target player controls.\n[-8]: Target player gets an emblem with "Whenever you activate an ability that isn't a mana ability, copy it. You may choose new targets for the copy."\nPartner with Will Kenrith\nRowan Kenrith can be your commander.\n
|
||||
|
||||
@@ -3,14 +3,10 @@ ManaCost:1 U
|
||||
Types:Creature Human Wizard
|
||||
PT:2/1
|
||||
K:Kicker:4 U
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. You may choose new targets for the copy.
|
||||
SVar:TrigEffect:DB$ DelayedTrigger | AILogic$ SpellCopy | Mode$ SpellCast | ValidCard$ Instant.cmcLE2,Sorcery.cmcLE2 | ValidActivatingPlayer$ You | ThisTurn$ True | Execute$ TrigCopy | TriggerDescription$ Copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$Kicked.2.1
|
||||
SVar:PlayMain1:TRUE
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+notkicked | Execute$ TrigEffect | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. You may choose new targets for the copy.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigEffectKicked | TriggerDescription$ When CARDNAME enters the battlefield, copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. If CARDNAME was kicked, copy that spell twice instead. You may choose new targets for the copies.
|
||||
SVar:TrigEffect:DB$ Effect | Triggers$ TrigCast | SVars$ TrigCopy
|
||||
SVar:TrigCast:Mode$ SpellCast | OneOff$ True | ValidActivatingPlayer$ You | ValidCard$ Instant.cmcLE2,Sorcery.cmcLE2 | TriggerZones$ Command | Execute$ TrigCopy | TriggerDescription$ Copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always
|
||||
SVar:TrigEffectKicked:DB$ Effect | Triggers$ TrigCastKicked | SVars$ TrigCopyKicked
|
||||
SVar:TrigCastKicked:Mode$ SpellCast | OneOff$ True | ValidActivatingPlayer$ You | ValidCard$ Instant.cmcLE2,Sorcery.cmcLE2 | TriggerZones$ Command | Execute$ TrigCopyKicked | TriggerDescription$ Copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn twice when you cast it. You may choose new targets for the copies.
|
||||
SVar:TrigCopyKicked:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | Amount$ 2
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
Oracle:Kicker {4}{U}\nWhen Sea Gate Stormcaller enters the battlefield, copy the next instant or sorcery spell with converted mana cost 2 or less you cast this turn when you cast it. If Sea Gate Stormcaller was kicked, copy that spell twice instead. You may choose new targets for the copies.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard
|
||||
PT:2/2
|
||||
K:Prevent all damage that would be dealt to CARDNAME.
|
||||
T:Mode$ SpellCast | ValidCard$ Instant.YouCtrl+wasCastFromGraveyard,Sorcery.YouCtrl+wasCastFromGraveyard | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast your first instant or sorcery spell from your graveyard each turn, copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:AIPriorityModifier:9
|
||||
Oracle:Prevent all damage that would be dealt to Sevinne, the Chronoclasm.\nWhenever you cast your first instant or sorcery spell from your graveyard each turn, copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Sevinne's Reclamation
|
||||
ManaCost:2 W
|
||||
Types:Sorcery
|
||||
A:SP$ ChangeZone | Cost$ 2 W | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target permanent card with converted mana cost 3 or less from your graveyard | ValidTgts$ Permanent.cmcLE3+YouCtrl | SubAbility$ DBCpoy | SpellDescription$ Return target permanent card with converted mana cost 3 or less from your graveyard to the battlefield. If this spell was cast from a graveyard, you may copy this spell and may choose a new target for the copy.
|
||||
SVar:DBCpoy:DB$ CopySpellAbility | Defined$ Parent | Optional$ True | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromGraveyard
|
||||
SVar:DBCpoy:DB$ CopySpellAbility | Defined$ Parent | Optional$ True | MayChooseTarget$ True | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromGraveyard
|
||||
AI:RemoveDeck:Random
|
||||
K:Flashback:4 W
|
||||
Oracle:Return target permanent card with converted mana cost 3 or less from your graveyard to the battlefield. If this spell was cast from a graveyard, you may copy this spell and may choose a new target for the copy.\nFlashback {4}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.)
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Sigil Tracer
|
||||
ManaCost:1 U U
|
||||
Types:Creature Merfolk Wizard
|
||||
PT:2/2
|
||||
A:AB$CopySpellAbility | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_tracer.jpg
|
||||
A:AB$CopySpellAbility | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | MayChooseTarget$ True | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
Oracle:{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Skull Storm
|
||||
ManaCost:7 B B
|
||||
Types:Sorcery
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:Count$TotalCommanderCastFromCommandZone
|
||||
A:SP$ Sacrifice | Cost$ 7 B B | Defined$ Player.Opponent | SacValid$ Creature | RememberSacrificed$ True | SubAbility$ DBRepeatEach
|
||||
SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBLoseLife | SubAbility$ DBCleanup
|
||||
|
||||
@@ -3,9 +3,8 @@ ManaCost:5 U
|
||||
Types:Sorcery
|
||||
A:SP$ ChangeZone | Cost$ 5 U | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | RememberChanged$ True | SubAbility$ TgtOpp | SpellDescription$ Exile target instant or sorcery card from your graveyard and target instant or sorcery from your opponent's graveyard. Copy those cards. Cast the copies if able without paying their mana cost.
|
||||
SVar:TgtOpp:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target instant or sorcery card in your opponent's graveyard | ValidTgts$ Instant.OppOwn,Sorcery.OppOwn | RememberChanged$ True | SubAbility$ CopyYou
|
||||
SVar:CopyYou:DB$ CopySpellAbility | Defined$ Remembered | SubAbility$ CopyOpp | CopyMultipleSpells$ 2 | SubAbility$ ExileSelf
|
||||
SVar:CopyYou:DB$ Play | Defined$ Remembered | Amount$ All | CopyCard$ True | WithoutManaCost$ True | SubAbility$ ExileSelf
|
||||
SVar:ExileSelf:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | Defined$ Self | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/spelltwine.jpg
|
||||
Oracle:Exile target instant or sorcery card from your graveyard and target instant or sorcery card from an opponent's graveyard. Copy those cards. Cast the copies if able without paying their mana costs. Exile Spelltwine.
|
||||
|
||||
@@ -3,7 +3,6 @@ ManaCost:1 U
|
||||
Types:Instant
|
||||
A:SP$ Vote | Cost$ 1 U | ValidTgts$ Instant,Sorcery | TgtZone$ Stack | TargetType$ Spell | Defined$ Player | VoteDenial$ DBDenial | VoteDuplication$ DBDuplication | Tied$ DBDuplication | VoteType$ Denial,Duplication | SpellDescription$ Will of the Council — Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter that spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy.
|
||||
SVar:DBDenial:DB$ Counter | Defined$ Targeted
|
||||
SVar:DBDuplication:DB$ CopySpellAbility | Defined$ Targeted
|
||||
SVar:DBDuplication:DB$ CopySpellAbility | Defined$ Targeted | MayChooseTarget$ True
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/split_decision.jpg
|
||||
Oracle:Will of the council — Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,5 +2,5 @@ Name:String of Disappearances
|
||||
ManaCost:U
|
||||
Types:Instant
|
||||
A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCopy | SpellDescription$ Return target creature to its owner's hand. Then that creature's controller may pay {U}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ U U | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ GE1 | StackDescription$ None
|
||||
SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ U U | UnlessSwitched$ True | ConditionDefined$ Targeted | ConditionPresent$ Permanent | ConditionCompare$ GE1 | StackDescription$ None | MayChooseTarget$ True
|
||||
Oracle:Return target creature to its owner's hand. Then that creature's controller may pay {U}{U}. If the player does, they may copy this spell and may choose a new target for that copy.
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
Name:Strionic Resonator
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
A:AB$ CopySpellAbility | Cost$ 2 T | TargetType$ Triggered.YouCtrl | ValidTgts$ Card | SpellDescription$ Copy target triggered ability you control. You may choose new targets for the copy.
|
||||
A:AB$ CopySpellAbility | Cost$ 2 T | TargetType$ Triggered.YouCtrl | ValidTgts$ Card | MayChooseTarget$ True | SpellDescription$ Copy target triggered ability you control. You may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/strionic_resonator.jpg
|
||||
Oracle:{2}, {T}: Copy target triggered ability you control. You may choose new targets for the copy. (A triggered ability uses the words "when," "whenever," or "at.")
|
||||
|
||||
@@ -2,8 +2,7 @@ Name:Swarm Intelligence
|
||||
ManaCost:6 U
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | MayChooseTarget$ True
|
||||
DeckHints:Keyword$Retrace & Keyword$Flashback
|
||||
DeckNeeds:Type$Instant|Sorcery
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/swarm_intelligence.jpg
|
||||
Oracle:Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -3,5 +3,5 @@ ManaCost:U R
|
||||
Types:Legendary Creature Human Artificer
|
||||
PT:1/3
|
||||
K:Haste
|
||||
A:AB$ CopySpellAbility | Cost$ U R T | TgtPrompt$ Select target activated or triggered ability you control from an artifact source | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ AlwaysCopyActivatedAbilities | StackDescription$ SpellDescription | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.)
|
||||
A:AB$ CopySpellAbility | Cost$ U R T | TgtPrompt$ Select target activated or triggered ability you control from an artifact source | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ AlwaysCopyActivatedAbilities | MayChooseTarget$ True | StackDescription$ SpellDescription | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.)
|
||||
Oracle:Haste\n{U}{R}, {T}: Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.)
|
||||
|
||||
@@ -6,7 +6,7 @@ SVar:DBChangeZoneI:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Vali
|
||||
SVar:DBChangeZoneII:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Sorcery.YouCtrl | SpellDescription$ Return target sorcery card from your graveyard to your hand.
|
||||
SVar:DBEffect:DB$ Effect | Name$ The Mirari Conjecture Effect | Triggers$ InstantSorceryCast | SVars$ TrigCopySpell | SpellDescription$ Until end of turn, whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy.
|
||||
SVar:InstantSorceryCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | TriggerZones$ Command | TriggerDescription$ Until end of turn, whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy.
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility
|
||||
SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
|
||||
SVar:NeedsToPlayVar:Z GE1
|
||||
SVar:Z:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Thousand-Year Storm
|
||||
ManaCost:4 U R
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X | MayChooseTarget$ True
|
||||
SVar:X:TriggerObjectsCurrentCastSpells$Valid Sorcery.YouCtrl,Instant.YouCtrl/Minus.1
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user