diff --git a/Mage.Sets/src/mage/cards/d/DeterminedIteration.java b/Mage.Sets/src/mage/cards/d/DeterminedIteration.java new file mode 100644 index 00000000000..f6ecda1604c --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeterminedIteration.java @@ -0,0 +1,79 @@ +package mage.cards.d; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PopulateEffect; +import mage.abilities.effects.common.SacrificeTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.game.Game; +import mage.target.targetpointer.FixedTargets; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DeterminedIteration extends CardImpl { + + public DeterminedIteration(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); + + // At the beginning of combat on your turn, populate. The token created this way gains haste. Sacrifice it at the beginning of the next end step. + this.addAbility(new BeginningOfCombatTriggeredAbility( + new DeterminedIterationEffect(), TargetController.YOU, false + )); + } + + private DeterminedIteration(final DeterminedIteration card) { + super(card); + } + + @Override + public DeterminedIteration copy() { + return new DeterminedIteration(this); + } +} + +class DeterminedIterationEffect extends OneShotEffect { + + DeterminedIterationEffect() { + super(Outcome.Benefit); + staticText = "populate. The token created this way gains haste. Sacrifice it at the beginning of the " + + "next end step. (To populate, create a token that's a copy of a creature token you control.)"; + } + + private DeterminedIterationEffect(final DeterminedIterationEffect effect) { + super(effect); + } + + @Override + public DeterminedIterationEffect copy() { + return new DeterminedIterationEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + PopulateEffect effect = new PopulateEffect(); + effect.apply(game, source); + if (effect.getAddedPermanents().isEmpty()) { + return false; + } + game.addEffect(new GainAbilityTargetEffect( + HasteAbility.getInstance(), Duration.Custom + ).setTargetPointer(new FixedTargets(effect.getAddedPermanents(), game)), source); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new SacrificeTargetEffect("sacrifice the token") + .setTargetPointer(new FixedTargets(effect.getAddedPermanents(), game)) + ), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/NewCapennaCommander.java b/Mage.Sets/src/mage/sets/NewCapennaCommander.java index 9ca56d9d129..b370e8fa0da 100644 --- a/Mage.Sets/src/mage/sets/NewCapennaCommander.java +++ b/Mage.Sets/src/mage/sets/NewCapennaCommander.java @@ -94,6 +94,7 @@ public final class NewCapennaCommander extends ExpansionSet { cards.add(new SetCardInfo("Deathreap Ritual", 336, Rarity.UNCOMMON, mage.cards.d.DeathreapRitual.class)); cards.add(new SetCardInfo("Declaration in Stone", 196, Rarity.RARE, mage.cards.d.DeclarationInStone.class)); cards.add(new SetCardInfo("Deep Analysis", 218, Rarity.COMMON, mage.cards.d.DeepAnalysis.class)); + cards.add(new SetCardInfo("Determined Iteration", 45, Rarity.RARE, mage.cards.d.DeterminedIteration.class)); cards.add(new SetCardInfo("Devoted Druid", 286, Rarity.UNCOMMON, mage.cards.d.DevotedDruid.class)); cards.add(new SetCardInfo("Dig Through Time", 219, Rarity.RARE, mage.cards.d.DigThroughTime.class)); cards.add(new SetCardInfo("Dimir Signet", 365, Rarity.COMMON, mage.cards.d.DimirSignet.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java index a42709dc0da..d1e7664f8fc 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PopulateEffect.java @@ -1,7 +1,6 @@ package mage.abilities.effects.common; import mage.abilities.Ability; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; import mage.constants.TargetController; @@ -15,6 +14,9 @@ import mage.target.Target; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; +import java.util.ArrayList; +import java.util.List; + /** * @author LevelX2 */ @@ -31,6 +33,7 @@ public class PopulateEffect extends OneShotEffect { private final boolean tappedAndAttacking; private static final FilterPermanent filter = new FilterCreaturePermanent("creature token for populate"); + private final List addedTokenPermanents = new ArrayList<>(); static { filter.add(TokenPredicate.TRUE); @@ -56,6 +59,7 @@ public class PopulateEffect extends OneShotEffect { public PopulateEffect(final PopulateEffect effect) { super(effect); this.tappedAndAttacking = effect.tappedAndAttacking; + this.addedTokenPermanents.addAll(effect.addedTokenPermanents); } @Override @@ -75,11 +79,18 @@ public class PopulateEffect extends OneShotEffect { return true; } game.informPlayers("Token selected for populate: " + tokenToCopy.getLogName()); - Effect effect = new CreateTokenCopyTargetEffect( + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect( null, null, false, 1, tappedAndAttacking, tappedAndAttacking ); effect.setTargetPointer(new FixedTarget(target.getFirstTarget(), game)); - return effect.apply(game, source); + effect.apply(game, source); + this.addedTokenPermanents.clear(); + this.addedTokenPermanents.addAll(effect.getAddedPermanents()); + return true; + } + + public List getAddedPermanents() { + return addedTokenPermanents; } @Override