diff --git a/Mage.Sets/src/mage/cards/c/ChokingMiasma.java b/Mage.Sets/src/mage/cards/c/ChokingMiasma.java index 6aee6b62f17..387f2146d85 100644 --- a/Mage.Sets/src/mage/cards/c/ChokingMiasma.java +++ b/Mage.Sets/src/mage/cards/c/ChokingMiasma.java @@ -35,7 +35,7 @@ public final class ChokingMiasma extends CardImpl { this.getSpellAbility().addEffect(new ChokingMiasmaEffect()); // All creatures get -2/-2 until end of turn. - this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new BoostAllEffect(-2, -2, Duration.EndOfTurn).concatBy("
")); } private ChokingMiasma(final ChokingMiasma card) { diff --git a/Mage.Sets/src/mage/cards/c/CombatResearch.java b/Mage.Sets/src/mage/cards/c/CombatResearch.java index 7803eff3e1c..a0c793e4cc3 100644 --- a/Mage.Sets/src/mage/cards/c/CombatResearch.java +++ b/Mage.Sets/src/mage/cards/c/CombatResearch.java @@ -47,7 +47,7 @@ public final class CombatResearch extends CardImpl { // Enchanted creature has "Whenever this creature deals combat damage to a player, draw a card." this.addAbility(new SimpleStaticAbility(new GainAbilityAttachedEffect( new DealsCombatDamageToAPlayerTriggeredAbility( - new DrawCardSourceControllerEffect(1), true + new DrawCardSourceControllerEffect(1), false ), AttachmentType.AURA ))); diff --git a/Mage.Sets/src/mage/cards/h/HauntingFigment.java b/Mage.Sets/src/mage/cards/h/HauntingFigment.java index 1149504b0f0..7dd52c077fb 100644 --- a/Mage.Sets/src/mage/cards/h/HauntingFigment.java +++ b/Mage.Sets/src/mage/cards/h/HauntingFigment.java @@ -38,7 +38,7 @@ public final class HauntingFigment extends CardImpl { // Haunting Figment can't be blocked as long as you've cast an instant or sorcery spell this turn. this.addAbility(new SimpleStaticAbility(new ConditionalRestrictionEffect( new CantBeBlockedSourceEffect(Duration.WhileOnBattlefield), HauntingFigmentCondition.instance, - "can't be blocked as long as you've cast an instant or sorcery spell this turn" + "{this} can't be blocked as long as you've cast an instant or sorcery spell this turn" )), new SpellsCastWatcher()); } diff --git a/Mage.Sets/src/mage/cards/k/KarnLivingLegacy.java b/Mage.Sets/src/mage/cards/k/KarnLivingLegacy.java index 1c33ffe83b6..6e8db8cb1eb 100644 --- a/Mage.Sets/src/mage/cards/k/KarnLivingLegacy.java +++ b/Mage.Sets/src/mage/cards/k/KarnLivingLegacy.java @@ -31,7 +31,9 @@ public final class KarnLivingLegacy extends CardImpl { this.setStartingLoyalty(4); // +1: Create a tapped Powerstone token. - this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new PowerstoneToken()), 1)); + this.addAbility(new LoyaltyAbility(new CreateTokenEffect( + new PowerstoneToken(), 1, true, false + ), 1)); // -1: Pay any amount of mana. Look at that many cards from the top of your library, then put one of those cards into your hand and rest on the bottom of your library in a random order. this.addAbility(new LoyaltyAbility(new KarnLivingLegacyEffect(), -1)); @@ -55,7 +57,7 @@ class KarnLivingLegacyEffect extends OneShotEffect { KarnLivingLegacyEffect() { super(Outcome.Benefit); staticText = "pay any amount of mana. Look at that many cards from the top of your library, " + - "then put one of those cards into your hand and rest on the bottom of your library in a random order"; + "then put one of those cards into your hand and the rest on the bottom of your library in a random order"; } private KarnLivingLegacyEffect(final KarnLivingLegacyEffect effect) { diff --git a/Mage.Sets/src/mage/cards/p/Pilfer.java b/Mage.Sets/src/mage/cards/p/Pilfer.java index 733ea7784e9..7988c0336aa 100644 --- a/Mage.Sets/src/mage/cards/p/Pilfer.java +++ b/Mage.Sets/src/mage/cards/p/Pilfer.java @@ -1,17 +1,16 @@ package mage.cards.p; -import java.util.UUID; - import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; import mage.filter.StaticFilters; -import mage.target.TargetPlayer; +import mage.target.common.TargetOpponent; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class Pilfer extends CardImpl { @@ -23,7 +22,7 @@ public final class Pilfer extends CardImpl { this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect( StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY )); - this.getSpellAbility().addTarget(new TargetPlayer()); + this.getSpellAbility().addTarget(new TargetOpponent()); } private Pilfer(final Pilfer card) { diff --git a/Mage.Sets/src/mage/cards/r/RaffWeatherlightStalwart.java b/Mage.Sets/src/mage/cards/r/RaffWeatherlightStalwart.java index 19690aed024..c596ae27515 100644 --- a/Mage.Sets/src/mage/cards/r/RaffWeatherlightStalwart.java +++ b/Mage.Sets/src/mage/cards/r/RaffWeatherlightStalwart.java @@ -48,7 +48,9 @@ public final class RaffWeatherlightStalwart extends CardImpl { // {3}{W}{W}: Creatures you control get +1/+1 and gain vigilance until end of turn. Ability ability = new SimpleActivatedAbility( - new BoostControlledEffect(1, 1, Duration.EndOfTurn), new ManaCostsImpl<>("{3}{W}{W}") + new BoostControlledEffect(1, 1, Duration.EndOfTurn) + .setText("creatures you control get +1/+1"), + new ManaCostsImpl<>("{3}{W}{W}") ); ability.addEffect(new GainAbilityControlledEffect( VigilanceAbility.getInstance(), Duration.EndOfTurn, diff --git a/Mage.Sets/src/mage/cards/r/RagefireHellkite.java b/Mage.Sets/src/mage/cards/r/RagefireHellkite.java index 3244dbf80b0..627f84e413e 100644 --- a/Mage.Sets/src/mage/cards/r/RagefireHellkite.java +++ b/Mage.Sets/src/mage/cards/r/RagefireHellkite.java @@ -34,7 +34,7 @@ public final class RagefireHellkite extends CardImpl { // Whenever Ragefire Hellkite attacks, you may sacrifice another creature. If you do, Ragefire Hellkite gains double strike until end of turn. this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid( new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn), - new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_CREATURE_SHORT_TEXT) + new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE) ))); } diff --git a/Mage.Sets/src/mage/cards/r/RonasVortex.java b/Mage.Sets/src/mage/cards/r/RonasVortex.java index e17953b00e9..f3c15ec3ca7 100644 --- a/Mage.Sets/src/mage/cards/r/RonasVortex.java +++ b/Mage.Sets/src/mage/cards/r/RonasVortex.java @@ -37,7 +37,7 @@ public final class RonasVortex extends CardImpl { this.getSpellAbility().addEffect(new ConditionalOneShotEffect( new PutOnLibraryTargetEffect(false), new ReturnToHandTargetEffect(), KickedCondition.ONCE, "return target creature or planeswalker you don't control to its owner's " + - "hand. If this spell was kicked, put that permanent on the bottom of its owner's library instaed" + "hand. If this spell was kicked, put that permanent on the bottom of its owner's library instead" )); this.getSpellAbility().addTarget(new TargetPermanent(filter)); } diff --git a/Mage.Sets/src/mage/cards/s/SheoldredsRestoration.java b/Mage.Sets/src/mage/cards/s/SheoldredsRestoration.java index ee1b09cd85d..01f608c1779 100644 --- a/Mage.Sets/src/mage/cards/s/SheoldredsRestoration.java +++ b/Mage.Sets/src/mage/cards/s/SheoldredsRestoration.java @@ -41,7 +41,7 @@ public final class SheoldredsRestoration extends CardImpl { )); // Exile Sheoldred's Restoration. - this.getSpellAbility().addEffect(new ExileSpellEffect()); + this.getSpellAbility().addEffect(new ExileSpellEffect().concatBy("
")); } private SheoldredsRestoration(final SheoldredsRestoration card) { diff --git a/Mage.Sets/src/mage/cards/s/StallForTime.java b/Mage.Sets/src/mage/cards/s/StallForTime.java index 3c695443c51..3695ad9f411 100644 --- a/Mage.Sets/src/mage/cards/s/StallForTime.java +++ b/Mage.Sets/src/mage/cards/s/StallForTime.java @@ -38,7 +38,7 @@ public final class StallForTime extends CardImpl { )); // Draw a card. - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("
")); } private StallForTime(final StallForTime card) { diff --git a/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java index f8c1fb93c79..fd41a8a1fe3 100644 --- a/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java +++ b/Mage.Sets/src/mage/cards/t/TemporalFirestorm.java @@ -39,7 +39,7 @@ public final class TemporalFirestorm extends CardImpl { // Temporal Firestorm deals 5 damage to each creature and each planeswalker. this.getSpellAbility().addEffect(new DamageAllEffect( 5, StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER - ).setText("{this} deals 5 damage to each creature and each planeswalker")); + ).setText("{this} deals 5 damage to each creature and each planeswalker").concatBy("
")); } private TemporalFirestorm(final TemporalFirestorm card) { diff --git a/Mage.Sets/src/mage/cards/t/ThranPortal.java b/Mage.Sets/src/mage/cards/t/ThranPortal.java index ad880dbc805..fa5502e0465 100644 --- a/Mage.Sets/src/mage/cards/t/ThranPortal.java +++ b/Mage.Sets/src/mage/cards/t/ThranPortal.java @@ -9,7 +9,6 @@ import mage.abilities.condition.InvertCondition; import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; import mage.abilities.costs.common.PayLifeCost; import mage.abilities.decorator.ConditionalOneShotEffect; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.ChooseBasicLandTypeEffect; import mage.abilities.effects.common.TapSourceEffect; @@ -52,8 +51,9 @@ public class ThranPortal extends CardImpl { // Mana abilities of Thran Portal cost an additional 1 life to activate. // This also adds the mana ability - this.addAbility(new SimpleStaticAbility(new ThranPortalAdditionalCostEffect())); - this.addAbility(new SimpleStaticAbility(new ThranPortalManaAbilityContinousEffect())); + Ability ability = new SimpleStaticAbility(new ThranPortalAdditionalCostEffect()); + ability.addEffect(new ThranPortalManaAbilityContinousEffect()); + this.addAbility(ability); } private ThranPortal(final ThranPortal card) { @@ -138,7 +138,6 @@ class ThranPortalAdditionalCostEffect extends CostModificationEffectImpl { ThranPortalAdditionalCostEffect() { super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.INCREASE_COST); - this.staticText = "mana abilities of {this} cost an additional 1 life to activate"; } private ThranPortalAdditionalCostEffect(final ThranPortalAdditionalCostEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/ToriDAvenantFuryRider.java b/Mage.Sets/src/mage/cards/t/ToriDAvenantFuryRider.java index 56d069bce4e..0882a1a9630 100644 --- a/Mage.Sets/src/mage/cards/t/ToriDAvenantFuryRider.java +++ b/Mage.Sets/src/mage/cards/t/ToriDAvenantFuryRider.java @@ -58,7 +58,7 @@ public final class ToriDAvenantFuryRider extends CardImpl { // Untap each other white attacking creature you control. Ability ability = new AttacksTriggeredAbility(new BoostControlledEffect(1, 1, Duration.EndOfTurn, filter, true)); ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filter2, true)); - ability.addEffect(new UntapAllControllerEffect(filter3, "untap each other white attacking creature you control", false)); + ability.addEffect(new UntapAllControllerEffect(filter3, "Untap each other white attacking creature you control", false)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/u/UrborgLhurgoyf.java b/Mage.Sets/src/mage/cards/u/UrborgLhurgoyf.java index 7ef5a3b11f9..cec62dc876f 100644 --- a/Mage.Sets/src/mage/cards/u/UrborgLhurgoyf.java +++ b/Mage.Sets/src/mage/cards/u/UrborgLhurgoyf.java @@ -1,16 +1,13 @@ package mage.cards.u; import mage.MageInt; -import mage.MageObject; -import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.AdditiveDynamicValue; import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.dynamicvalue.common.MultikickerCount; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.MillCardsControllerEffect; import mage.abilities.effects.common.continuous.SetBasePowerToughnessSourceEffect; import mage.abilities.keyword.KickerAbility; @@ -18,8 +15,6 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.StaticFilters; -import mage.game.Game; -import mage.players.Player; import java.util.UUID; @@ -28,7 +23,7 @@ import java.util.UUID; */ public final class UrborgLhurgoyf extends CardImpl { - private static final DynamicValue powerValue = new CardsInAllGraveyardsCount(StaticFilters.FILTER_CARD_CREATURE); + private static final DynamicValue powerValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_CREATURE); private static final DynamicValue toughnessValue = new AdditiveDynamicValue(powerValue, StaticValue.get(1)); public UrborgLhurgoyf(UUID ownerId, CardSetInfo setInfo) { @@ -54,7 +49,7 @@ public final class UrborgLhurgoyf extends CardImpl { this.addAbility(new SimpleStaticAbility( Zone.ALL, new SetBasePowerToughnessSourceEffect(powerValue, toughnessValue, Duration.EndOfGame, SubLayer.CharacteristicDefining_7a, false) - .setText("{this}'s power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1") + .setText("{this}'s power is equal to the number of creature cards in your graveyard and its toughness is equal to that number plus 1") )); } diff --git a/Mage.Sets/src/mage/cards/u/UurgSpawnOfTurg.java b/Mage.Sets/src/mage/cards/u/UurgSpawnOfTurg.java index 800f6ddf296..5e6fc8dbd11 100644 --- a/Mage.Sets/src/mage/cards/u/UurgSpawnOfTurg.java +++ b/Mage.Sets/src/mage/cards/u/UurgSpawnOfTurg.java @@ -27,7 +27,7 @@ import java.util.UUID; */ public final class UurgSpawnOfTurg extends CardImpl { - private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_LAND); + private static final DynamicValue xValue = new CardsInControllerGraveyardCount(StaticFilters.FILTER_CARD_LANDS); public UurgSpawnOfTurg(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}{B}{G}"); diff --git a/Mage.Sets/src/mage/cards/v/VodalianHexcatcher.java b/Mage.Sets/src/mage/cards/v/VodalianHexcatcher.java index 46222b6d2e4..e2a67a46c99 100644 --- a/Mage.Sets/src/mage/cards/v/VodalianHexcatcher.java +++ b/Mage.Sets/src/mage/cards/v/VodalianHexcatcher.java @@ -27,7 +27,7 @@ import java.util.UUID; public final class VodalianHexcatcher extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.MERFOLK, "Merfolk"); - private static final FilterControlledPermanent filter2 = new FilterControlledPermanent(SubType.MERFOLK); + private static final FilterControlledPermanent filter2 = new FilterControlledPermanent(SubType.MERFOLK, "Merfolk"); public VodalianHexcatcher(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); diff --git a/Mage.Sets/src/mage/cards/y/YotiaDeclaresWar.java b/Mage.Sets/src/mage/cards/y/YotiaDeclaresWar.java index 7ef24fb4110..b3e9170d40e 100644 --- a/Mage.Sets/src/mage/cards/y/YotiaDeclaresWar.java +++ b/Mage.Sets/src/mage/cards/y/YotiaDeclaresWar.java @@ -52,7 +52,7 @@ public final class YotiaDeclaresWar extends CardImpl { this, SagaChapter.CHAPTER_III, SagaChapter.CHAPTER_III, new Effects( new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE) - .setText("p to one target artifact you control becomes an artifact creature"), + .setText("up to one target artifact you control becomes an artifact creature"), new SetBasePowerToughnessTargetEffect(5, 5, Duration.EndOfTurn) .setText("with base power and toughness 4/4 until end of turn") ), new TargetPermanent(0, 1, StaticFilters.FILTER_CONTROLLED_PERMANENT_ARTIFACT) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 68401bf08c5..a3605b70419 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -60,7 +60,7 @@ public class VerifyCardDataTest { private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); - private static final String FULL_ABILITIES_CHECK_SET_CODE = "2X2"; // check all abilities and output cards with wrong abilities texts; + private static final String FULL_ABILITIES_CHECK_SET_CODE = "DMU"; // 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 private static final boolean ONLY_TEXT = false; // use when checking text locally, suppresses unnecessary checks and output messages diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java index d1ec6acbdd4..c48574ad4e9 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java @@ -1,16 +1,16 @@ package mage.abilities.effects.common.counter; -import mage.constants.Outcome; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.counters.CounterType; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; /** - * * @author North */ public class AddPoisonCounterTargetEffect extends OneShotEffect { @@ -48,9 +48,10 @@ public class AddPoisonCounterTargetEffect extends OneShotEffect { @Override public String getText(Mode mode) { - if(staticText != null && !staticText.isEmpty()) { + if (staticText != null && !staticText.isEmpty()) { return staticText; } - return "target " + mode.getTargets().get(0).getTargetName() + " gets " + Integer.toString(amount) + " poison counter(s)."; + return "target " + mode.getTargets().get(0).getTargetName() + " gets " + + CardUtil.numberToText(amount, "a") + " poison counter" + (amount > 1 ? "s" : "") + '.'; } }