diff --git a/Mage.Sets/src/mage/cards/a/AnOfferYouCantRefuse.java b/Mage.Sets/src/mage/cards/a/AnOfferYouCantRefuse.java index 8bba15096f8..c0871602618 100644 --- a/Mage.Sets/src/mage/cards/a/AnOfferYouCantRefuse.java +++ b/Mage.Sets/src/mage/cards/a/AnOfferYouCantRefuse.java @@ -21,9 +21,7 @@ public final class AnOfferYouCantRefuse extends CardImpl { // Counter target noncreature spell. Its controller creates two Treasure tokens. this.getSpellAbility().addEffect(new CounterTargetEffect()); - this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect( - new TreasureToken(), 2, false, CreateTokenControllerTargetEffect.TargetKind.SPELL - )); + this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect(new TreasureToken(), 2, false)); this.getSpellAbility().addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_NON_CREATURE)); } @@ -35,4 +33,4 @@ public final class AnOfferYouCantRefuse extends CardImpl { public AnOfferYouCantRefuse copy() { return new AnOfferYouCantRefuse(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/s/StrixSerenade.java b/Mage.Sets/src/mage/cards/s/StrixSerenade.java index 3749059f10d..f3ef75b6f78 100644 --- a/Mage.Sets/src/mage/cards/s/StrixSerenade.java +++ b/Mage.Sets/src/mage/cards/s/StrixSerenade.java @@ -32,9 +32,7 @@ public final class StrixSerenade extends CardImpl { // Counter target artifact, creature, or planeswalker spell. Its controller creates a 2/2 blue Bird creature token with flying. this.getSpellAbility().addEffect(new CounterTargetEffect()); - this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect( - new SwanSongBirdToken(), CreateTokenControllerTargetEffect.TargetKind.SPELL - )); + this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect(new SwanSongBirdToken())); this.getSpellAbility().addTarget(new TargetSpell(filter)); } diff --git a/Mage.Sets/src/mage/cards/s/SwanSong.java b/Mage.Sets/src/mage/cards/s/SwanSong.java index 0f8c71b9eef..f2644ddf7ed 100644 --- a/Mage.Sets/src/mage/cards/s/SwanSong.java +++ b/Mage.Sets/src/mage/cards/s/SwanSong.java @@ -1,4 +1,3 @@ - package mage.cards.s; import mage.abilities.effects.common.CounterTargetEffect; @@ -33,9 +32,7 @@ public final class SwanSong extends CardImpl { // Counter target enchantment, instant or sorcery spell. Its controller creates a 2/2 blue Bird creature token with flying. this.getSpellAbility().addEffect(new CounterTargetEffect()); - this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect( - new SwanSongBirdToken(), CreateTokenControllerTargetEffect.TargetKind.SPELL - )); + this.getSpellAbility().addEffect(new CreateTokenControllerTargetEffect(new SwanSongBirdToken())); this.getSpellAbility().addTarget(new TargetSpell(filter)); } @@ -47,4 +44,4 @@ public final class SwanSong extends CardImpl { public SwanSong copy() { return new SwanSong(this); } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenControllerTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenControllerTargetEffect.java index 78953e426b8..e4a7e1c7651 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenControllerTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenControllerTargetEffect.java @@ -5,7 +5,6 @@ import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; -import mage.game.Controllable; import mage.game.Game; import mage.game.permanent.token.Token; import mage.players.Player; @@ -21,43 +20,20 @@ public class CreateTokenControllerTargetEffect extends OneShotEffect { private final DynamicValue amount; private final boolean tapped; - /** - * What the target is supposed to be, to retrieve its controller from - */ - public enum TargetKind { - PERMANENT, - SPELL - } - - private final TargetKind targetKind; - public CreateTokenControllerTargetEffect(Token token) { this(token, 1, false); } - public CreateTokenControllerTargetEffect(Token token, TargetKind targetKind) { - this(token, 1, false, targetKind); - } - public CreateTokenControllerTargetEffect(Token token, int amount, boolean tapped) { this(token, StaticValue.get(amount), tapped); } - public CreateTokenControllerTargetEffect(Token token, int amount, boolean tapped, TargetKind targetKind) { - this(token, StaticValue.get(amount), tapped, targetKind); - } - public CreateTokenControllerTargetEffect(Token token, DynamicValue amount, boolean tapped) { - this(token, amount, tapped, TargetKind.PERMANENT); - } - - public CreateTokenControllerTargetEffect(Token token, DynamicValue amount, boolean tapped, TargetKind targetKind) { super(Outcome.Neutral); this.token = token; this.amount = amount.copy(); this.tapped = tapped; this.staticText = makeText(); - this.targetKind = targetKind; } protected CreateTokenControllerTargetEffect(final CreateTokenControllerTargetEffect effect) { @@ -65,7 +41,6 @@ public class CreateTokenControllerTargetEffect extends OneShotEffect { this.token = effect.token.copy(); this.amount = effect.amount.copy(); this.tapped = effect.tapped; - this.targetKind = effect.targetKind; } @Override @@ -75,21 +50,10 @@ public class CreateTokenControllerTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Controllable controllable = null; - switch (targetKind) { - case PERMANENT: - controllable = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - break; - case SPELL: - controllable = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); - break; - } - if (controllable != null) { - Player controllerOfTarget = game.getPlayer(controllable.getControllerId()); - if (controllerOfTarget != null) { - int value = amount.calculate(game, source, this); - return token.putOntoBattlefield(value, game, source, controllerOfTarget.getId(), tapped, false); - } + Player controllerOfTarget = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); + if (controllerOfTarget != null) { + int value = amount.calculate(game, source, this); + return token.putOntoBattlefield(value, game, source, controllerOfTarget.getId(), tapped, false); } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java index 4b73f840425..f8a0eb85f04 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DamageTargetControllerEffect.java @@ -7,7 +7,6 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; /** @@ -64,12 +63,9 @@ public class DamageTargetControllerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - if (permanent != null) { - Player targetController = game.getPlayer(permanent.getControllerId()); - if (targetController != null) { - targetController.damage(amount.calculate(game, source, this), source.getSourceId(), source, game, false, preventable); - } + Player targetController = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); + if (targetController != null) { + targetController.damage(amount.calculate(game, source, this), source.getSourceId(), source, game, false, preventable); return true; } return false; diff --git a/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetControllerEffect.java index a6bdb9eee64..6c72ab6407d 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DrawCardTargetControllerEffect.java @@ -6,8 +6,6 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; import mage.util.CardUtil; @@ -41,16 +39,7 @@ public class DrawCardTargetControllerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player targetController = null; - Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - if (permanent != null) { - targetController = game.getPlayer(permanent.getControllerId()); - } else { - Spell spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); - if (spell != null) { - targetController = game.getPlayer(spell.getControllerId()); - } - } + Player targetController = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); if (targetController != null) { targetController.drawCards(amount.calculate(game, source, this), source, game); return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetControllerEffect.java index 7d91aa12e91..35e26396dbe 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/GainLifeTargetControllerEffect.java @@ -6,8 +6,6 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; /** @@ -39,16 +37,7 @@ public class GainLifeTargetControllerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player targetController = null; - Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - if (permanent != null) { - targetController = game.getPlayer(permanent.getControllerId()); - } else { - Spell spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); - if (spell != null) { - targetController = game.getPlayer(spell.getControllerId()); - } - } + Player targetController = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); if (targetController != null) { targetController.gainLife(amount.calculate(game, source, this), game, source); return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetControllerEffect.java index 9f8e9c09e99..9f25ad5efa3 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeTargetControllerEffect.java @@ -1,16 +1,11 @@ package mage.abilities.effects.common; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; /** @@ -42,31 +37,10 @@ public class LoseLifeTargetControllerEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - MageObject targetCard = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - - // if target is a countered spell - if (targetCard == null) { - targetCard = game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK); - } - - if (targetCard != null) { - Player controller = null; - - //Handles interaction with permanents that were on the battlefield. - if (targetCard instanceof Permanent) { - Permanent targetPermanent = (Permanent) targetCard; - controller = game.getPlayer(targetPermanent.getControllerId()); - } - //Handles interaction with spells that were on the stack. - else if (targetCard instanceof Spell) { - Spell targetSpell = (Spell) targetCard; - controller = game.getPlayer(targetSpell.getControllerId()); - } - - if (controller != null) { - controller.loseLife(amount.calculate(game, source, this), game, source, false); - return true; - } + Player targetController = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); + if (targetController != null) { + targetController.loseLife(amount.calculate(game, source, this), game, source, false); + return true; } return false; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryPutInPlayTargetControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryPutInPlayTargetControllerEffect.java index b4104e5c720..a66d2d5e9c4 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryPutInPlayTargetControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/search/SearchLibraryPutInPlayTargetControllerEffect.java @@ -7,7 +7,6 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.StaticFilters; import mage.game.Game; -import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; @@ -16,7 +15,7 @@ import mage.target.common.TargetCardInLibrary; */ public class SearchLibraryPutInPlayTargetControllerEffect extends SearchEffect { - private boolean tapped; + private final boolean tapped; public SearchLibraryPutInPlayTargetControllerEffect(boolean tapped) { this(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), tapped, Outcome.PutLandInPlay, "its controller"); @@ -45,22 +44,16 @@ public class SearchLibraryPutInPlayTargetControllerEffect extends SearchEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = getTargetPointer().getFirstTargetPermanentOrLKI(game, source); - if (permanent == null) { - return false; - } - Player player = game.getPlayer(permanent.getControllerId()); + Player player = getTargetPointer().getControllerOfFirstTargetOrLKI(game, source); if (player == null) { return false; } if (!player.chooseUse(outcome, "Search your library for " + target.getDescription() + '?', source, game)) { return true; } - if (player.searchLibrary(target, source, game)) { - if (!target.getTargets().isEmpty()) { - player.moveCards(new CardsImpl(target.getTargets()).getCards(game), - Zone.BATTLEFIELD, source, game, tapped, false, false, null); - } + if (player.searchLibrary(target, source, game) && !target.getTargets().isEmpty()) { + player.moveCards(new CardsImpl(target.getTargets()).getCards(game), + Zone.BATTLEFIELD, source, game, tapped, false, false, null); } player.shuffleLibrary(source, game); return true; diff --git a/Mage/src/main/java/mage/target/targetpointer/TargetPointer.java b/Mage/src/main/java/mage/target/targetpointer/TargetPointer.java index 5ba454b23b9..2dcff217576 100644 --- a/Mage/src/main/java/mage/target/targetpointer/TargetPointer.java +++ b/Mage/src/main/java/mage/target/targetpointer/TargetPointer.java @@ -3,6 +3,7 @@ package mage.target.targetpointer; import mage.abilities.Ability; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.Targets; import mage.util.Copyable; @@ -46,6 +47,13 @@ public interface TargetPointer extends Serializable, Copyable { */ Permanent getFirstTargetPermanentOrLKI(Game game, Ability source); + /** + * Finds the controller of the first target object or LKI, + * whether it is a permanent or spell. + * Returns null if not found. + */ + Player getControllerOfFirstTargetOrLKI(Game game, Ability source); + /** * Describes the appropriate subset of targets for ability text. */ diff --git a/Mage/src/main/java/mage/target/targetpointer/TargetPointerImpl.java b/Mage/src/main/java/mage/target/targetpointer/TargetPointerImpl.java index ea2c9cbe570..857061689ad 100644 --- a/Mage/src/main/java/mage/target/targetpointer/TargetPointerImpl.java +++ b/Mage/src/main/java/mage/target/targetpointer/TargetPointerImpl.java @@ -1,5 +1,11 @@ package mage.target.targetpointer; +import mage.abilities.Ability; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; + import java.util.HashMap; import java.util.Map; @@ -13,7 +19,7 @@ public abstract class TargetPointerImpl implements TargetPointer { private boolean initialized = false; - public TargetPointerImpl() { + protected TargetPointerImpl() { super(); } @@ -36,6 +42,21 @@ public abstract class TargetPointerImpl implements TargetPointer { this.initialized = true; } + @Override + public Player getControllerOfFirstTargetOrLKI(Game game, Ability source) { + Player targetController = null; + Permanent permanent = this.getFirstTargetPermanentOrLKI(game, source); + if (permanent != null) { + targetController = game.getPlayer(permanent.getControllerId()); + } else { + Spell spell = game.getSpellOrLKIStack(this.getFirst(game, source)); + if (spell != null) { + targetController = game.getPlayer(spell.getControllerId()); + } + } + return targetController; + } + @Override public String getData(String key) { if (data == null) {