From fa728eafb1c0bf1627fbcb563b96f3560a4c76e4 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Sat, 4 May 2024 00:47:16 -0400 Subject: [PATCH] refactor: Cleanup CopyTargetStackObjectEffect (#12220) * simplify constructors * rename class * adjust to accommodate any stack object * adjust all usages to main common class --- .../src/mage/cards/a/AbstruseArchaic.java | 4 +- .../mage/cards/a/AdricMathematicalGenius.java | 4 +- .../src/mage/cards/a/ArchmageOfEchoes.java | 4 +- Mage.Sets/src/mage/cards/b/BonusRound.java | 7 +-- .../mage/cards/c/CaseOfTheShiftingVisage.java | 4 +- .../src/mage/cards/c/ChancellorOfTales.java | 4 +- .../src/mage/cards/c/ChandraHopesBeacon.java | 4 +- Mage.Sets/src/mage/cards/c/ClovenCasting.java | 4 +- Mage.Sets/src/mage/cards/d/DoubleDown.java | 4 +- Mage.Sets/src/mage/cards/d/DoubleMajor.java | 6 +- Mage.Sets/src/mage/cards/d/DoubleVision.java | 4 +- .../mage/cards/d/DrafnaFounderOfLatNam.java | 4 +- Mage.Sets/src/mage/cards/d/DualCasting.java | 4 +- .../src/mage/cards/d/DualcasterMage.java | 4 +- Mage.Sets/src/mage/cards/e/EchoMage.java | 4 +- .../src/mage/cards/e/ErrantStreetArtist.java | 6 +- .../src/mage/cards/e/ExpansionExplosion.java | 4 +- .../mage/cards/f/FerocityOfTheUnderworld.java | 4 +- Mage.Sets/src/mage/cards/f/FuryStorm.java | 4 +- .../src/mage/cards/g/GandalfTheGrey.java | 4 +- Mage.Sets/src/mage/cards/g/Geistblast.java | 4 +- .../src/mage/cards/g/GorionWiseMentor.java | 4 +- .../src/mage/cards/h/HowlOfTheHorde.java | 5 +- Mage.Sets/src/mage/cards/i/InsidiousWill.java | 4 +- .../src/mage/cards/i/IzzetGuildmage.java | 6 +- .../src/mage/cards/j/JaceReawakened.java | 4 +- Mage.Sets/src/mage/cards/j/JayasPhoenix.java | 6 +- .../cards/j/JinGitaxiasProgressTyrant.java | 4 +- .../src/mage/cards/k/KalamaxTheStormsire.java | 4 +- .../src/mage/cards/l/LeagueGuildmage.java | 4 +- .../src/mage/cards/l/LithoformEngine.java | 9 ++- Mage.Sets/src/mage/cards/l/LuckyClover.java | 4 +- .../src/mage/cards/l/LutriTheSpellchaser.java | 4 +- .../src/mage/cards/m/MelekIzzetParagon.java | 4 +- Mage.Sets/src/mage/cards/m/Mirari.java | 4 +- Mage.Sets/src/mage/cards/m/MirrorSheen.java | 4 +- Mage.Sets/src/mage/cards/m/Mirrorpool.java | 4 +- .../src/mage/cards/m/MischievousQuanar.java | 4 +- .../mage/cards/m/MyojinOfCrypticDreams.java | 8 +-- .../src/mage/cards/n/NarsetsReversal.java | 4 +- .../mage/cards/n/NaruMehaMasterWizard.java | 4 +- .../src/mage/cards/n/NivixGuildmage.java | 4 +- Mage.Sets/src/mage/cards/o/OddsEnds.java | 4 +- .../src/mage/cards/o/OverloadedMageRing.java | 4 +- .../src/mage/cards/p/PrimalWellspring.java | 4 +- .../src/mage/cards/p/PyromancerAscension.java | 4 +- .../src/mage/cards/p/PyromancersGoggles.java | 4 +- .../mage/cards/r/ReflectionsOfLittjara.java | 4 +- .../src/mage/cards/r/ReflectiveGolem.java | 4 +- .../src/mage/cards/r/RefuseCooperate.java | 4 +- Mage.Sets/src/mage/cards/r/Reiterate.java | 4 +- .../mage/cards/r/RepeatedReverberation.java | 6 +- .../src/mage/cards/r/ReturnTheFavor.java | 4 +- Mage.Sets/src/mage/cards/r/Reverberate.java | 4 +- .../mage/cards/r/RikuOfTwoReflections.java | 4 +- .../mage/cards/r/RoothaMercurialArtist.java | 4 +- .../src/mage/cards/s/SeaGateStormcaller.java | 6 +- Mage.Sets/src/mage/cards/s/SeeDouble.java | 4 +- .../mage/cards/s/SevinneTheChronoclasm.java | 4 +- Mage.Sets/src/mage/cards/s/SigilTracer.java | 4 +- .../mage/cards/s/SimonWildMagicSorcerer.java | 4 +- Mage.Sets/src/mage/cards/s/SplitDecision.java | 4 +- .../src/mage/cards/s/StellaLeeWildCard.java | 4 +- .../src/mage/cards/s/StormOfSaruman.java | 4 +- .../src/mage/cards/s/StrionicResonator.java | 4 +- .../src/mage/cards/s/SwarmIntelligence.java | 4 +- .../mage/cards/t/TawnosUrzasApprentice.java | 13 ++--- .../src/mage/cards/t/TheMirariConjecture.java | 4 +- .../src/mage/cards/t/ThePeregrineDynamo.java | 4 +- .../src/mage/cards/t/TheSixthDoctor.java | 4 +- Mage.Sets/src/mage/cards/t/Twincast.java | 4 +- Mage.Sets/src/mage/cards/t/TwinningStaff.java | 6 +- .../src/mage/cards/u/UyoSilentProphet.java | 4 +- .../mage/cards/v/VerazolTheSplitCurrent.java | 4 +- .../src/mage/cards/v/VirtueOfKnowledge.java | 4 +- .../src/mage/cards/v/VoloGuideToMonsters.java | 4 +- .../src/mage/cards/w/WeaverOfHarmony.java | 4 +- Mage.Sets/src/mage/cards/w/WildRicochet.java | 4 +- .../cards/copy/CopyPermanentSpellTest.java | 4 +- .../CopyNextSpellDelayedTriggeredAbility.java | 4 +- .../common/CopyTargetStackAbilityEffect.java | 47 --------------- ....java => CopyTargetStackObjectEffect.java} | 58 ++++++++----------- .../emblems/RowanScholarOfSparksEmblem.java | 4 +- .../command/emblems/WillKenrithEmblem.java | 4 +- 84 files changed, 204 insertions(+), 265 deletions(-) delete mode 100644 Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackAbilityEffect.java rename Mage/src/main/java/mage/abilities/effects/common/{CopyTargetSpellEffect.java => CopyTargetStackObjectEffect.java} (57%) diff --git a/Mage.Sets/src/mage/cards/a/AbstruseArchaic.java b/Mage.Sets/src/mage/cards/a/AbstruseArchaic.java index 794c7e65811..9bccfe64951 100644 --- a/Mage.Sets/src/mage/cards/a/AbstruseArchaic.java +++ b/Mage.Sets/src/mage/cards/a/AbstruseArchaic.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -45,7 +45,7 @@ public final class AbstruseArchaic extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // {1}, {T}: Copy target activated or triggered ability you control from a colorless source. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new GenericManaCost(1)); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/a/AdricMathematicalGenius.java b/Mage.Sets/src/mage/cards/a/AdricMathematicalGenius.java index 9ec57445d92..618b59a641f 100644 --- a/Mage.Sets/src/mage/cards/a/AdricMathematicalGenius.java +++ b/Mage.Sets/src/mage/cards/a/AdricMathematicalGenius.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.keyword.DoctorsCompanionAbility; import mage.cards.CardImpl; @@ -42,7 +42,7 @@ public final class AdricMathematicalGenius extends CardImpl { this.toughness = new MageInt(1); // {2}{U}, {T}: Copy target activated or triggered ability you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new ManaCostsImpl<>("{2}{U}")); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/a/ArchmageOfEchoes.java b/Mage.Sets/src/mage/cards/a/ArchmageOfEchoes.java index 60211eca07a..af875a038fe 100644 --- a/Mage.Sets/src/mage/cards/a/ArchmageOfEchoes.java +++ b/Mage.Sets/src/mage/cards/a/ArchmageOfEchoes.java @@ -9,7 +9,7 @@ import mage.filter.predicate.mageobject.PermanentPredicate; import mage.abilities.keyword.FlyingAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.WardAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -45,7 +45,7 @@ public final class ArchmageOfEchoes extends CardImpl { // Whenever you cast a Faerie or Wizard permanent spell, copy it. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(false, false, false).setText("copy it"), + new CopyTargetStackObjectEffect(false, false, false).setText("copy it"), filter, false, SetTargetPointer.SPELL)); } diff --git a/Mage.Sets/src/mage/cards/b/BonusRound.java b/Mage.Sets/src/mage/cards/b/BonusRound.java index f48e749130d..fcd1c16257e 100644 --- a/Mage.Sets/src/mage/cards/b/BonusRound.java +++ b/Mage.Sets/src/mage/cards/b/BonusRound.java @@ -1,9 +1,8 @@ - package mage.cards.b; import java.util.UUID; import mage.abilities.DelayedTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -39,8 +38,8 @@ public final class BonusRound extends CardImpl { class BonusRoundDelayedTriggeredAbility extends DelayedTriggeredAbility { - public BonusRoundDelayedTriggeredAbility() { - super(new CopyTargetSpellEffect(true, true), Duration.EndOfTurn, false); + BonusRoundDelayedTriggeredAbility() { + super(new CopyTargetStackObjectEffect(true, true, true), Duration.EndOfTurn, false); } private BonusRoundDelayedTriggeredAbility(final BonusRoundDelayedTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/c/CaseOfTheShiftingVisage.java b/Mage.Sets/src/mage/cards/c/CaseOfTheShiftingVisage.java index 29300aa33ae..4fed440cd80 100644 --- a/Mage.Sets/src/mage/cards/c/CaseOfTheShiftingVisage.java +++ b/Mage.Sets/src/mage/cards/c/CaseOfTheShiftingVisage.java @@ -8,7 +8,7 @@ import mage.abilities.condition.Condition; import mage.abilities.condition.common.CardsInControllerGraveyardCondition; import mage.abilities.condition.common.SolvedSourceCondition; import mage.abilities.decorator.ConditionalTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.keyword.SurveilEffect; import mage.abilities.hint.common.CaseSolvedHint; import mage.cards.CardImpl; @@ -43,7 +43,7 @@ public final class CaseOfTheShiftingVisage extends CardImpl { Condition toSolveCondition = new CardsInControllerGraveyardCondition(15); // Solved — Whenever you cast a nonlegendary creature spell, copy that spell. Ability solvedAbility = new ConditionalTriggeredAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true).setText("copy that spell. (The copy becomes a token.)"), filter, false, SetTargetPointer.SPELL + new CopyTargetStackObjectEffect(true).setText("copy that spell. (The copy becomes a token.)"), filter, false, SetTargetPointer.SPELL ), SolvedSourceCondition.SOLVED, null); this.addAbility(new CaseAbility(initialAbility, toSolveCondition, solvedAbility) diff --git a/Mage.Sets/src/mage/cards/c/ChancellorOfTales.java b/Mage.Sets/src/mage/cards/c/ChancellorOfTales.java index 1a939eee562..5ddf8b78db2 100644 --- a/Mage.Sets/src/mage/cards/c/ChancellorOfTales.java +++ b/Mage.Sets/src/mage/cards/c/ChancellorOfTales.java @@ -2,7 +2,7 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -38,7 +38,7 @@ public final class ChancellorOfTales extends CardImpl { // Whenever you cast an Adventure spell, you may copy it. You may choose new targets for the copy. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true).withSpellName("it"), + new CopyTargetStackObjectEffect(true).withText("it"), filter, true, SetTargetPointer.SPELL )); } diff --git a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java index a0f0c5b3930..b39e87ccc9c 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java +++ b/Mage.Sets/src/mage/cards/c/ChandraHopesBeacon.java @@ -8,7 +8,7 @@ import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.dynamicvalue.common.GetXLoyaltyValue; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.mana.AddManaInAnyCombinationEffect; import mage.cards.CardImpl; @@ -38,7 +38,7 @@ public class ChandraHopesBeacon extends CardImpl { //Whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. This ability //triggers only once each turn. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true).withSpellName("it"), + new CopyTargetStackObjectEffect(true).withText("it"), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, SetTargetPointer.SPELL ).setTriggersOnceEachTurn(true)); diff --git a/Mage.Sets/src/mage/cards/c/ClovenCasting.java b/Mage.Sets/src/mage/cards/c/ClovenCasting.java index ddafa69f160..cebd5989067 100644 --- a/Mage.Sets/src/mage/cards/c/ClovenCasting.java +++ b/Mage.Sets/src/mage/cards/c/ClovenCasting.java @@ -3,7 +3,7 @@ package mage.cards.c; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -33,7 +33,7 @@ public final 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(true); + Effect effect = new CopyTargetStackObjectEffect(true); effect.setText("copy that spell. You may choose new targets for the copy"); this.addAbility(new SpellCastControllerTriggeredAbility( new DoIfCostPaid(effect, new GenericManaCost(1)), diff --git a/Mage.Sets/src/mage/cards/d/DoubleDown.java b/Mage.Sets/src/mage/cards/d/DoubleDown.java index 792d7f77b12..a705e9926a1 100644 --- a/Mage.Sets/src/mage/cards/d/DoubleDown.java +++ b/Mage.Sets/src/mage/cards/d/DoubleDown.java @@ -1,7 +1,7 @@ package mage.cards.d; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -27,7 +27,7 @@ public final class DoubleDown extends CardImpl { // Whenever you cast an outlaw spell, copy that spell. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(false, false, false), + new CopyTargetStackObjectEffect(false, false, false), filter, false, SetTargetPointer.SPELL )); } diff --git a/Mage.Sets/src/mage/cards/d/DoubleMajor.java b/Mage.Sets/src/mage/cards/d/DoubleMajor.java index f204639a97f..7c9dedd79d3 100644 --- a/Mage.Sets/src/mage/cards/d/DoubleMajor.java +++ b/Mage.Sets/src/mage/cards/d/DoubleMajor.java @@ -1,6 +1,6 @@ package mage.cards.d; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -29,7 +29,7 @@ public final class DoubleMajor extends CardImpl { // Copy target creature spell you control, except it isn't legendary if the spell is legendary. this.getSpellAbility().addEffect( - new CopyTargetSpellEffect(false, false, false, 1, new RemoveTypeCopyApplier(SuperType.LEGENDARY)) + new CopyTargetStackObjectEffect(false, false, false, 1, new RemoveTypeCopyApplier(SuperType.LEGENDARY)) .setText( "Copy target creature spell you control, except it isn't legendary if the spell is legendary.")); this.getSpellAbility().addTarget(new TargetSpell(filter)); @@ -43,4 +43,4 @@ public final class DoubleMajor extends CardImpl { public DoubleMajor copy() { return new DoubleMajor(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/d/DoubleVision.java b/Mage.Sets/src/mage/cards/d/DoubleVision.java index 5d77500d33e..18a85df3264 100644 --- a/Mage.Sets/src/mage/cards/d/DoubleVision.java +++ b/Mage.Sets/src/mage/cards/d/DoubleVision.java @@ -1,7 +1,7 @@ package mage.cards.d; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -41,7 +41,7 @@ public final class DoubleVision extends CardImpl { class DoubleVisionCopyTriggeredAbility extends SpellCastControllerTriggeredAbility { DoubleVisionCopyTriggeredAbility() { - super(new CopyTargetSpellEffect(true), new FilterInstantOrSorcerySpell(), false); + super(new CopyTargetStackObjectEffect(true), new FilterInstantOrSorcerySpell(), false); } private DoubleVisionCopyTriggeredAbility(final DoubleVisionCopyTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/d/DrafnaFounderOfLatNam.java b/Mage.Sets/src/mage/cards/d/DrafnaFounderOfLatNam.java index 88a152b96e8..0468bbfe187 100644 --- a/Mage.Sets/src/mage/cards/d/DrafnaFounderOfLatNam.java +++ b/Mage.Sets/src/mage/cards/d/DrafnaFounderOfLatNam.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -49,7 +49,7 @@ public final class DrafnaFounderOfLatNam extends CardImpl { this.addAbility(ability); // {3}, {T}: Copy target artifact spell you control. - ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(false, false, false), new GenericManaCost(3)); + ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(false, false, false), new GenericManaCost(3)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/d/DualCasting.java b/Mage.Sets/src/mage/cards/d/DualCasting.java index 4b42a45c091..8c0092a0d5c 100644 --- a/Mage.Sets/src/mage/cards/d/DualCasting.java +++ b/Mage.Sets/src/mage/cards/d/DualCasting.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; @@ -46,7 +46,7 @@ public final class DualCasting extends CardImpl { Ability ability = new EnchantAbility(auraTarget); this.addAbility(ability); // Enchanted creature has "{R}, {tap}: Copy target instant or sorcery spell you control. You may choose new targets for the copy." - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ColoredManaCost(ColoredManaSymbol.R)); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ColoredManaCost(ColoredManaSymbol.R)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(ability, AttachmentType.AURA))); diff --git a/Mage.Sets/src/mage/cards/d/DualcasterMage.java b/Mage.Sets/src/mage/cards/d/DualcasterMage.java index 5df38d3ea4a..0f08ac7a83c 100644 --- a/Mage.Sets/src/mage/cards/d/DualcasterMage.java +++ b/Mage.Sets/src/mage/cards/d/DualcasterMage.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -32,7 +32,7 @@ public final class DualcasterMage extends CardImpl { this.addAbility(FlashAbility.getInstance()); // When Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy. - Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetSpellEffect(), false); + Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetStackObjectEffect(), false); ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/e/EchoMage.java b/Mage.Sets/src/mage/cards/e/EchoMage.java index 4f0450aebb6..5c8751e48de 100644 --- a/Mage.Sets/src/mage/cards/e/EchoMage.java +++ b/Mage.Sets/src/mage/cards/e/EchoMage.java @@ -9,7 +9,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.LevelUpAbility; import mage.abilities.keyword.LevelerCardBuilder; import mage.cards.CardSetInfo; @@ -45,7 +45,7 @@ public final class EchoMage extends LevelerCard { // 2/4 // {U}{U}, {tap}: Copy target instant or sorcery spell. You may choose new targets for the copy. Abilities abilities1 = new AbilitiesImpl<>(); - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{U}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{U}{U}")); ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); ability.addCost(new TapSourceCost()); abilities1.add(ability); diff --git a/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java b/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java index ad2dfd2f950..c1b36be0978 100644 --- a/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java +++ b/Mage.Sets/src/mage/cards/e/ErrantStreetArtist.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlashAbility; import mage.abilities.keyword.HasteAbility; @@ -54,7 +54,7 @@ public final class ErrantStreetArtist extends CardImpl { this.addAbility(HasteAbility.getInstance()); // {1}{U}, {T}: Copy target spell you control that wasn't cast. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(), new ManaCostsImpl<>("{1}{U}")); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{1}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); @@ -77,4 +77,4 @@ enum ErrantStreetArtistPredicate implements Predicate { public boolean apply(StackObject input, Game game) { return input.isCopy(); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java index 0ced362fc26..44cf4307951 100644 --- a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java +++ b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardSetInfo; import mage.cards.SplitCard; @@ -41,7 +41,7 @@ public final class ExpansionExplosion extends SplitCard { // Expansion // Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy. - this.getLeftHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getLeftHalfCard().getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell(filter)); // Explosion diff --git a/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java b/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java index 857805637f9..694eebb77ad 100644 --- a/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java +++ b/Mage.Sets/src/mage/cards/f/FerocityOfTheUnderworld.java @@ -3,7 +3,7 @@ package mage.cards.f; import java.util.UUID; import mage.abilities.Mode; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; @@ -37,7 +37,7 @@ public final class FerocityOfTheUnderworld extends CardImpl { this.getSpellAbility().addTarget(new TargetNonlandPermanent(filterMode1)); // Copy target instant or sorcery spell. You may choose new targets for the copy. - Mode mode = new Mode(new CopyTargetSpellEffect()); + Mode mode = new Mode(new CopyTargetStackObjectEffect()); mode.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); this.getSpellAbility().addMode(mode); diff --git a/Mage.Sets/src/mage/cards/f/FuryStorm.java b/Mage.Sets/src/mage/cards/f/FuryStorm.java index c58c0369752..eef623e689e 100644 --- a/Mage.Sets/src/mage/cards/f/FuryStorm.java +++ b/Mage.Sets/src/mage/cards/f/FuryStorm.java @@ -1,7 +1,7 @@ package mage.cards.f; import java.util.UUID; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.CommanderStormAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -22,7 +22,7 @@ public final class FuryStorm extends CardImpl { this.addAbility(new CommanderStormAbility()); // Copy target instant or sorcery spell. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); } diff --git a/Mage.Sets/src/mage/cards/g/GandalfTheGrey.java b/Mage.Sets/src/mage/cards/g/GandalfTheGrey.java index 663a4dff2a1..33c02dcdb94 100644 --- a/Mage.Sets/src/mage/cards/g/GandalfTheGrey.java +++ b/Mage.Sets/src/mage/cards/g/GandalfTheGrey.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DamagePlayersEffect; import mage.abilities.effects.common.MayTapOrUntapTargetEffect; import mage.abilities.effects.common.PutOnLibrarySourceEffect; @@ -61,7 +61,7 @@ public final class GandalfTheGrey extends CardImpl { // * Copy target instant or sorcery spell you control. You may choose new targets for the copy. ability.addMode( - new Mode(new CopyTargetSpellEffect()).addTarget(new TargetSpell(filter)) + new Mode(new CopyTargetStackObjectEffect()).addTarget(new TargetSpell(filter)) .setModeTag("copy spell") ); diff --git a/Mage.Sets/src/mage/cards/g/Geistblast.java b/Mage.Sets/src/mage/cards/g/Geistblast.java index 0d9bb2c7732..663eab7b37c 100644 --- a/Mage.Sets/src/mage/cards/g/Geistblast.java +++ b/Mage.Sets/src/mage/cards/g/Geistblast.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ExileSourceFromGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -41,7 +41,7 @@ public final class Geistblast extends CardImpl { this.getSpellAbility().addTarget(new TargetAnyTarget()); // {2}{U}, Exile Geistblast from your graveyard: Copy target instant or sorcery you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.GRAVEYARD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{U}")); ability.addTarget(new TargetSpell(filter)); ability.addCost(new ExileSourceFromGraveCost()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java b/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java index eed0b8510ed..cf0c5e1d95a 100644 --- a/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java +++ b/Mage.Sets/src/mage/cards/g/GorionWiseMentor.java @@ -2,7 +2,7 @@ package mage.cards.g; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -40,7 +40,7 @@ public final class GorionWiseMentor extends CardImpl { // Whenever you cast an Adventure spell, you may copy it. You may choose new targets for the copy. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true).withSpellName("it"), + new CopyTargetStackObjectEffect(true).withText("it"), filter, true, SetTargetPointer.SPELL )); } diff --git a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java index 76994b9c69f..5bb35f63aa1 100644 --- a/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java +++ b/Mage.Sets/src/mage/cards/h/HowlOfTheHorde.java @@ -4,12 +4,11 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.condition.common.RaidCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.hint.common.RaidHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AbilityWord; import mage.constants.CardType; import mage.constants.Duration; import mage.game.Game; @@ -57,7 +56,7 @@ public final class HowlOfTheHorde extends CardImpl { class HowlOfTheHordeDelayedTriggeredAbility extends DelayedTriggeredAbility { HowlOfTheHordeDelayedTriggeredAbility() { - super(new CopyTargetSpellEffect(true), Duration.EndOfTurn); + super(new CopyTargetStackObjectEffect(true), Duration.EndOfTurn); } private HowlOfTheHordeDelayedTriggeredAbility(final HowlOfTheHordeDelayedTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/i/InsidiousWill.java b/Mage.Sets/src/mage/cards/i/InsidiousWill.java index b80eb11e458..8b2c5824561 100644 --- a/Mage.Sets/src/mage/cards/i/InsidiousWill.java +++ b/Mage.Sets/src/mage/cards/i/InsidiousWill.java @@ -4,7 +4,7 @@ package mage.cards.i; import java.util.UUID; import mage.abilities.Mode; import mage.abilities.effects.common.ChooseNewTargetsTargetEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CounterTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -35,7 +35,7 @@ public final class InsidiousWill extends CardImpl { this.getSpellAbility().addMode(mode); // Copy target instant or sorcery spell. You may choose new targets for the copy. - mode = new Mode(new CopyTargetSpellEffect()); + mode = new Mode(new CopyTargetStackObjectEffect()); mode.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); this.getSpellAbility().getModes().addMode(mode); } diff --git a/Mage.Sets/src/mage/cards/i/IzzetGuildmage.java b/Mage.Sets/src/mage/cards/i/IzzetGuildmage.java index a807f3f0f58..668accf8ab7 100644 --- a/Mage.Sets/src/mage/cards/i/IzzetGuildmage.java +++ b/Mage.Sets/src/mage/cards/i/IzzetGuildmage.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -46,12 +46,12 @@ public final class IzzetGuildmage extends CardImpl { // ({UR} can be paid with either {U} or {R}.) // {2}{U}: Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{U}")); ability.addTarget(new TargetSpell(filterInstant)); this.addAbility(ability); // {2}{R}: Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. - ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{R}")); + ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{R}")); ability.addTarget(new TargetSpell(filterSorcery)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/j/JaceReawakened.java b/Mage.Sets/src/mage/cards/j/JaceReawakened.java index c77ae896001..becdbb91226 100644 --- a/Mage.Sets/src/mage/cards/j/JaceReawakened.java +++ b/Mage.Sets/src/mage/cards/j/JaceReawakened.java @@ -5,7 +5,7 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.abilities.effects.common.MayExileCardFromHandPlottedEffect; @@ -109,7 +109,7 @@ class CantCastJaceReawakenedEffect extends ContinuousRuleModifyingEffectImpl { class JaceReawakenedDelayedTriggeredAbility extends DelayedTriggeredAbility { JaceReawakenedDelayedTriggeredAbility() { - super(new CopyTargetSpellEffect(true), Duration.EndOfTurn, false); + super(new CopyTargetStackObjectEffect(true), Duration.EndOfTurn, false); } private JaceReawakenedDelayedTriggeredAbility(final JaceReawakenedDelayedTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/j/JayasPhoenix.java b/Mage.Sets/src/mage/cards/j/JayasPhoenix.java index 099876add2d..2836072ee55 100644 --- a/Mage.Sets/src/mage/cards/j/JayasPhoenix.java +++ b/Mage.Sets/src/mage/cards/j/JayasPhoenix.java @@ -5,7 +5,7 @@ import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.common.DealsCombatDamageToAPlayerOrPlaneswalkerTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect; import mage.abilities.keyword.FlyingAbility; @@ -72,8 +72,8 @@ public final class JayasPhoenix extends CardImpl { class JayasPhoenixTriggeredAbility extends DelayedTriggeredAbility { - public JayasPhoenixTriggeredAbility() { - super(new CopyTargetStackAbilityEffect(), Duration.EndOfTurn); + JayasPhoenixTriggeredAbility() { + super(new CopyTargetStackObjectEffect(), Duration.EndOfTurn); } private JayasPhoenixTriggeredAbility(final JayasPhoenixTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java b/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java index 0762aa84f18..f79be07b680 100644 --- a/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java +++ b/Mage.Sets/src/mage/cards/j/JinGitaxiasProgressTyrant.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -42,7 +42,7 @@ public final class JinGitaxiasProgressTyrant extends CardImpl { // Whenever you cast an artifact, instant, or sorcery spell, copy that spell. You may choose new targets for the copy. This ability triggers only once each turn. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect().setText("copy that spell. You may choose new targets for the copy"), + new CopyTargetStackObjectEffect().setText("copy that spell. You may choose new targets for the copy"), filter, false, SetTargetPointer.SPELL ).setTriggersOnceEachTurn(true)); diff --git a/Mage.Sets/src/mage/cards/k/KalamaxTheStormsire.java b/Mage.Sets/src/mage/cards/k/KalamaxTheStormsire.java index 5cc7f93a6b6..6cec34514c2 100644 --- a/Mage.Sets/src/mage/cards/k/KalamaxTheStormsire.java +++ b/Mage.Sets/src/mage/cards/k/KalamaxTheStormsire.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -56,7 +56,7 @@ public final class KalamaxTheStormsire extends CardImpl { class KalamaxTheStormsireSpellCastAbility extends SpellCastControllerTriggeredAbility { KalamaxTheStormsireSpellCastAbility() { - super(new CopyTargetSpellEffect(true), new FilterInstantSpell(), false); + super(new CopyTargetStackObjectEffect(true), new FilterInstantSpell(), false); } private KalamaxTheStormsireSpellCastAbility(final KalamaxTheStormsireSpellCastAbility ability) { diff --git a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java index 67cb99ea095..8c9aa94e087 100644 --- a/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java +++ b/Mage.Sets/src/mage/cards/l/LeagueGuildmage.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -49,7 +49,7 @@ public final class LeagueGuildmage extends CardImpl { // {X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. ability = new SimpleActivatedAbility( - new CopyTargetSpellEffect(), + new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{X}{R}") ); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/l/LithoformEngine.java b/Mage.Sets/src/mage/cards/l/LithoformEngine.java index 360678d4fb8..3c7fa90783a 100644 --- a/Mage.Sets/src/mage/cards/l/LithoformEngine.java +++ b/Mage.Sets/src/mage/cards/l/LithoformEngine.java @@ -4,8 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -45,19 +44,19 @@ public final class LithoformEngine extends CardImpl { this.supertype.add(SuperType.LEGENDARY); // {2}, {T}: Copy target activated or triggered ability you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new GenericManaCost(2)); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(2)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.addAbility(ability); // {3}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy. - ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(), new GenericManaCost(3)); + ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(3)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter2)); this.addAbility(ability); // {4}, {T}: Copy target permanent spell you control. - ability = new SimpleActivatedAbility(new CopyTargetSpellEffect( + ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect( false, false, false ), new GenericManaCost(4)); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/l/LuckyClover.java b/Mage.Sets/src/mage/cards/l/LuckyClover.java index 993ed90bfe5..78c05cf4416 100644 --- a/Mage.Sets/src/mage/cards/l/LuckyClover.java +++ b/Mage.Sets/src/mage/cards/l/LuckyClover.java @@ -1,7 +1,7 @@ package mage.cards.l; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -29,7 +29,7 @@ public final class LuckyClover extends CardImpl { // Whenever you cast an Adventure instant or sorcery spell, copy it. You may choose new targets for the copy. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true).withSpellName("it"), + new CopyTargetStackObjectEffect(true).withText("it"), filter, false, SetTargetPointer.SPELL )); } diff --git a/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java b/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java index d8d2ec7bfe6..6a58d0b00a5 100644 --- a/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java +++ b/Mage.Sets/src/mage/cards/l/LutriTheSpellchaser.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.CastFromEverywhereSourceCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.CompanionAbility; import mage.abilities.keyword.CompanionCondition; import mage.abilities.keyword.FlashAbility; @@ -55,7 +55,7 @@ public final class LutriTheSpellchaser extends CardImpl { // When 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. Ability ability = new ConditionalInterveningIfTriggeredAbility( - new EntersBattlefieldTriggeredAbility(new CopyTargetSpellEffect(), false), + new EntersBattlefieldTriggeredAbility(new CopyTargetStackObjectEffect(), false), CastFromEverywhereSourceCondition.instance, "When {this} enters the battlefield, " + "if you cast it, copy target instant or sorcery spell you control. " + "You may choose new targets for the copy." diff --git a/Mage.Sets/src/mage/cards/m/MelekIzzetParagon.java b/Mage.Sets/src/mage/cards/m/MelekIzzetParagon.java index a98f111a506..51395a1c26c 100644 --- a/Mage.Sets/src/mage/cards/m/MelekIzzetParagon.java +++ b/Mage.Sets/src/mage/cards/m/MelekIzzetParagon.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.continuous.PlayFromTopOfLibraryEffect; import mage.abilities.effects.common.continuous.PlayWithTheTopCardRevealedEffect; import mage.cards.CardImpl; @@ -65,7 +65,7 @@ public final class MelekIzzetParagon extends CardImpl { class MelekIzzetParagonTriggeredAbility extends TriggeredAbilityImpl { public MelekIzzetParagonTriggeredAbility() { - super(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), false); + super(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), false); } private MelekIzzetParagonTriggeredAbility(final MelekIzzetParagonTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/m/Mirari.java b/Mage.Sets/src/mage/cards/m/Mirari.java index deaaa52c60e..5d7f14f0cbc 100644 --- a/Mage.Sets/src/mage/cards/m/Mirari.java +++ b/Mage.Sets/src/mage/cards/m/Mirari.java @@ -2,7 +2,7 @@ package mage.cards.m; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -54,7 +54,7 @@ class MirariTriggeredAbility extends TriggeredAbilityImpl { MirariTriggeredAbility() { super(Zone.BATTLEFIELD, new DoIfCostPaid( - new CopyTargetSpellEffect(true), + new CopyTargetStackObjectEffect(true), new GenericManaCost(3)), false); } diff --git a/Mage.Sets/src/mage/cards/m/MirrorSheen.java b/Mage.Sets/src/mage/cards/m/MirrorSheen.java index 9e8fe6f725a..3007ddcde4c 100644 --- a/Mage.Sets/src/mage/cards/m/MirrorSheen.java +++ b/Mage.Sets/src/mage/cards/m/MirrorSheen.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -37,7 +37,7 @@ public final class MirrorSheen extends CardImpl { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{U/R}{U/R}"); // {1}{UR}{UR}: Copy target instant or sorcery spell that targets you. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{1}{U/R}{U/R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{1}{U/R}{U/R}")); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/m/Mirrorpool.java b/Mage.Sets/src/mage/cards/m/Mirrorpool.java index 9336d55b429..33f1218608e 100644 --- a/Mage.Sets/src/mage/cards/m/Mirrorpool.java +++ b/Mage.Sets/src/mage/cards/m/Mirrorpool.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.abilities.mana.ColorlessManaAbility; import mage.cards.CardImpl; @@ -47,7 +47,7 @@ public final class Mirrorpool extends CardImpl { this.addAbility(new ColorlessManaAbility()); // {2}{C}, {T}, Sacrifice Mirrorpool: Copy target instant or sorcery spell you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{C}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{C}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); ability.addTarget(new TargetSpell(filter)); diff --git a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java index 8401d7d74a6..e7f4a309d69 100644 --- a/Mage.Sets/src/mage/cards/m/MischievousQuanar.java +++ b/Mage.Sets/src/mage/cards/m/MischievousQuanar.java @@ -8,7 +8,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.TurnedFaceUpSourceTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.continuous.BecomesFaceDownCreatureEffect; import mage.abilities.keyword.MorphAbility; import mage.cards.CardImpl; @@ -41,7 +41,7 @@ public final class MischievousQuanar extends CardImpl { this.addAbility(new MorphAbility(this, new ManaCostsImpl<>("{1}{U}{U}"))); // When Mischievous Quanar is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy. - Effect effect2 = new CopyTargetSpellEffect(); + Effect effect2 = new CopyTargetStackObjectEffect(); effect2.setText("copy target instant or sorcery spell. You may choose new targets for that copy"); Ability ability = new TurnedFaceUpSourceTriggeredAbility(effect2); ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); diff --git a/Mage.Sets/src/mage/cards/m/MyojinOfCrypticDreams.java b/Mage.Sets/src/mage/cards/m/MyojinOfCrypticDreams.java index 28b958843ab..c8341ebd26b 100644 --- a/Mage.Sets/src/mage/cards/m/MyojinOfCrypticDreams.java +++ b/Mage.Sets/src/mage/cards/m/MyojinOfCrypticDreams.java @@ -6,7 +6,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.condition.common.CastFromHandSourcePermanentCondition; import mage.abilities.costs.common.RemoveCountersSourceCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -52,12 +52,12 @@ public class MyojinOfCrypticDreams extends CardImpl { // Remove an indestructible counter from Myojin of Cryptic Dreams: // Copy target permanent spell you control three times. (The copies become tokens.) Ability ability = new SimpleActivatedAbility( - new CopyTargetSpellEffect(false, false, false) + new CopyTargetStackObjectEffect(false, false, false) .setText("Copy target permanent spell you control three times. (The copies become tokens.)"), new RemoveCountersSourceCost(CounterType.INDESTRUCTIBLE.createInstance()) ); - ability.addEffect(new CopyTargetSpellEffect(false, false, false).setText(" ")); - ability.addEffect(new CopyTargetSpellEffect(false, false, false).setText(" ")); + ability.addEffect(new CopyTargetStackObjectEffect(false, false, false).setText(" ")); + ability.addEffect(new CopyTargetStackObjectEffect(false, false, false).setText(" ")); ability.addTarget(new TargetSpell(permanentSpellFilter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/n/NarsetsReversal.java b/Mage.Sets/src/mage/cards/n/NarsetsReversal.java index a676babeac8..3e1ff374a82 100644 --- a/Mage.Sets/src/mage/cards/n/NarsetsReversal.java +++ b/Mage.Sets/src/mage/cards/n/NarsetsReversal.java @@ -1,6 +1,6 @@ package mage.cards.n; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -19,7 +19,7 @@ public final class NarsetsReversal extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{U}"); // Copy target instant or sorcery spell, then return it to its owner's hand. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new CopyTargetSpellEffect() + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect() .setText("Copy target instant or sorcery spell,")); this.getSpellAbility().addEffect(new ReturnToHandTargetEffect() .setText("then return it to its owner's hand. You may choose new targets for the copy.")); diff --git a/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java b/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java index bec1b3b68c7..18dc6b42585 100644 --- a/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java +++ b/Mage.Sets/src/mage/cards/n/NaruMehaMasterWizard.java @@ -7,7 +7,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.keyword.FlashAbility; import mage.cards.CardImpl; @@ -54,7 +54,7 @@ public final class NaruMehaMasterWizard extends CardImpl { this.addAbility(FlashAbility.getInstance()); //When Naru Meha, Master Wizard enters the battlefield, copy target instant or sorcery spell you control. You may choose new targets for the copy. - Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetSpellEffect()); + Ability ability = new EntersBattlefieldTriggeredAbility(new CopyTargetStackObjectEffect()); ability.addTarget(new TargetSpell(spellFilter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/n/NivixGuildmage.java b/Mage.Sets/src/mage/cards/n/NivixGuildmage.java index f393a6b7f29..a1f91350df7 100644 --- a/Mage.Sets/src/mage/cards/n/NivixGuildmage.java +++ b/Mage.Sets/src/mage/cards/n/NivixGuildmage.java @@ -6,7 +6,7 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -46,7 +46,7 @@ public final class NivixGuildmage extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawDiscardControllerEffect(), new ManaCostsImpl<>("{1}{U}{R}"))); // {2}{U}{R}: Copy target instant or sorcery spell you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{2}{U}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}{U}{R}")); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/o/OddsEnds.java b/Mage.Sets/src/mage/cards/o/OddsEnds.java index 43536e5abc0..8c1dfb973b7 100644 --- a/Mage.Sets/src/mage/cards/o/OddsEnds.java +++ b/Mage.Sets/src/mage/cards/o/OddsEnds.java @@ -3,7 +3,7 @@ package mage.cards.o; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.cards.CardSetInfo; import mage.cards.SplitCard; @@ -71,7 +71,7 @@ class OddsEffect extends OneShotEffect { } else { game.informPlayers("Odds: Spell will be copied"); - return new CopyTargetSpellEffect().apply(game, source); + return new CopyTargetStackObjectEffect().apply(game, source); } } return false; diff --git a/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java b/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java index 4a7cb3d7cb3..65100d111e6 100644 --- a/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java +++ b/Mage.Sets/src/mage/cards/o/OverloadedMageRing.java @@ -5,7 +5,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -34,7 +34,7 @@ public final class OverloadedMageRing extends CardImpl { // {1}, {T}, Sacrifice Overloaded Mage-Ring: Copy target spell you control. You may choose new targets for the copy. Ability ability = new SimpleActivatedAbility( - new CopyTargetSpellEffect(false, false, true), new GenericManaCost(1) + new CopyTargetStackObjectEffect(false, false, true), new GenericManaCost(1) ); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); diff --git a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java b/Mage.Sets/src/mage/cards/p/PrimalWellspring.java index 7598fe17b29..46e8959f144 100644 --- a/Mage.Sets/src/mage/cards/p/PrimalWellspring.java +++ b/Mage.Sets/src/mage/cards/p/PrimalWellspring.java @@ -5,7 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.mana.AnyColorManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -33,7 +33,7 @@ public final 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(true); + Effect effect = new CopyTargetStackObjectEffect(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 e04c5e82b3a..601dcca45bd 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancerAscension.java +++ b/Mage.Sets/src/mage/cards/p/PyromancerAscension.java @@ -1,7 +1,7 @@ package mage.cards.p; import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -100,7 +100,7 @@ class PyromancerAscensionQuestTriggeredAbility extends TriggeredAbilityImpl { class PyromancerAscensionCopyTriggeredAbility extends TriggeredAbilityImpl { PyromancerAscensionCopyTriggeredAbility() { - super(Zone.BATTLEFIELD, new CopyTargetSpellEffect(true), true); + super(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(true), true); } private 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 a8020aa9cb4..e675d733f97 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersGoggles.java @@ -6,7 +6,7 @@ import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.mana.RedManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -35,7 +35,7 @@ public final 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(true); + Effect effect = new CopyTargetStackObjectEffect(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/ReflectionsOfLittjara.java b/Mage.Sets/src/mage/cards/r/ReflectionsOfLittjara.java index d9322db70a7..9be1fc522bc 100644 --- a/Mage.Sets/src/mage/cards/r/ReflectionsOfLittjara.java +++ b/Mage.Sets/src/mage/cards/r/ReflectionsOfLittjara.java @@ -3,7 +3,7 @@ package mage.cards.r; import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.ChooseCreatureTypeEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -33,7 +33,7 @@ public final class ReflectionsOfLittjara extends CardImpl { // Whenever you cast a spell of the chosen type, copy that spell. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(false, true, false) + new CopyTargetStackObjectEffect(false, true, false) .setText("copy that spell"), filter, false, SetTargetPointer.SPELL )); diff --git a/Mage.Sets/src/mage/cards/r/ReflectiveGolem.java b/Mage.Sets/src/mage/cards/r/ReflectiveGolem.java index 2daf3b4736c..515428efb3a 100644 --- a/Mage.Sets/src/mage/cards/r/ReflectiveGolem.java +++ b/Mage.Sets/src/mage/cards/r/ReflectiveGolem.java @@ -5,7 +5,7 @@ import mage.abilities.AbilityImpl; import mage.abilities.Mode; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -51,7 +51,7 @@ public final class ReflectiveGolem extends CardImpl { class ReflectiveGolemTriggeredAbility extends TriggeredAbilityImpl { ReflectiveGolemTriggeredAbility() { - super(Zone.BATTLEFIELD, new DoIfCostPaid(new CopyTargetSpellEffect(), new GenericManaCost(2)), false); + super(Zone.BATTLEFIELD, new DoIfCostPaid(new CopyTargetStackObjectEffect(), new GenericManaCost(2)), false); } private ReflectiveGolemTriggeredAbility(final ReflectiveGolemTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/r/RefuseCooperate.java b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java index 04aa972c5b9..b51df9a6eb7 100644 --- a/Mage.Sets/src/mage/cards/r/RefuseCooperate.java +++ b/Mage.Sets/src/mage/cards/r/RefuseCooperate.java @@ -2,7 +2,7 @@ package mage.cards.r; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.AftermathAbility; import mage.cards.CardSetInfo; import mage.cards.SplitCard; @@ -34,7 +34,7 @@ public final class RefuseCooperate extends SplitCard { // Aftermath getRightHalfCard().addAbility(new AftermathAbility().setRuleAtTheTop(true)); // Copy target instant or sorcery spell. You may choose new targets for the copy. - getRightHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect()); + getRightHalfCard().getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); getRightHalfCard().getSpellAbility().addTarget(new TargetSpell(new FilterInstantOrSorcerySpell())); } diff --git a/Mage.Sets/src/mage/cards/r/Reiterate.java b/Mage.Sets/src/mage/cards/r/Reiterate.java index a7903c27ed5..e94c65f229e 100644 --- a/Mage.Sets/src/mage/cards/r/Reiterate.java +++ b/Mage.Sets/src/mage/cards/r/Reiterate.java @@ -2,7 +2,7 @@ package mage.cards.r; import java.util.UUID; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.BuybackAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class Reiterate extends CardImpl { // Copy target instant or sorcery spell. You may choose new targets for the copy. this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); - this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); } private Reiterate(final Reiterate card) { diff --git a/Mage.Sets/src/mage/cards/r/RepeatedReverberation.java b/Mage.Sets/src/mage/cards/r/RepeatedReverberation.java index 36c497c79cc..2203c2ca31d 100644 --- a/Mage.Sets/src/mage/cards/r/RepeatedReverberation.java +++ b/Mage.Sets/src/mage/cards/r/RepeatedReverberation.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -89,11 +89,11 @@ class RepeatedReverberationTriggeredAbility extends DelayedTriggeredAbility { if (spell != null && spell.isInstantOrSorcery(game)) { this.getEffects().clear(); this.addEffect( - new CopyTargetSpellEffect(true) + new CopyTargetStackObjectEffect(true) .setTargetPointer(new FixedTarget(event.getTargetId(), game)) ); this.addEffect( - new CopyTargetSpellEffect(true) + new CopyTargetStackObjectEffect(true) .setTargetPointer(new FixedTarget(event.getTargetId(), game)) ); return true; diff --git a/Mage.Sets/src/mage/cards/r/ReturnTheFavor.java b/Mage.Sets/src/mage/cards/r/ReturnTheFavor.java index 4061f712e46..cd0fa3813f1 100644 --- a/Mage.Sets/src/mage/cards/r/ReturnTheFavor.java +++ b/Mage.Sets/src/mage/cards/r/ReturnTheFavor.java @@ -3,7 +3,7 @@ package mage.cards.r; import mage.abilities.Mode; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.ChooseNewTargetsTargetEffect; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.SpreeAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -39,7 +39,7 @@ public final class ReturnTheFavor extends CardImpl { this.addAbility(new SpreeAbility(this)); // + {1} -- Copy target instant spell, sorcery spell, activated ability, or triggered ability. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new CopyTargetStackAbilityEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getSpellAbility().addTarget(new TargetStackObject(filter)); this.getSpellAbility().withFirstModeCost(new GenericManaCost(1)); diff --git a/Mage.Sets/src/mage/cards/r/Reverberate.java b/Mage.Sets/src/mage/cards/r/Reverberate.java index 63b192031dd..f9778d5b2bb 100644 --- a/Mage.Sets/src/mage/cards/r/Reverberate.java +++ b/Mage.Sets/src/mage/cards/r/Reverberate.java @@ -1,6 +1,6 @@ package mage.cards.r; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -19,7 +19,7 @@ public final class Reverberate extends CardImpl { // Copy target instant or sorcery spell. You may choose new targets for the copy. this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); - this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); } private Reverberate(final Reverberate card) { diff --git a/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java b/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java index fe9a97518d2..ae9122bb6c6 100644 --- a/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java +++ b/Mage.Sets/src/mage/cards/r/RikuOfTwoReflections.java @@ -5,7 +5,7 @@ import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.cards.CardImpl; @@ -46,7 +46,7 @@ public final 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(true); + Effect effect = new CopyTargetStackObjectEffect(true); this.addAbility(new SpellCastControllerTriggeredAbility( new DoIfCostPaid(effect, new ManaCostsImpl<>("{U}{R}")), filter, false, SetTargetPointer.SPELL diff --git a/Mage.Sets/src/mage/cards/r/RoothaMercurialArtist.java b/Mage.Sets/src/mage/cards/r/RoothaMercurialArtist.java index 4fc20e6ccf8..5218519239d 100644 --- a/Mage.Sets/src/mage/cards/r/RoothaMercurialArtist.java +++ b/Mage.Sets/src/mage/cards/r/RoothaMercurialArtist.java @@ -5,7 +5,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ReturnToHandFromBattlefieldSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -40,7 +40,7 @@ public final class RoothaMercurialArtist extends CardImpl { this.toughness = new MageInt(4); // {2}, Return Rootha, Mercurial Artist to its owner's hand: Copy target instant or sorcery spell you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(), new GenericManaCost(2)); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(2)); ability.addCost(new ReturnToHandFromBattlefieldSourceCost()); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SeaGateStormcaller.java b/Mage.Sets/src/mage/cards/s/SeaGateStormcaller.java index 918ddd3242e..6400e38b66b 100644 --- a/Mage.Sets/src/mage/cards/s/SeaGateStormcaller.java +++ b/Mage.Sets/src/mage/cards/s/SeaGateStormcaller.java @@ -6,7 +6,7 @@ import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.condition.common.KickedCondition; import mage.abilities.decorator.ConditionalOneShotEffect; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.keyword.KickerAbility; import mage.cards.CardImpl; @@ -62,9 +62,9 @@ class SeaGateStormcallerDelayedTriggeredAbility extends DelayedTriggeredAbility private final boolean twice; public SeaGateStormcallerDelayedTriggeredAbility(boolean twice) { - super(new CopyTargetSpellEffect(true), Duration.EndOfTurn, true, false); + super(new CopyTargetStackObjectEffect(true), Duration.EndOfTurn, true, false); if (twice) { - this.addEffect(new CopyTargetSpellEffect(true)); + this.addEffect(new CopyTargetStackObjectEffect(true)); } this.twice = twice; } diff --git a/Mage.Sets/src/mage/cards/s/SeeDouble.java b/Mage.Sets/src/mage/cards/s/SeeDouble.java index 19c1156f107..617e13019aa 100644 --- a/Mage.Sets/src/mage/cards/s/SeeDouble.java +++ b/Mage.Sets/src/mage/cards/s/SeeDouble.java @@ -4,7 +4,7 @@ import mage.abilities.Mode; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.CardsInOpponentGraveyardCondition; import mage.abilities.effects.common.CantBeCopiedSourceEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateTokenCopyTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -34,7 +34,7 @@ public final class SeeDouble extends CardImpl { this.getSpellAbility().addHint(CardsInOpponentGraveyardCondition.EIGHT.getHint()); // * Copy target spell. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getSpellAbility().addTarget(new TargetSpell()); // * Create a token that's a copy of target creature. diff --git a/Mage.Sets/src/mage/cards/s/SevinneTheChronoclasm.java b/Mage.Sets/src/mage/cards/s/SevinneTheChronoclasm.java index 68b38e1dd5e..b4617acf03e 100644 --- a/Mage.Sets/src/mage/cards/s/SevinneTheChronoclasm.java +++ b/Mage.Sets/src/mage/cards/s/SevinneTheChronoclasm.java @@ -4,7 +4,7 @@ import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -71,7 +71,7 @@ class SevinneTheChronoclasmTriggeredAbility extends SpellCastControllerTriggered return false; } this.getEffects().clear(); - Effect effect = new CopyTargetSpellEffect(true); + Effect effect = new CopyTargetStackObjectEffect(true); effect.setTargetPointer(new FixedTarget(event.getTargetId(), game)); this.addEffect(effect); return true; diff --git a/Mage.Sets/src/mage/cards/s/SigilTracer.java b/Mage.Sets/src/mage/cards/s/SigilTracer.java index 780b9fa554e..eefb0b7c410 100644 --- a/Mage.Sets/src/mage/cards/s/SigilTracer.java +++ b/Mage.Sets/src/mage/cards/s/SigilTracer.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -40,7 +40,7 @@ public final class SigilTracer extends CardImpl { this.toughness = new MageInt(2); // {1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new ManaCostsImpl<>("{1}{U}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{1}{U}")); ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); ability.addCost(new TapTargetCost(new TargetControlledCreaturePermanent(2, 2, filter, false))); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SimonWildMagicSorcerer.java b/Mage.Sets/src/mage/cards/s/SimonWildMagicSorcerer.java index 95d5b54e812..0e61f1808c6 100644 --- a/Mage.Sets/src/mage/cards/s/SimonWildMagicSorcerer.java +++ b/Mage.Sets/src/mage/cards/s/SimonWildMagicSorcerer.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DrawCardAllEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.RollDieWithResultTableEffect; @@ -50,7 +50,7 @@ public final class SimonWildMagicSorcerer extends CardImpl { effect.addTableEntry(10, 19, new DrawCardSourceControllerEffect(1, "you")); // 20 | Copy that spell. You may choose new targets for the copy. - effect.addTableEntry(20, 20, new CopyTargetSpellEffect()); + effect.addTableEntry(20, 20, new CopyTargetStackObjectEffect()); } private SimonWildMagicSorcerer(final SimonWildMagicSorcerer card) { diff --git a/Mage.Sets/src/mage/cards/s/SplitDecision.java b/Mage.Sets/src/mage/cards/s/SplitDecision.java index e995fd6b871..7da768654d9 100644 --- a/Mage.Sets/src/mage/cards/s/SplitDecision.java +++ b/Mage.Sets/src/mage/cards/s/SplitDecision.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.choices.TwoChoiceVote; @@ -78,7 +78,7 @@ class SplitDecisionEffect extends OneShotEffect { if (denialCount > duplicationCount) { return game.getStack().counter(spell.getId(), source, game); } else { - return new CopyTargetSpellEffect().apply(game, source); + return new CopyTargetStackObjectEffect().apply(game, source); } } } diff --git a/Mage.Sets/src/mage/cards/s/StellaLeeWildCard.java b/Mage.Sets/src/mage/cards/s/StellaLeeWildCard.java index 9060a6e6a69..d64bc90e05f 100644 --- a/Mage.Sets/src/mage/cards/s/StellaLeeWildCard.java +++ b/Mage.Sets/src/mage/cards/s/StellaLeeWildCard.java @@ -6,7 +6,7 @@ import mage.abilities.common.ActivateIfConditionActivatedAbility; import mage.abilities.common.CastSecondSpellTriggeredAbility; import mage.abilities.condition.Condition; import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect; import mage.abilities.keyword.StormAbility; import mage.cards.CardImpl; @@ -47,7 +47,7 @@ public final class StellaLeeWildCard extends CardImpl { // {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy. Activate only if you've cast three or more spells this turn. Ability ability = new ActivateIfConditionActivatedAbility( - Zone.BATTLEFIELD, new CopyTargetSpellEffect(), + Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new TapSourceCost(), StellaLeeWildCardCondition.instance ); ability.addTarget(new TargetSpell(filter)); diff --git a/Mage.Sets/src/mage/cards/s/StormOfSaruman.java b/Mage.Sets/src/mage/cards/s/StormOfSaruman.java index cb66c5c78ba..dcec517979f 100644 --- a/Mage.Sets/src/mage/cards/s/StormOfSaruman.java +++ b/Mage.Sets/src/mage/cards/s/StormOfSaruman.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.common.CastSecondSpellTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.WardAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -24,7 +24,7 @@ public final class StormOfSaruman extends CardImpl { // Whenever you cast your second spell each turn, copy it, except the copy isn't legendary. You may choose new targets for the copy. this.addAbility(new CastSecondSpellTriggeredAbility(Zone.BATTLEFIELD, - new CopyTargetSpellEffect(false, true, true, 1, new RemoveTypeCopyApplier(SuperType.LEGENDARY)) + new CopyTargetStackObjectEffect(false, true, true, 1, new RemoveTypeCopyApplier(SuperType.LEGENDARY)) .setText("copy it, except the copy isn't legendary. You may choose new targets for the copy."), TargetController.YOU, false, SetTargetPointer.SPELL)); diff --git a/Mage.Sets/src/mage/cards/s/StrionicResonator.java b/Mage.Sets/src/mage/cards/s/StrionicResonator.java index e2470fe3e9a..7154eed7fb6 100644 --- a/Mage.Sets/src/mage/cards/s/StrionicResonator.java +++ b/Mage.Sets/src/mage/cards/s/StrionicResonator.java @@ -4,7 +4,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -29,7 +29,7 @@ public final class StrionicResonator extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); // {2}, {T}: Copy target triggered ability you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new ManaCostsImpl<>("{2}")); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{2}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetTriggeredAbility(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java index 5030dda3202..bdd43596d14 100644 --- a/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java +++ b/Mage.Sets/src/mage/cards/s/SwarmIntelligence.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -21,7 +21,7 @@ public final 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(true) + new CopyTargetStackObjectEffect(true) .setText("you may copy that spell. You may choose new targets for the copy"), new FilterInstantOrSorcerySpell("an instant or sorcery spell"), true, SetTargetPointer.SPELL diff --git a/Mage.Sets/src/mage/cards/t/TawnosUrzasApprentice.java b/Mage.Sets/src/mage/cards/t/TawnosUrzasApprentice.java index 8d47fbfac66..917dbb37304 100644 --- a/Mage.Sets/src/mage/cards/t/TawnosUrzasApprentice.java +++ b/Mage.Sets/src/mage/cards/t/TawnosUrzasApprentice.java @@ -1,24 +1,21 @@ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.TargetController; -import mage.constants.Zone; +import mage.constants.*; import mage.filter.FilterStackObject; import mage.filter.predicate.other.ArtifactSourcePredicate; import mage.target.common.TargetActivatedOrTriggeredAbility; +import java.util.UUID; + /** * * @author TheElk801 @@ -45,7 +42,7 @@ public final class TawnosUrzasApprentice extends CardImpl { this.addAbility(HasteAbility.getInstance()); // {U}{R}, {T}: Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackAbilityEffect(), new ManaCostsImpl<>("{U}{R}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{U}{R}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TheMirariConjecture.java b/Mage.Sets/src/mage/cards/t/TheMirariConjecture.java index 25a0306f22f..156627c74ce 100644 --- a/Mage.Sets/src/mage/cards/t/TheMirariConjecture.java +++ b/Mage.Sets/src/mage/cards/t/TheMirariConjecture.java @@ -4,7 +4,7 @@ package mage.cards.t; import java.util.UUID; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.common.SagaAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect; import mage.cards.CardImpl; @@ -74,7 +74,7 @@ public final class TheMirariConjecture extends CardImpl { class TheMirariConjectureDelayedTriggeredAbility extends DelayedTriggeredAbility { public TheMirariConjectureDelayedTriggeredAbility() { - super(new CopyTargetSpellEffect(true), Duration.EndOfTurn, false); + super(new CopyTargetStackObjectEffect(true), Duration.EndOfTurn, false); } private TheMirariConjectureDelayedTriggeredAbility(final TheMirariConjectureDelayedTriggeredAbility ability) { diff --git a/Mage.Sets/src/mage/cards/t/ThePeregrineDynamo.java b/Mage.Sets/src/mage/cards/t/ThePeregrineDynamo.java index 0d59feacd45..511f9ab33fa 100644 --- a/Mage.Sets/src/mage/cards/t/ThePeregrineDynamo.java +++ b/Mage.Sets/src/mage/cards/t/ThePeregrineDynamo.java @@ -6,7 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,7 +48,7 @@ public final class ThePeregrineDynamo extends CardImpl { this.addAbility(HasteAbility.getInstance()); // {1}, {T}: Copy target activated or triggered ability you control from another legendary source that's not a commander. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new GenericManaCost(1)); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(1)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java b/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java index c5ebe468c7c..58dbf8da591 100644 --- a/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java +++ b/Mage.Sets/src/mage/cards/t/TheSixthDoctor.java @@ -2,7 +2,7 @@ package mage.cards.t; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -38,7 +38,7 @@ public final class TheSixthDoctor extends CardImpl { // Time Lord's Prerogative -- Whenever you cast a historic spell, copy it, except the copy isn't legendary. This ability triggers only once each turn. this.addAbility( new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect( + new CopyTargetStackObjectEffect( false, true, false, 1, new RemoveTypeCopyApplier(SuperType.LEGENDARY) ).setText("copy it, except the copy isn't legendary"), diff --git a/Mage.Sets/src/mage/cards/t/Twincast.java b/Mage.Sets/src/mage/cards/t/Twincast.java index 09ac32540e5..16996238f35 100644 --- a/Mage.Sets/src/mage/cards/t/Twincast.java +++ b/Mage.Sets/src/mage/cards/t/Twincast.java @@ -1,6 +1,6 @@ package mage.cards.t; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -18,7 +18,7 @@ public final class Twincast extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}{U}"); // Copy target instant or sorcery spell. You may choose new targets for the copy. - this.getSpellAbility().addEffect(new CopyTargetSpellEffect()); + this.getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); } diff --git a/Mage.Sets/src/mage/cards/t/TwinningStaff.java b/Mage.Sets/src/mage/cards/t/TwinningStaff.java index 718392a8b06..36cb4050b11 100644 --- a/Mage.Sets/src/mage/cards/t/TwinningStaff.java +++ b/Mage.Sets/src/mage/cards/t/TwinningStaff.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.ReplacementEffectImpl; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -39,7 +39,7 @@ public final class TwinningStaff extends CardImpl { this.addAbility(new SimpleStaticAbility(new TwinningStaffEffect())); // {7}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetSpellEffect(), new GenericManaCost(7)); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new GenericManaCost(7)); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetSpell(filter)); this.addAbility(ability); @@ -90,4 +90,4 @@ class TwinningStaffEffect extends ReplacementEffectImpl { public TwinningStaffEffect copy() { return new TwinningStaffEffect(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java b/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java index bbc9747f182..ef1a1739650 100644 --- a/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java +++ b/Mage.Sets/src/mage/cards/u/UyoSilentProphet.java @@ -7,7 +7,7 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -38,7 +38,7 @@ public final class UyoSilentProphet extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); // {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. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetSpellEffect(), new GenericManaCost(2)); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CopyTargetStackObjectEffect(), new GenericManaCost(2)); ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(2, 2, new FilterControlledLandPermanent("lands"), false))); ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VerazolTheSplitCurrent.java b/Mage.Sets/src/mage/cards/v/VerazolTheSplitCurrent.java index c295cd0aa6b..789a93b7ea8 100644 --- a/Mage.Sets/src/mage/cards/v/VerazolTheSplitCurrent.java +++ b/Mage.Sets/src/mage/cards/v/VerazolTheSplitCurrent.java @@ -5,7 +5,7 @@ import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.dynamicvalue.common.ManaSpentToCastCount; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; @@ -40,7 +40,7 @@ public final class VerazolTheSplitCurrent extends CardImpl { // Whenever you cast a kicked spell, you may remove two +1/+1 counters from Verazol, the Split Current. If you do, copy that spell. You may choose new targets for that copy. this.addAbility(new SpellCastControllerTriggeredAbility( new DoIfCostPaid( - new CopyTargetSpellEffect(false, true) + new CopyTargetStackObjectEffect(true) .setText("copy that spell. You may choose new targets for the copy"), new RemoveCountersSourceCost(CounterType.P1P1.createInstance(2)) ), StaticFilters.FILTER_SPELL_KICKED_A, false, SetTargetPointer.SPELL diff --git a/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java b/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java index 14a450b82e0..d3da40ad815 100644 --- a/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java +++ b/Mage.Sets/src/mage/cards/v/VirtueOfKnowledge.java @@ -1,7 +1,7 @@ package mage.cards.v; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.replacement.AdditionalTriggerControlledETBReplacementEffect; import mage.cards.AdventureCard; import mage.cards.CardSetInfo; @@ -32,7 +32,7 @@ public final class VirtueOfKnowledge extends AdventureCard { // Vantress Visions // Copy target activated or triggered ability you control. You may choose new targets for the copy. - this.getSpellCard().getSpellAbility().addEffect(new CopyTargetStackAbilityEffect()); + this.getSpellCard().getSpellAbility().addEffect(new CopyTargetStackObjectEffect()); this.getSpellCard().getSpellAbility().addTarget(new TargetActivatedOrTriggeredAbility(filter)); this.finalizeAdventure(); diff --git a/Mage.Sets/src/mage/cards/v/VoloGuideToMonsters.java b/Mage.Sets/src/mage/cards/v/VoloGuideToMonsters.java index b0492148698..81fd94514d0 100644 --- a/Mage.Sets/src/mage/cards/v/VoloGuideToMonsters.java +++ b/Mage.Sets/src/mage/cards/v/VoloGuideToMonsters.java @@ -2,7 +2,7 @@ package mage.cards.v; import mage.MageInt; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -44,7 +44,7 @@ public final class VoloGuideToMonsters extends CardImpl { // Whenever you cast a creature spell that doesn't share a creature type with a creature you control or a creature card in your graveyard, copy that spell. this.addAbility(new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true) + new CopyTargetStackObjectEffect(true) .setText("copy that spell"), filter, false, SetTargetPointer.SPELL )); diff --git a/Mage.Sets/src/mage/cards/w/WeaverOfHarmony.java b/Mage.Sets/src/mage/cards/w/WeaverOfHarmony.java index cf5ad7a9b7f..36ac6e49763 100644 --- a/Mage.Sets/src/mage/cards/w/WeaverOfHarmony.java +++ b/Mage.Sets/src/mage/cards/w/WeaverOfHarmony.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.CopyTargetStackAbilityEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -48,7 +48,7 @@ public final class WeaverOfHarmony extends CardImpl { ))); // {G}, {T}: Copy target activated or triggered ability you control from an enchantment source. You may choose new targets for the copy. - Ability ability = new SimpleActivatedAbility(new CopyTargetStackAbilityEffect(), new ManaCostsImpl<>("{G}")); + Ability ability = new SimpleActivatedAbility(new CopyTargetStackObjectEffect(), new ManaCostsImpl<>("{G}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetActivatedOrTriggeredAbility(filter2)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/w/WildRicochet.java b/Mage.Sets/src/mage/cards/w/WildRicochet.java index 256c9d76de0..1cf92e0ad95 100644 --- a/Mage.Sets/src/mage/cards/w/WildRicochet.java +++ b/Mage.Sets/src/mage/cards/w/WildRicochet.java @@ -4,7 +4,7 @@ package mage.cards.w; import java.util.UUID; import mage.abilities.effects.Effect; import mage.abilities.effects.common.ChooseNewTargetsTargetEffect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -31,7 +31,7 @@ public final class WildRicochet extends CardImpl { // You may choose new targets for target instant or sorcery spell. Then copy that spell. You may choose new targets for the copy. this.getSpellAbility().addEffect(new ChooseNewTargetsTargetEffect()); - Effect effect = new CopyTargetSpellEffect(); + Effect effect = new CopyTargetStackObjectEffect(); effect.setText("Then copy that spell. You may choose new targets for the copy"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetStackObject(filter)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopyPermanentSpellTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopyPermanentSpellTest.java index 2e9825b07cd..edda38ee472 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopyPermanentSpellTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopyPermanentSpellTest.java @@ -1,7 +1,7 @@ package org.mage.test.cards.copy; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.keyword.FlyingAbility; import mage.constants.PhaseStep; import mage.constants.SetTargetPointer; @@ -21,7 +21,7 @@ public class CopyPermanentSpellTest extends CardTestPlayerBase { addCustomCardWithAbility( "Forker", playerA, new SpellCastControllerTriggeredAbility( - new CopyTargetSpellEffect(true), + new CopyTargetStackObjectEffect(true), StaticFilters.FILTER_SPELL, false, SetTargetPointer.SPELL ) diff --git a/Mage/src/main/java/mage/abilities/common/delayed/CopyNextSpellDelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/delayed/CopyNextSpellDelayedTriggeredAbility.java index e8a14f4a4b4..7b5e60b7b24 100644 --- a/Mage/src/main/java/mage/abilities/common/delayed/CopyNextSpellDelayedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/delayed/CopyNextSpellDelayedTriggeredAbility.java @@ -2,7 +2,7 @@ package mage.abilities.common.delayed; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.constants.Duration; import mage.filter.FilterSpell; import mage.filter.StaticFilters; @@ -24,7 +24,7 @@ public class CopyNextSpellDelayedTriggeredAbility extends DelayedTriggeredAbilit } public CopyNextSpellDelayedTriggeredAbility(FilterSpell filter) { - this(filter, new CopyTargetSpellEffect(true), null); + this(filter, new CopyTargetStackObjectEffect(true), null); } public CopyNextSpellDelayedTriggeredAbility(FilterSpell filter, Effect effect, String rule) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackAbilityEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackAbilityEffect.java deleted file mode 100644 index 8c7f6d4a7f5..00000000000 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackAbilityEffect.java +++ /dev/null @@ -1,47 +0,0 @@ -package mage.abilities.effects.common; - -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.effects.OneShotEffect; -import mage.constants.Outcome; -import mage.game.Game; -import mage.game.stack.StackAbility; - -public class CopyTargetStackAbilityEffect extends OneShotEffect { - - /** - * Copy target (activated/triggered) ability on the stack, choosing new targets for the copy - */ - public CopyTargetStackAbilityEffect() { - super(Outcome.Copy); - } - - protected CopyTargetStackAbilityEffect(final CopyTargetStackAbilityEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(getTargetPointer().getFirst(game, source)); - if (stackAbility == null) { - return false; - } - stackAbility.createCopyOnStack(game, source, source.getControllerId(), true); - return true; - } - - @Override - public CopyTargetStackAbilityEffect copy() { - return new CopyTargetStackAbilityEffect(this); - } - - @Override - public String getText(Mode mode) { - if (staticText != null && !staticText.isEmpty()) { - return staticText; - } - return "copy " + getTargetPointer().describeTargets(mode.getTargets(), "that spell") - + ". You may choose new targets for the copy"; - } - -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackObjectEffect.java similarity index 57% rename from Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java rename to Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackObjectEffect.java index 85e533fdc90..b414b90f8b5 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetStackObjectEffect.java @@ -2,44 +2,35 @@ package mage.abilities.effects.common; import mage.abilities.Ability; import mage.abilities.Mode; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.stack.Spell; +import mage.game.stack.StackObject; import mage.util.functions.StackObjectCopyApplier; /** * @author BetaSteward_at_googlemail.com */ -public class CopyTargetSpellEffect extends OneShotEffect { +public class CopyTargetStackObjectEffect extends OneShotEffect { private final boolean useController; private final boolean useLKI; - private String copyThatSpellName = "that spell"; + private String objectName = "that spell"; private final boolean chooseTargets; private final int amount; private final StackObjectCopyApplier applier; - public CopyTargetSpellEffect() { + public CopyTargetStackObjectEffect() { this(false); } - public CopyTargetSpellEffect(boolean useLKI) { - this(false, useLKI); + public CopyTargetStackObjectEffect(boolean useLKI) { + this(false, useLKI, true); } - public CopyTargetSpellEffect(boolean useController, boolean useLKI) { - this(useController, useLKI, true); - } - - public CopyTargetSpellEffect(boolean useController, boolean useLKI, boolean chooseTargets) { - this(useController, useLKI, chooseTargets, 1); - } - - public CopyTargetSpellEffect(boolean useController, boolean useLKI, boolean chooseTargets, int amount) { - this(useController, useLKI, chooseTargets, amount, null); + public CopyTargetStackObjectEffect(boolean useController, boolean useLKI, boolean chooseTargets) { + this(useController, useLKI, chooseTargets, 1, null); } /** @@ -50,8 +41,8 @@ public class CopyTargetSpellEffect extends OneShotEffect { * @param amount The amount of copies to create * @param applier An applier to apply to the newly created copies. Used to change copiable values of the copy, such as types or name */ - public CopyTargetSpellEffect(boolean useController, boolean useLKI, boolean chooseTargets, int amount, - StackObjectCopyApplier applier) { + public CopyTargetStackObjectEffect(boolean useController, boolean useLKI, boolean chooseTargets, int amount, + StackObjectCopyApplier applier) { super(Outcome.Copy); this.useController = useController; this.useLKI = useLKI; @@ -60,34 +51,35 @@ public class CopyTargetSpellEffect extends OneShotEffect { this.applier = applier; } - protected CopyTargetSpellEffect(final CopyTargetSpellEffect effect) { + protected CopyTargetStackObjectEffect(final CopyTargetStackObjectEffect effect) { super(effect); this.useLKI = effect.useLKI; this.useController = effect.useController; - this.copyThatSpellName = effect.copyThatSpellName; + this.objectName = effect.objectName; this.chooseTargets = effect.chooseTargets; this.amount = effect.amount; this.applier = effect.applier; } - public Effect withSpellName(String copyThatSpellName) { - this.copyThatSpellName = copyThatSpellName; + public CopyTargetStackObjectEffect withText(String objectName) { + this.objectName = objectName; return this; } @Override public boolean apply(Game game, Ability source) { - Spell spell; + StackObject stackObject; if (useLKI) { - spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); + stackObject = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); } else { - spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source)); + stackObject = game.getStack().getStackObject(getTargetPointer().getFirst(game, source)); } - if (spell == null) { - spell = (Spell) game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK); + if (stackObject == null) { + stackObject = (StackObject) game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK); } - if (spell != null) { - spell.createCopyOnStack(game, source, useController ? spell.getControllerId() : source.getControllerId(), + if (stackObject != null) { + stackObject.createCopyOnStack(game, source, + useController ? stackObject.getControllerId() : source.getControllerId(), chooseTargets, amount, applier); return true; } @@ -95,8 +87,8 @@ public class CopyTargetSpellEffect extends OneShotEffect { } @Override - public CopyTargetSpellEffect copy() { - return new CopyTargetSpellEffect(this); + public CopyTargetStackObjectEffect copy() { + return new CopyTargetStackObjectEffect(this); } @Override @@ -105,7 +97,7 @@ public class CopyTargetSpellEffect extends OneShotEffect { return staticText; } return "copy " + - getTargetPointer().describeTargets(mode.getTargets(), copyThatSpellName) + + getTargetPointer().describeTargets(mode.getTargets(), objectName) + (chooseTargets ? ". You may choose new targets for the copy" : ""); } } diff --git a/Mage/src/main/java/mage/game/command/emblems/RowanScholarOfSparksEmblem.java b/Mage/src/main/java/mage/game/command/emblems/RowanScholarOfSparksEmblem.java index cdbdd452cdb..b5f66ea6a1d 100644 --- a/Mage/src/main/java/mage/game/command/emblems/RowanScholarOfSparksEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/RowanScholarOfSparksEmblem.java @@ -2,7 +2,7 @@ package mage.game.command.emblems; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.abilities.effects.common.DoIfCostPaid; import mage.constants.SetTargetPointer; import mage.constants.Zone; @@ -18,7 +18,7 @@ public final class RowanScholarOfSparksEmblem extends Emblem { public RowanScholarOfSparksEmblem() { super("Emblem Rowan"); this.getAbilities().add(new SpellCastControllerTriggeredAbility( - Zone.COMMAND, new DoIfCostPaid(new CopyTargetSpellEffect(true), new GenericManaCost(2)), + Zone.COMMAND, new DoIfCostPaid(new CopyTargetStackObjectEffect(true), new GenericManaCost(2)), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, SetTargetPointer.SPELL )); } diff --git a/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java index 62f1a2b067a..968dea9d929 100644 --- a/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/WillKenrithEmblem.java @@ -1,7 +1,7 @@ package mage.game.command.emblems; import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.common.CopyTargetSpellEffect; +import mage.abilities.effects.common.CopyTargetStackObjectEffect; import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.StaticFilters; @@ -17,7 +17,7 @@ public final class WillKenrithEmblem extends Emblem { super("Emblem Will Kenrith"); this.getAbilities().add(new SpellCastControllerTriggeredAbility( Zone.COMMAND, - new CopyTargetSpellEffect(true).withSpellName("it"), + new CopyTargetStackObjectEffect(true).withText("it"), StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false, SetTargetPointer.SPELL