diff --git a/Mage.Sets/src/mage/cards/g/GhoulishImpetus.java b/Mage.Sets/src/mage/cards/g/GhoulishImpetus.java new file mode 100644 index 00000000000..6a31c33c8c0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GhoulishImpetus.java @@ -0,0 +1,71 @@ +package mage.cards.g; + +import mage.abilities.Ability; +import mage.abilities.common.DiesAttachedTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; +import mage.abilities.effects.common.combat.GoadAttachedEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class GhoulishImpetus extends CardImpl { + + public GhoulishImpetus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + this.addAbility(new EnchantAbility(auraTarget)); + + // Enchanted creature gets +1/+1, has deathtouch, and is goaded. + Ability ability = new SimpleStaticAbility(new BoostEnchantedEffect(1, 1)); + ability.addEffect( + new GainAbilityAttachedEffect(DeathtouchAbility.getInstance(), AttachmentType.AURA) + .setText("has deathtouch") + .concatBy(",") + ); + ability.addEffect(new GoadAttachedEffect().concatBy(",")); + this.addAbility(ability); + + // When enchanted creature dies, return Ghoulish Impetus to the battlefield at the beginning of the next end step. + this.addAbility(new DiesAttachedTriggeredAbility( + new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextEndStepDelayedTriggeredAbility( + new ReturnToBattlefieldUnderYourControlTargetEffect() + .setText("return {this} to the battlefield"), + TargetController.ANY + ) + ).setText("return {this} to the battlefield at the beginning of the next end step"), + "enchanted creature", + false, true, SetTargetPointer.CARD, true + )); + } + + private GhoulishImpetus(final GhoulishImpetus card) { + super(card); + } + + @Override + public GhoulishImpetus copy() { + return new GhoulishImpetus(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/CommanderMasters.java b/Mage.Sets/src/mage/sets/CommanderMasters.java index 3b91f3ed721..88d9ab80c15 100644 --- a/Mage.Sets/src/mage/sets/CommanderMasters.java +++ b/Mage.Sets/src/mage/sets/CommanderMasters.java @@ -261,6 +261,7 @@ public final class CommanderMasters extends ExpansionSet { cards.add(new SetCardInfo("Ghost of Ramirez DePietro", 97, Rarity.UNCOMMON, mage.cards.g.GhostOfRamirezDePietro.class)); cards.add(new SetCardInfo("Ghostly Flicker", 98, Rarity.COMMON, mage.cards.g.GhostlyFlicker.class)); cards.add(new SetCardInfo("Ghoulcaller Gisa", 161, Rarity.RARE, mage.cards.g.GhoulcallerGisa.class)); + cards.add(new SetCardInfo("Ghoulish Impetus", 732, Rarity.RARE, mage.cards.g.GhoulishImpetus.class)); cards.add(new SetCardInfo("Gideon Jura", 822, Rarity.MYTHIC, mage.cards.g.GideonJura.class)); cards.add(new SetCardInfo("Gilded Lotus", 387, Rarity.RARE, mage.cards.g.GildedLotus.class)); cards.add(new SetCardInfo("Gisela, Blade of Goldnight", 338, Rarity.RARE, mage.cards.g.GiselaBladeOfGoldnight.class)); diff --git a/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java index 2e8ca9aa854..be40c6b9a38 100644 --- a/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DiesAttachedTriggeredAbility.java @@ -21,6 +21,7 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl { private final String attachedDescription; private final boolean diesRuleText; protected SetTargetPointer setTargetPointer; + private final boolean rememberSource; // if true, setTargetPointer will be set to the aura/equipement. public DiesAttachedTriggeredAbility(Effect effect, String attachedDescription) { this(effect, attachedDescription, false); @@ -36,10 +37,16 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl { public DiesAttachedTriggeredAbility(Effect effect, String attachedDescription, boolean optional, boolean diesRuleText, SetTargetPointer setTargetPointer) { + this(effect, attachedDescription, optional, diesRuleText, setTargetPointer, false); + } + + public DiesAttachedTriggeredAbility(Effect effect, String attachedDescription, boolean optional, + boolean diesRuleText, SetTargetPointer setTargetPointer, boolean rememberSource) { super(Zone.ALL, effect, optional); // because the trigger only triggers if the object was attached, it doesn't matter where the Attachment was moved to (e.g. by replacement effect) after the trigger triggered, so Zone.all this.attachedDescription = attachedDescription; this.diesRuleText = diesRuleText; this.setTargetPointer = setTargetPointer; + this.rememberSource = rememberSource; setTriggerPhrase(generateTriggerPhrase()); } @@ -48,6 +55,7 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl { this.attachedDescription = ability.attachedDescription; this.diesRuleText = ability.diesRuleText; this.setTargetPointer = ability.setTargetPointer; + this.rememberSource = ability.rememberSource; } @Override @@ -111,16 +119,23 @@ public class DiesAttachedTriggeredAbility extends TriggeredAbilityImpl { } } } - // set targetpointer to the creature that died if (setTargetPointer == SetTargetPointer.CARD || setTargetPointer == SetTargetPointer.PERMANENT) { Permanent attachment = game.getPermanentOrLKIBattlefield(getSourceId()); - if (attachment != null + if (rememberSource) { + // set targetpointer to the attachement + if (attachment != null) { + getEffects().setTargetPointer(new FixedTarget(attachment.getId())); + } + } else { + // set targetpointer to the creature that died + if (attachment != null && attachment.getAttachedTo() != null) { - Permanent attachedTo = (Permanent) game.getLastKnownInformation(attachment.getAttachedTo(), + Permanent attachedTo = (Permanent) game.getLastKnownInformation(attachment.getAttachedTo(), Zone.BATTLEFIELD, attachment.getAttachedToZoneChangeCounter()); - if (attachedTo != null) { - getEffects().setTargetPointer(new FixedTarget(attachedTo.getId())); + if (attachedTo != null) { + getEffects().setTargetPointer(new FixedTarget(attachedTo.getId())); + } } } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java index 71c56062ccd..39031a4b833 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateDelayedTriggeredAbilityEffect.java @@ -6,6 +6,7 @@ import mage.abilities.Mode; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.game.Game; +import mage.target.targetpointer.TargetPointer; /** * @author BetaSteward_at_googlemail.com @@ -77,4 +78,10 @@ public class CreateDelayedTriggeredAbilityEffect extends OneShotEffect { ability.getEffects().setValue(key, value); super.setValue(key, value); } + + @Override + public Effect setTargetPointer(TargetPointer targetPointer) { + ability.getEffects().setTargetPointer(targetPointer); + return super.setTargetPointer(targetPointer); + } }