mirror of
https://github.com/magefree/mage.git
synced 2026-01-23 03:39:54 -08:00
refactor: improved usage of target pointers
This commit is contained in:
parent
78612ddc91
commit
46d751f996
476 changed files with 548 additions and 563 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue