diff --git a/Mage.Sets/src/mage/cards/g/GripOfPhyresis.java b/Mage.Sets/src/mage/cards/g/GripOfPhyresis.java index f06e877cbb..f1cf33c328 100644 --- a/Mage.Sets/src/mage/cards/g/GripOfPhyresis.java +++ b/Mage.Sets/src/mage/cards/g/GripOfPhyresis.java @@ -69,7 +69,7 @@ class GripOfPhyresisEffect extends CreateTokenEffect { if (controller != null && equipment != null) { if (super.apply(game, source)) { - Permanent germ = game.getPermanent(this.getLastAddedTokenId()); + Permanent germ = game.getPermanent(this.getLastAddedTokenIds().stream().findFirst().orElse(null)); if (germ != null) { germ.addAttachment(equipment.getId(), source, game); return true; diff --git a/Mage.Sets/src/mage/cards/w/WarrenWeirding.java b/Mage.Sets/src/mage/cards/w/WarrenWeirding.java index e8f9730cdc..c88181b084 100644 --- a/Mage.Sets/src/mage/cards/w/WarrenWeirding.java +++ b/Mage.Sets/src/mage/cards/w/WarrenWeirding.java @@ -1,13 +1,7 @@ - package mage.cards.w; -import java.util.UUID; - import mage.abilities.Ability; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; @@ -16,17 +10,18 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; -import mage.filter.common.FilterControlledPermanent; +import mage.filter.StaticFilters; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.GoblinRogueToken; import mage.game.permanent.token.Token; import mage.players.Player; +import mage.target.TargetPermanent; import mage.target.TargetPlayer; -import mage.target.common.TargetControlledPermanent; -import mage.target.targetpointer.FixedTarget; +import mage.target.targetpointer.FixedTargets; + +import java.util.UUID; /** * @author LevelX2 @@ -37,7 +32,6 @@ public final class WarrenWeirding extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.TRIBAL, CardType.SORCERY}, "{1}{B}"); this.subtype.add(SubType.GOBLIN); - // Target player sacrifices a creature. If a Goblin is sacrificed this way, that player creates two 1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn. this.getSpellAbility().addEffect(new WarrenWeirdingEffect()); this.getSpellAbility().addTarget(new TargetPlayer()); @@ -63,7 +57,8 @@ class WarrenWeirdingEffect extends OneShotEffect { WarrenWeirdingEffect() { super(Outcome.Sacrifice); - staticText = "Target player sacrifices a creature. If a Goblin is sacrificed this way, that player creates two 1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn"; + staticText = "Target player sacrifices a creature. If a Goblin is sacrificed this way, that player " + + "creates two 1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn"; } WarrenWeirdingEffect(WarrenWeirdingEffect effect) { @@ -73,45 +68,30 @@ class WarrenWeirdingEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (player == null) { + if (player == null || game.getBattlefield().count( + StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), source, game + ) < 1) { return false; } - FilterControlledPermanent filter = new FilterControlledPermanent("creature"); - filter.add(CardType.CREATURE.getPredicate()); - filter.add(new ControllerIdPredicate(player.getId())); - TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, true); - - //A spell or ability could have removed the only legal target this player - //had, if thats the case this ability should fizzle. - if (target.canChoose(player.getId(), source, game)) { - player.choose(Outcome.Sacrifice, target, source, game); - Permanent permanent = game.getPermanent(target.getFirstTarget()); - if (permanent != null) { - permanent.sacrifice(source, game); - if (filterGoblin.match(permanent, game)) { - for (int i = 0; i < 2; i++) { - Token token = new GoblinRogueToken(); - Effect effect = new CreateTokenTargetEffect(token); - effect.setTargetPointer(new FixedTarget(player.getId())); - if (effect.apply(game, source)) { - Permanent tokenPermanent = game.getPermanent(token.getLastAddedToken()); - if (tokenPermanent != null) { - ContinuousEffect hasteEffect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn); - hasteEffect.setTargetPointer(new FixedTarget(tokenPermanent.getId())); - game.addEffect(hasteEffect, source); - } - } - } - } - } - return true; + TargetPermanent target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE); + target.setNotTarget(true); + player.choose(outcome, target, source, game); + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent == null || !permanent.sacrifice(source, game)) { + return false; } - return false; + if (permanent.hasSubtype(SubType.GOBLIN, game)) { + Token token = new GoblinRogueToken(); + token.putOntoBattlefield(2, game, source, player.getId()); + game.addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.EndOfTurn + ).setTargetPointer(new FixedTargets(token, game)), source); + } + return true; } @Override public WarrenWeirdingEffect copy() { return new WarrenWeirdingEffect(this); } - } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java index 3f0d7fbac3..4941bed1f1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java @@ -6,7 +6,6 @@ import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; /** - * * @author weirddan455 */ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { @@ -28,7 +27,7 @@ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { @Override public boolean apply(Game game, Ability source) { super.apply(game, source); - Permanent token = game.getPermanent(this.getLastAddedTokenId()); + Permanent token = game.getPermanent(this.getLastAddedTokenIds().stream().findFirst().orElse(null)); if (token != null) { token.addAttachment(source.getSourceId(), source, game); return true; diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java index 52aa47cc60..b496483315 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenEffect.java @@ -24,11 +24,10 @@ import java.util.UUID; */ public class CreateTokenEffect extends OneShotEffect { - private Token token; - private DynamicValue amount; - private boolean tapped; - private boolean attacking; - private UUID lastAddedTokenId; + private final Token token; + private final DynamicValue amount; + private final boolean tapped; + private final boolean attacking; private List<UUID> lastAddedTokenIds = new ArrayList<>(); public CreateTokenEffect(Token token) { @@ -62,7 +61,6 @@ public class CreateTokenEffect extends OneShotEffect { this.token = effect.token.copy(); this.tapped = effect.tapped; this.attacking = effect.attacking; - this.lastAddedTokenId = effect.lastAddedTokenId; this.lastAddedTokenIds.addAll(effect.lastAddedTokenIds); } @@ -75,16 +73,11 @@ public class CreateTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { int value = amount.calculate(game, source, this); token.putOntoBattlefield(value, game, source, source.getControllerId(), tapped, attacking); - this.lastAddedTokenId = token.getLastAddedToken(); this.lastAddedTokenIds = token.getLastAddedTokenIds(); return true; } - public UUID getLastAddedTokenId() { - return lastAddedTokenId; - } - public List<UUID> getLastAddedTokenIds() { return lastAddedTokenIds; } diff --git a/Mage/src/main/java/mage/game/permanent/token/Token.java b/Mage/src/main/java/mage/game/permanent/token/Token.java index 02c5b36bc5..d13b52d887 100644 --- a/Mage/src/main/java/mage/game/permanent/token/Token.java +++ b/Mage/src/main/java/mage/game/permanent/token/Token.java @@ -21,8 +21,6 @@ public interface Token extends MageObject { String getDescription(); - UUID getLastAddedToken(); - List<UUID> getLastAddedTokenIds(); void addAbility(Ability ability); diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index 6e72abd438..ca2655b9cc 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -30,7 +30,6 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { protected String description; private final ArrayList<UUID> lastAddedTokenIds = new ArrayList<>(); - private UUID lastAddedTokenId; private int tokenType; private String originalCardNumber; private String originalExpansionSetCode; @@ -76,7 +75,6 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { super(token); this.description = token.description; this.tokenType = token.tokenType; - this.lastAddedTokenId = token.lastAddedTokenId; this.lastAddedTokenIds.addAll(token.lastAddedTokenIds); this.originalCardNumber = token.originalCardNumber; this.originalExpansionSetCode = token.originalExpansionSetCode; @@ -113,11 +111,6 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { return description; } - @Override - public UUID getLastAddedToken() { - return lastAddedTokenId; - } - @Override public List<UUID> getLastAddedTokenIds() { return new ArrayList<>(lastAddedTokenIds); @@ -301,7 +294,6 @@ public abstract class TokenImpl extends MageObjectImpl implements Token { // keep tokens ids if (token instanceof TokenImpl) { ((TokenImpl) token).lastAddedTokenIds.add(permanent.getId()); - ((TokenImpl) token).lastAddedTokenId = permanent.getId(); } // created token events diff --git a/Mage/src/main/java/mage/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 4a5405155e..931bba0ba3 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -273,7 +273,7 @@ public class Spell extends StackObjectImpl implements Card { CardUtil.copyTo(token).from(card, game, this); // The token that a resolving copy of a spell becomes isn’t said to have been “created.” (2020-09-25) if (token.putOntoBattlefield(1, game, ability, getControllerId(), false, false, null, false)) { - permId = token.getLastAddedToken(); + permId = token.getLastAddedTokenIds().stream().findFirst().orElse(null); flag = true; } else { permId = null;