diff --git a/Mage.Sets/src/mage/cards/a/AleshaWhoSmilesAtDeath.java b/Mage.Sets/src/mage/cards/a/AleshaWhoSmilesAtDeath.java index 5821347dc8..9f76c02a33 100644 --- a/Mage.Sets/src/mage/cards/a/AleshaWhoSmilesAtDeath.java +++ b/Mage.Sets/src/mage/cards/a/AleshaWhoSmilesAtDeath.java @@ -1,38 +1,39 @@ - package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.keyword.FirstStrikeAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.Game; -import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class AleshaWhoSmilesAtDeath extends CardImpl { - private static final FilterCreatureCard filter = new FilterCreatureCard("creature card with power 2 or less"); + private static final FilterCard filter + = new FilterCreatureCard("creature card with power 2 or less from your graveyard"); static { filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3)); } public AleshaWhoSmilesAtDeath(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); addSuperType(SuperType.LEGENDARY); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WARRIOR); @@ -43,7 +44,10 @@ public final class AleshaWhoSmilesAtDeath extends CardImpl { this.addAbility(FirstStrikeAbility.getInstance()); // Whenever Alesha, Who Smiles at Death attacks, you may pay {W/B}{W/B}. If you do, return target creature card with power 2 or less from your graveyard to the battlefield tapped and attacking. - Ability ability = new AttacksTriggeredAbility(new DoIfCostPaid(new AleshaWhoSmilesAtDeathEffect(), new ManaCostsImpl("{W/B}{W/B}")), false); + Ability ability = new AttacksTriggeredAbility(new DoIfCostPaid( + new ReturnFromGraveyardToBattlefieldTargetEffect(true, true), + new ManaCostsImpl<>("{W/B}{W/B}") + ), false); ability.addTarget(new TargetCardInYourGraveyard(filter)); this.addAbility(ability); } @@ -57,38 +61,3 @@ public final class AleshaWhoSmilesAtDeath extends CardImpl { return new AleshaWhoSmilesAtDeath(this); } } - -class AleshaWhoSmilesAtDeathEffect extends OneShotEffect { - - public AleshaWhoSmilesAtDeathEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "return target creature card with power 2 or less from your graveyard to the battlefield tapped and attacking"; - } - - public AleshaWhoSmilesAtDeathEffect(final AleshaWhoSmilesAtDeathEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - - if (controller != null) { - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { - if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null)) { - game.getCombat().addAttackingCreature(card.getId(), game); - } - } - return true; - - } - return false; - } - - @Override - public AleshaWhoSmilesAtDeathEffect copy() { - return new AleshaWhoSmilesAtDeathEffect(this); - } - -} diff --git a/Mage.Sets/src/mage/cards/b/BereavedSurvivor.java b/Mage.Sets/src/mage/cards/b/BereavedSurvivor.java new file mode 100644 index 0000000000..453f517c4f --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BereavedSurvivor.java @@ -0,0 +1,46 @@ +package mage.cards.b; + +import mage.MageInt; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.keyword.TransformAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.StaticFilters; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class BereavedSurvivor extends CardImpl { + + public BereavedSurvivor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.PEASANT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + this.transformable = true; + this.secondSideCardClazz = mage.cards.d.DauntlessAvenger.class; + + // When another creature you control dies, transform Bereaved Survivor. + this.addAbility(new TransformAbility()); + this.addAbility(new DiesCreatureTriggeredAbility( + new TransformSourceEffect(true), false, + StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE + )); + } + + private BereavedSurvivor(final BereavedSurvivor card) { + super(card); + } + + @Override + public BereavedSurvivor copy() { + return new BereavedSurvivor(this); + } +} diff --git a/Mage.Sets/src/mage/cards/d/DauntlessAvenger.java b/Mage.Sets/src/mage/cards/d/DauntlessAvenger.java new file mode 100644 index 0000000000..d7004ce349 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DauntlessAvenger.java @@ -0,0 +1,56 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.target.common.TargetCardInYourGraveyard; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DauntlessAvenger extends CardImpl { + + private static final FilterCard filter + = new FilterCreatureCard("creature card with mana value 2 or less from your graveyard"); + + static { + filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 3)); + } + + public DauntlessAvenger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + this.color.setWhite(true); + this.transformable = true; + this.nightCard = true; + + // Whenever Dauntless Avenger attacks, return target creature card with mana value 2 or less from your graveyard to the battlefield tapped and attacking. + Ability ability = new AttacksTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(true, true)); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + this.addAbility(ability); + } + + private DauntlessAvenger(final DauntlessAvenger card) { + super(card); + } + + @Override + public DauntlessAvenger copy() { + return new DauntlessAvenger(this); + } +} diff --git a/Mage.Sets/src/mage/cards/y/YoreTillerNephilim.java b/Mage.Sets/src/mage/cards/y/YoreTillerNephilim.java index 163d649e4f..cc0defe905 100644 --- a/Mage.Sets/src/mage/cards/y/YoreTillerNephilim.java +++ b/Mage.Sets/src/mage/cards/y/YoreTillerNephilim.java @@ -1,25 +1,19 @@ package mage.cards.y; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; +import java.util.UUID; + /** - * * @author fireshoes */ public final class YoreTillerNephilim extends CardImpl { @@ -31,8 +25,8 @@ public final class YoreTillerNephilim extends CardImpl { this.toughness = new MageInt(2); // Whenever Yore-Tiller Nephilim attacks, return target creature card from your graveyard to the battlefield tapped and attacking. - Ability ability = new AttacksTriggeredAbility(new YoreTillerNephilimEffect(), false); - ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE)); + Ability ability = new AttacksTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(true, true), false); + ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(ability); } @@ -45,39 +39,3 @@ public final class YoreTillerNephilim extends CardImpl { return new YoreTillerNephilim(this); } } - -class YoreTillerNephilimEffect extends OneShotEffect { - - public YoreTillerNephilimEffect() { - super(Outcome.PutCreatureInPlay); - this.staticText = "return target creature card from your graveyard to the battlefield tapped and attacking"; - } - - public YoreTillerNephilimEffect(final YoreTillerNephilimEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - - if (controller != null) { - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { - controller.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null); - Permanent permanent = game.getPermanent(card.getId()); - if (permanent != null) { - game.getCombat().addAttackingCreature(permanent.getId(), game); - } - } - return true; - - } - return false; - } - - @Override - public YoreTillerNephilimEffect copy() { - return new YoreTillerNephilimEffect(this); - } -} diff --git a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java index 4a76d3ebdc..285eb059df 100644 --- a/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java +++ b/Mage.Sets/src/mage/sets/InnistradMidnightHunt.java @@ -46,6 +46,7 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Baithook Angler", 42, Rarity.COMMON, mage.cards.b.BaithookAngler.class)); cards.add(new SetCardInfo("Bat Whisperer", 86, Rarity.COMMON, mage.cards.b.BatWhisperer.class)); cards.add(new SetCardInfo("Benevolent Geist", 61, Rarity.RARE, mage.cards.b.BenevolentGeist.class)); + cards.add(new SetCardInfo("Bereaved Survivor", 4, Rarity.UNCOMMON, mage.cards.b.BereavedSurvivor.class)); cards.add(new SetCardInfo("Bird Admirer", 169, Rarity.COMMON, mage.cards.b.BirdAdmirer.class)); cards.add(new SetCardInfo("Bladebrand", 87, Rarity.COMMON, mage.cards.b.Bladebrand.class)); cards.add(new SetCardInfo("Bladestitched Skaab", 212, Rarity.UNCOMMON, mage.cards.b.BladestitchedSkaab.class)); @@ -90,6 +91,7 @@ public final class InnistradMidnightHunt extends ExpansionSet { cards.add(new SetCardInfo("Curse of Shaken Faith", 134, Rarity.RARE, mage.cards.c.CurseOfShakenFaith.class)); cards.add(new SetCardInfo("Curse of Silence", 15, Rarity.RARE, mage.cards.c.CurseOfSilence.class)); cards.add(new SetCardInfo("Curse of Surveillance", 46, Rarity.RARE, mage.cards.c.CurseOfSurveillance.class)); + cards.add(new SetCardInfo("Dauntless Avenger", 4, Rarity.UNCOMMON, mage.cards.d.DauntlessAvenger.class)); cards.add(new SetCardInfo("Dawnhart Mentor", 179, Rarity.UNCOMMON, mage.cards.d.DawnhartMentor.class)); cards.add(new SetCardInfo("Dawnhart Rejuvenator", 180, Rarity.COMMON, mage.cards.d.DawnhartRejuvenator.class)); cards.add(new SetCardInfo("Dawnhart Wardens", 216, Rarity.UNCOMMON, mage.cards.d.DawnhartWardens.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java index 860bfef7ed..617f651e26 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java @@ -22,19 +22,26 @@ import java.util.UUID; public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect { private final boolean tapped; + private final boolean attacking; public ReturnFromGraveyardToBattlefieldTargetEffect() { this(false); } public ReturnFromGraveyardToBattlefieldTargetEffect(boolean tapped) { + this(tapped, false); + } + + public ReturnFromGraveyardToBattlefieldTargetEffect(boolean tapped, boolean attacking) { super(Outcome.PutCreatureInPlay); this.tapped = tapped; + this.attacking = attacking; } protected ReturnFromGraveyardToBattlefieldTargetEffect(final ReturnFromGraveyardToBattlefieldTargetEffect effect) { super(effect); this.tapped = effect.tapped; + this.attacking = effect.attacking; } @Override @@ -54,6 +61,11 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect } } controller.moveCards(cardsToMove, Zone.BATTLEFIELD, source, game, tapped, false, false, null); + if (attacking) { + for (Card card : cardsToMove) { + game.getCombat().addAttackingCreature(card.getId(), game); + } + } return true; } return false; @@ -82,8 +94,12 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect } sb.append(yourGrave ? " to" : " onto"); sb.append(" the battlefield"); - if (tapped) { + if (tapped && attacking) { + sb.append(" tapped and attacking"); + } else if (tapped) { sb.append(" tapped"); + } else if (attacking) { + sb.append(" attacking"); } if (!yourGrave) { sb.append(" under your control");