diff --git a/Mage.Sets/src/mage/cards/e/ElspethsTalent.java b/Mage.Sets/src/mage/cards/e/ElspethsTalent.java index e0610f11a2..0bf855505d 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethsTalent.java +++ b/Mage.Sets/src/mage/cards/e/ElspethsTalent.java @@ -18,9 +18,12 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.permanent.token.SoldierToken; +import mage.game.stack.StackObject; import mage.target.TargetPermanent; import mage.target.common.TargetPlaneswalkerPermanent; +import java.util.Objects; +import java.util.Optional; import java.util.UUID; /** @@ -86,8 +89,9 @@ class ElspethsTalentTriggeredAbility extends TriggeredAbilityImpl { return permanent != null && event.getSourceId().equals(permanent.getAttachedTo()) && isControlledBy(event.getPlayerId()) - && game - .getAbility(event.getTargetId(), event.getSourceId()) + && Optional.ofNullable(game.getStack().getStackObject(event.getSourceId())) + .filter(Objects::nonNull) + .map(StackObject::getStackAbility) .map(LoyaltyAbility.class::isInstance) .orElse(false); } diff --git a/Mage.Sets/src/mage/cards/r/RowansTalent.java b/Mage.Sets/src/mage/cards/r/RowansTalent.java new file mode 100644 index 0000000000..fa0ce6a25f --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RowansTalent.java @@ -0,0 +1,112 @@ +package mage.cards.r; + +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CopyStackObjectEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.StackObject; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetPlaneswalkerPermanent; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class RowansTalent extends CardImpl { + + public RowansTalent(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}"); + + this.subtype.add(SubType.AURA); + + // Enchant planeswalker + TargetPermanent auraTarget = new TargetPlaneswalkerPermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted planeswalker has "[+1]: Up to one target creature gets +2/+0 and gains first strike and trample until end of turn." + Ability ability = new LoyaltyAbility(new BoostTargetEffect(2, 0) + .setText("up to one target creature gets +2/+0"), 1); + ability.addEffect(new GainAbilityTargetEffect(FirstStrikeAbility.getInstance()) + .setText("and gains first strike")); + ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance()) + .setText("and trample until end of turn")); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect( + ability, AttachmentType.AURA, Duration.WhileOnBattlefield, + null, "planeswalker" + ))); + + // Whenever you activate a loyalty ability of enchanted planeswalker, copy that ability. You may choose new targets for the copy. + this.addAbility(new RowansTalentTriggeredAbility()); + } + + private RowansTalent(final RowansTalent card) { + super(card); + } + + @Override + public RowansTalent copy() { + return new RowansTalent(this); + } +} + +class RowansTalentTriggeredAbility extends TriggeredAbilityImpl { + + RowansTalentTriggeredAbility() { + super(Zone.BATTLEFIELD, new CopyStackObjectEffect()); + } + + private RowansTalentTriggeredAbility(final RowansTalentTriggeredAbility ability) { + super(ability); + } + + @Override + public RowansTalentTriggeredAbility copy() { + return new RowansTalentTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ACTIVATED_ABILITY; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = getSourcePermanentIfItStillExists(game); + if (permanent == null + || !event.getSourceId().equals(permanent.getAttachedTo()) + || !isControlledBy(event.getPlayerId())) { + return false; + } + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + if (stackObject == null || !(stackObject.getStackAbility() instanceof LoyaltyAbility)) { + return false; + } + this.getEffects().setValue("stackObject", stackObject); + return true; + } + + @Override + public String getRule() { + return "Whenever you activate a loyalty ability of enchanted planeswalker, " + + "copy that ability. You may choose new targets for the copy."; + } +} diff --git a/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java b/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java index 9366323448..1f6e7fbf18 100644 --- a/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java +++ b/Mage.Sets/src/mage/sets/MarchOfTheMachineCommander.java @@ -254,6 +254,7 @@ public final class MarchOfTheMachineCommander extends ExpansionSet { cards.add(new SetCardInfo("Rishkar, Peema Renegade", 310, Rarity.RARE, mage.cards.r.RishkarPeemaRenegade.class)); cards.add(new SetCardInfo("Rogue's Passage", 421, Rarity.UNCOMMON, mage.cards.r.RoguesPassage.class)); cards.add(new SetCardInfo("Root Out", 311, Rarity.COMMON, mage.cards.r.RootOut.class)); + cards.add(new SetCardInfo("Rowan's Talent", 77, Rarity.RARE, mage.cards.r.RowansTalent.class)); cards.add(new SetCardInfo("Saheeli's Artistry", 234, Rarity.RARE, mage.cards.s.SaheelisArtistry.class)); cards.add(new SetCardInfo("Saheeli, Sublime Artificer", 338, Rarity.UNCOMMON, mage.cards.s.SaheeliSublimeArtificer.class)); cards.add(new SetCardInfo("Saint Traft and Rem Karolus", 9, Rarity.MYTHIC, mage.cards.s.SaintTraftAndRemKarolus.class));