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