diff --git a/Mage.Sets/src/mage/cards/a/AngrathCaptainOfChaos.java b/Mage.Sets/src/mage/cards/a/AngrathCaptainOfChaos.java index fca46b3b21e..9aae6092e9b 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathCaptainOfChaos.java +++ b/Mage.Sets/src/mage/cards/a/AngrathCaptainOfChaos.java @@ -34,7 +34,7 @@ public final class AngrathCaptainOfChaos extends CardImpl { ))); // -2: Amass 2. (Put two +1/+1 counters on an Army you control. If you don’t control one, create a 0/0 black Zombie Army creature token first.) - this.addAbility(new LoyaltyAbility(new AmassEffect(2), -2)); + this.addAbility(new LoyaltyAbility(new AmassEffect(2, SubType.ZOMBIE), -2)); } private AngrathCaptainOfChaos(final AngrathCaptainOfChaos card) { diff --git a/Mage.Sets/src/mage/cards/a/AvenEternal.java b/Mage.Sets/src/mage/cards/a/AvenEternal.java index fa0afe4db34..c5ca627687b 100644 --- a/Mage.Sets/src/mage/cards/a/AvenEternal.java +++ b/Mage.Sets/src/mage/cards/a/AvenEternal.java @@ -29,7 +29,7 @@ public final class AvenEternal extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Aven Eternal enters the battlefield, amass 1. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1, SubType.ZOMBIE))); } private AvenEternal(final AvenEternal card) { diff --git a/Mage.Sets/src/mage/cards/b/BleedingEdge.java b/Mage.Sets/src/mage/cards/b/BleedingEdge.java index d3c4ffae6b9..c193c70d10d 100644 --- a/Mage.Sets/src/mage/cards/b/BleedingEdge.java +++ b/Mage.Sets/src/mage/cards/b/BleedingEdge.java @@ -6,6 +6,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -21,7 +22,7 @@ public final class BleedingEdge extends CardImpl { // Up to one target creature gets -2/-2 until end of turn. Amass 2. this.getSpellAbility().addEffect(new BoostTargetEffect(-2, -2, Duration.EndOfTurn)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 1)); - this.getSpellAbility().addEffect(new AmassEffect(2)); + this.getSpellAbility().addEffect(new AmassEffect(2, SubType.ZOMBIE)); } private BleedingEdge(final BleedingEdge card) { diff --git a/Mage.Sets/src/mage/cards/c/CallousDismissal.java b/Mage.Sets/src/mage/cards/c/CallousDismissal.java index db2440421fb..4800ad73c7b 100644 --- a/Mage.Sets/src/mage/cards/c/CallousDismissal.java +++ b/Mage.Sets/src/mage/cards/c/CallousDismissal.java @@ -5,6 +5,7 @@ import mage.abilities.effects.keyword.AmassEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.target.common.TargetNonlandPermanent; import java.util.UUID; @@ -22,7 +23,7 @@ public final class CallousDismissal extends CardImpl { this.getSpellAbility().addTarget(new TargetNonlandPermanent()); // Amass 1. - this.getSpellAbility().addEffect(new AmassEffect(1).concatBy("
")); + this.getSpellAbility().addEffect(new AmassEffect(1, SubType.ZOMBIE).concatBy("
")); } private CallousDismissal(final CallousDismissal card) { diff --git a/Mage.Sets/src/mage/cards/c/CommenceTheEndgame.java b/Mage.Sets/src/mage/cards/c/CommenceTheEndgame.java index 8d4aca084a1..d2b1ce9b08d 100644 --- a/Mage.Sets/src/mage/cards/c/CommenceTheEndgame.java +++ b/Mage.Sets/src/mage/cards/c/CommenceTheEndgame.java @@ -8,6 +8,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.game.Game; import mage.players.Player; @@ -42,7 +43,9 @@ class CommenceTheEndgameEffect extends OneShotEffect { CommenceTheEndgameEffect() { super(Outcome.Benefit); - staticText = "Draw two cards, then amass X, where X is the number of cards in your hand."; + staticText = "draw two cards, then amass Zombies X, where X is the number of cards in your hand. " + + "(Put X +1/+1 counterson an Army you control. It's also a Zombie. If you don't control an Army, " + + "create a 0/0 black Zombie Army creature token first.)"; } private CommenceTheEndgameEffect(final CommenceTheEndgameEffect effect) { @@ -61,6 +64,7 @@ class CommenceTheEndgameEffect extends OneShotEffect { return false; } player.drawCards(2, source, game); - return new AmassEffect(player.getHand().size()).apply(game, source); + AmassEffect.doAmass(player.getHand().size(), SubType.ZOMBIE, game, source); + return true; } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CrushDissent.java b/Mage.Sets/src/mage/cards/c/CrushDissent.java index 74afddc6bb1..5399cdf1d96 100644 --- a/Mage.Sets/src/mage/cards/c/CrushDissent.java +++ b/Mage.Sets/src/mage/cards/c/CrushDissent.java @@ -6,6 +6,7 @@ import mage.abilities.effects.keyword.AmassEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.target.TargetSpell; import java.util.UUID; @@ -23,7 +24,7 @@ public final class CrushDissent extends CardImpl { this.getSpellAbility().addTarget(new TargetSpell()); // Amass 2. - this.getSpellAbility().addEffect(new AmassEffect(2)); + this.getSpellAbility().addEffect(new AmassEffect(2, SubType.ZOMBIE)); } private CrushDissent(final CrushDissent card) { diff --git a/Mage.Sets/src/mage/cards/d/DreadhordeInvasion.java b/Mage.Sets/src/mage/cards/d/DreadhordeInvasion.java index 19f14fd15a1..ab68504e7be 100644 --- a/Mage.Sets/src/mage/cards/d/DreadhordeInvasion.java +++ b/Mage.Sets/src/mage/cards/d/DreadhordeInvasion.java @@ -37,7 +37,7 @@ public final class DreadhordeInvasion extends CardImpl { Ability ability = new BeginningOfUpkeepTriggeredAbility( new LoseLifeSourceControllerEffect(1), TargetController.YOU, false ); - ability.addEffect(new AmassEffect(1).concatBy("and")); + ability.addEffect(new AmassEffect(1, SubType.ZOMBIE).concatBy("and")); this.addAbility(ability); // Whenever a Zombie token you control with power 6 or greater attacks, it gains lifelink until end of turn. diff --git a/Mage.Sets/src/mage/cards/d/DreadhordeTwins.java b/Mage.Sets/src/mage/cards/d/DreadhordeTwins.java index 4c83e8c65bd..74caa60eca1 100644 --- a/Mage.Sets/src/mage/cards/d/DreadhordeTwins.java +++ b/Mage.Sets/src/mage/cards/d/DreadhordeTwins.java @@ -37,7 +37,7 @@ public final class DreadhordeTwins extends CardImpl { this.toughness = new MageInt(2); // When Dreadhorde Twins enters the battlefield, amass 2. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2, SubType.ZOMBIE))); // Zombie tokens you control have trample. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/d/DunlandCrebain.java b/Mage.Sets/src/mage/cards/d/DunlandCrebain.java new file mode 100644 index 00000000000..043fcd85d4b --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DunlandCrebain.java @@ -0,0 +1,42 @@ +package mage.cards.d; + +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.keyword.AmassEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class DunlandCrebain extends CardImpl { + + public DunlandCrebain(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.BIRD); + this.subtype.add(SubType.HORROR); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Dunland Crebain enters the battlefield, amass Orcs 2. + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2, SubType.ORC))); + } + + private DunlandCrebain(final DunlandCrebain card) { + super(card); + } + + @Override + public DunlandCrebain copy() { + return new DunlandCrebain(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/EnterTheGodEternals.java b/Mage.Sets/src/mage/cards/e/EnterTheGodEternals.java index 4ac5d3bd534..05acd8c90a2 100644 --- a/Mage.Sets/src/mage/cards/e/EnterTheGodEternals.java +++ b/Mage.Sets/src/mage/cards/e/EnterTheGodEternals.java @@ -8,6 +8,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -75,6 +76,6 @@ class EnterTheGodEternalsEffect extends OneShotEffect { } } } - return new AmassEffect(4).apply(game, source); + return new AmassEffect(4, SubType.ZOMBIE).apply(game, source); } } diff --git a/Mage.Sets/src/mage/cards/e/EternalSkylord.java b/Mage.Sets/src/mage/cards/e/EternalSkylord.java index 8e6ae50149d..eb6655dd9f3 100644 --- a/Mage.Sets/src/mage/cards/e/EternalSkylord.java +++ b/Mage.Sets/src/mage/cards/e/EternalSkylord.java @@ -37,7 +37,7 @@ public final class EternalSkylord extends CardImpl { this.toughness = new MageInt(3); // When Eternal Skylord enters the batttlefield, amass 2. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2, SubType.ZOMBIE))); // Zombie tokens you control have flying. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/g/GleamingOverseer.java b/Mage.Sets/src/mage/cards/g/GleamingOverseer.java index 59e0905a43c..ef00873b378 100644 --- a/Mage.Sets/src/mage/cards/g/GleamingOverseer.java +++ b/Mage.Sets/src/mage/cards/g/GleamingOverseer.java @@ -38,7 +38,7 @@ public final class GleamingOverseer extends CardImpl { this.toughness = new MageInt(4); // When Gleaming Overseer enters the battlefield, amass 1. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1, SubType.ZOMBIE))); // Zombie tokens you control have hexproof and menace. Ability ability = new SimpleStaticAbility(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/g/GrimInitiate.java b/Mage.Sets/src/mage/cards/g/GrimInitiate.java index 09e20471ba5..4b80f7c30ca 100644 --- a/Mage.Sets/src/mage/cards/g/GrimInitiate.java +++ b/Mage.Sets/src/mage/cards/g/GrimInitiate.java @@ -28,7 +28,7 @@ public final class GrimInitiate extends CardImpl { this.addAbility(FirstStrikeAbility.getInstance()); // When Grim Initiate dies, amass 1. - this.addAbility(new DiesSourceTriggeredAbility(new AmassEffect(1))); + this.addAbility(new DiesSourceTriggeredAbility(new AmassEffect(1, SubType.ZOMBIE))); } private GrimInitiate(final GrimInitiate card) { diff --git a/Mage.Sets/src/mage/cards/h/HeraldOfTheDreadhorde.java b/Mage.Sets/src/mage/cards/h/HeraldOfTheDreadhorde.java index 0538dfcd8b1..1593481d968 100644 --- a/Mage.Sets/src/mage/cards/h/HeraldOfTheDreadhorde.java +++ b/Mage.Sets/src/mage/cards/h/HeraldOfTheDreadhorde.java @@ -24,7 +24,7 @@ public final class HeraldOfTheDreadhorde extends CardImpl { this.toughness = new MageInt(2); // When Herald of the Dreadhorde dies, amass 2. - this.addAbility(new DiesSourceTriggeredAbility(new AmassEffect(2))); + this.addAbility(new DiesSourceTriggeredAbility(new AmassEffect(2, SubType.ZOMBIE))); } private HeraldOfTheDreadhorde(final HeraldOfTheDreadhorde card) { diff --git a/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java b/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java index 654318e1ed3..50bbab117fe 100644 --- a/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java +++ b/Mage.Sets/src/mage/cards/h/HonorTheGodPharaoh.java @@ -7,6 +7,7 @@ import mage.abilities.effects.keyword.AmassEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; /** * @author TheElk801 @@ -21,7 +22,7 @@ public final class HonorTheGodPharaoh extends CardImpl { // Draw two cards. Amass 1. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2).setText("draw two cards")); - this.getSpellAbility().addEffect(new AmassEffect(1)); + this.getSpellAbility().addEffect(new AmassEffect(1, SubType.ZOMBIE)); } private HonorTheGodPharaoh(final HonorTheGodPharaoh card) { diff --git a/Mage.Sets/src/mage/cards/i/InvadeTheCity.java b/Mage.Sets/src/mage/cards/i/InvadeTheCity.java index 5f66f9a070f..12d531af5fc 100644 --- a/Mage.Sets/src/mage/cards/i/InvadeTheCity.java +++ b/Mage.Sets/src/mage/cards/i/InvadeTheCity.java @@ -1,11 +1,19 @@ package mage.cards.i; +import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.AmassEffect; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.common.FilterInstantOrSorceryCard; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; import java.util.UUID; @@ -14,14 +22,16 @@ import java.util.UUID; */ public final class InvadeTheCity extends CardImpl { - public static final FilterInstantOrSorceryCard filter - = new FilterInstantOrSorceryCard("instant and sorcery cards"); + private static final Hint hint = new ValueHint( + "Instants and sorceries in your graveyard", + new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY) + ); public InvadeTheCity(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{R}"); // Amass X, where X is the number of instant and sorcery cards in your graveyard. - this.getSpellAbility().addEffect(new AmassEffect(new CardsInControllerGraveyardCount(filter))); + this.getSpellAbility().addEffect(new InvadeTheCityEffect()); } private InvadeTheCity(final InvadeTheCity card) { @@ -33,3 +43,33 @@ public final class InvadeTheCity extends CardImpl { return new InvadeTheCity(this); } } + +class InvadeTheCityEffect extends OneShotEffect { + + InvadeTheCityEffect() { + super(Outcome.Benefit); + staticText = "amass Zombies X, where X is the number of instant and sorcery cards in your graveyard. " + + "(Put X +1/+1 counterson an Army you control. It's also a Zombie. If you don't control an Army, " + + "create a 0/0 black Zombie Army creature token first.)"; + } + + private InvadeTheCityEffect(final InvadeTheCityEffect effect) { + super(effect); + } + + @Override + public InvadeTheCityEffect copy() { + return new InvadeTheCityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + return AmassEffect.doAmass(player.getGraveyard().count( + StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game + ), SubType.ZOMBIE, game, source) != null; + } +} diff --git a/Mage.Sets/src/mage/cards/i/InvadingManticore.java b/Mage.Sets/src/mage/cards/i/InvadingManticore.java index ced90dd8ec6..c73ec2e567a 100644 --- a/Mage.Sets/src/mage/cards/i/InvadingManticore.java +++ b/Mage.Sets/src/mage/cards/i/InvadingManticore.java @@ -24,7 +24,7 @@ public final class InvadingManticore extends CardImpl { this.toughness = new MageInt(5); // When Invading Manticore enters the battlefield, amass 2. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(2, SubType.ZOMBIE))); } private InvadingManticore(final InvadingManticore card) { diff --git a/Mage.Sets/src/mage/cards/l/LazotepChancellor.java b/Mage.Sets/src/mage/cards/l/LazotepChancellor.java index 6cd2eb63b70..c0e23674ddb 100644 --- a/Mage.Sets/src/mage/cards/l/LazotepChancellor.java +++ b/Mage.Sets/src/mage/cards/l/LazotepChancellor.java @@ -27,7 +27,7 @@ public final class LazotepChancellor extends CardImpl { // Whenever you discard a card, you may pay {1}. If you do, amass 2. this.addAbility(new DiscardCardControllerTriggeredAbility( - new DoIfCostPaid(new AmassEffect(2), new GenericManaCost(1)), false + new DoIfCostPaid(new AmassEffect(2, SubType.ZOMBIE), new GenericManaCost(1)), false )); } diff --git a/Mage.Sets/src/mage/cards/l/LazotepPlating.java b/Mage.Sets/src/mage/cards/l/LazotepPlating.java index 71964e7e32f..59c39f5a73c 100644 --- a/Mage.Sets/src/mage/cards/l/LazotepPlating.java +++ b/Mage.Sets/src/mage/cards/l/LazotepPlating.java @@ -11,6 +11,7 @@ import mage.constants.Duration; import java.util.UUID; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; +import mage.constants.SubType; /** * @author TheElk801 @@ -21,7 +22,7 @@ public final class LazotepPlating extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); // Amass 1. - this.getSpellAbility().addEffect(new AmassEffect(1)); + this.getSpellAbility().addEffect(new AmassEffect(1, SubType.ZOMBIE)); // You and permanents you control gain hexproof until end of turn. Effect effect = new GainAbilityControllerEffect( diff --git a/Mage.Sets/src/mage/cards/l/LazotepReaver.java b/Mage.Sets/src/mage/cards/l/LazotepReaver.java index 6ba8493db3c..de85ebcc41a 100644 --- a/Mage.Sets/src/mage/cards/l/LazotepReaver.java +++ b/Mage.Sets/src/mage/cards/l/LazotepReaver.java @@ -24,7 +24,7 @@ public final class LazotepReaver extends CardImpl { this.toughness = new MageInt(2); // When Lazotep Reaver enters the battlefield, amass 1. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1, SubType.ZOMBIE))); } private LazotepReaver(final LazotepReaver card) { diff --git a/Mage.Sets/src/mage/cards/r/RelentlessAdvance.java b/Mage.Sets/src/mage/cards/r/RelentlessAdvance.java index 69a14bb7d1e..9ec227f47de 100644 --- a/Mage.Sets/src/mage/cards/r/RelentlessAdvance.java +++ b/Mage.Sets/src/mage/cards/r/RelentlessAdvance.java @@ -4,6 +4,7 @@ import mage.abilities.effects.keyword.AmassEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import java.util.UUID; @@ -16,7 +17,7 @@ public final class RelentlessAdvance extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{U}"); // Amass 3. (Put three +1/+1 counters on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first. - this.getSpellAbility().addEffect(new AmassEffect(3)); + this.getSpellAbility().addEffect(new AmassEffect(3, SubType.ZOMBIE)); } private RelentlessAdvance(final RelentlessAdvance card) { diff --git a/Mage.Sets/src/mage/cards/t/TollOfTheInvasion.java b/Mage.Sets/src/mage/cards/t/TollOfTheInvasion.java index 6f738ed5705..522d1a79e27 100644 --- a/Mage.Sets/src/mage/cards/t/TollOfTheInvasion.java +++ b/Mage.Sets/src/mage/cards/t/TollOfTheInvasion.java @@ -5,6 +5,7 @@ import mage.abilities.effects.keyword.AmassEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.StaticFilters; import mage.target.common.TargetOpponent; @@ -23,7 +24,7 @@ public final class TollOfTheInvasion extends CardImpl { this.getSpellAbility().addTarget(new TargetOpponent()); // Amass 1. - this.getSpellAbility().addEffect(new AmassEffect(1).concatBy("
")); + this.getSpellAbility().addEffect(new AmassEffect(1, SubType.ZOMBIE).concatBy("
")); } private TollOfTheInvasion(final TollOfTheInvasion card) { diff --git a/Mage.Sets/src/mage/cards/v/VizierOfTheScorpion.java b/Mage.Sets/src/mage/cards/v/VizierOfTheScorpion.java index 1d01decf18b..ddcfdcc5791 100644 --- a/Mage.Sets/src/mage/cards/v/VizierOfTheScorpion.java +++ b/Mage.Sets/src/mage/cards/v/VizierOfTheScorpion.java @@ -36,7 +36,7 @@ public final class VizierOfTheScorpion extends CardImpl { this.toughness = new MageInt(1); // When Vizier of the Scorpion enters the battlefield, amass 1. - this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new AmassEffect(1, SubType.ZOMBIE))); // Zombie tokens you control have deathtouch. this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect( diff --git a/Mage.Sets/src/mage/cards/w/WidespreadBrutality.java b/Mage.Sets/src/mage/cards/w/WidespreadBrutality.java index 92173b23d7c..29beafe37d2 100644 --- a/Mage.Sets/src/mage/cards/w/WidespreadBrutality.java +++ b/Mage.Sets/src/mage/cards/w/WidespreadBrutality.java @@ -8,6 +8,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; @@ -37,11 +40,17 @@ public final class WidespreadBrutality extends CardImpl { class WidespreadBrutalityEffect extends OneShotEffect { + private static final FilterPermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(Predicates.not(SubType.ARMY.getPredicate())); + } + WidespreadBrutalityEffect() { super(Outcome.Benefit); - staticText = "Amass 2, then the Army you amassed deals damage equal to its power to each non-Army creature. " + - "(To amass 2, put two +1/+1 counters on an Army you control. " + - "If you don't control one, create a 0/0 black Zombie Army creature token first.)"; + staticText = "amass Zombies 2, then the Army you amassed deals damage equal to its power " + + "to each non-Army creature. (To amass 2, put two +1/+1 counters on an Army you control. It's also " + + "a Zombie. If you don't control one, create a 0/0 black Zombie Army creature token first.)"; } private WidespreadBrutalityEffect(final WidespreadBrutalityEffect effect) { @@ -55,18 +64,16 @@ class WidespreadBrutalityEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - AmassEffect amassEffect = new AmassEffect(2); - amassEffect.apply(game, source); - Permanent amassedArmy = game.getPermanent(amassEffect.getAmassedCreatureId()); + Permanent amassedArmy = AmassEffect.doAmass(2, SubType.ZOMBIE, game, source); if (amassedArmy == null) { return false; } game.getState().processAction(game); int power = amassedArmy.getPower().getValue(); - for (Permanent permanent : game.getBattlefield().getActivePermanents(source.getControllerId(), game)) { - if (permanent != null && permanent.isCreature(game) && !permanent.hasSubtype(SubType.ARMY, game)) { - permanent.damage(power, amassedArmy.getId(), source, game); - } + for (Permanent permanent : game.getBattlefield().getActivePermanents( + filter, source.getControllerId(), source, game + )) { + permanent.damage(power, amassedArmy.getId(), source, game); } return true; } diff --git a/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java b/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java index 458409d08b0..bc8f733fd9d 100644 --- a/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java +++ b/Mage.Sets/src/mage/sets/TheLordOfTheRingsTalesOfMiddleEarth.java @@ -21,6 +21,7 @@ public final class TheLordOfTheRingsTalesOfMiddleEarth extends ExpansionSet { cards.add(new SetCardInfo("Aragorn and Arwen, Wed", 287, Rarity.MYTHIC, mage.cards.a.AragornAndArwenWed.class)); cards.add(new SetCardInfo("Bilbo, Retired Burglar", 196, Rarity.UNCOMMON, mage.cards.b.BilboRetiredBurglar.class)); cards.add(new SetCardInfo("Call of the Ring", 79, Rarity.RARE, mage.cards.c.CallOfTheRing.class)); + cards.add(new SetCardInfo("Dunland Crebain", 82, Rarity.COMMON, mage.cards.d.DunlandCrebain.class)); cards.add(new SetCardInfo("Forest", 280, Rarity.LAND, mage.cards.basiclands.Forest.class, FULL_ART_BFZ_VARIOUS)); cards.add(new SetCardInfo("Frodo Baggins", 205, Rarity.UNCOMMON, mage.cards.f.FrodoBaggins.class)); cards.add(new SetCardInfo("Frodo, Sauron's Bane", 18, Rarity.RARE, mage.cards.f.FrodoSauronsBane.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/AmassEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/AmassEffect.java index 10f42969471..5bafbd92a1b 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/AmassEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/AmassEffect.java @@ -1,10 +1,9 @@ package mage.abilities.effects.keyword; import mage.abilities.Ability; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.AddCardSubTypeTargetEffect; +import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.SubType; import mage.counters.CounterType; @@ -12,14 +11,15 @@ import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.game.permanent.token.OrcArmyToken; +import mage.game.permanent.token.Token; import mage.game.permanent.token.ZombieArmyToken; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; -import java.util.UUID; - /** * @author TheElk801 */ @@ -31,28 +31,23 @@ public class AmassEffect extends OneShotEffect { filter.add(SubType.ARMY.getPredicate()); } - private final DynamicValue amassNumber; - private UUID amassedCreatureId = null; + private final int amount; + private final SubType subType; - public AmassEffect(int amassNumber) { - this(StaticValue.get(amassNumber)); - staticText = "amass " + amassNumber + ". (Put " + CardUtil.numberToText(amassNumber) - + " +1/+1 counter" + (amassNumber > 1 ? "s " : " ") - + "on an Army you control. If you don't control one, " - + "create a 0/0 black Zombie Army creature token first.)"; - } - - public AmassEffect(DynamicValue amassNumber) { + public AmassEffect(int amount, SubType subType) { super(Outcome.BoostCreature); - this.amassNumber = amassNumber; - staticText = "amass X, where X is the number of " + amassNumber.getMessage() + ". (Put X +1/+1 counters" - + "on an Army you control. If you don't control one, " - + "create a 0/0 black Zombie Army creature token first.)"; + this.amount = amount; + this.subType = subType; + staticText = "amass " + subType + "s " + amount + ". (Put " + CardUtil.numberToText(amount) + + " +1/+1 counter" + (amount > 1 ? "s " : " ") + "on an Army you control. It's also " + + subType.getIndefiniteArticle() + ' ' + subType + ". If you don't control an Army, " + + "create a 0/0 black " + subType + " Army creature token first.)"; } private AmassEffect(final AmassEffect effect) { super(effect); - this.amassNumber = effect.amassNumber; + this.amount = effect.amount; + this.subType = effect.subType; } @Override @@ -62,29 +57,42 @@ public class AmassEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - int xValue = amassNumber.calculate(game, source, this); + return doAmass(amount, subType, game, source) != null; + } + + private static Token makeToken(SubType subType) { + switch (subType) { + case ORC: + return new OrcArmyToken(); + default: + case ZOMBIE: + return new ZombieArmyToken(); + } + } + + public static Permanent doAmass(int xValue, SubType subType, Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player == null) { - return false; + return null; } - if (!game.getBattlefield().containsControlled(filter, source, game, 1)) { - new CreateTokenEffect(new ZombieArmyToken()).apply(game, source); + if (!game.getBattlefield().contains(filter, source, game, 1)) { + makeToken(subType).putOntoBattlefield(1, game, source); } Target target = new TargetPermanent(filter); target.setNotTarget(true); - if (!player.choose(outcome, target, source, game)) { - return false; - } + player.choose(Outcome.BoostCreature, target, source, game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent == null) { - return false; + return null; } - permanent.addCounters(CounterType.P1P1.createInstance(xValue), source.getControllerId(), source, game); - this.amassedCreatureId = permanent.getId(); - return true; - } - - public UUID getAmassedCreatureId() { - return amassedCreatureId; + game.addEffect(new AddCardSubTypeTargetEffect(subType, Duration.Custom) + .setTargetPointer(new FixedTarget(permanent, game)), source); + if (xValue > 0) { + permanent.addCounters( + CounterType.P1P1.createInstance(xValue), + source.getControllerId(), source, game + ); + } + return permanent; } } diff --git a/Mage/src/main/java/mage/game/permanent/token/OrcArmyToken.java b/Mage/src/main/java/mage/game/permanent/token/OrcArmyToken.java new file mode 100644 index 00000000000..5fba2808379 --- /dev/null +++ b/Mage/src/main/java/mage/game/permanent/token/OrcArmyToken.java @@ -0,0 +1,31 @@ +package mage.game.permanent.token; + +import mage.MageInt; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * @author TheElk801 + */ +public final class OrcArmyToken extends TokenImpl { + + public OrcArmyToken() { + super("Orc Army Token", "0/0 black Orc Army creature token"); + + cardType.add(CardType.CREATURE); + color.setBlack(true); + subtype.add(SubType.ORC); + subtype.add(SubType.ARMY); + power = new MageInt(0); + toughness = new MageInt(0); + } + + private OrcArmyToken(final OrcArmyToken token) { + super(token); + } + + @Override + public OrcArmyToken copy() { + return new OrcArmyToken(this); + } +}