From 9abaa75bd4a74920fca2a818b5f05d2d0dd10fe3 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Tue, 25 Apr 2023 15:30:00 -0400 Subject: [PATCH] Various text fixes (#10251) * Fix text: Invigorate (fixes #8708) - override * Fix text: sacrifice multiple permanents (as cost) * Fix text: Coral Colony - override and add hint * Fix text: Corpse Harvester (fixes #7837) - override * Fix text: Solitary Camel, Sidewinder Naga * Fix text: Malicious Advice * Fix text: Ray of Command * Fix text: Retreat to Hagra * Fix reminder text for "End the turn." * Fix text: Elspeth, Undaunted Hero * Fix text: Gideon, Champion of Justice * Fix text generation for condition: no counters * Fix text: PhantasmalSphere * Fix text: Retaliation * Fix text generation for additional cost: discard X cards * Fix text: Soul Separator * Fix text: Thundermaw Hellkite * Fix text: Torment of Hailfire * Fix text: Twilight Prophet * Fix text: ETB cantrips next turn's upkeep * Fix text: Venser's Journal --- Mage.Sets/src/mage/cards/b/BankruptInBlood.java | 9 +++++++-- Mage.Sets/src/mage/cards/b/BestialFury.java | 3 ++- Mage.Sets/src/mage/cards/b/BogDown.java | 9 ++++++--- Mage.Sets/src/mage/cards/c/CarrierPigeons.java | 3 ++- Mage.Sets/src/mage/cards/c/CoralColony.java | 7 ++++--- Mage.Sets/src/mage/cards/c/CorpseHarvester.java | 3 ++- .../src/mage/cards/e/ElspethUndauntedHero.java | 2 +- Mage.Sets/src/mage/cards/g/GaeasBalance.java | 11 ++++++++--- .../src/mage/cards/g/GideonChampionOfJustice.java | 5 +++-- Mage.Sets/src/mage/cards/h/Hecatomb.java | 9 ++++++--- Mage.Sets/src/mage/cards/i/Invigorate.java | 5 +++-- Mage.Sets/src/mage/cards/j/JeweledAmulet.java | 2 +- Mage.Sets/src/mage/cards/k/KrovikanFetish.java | 3 ++- Mage.Sets/src/mage/cards/k/KrovikanPlague.java | 3 ++- Mage.Sets/src/mage/cards/m/MaliciousAdvice.java | 2 +- Mage.Sets/src/mage/cards/p/PhantasmalSphere.java | 4 ++-- Mage.Sets/src/mage/cards/p/PhyrexianTribute.java | 9 +++++++-- Mage.Sets/src/mage/cards/p/Pyknite.java | 3 ++- Mage.Sets/src/mage/cards/r/RayOfCommand.java | 4 ++-- Mage.Sets/src/mage/cards/r/Retaliation.java | 2 +- Mage.Sets/src/mage/cards/r/RetreatToHagra.java | 2 +- Mage.Sets/src/mage/cards/r/RitualOfSteel.java | 4 +++- Mage.Sets/src/mage/cards/s/SidewinderNaga.java | 15 ++++----------- Mage.Sets/src/mage/cards/s/SolitaryCamel.java | 2 +- Mage.Sets/src/mage/cards/s/SoulSeparator.java | 4 ++-- .../src/mage/cards/t/ThundermawHellkite.java | 2 +- Mage.Sets/src/mage/cards/t/TormentOfHailfire.java | 2 +- Mage.Sets/src/mage/cards/t/TwilightProphet.java | 2 +- Mage.Sets/src/mage/cards/v/Vampirism.java | 3 ++- Mage.Sets/src/mage/cards/v/VensersJournal.java | 3 ++- .../common/SourceHasCounterCondition.java | 10 ++++++++-- .../costs/common/DiscardXTargetCost.java | 2 +- .../abilities/effects/common/EndTurnEffect.java | 2 +- 33 files changed, 92 insertions(+), 59 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BankruptInBlood.java b/Mage.Sets/src/mage/cards/b/BankruptInBlood.java index f858051b679e..7b59afbfc5ca 100644 --- a/Mage.Sets/src/mage/cards/b/BankruptInBlood.java +++ b/Mage.Sets/src/mage/cards/b/BankruptInBlood.java @@ -5,7 +5,9 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.target.common.TargetControlledPermanent; import java.util.UUID; @@ -14,11 +16,14 @@ */ public final class BankruptInBlood extends CardImpl { + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("creatures"); + public BankruptInBlood(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); // As an additional cost to cast this spell, sacrifice two creatures. - this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(2))); + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(2, filter))); // Draw three cards. this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); diff --git a/Mage.Sets/src/mage/cards/b/BestialFury.java b/Mage.Sets/src/mage/cards/b/BestialFury.java index 8946f54ad4b8..9f7ee4f8f2f5 100644 --- a/Mage.Sets/src/mage/cards/b/BestialFury.java +++ b/Mage.Sets/src/mage/cards/b/BestialFury.java @@ -43,7 +43,8 @@ public BestialFury(UUID ownerId, CardSetInfo setInfo) { // When Bestial Fury enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)), false)); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)) + .setText("draw a card at the beginning of the next turn's upkeep"), false)); // Whenever enchanted creature becomes blocked, it gets +4/+0 and gains trample until end of turn. Ability pumpAbility = new BecomesBlockedAttachedTriggeredAbility(new BoostEnchantedEffect(4, 0, Duration.EndOfTurn), false); diff --git a/Mage.Sets/src/mage/cards/b/BogDown.java b/Mage.Sets/src/mage/cards/b/BogDown.java index b4885e20d0c8..6ea18fb5bcbb 100644 --- a/Mage.Sets/src/mage/cards/b/BogDown.java +++ b/Mage.Sets/src/mage/cards/b/BogDown.java @@ -8,7 +8,8 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.target.TargetPlayer; import mage.target.common.TargetControlledPermanent; @@ -19,12 +20,14 @@ */ public final class BogDown extends CardImpl { + private static final FilterControlledPermanent filter + = new FilterControlledLandPermanent("lands"); + public BogDown(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); // Kicker-Sacrifice two lands. - this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, 2, - StaticFilters.FILTER_CONTROLLED_LAND_SHORT_TEXT, true)))); + this.addAbility(new KickerAbility(new SacrificeTargetCost(new TargetControlledPermanent(2, filter)))); // Target player discards two cards. If Bog Down was kicked, that player discards three cards instead. this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new DiscardTargetEffect(3), diff --git a/Mage.Sets/src/mage/cards/c/CarrierPigeons.java b/Mage.Sets/src/mage/cards/c/CarrierPigeons.java index e05912afe5c6..47d1873b5b11 100644 --- a/Mage.Sets/src/mage/cards/c/CarrierPigeons.java +++ b/Mage.Sets/src/mage/cards/c/CarrierPigeons.java @@ -31,7 +31,8 @@ public CarrierPigeons(UUID ownerId, CardSetInfo setInfo) { // When Carrier Pigeons enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false))); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse), false) + .setText("draw a card at the beginning of the next turn's upkeep"))); } private CarrierPigeons(final CarrierPigeons card) { diff --git a/Mage.Sets/src/mage/cards/c/CoralColony.java b/Mage.Sets/src/mage/cards/c/CoralColony.java index fdccb4f61155..9f8875fcd48c 100644 --- a/Mage.Sets/src/mage/cards/c/CoralColony.java +++ b/Mage.Sets/src/mage/cards/c/CoralColony.java @@ -47,11 +47,12 @@ public CoralColony(UUID ownerId, CardSetInfo setInfo) { // Defender this.addAbility(DefenderAbility.getInstance()); - // {1}{U}, {T}: Target player mills X cards, where X is the number of cards you control with defender. - Ability ability = new SimpleActivatedAbility(new MillCardsTargetEffect(xValue), new ManaCostsImpl<>("{1}{U}")); + // {1}{U}, {T}: Target player mills X cards, where X is the number of creatures you control with defender. + String ruleText = "target player mills X cards, where X is the number of creatures you control with defender"; + Ability ability = new SimpleActivatedAbility(new MillCardsTargetEffect(xValue).setText(ruleText), new ManaCostsImpl<>("{1}{U}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetPlayer()); - this.addAbility(ability); + this.addAbility(ability.addHint(hint)); } private CoralColony(final CoralColony card) { diff --git a/Mage.Sets/src/mage/cards/c/CorpseHarvester.java b/Mage.Sets/src/mage/cards/c/CorpseHarvester.java index 31ed6ac0813f..414d5560230d 100644 --- a/Mage.Sets/src/mage/cards/c/CorpseHarvester.java +++ b/Mage.Sets/src/mage/cards/c/CorpseHarvester.java @@ -35,9 +35,10 @@ public CorpseHarvester(UUID ownerId, CardSetInfo setInfo) { this.toughness = new MageInt(3); // {1}{B}, {tap}, Sacrifice a creature: Search your library for a Zombie card and a Swamp card, reveal them, and put them into your hand. Then shuffle your library. + String ruleText = "Search your library for a Zombie card and a Swamp card, reveal them, put them into your hand, then shuffle."; Ability ability = new SimpleActivatedAbility(new SearchLibraryPutInHandEffect( new CorpseHarvesterTarget(), true - ), new ManaCostsImpl<>("{1}{B}")); + ).setText(ruleText), new ManaCostsImpl<>("{1}{B}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(FILTER_CONTROLLED_CREATURE_SHORT_TEXT))); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/e/ElspethUndauntedHero.java b/Mage.Sets/src/mage/cards/e/ElspethUndauntedHero.java index cb21d7facd4c..05c76249022f 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethUndauntedHero.java +++ b/Mage.Sets/src/mage/cards/e/ElspethUndauntedHero.java @@ -41,7 +41,7 @@ public ElspethUndauntedHero(UUID ownerId, CardSetInfo setInfo) { this.setStartingLoyalty(5); // +2: Put a +1/+1 counter on each of up to two target creatures. - Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()), 2); + Ability ability = new LoyaltyAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()).setText("put a +1/+1 counter on each of up to two target creatures"), 2); ability.addTarget(new TargetPermanent(0, 2, StaticFilters.FILTER_PERMANENT_CREATURES)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/g/GaeasBalance.java b/Mage.Sets/src/mage/cards/g/GaeasBalance.java index 624f8541c35f..4a9939805aa5 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasBalance.java +++ b/Mage.Sets/src/mage/cards/g/GaeasBalance.java @@ -8,7 +8,8 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.FilterCard; -import mage.filter.StaticFilters; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterLandCard; import mage.filter.predicate.Predicates; import mage.game.Game; @@ -22,16 +23,20 @@ */ public final class GaeasBalance extends CardImpl { + private static final FilterControlledPermanent filter + = new FilterControlledLandPermanent("lands"); + public GaeasBalance(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}"); // As an additional cost to cast Gaea's Balance, sacrifice five lands. this.getSpellAbility().addCost(new SacrificeTargetCost( - new TargetControlledPermanent(5, StaticFilters.FILTER_CONTROLLED_LAND_SHORT_TEXT) + new TargetControlledPermanent(5, filter) )); // Search your library for a land card of each basic land type and put them onto the battlefield. Then shuffle your library. - this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new GaeasBalanceTarget())); + String ruleText = "Search your library for a land card of each basic land type, put those cards onto the battlefield, then shuffle."; + this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new GaeasBalanceTarget()).setText(ruleText)); } private GaeasBalance(final GaeasBalance card) { diff --git a/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java b/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java index 992700659211..84b9b3da2187 100644 --- a/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java +++ b/Mage.Sets/src/mage/cards/g/GideonChampionOfJustice.java @@ -49,8 +49,9 @@ public GideonChampionOfJustice(UUID ownerId, CardSetInfo setInfo) { // 0: Until end of turn, Gideon becomes an indestructible Human Soldier creature with power and toughness each equal to the number of loyalty counters on him. He's still a planeswalker. Prevent all damage that would be dealt to him this turn. LockedInDynamicValue loyaltyCount = new LockedInDynamicValue(new CountersSourceCount(CounterType.LOYALTY)); LoyaltyAbility ability2 = new LoyaltyAbility(new BecomesCreatureSourceEffect( - new GideonChampionOfJusticeToken(), "planeswalker", Duration.EndOfTurn, false, false, loyaltyCount, loyaltyCount), 0); - ability2.addEffect(new PreventAllDamageToSourceEffect(Duration.EndOfTurn)); + new GideonChampionOfJusticeToken(), "planeswalker", Duration.EndOfTurn, false, false, loyaltyCount, loyaltyCount) + .setText("Until end of turn, {this} becomes a Human Soldier creature with power and toughness each equal to the number of loyalty counters on him and gains indestructible. He's still a planeswalker."), 0); + ability2.addEffect(new PreventAllDamageToSourceEffect(Duration.EndOfTurn).setText("prevent all damage that would be dealt to him this turn")); this.addAbility(ability2); // -15: Exile all other permanents. diff --git a/Mage.Sets/src/mage/cards/h/Hecatomb.java b/Mage.Sets/src/mage/cards/h/Hecatomb.java index 57473ed4d2f4..dd50ccda807a 100644 --- a/Mage.Sets/src/mage/cards/h/Hecatomb.java +++ b/Mage.Sets/src/mage/cards/h/Hecatomb.java @@ -14,9 +14,10 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.permanent.TappedPredicate; -import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetAnyTarget; @@ -32,13 +33,15 @@ public final class Hecatomb extends CardImpl { filter.add(SubType.SWAMP.getPredicate()); filter.add(TappedPredicate.UNTAPPED); } + + private static final FilterControlledPermanent filter2 + = new FilterControlledCreaturePermanent("creatures"); public Hecatomb(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}{B}"); - // When Hecatomb enters the battlefield, sacrifice Hecatomb unless you sacrifice four creatures. - this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledCreaturePermanent(4))), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new SacrificeTargetCost(new TargetControlledPermanent(4, filter2))))); // Tap an untapped Swamp you control: Hecatomb deals 1 damage to any target. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapTargetCost(new TargetControlledPermanent(1, 1, filter, true))); diff --git a/Mage.Sets/src/mage/cards/i/Invigorate.java b/Mage.Sets/src/mage/cards/i/Invigorate.java index 9c4d9123d02d..8ddfe1cec496 100644 --- a/Mage.Sets/src/mage/cards/i/Invigorate.java +++ b/Mage.Sets/src/mage/cards/i/Invigorate.java @@ -28,8 +28,9 @@ public final class Invigorate extends CardImpl { public Invigorate(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{G}"); - // If you control a Forest, rather than pay Invigorate's mana cost, you may have an opponent gain 3 life. - this.addAbility(new AlternativeCostSourceAbility(new GainLifeOpponentCost(3), new PermanentsOnTheBattlefieldCondition(filter))); + // If you control a Forest, rather than pay this spell's mana cost, you may have an opponent gain 3 life. + this.addAbility(new AlternativeCostSourceAbility(new GainLifeOpponentCost(3), new PermanentsOnTheBattlefieldCondition(filter), + "If you control a Forest, rather than pay this spell's mana cost, you may have an opponent gain 3 life.")); // Target creature gets +4/+4 until end of turn. this.getSpellAbility().addEffect(new BoostTargetEffect(4,4,Duration.EndOfTurn)); diff --git a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java index 4f276ce14e7e..18bf34b79508 100644 --- a/Mage.Sets/src/mage/cards/j/JeweledAmulet.java +++ b/Mage.Sets/src/mage/cards/j/JeweledAmulet.java @@ -29,7 +29,7 @@ */ public final class JeweledAmulet extends CardImpl { - private static final String rule = "{1}, {T}: Put a charge counter on {this}. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on {this}"; + private static final String rule = "{1}, {T}: Put a charge counter on {this}. Note the type of mana spent to pay this activation cost. Activate only if there are no charge counters on {this}."; public JeweledAmulet(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}"); diff --git a/Mage.Sets/src/mage/cards/k/KrovikanFetish.java b/Mage.Sets/src/mage/cards/k/KrovikanFetish.java index edf0ce3395eb..4b0ab67c8e98 100644 --- a/Mage.Sets/src/mage/cards/k/KrovikanFetish.java +++ b/Mage.Sets/src/mage/cards/k/KrovikanFetish.java @@ -40,7 +40,8 @@ public KrovikanFetish(UUID ownerId, CardSetInfo setInfo) { // When Krovikan Fetish enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)), false)); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)) + .setText("draw a card at the beginning of the next turn's upkeep"), false)); // Enchanted creature gets +1/+1. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield))); diff --git a/Mage.Sets/src/mage/cards/k/KrovikanPlague.java b/Mage.Sets/src/mage/cards/k/KrovikanPlague.java index c8f5e89894f3..ea0ee8d0be0b 100644 --- a/Mage.Sets/src/mage/cards/k/KrovikanPlague.java +++ b/Mage.Sets/src/mage/cards/k/KrovikanPlague.java @@ -61,7 +61,8 @@ public KrovikanPlague(UUID ownerId, CardSetInfo setInfo) { // When Krovikan Plague enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)), false)); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)) + .setText("draw a card at the beginning of the next turn's upkeep"), false)); // Tap enchanted creature: Tap enchanted creature: Krovikan Plague deals 1 damage to any target. Put a -0/-1 counter on enchanted creature. Activate this ability only if enchanted creature is untapped. Ability ability2 = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD, diff --git a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java index 5355c6eab5f7..a222baacb1da 100644 --- a/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java +++ b/Mage.Sets/src/mage/cards/m/MaliciousAdvice.java @@ -27,7 +27,7 @@ public MaliciousAdvice(UUID ownerId, CardSetInfo setInfo) { // Tap X target artifacts, creatures, and/or lands. You lose X life. Effect effect = new TapTargetEffect(); - effect.setText("X target artifacts, creatures, and/or lands"); + effect.setText("Tap X target artifacts, creatures, and/or lands"); this.getSpellAbility().addEffect(effect); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(ManacostVariableValue.REGULAR)); this.getSpellAbility().setTargetAdjuster(MaliciousAdviceAdjuster.instance); diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalSphere.java b/Mage.Sets/src/mage/cards/p/PhantasmalSphere.java index dee5c7670212..d91235b20018 100644 --- a/Mage.Sets/src/mage/cards/p/PhantasmalSphere.java +++ b/Mage.Sets/src/mage/cards/p/PhantasmalSphere.java @@ -69,8 +69,8 @@ class PhantasmalSphereEffect extends OneShotEffect { public PhantasmalSphereEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "target opponent puts an X/X blue Orb creature token " - + "with flying onto the battlefield, where X is the number " + this.staticText = "target opponent creates an X/X blue Orb creature token " + + "with flying, where X is the number " + "of +1/+1 counters on {this}"; } diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianTribute.java b/Mage.Sets/src/mage/cards/p/PhyrexianTribute.java index 28beb9e3b40a..e9685c06e38f 100644 --- a/Mage.Sets/src/mage/cards/p/PhyrexianTribute.java +++ b/Mage.Sets/src/mage/cards/p/PhyrexianTribute.java @@ -7,8 +7,10 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; import mage.target.common.TargetArtifactPermanent; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetControlledPermanent; /** * @@ -16,11 +18,14 @@ */ public final class PhyrexianTribute extends CardImpl { + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("creatures"); + public PhyrexianTribute(UUID ownerId, CardSetInfo setInfo) { super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); // As an additional cost to cast Phyrexian Tribute, sacrifice two creatures. - this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(2))); + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(2, filter))); // Destroy target artifact. this.getSpellAbility().addEffect(new DestroyTargetEffect()); this.getSpellAbility().addTarget(new TargetArtifactPermanent()); diff --git a/Mage.Sets/src/mage/cards/p/Pyknite.java b/Mage.Sets/src/mage/cards/p/Pyknite.java index fd1c86b15a22..be3d97a9ae0d 100644 --- a/Mage.Sets/src/mage/cards/p/Pyknite.java +++ b/Mage.Sets/src/mage/cards/p/Pyknite.java @@ -27,7 +27,8 @@ public Pyknite(UUID ownerId, CardSetInfo setInfo) { // When Pyknite enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)), false)); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)) + .setText("draw a card at the beginning of the next turn's upkeep"), false)); } private Pyknite(final Pyknite card) { diff --git a/Mage.Sets/src/mage/cards/r/RayOfCommand.java b/Mage.Sets/src/mage/cards/r/RayOfCommand.java index 1823b23cacdc..b7904aa97b2d 100644 --- a/Mage.Sets/src/mage/cards/r/RayOfCommand.java +++ b/Mage.Sets/src/mage/cards/r/RayOfCommand.java @@ -29,8 +29,8 @@ public RayOfCommand(UUID ownerId, CardSetInfo setInfo) { // Untap target creature an opponent controls and gain control of it until end of turn. That creature gains haste until end of turn. When you lose control of the creature, tap it. this.getSpellAbility().addEffect(new UntapTargetEffect()); - this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn)); - this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfTurn).setText("and gain control of it until end of turn")); + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn).setText("that creature gains haste until end of turn")); this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new RayOfCommandDelayedTriggeredAbility(), true)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE)); } diff --git a/Mage.Sets/src/mage/cards/r/Retaliation.java b/Mage.Sets/src/mage/cards/r/Retaliation.java index 173af8330edd..16253cc2b83f 100644 --- a/Mage.Sets/src/mage/cards/r/Retaliation.java +++ b/Mage.Sets/src/mage/cards/r/Retaliation.java @@ -31,7 +31,7 @@ public Retaliation(UUID ownerId, CardSetInfo setInfo) { Duration.EndOfTurn), false), Duration.WhileOnBattlefield, StaticFilters.FILTER_PERMANENT_CREATURES); effect.setText("Creatures you control have \"Whenever this creature becomes blocked by a creature, " - + "this creature gets +1/+1 until end of turn."); + + "this creature gets +1/+1 until end of turn.\""); this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); } diff --git a/Mage.Sets/src/mage/cards/r/RetreatToHagra.java b/Mage.Sets/src/mage/cards/r/RetreatToHagra.java index f93977fbc5f4..303d5257400c 100644 --- a/Mage.Sets/src/mage/cards/r/RetreatToHagra.java +++ b/Mage.Sets/src/mage/cards/r/RetreatToHagra.java @@ -27,7 +27,7 @@ public RetreatToHagra(UUID ownerId, CardSetInfo setInfo) { // Landfall- Whenever a land enters the battlefield under your control, // choose one - Target creature gets +1/+0 and gains deathtouch until end of turn; - LandfallAbility ability = new LandfallAbility(new BoostTargetEffect(1, 0, Duration.EndOfTurn), false); + LandfallAbility ability = new LandfallAbility(new BoostTargetEffect(1, 0, Duration.EndOfTurn).setText("target creature gets +1/+0"), false); Effect effect = new GainAbilityTargetEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn).setText("and gains deathtouch until end of turn"); effect.setOutcome(Outcome.Benefit); ability.addEffect(effect); diff --git a/Mage.Sets/src/mage/cards/r/RitualOfSteel.java b/Mage.Sets/src/mage/cards/r/RitualOfSteel.java index 914cf1012ece..5e1adf6e8c51 100644 --- a/Mage.Sets/src/mage/cards/r/RitualOfSteel.java +++ b/Mage.Sets/src/mage/cards/r/RitualOfSteel.java @@ -39,7 +39,9 @@ public RitualOfSteel(UUID ownerId, CardSetInfo setInfo) { this.addAbility(ability); // When Ritual of Steel enters the battlefield, draw a card at the beginning of the next turn's upkeep. - this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false))); + this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1)), false) + .setText("draw a card at the beginning of the next turn's upkeep"))); // Enchanted creature gets +0/+2. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(0,2, Duration.WhileOnBattlefield))); diff --git a/Mage.Sets/src/mage/cards/s/SidewinderNaga.java b/Mage.Sets/src/mage/cards/s/SidewinderNaga.java index e97a4cf85d82..8edb0c6b1ca2 100644 --- a/Mage.Sets/src/mage/cards/s/SidewinderNaga.java +++ b/Mage.Sets/src/mage/cards/s/SidewinderNaga.java @@ -1,28 +1,21 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; import mage.abilities.condition.common.DesertControlledOrGraveyardCondition; import mage.abilities.decorator.ConditionalContinuousEffect; -import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.TrampleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.constants.Zone; -import mage.filter.FilterCard; -import mage.filter.common.FilterControlledLandPermanent; -import mage.game.Game; -import mage.players.Player; + +import java.util.UUID; /** * @@ -41,8 +34,8 @@ public SidewinderNaga(UUID ownerId, CardSetInfo setInfo) { // As long as you control a Desert or there is a Desert card in your graveyard, Sidewinder Naga gets +1/+0 and has trample. Ability ability = new SimpleStaticAbility(new ConditionalContinuousEffect( new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), - DesertControlledOrGraveyardCondition.instance, "As long as you control a Desert " + - "or there is a Desert card in your graveyard, {this} gets +1/+0 " + DesertControlledOrGraveyardCondition.instance, "As long as you control a Desert " + + "or there is a Desert card in your graveyard, {this} gets +1/+0" )); ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect( TrampleAbility.getInstance(), Duration.WhileOnBattlefield diff --git a/Mage.Sets/src/mage/cards/s/SolitaryCamel.java b/Mage.Sets/src/mage/cards/s/SolitaryCamel.java index 9290f217c4b9..93c5d62f8f51 100644 --- a/Mage.Sets/src/mage/cards/s/SolitaryCamel.java +++ b/Mage.Sets/src/mage/cards/s/SolitaryCamel.java @@ -29,7 +29,7 @@ public SolitaryCamel(UUID ownerId, CardSetInfo setInfo) { this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new GainAbilitySourceEffect(LifelinkAbility.getInstance()), DesertControlledOrGraveyardCondition.instance, "{this} has lifelink as long as " + - "you control a desert or there is a desert card in your graveyard." + "you control a Desert or there is a Desert card in your graveyard." )).addHint(DesertControlledOrGraveyardCondition.getHint())); } diff --git a/Mage.Sets/src/mage/cards/s/SoulSeparator.java b/Mage.Sets/src/mage/cards/s/SoulSeparator.java index 277323fe23d3..5d3cdf8e5c98 100644 --- a/Mage.Sets/src/mage/cards/s/SoulSeparator.java +++ b/Mage.Sets/src/mage/cards/s/SoulSeparator.java @@ -42,7 +42,7 @@ public SoulSeparator(UUID ownerId, CardSetInfo setInfo) { CreateTokenCopyTargetEffect copyEffect = new CreateTokenCopyTargetEffect(null, null, false, 1, false, false, null, 1, 1, true); copyEffect.setAdditionalSubType(SubType.SPIRIT); - copyEffect.setText("Create a token that's a copy of that card except it's 1/1, it's a Spirit in addition to its other types, and it has flying"); + copyEffect.setText("Exile target creature card from your graveyard. Create a token that's a copy of that card, except it's 1/1, it's a Spirit in addition to its other types, and it has flying"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, copyEffect, new ManaCostsImpl<>("{5}")); ability.addCost(new TapSourceCost()); ability.addCost(new SacrificeSourceCost()); @@ -65,7 +65,7 @@ class SoulSeparatorEffect extends OneShotEffect { public SoulSeparatorEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "Create a black Zombie creature token with power equal to that card's power and toughness equal that card's toughness"; + this.staticText = "Create a black Zombie creature token with power equal to that card's power and toughness equal to that card's toughness"; } public SoulSeparatorEffect(final SoulSeparatorEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/ThundermawHellkite.java b/Mage.Sets/src/mage/cards/t/ThundermawHellkite.java index 2f2c43df000c..53d4087608ad 100644 --- a/Mage.Sets/src/mage/cards/t/ThundermawHellkite.java +++ b/Mage.Sets/src/mage/cards/t/ThundermawHellkite.java @@ -26,7 +26,7 @@ */ public final class ThundermawHellkite extends CardImpl { - static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with flying your opponents control"); + static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with flying your opponents control"); static { filter.add(new AbilityPredicate(FlyingAbility.class)); diff --git a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java index 0b74d497d6f2..8e9d6d48e4e1 100644 --- a/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java +++ b/Mage.Sets/src/mage/cards/t/TormentOfHailfire.java @@ -42,7 +42,7 @@ class TormentOfHailfireEffect extends OneShotEffect { public TormentOfHailfireEffect() { super(Outcome.LoseLife); - this.staticText = "Repeat the following process X times. Each opponent loses 3 life unless they sacrifice a nonland permanent or discards a card"; + this.staticText = "Repeat the following process X times. Each opponent loses 3 life unless that player sacrifices a nonland permanent or discards a card"; } public TormentOfHailfireEffect(final TormentOfHailfireEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TwilightProphet.java b/Mage.Sets/src/mage/cards/t/TwilightProphet.java index b449319217dd..260bfbc114ed 100644 --- a/Mage.Sets/src/mage/cards/t/TwilightProphet.java +++ b/Mage.Sets/src/mage/cards/t/TwilightProphet.java @@ -44,7 +44,7 @@ public TwilightProphet(UUID ownerId, CardSetInfo setInfo) { // Each opponent loses X life and you gain X life, where X is that card's converted mana cost. this.addAbility(new ConditionalInterveningIfTriggeredAbility(new BeginningOfUpkeepTriggeredAbility( new TwilightProphetEffect(), TargetController.YOU, false), CitysBlessingCondition.instance, - "At the beginning of your upkeep, if you have the city's blessing, reveal the top card of your library and put it into your hand." + "At the beginning of your upkeep, if you have the city's blessing, reveal the top card of your library and put it into your hand. " + "Each opponent loses X life and you gain X life, where X is that card's mana value.") .addHint(CitysBlessingHint.instance)); diff --git a/Mage.Sets/src/mage/cards/v/Vampirism.java b/Mage.Sets/src/mage/cards/v/Vampirism.java index 82c45df60af6..d246e31c698d 100644 --- a/Mage.Sets/src/mage/cards/v/Vampirism.java +++ b/Mage.Sets/src/mage/cards/v/Vampirism.java @@ -41,7 +41,8 @@ public Vampirism(UUID ownerId, CardSetInfo setInfo) { // When Vampirism enters the battlefield, draw a card at the beginning of the next turn's upkeep. this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateDelayedTriggeredAbilityEffect( - new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)), false)); + new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new DrawCardSourceControllerEffect(1), Duration.OneUse)) + .setText("draw a card at the beginning of the next turn's upkeep"), false)); // Enchanted creature gets +1/+1 for each other creature you control. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VampirismBoostEnchantedEffect())); diff --git a/Mage.Sets/src/mage/cards/v/VensersJournal.java b/Mage.Sets/src/mage/cards/v/VensersJournal.java index 8bae562c8d1c..2aa634c50736 100644 --- a/Mage.Sets/src/mage/cards/v/VensersJournal.java +++ b/Mage.Sets/src/mage/cards/v/VensersJournal.java @@ -30,7 +30,8 @@ public VensersJournal(UUID ownerId, CardSetInfo setInfo) { this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); // At the beginning of your upkeep, you gain 1 life for each card in your hand. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(CardsInControllerHandCount.instance), TargetController.YOU, false)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(CardsInControllerHandCount.instance) + .setText("you gain 1 life for each card in your hand"), TargetController.YOU, false)); } private VensersJournal(final VensersJournal card) { diff --git a/Mage/src/main/java/mage/abilities/condition/common/SourceHasCounterCondition.java b/Mage/src/main/java/mage/abilities/condition/common/SourceHasCounterCondition.java index 61ee7102a074..e5d3bf49f5aa 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/SourceHasCounterCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/SourceHasCounterCondition.java @@ -69,10 +69,16 @@ public boolean apply(Game game, Ability source) { @Override public String toString() { if (from != -1) { + if (from == 0) { + if (to == 0) { + return "{this} has no " + this.counterType.toString() + " counters on it"; + } + return "{this} has " + CardUtil.numberToText(to) + " or fewer " + this.counterType.toString() + " counters on it"; + } if (to == Integer.MAX_VALUE) { - return "{this} has equal to or more than " + from + " " + this.counterType.toString() + " counters"; + return "{this} has " + CardUtil.numberToText(from) + " or more " + this.counterType.toString() + " counters on it"; } - return "{this} has between " + from + " and " + to + " " + this.counterType.toString() + " counters"; + return "{this} has between " + from + " and " + to + " " + this.counterType.toString() + " counters on it"; } else { return "{this} has " + CardUtil.numberToText(amount) + " or more " + this.counterType.toString() + " counters on it"; } diff --git a/Mage/src/main/java/mage/abilities/costs/common/DiscardXTargetCost.java b/Mage/src/main/java/mage/abilities/costs/common/DiscardXTargetCost.java index 2a21808b72b5..e28034e9d020 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/DiscardXTargetCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/DiscardXTargetCost.java @@ -23,7 +23,7 @@ public DiscardXTargetCost(FilterCard filter) { public DiscardXTargetCost(FilterCard filter, boolean useAsAdditionalCost) { super(useAsAdditionalCost ? VariableCostType.ADDITIONAL : VariableCostType.NORMAL, filter.getMessage() + " to discard"); - this.text = (useAsAdditionalCost ? "as an additional cost to cast this spell, discard " : "Discard ") + xText + ' ' + filter.getMessage(); + this.text = (useAsAdditionalCost ? "discard " : "Discard ") + xText + ' ' + filter.getMessage(); this.filter = filter; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/EndTurnEffect.java b/Mage/src/main/java/mage/abilities/effects/common/EndTurnEffect.java index 978bad8b6faf..74162eec4ac9 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/EndTurnEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/EndTurnEffect.java @@ -10,7 +10,7 @@ public class EndTurnEffect extends OneShotEffect { public EndTurnEffect() { super(Outcome.Detriment); - staticText = "End the turn. (Exile all spells and abilities on the stack, including this card. The player whose turn it is discards down to their maximum hand size. Damage wears off, and \"this turn\" and \"until end of turn\" effects end.)"; + staticText = "End the turn. (Exile all spells and abilities from the stack, including this card. The player whose turn it is discards down to their maximum hand size. Damage wears off, and \"this turn\" and \"until end of turn\" effects end.)"; } public EndTurnEffect(EndTurnEffect effect) {