diff --git a/Mage.Sets/src/mage/cards/c/ConfrontThePast.java b/Mage.Sets/src/mage/cards/c/ConfrontThePast.java new file mode 100644 index 0000000000..05017dc63f --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConfrontThePast.java @@ -0,0 +1,102 @@ +package mage.cards.c; + +import com.google.common.collect.Iterables; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.counters.CounterType; +import mage.filter.common.FilterPermanentCard; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.common.TargetPlaneswalkerPermanent; +import mage.target.targetadjustment.TargetAdjuster; + +import java.util.UUID; + +/** + * + * @author htrajan + */ +public final class ConfrontThePast extends CardImpl { + + public static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent(); + + static { + filter.add(TargetController.OPPONENT.getControllerPredicate()); + } + + public ConfrontThePast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{B}"); + + this.subtype.add(SubType.LESSON); + + // Choose one — + // • Return target planeswalker card with mana value X or less from your graveyard to the battlefield. + this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect() + .setText("return target planeswalker card with mana value X or less from your graveyard to the battlefield")); + this.getSpellAbility().setTargetAdjuster(ConfrontThePastAdjuster.instance); + + // • Remove twice X loyalty counters from target planeswalker an opponent controls. + Mode mode = new Mode(); + mode.addEffect(new ConfrontThePastLoyaltyEffect()); + mode.addTarget(new TargetPlaneswalkerPermanent(filter)); + this.getSpellAbility().addMode(mode); + } + + private ConfrontThePast(final ConfrontThePast card) { + super(card); + } + + @Override + public ConfrontThePast copy() { + return new ConfrontThePast(this); + } +} + +enum ConfrontThePastAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + if (Iterables.getOnlyElement(ability.getEffects()) instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { + int xValue = ability.getManaCostsToPay().getX(); + ability.getTargets().clear(); + FilterPermanentCard filter = new FilterPermanentCard("planeswalker card with mana value X or less"); + filter.add(CardType.PLANESWALKER.getPredicate()); + filter.add(new ConvertedManaCostPredicate(ComparisonType.FEWER_THAN, xValue + 1)); + ability.addTarget(new TargetCardInYourGraveyard(filter)); + } + } +} + +class ConfrontThePastLoyaltyEffect extends OneShotEffect { + + ConfrontThePastLoyaltyEffect() { + super(Outcome.Benefit); + staticText = "remove twice X loyalty counters from target planeswalker an opponent controls"; + } + + public ConfrontThePastLoyaltyEffect(ConfrontThePastLoyaltyEffect effect) { + super(effect); + } + + @Override + public ConfrontThePastLoyaltyEffect copy() { + return new ConfrontThePastLoyaltyEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int xValue = source.getManaCostsToPay().getX(); + Permanent target = game.getPermanent(source.getFirstTarget()); + target.removeCounters(CounterType.LOYALTY.createInstance(xValue * 2), source, game); + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/f/FirstDayOfClass.java b/Mage.Sets/src/mage/cards/f/FirstDayOfClass.java new file mode 100644 index 0000000000..8f43c09fee --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FirstDayOfClass.java @@ -0,0 +1,82 @@ +package mage.cards.f; + +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.LearnEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +import java.util.UUID; + +/** + * + * @author htrajan + */ +public final class FirstDayOfClass extends CardImpl { + + public FirstDayOfClass(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}"); + + // Whenever a creature enters the battlefield under your control this turn, put a +1/+1 counter on it and it gains haste until end of turn. + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new FirstDayOfClassTriggeredAbility())); + + // Learn. + this.getSpellAbility().addEffect(new LearnEffect().concatBy("
")); + } + + private FirstDayOfClass(final FirstDayOfClass card) { + super(card); + } + + @Override + public FirstDayOfClass copy() { + return new FirstDayOfClass(this); + } +} + +class FirstDayOfClassTriggeredAbility extends DelayedTriggeredAbility { + + public FirstDayOfClassTriggeredAbility() { + super(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), Duration.EndOfTurn, false); + this.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); + } + + public FirstDayOfClassTriggeredAbility(FirstDayOfClassTriggeredAbility ability) { + super(ability); + } + + @Override + public FirstDayOfClassTriggeredAbility copy() { + return new FirstDayOfClassTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent.isCreature() && permanent.isControlledBy(this.getControllerId())) { + getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game)); + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever a creature enters the battlefield under your control this turn, put a +1/+1 counter on it and it gains haste until end of turn"; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/p/PlarggDeanOfChaos.java b/Mage.Sets/src/mage/cards/p/PlarggDeanOfChaos.java new file mode 100644 index 0000000000..589c477d4f --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PlarggDeanOfChaos.java @@ -0,0 +1,185 @@ +package mage.cards.p; + +import mage.ApprovingObject; +import mage.abilities.Ability; +import mage.abilities.common.AttacksWithCreaturesTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.UntapAllControllerEffect; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.cards.Card; +import mage.cards.CardSetInfo; +import mage.cards.CardsImpl; +import mage.cards.ModalDoubleFacesCard; +import mage.constants.*; +import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.filter.predicate.permanent.UntappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; + +import java.util.UUID; + +/** + * + * @author htrajan + */ +public final class PlarggDeanOfChaos extends ModalDoubleFacesCard { + + private static final FilterCreaturePermanent tappedFilter = new FilterCreaturePermanent("tapped creatures you control"); + private static final FilterCreaturePermanent untappedFilter = new FilterCreaturePermanent("untapped creatures you control"); + + static { + tappedFilter.add(TappedPredicate.instance); + tappedFilter.add(TargetController.YOU.getControllerPredicate()); + + untappedFilter.add(UntappedPredicate.instance); + untappedFilter.add(TargetController.YOU.getControllerPredicate()); + } + + public PlarggDeanOfChaos(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ORC, SubType.SHAMAN}, "{1}{R}", + "Augusta, Dean of Order", new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.CLERIC}, "{2}{W}"); + + // 1. + // Plargg, Dean of Chaos + // Legendary Creature - Orc Shaman + this.getLeftHalfCard().addSuperType(SuperType.LEGENDARY); + this.getLeftHalfCard().setPT(2, 2); + + // {T}, Discard a card: Draw a card. + SimpleActivatedAbility rummageAbility = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new TapSourceCost()); + rummageAbility.addCost(new DiscardCardCost()); + this.getLeftHalfCard().addAbility(rummageAbility); + + // {4}{R}, {T}: Reveal cards from the top of your library until you reveal a nonlegendary, nonland card with mana value 3 or less. You may cast that card without paying its mana cost. Put all revealed cards not cast this way on the bottom of your library in a random order. + SimpleActivatedAbility ability = new SimpleActivatedAbility(new PlarggDeanOfChaosEffect(), new ManaCostsImpl<>("{4}{R}")); + ability.addCost(new TapSourceCost()); + this.getLeftHalfCard().addAbility(ability); + + // 2. + // Augusta, Dean of Order + // Legendary Creature - Human Cleric + this.getRightHalfCard().addSuperType(SuperType.LEGENDARY); + this.getRightHalfCard().setPT(1, 3); + + // Other tapped creatures you control get +1/+0. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostAllEffect( + StaticValue.get(1), StaticValue.get(0), Duration.WhileOnBattlefield, tappedFilter, true))); + + // Other untapped creatures you control get +0/+1. + this.getRightHalfCard().addAbility(new SimpleStaticAbility(new BoostAllEffect( + StaticValue.get(0), StaticValue.get(1), Duration.WhileOnBattlefield, untappedFilter, true))); + + // Whenever you attack, untap each creature you control, then tap any number of creatures you control. + AttacksWithCreaturesTriggeredAbility augustaAbility = new AttacksWithCreaturesTriggeredAbility( + new UntapAllControllerEffect(StaticFilters.FILTER_PERMANENT_CREATURES, "untap each creature you control"), 0); + augustaAbility.addEffect(new AugustaDeanOfOrderEffect().concatBy(", then")); + this.getRightHalfCard().addAbility(augustaAbility); + } + + private PlarggDeanOfChaos(final PlarggDeanOfChaos card) { + super(card); + } + + @Override + public PlarggDeanOfChaos copy() { + return new PlarggDeanOfChaos(this); + } +} + +class PlarggDeanOfChaosEffect extends OneShotEffect { + + public PlarggDeanOfChaosEffect() { + super(Outcome.PlayForFree); + this.staticText = "reveal cards from the top of your library until you reveal a " + + "nonlegendary, nonland card with converted mana cost 3 or less. " + + "You may cast that card without paying its mana cost. Put all revealed " + + "cards not cast this way on the bottom of your library in a random order"; + } + + public PlarggDeanOfChaosEffect(PlarggDeanOfChaosEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + boolean cardWasCast = false; + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.getLibrary().hasCards()) { + CardsImpl toReveal = new CardsImpl(); + Card eligibleCard = null; + for (Card card : controller.getLibrary().getCards(game)) { + toReveal.add(card); + if (!card.isLand() && !card.isLegendary() && card.getConvertedManaCost() < 4) { + eligibleCard = card; + break; + } + } + controller.revealCards(source, toReveal, game); + if (eligibleCard != null + && controller.chooseUse(Outcome.PlayForFree, "Cast " + eligibleCard.getLogName() + " without paying its mana cost?", source, game)) { + game.getState().setValue("PlayFromNotOwnHandZone" + eligibleCard.getId(), Boolean.TRUE); + cardWasCast = controller.cast(controller.chooseAbilityForCast(eligibleCard, game, true), + game, true, new ApprovingObject(source, game)); + game.getState().setValue("PlayFromNotOwnHandZone" + eligibleCard.getId(), null); + if (cardWasCast) { + toReveal.remove(eligibleCard); + } + } + controller.putCardsOnBottomOfLibrary(toReveal, game, source, false); + } + return cardWasCast; + } + + @Override + public PlarggDeanOfChaosEffect copy() { + return new PlarggDeanOfChaosEffect(this); + } +} + +class AugustaDeanOfOrderEffect extends OneShotEffect { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(UntappedPredicate.instance); + } + + public AugustaDeanOfOrderEffect() { + super(Outcome.Benefit); + staticText = "tap any number of creatures you control"; + } + + public AugustaDeanOfOrderEffect(AugustaDeanOfOrderEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + Player controller = game.getPlayer(source.getControllerId()); + controller.chooseTarget(Outcome.Benefit, target, source, game); + target.getTargets().forEach(t -> { + Permanent permanent = game.getPermanent(t); + permanent.tap(source, game); + }); + return true; + } + + @Override + public AugustaDeanOfOrderEffect copy() { + return new AugustaDeanOfOrderEffect(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/s/ShaileDeanOfRadiance.java b/Mage.Sets/src/mage/cards/s/ShaileDeanOfRadiance.java new file mode 100644 index 0000000000..31bc50fd8d --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShaileDeanOfRadiance.java @@ -0,0 +1,91 @@ +package mage.cards.s; + +import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardSetInfo; +import mage.cards.ModalDoubleFacesCard; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicate; +import mage.filter.predicate.mageobject.AnotherPredicate; +import mage.filter.predicate.permanent.EnteredThisTurnPredicate; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +import java.util.UUID; + +/** + * + * @author htrajan + */ +public final class ShaileDeanOfRadiance extends ModalDoubleFacesCard { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("another target creature"); + private static final FilterPermanent shaileFilter = new FilterControlledCreaturePermanent("creature that entered the battlefield under your control this turn"); + private static final FilterPermanent embroseFilter = new FilterControlledCreaturePermanent("a creature you control with a +1/+1 counter on it"); + + static { + filter.add(AnotherPredicate.instance); + shaileFilter.add(EnteredThisTurnPredicate.instance); + shaileFilter.add((Predicate) (input, game) -> !input.checkControlChanged(game)); + embroseFilter.add(CounterType.P1P1.getPredicate()); + } + + public ShaileDeanOfRadiance(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, + new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BIRD, SubType.CLERIC}, "{1}{W}", + "Embrose, Dean of Shadow", new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARLOCK}, "{2}{B}{B}"); + + // 1. + // Shaile, Dean of Radiance + // Legendary Creature - Bird Cleric + this.getLeftHalfCard().addSuperType(SuperType.LEGENDARY); + this.getLeftHalfCard().setPT(1, 1); + + // Flying + this.getLeftHalfCard().addAbility(FlyingAbility.getInstance()); + + // Vigilance + this.getLeftHalfCard().addAbility(VigilanceAbility.getInstance()); + + // {T}: Put a +1/+1 counter on each creature that entered the battlefield under your control this turn. + this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), shaileFilter), new TapSourceCost())); + + // 2. + // Embrose, Dean of Shadow + // Legendary Creature - Human Warlock + this.getRightHalfCard().addSuperType(SuperType.LEGENDARY); + this.getRightHalfCard().setPT(4, 4); + + // {T}: Put a +1/+1 counter on another target creature, then Embrose, Dean of Shadow deals 2 damage to that creature. + Ability ability = new SimpleActivatedAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new TapSourceCost()); + ability.addEffect(new DamageTargetEffect(2).concatBy(", then").setText("{this} deals 2 damage to that creature")); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.getRightHalfCard().addAbility(ability); + + // Whenever a creature you control with a +1/+1 counter on it dies, draw a card. + this.getRightHalfCard().addAbility(new DiesCreatureTriggeredAbility(new DrawCardSourceControllerEffect(1), false, embroseFilter)); + } + + private ShaileDeanOfRadiance(final ShaileDeanOfRadiance card) { + super(card); + } + + @Override + public ShaileDeanOfRadiance copy() { + return new ShaileDeanOfRadiance(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java index ab430de32d..f8ee9efc37 100644 --- a/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java +++ b/Mage.Sets/src/mage/sets/StrixhavenSchoolOfMages.java @@ -48,6 +48,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Clever Lumimancer", 10, Rarity.UNCOMMON, mage.cards.c.CleverLumimancer.class)); cards.add(new SetCardInfo("Cogwork Archivist", 254, Rarity.COMMON, mage.cards.c.CogworkArchivist.class)); cards.add(new SetCardInfo("Combat Professor", 11, Rarity.COMMON, mage.cards.c.CombatProfessor.class)); + cards.add(new SetCardInfo("Confront the Past", 67, Rarity.RARE, mage.cards.c.ConfrontThePast.class)); cards.add(new SetCardInfo("Crackle with Power", 95, Rarity.MYTHIC, mage.cards.c.CrackleWithPower.class)); cards.add(new SetCardInfo("Creative Outburst", 171, Rarity.UNCOMMON, mage.cards.c.CreativeOutburst.class)); cards.add(new SetCardInfo("Culmination of Studies", 173, Rarity.RARE, mage.cards.c.CulminationOfStudies.class)); @@ -65,6 +66,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Expel", 18, Rarity.COMMON, mage.cards.e.Expel.class)); cards.add(new SetCardInfo("Exponential Growth", 130, Rarity.RARE, mage.cards.e.ExponentialGrowth.class)); cards.add(new SetCardInfo("Field Trip", 131, Rarity.COMMON, mage.cards.f.FieldTrip.class)); + cards.add(new SetCardInfo("First Day of Class", 102, Rarity.COMMON, mage.cards.f.FirstDayOfClass.class)); cards.add(new SetCardInfo("Forest", 374, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fortifying Draught", 132, Rarity.UNCOMMON, mage.cards.f.FortifyingDraught.class)); cards.add(new SetCardInfo("Frost Trickster", 43, Rarity.COMMON, mage.cards.f.FrostTrickster.class)); @@ -111,6 +113,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Pest Summoning", 211, Rarity.COMMON, mage.cards.p.PestSummoning.class)); cards.add(new SetCardInfo("Pilgrim of the Ages", 22, Rarity.COMMON, mage.cards.p.PilgrimOfTheAges.class)); cards.add(new SetCardInfo("Plains", 366, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plargg, Dean of Chaos", 155, Rarity.RARE, mage.cards.p.PlarggDeanOfChaos.class)); cards.add(new SetCardInfo("Pop Quiz", 49, Rarity.COMMON, mage.cards.p.PopQuiz.class)); cards.add(new SetCardInfo("Practical Research", 212, Rarity.UNCOMMON, mage.cards.p.PracticalResearch.class)); cards.add(new SetCardInfo("Prismari Apprentice", 213, Rarity.UNCOMMON, mage.cards.p.PrismariApprentice.class)); @@ -136,6 +139,7 @@ public final class StrixhavenSchoolOfMages extends ExpansionSet { cards.add(new SetCardInfo("Secret Rendezvous", 26, Rarity.UNCOMMON, mage.cards.s.SecretRendezvous.class)); cards.add(new SetCardInfo("Serpentine Curve", 52, Rarity.COMMON, mage.cards.s.SerpentineCurve.class)); cards.add(new SetCardInfo("Shadewing Laureate", 229, Rarity.COMMON, mage.cards.s.ShadewingLaureate.class)); + cards.add(new SetCardInfo("Shaile, Dean of Radiance", 158, Rarity.RARE, mage.cards.s.ShaileDeanOfRadiance.class)); cards.add(new SetCardInfo("Shineshadow Snarl", 272, Rarity.RARE, mage.cards.s.ShineshadowSnarl.class)); cards.add(new SetCardInfo("Silverquill Apprentice", 231, Rarity.UNCOMMON, mage.cards.s.SilverquillApprentice.class)); cards.add(new SetCardInfo("Silverquill Campus", 273, Rarity.COMMON, mage.cards.s.SilverquillCampus.class)); diff --git a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java index b2cb416351..c93994fef9 100644 --- a/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/AttacksWithCreaturesTriggeredAbility.java @@ -67,6 +67,9 @@ public class AttacksWithCreaturesTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { + if (minAttackers == 0) { + return "Whenever you attack, " + super.getRule(); + } StringBuilder sb = new StringBuilder("Whenever you attack with " + CardUtil.numberToText(minAttackers) + " or more "); sb.append(filter.getMessage()); sb.append(", ");