1
0
Fork 0
mirror of https://github.com/correl/mage.git synced 2025-04-03 09:18:59 -09:00

[MID] Implemented Bereaved Survivor / Dauntless Avenger

This commit is contained in:
Evan Kranzler 2021-09-12 07:42:55 -04:00
parent 3463b720ce
commit 4c69286c14
6 changed files with 141 additions and 94 deletions

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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));

View file

@ -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");