Merge pull request #9720 from PurpleCrowbar/ashnod-flesh-mechanist

[BRO] Implement Ashnod, Flesh Mechanist
This commit is contained in:
Daniel Bomar 2022-11-02 21:51:39 -05:00 committed by GitHub
commit 7af7654c80
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 125 additions and 112 deletions

View file

@ -18,9 +18,7 @@ import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
@ -30,13 +28,6 @@ import java.util.UUID;
*/
public final class AhnCropInvader extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public AhnCropInvader(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
@ -63,7 +54,7 @@ public final class AhnCropInvader extends CardImpl {
Ability ability = new SimpleActivatedAbility(
new BoostSourceEffect(2, 0, Duration.EndOfTurn), new GenericManaCost(1)
);
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
this.addAbility(ability);
}

View file

@ -12,8 +12,7 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
/**
@ -22,12 +21,6 @@ import mage.target.common.TargetControlledPermanent;
*/
public final class ApocalypseDemon extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public ApocalypseDemon(UUID ownerId, CardSetInfo cardSetInfo) {
super(ownerId, cardSetInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
subtype.add(SubType.DEMON);
@ -39,7 +32,7 @@ public final class ApocalypseDemon extends CardImpl {
this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetBasePowerToughnessSourceEffect(new CardsInControllerGraveyardCount(), Duration.EndOfGame)));
// At the beginning of your upkeep, tap Apocalypse Demon unless you sacrifice another creature.
TapSourceUnlessPaysEffect tapEffect = new TapSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
TapSourceUnlessPaysEffect tapEffect = new TapSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
tapEffect.setText("tap {this} unless you sacrifice another creature.");
this.addAbility(new BeginningOfUpkeepTriggeredAbility(tapEffect, TargetController.YOU, false));
}

View file

@ -0,0 +1,66 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.ExileFromGraveCost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.AshnodZombieToken;
import mage.game.permanent.token.PowerstoneToken;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
/**
* @author PurpleCrowbar
*/
public final class AshnodFleshMechanist extends CardImpl {
public AshnodFleshMechanist(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN, SubType.ARTIFICER);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Deathtouch
this.addAbility(DeathtouchAbility.getInstance());
// Whenever Ashnod, Flesh Mechanist attacks, you may sacrifice another creature. If you do, create a tapped Powerstone token.
this.addAbility(new AttacksTriggeredAbility(
new DoIfCostPaid(
new CreateTokenEffect(
new PowerstoneToken(), 1, true, false
), new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))
), false
));
// {5}, Exile a creature card from your graveyard: Create a tapped 3/3 colorless Zombie artifact creature token.
Ability ability = new SimpleActivatedAbility(
new CreateTokenEffect(new AshnodZombieToken(), 1, true, false), new GenericManaCost(5)
);
ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_A)));
this.addAbility(ability);
}
private AshnodFleshMechanist(final AshnodFleshMechanist card) {
super(card);
}
@Override
public AshnodFleshMechanist copy() {
return new AshnodFleshMechanist(this);
}
}

View file

@ -10,9 +10,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
@ -22,13 +20,6 @@ import java.util.UUID;
*/
public final class BloodmistInfiltrator extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public BloodmistInfiltrator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@ -39,7 +30,7 @@ public final class BloodmistInfiltrator extends CardImpl {
// Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn.
this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid(
new CantBeBlockedSourceEffect(Duration.EndOfTurn),
new SacrificeTargetCost(new TargetControlledPermanent(filter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))
), false));
}

View file

@ -11,9 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.game.permanent.token.TokenImpl;
import mage.target.common.TargetControlledPermanent;
@ -24,13 +22,6 @@ import java.util.UUID;
*/
public final class BogardanDragonheart extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public BogardanDragonheart(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}");
@ -43,7 +34,7 @@ public final class BogardanDragonheart extends CardImpl {
this.addAbility(new SimpleActivatedAbility(new BecomesCreatureSourceEffect(
new BogardanDragonheartToken(), null, Duration.EndOfTurn, false,
false, null, null, false
), new SacrificeTargetCost(new TargetControlledPermanent(filter))));
), new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))));
}
private BogardanDragonheart(final BogardanDragonheart card) {

View file

@ -16,11 +16,9 @@ import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInYourGraveyard;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
@ -32,14 +30,11 @@ import java.util.UUID;
*/
public final class CavalierOfNight extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
private static final FilterCard filter2
private static final FilterCard filter
= new FilterCreatureCard("creature card with mana value 3 or less from your graveyard");
static {
filter.add(AnotherPredicate.instance);
filter2.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4));
}
public CavalierOfNight(UUID ownerId, CardSetInfo setInfo) {
@ -59,13 +54,13 @@ public final class CavalierOfNight extends CardImpl {
);
triggeredAbility.addTarget(new TargetOpponentsCreaturePermanent());
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoWhenCostPaid(
triggeredAbility, new SacrificeTargetCost(new TargetControlledPermanent(filter)),
triggeredAbility, new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)),
"Sacrifice a creature?"
)));
// When Cavalier of Night dies, return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.
Ability ability = new DiesSourceTriggeredAbility(new ReturnFromGraveyardToBattlefieldTargetEffect());
ability.addTarget(new TargetCardInYourGraveyard(filter2));
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability);
}

View file

@ -12,8 +12,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
/**
@ -21,12 +20,6 @@ import mage.target.common.TargetControlledPermanent;
*/
public final class DemonlordOfAshmouth extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(" another creature");
static {
filter.add(AnotherPredicate.instance);
}
public DemonlordOfAshmouth(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}{B}");
this.subtype.add(SubType.DEMON);
@ -37,7 +30,11 @@ public final class DemonlordOfAshmouth extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Demonlord of Ashmouth enters the battlefield, exile it unless you sacrifice another creature.
this.addAbility(new EntersBattlefieldTriggeredAbility(new ExileSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(filter)))));
this.addAbility(new EntersBattlefieldTriggeredAbility(
new ExileSourceUnlessPaysEffect(
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))
)
));
this.addAbility(new UndyingAbility());
}

View file

@ -17,11 +17,8 @@ import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.ManaValuePredicate;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetControlledPermanent;
@ -35,12 +32,6 @@ public final class FiendArtisan extends CardImpl {
private static final DynamicValue xValue
= new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE);
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public FiendArtisan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B/G}{B/G}");
@ -59,7 +50,7 @@ public final class FiendArtisan extends CardImpl {
Zone.BATTLEFIELD, new FiendArtisanEffect(), new ManaCostsImpl<>("{X}{B/G}")
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)));
this.addAbility(ability);
}

View file

@ -15,7 +15,7 @@ import mage.abilities.keyword.MorphAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.Game;
@ -35,12 +35,6 @@ import static mage.constants.Outcome.Benefit;
*/
public final class GiftOfDoom extends CardImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
static {
filter.add(AnotherPredicate.instance);
}
public GiftOfDoom(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{B}");
@ -65,7 +59,7 @@ public final class GiftOfDoom extends CardImpl {
// MorphSacrifice another creature.
this.addAbility(new MorphAbility(new SacrificeTargetCost(
new TargetControlledPermanent(filter)
new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
)));
// As Gift of Doom is turned face up, you may attach it to a creature.

View file

@ -4,7 +4,6 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.ActivatedAbilityImpl;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost;
@ -16,9 +15,7 @@ import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
/**
@ -27,13 +24,6 @@ import mage.target.common.TargetControlledPermanent;
*/
public final class UndercityNecrolisk extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public UndercityNecrolisk(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
@ -50,7 +40,7 @@ public final class UndercityNecrolisk extends CardImpl {
new GenericManaCost(1)
);
ability.addCost(new SacrificeTargetCost(
new TargetControlledPermanent(filter)
new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE)
));
// It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.
ability.addEffect(new GainAbilitySourceEffect(

View file

@ -11,9 +11,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import java.util.UUID;
@ -23,12 +21,6 @@ import java.util.UUID;
*/
public final class UndercityScavenger extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public UndercityScavenger(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
@ -40,7 +32,7 @@ public final class UndercityScavenger extends CardImpl {
// When Undercity Scavenger enters the battlefield, you may sacrifice another creature. If you do, put two +1/+1 counters on Undercity Scavenger, then scry 2.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DoIfCostPaid(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)),
new SacrificeTargetCost(new TargetControlledPermanent(filter))
new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))
).addEffect(new ScryEffect(2).concatBy(", then"))));
}

View file

@ -12,9 +12,7 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.StaticFilters;
import mage.game.permanent.token.GoatToken;
import mage.target.common.TargetControlledPermanent;
@ -25,13 +23,6 @@ import java.util.UUID;
*/
public final class WoeStrider extends CardImpl {
private static final FilterControlledPermanent filter
= new FilterControlledCreaturePermanent("another creature");
static {
filter.add(AnotherPredicate.instance);
}
public WoeStrider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
@ -44,7 +35,7 @@ public final class WoeStrider extends CardImpl {
// Sacrifice another creature: Scry 1.
this.addAbility(new SimpleActivatedAbility(
new ScryEffect(1, false), new SacrificeTargetCost(new TargetControlledPermanent(filter))
new ScryEffect(1, false), new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE))
));
// Escape{3}{B}{B}, Exile four other cards from your graveyard.

View file

@ -31,6 +31,7 @@ public final class TheBrothersWar extends ExpansionSet {
cards.add(new SetCardInfo("Argivian Avenger", 232, Rarity.UNCOMMON, mage.cards.a.ArgivianAvenger.class));
cards.add(new SetCardInfo("Argoth, Sanctum of Nature", "256a", Rarity.RARE, mage.cards.a.ArgothSanctumOfNature.class));
cards.add(new SetCardInfo("Argothian Opportunist", 167, Rarity.COMMON, mage.cards.a.ArgothianOpportunist.class));
cards.add(new SetCardInfo("Ashnod, Flesh Mechanist", 84, Rarity.RARE, mage.cards.a.AshnodFleshMechanist.class));
cards.add(new SetCardInfo("Ashnod's Harvester", 117, Rarity.UNCOMMON, mage.cards.a.AshnodsHarvester.class));
cards.add(new SetCardInfo("Audacity", 169, Rarity.UNCOMMON, mage.cards.a.Audacity.class));
cards.add(new SetCardInfo("Autonomous Assembler", 34, Rarity.RARE, mage.cards.a.AutonomousAssembler.class));

View file

@ -0,0 +1,30 @@
package mage.game.permanent.token;
import mage.MageInt;
import mage.constants.CardType;
import mage.constants.SubType;
/**
* @author PurpleCrowbar
*/
public final class AshnodZombieToken extends TokenImpl {
public AshnodZombieToken() {
super("Zombie Token", "3/3 colorless Zombie artifact creature token");
cardType.add(CardType.ARTIFACT);
cardType.add(CardType.CREATURE);
subtype.add(SubType.ZOMBIE);
power = new MageInt(3);
toughness = new MageInt(3);
setOriginalExpansionSetCode("BRO");
}
public AshnodZombieToken(final AshnodZombieToken token) {
super(token);
}
public AshnodZombieToken copy() {
return new AshnodZombieToken(this);
}
}