Merge branch 'ai-copy-spellability' into 'master'

AI logic for AF CopySpellAbility

See merge request core-developers/forge!1144
This commit is contained in:
Michael Kamensky
2018-11-27 13:35:36 +00:00
26 changed files with 159 additions and 40 deletions

View File

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

View File

@@ -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"), /** */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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."

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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