mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Merge branch 'ai-copy-spellability' into 'master'
AI logic for AF CopySpellAbility See merge request core-developers/forge!1144
This commit is contained in:
@@ -1390,15 +1390,28 @@ public class AiController {
|
||||
}
|
||||
|
||||
private final SpellAbility getSpellAbilityToPlay() {
|
||||
// if top of stack is owned by me
|
||||
if (!game.getStack().isEmpty() && game.getStack().peekAbility().getActivatingPlayer().equals(player)) {
|
||||
boolean canRespondToSelf = game.getStack().peekAbility().hasParam("AIRespondsToOwnAbility");
|
||||
if (!canRespondToSelf) {
|
||||
// probably should let my stuff resolve
|
||||
return null;
|
||||
final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player);
|
||||
List<SpellAbility> saList = Lists.newArrayList();
|
||||
|
||||
SpellAbility top = null;
|
||||
if (!game.getStack().isEmpty()) {
|
||||
top = game.getStack().peekAbility();
|
||||
}
|
||||
final boolean topOwnedByAI = top != null && top.getActivatingPlayer().equals(player);
|
||||
|
||||
if (topOwnedByAI) {
|
||||
// AI's own spell: should probably let my stuff resolve first, but may want to copy the SA or respond to it
|
||||
// in a scripted timed fashion.
|
||||
final boolean mustRespond = top.hasParam("AIRespondsToOwnAbility");
|
||||
|
||||
if (!mustRespond) {
|
||||
saList = ComputerUtilAbility.getSpellAbilities(cards, player); // get the SA list early to check for copy SAs
|
||||
if (ComputerUtilAbility.getFirstCopySASpell(saList) == null) {
|
||||
// Nothing to copy the spell with, so do nothing.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player);
|
||||
|
||||
if (!game.getStack().isEmpty()) {
|
||||
SpellAbility counter = chooseCounterSpell(getPlayableCounters(cards));
|
||||
@@ -1409,7 +1422,13 @@ public class AiController {
|
||||
return counterETB;
|
||||
}
|
||||
|
||||
return chooseSpellAbilityToPlayFromList(ComputerUtilAbility.getSpellAbilities(cards, player), true);
|
||||
if (saList.isEmpty()) {
|
||||
saList = ComputerUtilAbility.getSpellAbilities(cards, player);
|
||||
}
|
||||
|
||||
SpellAbility chosenSa = chooseSpellAbilityToPlayFromList(saList, true);
|
||||
|
||||
return chosenSa;
|
||||
}
|
||||
|
||||
private SpellAbility chooseSpellAbilityToPlayFromList(final List<SpellAbility> all, boolean skipCounter) {
|
||||
|
||||
@@ -69,6 +69,8 @@ public enum AiProps { /** */
|
||||
ALWAYS_COUNTER_PUMP_SPELLS ("true"), /** */
|
||||
ALWAYS_COUNTER_AURAS ("true"), /** */
|
||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS (""), /** */
|
||||
CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK ("30"), /** */
|
||||
ALWAYS_COPY_SPELL_IF_CMC_DIFF ("2"), /** */
|
||||
ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS ("true"), /** */
|
||||
ACTIVELY_DESTROY_IMMEDIATELY_UNBLOCKABLE ("false"), /** */
|
||||
DESTROY_IMMEDIATELY_UNBLOCKABLE_THRESHOLD ("2"), /** */
|
||||
|
||||
@@ -128,6 +128,17 @@ public class ComputerUtilAbility {
|
||||
return tgtSA;
|
||||
}
|
||||
|
||||
public static SpellAbility getFirstCopySASpell(List<SpellAbility> spells) {
|
||||
SpellAbility sa = null;
|
||||
for (SpellAbility spell : spells) {
|
||||
if (spell.getApi() == ApiType.CopySpellAbility) {
|
||||
sa = spell;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return sa;
|
||||
}
|
||||
|
||||
public static Card getAbilitySource(SpellAbility sa) {
|
||||
return sa.getOriginalHost() != null ? sa.getOriginalHost() : sa.getHostCard();
|
||||
}
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
package forge.ai.ability;
|
||||
|
||||
import forge.ai.SpecialCardAi;
|
||||
import forge.ai.SpellAbilityAi;
|
||||
import forge.ai.*;
|
||||
import forge.game.Game;
|
||||
import forge.game.ability.ApiType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerActionConfirmMode;
|
||||
import forge.game.spellability.AbilityActivated;
|
||||
import forge.game.spellability.Spell;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -13,8 +18,77 @@ public class CopySpellAbilityAi extends SpellAbilityAi {
|
||||
|
||||
@Override
|
||||
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
|
||||
// the AI should not miss mandatory activations (e.g. Precursor Golem trigger)
|
||||
return sa.isMandatory() || "Always".equals(sa.getParam("AILogic"));
|
||||
Game game = aiPlayer.getGame();
|
||||
int chance = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK);
|
||||
int diff = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.ALWAYS_COPY_SPELL_IF_CMC_DIFF);
|
||||
String logic = sa.getParamOrDefault("AILogic", "");
|
||||
|
||||
if (game.getStack().isEmpty()) {
|
||||
return sa.isMandatory();
|
||||
}
|
||||
|
||||
final SpellAbility top = game.getStack().peekAbility();
|
||||
if (top != null
|
||||
&& top.getPayCosts() != null && top.getPayCosts().getCostMana() != null
|
||||
&& sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null
|
||||
&& top.getPayCosts().getCostMana().getMana().getCMC() >= sa.getPayCosts().getCostMana().getMana().getCMC() + diff) {
|
||||
// The copied spell has a significantly higher CMC than the copy spell, consider copying
|
||||
chance = 100;
|
||||
}
|
||||
|
||||
if (!MyRandom.percentTrue(chance)
|
||||
&& !"AlwaysIfViable".equals(logic)
|
||||
&& !"OnceIfViable".equals(logic)
|
||||
&& !"AlwaysCopyActivatedAbilities".equals(logic)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ("OnceIfViable".equals(logic)) {
|
||||
if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final TargetRestrictions tgt = sa.getTargetRestrictions();
|
||||
if (tgt != null) {
|
||||
|
||||
// Filter AI-specific targets if provided
|
||||
if ("OnlyOwned".equals(sa.getParam("AITgts"))) {
|
||||
if (!top.getActivatingPlayer().equals(aiPlayer)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (top.isWrapper() || !(top instanceof SpellAbility || top instanceof AbilityActivated)) {
|
||||
// Should even try with triggered or wrapped abilities first, will crash
|
||||
return false;
|
||||
} else if (top.getApi() == ApiType.CopySpellAbility) {
|
||||
// Don't try to copy a copy ability, too complex for the AI to handle
|
||||
return false;
|
||||
}
|
||||
|
||||
// A copy is necessary to properly test the SA before targeting the copied spell, otherwise the copy SA will fizzle.
|
||||
final SpellAbility topCopy = top.copy(aiPlayer);
|
||||
topCopy.resetTargets();
|
||||
|
||||
if (top.canBeTargetedBy(sa)) {
|
||||
AiPlayDecision decision = AiPlayDecision.CantPlaySa;
|
||||
if (top instanceof Spell) {
|
||||
decision = ((PlayerControllerAi) aiPlayer.getController()).getAi().canPlayFromEffectAI((Spell) topCopy, true, true);
|
||||
} else if (top instanceof AbilityActivated && top.getActivatingPlayer().equals(aiPlayer)
|
||||
&& logic.contains("CopyActivatedAbilities")) {
|
||||
decision = AiPlayDecision.WillPlay; // FIXME: we activated it once, why not again? Or bad idea?
|
||||
}
|
||||
if (decision == AiPlayDecision.WillPlay) {
|
||||
sa.getTargets().add(top);
|
||||
AiCardMemory.rememberCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// the AI should not miss mandatory activations
|
||||
return sa.isMandatory() || "Always".equals(logic);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -25,15 +99,13 @@ public class CopySpellAbilityAi extends SpellAbilityAi {
|
||||
|
||||
@Override
|
||||
public boolean chkAIDrawback(final SpellAbility sa, final Player aiPlayer) {
|
||||
// NOTE: Other SAs that use CopySpellAbilityAi (e.g. Chain Lightning) are currently routed through
|
||||
// generic method SpellAbilityAi#chkDrawbackWithSubs and are handled there.
|
||||
if ("ChainOfSmog".equals(sa.getParam("AILogic"))) {
|
||||
return SpecialCardAi.ChainOfSmog.consider(aiPlayer, sa);
|
||||
} else if ("ChainOfAcid".equals(sa.getParam("AILogic"))) {
|
||||
return SpecialCardAi.ChainOfAcid.consider(aiPlayer, sa);
|
||||
}
|
||||
|
||||
return super.chkAIDrawback(sa, aiPlayer);
|
||||
return canPlayAI(aiPlayer, sa) || (sa.isMandatory() && super.chkAIDrawback(sa, aiPlayer));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- AI Improvements -
|
||||
A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, and several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do.
|
||||
A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do.
|
||||
|
||||
- Planar Conquest: Guilds of Ravnica -
|
||||
Cards from Guilds of Ravnica are now available on the Ravnica plane in Planar Conquest. Several events on this plane have been updated or changed to feature Guilds of Ravnica cards as well. Please note that Planar Conquest is currently only available on Android and the macOS mobile backport.
|
||||
|
||||
@@ -133,6 +133,12 @@ ALWAYS_COUNTER_PUMP_SPELLS=false
|
||||
ALWAYS_COUNTER_AURAS=true
|
||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||
|
||||
# Copy spell on stack logic
|
||||
# The chance that the AI will copy its own stack right after placing it there while it has priority
|
||||
CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=0
|
||||
# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100
|
||||
ALWAYS_COPY_SPELL_IF_CMC_DIFF=4
|
||||
|
||||
# Storm spell logic
|
||||
PRIORITY_REDUCTION_FOR_STORM_SPELLS=9
|
||||
MIN_COUNT_FOR_STORM_SPELLS=1
|
||||
|
||||
@@ -133,6 +133,12 @@ ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||
ALWAYS_COUNTER_AURAS=true
|
||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||
|
||||
# Copy spell on stack logic
|
||||
# The chance that the AI will copy its own stack right after placing it there while it has priority
|
||||
CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30
|
||||
# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100
|
||||
ALWAYS_COPY_SPELL_IF_CMC_DIFF=2
|
||||
|
||||
# Storm spell logic
|
||||
PRIORITY_REDUCTION_FOR_STORM_SPELLS=0
|
||||
MIN_COUNT_FOR_STORM_SPELLS=0
|
||||
|
||||
@@ -133,6 +133,12 @@ ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||
ALWAYS_COUNTER_AURAS=true
|
||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||
|
||||
# Copy spell on stack logic
|
||||
# The chance that the AI will copy its own stack right after placing it there while it has priority
|
||||
CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30
|
||||
# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100
|
||||
ALWAYS_COPY_SPELL_IF_CMC_DIFF=2
|
||||
|
||||
# Storm spell logic
|
||||
PRIORITY_REDUCTION_FOR_STORM_SPELLS=9
|
||||
MIN_COUNT_FOR_STORM_SPELLS=1
|
||||
|
||||
@@ -133,6 +133,12 @@ ALWAYS_COUNTER_PUMP_SPELLS=true
|
||||
ALWAYS_COUNTER_AURAS=true
|
||||
ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None
|
||||
|
||||
# Copy spell on stack logic
|
||||
# The chance that the AI will copy its own stack right after placing it there while it has priority
|
||||
CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=50
|
||||
# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100
|
||||
ALWAYS_COPY_SPELL_IF_CMC_DIFF=1
|
||||
|
||||
# Storm spell logic
|
||||
PRIORITY_REDUCTION_FOR_STORM_SPELLS=0
|
||||
MIN_COUNT_FOR_STORM_SPELLS=0
|
||||
|
||||
@@ -5,6 +5,5 @@ 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.
|
||||
AI:RemoveDeck:All
|
||||
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."
|
||||
|
||||
@@ -6,10 +6,9 @@ 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 | 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 | SpellDescription$ 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
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg
|
||||
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,6 +2,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.
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/fork.jpg
|
||||
Oracle:Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,6 +2,7 @@ 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 | 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.
|
||||
|
||||
@@ -3,8 +3,7 @@ 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 CARDNAME 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
|
||||
SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | AILogic$ Always
|
||||
SVar:X:Count$wasCastFromGraveyard.1.0
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/increasing_vengeance.jpg
|
||||
Oracle:Copy target instant or sorcery spell you control. If Increasing Vengeance 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.)
|
||||
|
||||
@@ -2,8 +2,7 @@ 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 | 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 | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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 | 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 | 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.
|
||||
|
||||
@@ -2,7 +2,6 @@ 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 | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
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
|
||||
Oracle:{2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Name:Mirror Sheen
|
||||
ManaCost:1 UR UR
|
||||
Types:Enchantment
|
||||
A:AB$ CopySpellAbility | Cost$ 1 UR UR | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetValidTargeting$ You | SpellDescription$ Copy target instant or sorcery spell that targets you. You may choose new targets for the copy.
|
||||
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
|
||||
Oracle:{1}{U/R}{U/R}: Copy target instant or sorcery spell that targets you. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,7 +4,7 @@ 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 | 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 | 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.
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Radiate
|
||||
ManaCost:3 R R
|
||||
Types:Instant
|
||||
A:SP$ CopySpellAbility | Cost$ 3 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetsSingleTarget$ True | TargetValidTargeting$ Permanent,Player | Controller$ You | CopyForEachCanTarget$ True | CanTargetPlayer$ True | SpellDescription$ Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players.
|
||||
AI:RemoveDeck:All
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/radiate.jpg
|
||||
Oracle:Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players.
|
||||
|
||||
@@ -3,6 +3,5 @@ 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.
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/reiterate.jpg
|
||||
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.
|
||||
|
||||
@@ -2,6 +2,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.
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberate.jpg
|
||||
Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -2,7 +2,6 @@ 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 | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
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
|
||||
Oracle:{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery 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 | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | 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 | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ AlwaysCopyActivatedAbilities | 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.)
|
||||
|
||||
@@ -2,6 +2,5 @@ Name:Twincast
|
||||
ManaCost:U U
|
||||
Types:Instant
|
||||
A:SP$ CopySpellAbility | Cost$ U U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/twincast.jpg
|
||||
Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Legendary Creature Moonfolk Wizard
|
||||
PT:4/4
|
||||
K:Flying
|
||||
A:AB$CopySpellAbility | Cost$ 2 Return<2/Land> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
AI:RemoveDeck:All
|
||||
AI:RemoveDeck:Random
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/uyo_silent_prophet.jpg
|
||||
Oracle:Flying\n{2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy.
|
||||
|
||||
Reference in New Issue
Block a user