diff --git a/Mage.Sets/src/mage/cards/a/AeveProgenitorOoze.java b/Mage.Sets/src/mage/cards/a/AeveProgenitorOoze.java index 4afd352c44..07e16ca976 100644 --- a/Mage.Sets/src/mage/cards/a/AeveProgenitorOoze.java +++ b/Mage.Sets/src/mage/cards/a/AeveProgenitorOoze.java @@ -66,7 +66,7 @@ class AeveProgenitorOozeNonLegendaryEffect extends ContinuousEffectImpl { public AeveProgenitorOozeNonLegendaryEffect() { super(Duration.WhileOnBattlefield, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit); - this.staticText = "{this} isn't legendary as long as it's a token"; + this.staticText = "{this} isn't legendary if it's a token"; } private AeveProgenitorOozeNonLegendaryEffect(final AeveProgenitorOozeNonLegendaryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/a/ArcusAcolyte.java b/Mage.Sets/src/mage/cards/a/ArcusAcolyte.java index 0ae973f2d0..14489390be 100644 --- a/Mage.Sets/src/mage/cards/a/ArcusAcolyte.java +++ b/Mage.Sets/src/mage/cards/a/ArcusAcolyte.java @@ -52,7 +52,7 @@ public final class ArcusAcolyte extends CardImpl { this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect( new OutlastAbility(new ManaCostsImpl<>("{G/W}")), Duration.WhileOnBattlefield, filter, true - ))); + ).setText("each other creature you control without a +1/+1 counter on it has outlast {G/W}"))); } private ArcusAcolyte(final ArcusAcolyte card) { diff --git a/Mage.Sets/src/mage/cards/a/Asmoranomardicadaistinaculdacar.java b/Mage.Sets/src/mage/cards/a/Asmoranomardicadaistinaculdacar.java index def750d9b3..9dd0609113 100644 --- a/Mage.Sets/src/mage/cards/a/Asmoranomardicadaistinaculdacar.java +++ b/Mage.Sets/src/mage/cards/a/Asmoranomardicadaistinaculdacar.java @@ -55,12 +55,12 @@ public final class Asmoranomardicadaistinaculdacar extends CardImpl { // As long as you've discarded a card this turn, you may pay {B/R} to cast this spell. this.addAbility(new AlternativeCostSourceAbility( new ManaCostsImpl<>("{B/R}"), ControllerDiscardedThisTurnCondition.instance, - "as long as you've discarded a card this turn, you may pay {B/R} to cast this spell" + "as long as you've discarded a card this turn, you may pay {B/R} to cast this spell." ).addHint(ControllerDiscardedHint.instance), new DiscardedCardWatcher()); // When Asmoranomardicadaistinaculdacar enters the battlefield, you may search your library for a card named The Underworld Cookbook, reveal it, put it into your hand, then shuffle. this.addAbility(new EntersBattlefieldTriggeredAbility( - new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true) + new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true), true )); // Sacrifice two Foods: Target creature deals 6 damage to itself. diff --git a/Mage.Sets/src/mage/cards/b/BarbedSpike.java b/Mage.Sets/src/mage/cards/b/BarbedSpike.java index dd91d3419d..a6e73afedc 100644 --- a/Mage.Sets/src/mage/cards/b/BarbedSpike.java +++ b/Mage.Sets/src/mage/cards/b/BarbedSpike.java @@ -32,7 +32,7 @@ public final class BarbedSpike extends CardImpl { this.addAbility(new SimpleStaticAbility(new BoostEquippedEffect(1, 0))); // Equip {2} - this.addAbility(new EquipAbility(1)); + this.addAbility(new EquipAbility(2)); } private BarbedSpike(final BarbedSpike card) { diff --git a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java index 20801608a8..4f98a9d6c1 100644 --- a/Mage.Sets/src/mage/cards/c/ChanceEncounter.java +++ b/Mage.Sets/src/mage/cards/c/ChanceEncounter.java @@ -34,7 +34,7 @@ public final class ChanceEncounter extends CardImpl { // At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game. TriggeredAbility ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new WinGameSourceControllerEffect(), TargetController.YOU, false); this.addAbility(new ConditionalInterveningIfTriggeredAbility(ability, new SourceHasCounterCondition(CounterType.LUCK, 10, Integer.MAX_VALUE), - "At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game")); + "At the beginning of your upkeep, if {this} has ten or more luck counters on it, you win the game.")); } private ChanceEncounter(final ChanceEncounter card) { diff --git a/Mage.Sets/src/mage/cards/d/Damn.java b/Mage.Sets/src/mage/cards/d/Damn.java index 5a917b4f78..6e43afc5fb 100644 --- a/Mage.Sets/src/mage/cards/d/Damn.java +++ b/Mage.Sets/src/mage/cards/d/Damn.java @@ -8,10 +8,11 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.target.common.TargetCreaturePermanent; -import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES; import java.util.UUID; +import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES; + /** * @author jmharmon */ @@ -23,10 +24,15 @@ public final class Damn extends CardImpl { // Destroy target creature. A creature destroyed this way can’t be regenerated. this.getSpellAbility().addTarget(new TargetCreaturePermanent()); - this.getSpellAbility().addEffect(new DestroyTargetEffect(true)); + this.getSpellAbility().addEffect(new DestroyTargetEffect(true) + .setText("destroy target creature. A creature destroyed this way can't be regenerated")); // Overload {2}{W}{W} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of “target” with “each.”) - this.addAbility(new OverloadAbility(this, new DestroyAllEffect(FILTER_PERMANENT_CREATURES, true), new ManaCostsImpl("{2}{W}{W"))); + this.addAbility(new OverloadAbility( + this, + new DestroyAllEffect(FILTER_PERMANENT_CREATURES, true), + new ManaCostsImpl<>("{2}{W}{W") + )); } private Damn(final Damn card) { diff --git a/Mage.Sets/src/mage/cards/d/Dermotaxi.java b/Mage.Sets/src/mage/cards/d/Dermotaxi.java index 5a65bd2a42..b2448f0b5f 100644 --- a/Mage.Sets/src/mage/cards/d/Dermotaxi.java +++ b/Mage.Sets/src/mage/cards/d/Dermotaxi.java @@ -2,7 +2,7 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapTargetCost; import mage.abilities.effects.OneShotEffect; @@ -44,7 +44,10 @@ public final class Dermotaxi extends CardImpl { this.toughness = new MageInt(0); // Imprint — As Dermotaxi enters the battlefield, exile a creature card from a graveyard. - this.addAbility(new AsEntersBattlefieldAbility(new DermotaxiImprintEffect()).setAbilityWord(AbilityWord.IMPRINT)); + this.addAbility(new EntersBattlefieldAbility( + new DermotaxiImprintEffect(), null, "Imprint — As {this} " + + "enters the battlefield, exile a creature card from a graveyard.", "" + )); // Tap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the imprinted card, except it's a Vehicle artifact in addition to its other types. this.addAbility(new SimpleActivatedAbility( @@ -105,7 +108,7 @@ class DermotaxiCopyEffect extends OneShotEffect { DermotaxiCopyEffect() { super(Outcome.Benefit); - staticText = "until end of turn, {this} becomes a copy of the imprinted card, " + + staticText = "until end of turn, {this} becomes a copy of the exiled card, " + "except it's a Vehicle artifact in addition to its other types"; } diff --git a/Mage.Sets/src/mage/cards/d/DiamondLion.java b/Mage.Sets/src/mage/cards/d/DiamondLion.java index 17e04e94b3..af5e6761ac 100644 --- a/Mage.Sets/src/mage/cards/d/DiamondLion.java +++ b/Mage.Sets/src/mage/cards/d/DiamondLion.java @@ -5,6 +5,7 @@ import mage.Mana; import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardHandCost; import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.abilities.effects.mana.BasicManaEffect; import mage.abilities.mana.ActivatedManaAbilityImpl; @@ -47,7 +48,8 @@ public final class DiamondLion extends CardImpl { class DiamondLionAbility extends ActivatedManaAbilityImpl { public DiamondLionAbility() { - super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new DiscardHandCost()); + super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(3), new TapSourceCost()); + this.addCost(new DiscardHandCost()); this.addCost(new SacrificeSourceCost()); this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 3, 0)); } diff --git a/Mage.Sets/src/mage/cards/d/DihadasPloy.java b/Mage.Sets/src/mage/cards/d/DihadasPloy.java index 8c680cad0e..6ef4c4fa95 100644 --- a/Mage.Sets/src/mage/cards/d/DihadasPloy.java +++ b/Mage.Sets/src/mage/cards/d/DihadasPloy.java @@ -60,12 +60,12 @@ enum DihadasPloyValue implements DynamicValue { } @Override - public String getMessage() { + public String toString() { return "1"; } @Override - public String toString() { + public String getMessage() { return "cards you've discarded this turn"; } } diff --git a/Mage.Sets/src/mage/cards/d/DiscipleOfTheSun.java b/Mage.Sets/src/mage/cards/d/DiscipleOfTheSun.java index 9a36d05534..effc8327d5 100644 --- a/Mage.Sets/src/mage/cards/d/DiscipleOfTheSun.java +++ b/Mage.Sets/src/mage/cards/d/DiscipleOfTheSun.java @@ -22,7 +22,7 @@ import java.util.UUID; */ public final class DiscipleOfTheSun extends CardImpl { - private static final FilterCard filter = new FilterPermanentCard("permanent card with mana value 3 or less"); + private static final FilterCard filter = new FilterPermanentCard("permanent card with mana value 3 or less from your graveyard"); static { filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 4)); diff --git a/Mage.Sets/src/mage/cards/e/EnchantresssPresence.java b/Mage.Sets/src/mage/cards/e/EnchantresssPresence.java index dd69068daf..be5ca2872a 100644 --- a/Mage.Sets/src/mage/cards/e/EnchantresssPresence.java +++ b/Mage.Sets/src/mage/cards/e/EnchantresssPresence.java @@ -15,7 +15,7 @@ import mage.filter.FilterSpell; */ public final class EnchantresssPresence extends CardImpl { - private static final FilterSpell filter = new FilterSpell("an Enchantment spell"); + private static final FilterSpell filter = new FilterSpell("an enchantment spell"); static { filter.add(CardType.ENCHANTMENT.getPredicate()); diff --git a/Mage.Sets/src/mage/cards/f/FiligreeAttendant.java b/Mage.Sets/src/mage/cards/f/FiligreeAttendant.java index a6cebf16be..112bbd339e 100644 --- a/Mage.Sets/src/mage/cards/f/FiligreeAttendant.java +++ b/Mage.Sets/src/mage/cards/f/FiligreeAttendant.java @@ -29,7 +29,7 @@ public final class FiligreeAttendant extends CardImpl { // Filigree Attendant's power is equal to the number of artifacts you control. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SetPowerSourceEffect( ArtifactYouControlCount.instance, Duration.EndOfGame, SubLayer.CharacteristicDefining_7a - ))); + ).setText("{this}'s power is equal to the number of artifacts you control"))); } private FiligreeAttendant(final FiligreeAttendant card) { diff --git a/Mage.Sets/src/mage/cards/f/FoulWatcher.java b/Mage.Sets/src/mage/cards/f/FoulWatcher.java index 51959963cc..71f022b921 100644 --- a/Mage.Sets/src/mage/cards/f/FoulWatcher.java +++ b/Mage.Sets/src/mage/cards/f/FoulWatcher.java @@ -40,7 +40,7 @@ public final class FoulWatcher extends CardImpl { // Delirium — Foul Watcher gets +1/+0 as long as there are four more card types among cards in your graveyard. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( new BoostSourceEffect(1, 0, Duration.WhileOnBattlefield), DeliriumCondition.instance, - "{this} gets +1/+0 as long as there are four more card types among cards in your graveyard" + "{this} gets +1/+0 as long as there are four or more card types among cards in your graveyard" )).setAbilityWord(AbilityWord.DELIRIUM).addHint(CardTypesInGraveyardHint.YOU)); } diff --git a/Mage.Sets/src/mage/cards/f/FoundryHelix.java b/Mage.Sets/src/mage/cards/f/FoundryHelix.java index 6460d9aadf..7a4fec404e 100644 --- a/Mage.Sets/src/mage/cards/f/FoundryHelix.java +++ b/Mage.Sets/src/mage/cards/f/FoundryHelix.java @@ -1,7 +1,5 @@ package mage.cards.f; -import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.abilities.costs.Cost; @@ -12,13 +10,15 @@ import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; import mage.target.common.TargetControlledPermanent; +import java.util.UUID; + /** - * * @author weirddan455 */ public final class FoundryHelix extends CardImpl { @@ -27,7 +27,7 @@ public final class FoundryHelix extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{W}"); // As an additional cost to cast this spell, sacrifice a permanent. - this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent())); + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_PERMANENT_SHORT_TEXT))); // Foundry Helix deals 4 damage to any target. If the sacrificed permanent was an artifact, you gain 4 life. this.getSpellAbility().addEffect(new DamageTargetEffect(4)); diff --git a/Mage.Sets/src/mage/cards/g/GaeasWill.java b/Mage.Sets/src/mage/cards/g/GaeasWill.java index 4ac73067d4..3ef6828f21 100644 --- a/Mage.Sets/src/mage/cards/g/GaeasWill.java +++ b/Mage.Sets/src/mage/cards/g/GaeasWill.java @@ -30,7 +30,7 @@ public final class GaeasWill extends CardImpl { this.color.setGreen(true); // Suspend 4—{G} - this.addAbility(new SuspendAbility(4, new ManaCostsImpl("G"), this)); + this.addAbility(new SuspendAbility(4, new ManaCostsImpl<>("G"), this)); // Until end of turn, you may play land cards and cast spells from your graveyard. this.getSpellAbility().addEffect(new GaeasWillGraveyardEffect()); @@ -57,7 +57,7 @@ class GaeasWillGraveyardEffect extends ContinuousEffectImpl { public GaeasWillGraveyardEffect(Duration duration) { super(duration, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); - this.staticText = "Until end of turn, you may play land cards and cast spells from your graveyard"; + this.staticText = "Until end of turn, you may play lands and cast spells from your graveyard"; } private GaeasWillGraveyardEffect(final GaeasWillGraveyardEffect effect) { @@ -84,7 +84,7 @@ class GaeassWillReplacementEffect extends ReplacementEffectImpl { public GaeassWillReplacementEffect() { super(Duration.EndOfTurn, Outcome.Detriment); - this.staticText = "If a card would be put into your graveyard from anywhere this turn, exile that card instead"; + this.staticText = "
If a card would be put into your graveyard from anywhere this turn, exile that card instead"; } public GaeassWillReplacementEffect(final GaeassWillReplacementEffect effect) { diff --git a/Mage.Sets/src/mage/cards/k/Kaleidoscorch.java b/Mage.Sets/src/mage/cards/k/Kaleidoscorch.java index b33c8799e4..8eaf49672e 100644 --- a/Mage.Sets/src/mage/cards/k/Kaleidoscorch.java +++ b/Mage.Sets/src/mage/cards/k/Kaleidoscorch.java @@ -22,7 +22,8 @@ public final class Kaleidoscorch extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}"); // Converge — Kaleidoscorch deals X damage to any target, where X is the number of colors of mana spent to cast this spell. - this.getSpellAbility().addEffect(new DamageTargetEffect(ColorsOfManaSpentToCastCount.getInstance())); + this.getSpellAbility().addEffect(new DamageTargetEffect(ColorsOfManaSpentToCastCount.getInstance()) + .setText("{this} deals X damage to any target, where X is the number of colors of mana spent to cast this spell")); this.getSpellAbility().addTarget(new TargetAnyTarget()); this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE); diff --git a/Mage.Sets/src/mage/cards/l/LateToDinner.java b/Mage.Sets/src/mage/cards/l/LateToDinner.java index ad28fd0090..8d776db3f9 100644 --- a/Mage.Sets/src/mage/cards/l/LateToDinner.java +++ b/Mage.Sets/src/mage/cards/l/LateToDinner.java @@ -7,7 +7,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.filter.StaticFilters; import mage.game.permanent.token.FoodToken; -import mage.target.common.TargetCardInGraveyard; +import mage.target.common.TargetCardInYourGraveyard; import java.util.UUID; @@ -22,7 +22,7 @@ public final class LateToDinner extends CardImpl { // Return target creature card from your graveyard to the battlefield. Create a Food token. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); this.getSpellAbility().addEffect(new CreateTokenEffect(new FoodToken())); - this.getSpellAbility().addTarget(new TargetCardInGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); } private LateToDinner(final LateToDinner card) { diff --git a/Mage.Sets/src/mage/cards/m/Monoskelion.java b/Mage.Sets/src/mage/cards/m/Monoskelion.java index dc8fe48e1c..bcbaebec14 100644 --- a/Mage.Sets/src/mage/cards/m/Monoskelion.java +++ b/Mage.Sets/src/mage/cards/m/Monoskelion.java @@ -35,7 +35,7 @@ public final class Monoskelion extends CardImpl { )); // {1}, Remove a +1/+1 counter from Monoskelion: Monoskelion deals 1 damage to any target. - Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(1)); + Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1, "it"), new GenericManaCost(1)); ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance())); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/n/Necrogoyf.java b/Mage.Sets/src/mage/cards/n/Necrogoyf.java index 7201dab97d..70434c06f7 100644 --- a/Mage.Sets/src/mage/cards/n/Necrogoyf.java +++ b/Mage.Sets/src/mage/cards/n/Necrogoyf.java @@ -38,7 +38,7 @@ public final class Necrogoyf extends CardImpl { // At the beginning of each player's upkeep, that player discards a card. this.addAbility(new BeginningOfUpkeepTriggeredAbility( Zone.BATTLEFIELD, new DiscardTargetEffect(1), - TargetController.EACH_PLAYER, false, true + TargetController.ACTIVE, false, true )); // Madness {1}{B}{B} diff --git a/Mage.Sets/src/mage/cards/p/PhantasmalDreadmaw.java b/Mage.Sets/src/mage/cards/p/PhantasmalDreadmaw.java index 093bc7dd72..c8300a4727 100644 --- a/Mage.Sets/src/mage/cards/p/PhantasmalDreadmaw.java +++ b/Mage.Sets/src/mage/cards/p/PhantasmalDreadmaw.java @@ -28,7 +28,7 @@ public final class PhantasmalDreadmaw extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // When Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it. - this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect())); + this.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect().setText("sacrifice it"))); } private PhantasmalDreadmaw(final PhantasmalDreadmaw card) { diff --git a/Mage.Sets/src/mage/cards/r/RavingVisionary.java b/Mage.Sets/src/mage/cards/r/RavingVisionary.java index e5086f9888..860b269fbf 100644 --- a/Mage.Sets/src/mage/cards/r/RavingVisionary.java +++ b/Mage.Sets/src/mage/cards/r/RavingVisionary.java @@ -12,6 +12,7 @@ import mage.abilities.effects.common.DrawDiscardControllerEffect; import mage.abilities.hint.common.CardTypesInGraveyardHint; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; @@ -44,7 +45,7 @@ public final class RavingVisionary extends CardImpl { new ManaCostsImpl<>("{2}{U}"), DeliriumCondition.instance ); ability.addCost(new TapSourceCost()); - this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU)); + this.addAbility(ability.addHint(CardTypesInGraveyardHint.YOU).setAbilityWord(AbilityWord.DELIRIUM)); } private RavingVisionary(final RavingVisionary card) { diff --git a/Mage.Sets/src/mage/cards/r/RiseAndShine.java b/Mage.Sets/src/mage/cards/r/RiseAndShine.java index dddb5f8df1..a1606fa21e 100644 --- a/Mage.Sets/src/mage/cards/r/RiseAndShine.java +++ b/Mage.Sets/src/mage/cards/r/RiseAndShine.java @@ -45,7 +45,7 @@ public final class RiseAndShine extends CardImpl { ).setText("Target noncreature artifact you control becomes")); this.getSpellAbility().addEffect(new SetPowerToughnessTargetEffect( 0, 0, Duration.EndOfGame - ).setText("a 0/0 artifact creature")); + ).setText(" a 0/0 artifact creature")); this.getSpellAbility().addEffect(new AddCountersTargetEffect( CounterType.P1P1.createInstance(4) ).setText("Put four +1/+1 counters on each artifact that became a creature this way")); diff --git a/Mage.Sets/src/mage/cards/s/ScionOfDraco.java b/Mage.Sets/src/mage/cards/s/ScionOfDraco.java index 7c60c36034..4e22d667d2 100644 --- a/Mage.Sets/src/mage/cards/s/ScionOfDraco.java +++ b/Mage.Sets/src/mage/cards/s/ScionOfDraco.java @@ -36,6 +36,7 @@ public final class ScionOfDraco extends CardImpl { // Domain — This spell costs {2} less to cast for each basic land type among lands you control. this.addAbility(new SimpleStaticAbility(Zone.ALL, new SpellCostReductionForEachSourceEffect(2, xValue) + .setText("this spell costs {2} less to cast for each basic land type among lands you control") ).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN)); // Flying diff --git a/Mage.Sets/src/mage/cards/s/SeaDrake.java b/Mage.Sets/src/mage/cards/s/SeaDrake.java index 762c71e836..fc9034101f 100644 --- a/Mage.Sets/src/mage/cards/s/SeaDrake.java +++ b/Mage.Sets/src/mage/cards/s/SeaDrake.java @@ -1,7 +1,6 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; @@ -11,18 +10,18 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.StaticFilters; import mage.target.TargetPermanent; -/** - * - * @author LoneFox +import java.util.UUID; +/** + * @author LoneFox */ public final class SeaDrake extends CardImpl { public SeaDrake(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); this.subtype.add(SubType.DRAKE); this.power = new MageInt(4); this.toughness = new MageInt(3); @@ -31,7 +30,7 @@ public final class SeaDrake extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When Sea Drake enters the battlefield, return two target lands you control to their owner's hand. Ability ability = new EntersBattlefieldTriggeredAbility(new ReturnToHandTargetEffect(), false); - ability.addTarget(new TargetPermanent(2, 2, new FilterControlledLandPermanent(), false)); + ability.addTarget(new TargetPermanent(2, StaticFilters.FILTER_CONTROLLED_PERMANENT_LANDS)); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SteelDromedary.java b/Mage.Sets/src/mage/cards/s/SteelDromedary.java index ec19ff467c..e813bb3612 100644 --- a/Mage.Sets/src/mage/cards/s/SteelDromedary.java +++ b/Mage.Sets/src/mage/cards/s/SteelDromedary.java @@ -10,6 +10,7 @@ import mage.abilities.condition.common.SourceHasCounterCondition; import mage.abilities.decorator.ConditionalContinuousRuleModifyingEffect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect; +import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -39,9 +40,11 @@ public final class SteelDromedary extends CardImpl { this.toughness = new MageInt(2); // Steel Dromedary enters the battlefield tapped with two +1/+1 counters on it. - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect( - CounterType.P1P1.createInstance(2) - ), "with two +1/+1 counters on it")); + Ability ability = new EntersBattlefieldAbility( + new TapSourceEffect(), "tapped with two +1/+1 counters on it" + ); + ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2))); + this.addAbility(ability); // Steel Dromedary doesn't untap during your untap step if it has a +1/+1 counter on it. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousRuleModifyingEffect( @@ -49,7 +52,7 @@ public final class SteelDromedary extends CardImpl { ).setText("{this} doesn't untap during your untap step if it has a +1/+1 counter on it"))); // At the beginning of combat on your turn, you may move a +1/+1 counter from Steel Dromedary onto target creature. - Ability ability = new BeginningOfCombatTriggeredAbility( + ability = new BeginningOfCombatTriggeredAbility( new SteelDromedaryEffect(), TargetController.YOU, true ); ability.addTarget(new TargetCreaturePermanent()); @@ -70,7 +73,7 @@ class SteelDromedaryEffect extends OneShotEffect { SteelDromedaryEffect() { super(Outcome.Benefit); - staticText = "move a +1/+1 counter from {this} onto target creature"; + staticText = "you may move a +1/+1 counter from {this} onto target creature"; } private SteelDromedaryEffect(final SteelDromedaryEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/TerritorialKavu.java b/Mage.Sets/src/mage/cards/t/TerritorialKavu.java index 136ee8f1b1..4b5ef1fee7 100644 --- a/Mage.Sets/src/mage/cards/t/TerritorialKavu.java +++ b/Mage.Sets/src/mage/cards/t/TerritorialKavu.java @@ -15,10 +15,7 @@ import mage.abilities.effects.common.continuous.SetPowerToughnessSourceEffect; import mage.abilities.hint.common.DomainHint; 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.constants.*; import mage.target.common.TargetCardInGraveyard; import java.util.UUID; @@ -40,7 +37,7 @@ public final class TerritorialKavu extends CardImpl { // Domain — Territorial Kavu's power and toughness are each equal to the number of basic land types among lands you control. this.addAbility(new SimpleStaticAbility( Zone.ALL, new SetPowerToughnessSourceEffect(xValue, Duration.EndOfGame) - ).addHint(DomainHint.instance)); + ).addHint(DomainHint.instance).setAbilityWord(AbilityWord.DOMAIN)); // Whenever Territorial Kavu attacks, choose one — // • Discard a card. If you do, draw a card. diff --git a/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java b/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java index 240f941352..dba8b836b7 100644 --- a/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java +++ b/Mage.Sets/src/mage/cards/t/ThrastaTempestsRoar.java @@ -1,11 +1,10 @@ package mage.cards.t; -import java.util.UUID; - import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.common.AsEntersBattlefieldAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; @@ -19,13 +18,18 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; +import mage.game.permanent.Permanent; import mage.watchers.common.CastSpellLastTurnWatcher; +import java.util.UUID; + /** * @author Fubs */ public final class ThrastaTempestsRoar extends CardImpl { + private static final ValueHint hint = new ValueHint("Spells cast this turn", ThrastaDynamicValue.instance); + public ThrastaTempestsRoar(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{10}{G}{G}"); addSuperType(SuperType.LEGENDARY); @@ -33,33 +37,36 @@ public final class ThrastaTempestsRoar extends CardImpl { this.power = new MageInt(7); this.toughness = new MageInt(7); - //This spell costs 3 less to cast for each other spell cast this turn - ThrastaDynamicValue spellCastCount = new ThrastaDynamicValue(); - //spellCastCount does not need -1 because cast count increases only after current spell cast/reduction. - this.addAbility(new SimpleStaticAbility(Zone.ALL, new SpellCostReductionForEachSourceEffect(3, spellCastCount)) - .addHint(new ValueHint("spell cast", spellCastCount)) - ); + // This spell costs 3 less to cast for each other spell cast this turn + this.addAbility(new SimpleStaticAbility( + Zone.ALL, new SpellCostReductionForEachSourceEffect(3, ThrastaDynamicValue.instance) + ).addHint(hint)); - //Trample, Haste, and Trample over planeswalkers + // Trample, Haste, and Trample over planeswalkers this.addAbility(TrampleAbility.getInstance()); this.addAbility(HasteAbility.getInstance()); this.addAbility(TrampleOverPlaneswalkersAbility.getInstance()); - //Thrasta has hexproof as long as it entered the battlefield this turn. - this.addAbility(new AsEntersBattlefieldAbility(new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.EndOfTurn))); + // Thrasta has hexproof as long as it entered the battlefield this turn. + this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( + new GainAbilitySourceEffect(HexproofAbility.getInstance(), Duration.WhileOnBattlefield), + ThrastaCondition.instance, "{this} has hexproof as long as it entered the battlefield this turn" + ))); } - private ThrastaTempestsRoar(final mage.cards.t.ThrastaTempestsRoar card) { + private ThrastaTempestsRoar(final ThrastaTempestsRoar card) { super(card); } @Override public ThrastaTempestsRoar copy() { - return new mage.cards.t.ThrastaTempestsRoar(this); + return new ThrastaTempestsRoar(this); } } -class ThrastaDynamicValue implements DynamicValue { +enum ThrastaDynamicValue implements DynamicValue { + instance; + @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { CastSpellLastTurnWatcher watcher = game.getState().getWatcher(CastSpellLastTurnWatcher.class); @@ -71,7 +78,7 @@ class ThrastaDynamicValue implements DynamicValue { @Override public ThrastaDynamicValue copy() { - return new ThrastaDynamicValue(); + return this; } @Override @@ -81,7 +88,16 @@ class ThrastaDynamicValue implements DynamicValue { @Override public String getMessage() { - return "spells cast this turn"; + return "other spell cast this turn"; } - } + +enum ThrastaCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + return permanent != null && permanent.getTurnsOnBattlefield() == 0; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TizerusCharger.java b/Mage.Sets/src/mage/cards/t/TizerusCharger.java index 856ca85927..8b863cdebd 100644 --- a/Mage.Sets/src/mage/cards/t/TizerusCharger.java +++ b/Mage.Sets/src/mage/cards/t/TizerusCharger.java @@ -40,7 +40,7 @@ public final class TizerusCharger extends CardImpl { // Tizerus Charger escapes with your choice of a +1/+1 counter or a flying counter on it. this.addAbility(new EntersBattlefieldAbility( new TizerusChargerEffect(), null, "{this} escapes " + - "with your choice of a +1/+1 counter or a flying counter on it", "" + "with your choice of a +1/+1 counter or a flying counter on it.", "" )); } diff --git a/Mage.Sets/src/mage/cards/u/Upheaval.java b/Mage.Sets/src/mage/cards/u/Upheaval.java index ed053c5db7..912831e945 100644 --- a/Mage.Sets/src/mage/cards/u/Upheaval.java +++ b/Mage.Sets/src/mage/cards/u/Upheaval.java @@ -17,7 +17,7 @@ public final class Upheaval extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}"); // Return all permanents to their owners' hands. - this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_PERMANENT)); + this.getSpellAbility().addEffect(new ReturnToHandFromBattlefieldAllEffect(StaticFilters.FILTER_PERMANENTS)); } private Upheaval(final Upheaval card) { diff --git a/Mage.Sets/src/mage/cards/y/YoungNecromancer.java b/Mage.Sets/src/mage/cards/y/YoungNecromancer.java index e630791c55..18e5554943 100644 --- a/Mage.Sets/src/mage/cards/y/YoungNecromancer.java +++ b/Mage.Sets/src/mage/cards/y/YoungNecromancer.java @@ -36,7 +36,7 @@ public final class YoungNecromancer extends CardImpl { ability.addTarget(new TargetCardInYourGraveyard(StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD)); this.addAbility(new EntersBattlefieldTriggeredAbility( new DoWhenCostPaid(ability, new ExileFromGraveCost( - new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD) + new TargetCardInYourGraveyard(2, StaticFilters.FILTER_CARD_CARDS) ), "Exile two cards from your graveyard?") )); } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 875b6f23d7..91ef339ac8 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -56,7 +56,7 @@ public class VerifyCardDataTest { private static final Logger logger = Logger.getLogger(VerifyCardDataTest.class); - private static final String FULL_ABILITIES_CHECK_SET_CODE = "MH1"; // check all abilities and output cards with wrong abilities texts; + private static final String FULL_ABILITIES_CHECK_SET_CODE = "MH2"; // 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/GainLifeEffect.java b/Mage/src/main/java/mage/abilities/effects/common/GainLifeEffect.java index 105097a667..ca4dbf1f80 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/GainLifeEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/GainLifeEffect.java @@ -2,16 +2,16 @@ package mage.abilities.effects.common; -import mage.constants.Outcome; import mage.abilities.Ability; +import mage.abilities.Mode; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; /** - * * @author BetaSteward_at_googlemail.com */ public class GainLifeEffect extends OneShotEffect { @@ -25,9 +25,8 @@ public class GainLifeEffect extends OneShotEffect { public GainLifeEffect(DynamicValue life) { super(Outcome.GainLife); this.life = life; - setText(); } - + public GainLifeEffect(DynamicValue life, String rule) { super(Outcome.GainLife); this.life = life; @@ -53,24 +52,24 @@ public class GainLifeEffect extends OneShotEffect { return true; } - private void setText() { - if (!staticText.isEmpty()) { - return; + @Override + public String getText(Mode mode) { + if (staticText != null && !staticText.isEmpty()) { + return staticText; } StringBuilder sb = new StringBuilder(); String message = life.getMessage(); sb.append("you gain "); if (message.startsWith("that")) { sb.append(message).append(' '); - } else if (message.isEmpty() || !message.equals("1")) { + } else if (message.isEmpty() || !life.toString().equals("1")) { sb.append(life).append(' '); } sb.append("life"); if (!message.isEmpty() && !message.startsWith("that")) { - sb.append(message.equals("1") ? " equal to the number of " : " for each "); + sb.append(life.toString().equals("1") ? " equal to the number of " : " for each "); sb.append(message); } - staticText = sb.toString(); + return sb.toString(); } - } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java index 34bba39ab0..355a735150 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandTargetEffect.java @@ -100,7 +100,7 @@ public class ReturnToHandTargetEffect extends OneShotEffect { sb.append("target "); } sb.append(target.getTargetName()); - if (target.getMaxNumberOfTargets() > 1 && !target.getTargetName().endsWith("s")) { + if (target.getMaxNumberOfTargets() > 1 && !target.getTargetName().endsWith("s") && !target.getTargetName().endsWith("control")) { sb.append('s'); } if (target.getMaxNumberOfTargets() > 1) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java index 82c1c4d515..803343dc73 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/discard/DiscardCardYouChooseTargetEffect.java @@ -155,7 +155,7 @@ public class DiscardCardYouChooseTargetEffect extends OneShotEffect { } private String setText() { - StringBuilder sb = new StringBuilder("Target "); + StringBuilder sb = new StringBuilder("target "); switch (targetController) { case OPPONENT: sb.append("opponent"); diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 3878ff6ebf..ecf6add97c 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -316,6 +316,12 @@ public final class StaticFilters { FILTER_CONTROLLED_A_PERMANENT.setLockedFilter(true); } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_SHORT_TEXT = new FilterControlledPermanent("permanent"); + + static { + FILTER_CONTROLLED_PERMANENT_SHORT_TEXT.setLockedFilter(true); + } + public static final FilterControlledPermanent FILTER_CONTROLLED_PERMANENT_ARTIFACT = new FilterControlledArtifactPermanent(); static { diff --git a/Mage/src/main/java/mage/target/common/TargetCreatureOrPlaneswalkerAmount.java b/Mage/src/main/java/mage/target/common/TargetCreatureOrPlaneswalkerAmount.java index a0308c2915..4932e92cb4 100644 --- a/Mage/src/main/java/mage/target/common/TargetCreatureOrPlaneswalkerAmount.java +++ b/Mage/src/main/java/mage/target/common/TargetCreatureOrPlaneswalkerAmount.java @@ -9,7 +9,7 @@ import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; public class TargetCreatureOrPlaneswalkerAmount extends TargetPermanentAmount { private static final FilterCreatureOrPlaneswalkerPermanent defaultFilter - = new FilterCreatureOrPlaneswalkerPermanent("target creatures or planeswalkers"); + = new FilterCreatureOrPlaneswalkerPermanent("target creatures and/or planeswalkers"); public TargetCreatureOrPlaneswalkerAmount(int amount) { super(amount, defaultFilter);