From f76a7de39512dd2893ae308e4ea732c7cdbdaed5 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 23 Jan 2026 13:19:41 -0500 Subject: [PATCH] [TMT] Implement Dontatello, Mutant Mechanic --- .../mage/cards/d/DonatelloMutantMechanic.java | 109 ++++++++++++++++++ .../src/mage/cards/i/IronApprentice.java | 42 +------ .../src/mage/cards/r/ReluctantRoleModel.java | 38 +----- .../src/mage/cards/r/ResourcefulDefense.java | 85 ++------------ Mage.Sets/src/mage/cards/t/TheOzolith.java | 67 +++-------- .../mage/sets/TeenageMutantNinjaTurtles.java | 1 + .../LeavesBattlefieldAllTriggeredAbility.java | 36 +++--- ...PutSavedPermanentCountersTargetEffect.java | 54 +++++++++ 8 files changed, 212 insertions(+), 220 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/DonatelloMutantMechanic.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/PutSavedPermanentCountersTargetEffect.java diff --git a/Mage.Sets/src/mage/cards/d/DonatelloMutantMechanic.java b/Mage.Sets/src/mage/cards/d/DonatelloMutantMechanic.java new file mode 100644 index 00000000000..9768481a7ca --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DonatelloMutantMechanic.java @@ -0,0 +1,109 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutSavedPermanentCountersTargetEffect; +import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.abilities.effects.common.continuous.SetBasePowerToughnessTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.predicate.permanent.CounterAnyPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DonatelloMutantMechanic extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledArtifactPermanent(); + + static { + filter.add(CounterAnyPredicate.instance); + } + + public DonatelloMutantMechanic(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.MUTANT); + this.subtype.add(SubType.NINJA); + this.subtype.add(SubType.TURTLE); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // {T}: Put three +1/+1 counters on target artifact you control. If it isn't a creature, it becomes a 0/0 Robot creature in addition to its other types. Activate only as a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + new AddCountersTargetEffect(CounterType.P1P1.createInstance(3)), new TapSourceCost() + ); + ability.addEffect(new DonatelloMutantMechanicEffect()); + ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT)); + this.addAbility(ability); + + // Whenever an artifact you control is put into a graveyard from the battlefield, if it had counters on it, put those counters on up to one target artifact or creature you control. + ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility( + new PutSavedPermanentCountersTargetEffect("permanentDied"), + false, filter, false + ); + ability.addTarget(new TargetPermanent( + 0, 1, StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT_OR_CREATURE + )); + this.addAbility(ability); + } + + private DonatelloMutantMechanic(final DonatelloMutantMechanic card) { + super(card); + } + + @Override + public DonatelloMutantMechanic copy() { + return new DonatelloMutantMechanic(this); + } +} + +class DonatelloMutantMechanicEffect extends OneShotEffect { + + DonatelloMutantMechanicEffect() { + super(Outcome.Benefit); + staticText = "If it isn't a creature, it becomes a 0/0 Robot creature in addition to its other types"; + } + + private DonatelloMutantMechanicEffect(final DonatelloMutantMechanicEffect effect) { + super(effect); + } + + @Override + public DonatelloMutantMechanicEffect copy() { + return new DonatelloMutantMechanicEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null || !permanent.isCreature(game)) { + return false; + } + game.addEffect(new AddCardTypeTargetEffect(Duration.Custom, CardType.CREATURE) + .setTargetPointer(new FixedTarget(permanent, game)), source); + game.addEffect(new AddCardSubTypeTargetEffect(SubType.ROBOT, Duration.Custom) + .setTargetPointer(new FixedTarget(permanent, game)), source); + game.addEffect(new SetBasePowerToughnessTargetEffect(0, 0, Duration.Custom) + .setTargetPointer(new FixedTarget(permanent, game)), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/i/IronApprentice.java b/Mage.Sets/src/mage/cards/i/IronApprentice.java index 0d5e6daf50e..208f5ab7e12 100644 --- a/Mage.Sets/src/mage/cards/i/IronApprentice.java +++ b/Mage.Sets/src/mage/cards/i/IronApprentice.java @@ -5,15 +5,12 @@ import mage.abilities.Ability; import mage.abilities.common.DiesSourceTriggeredAbility; import mage.abilities.common.EntersBattlefieldWithCountersAbility; import mage.abilities.condition.common.SourceHasCountersCondition; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutSavedPermanentCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; import mage.counters.CounterType; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; import java.util.UUID; @@ -34,9 +31,8 @@ public final class IronApprentice extends CardImpl { this.addAbility(new EntersBattlefieldWithCountersAbility(CounterType.P1P1.createInstance(1))); // When Iron Apprentice dies, if it had counters on it, put those counters on target creature you control. - Ability ability = new DiesSourceTriggeredAbility(new IronApprenticeEffect()) - .withTriggerCondition(SourceHasCountersCondition.instance) - .setTriggerPhrase("When {this} dies, if it had counters on it, "); + Ability ability = new DiesSourceTriggeredAbility(new PutSavedPermanentCountersTargetEffect("permanentLeftBattlefield")) + .withTriggerCondition(SourceHasCountersCondition.instance); ability.addTarget(new TargetControlledCreaturePermanent()); this.addAbility(ability); } @@ -50,35 +46,3 @@ public final class IronApprentice extends CardImpl { return new IronApprentice(this); } } - -class IronApprenticeEffect extends OneShotEffect { - - IronApprenticeEffect() { - super(Outcome.Benefit); - staticText = "put those counters on target creature you control"; - } - - private IronApprenticeEffect(final IronApprenticeEffect effect) { - super(effect); - } - - @Override - public IronApprenticeEffect copy() { - return new IronApprenticeEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = (Permanent) getValue("permanentLeftBattlefield"); - Permanent creature = game.getPermanent(source.getFirstTarget()); - if (permanent == null || creature == null) { - return false; - } - permanent - .getCounters(game) - .copy() - .values() - .forEach(counter -> creature.addCounters(counter, source, game)); - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java b/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java index 91e27171d9d..4bd2c57d1d6 100644 --- a/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java +++ b/Mage.Sets/src/mage/cards/r/ReluctantRoleModel.java @@ -4,20 +4,16 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.abilityword.SurvivalAbility; import mage.abilities.common.DiesThisOrAnotherTriggeredAbility; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutSavedPermanentCountersTargetEffect; import mage.abilities.effects.common.counter.AddCounterChoiceSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.counters.Counter; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.predicate.permanent.CounterAnyPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -48,7 +44,7 @@ public final class ReluctantRoleModel extends CardImpl { // Whenever this creature or another creature you control dies, if it had counters on it, put those counters on up to one target creature. Ability ability = new DiesThisOrAnotherTriggeredAbility( - new ReluctantRoleModelEffect(), false, filter + new PutSavedPermanentCountersTargetEffect("creatureDied"), false, filter ).setApplyFilterOnSource(true); ability.addTarget(new TargetCreaturePermanent(0, 1)); this.addAbility(ability); @@ -63,33 +59,3 @@ public final class ReluctantRoleModel extends CardImpl { return new ReluctantRoleModel(this); } } - -class ReluctantRoleModelEffect extends OneShotEffect { - - ReluctantRoleModelEffect() { - super(Outcome.Benefit); - staticText = "if it had counters on it, put those counters on up to one target creature"; - } - - private ReluctantRoleModelEffect(final ReluctantRoleModelEffect effect) { - super(effect); - } - - @Override - public ReluctantRoleModelEffect copy() { - return new ReluctantRoleModelEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = (Permanent) getValue("creatureDied"); - Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent == null || creature == null) { - return false; - } - for (Counter counter : permanent.getCounters(game).values()) { - creature.addCounters(counter.copy(), source, game); - } - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/r/ResourcefulDefense.java b/Mage.Sets/src/mage/cards/r/ResourcefulDefense.java index 790377d630d..17107e1e003 100644 --- a/Mage.Sets/src/mage/cards/r/ResourcefulDefense.java +++ b/Mage.Sets/src/mage/cards/r/ResourcefulDefense.java @@ -5,6 +5,7 @@ import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutSavedPermanentCountersTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -12,13 +13,12 @@ import mage.constants.MultiAmountType; import mage.constants.Outcome; import mage.counters.Counter; import mage.counters.CounterType; -import mage.counters.Counters; +import mage.filter.FilterPermanent; import mage.filter.StaticFilters; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.permanent.CounterAnyPredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; @@ -37,9 +37,11 @@ import java.util.stream.Collectors; */ public class ResourcefulDefense extends CardImpl { - public static final FilterControlledPermanent filter2 = new FilterControlledPermanent("another permanent"); + private static final FilterPermanent filter = new FilterControlledPermanent(); + private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("another permanent"); static { + filter.add(CounterAnyPredicate.instance); filter2.add(AnotherPredicate.instance); } @@ -47,12 +49,12 @@ public class ResourcefulDefense extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}"); // Whenever a permanent you control leaves the battlefield, if it had counters on it, put those counters on target permanent you control. - Ability ltbAbility = new ResourcefulDefenseTriggeredAbility(); - ltbAbility.addTarget(new TargetControlledPermanent(filter2)); - this.addAbility(ltbAbility); + Ability ability = new LeavesBattlefieldAllTriggeredAbility(new PutSavedPermanentCountersTargetEffect("permanentLeftBattlefield"), filter); + ability.addTarget(new TargetControlledPermanent()); + this.addAbility(ability); // {4}{W}: Move any number of counters from target permanent you control to another target permanent you control. - Ability ability = new SimpleActivatedAbility(new ResourcefulDefenseMoveCounterEffect(), new ManaCostsImpl<>("{4}{W}")); + ability = new SimpleActivatedAbility(new ResourcefulDefenseMoveCounterEffect(), new ManaCostsImpl<>("{4}{W}")); Target fromTarget = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT); fromTarget.setTargetTag(1); @@ -138,70 +140,3 @@ class ResourcefulDefenseMoveCounterEffect extends OneShotEffect { return new ResourcefulDefenseMoveCounterEffect(this); } } - -class ResourcefulDefenseTriggeredAbility extends LeavesBattlefieldAllTriggeredAbility { - - ResourcefulDefenseTriggeredAbility() { - super(new ResourcefulDefenseLeaveEffect(), StaticFilters.FILTER_CONTROLLED_PERMANENT); - setTriggerPhrase("Whenever a permanent you control leaves the battlefield, if it had counters on it, "); - } - - private ResourcefulDefenseTriggeredAbility(final ResourcefulDefenseTriggeredAbility ability) { - super(ability); - } - - @Override - public ResourcefulDefenseTriggeredAbility copy() { - return new ResourcefulDefenseTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (!super.checkTrigger(event, game)) { - return false; - } - - Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - Player controller = game.getPlayer(permanent.getControllerId()); - if (controller == null) { - return false; - } - - Counters counters = permanent.getCounters(game); - if (counters.values().stream().mapToInt(Counter::getCount).noneMatch(x -> x > 0)) { - return false; - } - this.getEffects().setValue("counters", counters); - return true; - } -} - -class ResourcefulDefenseLeaveEffect extends OneShotEffect { - - ResourcefulDefenseLeaveEffect() { - super(Outcome.Benefit); - staticText = "put those counters on target permanent you control"; - } - - private ResourcefulDefenseLeaveEffect(final ResourcefulDefenseLeaveEffect effect) { - super(effect); - } - - @Override - public ResourcefulDefenseLeaveEffect copy() { - return new ResourcefulDefenseLeaveEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent == null) { - return false; - } - Counters counters = (Counters) this.getValue("counters"); - counters.values() - .stream().filter(counter -> counter.getCount() > 0) - .forEach(counter -> permanent.addCounters(counter, source.getControllerId(), source, game)); - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/t/TheOzolith.java b/Mage.Sets/src/mage/cards/t/TheOzolith.java index 5e2df719542..f4930bb708b 100644 --- a/Mage.Sets/src/mage/cards/t/TheOzolith.java +++ b/Mage.Sets/src/mage/cards/t/TheOzolith.java @@ -11,11 +11,10 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SuperType; import mage.counters.Counter; -import mage.counters.Counters; -import mage.filter.StaticFilters; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.CounterAnyPredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; @@ -26,13 +25,19 @@ import java.util.UUID; */ public final class TheOzolith extends CardImpl { + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(CounterAnyPredicate.instance); + } + public TheOzolith(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); this.supertype.add(SuperType.LEGENDARY); // Whenever a creature you control leaves the battlefield, if it had counters on it, put those counters on The Ozolith. - this.addAbility(new TheOzolithTriggeredAbility()); + this.addAbility(new LeavesBattlefieldAllTriggeredAbility(new TheOzolithLeaveEffect(), filter)); // At the beginning of combat on your turn, if The Ozolith has counters on it, you may move all counters from The Ozolith onto target creature. Ability ability = new BeginningOfCombatTriggeredAbility( @@ -52,53 +57,15 @@ public final class TheOzolith extends CardImpl { } } -class TheOzolithTriggeredAbility extends LeavesBattlefieldAllTriggeredAbility { - - TheOzolithTriggeredAbility() { - super(null, StaticFilters.FILTER_CONTROLLED_CREATURE); - } - - private TheOzolithTriggeredAbility(final TheOzolithTriggeredAbility ability) { - super(ability); - } - - public TheOzolithTriggeredAbility copy() { - return new TheOzolithTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (!super.checkTrigger(event, game)) { - return false; - } - Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - Counters counters = permanent.getCounters(game); - if (counters.values().stream().mapToInt(Counter::getCount).noneMatch(x -> x > 0)) { - return false; - } - this.getEffects().clear(); - this.addEffect(new TheOzolithLeaveEffect(counters)); - return true; - } - - public String getRule() { - return "Whenever a creature you control leaves the battlefield, " + - "if it had counters on it, put those counters on {this}."; - } -} - class TheOzolithLeaveEffect extends OneShotEffect { - private final Counters counters; - - TheOzolithLeaveEffect(Counters counters) { + TheOzolithLeaveEffect() { super(Outcome.Benefit); - this.counters = counters.copy(); + staticText = "if it had counters on it, put those counters on {this}"; } private TheOzolithLeaveEffect(final TheOzolithLeaveEffect effect) { super(effect); - this.counters = effect.counters.copy(); } @Override @@ -108,12 +75,14 @@ class TheOzolithLeaveEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent == null) { + Permanent creature = (Permanent) getValue("permanentLeftBattlefield"); + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (creature == null || permanent == null) { return false; } - counters.values() - .forEach(counter -> permanent.addCounters(counter, source.getControllerId(), source, game)); + for (Counter counter : creature.getCounters(game).copy().values()) { + permanent.addCounters(counter, source, game); + } return true; } } diff --git a/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java b/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java index fcb861897f1..9b885e04b20 100644 --- a/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java +++ b/Mage.Sets/src/mage/sets/TeenageMutantNinjaTurtles.java @@ -34,6 +34,7 @@ public final class TeenageMutantNinjaTurtles extends ExpansionSet { cards.add(new SetCardInfo("Don & Leo, Problem Solvers", 143, Rarity.RARE, mage.cards.d.DonAndLeoProblemSolvers.class)); cards.add(new SetCardInfo("Don & Raph, Hard Science", 144, Rarity.RARE, mage.cards.d.DonAndRaphHardScience.class)); cards.add(new SetCardInfo("Donatello, Gadget Master", 35, Rarity.RARE, mage.cards.d.DonatelloGadgetMaster.class)); + cards.add(new SetCardInfo("Donatello, Mutant Mechanic", 36, Rarity.MYTHIC, mage.cards.d.DonatelloMutantMechanic.class)); cards.add(new SetCardInfo("Forest", 257, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Forest", 314, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Groundchuck & Dirtbag", 115, Rarity.RARE, mage.cards.g.GroundchuckAndDirtbag.class)); diff --git a/Mage/src/main/java/mage/abilities/common/LeavesBattlefieldAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/LeavesBattlefieldAllTriggeredAbility.java index b67304bd323..f874db2a803 100644 --- a/Mage/src/main/java/mage/abilities/common/LeavesBattlefieldAllTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/LeavesBattlefieldAllTriggeredAbility.java @@ -1,7 +1,6 @@ package mage.abilities.common; -import java.util.UUID; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.constants.SetTargetPointer; @@ -14,7 +13,6 @@ import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; /** - * * @author Styxo */ public class LeavesBattlefieldAllTriggeredAbility extends TriggeredAbilityImpl { @@ -61,25 +59,21 @@ public class LeavesBattlefieldAllTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getFromZone() == Zone.BATTLEFIELD) { - UUID targetId = event.getTargetId(); - Permanent permanent = game.getPermanentOrLKIBattlefield(targetId); - if (filter.match(permanent, getControllerId(), this, game)) { - if (setTargetPointer != SetTargetPointer.NONE) { - for (Effect effect : this.getEffects()) { - switch (setTargetPointer) { - case PERMANENT: - effect.setTargetPointer(new FixedTarget(permanent, game)); - break; - case PLAYER: - effect.setTargetPointer(new FixedTarget(permanent.getControllerId())); - break; - } - } - } - return true; - } + if (zEvent.getFromZone() != Zone.BATTLEFIELD) { + return false; } - return false; + Permanent permanent = zEvent.getTarget(); + if (!filter.match(permanent, getControllerId(), this, game)) { + return false; + } + this.getAllEffects().setValue("permanentLeftBattlefield", permanent); + switch (setTargetPointer) { + case PERMANENT: + this.getAllEffects().setTargetPointer(new FixedTarget(permanent, game)); + break; + case PLAYER: + this.getAllEffects().setTargetPointer(new FixedTarget(permanent.getControllerId())); + } + return true; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/PutSavedPermanentCountersTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PutSavedPermanentCountersTargetEffect.java new file mode 100644 index 00000000000..29ceeaef936 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/PutSavedPermanentCountersTargetEffect.java @@ -0,0 +1,54 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.counters.Counter; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * @author TheElk801 + */ +public class PutSavedPermanentCountersTargetEffect extends OneShotEffect { + + private final String key; + + public PutSavedPermanentCountersTargetEffect(String key) { + super(Outcome.Benefit); + this.key = key; + } + + private PutSavedPermanentCountersTargetEffect(final PutSavedPermanentCountersTargetEffect effect) { + super(effect); + this.key = effect.key; + } + + @Override + public PutSavedPermanentCountersTargetEffect copy() { + return new PutSavedPermanentCountersTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = (Permanent) getValue(key); + Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (permanent == null || creature == null) { + return false; + } + for (Counter counter : permanent.getCounters(game).copy().values()) { + creature.addCounters(counter, source, game); + } + return true; + } + + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; + } + return "if it had counters on it, put those counters on " + + getTargetPointer().describeTargets(mode.getTargets(), "that creature"); + } +}