From 7bb7754bb31a9c4b6f10473520b591c2786bc95e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 18 Sep 2017 17:02:55 -0400 Subject: [PATCH] Updated how spell triggers get information about the spell that triggered them. This prevents countering the spell from removing the effect of the trigger. --- Mage.Sets/src/mage/cards/b/BloodbondMarch.java | 2 +- Mage.Sets/src/mage/cards/b/BounteousKirin.java | 4 ++-- Mage.Sets/src/mage/cards/c/CelestialKirin.java | 4 ++-- .../src/mage/cards/c/ChandraTheFirebrand.java | 2 +- Mage.Sets/src/mage/cards/c/CloudhoofKirin.java | 6 +++--- Mage.Sets/src/mage/cards/c/ClovenCasting.java | 2 +- Mage.Sets/src/mage/cards/c/CurseOfEchoes.java | 4 ++-- Mage.Sets/src/mage/cards/d/Dovescape.java | 6 +----- .../src/mage/cards/e/EndrekSahrMasterBreeder.java | 6 +----- Mage.Sets/src/mage/cards/h/HiveMind.java | 8 ++------ Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java | 2 +- Mage.Sets/src/mage/cards/i/InfernalKirin.java | 8 ++++---- .../src/mage/cards/k/KaervekTheMerciless.java | 9 ++++----- .../src/mage/cards/m/MetallurgicSummonings.java | 6 +----- Mage.Sets/src/mage/cards/m/Mirari.java | 2 +- Mage.Sets/src/mage/cards/p/PrimalWellspring.java | 2 +- .../src/mage/cards/p/PyromancerAscension.java | 2 +- .../src/mage/cards/p/PyromancersGoggles.java | 2 +- Mage.Sets/src/mage/cards/r/RamosDragonEngine.java | 2 +- .../src/mage/cards/r/RikuOfTwoReflections.java | 2 +- .../src/mage/cards/s/SunbirdsInvocation.java | 8 ++------ Mage.Sets/src/mage/cards/s/SwarmIntelligence.java | 2 +- Mage.Sets/src/mage/cards/z/ZadaHedronGrinder.java | 5 +---- .../effects/common/CopyTargetSpellEffect.java | 15 ++++++++++++++- Mage/src/main/java/mage/game/Game.java | 5 +++++ Mage/src/main/java/mage/game/GameImpl.java | 14 ++++++++++++++ 26 files changed, 69 insertions(+), 61 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BloodbondMarch.java b/Mage.Sets/src/mage/cards/b/BloodbondMarch.java index da7b086ba98..de0ab798e89 100644 --- a/Mage.Sets/src/mage/cards/b/BloodbondMarch.java +++ b/Mage.Sets/src/mage/cards/b/BloodbondMarch.java @@ -85,7 +85,7 @@ public class BloodbondMarch extends CardImpl { return false; } - Spell spell = (Spell) game.getStack().getStackObject(targetPointer.getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell == null) { return false; diff --git a/Mage.Sets/src/mage/cards/b/BounteousKirin.java b/Mage.Sets/src/mage/cards/b/BounteousKirin.java index afcd8911c14..5a3ae7a8fac 100644 --- a/Mage.Sets/src/mage/cards/b/BounteousKirin.java +++ b/Mage.Sets/src/mage/cards/b/BounteousKirin.java @@ -48,7 +48,7 @@ import mage.players.Player; public class BounteousKirin extends CardImpl { public BounteousKirin(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIRIN, SubType.SPIRIT); @@ -89,7 +89,7 @@ class BounteousKirinEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getState().getStack().getSpell(getTargetPointer().getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { diff --git a/Mage.Sets/src/mage/cards/c/CelestialKirin.java b/Mage.Sets/src/mage/cards/c/CelestialKirin.java index 678da2418de..3082e74b94d 100644 --- a/Mage.Sets/src/mage/cards/c/CelestialKirin.java +++ b/Mage.Sets/src/mage/cards/c/CelestialKirin.java @@ -50,7 +50,7 @@ import mage.game.stack.Spell; public class CelestialKirin extends CardImpl { public CelestialKirin(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIRIN); this.subtype.add(SubType.SPIRIT); @@ -92,7 +92,7 @@ class CelestialKirinEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getState().getStack().getSpell(getTargetPointer().getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { int cmc = spell.getConvertedManaCost(); FilterPermanent filter = new FilterPermanent(); diff --git a/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java b/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java index e98cd3a959d..1d474d1b251 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTheFirebrand.java @@ -91,7 +91,7 @@ public class ChandraTheFirebrand extends CardImpl { class ChandraTheFirebrandAbility extends DelayedTriggeredAbility { ChandraTheFirebrandAbility() { - super(new CopyTargetSpellEffect(), Duration.EndOfTurn); + super(new CopyTargetSpellEffect(true), Duration.EndOfTurn); } ChandraTheFirebrandAbility(final ChandraTheFirebrandAbility ability) { diff --git a/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java b/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java index 8cc24f3b144..2494270a629 100644 --- a/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java +++ b/Mage.Sets/src/mage/cards/c/CloudhoofKirin.java @@ -54,7 +54,7 @@ import mage.target.TargetPlayer; public class CloudhoofKirin extends CardImpl { public CloudhoofKirin(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIRIN); this.subtype.add(SubType.SPIRIT); @@ -98,10 +98,10 @@ class CloudhoofKirinEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { Player targetPlayer = null; - for(Target target: source.getTargets()) { + for (Target target : source.getTargets()) { if (target instanceof TargetPlayer) { targetPlayer = game.getPlayer(target.getFirstTarget()); } diff --git a/Mage.Sets/src/mage/cards/c/ClovenCasting.java b/Mage.Sets/src/mage/cards/c/ClovenCasting.java index eea8864f432..107ed2c49da 100644 --- a/Mage.Sets/src/mage/cards/c/ClovenCasting.java +++ b/Mage.Sets/src/mage/cards/c/ClovenCasting.java @@ -60,7 +60,7 @@ public class ClovenCasting extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{5}{U}{R}"); // 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. - Effect effect = new CopyTargetSpellEffect(); + Effect effect = new CopyTargetSpellEffect(true); effect.setText("copy that spell. You may choose new targets for the copy"); this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(effect, new GenericManaCost(1)), filter, true, true)); } diff --git a/Mage.Sets/src/mage/cards/c/CurseOfEchoes.java b/Mage.Sets/src/mage/cards/c/CurseOfEchoes.java index b7f238deb80..96e43762b90 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfEchoes.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfEchoes.java @@ -58,7 +58,7 @@ import mage.target.targetpointer.FixedTarget; public class CurseOfEchoes extends CardImpl { public CurseOfEchoes(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}"); this.subtype.add(SubType.AURA, SubType.CURSE); // Enchant player @@ -143,7 +143,7 @@ class CurseOfEchoesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { String chooseMessage = "Copy target spell? You may choose new targets for the copy."; for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { diff --git a/Mage.Sets/src/mage/cards/d/Dovescape.java b/Mage.Sets/src/mage/cards/d/Dovescape.java index 1b97b32810c..2b8e339aa4d 100644 --- a/Mage.Sets/src/mage/cards/d/Dovescape.java +++ b/Mage.Sets/src/mage/cards/d/Dovescape.java @@ -36,7 +36,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SetTargetPointer; -import mage.constants.Zone; import mage.filter.FilterSpell; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -92,12 +91,9 @@ class DovescapeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); int spellCMC = 0; UUID spellControllerID = null; - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(this.getTargetPointer().getFirst(game, source), Zone.STACK); - } if (spell != null) { spellCMC = spell.getConvertedManaCost(); spellControllerID = spell.getControllerId(); diff --git a/Mage.Sets/src/mage/cards/e/EndrekSahrMasterBreeder.java b/Mage.Sets/src/mage/cards/e/EndrekSahrMasterBreeder.java index 8ee17fad26b..931f6885b01 100644 --- a/Mage.Sets/src/mage/cards/e/EndrekSahrMasterBreeder.java +++ b/Mage.Sets/src/mage/cards/e/EndrekSahrMasterBreeder.java @@ -43,7 +43,6 @@ import mage.filter.common.FilterCreaturePermanent; import mage.game.Game; import mage.game.permanent.token.ThrullToken; import mage.game.stack.Spell; -import mage.target.targetpointer.FixedTarget; /** * @author LevelX2 @@ -95,10 +94,7 @@ class EndrekSahrMasterBreederEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(((FixedTarget) getTargetPointer()).getTarget(), Zone.STACK); - } + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { int cmc = spell.getConvertedManaCost(); if (cmc > 0) { diff --git a/Mage.Sets/src/mage/cards/h/HiveMind.java b/Mage.Sets/src/mage/cards/h/HiveMind.java index d0694c38012..a2549bea8d0 100644 --- a/Mage.Sets/src/mage/cards/h/HiveMind.java +++ b/Mage.Sets/src/mage/cards/h/HiveMind.java @@ -50,7 +50,7 @@ import mage.target.targetpointer.FixedTarget; public class HiveMind extends CardImpl { public HiveMind(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{5}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{U}"); // Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for his or her copy. this.addAbility(new HiveMindTriggeredAbility()); @@ -125,11 +125,7 @@ class HiveMindEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell; - spell = game.getStack().getSpell(((FixedTarget) getTargetPointer()).getTarget()); - if (spell == null) { // if spell e.g. was countered - spell = (Spell) game.getLastKnownInformation(((FixedTarget) getTargetPointer()).getTarget(), Zone.STACK); - } + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); Player player = game.getPlayer(source.getControllerId()); if (spell != null && player != null) { for (UUID playerId : game.getState().getPlayersInRange(player.getId(), game)) { diff --git a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java index 5dba37f4c3c..d6e46210fa7 100644 --- a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java +++ b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java @@ -77,7 +77,7 @@ public class HowlOfTheHorde extends CardImpl { class HowlOfTheHordeDelayedTriggeredAbility extends DelayedTriggeredAbility { HowlOfTheHordeDelayedTriggeredAbility() { - super(new CopyTargetSpellEffect(), Duration.EndOfTurn); + super(new CopyTargetSpellEffect(true), Duration.EndOfTurn); } HowlOfTheHordeDelayedTriggeredAbility(final HowlOfTheHordeDelayedTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/i/InfernalKirin.java b/Mage.Sets/src/mage/cards/i/InfernalKirin.java index 90104521c5f..8ac95b840b8 100644 --- a/Mage.Sets/src/mage/cards/i/InfernalKirin.java +++ b/Mage.Sets/src/mage/cards/i/InfernalKirin.java @@ -55,7 +55,7 @@ import mage.target.TargetPlayer; public class InfernalKirin extends CardImpl { public InfernalKirin(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{B}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.KIRIN); this.subtype.add(SubType.SPIRIT); @@ -100,11 +100,11 @@ class InfernalKirinEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { int cmc = spell.getConvertedManaCost(); Player targetPlayer = null; - for(Target target: source.getTargets()) { + for (Target target : source.getTargets()) { if (target instanceof TargetPlayer) { targetPlayer = game.getPlayer(target.getFirstTarget()); } @@ -112,7 +112,7 @@ class InfernalKirinEffect extends OneShotEffect { if (targetPlayer != null) { if (!targetPlayer.getHand().isEmpty()) { targetPlayer.revealCards("Infernal Kirin", targetPlayer.getHand(), game); - for (UUID uuid: targetPlayer.getHand().copy()) { + for (UUID uuid : targetPlayer.getHand().copy()) { Card card = game.getCard(uuid); if (card != null && card.getConvertedManaCost() == cmc) { targetPlayer.discard(card, source, game); diff --git a/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java b/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java index fb626204b33..a196c1f169a 100644 --- a/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java +++ b/Mage.Sets/src/mage/cards/k/KaervekTheMerciless.java @@ -29,7 +29,6 @@ package mage.cards.k; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.effects.OneShotEffect; @@ -51,7 +50,7 @@ import mage.target.common.TargetCreatureOrPlayer; public class KaervekTheMerciless extends CardImpl { public KaervekTheMerciless(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{B}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{B}{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.SHAMAN); @@ -94,9 +93,9 @@ class KaervekTheMercilessEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject spellCast = game.getObject(getTargetPointer().getFirst(game, source)); - if (spellCast instanceof Spell) { - int cost = ((Spell) spellCast).getConvertedManaCost(); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); + if (spell != null) { + int cost = spell.getConvertedManaCost(); Player target = game.getPlayer(source.getFirstTarget()); if (target != null) { target.damage(cost, source.getSourceId(), game, false, true); diff --git a/Mage.Sets/src/mage/cards/m/MetallurgicSummonings.java b/Mage.Sets/src/mage/cards/m/MetallurgicSummonings.java index 56c3273bad4..cdd7b429e61 100644 --- a/Mage.Sets/src/mage/cards/m/MetallurgicSummonings.java +++ b/Mage.Sets/src/mage/cards/m/MetallurgicSummonings.java @@ -51,7 +51,6 @@ import mage.game.Game; import mage.game.permanent.token.MetallurgicSummoningsConstructToken; import mage.game.stack.Spell; import mage.players.Player; -import mage.target.targetpointer.FixedTarget; /** * @@ -106,10 +105,7 @@ class MetallurgicSummoningsTokenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(((FixedTarget) getTargetPointer()).getTarget(), Zone.STACK); - } + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { int cmc = spell.getConvertedManaCost(); if (cmc > 0) { diff --git a/Mage.Sets/src/mage/cards/m/Mirari.java b/Mage.Sets/src/mage/cards/m/Mirari.java index 7a657a5fd89..f9732899095 100644 --- a/Mage.Sets/src/mage/cards/m/Mirari.java +++ b/Mage.Sets/src/mage/cards/m/Mirari.java @@ -84,7 +84,7 @@ class MirariTriggeredAbility extends TriggeredAbilityImpl { } MirariTriggeredAbility() { - super(Zone.BATTLEFIELD, new DoIfCostPaid(new CopyTargetSpellEffect(), new GenericManaCost(3)), false); + super(Zone.BATTLEFIELD, new DoIfCostPaid(new CopyTargetSpellEffect(true), new GenericManaCost(3)), false); this.addTarget(new TargetSpell(filter)); } diff --git a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java b/Mage.Sets/src/mage/cards/p/PrimalWellspring.java index cbdbae5b85c..fe6bcfba62b 100644 --- a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java +++ b/Mage.Sets/src/mage/cards/p/PrimalWellspring.java @@ -59,7 +59,7 @@ public class PrimalWellspring extends CardImpl { this.addAbility(ability); // When that mana is spent to cast an instant or sorcery spell, copy that spell and you may choose new targets for the copy. - Effect effect = new CopyTargetSpellEffect(); + Effect effect = new CopyTargetSpellEffect(true); effect.setText("copy that spell and you may choose new targets for the copy"); this.addAbility(new PyrimalWellspringTriggeredAbility(ability.getOriginalId(), effect)); } diff --git a/Mage.Sets/src/mage/cards/p/PyromancerAscension.java b/Mage.Sets/src/mage/cards/p/PyromancerAscension.java index 556835d0473..21a6ac5d85e 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancerAscension.java +++ b/Mage.Sets/src/mage/cards/p/PyromancerAscension.java @@ -127,7 +127,7 @@ class PyromancerAscensionQuestTriggeredAbility extends TriggeredAbilityImpl { class PyromancerAscensionCopyTriggeredAbility extends TriggeredAbilityImpl { PyromancerAscensionCopyTriggeredAbility() { - super(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), true); + super(Zone.BATTLEFIELD, new CopyTargetSpellEffect(true), true); } PyromancerAscensionCopyTriggeredAbility(final PyromancerAscensionCopyTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java b/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java index fd658c276eb..bc8b0429891 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java @@ -62,7 +62,7 @@ public class PyromancersGoggles extends CardImpl { this.addAbility(ability); // When that mana is used to cast a red instant or sorcery spell, copy that spell and you may choose new targets for the copy. - Effect effect = new CopyTargetSpellEffect(); + Effect effect = new CopyTargetSpellEffect(true); effect.setText("copy that spell and you may choose new targets for the copy"); this.addAbility(new PyromancersGogglesTriggeredAbility(ability.getOriginalId(), effect)); diff --git a/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java b/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java index e6fc90f0e12..7453ae445f7 100644 --- a/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java +++ b/Mage.Sets/src/mage/cards/r/RamosDragonEngine.java @@ -101,7 +101,7 @@ class RamosDragonEngineAddCountersEffect extends OneShotEffect { Player you = game.getPlayer(source.getControllerId()); Permanent permanent = game.getPermanent(source.getSourceId()); if (you != null && permanent != null) { - Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell != null) { int amount = 0; if (spell.getColor(game).isWhite()) { diff --git a/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java b/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java index b9c21392346..78b85688e7f 100644 --- a/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java +++ b/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java @@ -78,7 +78,7 @@ public class RikuOfTwoReflections extends CardImpl { this.toughness = new MageInt(2); // 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. - Effect effect = new CopyTargetSpellEffect(); + Effect effect = new CopyTargetSpellEffect(true); effect.setText("copy that spell. You may choose new targets for the copy"); this.addAbility(new SpellCastControllerTriggeredAbility(new DoIfCostPaid(effect, new ManaCostsImpl("{U}{R}")), filter, false, true)); diff --git a/Mage.Sets/src/mage/cards/s/SunbirdsInvocation.java b/Mage.Sets/src/mage/cards/s/SunbirdsInvocation.java index 77e7a088f6c..0b934660f81 100644 --- a/Mage.Sets/src/mage/cards/s/SunbirdsInvocation.java +++ b/Mage.Sets/src/mage/cards/s/SunbirdsInvocation.java @@ -125,15 +125,11 @@ class SunbirdsInvocationEffect extends OneShotEffect { if (controller == null || sourceObject == null) { return false; } - Spell spell = game.getStack().getSpell(this.getTargetPointer().getFirst(game, source)); - int xValue = 0; - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(this.getTargetPointer().getFirst(game, source), Zone.STACK); - } + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); if (spell == null) { return false; } - xValue = spell.getConvertedManaCost(); + int xValue = spell.getConvertedManaCost(); Cards cards = new CardsImpl(); cards.addAll(controller.getLibrary().getTopCards(game, xValue)); if (!cards.isEmpty()) { diff --git a/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java index b6418efb89e..4c1c1064b62 100644 --- a/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java +++ b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java @@ -46,7 +46,7 @@ public class SwarmIntelligence extends CardImpl { // Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect().setText("you may copy that spell. You may choose new targets for the copy"), new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true, true)); + new CopyTargetSpellEffect(true).setText("you may copy that spell. You may choose new targets for the copy"), new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true, true)); } public SwarmIntelligence(final SwarmIntelligence card) { diff --git a/Mage.Sets/src/mage/cards/z/ZadaHedronGrinder.java b/Mage.Sets/src/mage/cards/z/ZadaHedronGrinder.java index 90ffe363c1a..d4498f3f01b 100644 --- a/Mage.Sets/src/mage/cards/z/ZadaHedronGrinder.java +++ b/Mage.Sets/src/mage/cards/z/ZadaHedronGrinder.java @@ -154,10 +154,7 @@ class ZadaHedronGrinderEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK); - } + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); if (spell != null && controller != null) { // search the target that targets source diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java index 567dac9b351..56d50b8c409 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java @@ -43,17 +43,30 @@ import mage.players.Player; */ public class CopyTargetSpellEffect extends OneShotEffect { + private boolean useLKI = false; + public CopyTargetSpellEffect() { super(Outcome.Copy); } + public CopyTargetSpellEffect(boolean useLKI) { + super(Outcome.Copy); + this.useLKI = useLKI; + } + public CopyTargetSpellEffect(final CopyTargetSpellEffect effect) { super(effect); + this.useLKI = effect.useLKI; } @Override public boolean apply(Game game, Ability source) { - Spell spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + Spell spell; + if (useLKI) { + spell = game.getSpellOrLKIStack(targetPointer.getFirst(game, source)); + } else { + spell = game.getStack().getSpell(targetPointer.getFirst(game, source)); + } if (spell == null) { spell = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK); } diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 9ac4302df8e..044e6a3ae79 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -57,6 +57,7 @@ import mage.game.match.MatchType; import mage.game.permanent.Battlefield; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; +import mage.game.stack.Spell; import mage.game.stack.SpellStack; import mage.game.turn.Phase; import mage.game.turn.Step; @@ -106,6 +107,10 @@ public interface Game extends MageItem, Serializable { UUID getOwnerId(MageObject object); + Spell getSpell(UUID spellId); + + Spell getSpellOrLKIStack(UUID spellId); + Permanent getPermanent(UUID permanentId); Permanent getPermanentOrLKIBattlefield(UUID permanentId); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index b1856a43dc8..bf310a6d29c 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -445,6 +445,20 @@ public abstract class GameImpl implements Game, Serializable { return null; } + @Override + public Spell getSpell(UUID spellId) { + return state.getStack().getSpell(spellId); + } + + @Override + public Spell getSpellOrLKIStack(UUID spellId) { + Spell spell = state.getStack().getSpell(spellId); + if (spell == null) { + spell = (Spell) this.getLastKnownInformation(spellId, Zone.STACK); + } + return spell; + } + @Override public Permanent getPermanent(UUID permanentId) { return state.getPermanent(permanentId);