refactor: improved usage of target pointers

This commit is contained in:
Oleg Agafonov 2024-02-18 15:38:53 +04:00
parent 78612ddc91
commit 46d751f996
476 changed files with 548 additions and 563 deletions

View file

@ -228,6 +228,8 @@ public interface Ability extends Controllable, Serializable {
* Retrieves the {@link Target} located at the 0th index in the
* {@link Targets}. A call to the method is equivalent to
* {@link #getTargets()}.get(0).getFirstTarget().
* <p>
* Warning, if you effect uses target pointers then it must search getTargetPointer too
*
* @return The {@link java.util.UUID} of the first target within the targets
* list.

View file

@ -165,7 +165,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
@Override
public void init(Ability source, Game game, UUID activePlayerId) {
targetPointer.init(game, source);
getTargetPointer().init(game, source);
// 20210112 - 611.2c
// 611.2c If a continuous effect generated by the resolution of a spell or ability modifies the
// characteristics or changes the controller of any objects, the set of objects it affects is

View file

@ -22,8 +22,7 @@ public abstract class EffectImpl implements Effect {
// read related docs about static and dynamic targets in ContinuousEffectImpl.affectedObjectsSet
// warning, do not change it directly, use setTargetPointer instead
// TODO: make it private and replace all usage to getTargetPointer
protected TargetPointer targetPointer = new FirstTargetPointer();
private TargetPointer targetPointer = new FirstTargetPointer();
protected String staticText = "";
protected Map<String, Object> values;

View file

@ -19,7 +19,7 @@ public abstract class OneShotEffect extends EffectImpl {
@Override
public final void initNewTargetPointer() {
// one short effects don't use init logic
this.targetPointer.setInitialized();
this.getTargetPointer().setInitialized();
}
protected OneShotEffect(final OneShotEffect effect) {

View file

@ -35,7 +35,7 @@ public class BecomeBlockedTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Set<MageObjectReference> morSet = new HashSet<>();
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(targetId);
if (permanent == null) {
continue;

View file

@ -79,12 +79,12 @@ public class CopyTargetSpellEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Spell spell;
if (useLKI) {
spell = game.getSpellOrLKIStack(targetPointer.getFirst(game, source));
spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source));
} else {
spell = game.getStack().getSpell(targetPointer.getFirst(game, source));
spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
}
if (spell == null) {
spell = (Spell) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK);
spell = (Spell) game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK);
}
if (spell != null) {
spell.createCopyOnStack(game, source, useController ? spell.getControllerId() : source.getControllerId(),

View file

@ -22,7 +22,7 @@ public class CopyTargetStackAbilityEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(targetPointer.getFirst(game, source));
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(getTargetPointer().getFirst(game, source));
if (stackAbility == null) {
return false;
}

View file

@ -60,7 +60,7 @@ public class CounterUnlessPaysEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source));
StackObject spell = game.getStack().getStackObject(getTargetPointer().getFirst(game, source));
if (spell == null) {
return false;
}

View file

@ -63,7 +63,7 @@ public class CreateTokenTargetEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
int value = amount.calculate(game, source, this);
if (value > 0) {
return token.putOntoBattlefield(value, game, source, targetPointer.getFirst(game, source), tapped, attacking, (UUID) getValue("playerToAttack"));
return token.putOntoBattlefield(value, game, source, getTargetPointer().getFirst(game, source), tapped, attacking, (UUID) getValue("playerToAttack"));
}
return true;
}

View file

@ -47,7 +47,7 @@ public class DamageAllControlledTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayerOrPlaneswalkerController(targetPointer.getFirst(game, source));
Player player = game.getPlayerOrPlaneswalkerController(getTargetPointer().getFirst(game, source));
if (player == null) {
return false;
}

View file

@ -41,7 +41,7 @@ public class DamageWithExcessEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
MageObject sourceObject = source.getSourceObject(game);
if (permanent == null || sourceObject == null) {
return false;

View file

@ -51,7 +51,7 @@ public class DestroyTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(permanentId);
if (permanent != null
&& permanent.isPhasedIn()

View file

@ -108,7 +108,7 @@ class DetainRestrictionEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return this.targetPointer.getTargets(game, source).contains(permanent.getId());
return this.getTargetPointer().getTargets(game, source).contains(permanent.getId());
}
@Override

View file

@ -48,7 +48,7 @@ public class DontUntapInControllersUntapStepTargetEffect extends ContinuousRuleM
if (game.getTurnStepType() != PhaseStep.UNTAP) {
return false;
}
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
if (!event.getTargetId().equals(targetId)) {
continue;
}

View file

@ -32,7 +32,7 @@ public class ExileCardYouChooseTargetOpponentEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player opponent = game.getPlayer(targetPointer.getFirst(game, source));
Player opponent = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || opponent == null) {
return false;
}

View file

@ -52,7 +52,7 @@ public class ExileFromZoneTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player == null) {
return false;
}

View file

@ -55,14 +55,14 @@ public class ExileTargetForSourceEffect extends OneShotEffect {
}
Set<UUID> objectsToMove = new LinkedHashSet<>();
if (this.targetPointer instanceof FirstTargetPointer
if (this.getTargetPointer() instanceof FirstTargetPointer
&& source.getTargets().size() > 1) {
for (Target target : source.getTargets()) {
objectsToMove.addAll(target.getTargets());
}
} else {
if (this.targetPointer != null && !this.targetPointer.getTargets(game, source).isEmpty()) {
objectsToMove.addAll(this.targetPointer.getTargets(game, source));
if (!this.getTargetPointer().getTargets(game, source).isEmpty()) {
objectsToMove.addAll(this.getTargetPointer().getTargets(game, source));
} else {
// issue with Madness keyword #6889
UUID fixedTargetId = null;

View file

@ -56,9 +56,7 @@ public class ExileUntilSourceLeavesEffect extends OneShotEffect {
}
ExileTargetEffect effect = new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName());
if (this.getTargetPointer() != null) { // Grasping Giant
effect.setTargetPointer(this.getTargetPointer().copy());
}
effect.setTargetPointer(this.getTargetPointer().copy());
if (effect.apply(game, source)) {
game.addDelayedTriggeredAbility(new OnLeaveReturnExiledAbility(returnToZone), source);
return true;

View file

@ -39,7 +39,7 @@ public class GainLifeTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
for (UUID playerId : targetPointer.getTargets(game, source)) {
for (UUID playerId : getTargetPointer().getTargets(game, source)) {
Player player = game.getPlayer(playerId);
if (player != null) {
player.gainLife(life.calculate(game, source, this), game, source);

View file

@ -32,11 +32,11 @@ public class ImprintTargetEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
if (sourcePermanent != null) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent != null) {
sourcePermanent.imprint(permanent.getId(), game);
} else {
Card card = game.getCard(targetPointer.getFirst(game, source));
Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (card != null) {
sourcePermanent.imprint(card.getId(), game);
}

View file

@ -28,7 +28,7 @@ public class LoseHalfLifeTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
Integer amount = (int) Math.ceil(player.getLife() / 2f);
if (amount > 0) {

View file

@ -42,11 +42,11 @@ public class LoseLifeTargetControllerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
MageObject targetCard = targetPointer.getFirstTargetPermanentOrLKI(game, source);
MageObject targetCard = getTargetPointer().getFirstTargetPermanentOrLKI(game, source);
// if target is a countered spell
if (targetCard == null) {
targetCard = game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.STACK);
targetCard = game.getLastKnownInformation(getTargetPointer().getFirst(game, source), Zone.STACK);
}
if (targetCard != null) {

View file

@ -40,7 +40,7 @@ public class LoseLifeTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
boolean applied = false;
for (UUID playerId : targetPointer.getTargets(game, source)) {
for (UUID playerId : getTargetPointer().getTargets(game, source)) {
Player player = game.getPlayer(playerId);
if (player != null
&& player.loseLife(amount.calculate(game, source, this), game, source, false) > 0) {

View file

@ -23,7 +23,7 @@ public class MayTapOrUntapTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent target = game.getPermanent(targetPointer.getFirst(game, source));
Permanent target = game.getPermanent(getTargetPointer().getFirst(game, source));
Player player = game.getPlayer(source.getControllerId());
if (target != null && player != null) {
if (target.isTapped()) {

View file

@ -38,7 +38,7 @@ public class MillCardsTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
player.millCards(numberCards.calculate(game, source, this), source, game);
return true;

View file

@ -45,7 +45,7 @@ public class PreventDamageToTargetEffect extends PreventionEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return !this.used && super.applies(event, source, game) && event.getTargetId().equals(targetPointer.getFirst(game, source));
return !this.used && super.applies(event, source, game) && event.getTargetId().equals(getTargetPointer().getFirst(game, source));
}
@Override

View file

@ -57,7 +57,7 @@ public class PreventNextDamageFromChosenSourceToTargetEffect extends PreventionE
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (!this.used && super.applies(event, source, game)) {
if (event.getTargetId().equals(targetPointer.getFirst(game, source)) && event.getSourceId().equals(targetSource.getFirstTarget())) {
if (event.getTargetId().equals(getTargetPointer().getFirst(game, source)) && event.getSourceId().equals(targetSource.getFirstTarget())) {
return true;
}
}

View file

@ -54,7 +54,7 @@ public class PutOnLibraryTargetEffect extends OneShotEffect {
if (controller != null) {
List<Card> cards = new ArrayList<>();
List<Permanent> permanents = new ArrayList<>();
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
switch (game.getState().getZone(targetId)) {
case BATTLEFIELD:
Permanent permanent = game.getPermanent(targetId);

View file

@ -39,7 +39,7 @@ public class RegenerateSourceWithReflexiveEffect extends RegenerateSourceEffect
if (super.replaceEvent(event, source, game)) {
if (this.setReflexiveTarget) {
reflexive.getEffects().setTargetPointer(
new FixedTarget(targetPointer.getFirst(game, source), game)
new FixedTarget(getTargetPointer().getFirst(game, source), game)
);
}
game.fireReflexiveTriggeredAbility(reflexive, source);

View file

@ -26,7 +26,7 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl {
@Override
public void init(Ability source, Game game) {
super.init(source, game);
RegenerateSourceEffect.initRegenerationShieldInfo(game, source, targetPointer.getFirst(game, source));
RegenerateSourceEffect.initRegenerationShieldInfo(game, source, getTargetPointer().getFirst(game, source));
}
@Override
@ -37,7 +37,7 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl {
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
//20110204 - 701.11
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent != null && permanent.regenerate(source, game)) {
this.used = true;
return true;
@ -53,7 +53,7 @@ public class RegenerateTargetEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
//20110204 - 701.11c - event.getAmount() is used to signal if regeneration is allowed
return event.getAmount() == 0 && event.getTargetId().equals(targetPointer.getFirst(game, source)) && !this.used;
return event.getAmount() == 0 && event.getTargetId().equals(getTargetPointer().getFirst(game, source)) && !this.used;
}
@Override

View file

@ -39,7 +39,7 @@ public class ReturnToHandTargetEffect extends OneShotEffect {
}
List<UUID> copyIds = new ArrayList<>();
Set<Card> cards = new LinkedHashSet<>();
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
MageObject mageObject = game.getObject(targetId);
if (mageObject != null) {
if (mageObject instanceof Spell

View file

@ -51,7 +51,7 @@ public class SacrificeEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
boolean applied = false;
for (UUID playerId : targetPointer.getTargets(game, source)) {
for (UUID playerId : getTargetPointer().getTargets(game, source)) {
Player player = game.getPlayer(playerId);
if (player == null) {
continue;

View file

@ -49,7 +49,7 @@ public class SacrificeTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(permanentId);
if (permanent != null && (playerIdThatHasToSacrifice == null || playerIdThatHasToSacrifice.equals(permanent.getControllerId()))) {
permanent.sacrifice(source, game);

View file

@ -38,7 +38,7 @@ public class SetPlayerLifeTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
player.setLife(amount.calculate(game, source, this), game, source);
return true;

View file

@ -29,7 +29,7 @@ public class ShuffleLibraryTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
player.shuffleLibrary(source, game);
return true;

View file

@ -39,6 +39,6 @@ public class SkipCombatStepEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return event.getPlayerId().equals(targetPointer.getFirst(game, source));
return event.getPlayerId().equals(getTargetPointer().getFirst(game, source));
}
}

View file

@ -31,13 +31,11 @@ public class SkipNextPlayerUntapStepEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = null;
if (targetPointer != null) {
if (!this.targetPointer.getTargets(game, source).isEmpty()) {
player = game.getPlayer(targetPointer.getFirst(game, source));
} else {
player = game.getPlayer(source.getControllerId());
}
Player player;
if (!this.getTargetPointer().getTargets(game, source).isEmpty()) {
player = game.getPlayer(getTargetPointer().getFirst(game, source));
} else {
player = game.getPlayer(source.getControllerId());
}
if (player != null) {
game.getState().getTurnMods().add(new TurnMod(player.getId()).withSkipStep(PhaseStep.UNTAP));

View file

@ -30,7 +30,7 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents(filter, player.getId(), game);
for (Permanent p : permanents) {

View file

@ -38,7 +38,7 @@ public class TapTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
for (UUID target : targetPointer.getTargets(game, source)) {
for (UUID target : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(target);
if (permanent != null) {
permanent.tap(source, game);

View file

@ -36,7 +36,7 @@ public class UntapTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
for (UUID target : targetPointer.getTargets(game, source)) {
for (UUID target : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(target);
if (permanent != null) {
permanent.untap(game);

View file

@ -22,7 +22,7 @@ public class CantAttackBlockTargetEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getId().equals(targetPointer.getFirst(game, source));
return permanent.getId().equals(getTargetPointer().getFirst(game, source));
}
@Override

View file

@ -22,7 +22,7 @@ public class CantAttackTargetEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getId().equals(targetPointer.getFirst(game, source));
return permanent.getId().equals(getTargetPointer().getFirst(game, source));
}
@Override

View file

@ -60,7 +60,7 @@ public class CantBlockAttachedEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
if (affectedObjectsSet) {
return targetPointer.getFirst(game, source).equals(permanent.getId());
return getTargetPointer().getFirst(game, source).equals(permanent.getId());
}
return permanent.getAttachments().contains(source.getSourceId());
}

View file

@ -22,7 +22,7 @@ public class CantBlockTargetEffect extends RestrictionEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return this.targetPointer.getTargets(game, source).contains(permanent.getId());
return this.getTargetPointer().getTargets(game, source).contains(permanent.getId());
}
@Override

View file

@ -28,7 +28,7 @@ public class AddCardSubTypeTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
Permanent target = game.getPermanent(targetPointer.getFirst(game, source));
Permanent target = game.getPermanent(getTargetPointer().getFirst(game, source));
if (target != null) {
target.addSubType(game, addedSubType);
} else {

View file

@ -40,7 +40,7 @@ public class AddCardTypeTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
boolean result = false;
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
Permanent target = game.getPermanent(targetId);
if (target != null) {
for (CardType cardType : addedCardTypes) {

View file

@ -50,6 +50,6 @@ public class AssignNoCombatDamageTargetEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
return ((DamageEvent) event).isCombatDamage() && event.getSourceId().equals(targetPointer.getFirst(game, source));
return ((DamageEvent) event).isCombatDamage() && event.getSourceId().equals(getTargetPointer().getFirst(game, source));
}
}

View file

@ -97,7 +97,7 @@ public class BecomesBasicLandTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
for (UUID targetPermanent : targetPointer.getTargets(game, source)) {
for (UUID targetPermanent : getTargetPointer().getTargets(game, source)) {
Permanent land = game.getPermanent(targetPermanent);
if (land == null) {
continue;

View file

@ -78,7 +78,7 @@ public class BecomesColorTargetEffect extends ContinuousEffectImpl {
}
if (setColor != null) {
boolean objectFound = false;
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
MageObject targetObject = game.getObject(targetId);
if (targetObject != null) {
if (targetObject instanceof Spell || targetObject instanceof Permanent) {

View file

@ -80,7 +80,7 @@ public class BecomesCreatureTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
boolean result = false;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(permanentId);
if (permanent == null) {
continue;

View file

@ -52,7 +52,7 @@ public class BecomesCreatureTypeTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
boolean flag = false;
for (UUID targetPermanent : targetPointer.getTargets(game, source)) {
for (UUID targetPermanent : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(targetPermanent);
if (permanent == null) {
continue;

View file

@ -69,7 +69,7 @@ public class BoostEnchantedEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) {
Permanent permanent = null;
if (affectedObjectsSet) {
permanent = game.getPermanent(targetPointer.getFirst(game, source));
permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent == null) {
discard();
return true;

View file

@ -72,7 +72,7 @@ public class BoostEquippedEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) {
Permanent creature = null;
if (fixedTarget) {
creature = game.getPermanent(targetPointer.getFirst(game, source));
creature = game.getPermanent(getTargetPointer().getFirst(game, source));
} else {
Permanent equipment = game.getPermanent(source.getSourceId());
if (equipment != null && equipment.getAttachedTo() != null) {

View file

@ -68,7 +68,7 @@ public class BoostTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent target = game.getPermanent(permanentId);
if (target != null && target.isCreature(game)) {
target.addPower(power.calculate(game, source, this));

View file

@ -79,10 +79,10 @@ public class ExchangeControlTargetEffect extends ContinuousEffectImpl {
Permanent permanent2 = null;
if (withSource) {
permanent1 = game.getPermanent(targetPointer.getFirst(game, source));
permanent1 = game.getPermanent(getTargetPointer().getFirst(game, source));
permanent2 = game.getPermanent(source.getSourceId());
} else {
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
if (permanent1 == null) {
permanent1 = game.getPermanent(permanentId);
} else if (permanent2 == null) {

View file

@ -90,7 +90,7 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) {
Permanent permanent;
if (affectedObjectsSet) {
permanent = game.getPermanent(targetPointer.getFirst(game, source));
permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent == null) {
discard();
return true;

View file

@ -60,7 +60,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl {
// must support dynamic targets from static ability and static targets from activated abilities
if (this.affectedObjectsSet) {
// target permanents (by default)
targetPointer.getTargets(game, source)
getTargetPointer().getTargets(game, source)
.stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
@ -70,7 +70,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl {
// target cards with linked permanents
if (this.useOnCard) {
targetPointer.getTargets(game, source)
getTargetPointer().getTargets(game, source)
.stream()
.map(game::getCard)
.filter(Objects::nonNull)
@ -147,7 +147,7 @@ public class GainAbilityTargetEffect extends ContinuousEffectImpl {
}
} else {
// DYNAMIC TARGETS
for (UUID objectId : targetPointer.getTargets(game, source)) {
for (UUID objectId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(objectId);
if (permanent != null) {
permanent.addAbility(ability, source.getSourceId(), game);

View file

@ -73,7 +73,7 @@ public class GainAbilityWithAttachmentEffect extends ContinuousEffectImpl {
public boolean apply(Game game, Ability source) {
Permanent permanent = null;
if (affectedObjectsSet) {
permanent = game.getPermanent(targetPointer.getFirst(game, source));
permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent == null) {
discard();
return true;

View file

@ -33,7 +33,7 @@ public class GainAllCreatureTypesTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent target = game.getPermanent(permanentId);
if (target != null) {
target.setIsAllCreatureTypes(game, true);

View file

@ -35,7 +35,7 @@ public class LoseAllAbilitiesTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
for (UUID permanentId : targetPointer.getTargets(game, source)) {
for (UUID permanentId : getTargetPointer().getTargets(game, source)) {
Permanent permanent = game.getPermanent(permanentId);
if (permanent != null) {
permanent.removeAllAbilities(source.getSourceId(), game);

View file

@ -41,7 +41,7 @@ public class LoseArtifactTypeTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
for (UUID targetId : targetPointer.getTargets(game, source)) {
for (UUID targetId : getTargetPointer().getTargets(game, source)) {
if (targetId == null) {
continue;
}

View file

@ -57,7 +57,7 @@ public class AddCountersTargetEffect extends OneShotEffect {
MageObject sourceObject = game.getObject(source);
if (controller != null && sourceObject != null && counter != null) {
int affectedTargets = 0;
for (UUID uuid : targetPointer.getTargets(game, source)) {
for (UUID uuid : getTargetPointer().getTargets(game, source)) {
Counter newCounter = counter.copy();
int calculated = amount.calculate(game, source, this); // 0 -- you must use default couner
if (calculated < 0) {
@ -72,7 +72,7 @@ public class AddCountersTargetEffect extends OneShotEffect {
Permanent permanent = game.getPermanent(uuid);
Player player = game.getPlayer(uuid);
Card card = game.getCard(targetPointer.getFirst(game, source));
Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (permanent != null) {
permanent.addCounters(newCounter, source.getControllerId(), source, game);
affectedTargets++;

View file

@ -38,7 +38,7 @@ public class AddPoisonCounterTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
player.addCounters(CounterType.POISON.createInstance(amount), source.getControllerId(), source, game);
return true;

View file

@ -37,8 +37,8 @@ public class MoveCountersTargetsEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent removeTargetCreature = game.getPermanent(targetPointer.getTargets(game, source).get(0));
Permanent addTargetCreature = game.getPermanent(targetPointer.getTargets(game, source).get(1));
Permanent removeTargetCreature = game.getPermanent(getTargetPointer().getTargets(game, source).get(0));
Permanent addTargetCreature = game.getPermanent(getTargetPointer().getTargets(game, source).get(1));
if (removeTargetCreature != null && addTargetCreature != null && removeTargetCreature.getCounters(game).getCount(counterType) >= amount) {
removeTargetCreature.removeCounters(counterType.createInstance(amount), source, game);
addTargetCreature.addCounters(counterType.createInstance(amount), source.getControllerId(), source, game);

View file

@ -29,7 +29,7 @@ public class RemoveAllCountersTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if(permanent != null) {
int count = permanent.getCounters(game).getCount(counterType);
permanent.removeCounters(counterType.getName(), count, source, game);

View file

@ -89,7 +89,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (player == null || controller == null) {
return false;

View file

@ -58,7 +58,7 @@ public class DiscardTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
for (UUID targetPlayerId : targetPointer.getTargets(game, source)) {
for (UUID targetPlayerId : getTargetPointer().getTargets(game, source)) {
Player player = game.getPlayer(targetPlayerId);
if (player != null) {
player.discard(amount.calculate(game, source, this), randomDiscard, false, source, game);

View file

@ -33,7 +33,7 @@ public class CombatDamageByToughnessTargetEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
Set<Permanent> set = targetPointer.getTargets(game, source).stream()
Set<Permanent> set = getTargetPointer().getTargets(game, source).stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
.collect(Collectors.toSet());

View file

@ -142,7 +142,7 @@ class GraftDistributeCounterEffect extends OneShotEffect {
if (sourcePermanent != null) {
int numberOfCounters = sourcePermanent.getCounters(game).getCount(CounterType.P1P1);
if (numberOfCounters > 0) {
Permanent targetCreature = game.getPermanent(targetPointer.getFirst(game, source));
Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
if (targetCreature != null) {
sourcePermanent.removeCounters(CounterType.P1P1.getName(), 1, source, game);
targetCreature.addCounters(CounterType.P1P1.createInstance(1), source.getControllerId(), source, game);

View file

@ -180,7 +180,7 @@ class HauntEffect extends OneShotEffect {
if (player == null || card == null) {
return false;
}
Permanent hauntedCreature = game.getPermanent(targetPointer.getFirst(game, source));
Permanent hauntedCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
// haunting card will only be moved to exile, if
if (hauntedCreature == null) {
return false;
@ -193,7 +193,7 @@ class HauntEffect extends OneShotEffect {
.append(source.getSourceId().toString())
.append(card.getZoneChangeCounter(game)
+ hauntedCreature.getZoneChangeCounter(game)).toString(); // in case it is blinked
game.getState().setValue(key, new FixedTarget(targetPointer.getFirst(game, source), game));
game.getState().setValue(key, new FixedTarget(getTargetPointer().getFirst(game, source), game));
card.addInfo("hauntinfo", new StringBuilder("Haunting ").append(hauntedCreature.getLogName()).toString(), game);
hauntedCreature.addInfo("hauntinfo", new StringBuilder("Haunted by ").append(card.getLogName()).toString(), game);
game.informPlayers(new StringBuilder(card.getName()).append(" haunting ").append(hauntedCreature.getLogName()).toString());

View file

@ -79,7 +79,7 @@ class MentorEffect extends AddCountersTargetEffect {
return false;
}
Permanent mentoredPermanent = game.getPermanent(targetPointer.getFirst(game, source));
Permanent mentoredPermanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (mentoredPermanent == null) {
return false;
}

View file

@ -150,7 +150,7 @@ class ModularDistributeCounterEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent sourcePermanent = (Permanent) getValue("permanentLeftBattlefield");
Permanent targetArtifact = game.getPermanent(targetPointer.getFirst(game, source));
Permanent targetArtifact = game.getPermanent(getTargetPointer().getFirst(game, source));
Player player = game.getPlayer(source.getControllerId());
if (sourcePermanent != null && targetArtifact != null && player != null) {
int numberOfCounters = sourcePermanent.getCounters(game).getCount(CounterType.P1P1);

View file

@ -77,7 +77,7 @@ class ProvokeRequirementEffect extends RequirementEffect {
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getId().equals(targetPointer.getFirst(game, source));
return permanent.getId().equals(getTargetPointer().getFirst(game, source));
}
@Override

View file

@ -15,7 +15,9 @@ public interface TargetPointer extends Serializable, Copyable<TargetPointer> {
/**
* Init dynamic targets (must save current targets zcc to fizzle it later on outdated targets)
* - one shot effects: no needs to init
* - continues effects: must use init logic
* - continues effects: must use init logic (effect init on resolve or game add)
* <p>
* Targets list can be accessible before effect's init.
*/
void init(Game game, Ability source);