From 31ca98faa109b1c28e3c5e09628d914daca4b322 Mon Sep 17 00:00:00 2001 From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com> Date: Sun, 9 Oct 2022 21:47:44 -0300 Subject: [PATCH] Refactored FirstTargetPointer, SecondTargetPointer, and ThirdTargetPointer to use a common implementation (#9634) --- Mage.Sets/src/mage/cards/a/AcquireTarget.java | 2 +- Mage.Sets/src/mage/cards/a/AgonyWarp.java | 2 +- Mage.Sets/src/mage/cards/a/AzoriusPloy.java | 2 +- .../src/mage/cards/c/CrawlFromTheCellar.java | 2 +- Mage.Sets/src/mage/cards/m/MartialGlory.java | 2 +- Mage.Sets/src/mage/cards/r/RallyManeuver.java | 4 +- Mage.Sets/src/mage/cards/r/Repurpose.java | 2 +- .../mage/abilities/effects/EffectImpl.java | 2 +- .../targetpointer/FirstTargetPointer.java | 122 +------------ .../targetpointer/NthTargetPointer.java | 161 ++++++++++++++++++ .../targetpointer/SecondTargetPointer.java | 119 +------------ .../targetpointer/ThirdTargetPointer.java | 123 +------------ 12 files changed, 182 insertions(+), 361 deletions(-) create mode 100644 Mage/src/main/java/mage/target/targetpointer/NthTargetPointer.java diff --git a/Mage.Sets/src/mage/cards/a/AcquireTarget.java b/Mage.Sets/src/mage/cards/a/AcquireTarget.java index 50e4f9f4b32..4df897f8045 100644 --- a/Mage.Sets/src/mage/cards/a/AcquireTarget.java +++ b/Mage.Sets/src/mage/cards/a/AcquireTarget.java @@ -32,7 +32,7 @@ public final class AcquireTarget extends CardImpl { // Put a bounty counter on up to one target creature an opponent controls. effect = new AddCountersTargetEffect(CounterType.BOUNTY.createInstance()); - effect.setTargetPointer(SecondTargetPointer.getInstance()); + effect.setTargetPointer(new SecondTargetPointer()); effect.setText("Put a bounty counter on up to one target creature an opponent controls."); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent(0, 1)); diff --git a/Mage.Sets/src/mage/cards/a/AgonyWarp.java b/Mage.Sets/src/mage/cards/a/AgonyWarp.java index e5a4acb8450..dc6042e02ba 100644 --- a/Mage.Sets/src/mage/cards/a/AgonyWarp.java +++ b/Mage.Sets/src/mage/cards/a/AgonyWarp.java @@ -25,7 +25,7 @@ public final class AgonyWarp extends CardImpl { // Target creature gets -0/-3 until end of turn. this.getSpellAbility().addTarget(new TargetCreaturePermanent().withChooseHint("-0/-3")); this.getSpellAbility().addEffect(new BoostTargetEffect(0, -3, Duration.EndOfTurn) - .setTargetPointer(SecondTargetPointer.getInstance()) + .setTargetPointer(new SecondTargetPointer()) .concatBy("
")); } diff --git a/Mage.Sets/src/mage/cards/a/AzoriusPloy.java b/Mage.Sets/src/mage/cards/a/AzoriusPloy.java index 9b066888ae4..b2b1517383a 100644 --- a/Mage.Sets/src/mage/cards/a/AzoriusPloy.java +++ b/Mage.Sets/src/mage/cards/a/AzoriusPloy.java @@ -34,7 +34,7 @@ public final class AzoriusPloy extends CardImpl { // Prevent all combat damage that would be dealt to target creature this turn. Effect effect2 = new PreventDamageToTargetEffect(Duration.EndOfTurn, true); effect2.setText("

Prevent all combat damage that would be dealt to target creature this turn."); - effect2.setTargetPointer(SecondTargetPointer.getInstance()); + effect2.setTargetPointer(new SecondTargetPointer()); this.getSpellAbility().addEffect(effect2); target = new TargetCreaturePermanent(new FilterCreaturePermanent("second creature (can be the same as the first)")); this.getSpellAbility().addTarget(target); diff --git a/Mage.Sets/src/mage/cards/c/CrawlFromTheCellar.java b/Mage.Sets/src/mage/cards/c/CrawlFromTheCellar.java index 84d2f9f38d8..488c1d69b57 100644 --- a/Mage.Sets/src/mage/cards/c/CrawlFromTheCellar.java +++ b/Mage.Sets/src/mage/cards/c/CrawlFromTheCellar.java @@ -33,7 +33,7 @@ public final class CrawlFromTheCellar extends CardImpl { this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect()); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); - this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()).setTargetPointer(SecondTargetPointer.getInstance())); + this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()).setTargetPointer(new SecondTargetPointer())); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(0, 1, filter, false)); // Flashback {3}{B} diff --git a/Mage.Sets/src/mage/cards/m/MartialGlory.java b/Mage.Sets/src/mage/cards/m/MartialGlory.java index 9db6f2eeb50..471cce89bd0 100644 --- a/Mage.Sets/src/mage/cards/m/MartialGlory.java +++ b/Mage.Sets/src/mage/cards/m/MartialGlory.java @@ -25,7 +25,7 @@ public final class MartialGlory extends CardImpl { // Target creature gets +0/+3 until end of turn. this.getSpellAbility().addTarget(new TargetCreaturePermanent().withChooseHint("+0/+3")); this.getSpellAbility().addEffect(new BoostTargetEffect(0, 3, Duration.EndOfTurn) - .setTargetPointer(SecondTargetPointer.getInstance()) + .setTargetPointer(new SecondTargetPointer()) .concatBy("
")); } diff --git a/Mage.Sets/src/mage/cards/r/RallyManeuver.java b/Mage.Sets/src/mage/cards/r/RallyManeuver.java index aff58fe3f59..fc7e7fbe24e 100644 --- a/Mage.Sets/src/mage/cards/r/RallyManeuver.java +++ b/Mage.Sets/src/mage/cards/r/RallyManeuver.java @@ -44,11 +44,11 @@ public final class RallyManeuver extends CardImpl { this.getSpellAbility().addTarget(target.withChooseHint("+0/+2 and lifelink")); this.getSpellAbility().addEffect(new BoostTargetEffect(0, 2) .setText("Up to one other target creature gets +0/+2") - .setTargetPointer(SecondTargetPointer.getInstance()) + .setTargetPointer(new SecondTargetPointer()) ); this.getSpellAbility().addEffect( new GainAbilityTargetEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, "and gains lifelink until end of turn") - .setTargetPointer(SecondTargetPointer.getInstance()) + .setTargetPointer(new SecondTargetPointer()) ); } diff --git a/Mage.Sets/src/mage/cards/r/Repurpose.java b/Mage.Sets/src/mage/cards/r/Repurpose.java index 25392ff4b16..ce4f772829b 100644 --- a/Mage.Sets/src/mage/cards/r/Repurpose.java +++ b/Mage.Sets/src/mage/cards/r/Repurpose.java @@ -28,7 +28,7 @@ public final class Repurpose extends CardImpl { // Return up to one target creature card from graveyard to your hand. Effect effect = new ReturnFromGraveyardToHandTargetEffect(); - effect.setTargetPointer(SecondTargetPointer.getInstance()); + effect.setTargetPointer(new SecondTargetPointer()); effect.setText("Return up to one target creature card from graveyard to your hand."); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); diff --git a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java index ca8fc97101f..086846611a6 100644 --- a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java @@ -21,7 +21,7 @@ public abstract class EffectImpl implements Effect { protected EffectType effectType; // read related docs about static and dynamic targets in ContinuousEffectImpl.affectedObjectsSet - protected TargetPointer targetPointer = FirstTargetPointer.getInstance(); + protected TargetPointer targetPointer = new FirstTargetPointer(); protected String staticText = ""; protected Map values; diff --git a/Mage/src/main/java/mage/target/targetpointer/FirstTargetPointer.java b/Mage/src/main/java/mage/target/targetpointer/FirstTargetPointer.java index 021142cbeb6..f3a9036a902 100644 --- a/Mage/src/main/java/mage/target/targetpointer/FirstTargetPointer.java +++ b/Mage/src/main/java/mage/target/targetpointer/FirstTargetPointer.java @@ -1,131 +1,17 @@ package mage.target.targetpointer; -import mage.MageObject; -import mage.abilities.Ability; -import mage.cards.Card; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.Targets; - -import java.util.*; - -public class FirstTargetPointer extends TargetPointerImpl { - - private Map zoneChangeCounter = new HashMap<>(); - - public static FirstTargetPointer getInstance() { - return new FirstTargetPointer(); - } +public class FirstTargetPointer extends NthTargetPointer { public FirstTargetPointer() { - super(); + super(1); } - public FirstTargetPointer(final FirstTargetPointer targetPointer) { - super(targetPointer); - - this.zoneChangeCounter = new HashMap<>(); - for (Map.Entry entry : targetPointer.zoneChangeCounter.entrySet()) { - this.zoneChangeCounter.put(entry.getKey(), entry.getValue()); - } - } - - @Override - public void init(Game game, Ability source) { - if (!source.getTargets().isEmpty()) { - for (UUID target : source.getTargets().get(0).getTargets()) { - Card card = game.getCard(target); - if (card != null) { - this.zoneChangeCounter.put(target, card.getZoneChangeCounter(game)); - } - } - } - } - - @Override - public List getTargets(Game game, Ability source) { - List target = new ArrayList<>(); - if (!source.getTargets().isEmpty()) { - for (UUID targetId : source.getTargets().get(0).getTargets()) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - // but no longer if new permanent is already on the battlefield - Permanent permanent = game.getPermanentOrLKIBattlefield(targetId); - if (permanent == null || permanent.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - continue; - } - } - target.add(targetId); - } - } - return target; - } - - @Override - public UUID getFirst(Game game, Ability source) { - UUID targetId = source.getFirstTarget(); - if (zoneChangeCounter.containsKey(targetId)) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - // because if dies trigger has to trigger as permanent has already moved zone, we have to check if target was on the battlefield immed. before - // but no longer if new permanent is already on the battlefield - Permanent permanent = game.getPermanentOrLKIBattlefield(targetId); - if (permanent == null || permanent.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - return null; - } - } - } - return targetId; + public FirstTargetPointer(final FirstTargetPointer firstTargetPointer) { + super(firstTargetPointer); } @Override public FirstTargetPointer copy() { return new FirstTargetPointer(this); } - - @Override - public FixedTarget getFixedTarget(Game game, Ability source) { - this.init(game, source); - UUID firstId = getFirst(game, source); - if (firstId != null) { - return new FixedTarget(firstId, game.getState().getZoneChangeCounter(firstId)); - } - return null; - - } - - @Override - public Permanent getFirstTargetPermanentOrLKI(Game game, Ability source) { - UUID targetId = source.getFirstTarget(); - Permanent permanent; - if (zoneChangeCounter.containsKey(targetId)) { - permanent = game.getPermanent(targetId); - if (permanent != null && permanent.getZoneChangeCounter(game) == zoneChangeCounter.get(targetId)) { - return permanent; - } - MageObject mageObject = game.getLastKnownInformation(targetId, Zone.BATTLEFIELD, zoneChangeCounter.get(targetId)); - if (mageObject instanceof Permanent) { - return (Permanent) mageObject; - } - } else { - permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - } - return permanent; - } - - @Override - public String describeTargets(Targets targets, String defaultDescription) { - return targets.isEmpty() ? defaultDescription : targets.get(0).getDescription(); - } - - @Override - public boolean isPlural(Targets targets) { - return !targets.isEmpty() && targets.get(0).getMaxNumberOfTargets() > 1; - } } diff --git a/Mage/src/main/java/mage/target/targetpointer/NthTargetPointer.java b/Mage/src/main/java/mage/target/targetpointer/NthTargetPointer.java new file mode 100644 index 00000000000..d0f755be48c --- /dev/null +++ b/Mage/src/main/java/mage/target/targetpointer/NthTargetPointer.java @@ -0,0 +1,161 @@ +package mage.target.targetpointer; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.cards.Card; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.Targets; + +import java.util.*; + +/** + * Class to create the Nth target pointer classes (FirstTargetPointer, SecondTargetPointer, etc._ + */ +public abstract class NthTargetPointer extends TargetPointerImpl { + + private static final Map emptyZoneChangeCounter = Collections.unmodifiableMap(new HashMap<>(0)); + private static final List emptyTargets = Collections.unmodifiableList(new ArrayList<>(0)); + + private Map zoneChangeCounter; + private int targetNumber; + + public NthTargetPointer(int targetNumber) { + super(); + this.targetNumber = targetNumber; + } + + public NthTargetPointer(final NthTargetPointer nthTargetPointer) { + super(nthTargetPointer); + this.targetNumber = nthTargetPointer.targetNumber; + + if (nthTargetPointer.zoneChangeCounter != null) { + this.zoneChangeCounter = new HashMap<>(nthTargetPointer.zoneChangeCounter.size()); + for (Map.Entry entry : nthTargetPointer.zoneChangeCounter.entrySet()) { + addToZoneChangeCounter(entry.getKey(), entry.getValue()); + } + } + } + + @Override + public void init(Game game, Ability source) { + if (source.getTargets().size() < targetNumber) { + return; + } + + for (UUID target : source.getTargets().get(targetIndex()).getTargets()) { + Card card = game.getCard(target); + if (card != null) { + addToZoneChangeCounter(target, card.getZoneChangeCounter(game)); + } + } + } + + @Override + public List getTargets(Game game, Ability source) { + if (source.getTargets().size() < targetNumber) { + return emptyTargets; + } + + List targetIds = source.getTargets().get(targetIndex()).getTargets(); + List finalTargetIds = new ArrayList<>(targetIds.size()); + + for (UUID targetId : targetIds) { + Card card = game.getCard(targetId); + if (card != null + && getZoneChangeCounter().containsKey(targetId) + && card.getZoneChangeCounter(game) != getZoneChangeCounter().get(targetId)) { + Permanent permanent = game.getPermanentOrLKIBattlefield(targetId); + if (permanent == null || permanent.getZoneChangeCounter(game) != getZoneChangeCounter().get(targetId)) { + continue; + } + } + + finalTargetIds.add(targetId); + } + return finalTargetIds; + } + + @Override + public UUID getFirst(Game game, Ability source) { + if (source.getTargets().size() < targetNumber) { + return null; + } + + UUID targetId = source.getTargets().get(targetIndex()).getFirstTarget(); + if (getZoneChangeCounter().containsKey(targetId)) { + Card card = game.getCard(targetId); + if (card != null && getZoneChangeCounter().containsKey(targetId) + && card.getZoneChangeCounter(game) != getZoneChangeCounter().get(targetId)) { + return null; + } + } + return targetId; + + } + + @Override + public FixedTarget getFixedTarget(Game game, Ability source) { + this.init(game, source); + UUID firstId = getFirst(game, source); + if (firstId != null) { + return new FixedTarget(firstId, game.getState().getZoneChangeCounter(firstId)); + } + + return null; + } + + @Override + public Permanent getFirstTargetPermanentOrLKI(Game game, Ability source) { + if (source.getTargets().size() < targetNumber) { + return null; + } + + Permanent permanent; + UUID targetId = source.getTargets().get(targetIndex()).getFirstTarget(); + + if (getZoneChangeCounter().containsKey(targetId)) { + permanent = game.getPermanent(targetId); + if (permanent != null && permanent.getZoneChangeCounter(game) == getZoneChangeCounter().get(targetId)) { + return permanent; + } + MageObject mageObject = game.getLastKnownInformation(targetId, Zone.BATTLEFIELD, getZoneChangeCounter().get(targetId)); + if (mageObject instanceof Permanent) { + return (Permanent) mageObject; + } + + } else { + permanent = game.getPermanent(targetId); + if (permanent == null) { + permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); + } + } + return permanent; + } + + @Override + public String describeTargets(Targets targets, String defaultDescription) { + return targets.size() < targetNumber ? defaultDescription : targets.get(targetIndex()).getDescription(); + } + + @Override + public boolean isPlural(Targets targets) { + return targets.size() > targetIndex() && targets.get(targetIndex()).getMaxNumberOfTargets() > 1; + } + + private int targetIndex() { + return targetNumber - 1; + } + + private Map getZoneChangeCounter() { + return zoneChangeCounter != null ? zoneChangeCounter : emptyZoneChangeCounter; + } + + private void addToZoneChangeCounter(UUID key, Integer value) { + if (zoneChangeCounter == null) { + zoneChangeCounter = new HashMap<>(); + } + getZoneChangeCounter().put(key, value); + } +} diff --git a/Mage/src/main/java/mage/target/targetpointer/SecondTargetPointer.java b/Mage/src/main/java/mage/target/targetpointer/SecondTargetPointer.java index 7fa4a5b4d92..e2502d0024b 100644 --- a/Mage/src/main/java/mage/target/targetpointer/SecondTargetPointer.java +++ b/Mage/src/main/java/mage/target/targetpointer/SecondTargetPointer.java @@ -1,128 +1,17 @@ package mage.target.targetpointer; -import mage.MageObject; -import mage.abilities.Ability; -import mage.cards.Card; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.Targets; - -import java.util.*; - -public class SecondTargetPointer extends TargetPointerImpl { - - private Map zoneChangeCounter = new HashMap<>(); - - public static SecondTargetPointer getInstance() { - return new SecondTargetPointer(); - } +public class SecondTargetPointer extends NthTargetPointer { public SecondTargetPointer() { - super(); + super(2); } - public SecondTargetPointer(final SecondTargetPointer targetPointer) { - super(targetPointer); - - this.zoneChangeCounter = new HashMap<>(); - for (Map.Entry entry : targetPointer.zoneChangeCounter.entrySet()) { - this.zoneChangeCounter.put(entry.getKey(), entry.getValue()); - } - } - - @Override - public void init(Game game, Ability source) { - if (source.getTargets().size() > 1) { - for (UUID target : source.getTargets().get(1).getTargets()) { - Card card = game.getCard(target); - if (card != null) { - this.zoneChangeCounter.put(target, card.getZoneChangeCounter(game)); - } - } - } - } - - @Override - public List getTargets(Game game, Ability source) { - List target = new ArrayList<>(); - if (source.getTargets().size() > 1) { - for (UUID targetId : source.getTargets().get(1).getTargets()) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - continue; - } - target.add(targetId); - } - } - return target; - } - - @Override - public UUID getFirst(Game game, Ability source) { - if (source.getTargets().size() > 1) { - UUID targetId = source.getTargets().get(1).getFirstTarget(); - if (zoneChangeCounter.containsKey(targetId)) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - return null; - } - } - return targetId; - } - return null; + public SecondTargetPointer(final SecondTargetPointer secondTargetPointer) { + super(secondTargetPointer); } @Override public SecondTargetPointer copy() { return new SecondTargetPointer(this); } - - @Override - public FixedTarget getFixedTarget(Game game, Ability source) { - this.init(game, source); - UUID firstId = getFirst(game, source); - if (firstId != null) { - return new FixedTarget(firstId, game.getState().getZoneChangeCounter(firstId)); - } - return null; - } - - @Override - public Permanent getFirstTargetPermanentOrLKI(Game game, Ability source) { - if (source.getTargets().size() > 1) { - Permanent permanent; - UUID targetId = source.getTargets().get(1).getFirstTarget(); - if (zoneChangeCounter.containsKey(targetId)) { - permanent = game.getPermanent(targetId); - if (permanent != null && permanent.getZoneChangeCounter(game) == zoneChangeCounter.get(targetId)) { - return permanent; - } - MageObject mageObject = game.getLastKnownInformation(targetId, Zone.BATTLEFIELD, zoneChangeCounter.get(targetId)); - if (mageObject instanceof Permanent) { - return (Permanent) mageObject; - } - - } else { - permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - } - return permanent; - } - return null; - } - - @Override - public String describeTargets(Targets targets, String defaultDescription) { - return targets.size() < 2 ? defaultDescription : targets.get(1).getDescription(); - } - - @Override - public boolean isPlural(Targets targets) { - return targets.size() > 1 && targets.get(1).getMaxNumberOfTargets() > 1; - } } diff --git a/Mage/src/main/java/mage/target/targetpointer/ThirdTargetPointer.java b/Mage/src/main/java/mage/target/targetpointer/ThirdTargetPointer.java index 17891a0358d..20e4dd7cae3 100644 --- a/Mage/src/main/java/mage/target/targetpointer/ThirdTargetPointer.java +++ b/Mage/src/main/java/mage/target/targetpointer/ThirdTargetPointer.java @@ -1,132 +1,17 @@ package mage.target.targetpointer; -import mage.MageObject; -import mage.abilities.Ability; -import mage.cards.Card; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.target.Targets; - -import java.util.*; - -/** - * @author LevelX2 - */ -public class ThirdTargetPointer extends TargetPointerImpl { - - private Map zoneChangeCounter = new HashMap<>(); - - public static ThirdTargetPointer getInstance() { - return new ThirdTargetPointer(); - } +public class ThirdTargetPointer extends NthTargetPointer { public ThirdTargetPointer() { - super(); + super(3); } - public ThirdTargetPointer(final ThirdTargetPointer targetPointer) { - super(targetPointer); - - this.zoneChangeCounter = new HashMap<>(); - for (Map.Entry entry : targetPointer.zoneChangeCounter.entrySet()) { - this.zoneChangeCounter.put(entry.getKey(), entry.getValue()); - } - } - - @Override - public void init(Game game, Ability source) { - if (source.getTargets().size() > 2) { - for (UUID target : source.getTargets().get(2).getTargets()) { - Card card = game.getCard(target); - if (card != null) { - this.zoneChangeCounter.put(target, card.getZoneChangeCounter(game)); - } - } - } - } - - @Override - public List getTargets(Game game, Ability source) { - List target = new ArrayList<>(); - if (source.getTargets().size() > 2) { - for (UUID targetId : source.getTargets().get(2).getTargets()) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - continue; - } - target.add(targetId); - } - } - return target; - } - - @Override - public UUID getFirst(Game game, Ability source) { - if (source.getTargets().size() > 2) { - UUID targetId = source.getTargets().get(2).getFirstTarget(); - if (zoneChangeCounter.containsKey(targetId)) { - Card card = game.getCard(targetId); - if (card != null && zoneChangeCounter.containsKey(targetId) - && card.getZoneChangeCounter(game) != zoneChangeCounter.get(targetId)) { - return null; - } - } - return targetId; - } - return null; + public ThirdTargetPointer(final ThirdTargetPointer thirdTargetPointer) { + super(thirdTargetPointer); } @Override public ThirdTargetPointer copy() { return new ThirdTargetPointer(this); } - - @Override - public FixedTarget getFixedTarget(Game game, Ability source) { - this.init(game, source); - UUID firstId = getFirst(game, source); - if (firstId != null) { - return new FixedTarget(firstId, game.getState().getZoneChangeCounter(firstId)); - } - return null; - - } - - @Override - public Permanent getFirstTargetPermanentOrLKI(Game game, Ability source) { - if (source.getTargets().size() > 2) { - Permanent permanent; - UUID targetId = source.getTargets().get(2).getFirstTarget(); - if (zoneChangeCounter.containsKey(targetId)) { - permanent = game.getPermanent(targetId); - if (permanent != null && permanent.getZoneChangeCounter(game) == zoneChangeCounter.get(targetId)) { - return permanent; - } - MageObject mageObject = game.getLastKnownInformation(targetId, Zone.BATTLEFIELD, zoneChangeCounter.get(targetId)); - if (mageObject instanceof Permanent) { - return (Permanent) mageObject; - } - - } else { - permanent = game.getPermanent(targetId); - if (permanent == null) { - permanent = (Permanent) game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - } - } - return permanent; - } - return null; - } - - @Override - public String describeTargets(Targets targets, String defaultDescription) { - return targets.size() < 3 ? defaultDescription : targets.get(2).getDescription(); - } - - @Override - public boolean isPlural(Targets targets) { - return targets.size() > 2 && targets.get(2).getMaxNumberOfTargets() > 1; - } }