diff --git a/Mage.Sets/src/mage/cards/b/BrightPalmSoulAwakener.java b/Mage.Sets/src/mage/cards/b/BrightPalmSoulAwakener.java index 003d61fed41..4197f94d49f 100644 --- a/Mage.Sets/src/mage/cards/b/BrightPalmSoulAwakener.java +++ b/Mage.Sets/src/mage/cards/b/BrightPalmSoulAwakener.java @@ -36,7 +36,8 @@ public final class BrightPalmSoulAwakener extends CardImpl { this.addAbility(backupAbility); // Whenever this creature attacks, double the number of +1/+1 counters on target creature. That creature can't be blocked by creatures with power 2 or less this turn. - Ability ability = new AttacksTriggeredAbility(new BrightPalmSoulAwakenerEffect()); + Ability ability = new AttacksTriggeredAbility(new BrightPalmSoulAwakenerEffect()) + .setTriggerPhrase("Whenever this creature attacks, "); ability.addEffect(new CantBeBlockedTargetEffect( DauntAbility.getFilter(), Duration.EndOfTurn ).setText("that creature can't be blocked by creatures with power 2 or less this turn")); diff --git a/Mage.Sets/src/mage/cards/d/DarksteelSplicer.java b/Mage.Sets/src/mage/cards/d/DarksteelSplicer.java index a1a98ed45ae..88fdbb34262 100644 --- a/Mage.Sets/src/mage/cards/d/DarksteelSplicer.java +++ b/Mage.Sets/src/mage/cards/d/DarksteelSplicer.java @@ -41,7 +41,8 @@ public final class DarksteelSplicer extends CardImpl { // Whenever Darksteel Splicer or another nontoken Phyrexian enters the battlefield under your control, create X 3/3 colorless Phyrexian Golem artifact creature tokens, where X is the number of opponents you have. this.addAbility(new EntersBattlefieldThisOrAnotherTriggeredAbility( - new CreateTokenEffect(new PhyrexianGolemToken(), OpponentsCount.instance), + new CreateTokenEffect(new PhyrexianGolemToken(), OpponentsCount.instance) + .setText("create X 3/3 colorless Phyrexian Golem artifact creature tokens, where X is the number of opponents you have"), filter, false, true )); diff --git a/Mage.Sets/src/mage/cards/f/FiligreeVector.java b/Mage.Sets/src/mage/cards/f/FiligreeVector.java index 725101bf989..1886e46e96f 100644 --- a/Mage.Sets/src/mage/cards/f/FiligreeVector.java +++ b/Mage.Sets/src/mage/cards/f/FiligreeVector.java @@ -37,6 +37,7 @@ public final class FiligreeVector extends CardImpl { // When Filigree Vector enters the battlefield, put a +1/+1 counter on each of any number of target creatures and a charge counter on each of any number of target artifacts. Ability ability = new EntersBattlefieldTriggeredAbility( new AddCountersTargetEffect(CounterType.P1P1.createInstance()) + .setText("put a +1/+1 counter on each of any number of target creatures") ); ability.addEffect(new AddCountersTargetEffect(CounterType.CHARGE.createInstance()) .setText("and a charge counter on each of any number of target artifacts") diff --git a/Mage.Sets/src/mage/cards/f/FlamerushRider.java b/Mage.Sets/src/mage/cards/f/FlamerushRider.java index 2e9b56b0f46..76aec3b65b6 100644 --- a/Mage.Sets/src/mage/cards/f/FlamerushRider.java +++ b/Mage.Sets/src/mage/cards/f/FlamerushRider.java @@ -69,7 +69,7 @@ class FlamerushRiderEffect extends OneShotEffect { public FlamerushRiderEffect() { super(Outcome.Copy); - this.staticText = "create a token tapped and attacking that's a copy of another target attacking creature. Exile the token at end of combat"; + this.staticText = "create a token that's a copy of another target attacking creature and that's tapped and attacking. Exile the token at end of combat"; } public FlamerushRiderEffect(final FlamerushRiderEffect effect) { diff --git a/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java b/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java index d6400e167d0..ec180b4a220 100644 --- a/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java +++ b/Mage.Sets/src/mage/cards/f/FlameshadowConjuring.java @@ -39,7 +39,7 @@ public final class FlameshadowConjuring extends CardImpl { StaticFilters.FILTER_CONTROLLED_CREATURE_NON_TOKEN, false, SetTargetPointer.PERMANENT, "Whenever a nontoken creature enters the battlefield under your control, " + "you may pay {R}. If you do, create a token that's a copy of that creature. " - + "That token gains haste. Exile it at the beginning of the next end step"); + + "That token gains haste. Exile it at the beginning of the next end step."); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/h/HedronDetonator.java b/Mage.Sets/src/mage/cards/h/HedronDetonator.java index 0c0a170531a..9216c8054d9 100644 --- a/Mage.Sets/src/mage/cards/h/HedronDetonator.java +++ b/Mage.Sets/src/mage/cards/h/HedronDetonator.java @@ -37,7 +37,7 @@ public final class HedronDetonator extends CardImpl { // Whenever an artifact enters the battlefield under your control, Hedron Detonator deals 1 damage to target opponent. Ability ability = new EntersBattlefieldControlledTriggeredAbility( - new DamageTargetEffect(1), StaticFilters.FILTER_PERMANENT_ARTIFACT + new DamageTargetEffect(1), StaticFilters.FILTER_PERMANENT_ARTIFACT_AN ); ability.addTarget(new TargetOpponent()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/i/IonStorm.java b/Mage.Sets/src/mage/cards/i/IonStorm.java index 9eba2262522..0fb091e961c 100644 --- a/Mage.Sets/src/mage/cards/i/IonStorm.java +++ b/Mage.Sets/src/mage/cards/i/IonStorm.java @@ -28,7 +28,7 @@ public final class IonStorm extends CardImpl { // {1}{R}, Remove a +1/+1 counter or a charge counter from a permanent you control: Ion Storm deals 2 damage to any target. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new ManaCostsImpl<>("{1}{R}")); - ability.addCost(new OrCost(" Remove a +1/+1 counter or a charge counter from a permanent you control", new RemoveCounterCost(new TargetControlledPermanent(), CounterType.P1P1), new RemoveCounterCost(new TargetControlledPermanent(), CounterType.CHARGE))); + ability.addCost(new OrCost("Remove a +1/+1 counter or a charge counter from a permanent you control", new RemoveCounterCost(new TargetControlledPermanent(), CounterType.P1P1), new RemoveCounterCost(new TargetControlledPermanent(), CounterType.CHARGE))); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KalonianHydra.java b/Mage.Sets/src/mage/cards/k/KalonianHydra.java index 9d44e4580ec..8ff3f01c347 100644 --- a/Mage.Sets/src/mage/cards/k/KalonianHydra.java +++ b/Mage.Sets/src/mage/cards/k/KalonianHydra.java @@ -1,8 +1,5 @@ - package mage.cards.k; -import java.util.List; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; @@ -13,21 +10,23 @@ import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.List; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class KalonianHydra extends CardImpl { public KalonianHydra(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}"); this.subtype.add(SubType.HYDRA); this.power = new MageInt(0); @@ -35,11 +34,14 @@ public final class KalonianHydra extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); + // Kalonian Hydra enters the battlefield with four +1/+1 counters on it. - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(4)))); + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect( + CounterType.P1P1.createInstance(4), true + ), "with four +1/+1 counters on it")); + // Whenever Kalonian Hydra attacks, double the number of +1/+1 counters on each creature you control. this.addAbility(new AttacksTriggeredAbility(new KalonianHydraEffect(), false)); - } private KalonianHydra(final KalonianHydra card) { diff --git a/Mage.Sets/src/mage/cards/k/KnightExemplar.java b/Mage.Sets/src/mage/cards/k/KnightExemplar.java index bd08df50340..ab31af095d7 100644 --- a/Mage.Sets/src/mage/cards/k/KnightExemplar.java +++ b/Mage.Sets/src/mage/cards/k/KnightExemplar.java @@ -1,35 +1,31 @@ - - package mage.cards.k; -import java.util.UUID; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; /** - * * @author BetaSteward_at_googlemail.com */ public final class KnightExemplar extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Knight creatures"); - - static { - filter.add(SubType.KNIGHT.getPredicate()); - } + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent(SubType.KNIGHT, "Knight creatures"); public KnightExemplar(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.KNIGHT); @@ -38,16 +34,15 @@ public final class KnightExemplar extends CardImpl { // First strike this.addAbility(FirstStrikeAbility.getInstance()); - // Other Knight creatures you control get +1/+1 and are indestructible. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter, true))); - FilterCreaturePermanent indestructibleFilter = filter.copy(); - indestructibleFilter.add(AnotherPredicate.instance); - indestructibleFilter.add(TargetController.YOU.getControllerPredicate()); - indestructibleFilter.setMessage("Other Knight creatures you control"); - Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, indestructibleFilter, false); - effect.setText("Other Knight creatures you control are indestructible"); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + // Other Knight creatures you control get +1/+1 and are indestructible. + Ability ability = new SimpleStaticAbility(new BoostControlledEffect( + 1, 1, Duration.WhileOnBattlefield, filter, true + )); + ability.addEffect(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, false + ).setText("and have indestructible")); + this.addAbility(ability); } private KnightExemplar(final KnightExemplar card) { @@ -58,5 +53,4 @@ public final class KnightExemplar extends CardImpl { public KnightExemplar copy() { return new KnightExemplar(this); } - } diff --git a/Mage.Sets/src/mage/cards/l/LocthwainLancer.java b/Mage.Sets/src/mage/cards/l/LocthwainLancer.java index 0f86895c48c..ba68ecad4be 100644 --- a/Mage.Sets/src/mage/cards/l/LocthwainLancer.java +++ b/Mage.Sets/src/mage/cards/l/LocthwainLancer.java @@ -42,7 +42,7 @@ public final class LocthwainLancer extends CardImpl { // Whenever a nontoken Knight you control dies, each opponent loses 1 life and you draw a card. Ability ability = new DiesCreatureTriggeredAbility(new LoseLifeOpponentsEffect(1), false, filter); - ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and")); + ability.addEffect(new DrawCardSourceControllerEffect(1).concatBy("and you")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SlimefootAndSquee.java b/Mage.Sets/src/mage/cards/s/SlimefootAndSquee.java index 2b60e0010b8..18154564cd3 100644 --- a/Mage.Sets/src/mage/cards/s/SlimefootAndSquee.java +++ b/Mage.Sets/src/mage/cards/s/SlimefootAndSquee.java @@ -29,7 +29,7 @@ import java.util.UUID; */ public final class SlimefootAndSquee extends CardImpl { - private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.SAPROLING); + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.SAPROLING, "a Saproling"); private static final FilterCard filter2 = new FilterCreatureCard("another creature card from your graveyard"); static { diff --git a/Mage.Sets/src/mage/cards/w/WeirdingWood.java b/Mage.Sets/src/mage/cards/w/WeirdingWood.java index c9b3319ef6b..a665f9ad367 100644 --- a/Mage.Sets/src/mage/cards/w/WeirdingWood.java +++ b/Mage.Sets/src/mage/cards/w/WeirdingWood.java @@ -45,7 +45,7 @@ public final class WeirdingWood extends CardImpl { // Enchanted land has "{T}: Add two mana of any one color." Ability gainedAbility = new SimpleManaAbility(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(2), new TapSourceCost()); Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA); - effect.setText("Enchanted land has \"{T}: Add two mana of any color.\""); + effect.setText("Enchanted land has \"{T}: Add two mana of any one color.\""); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index b452d7db317..e782b7f2abe 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -63,8 +63,8 @@ public class VerifyCardDataTest { private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); - private static final String FULL_ABILITIES_CHECK_SET_CODE = "MOM"; // check all abilities and output cards with wrong abilities texts; private static final boolean CHECK_ONLY_ABILITIES_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages + private static final String FULL_ABILITIES_CHECK_SET_CODE = "MOC"; // check all abilities and output cards with wrong abilities texts; private static final boolean AUTO_FIX_SAMPLE_DECKS = false; // debug only: auto-fix sample decks by test_checkSampleDecks test run @@ -89,7 +89,7 @@ public class VerifyCardDataTest { private static final List evergreenKeywords = Arrays.asList( "flying", "lifelink", "menace", "trample", "haste", "first strike", "hexproof", "fear", "deathtouch", "double strike", "indestructible", "reach", "flash", "defender", "vigilance", - "plainswalk", "islandwalk", "swampwalk", "mountainwalk", "forestwalk", "myriad", "prowess" + "plainswalk", "islandwalk", "swampwalk", "mountainwalk", "forestwalk", "myriad", "prowess", "convoke" ); private static final List doubleNumbers = new ArrayList<>(); diff --git a/Mage/src/main/java/mage/abilities/common/BecomesTappedSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesTappedSourceTriggeredAbility.java index eb5d6174f88..dae9b327c9d 100644 --- a/Mage/src/main/java/mage/abilities/common/BecomesTappedSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/BecomesTappedSourceTriggeredAbility.java @@ -1,24 +1,23 @@ package mage.abilities.common; -import mage.constants.Zone; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; /** - * * @author nantuko */ public class BecomesTappedSourceTriggeredAbility extends TriggeredAbilityImpl { - public BecomesTappedSourceTriggeredAbility(Effect effect, boolean isOptional) { - super(Zone.BATTLEFIELD, effect, isOptional); + public BecomesTappedSourceTriggeredAbility(Effect effect) { + this(effect, false); } - public BecomesTappedSourceTriggeredAbility(Effect effect) { - super(Zone.BATTLEFIELD, effect); + public BecomesTappedSourceTriggeredAbility(Effect effect, boolean isOptional) { + super(Zone.BATTLEFIELD, effect, isOptional); setTriggerPhrase("Whenever {this} becomes tapped, "); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java index 4f597af1d0d..efa78371155 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/PreventDamageByTargetEffect.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import mage.MageObject; @@ -65,26 +64,28 @@ public class PreventDamageByTargetEffect extends PreventionEffectImpl { if (staticText != null && !staticText.isEmpty()) { return staticText; } + StringBuilder sb = new StringBuilder(); if (amountToPrevent == Integer.MAX_VALUE) { - StringBuilder sb = new StringBuilder(); sb.append("Prevent all"); if (onlyCombat) { sb.append(" combat"); } sb.append(" damage target "); - sb.append(mode.getTargets().get(0).getTargetName()).append(" would deal ").append(duration.toString()); - return sb.toString(); } else { - StringBuilder sb = new StringBuilder(); - sb.append("Prevent the next ").append(amountToPrevent); + sb.append("Prevent the next "); + sb.append(amountToPrevent); if (onlyCombat) { - sb.append("combat "); + sb.append(" combat"); } sb.append(" damage that "); - sb.append(mode.getTargets().get(0).getTargetName()).append(" would deal ").append(duration.toString()); - return sb.toString(); } - + sb.append(mode.getTargets().get(0).getTargetName()); + sb.append(" would deal "); + if (duration == Duration.EndOfTurn) { + sb.append("this turn"); + } else { + sb.append(duration); + } + return sb.toString(); } - } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java index c601bb23a05..3d1c3d829a8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityAttachedEffect.java @@ -1,6 +1,7 @@ package mage.abilities.effects.common.continuous; import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; import mage.abilities.Mode; import mage.abilities.TriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; @@ -140,7 +141,9 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl { } else { sb.append("gains "); } - boolean quotes = (ability instanceof SimpleActivatedAbility) || (ability instanceof TriggeredAbility); + boolean quotes = ability instanceof SimpleActivatedAbility + || ability instanceof TriggeredAbility + || ability instanceof LoyaltyAbility; if (quotes) { sb.append('"'); } diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/BolsterEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/BolsterEffect.java index 595a00b8d81..258d3e96d28 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/BolsterEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/BolsterEffect.java @@ -95,7 +95,7 @@ public class BolsterEffect extends OneShotEffect { } else { sb.append("X, where X is the number of "); sb.append(amount.getMessage()); - sb.append(" (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)"); + sb.append(". (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)"); } return sb.toString(); } diff --git a/Mage/src/main/java/mage/abilities/keyword/ImproviseAbility.java b/Mage/src/main/java/mage/abilities/keyword/ImproviseAbility.java index 2416de6cb22..1ca8ddec932 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ImproviseAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ImproviseAbility.java @@ -70,7 +70,7 @@ public class ImproviseAbility extends SimpleStaticAbility implements AlternateMa @Override public String getRule() { - return "Improvise (Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}.)"; + return "improvise (Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}.)"; } @Override diff --git a/Mage/src/main/java/mage/filter/FilterCard.java b/Mage/src/main/java/mage/filter/FilterCard.java index d62326d0045..0718eb2d682 100644 --- a/Mage/src/main/java/mage/filter/FilterCard.java +++ b/Mage/src/main/java/mage/filter/FilterCard.java @@ -83,7 +83,7 @@ public class FilterCard extends FilterObject { } public boolean hasPredicates() { - return !predicates.isEmpty(); + return !predicates.isEmpty() || !extraPredicates.isEmpty(); } @Override diff --git a/Mage/src/main/java/mage/game/permanent/token/StoneTrapIdolToken.java b/Mage/src/main/java/mage/game/permanent/token/StoneTrapIdolToken.java index cd4a78f1399..e32961c302d 100644 --- a/Mage/src/main/java/mage/game/permanent/token/StoneTrapIdolToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/StoneTrapIdolToken.java @@ -15,7 +15,7 @@ import java.util.Arrays; public final class StoneTrapIdolToken extends TokenImpl { public StoneTrapIdolToken() { - super("Construct Token", "6/12 colorless Construct artifact creature token with trample"); + super("Construct Token", "6/12 colorless Construct artifact creature token with trample"); cardType.add(CardType.CREATURE); cardType.add(CardType.ARTIFACT); subtype.add(SubType.CONSTRUCT);